ZGlmZiAtLWdpdCBhL01vZHVsZXMvU2V0dXAuZGlzdCBiL01vZHVsZXMvU2V0dXAuZGlzdAppbmRleCAzYTUxMmI1Li40OWM4NDI1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL1NldHVwLmRpc3QKKysrIGIvTW9kdWxlcy9TZXR1cC5kaXN0CkBAIC0yMzYsOSArMjM2LDkgQEAKIAogIyBUaGUgbWQ1IG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUKICMgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtLCBkZXNjcmliZWQgaW4gUkZDIDEzMjEuICBUaGUgbmVjZXNzYXJ5IGZpbGVzCi0jIG1kNWMuYyBhbmQgbWQ1LmggYXJlIGluY2x1ZGVkIGhlcmUuCisjIG1kNS5jIGFuZCBtZDUuaCBhcmUgaW5jbHVkZWQgaGVyZS4KIAotI21kNSBtZDVtb2R1bGUuYyBtZDVjLmMKKyNtZDUgbWQ1bW9kdWxlLmMgbWQ1LmMKIAogCiAjIFRoZSBzaGEgbW9kdWxlIGltcGxlbWVudHMgdGhlIFNIQSBjaGVja3N1bSBhbGdvcml0aG0uCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ic2RkYi5jIGIvTW9kdWxlcy9fYnNkZGIuYwppbmRleCA4ZTllYzBmLi4xNjQxZTIwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19ic2RkYi5jCisrKyBiL01vZHVsZXMvX2JzZGRiLmMKQEAgLTEwMSw2ICsxMDEsMTAgQEAKIHN0YXRpYyBjaGFyICpyY3NfaWQgPSAiJElkJCI7CiAKIAorI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCisjZGVmaW5lIFB5X3NzaXplX3QgICAgICBpbnQKKyNlbmRpZgorCiAjaWZkZWYgV0lUSF9USFJFQUQKIAogLyogVGhlc2UgYXJlIGZvciB3aGVuIGNhbGxpbmcgUHl0aG9uIC0tPiBDICovCkBAIC00Njg4LDcgKzQ2OTIsMTEgQEAKIAogCiBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBEQl9tYXBwaW5nID0geworI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCisgICAgICAgIChpbnF1aXJ5KURCX2xlbmd0aCwgICAgICAgICAgLyptcF9sZW5ndGgqLworI2Vsc2UKICAgICAgICAgKGxlbmZ1bmMpREJfbGVuZ3RoLCAgICAgICAgICAvKm1wX2xlbmd0aCovCisjZW5kaWYKICAgICAgICAgKGJpbmFyeWZ1bmMpREJfc3Vic2NyaXB0LCAgICAvKm1wX3N1YnNjcmlwdCovCiAgICAgICAgIChvYmpvYmphcmdwcm9jKURCX2Fzc19zdWIsICAgLyptcF9hc3Nfc3Vic2NyaXB0Ki8KIH07CkBAIC01Mzg1LDkgKzUzOTMsMjEgQEAKICAgICBBRERfSU5UKGQsIERCX1NFVF9UWE5fVElNRU9VVCk7CiAjZW5kaWYKIAorICAgIC8qIFRoZSBleGNlcHRpb24gbmFtZSBtdXN0IGJlIGNvcnJlY3QgZm9yIHBpY2tsZWQgZXhjZXB0aW9uICoKKyAgICAgKiBvYmplY3RzIHRvIHVucGlja2xlIHByb3Blcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIFBZQlNEREJfU1RBTkRBTE9ORSAgLyogZGlmZmVyZW50IHZhbHVlIG5lZWRlZCBmb3Igc3RhbmRhbG9uZSBweWJzZGRiICovCisjZGVmaW5lIFBZQlNEREJfRVhDRVBUSU9OX0JBU0UgICJic2RkYjMuZGIuIgorI2Vsc2UKKyNkZWZpbmUgUFlCU0REQl9FWENFUFRJT05fQkFTRSAgImJzZGRiLmRiLiIKKyNlbmRpZgorCisgICAgLyogQWxsIHRoZSByZXN0IG9mIHRoZSBleGNlcHRpb25zIGRlcml2ZSBvbmx5IGZyb20gREJFcnJvciAqLworI2RlZmluZSBNQUtFX0VYKG5hbWUpICAgbmFtZSA9IFB5RXJyX05ld0V4Y2VwdGlvbihQWUJTRERCX0VYQ0VQVElPTl9CQVNFICNuYW1lLCBEQkVycm9yLCBOVUxMKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgI25hbWUsIG5hbWUpCisKICAgICAvKiBUaGUgYmFzZSBleGNlcHRpb24gY2xhc3MgaXMgREJFcnJvciAqLwotICAgIERCRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImJzZGRiLl9kYi5EQkVycm9yIiwgTlVMTCwgTlVMTCk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRCRXJyb3IiLCBEQkVycm9yKTsKKyAgICBEQkVycm9yID0gTlVMTDsgICAgIC8qIHVzZWQgaW4gTUFLRV9FWCBzbyB0aGF0IGl0IGRlcml2ZXMgZnJvbSBub3RoaW5nICovCisgICAgTUFLRV9FWChEQkVycm9yKTsKIAogICAgIC8qIFNvbWUgbWFnaWMgdG8gbWFrZSBEQk5vdEZvdW5kRXJyb3IgYW5kIERCS2V5RW1wdHlFcnJvciBkZXJpdmUKICAgICAgKiBmcm9tIGJvdGggREJFcnJvciBhbmQgS2V5RXJyb3IsIHNpbmNlIHRoZSBBUEkgb25seSBzdXBwb3J0cwpAQCAtNTQwMSwxMCArNTQyMSw2IEBACiAgICAgUHlEaWN0X0RlbEl0ZW1TdHJpbmcoZCwgIktleUVycm9yIik7CiAKIAotICAgIC8qIEFsbCB0aGUgcmVzdCBvZiB0aGUgZXhjZXB0aW9ucyBkZXJpdmUgb25seSBmcm9tIERCRXJyb3IgKi8KLSNkZWZpbmUgTUFLRV9FWChuYW1lKSAgIG5hbWUgPSBQeUVycl9OZXdFeGNlcHRpb24oImJzZGRiLl9kYi4iICNuYW1lLCBEQkVycm9yLCBOVUxMKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgI25hbWUsIG5hbWUpCi0KICNpZiAhSU5DT01QTEVURV9JU19XQVJOSU5HCiAgICAgTUFLRV9FWChEQkluY29tcGxldGVFcnJvcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2Nzdi5jIGIvTW9kdWxlcy9fY3N2LmMKaW5kZXggNDY5Y2Q2NC4uNDcwNGMxNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3N2LmMKKysrIGIvTW9kdWxlcy9fY3N2LmMKQEAgLTM3LDYgKzM3LDI4IEBACiAjCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAogIwllbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogI2VuZGlmCisKKyNpZm5kZWYgUHlfQ0xFQVIKKyNkZWZpbmUgUHlfQ0xFQVIob3ApCQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAob3ApIHsJCQkJCVwKKwkJCVB5T2JqZWN0ICp0bXAgPSAoUHlPYmplY3QgKikob3ApOwlcCisJCQkob3ApID0gTlVMTDsJCQkJXAorCQkJUHlfREVDUkVGKHRtcCk7CQkJCVwKKwkJfQkJCQkJCVwKKwl9IHdoaWxlICgwKQorI2VuZGlmCisjaWZuZGVmIFB5X1ZJU0lUCisjZGVmaW5lIFB5X1ZJU0lUKG9wKQkJCQkJCQlcCisgICAgICAgIGRvIHsgCQkJCQkJCQlcCisgICAgICAgICAgICAgICAgaWYgKG9wKSB7CQkJCQkJXAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZyZXQgPSB2aXNpdCgoUHlPYmplY3QgKikob3ApLCBhcmcpOwlcCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnJldCkJCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZyZXQ7CQkJCVwKKyAgICAgICAgICAgICAgICB9CQkJCQkJCVwKKyAgICAgICAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCiAvKiBlbmQgMi4yIGNvbXBhdGliaWxpdHkgbWFjcm9zICovCiAKICNkZWZpbmUgSVNfQkFTRVNUUklORyhvKSBcCkBAIC04MTIsMjggKzgzNCwxOCBAQAogc3RhdGljIGludAogUmVhZGVyX3RyYXZlcnNlKFJlYWRlck9iaiAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaW50IGVycjsKLSNkZWZpbmUgVklTSVQoU0xPVCkgXAotCWlmIChTTE9UKSB7IFwKLQkJZXJyID0gdmlzaXQoKFB5T2JqZWN0ICopKFNMT1QpLCBhcmcpOyBcCi0JCWlmIChlcnIpIFwKLQkJCXJldHVybiBlcnI7IFwKLQl9Ci0JVklTSVQoc2VsZi0+ZGlhbGVjdCk7Ci0JVklTSVQoc2VsZi0+aW5wdXRfaXRlcik7Ci0JVklTSVQoc2VsZi0+ZmllbGRzKTsKKwlQeV9WSVNJVChzZWxmLT5kaWFsZWN0KTsKKwlQeV9WSVNJVChzZWxmLT5pbnB1dF9pdGVyKTsKKwlQeV9WSVNJVChzZWxmLT5maWVsZHMpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBSZWFkZXJfY2xlYXIoUmVhZGVyT2JqICpzZWxmKQogewotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmRpYWxlY3QpOwotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmlucHV0X2l0ZXIpOwotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmZpZWxkcyk7Ci0gICAgICAgIHNlbGYtPmRpYWxlY3QgPSBOVUxMOwotICAgICAgICBzZWxmLT5pbnB1dF9pdGVyID0gTlVMTDsKLSAgICAgICAgc2VsZi0+ZmllbGRzID0gTlVMTDsKKwlQeV9DTEVBUihzZWxmLT5kaWFsZWN0KTsKKwlQeV9DTEVBUihzZWxmLT5pbnB1dF9pdGVyKTsKKwlQeV9DTEVBUihzZWxmLT5maWVsZHMpOwogCXJldHVybiAwOwogfQogCkBAIC0xMjQ1LDI1ICsxMjU3LDE2IEBACiBzdGF0aWMgaW50CiBXcml0ZXJfdHJhdmVyc2UoV3JpdGVyT2JqICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpbnQgZXJyOwotI2RlZmluZSBWSVNJVChTTE9UKSBcCi0JaWYgKFNMT1QpIHsgXAotCQllcnIgPSB2aXNpdCgoUHlPYmplY3QgKikoU0xPVCksIGFyZyk7IFwKLQkJaWYgKGVycikgXAotCQkJcmV0dXJuIGVycjsgXAotCX0KLQlWSVNJVChzZWxmLT5kaWFsZWN0KTsKLQlWSVNJVChzZWxmLT53cml0ZWxpbmUpOworCVB5X1ZJU0lUKHNlbGYtPmRpYWxlY3QpOworCVB5X1ZJU0lUKHNlbGYtPndyaXRlbGluZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIFdyaXRlcl9jbGVhcihXcml0ZXJPYmogKnNlbGYpCiB7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+ZGlhbGVjdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+d3JpdGVsaW5lKTsKLQlzZWxmLT5kaWFsZWN0ID0gTlVMTDsKLQlzZWxmLT53cml0ZWxpbmUgPSBOVUxMOworCVB5X0NMRUFSKHNlbGYtPmRpYWxlY3QpOworCVB5X0NMRUFSKHNlbGYtPndyaXRlbGluZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0OTUsNyArMTQ5OCw3IEBACiBQeURvY19TVFJWQVIoY3N2X3dyaXRlcl9kb2MsCiAiICAgIGNzdl93cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmogWywgZGlhbGVjdD0nZXhjZWwnXVxuIgogIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uYWwga2V5d29yZCBhcmdzXSlcbiIKLSIgICAgZm9yIHJvdyBpbiBjc3Zfd3JpdGVyOlxuIgorIiAgICBmb3Igcm93IGluIHNlcXVlbmNlOlxuIgogIiAgICAgICAgY3N2X3dyaXRlci53cml0ZXJvdyhyb3cpXG4iCiAiXG4iCiAiICAgIFtvcl1cbiIKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCmluZGV4IDkyNmM4NWIuLmU2ZDZhYTQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYwpAQCAtMTA1LDYgKzEwNSwxMCBAQAogI2luY2x1ZGUgPGZmaS5oPgogI2lmZGVmIE1TX1dJTjMyCiAjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2lmbmRlZiBJU19JTlRSRVNPVVJDRQorI2RlZmluZSBJU19JTlRSRVNPVVJDRSh4KSAoKChzaXplX3QpKHgpID4+IDE2KSA9PSAwKQorI2VuZGlmCiAjIGlmZGVmIF9XSU4zMl9XQ0UKIC8qIFVubGlrZSBkZXNrdG9wIFdpbmRvd3MsIFdpbkNFIGhhcyBib3RoIFcgYW5kIEEgdmFyaWFudHMgb2YKICAgIEdldFByb2NBZGRyZXNzLCBidXQgdGhlIGRlZmF1bHQgVyB2ZXJzaW9uIGlzIG5vdCB3aGF0IHdlIHdhbnQgKi8KQEAgLTI4NSw2ICsyODksNyBAQAogCWlmIChQeUNBcmdfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKIAkJUHlDQXJnT2JqZWN0ICpwID0gKFB5Q0FyZ09iamVjdCAqKXZhbHVlOwogCQlQeU9iamVjdCAqb2IgPSBwLT5vYmo7CisJCWNvbnN0IGNoYXIgKm9iX25hbWU7CiAJCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CiAJCWRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKIApAQCAtMjk2LDEwICszMDEsMTAgQEAKIAkJCVB5X0lOQ1JFRih2YWx1ZSk7CiAJCQlyZXR1cm4gdmFsdWU7CiAJCX0KKwkJb2JfbmFtZSA9IChvYikgPyBvYi0+b2JfdHlwZS0+dHBfbmFtZSA6ICI/Pz8iOwogCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogCQkJICAgICAiZXhwZWN0ZWQgJXMgaW5zdGFuY2UgaW5zdGVhZCBvZiBwb2ludGVyIHRvICVzIiwKLQkJCSAgICAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSwKLQkJCSAgICAgb2ItPm9iX3R5cGUtPnRwX25hbWUpOworCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lLCBvYl9uYW1lKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogI2lmIDEKQEAgLTUwNiwxMiArNTExLDEyIEBACiBzdGF0aWMgaW50CiBQb2ludGVyVHlwZV9TZXRQcm90byhTdGdEaWN0T2JqZWN0ICpzdGdkaWN0LCBQeU9iamVjdCAqcHJvdG8pCiB7Ci0JaWYgKHByb3RvICYmICFQeVR5cGVfQ2hlY2socHJvdG8pKSB7CisJaWYgKCFwcm90byB8fCAhUHlUeXBlX0NoZWNrKHByb3RvKSkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogCQkJCSJfdHlwZV8gbXVzdCBiZSBhIHR5cGUiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAocHJvdG8gJiYgIVB5VHlwZV9zdGdkaWN0KHByb3RvKSkgeworCWlmICghUHlUeXBlX3N0Z2RpY3QocHJvdG8pKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAJCQkJIl90eXBlXyBtdXN0IGhhdmUgc3RvcmFnZSBpbmZvIik7CiAJCXJldHVybiAtMTsKQEAgLTU0Myw4ICs1NDgsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAlzdGdkaWN0LT5zaXplID0gc2l6ZW9mKHZvaWQgKik7CiAJc3RnZGljdC0+YWxpZ24gPSBnZXRlbnRyeSgiUCIpLT5wZmZpX3R5cGUtPmFsaWdubWVudDsKLQlzdGdkaWN0LT5sZW5ndGggPSAyOwotCXN0Z2RpY3QtPmZmaV90eXBlID0gZmZpX3R5cGVfcG9pbnRlcjsKKwlzdGdkaWN0LT5sZW5ndGggPSAxOworCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOwogCiAJcHJvdG8gPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlZGljdCwgIl90eXBlXyIpOyAvKiBCb3Jyb3dlZCByZWYgKi8KIAlpZiAocHJvdG8gJiYgLTEgPT0gUG9pbnRlclR5cGVfU2V0UHJvdG8oc3RnZGljdCwgcHJvdG8pKSB7CkBAIC04OTksNyArOTA0LDcgQEAKIAlQeU9iamVjdCAqdHlwZWRpY3Q7CiAJaW50IGxlbmd0aDsKIAotCWludCBpdGVtc2l6ZSwgaXRlbWFsaWduLCBpdGVtbGVuOworCWludCBpdGVtc2l6ZSwgaXRlbWFsaWduOwogCiAJdHlwZWRpY3QgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMik7CiAJaWYgKCF0eXBlZGljdCkKQEAgLTkzNiw3ICs5NDEsNiBAQAogCiAJaXRlbXNpemUgPSBpdGVtZGljdC0+c2l6ZTsKIAlpdGVtYWxpZ24gPSBpdGVtZGljdC0+YWxpZ247Ci0JaXRlbWxlbiA9IGl0ZW1kaWN0LT5sZW5ndGg7CiAKIAlzdGdkaWN0LT5zaXplID0gaXRlbXNpemUgKiBsZW5ndGg7CiAJc3RnZGljdC0+YWxpZ24gPSBpdGVtYWxpZ247CkBAIC05NDUsNyArOTQ5LDcgQEAKIAlzdGdkaWN0LT5wcm90byA9IHByb3RvOwogCiAJLyogQXJyYXlzIGFyZSBwYXNzZWQgYXMgcG9pbnRlcnMgdG8gZnVuY3Rpb24gY2FsbHMuICovCi0Jc3RnZGljdC0+ZmZpX3R5cGUgPSBmZmlfdHlwZV9wb2ludGVyOworCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOwogCiAJLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCiAJICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLwpAQCAtMTI2NCw5ICsxMjY4LDEzIEBACiAJUHlUeXBlT2JqZWN0ICpyZXN1bHQ7CiAJU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAlQeU9iamVjdCAqbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JUHlPYmplY3QgKnN3YXBwZWRfYXJncyA9IFB5VHVwbGVfTmV3KFB5VHVwbGVfR0VUX1NJWkUoYXJncykpOworCVB5T2JqZWN0ICpzd2FwcGVkX2FyZ3M7CiAJc3RhdGljIFB5T2JqZWN0ICpzdWZmaXg7Ci0JaW50IGk7CisJUHlfc3NpemVfdCBpOworCisJc3dhcHBlZF9hcmdzID0gUHlUdXBsZV9OZXcoUHlUdXBsZV9HRVRfU0laRShhcmdzKSk7CisJaWYgKCFzd2FwcGVkX2FyZ3MpCisJCXJldHVybiBOVUxMOwogCiAJaWYgKHN1ZmZpeCA9PSBOVUxMKQogI2lmZGVmIFdPUkRTX0JJR0VORElBTgpAQCAtMTI3NSw4ICsxMjgzLDEwIEBACiAJCXN1ZmZpeCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIl9iZSIpOwogI2VuZGlmCiAKLQlQeV9JTkNSRUYoc3VmZml4KTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJm5hbWUsIHN1ZmZpeCk7CisJUHlfSU5DUkVGKG5hbWUpOworCVB5U3RyaW5nX0NvbmNhdCgmbmFtZSwgc3VmZml4KTsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKIAogCVB5VHVwbGVfU0VUX0lURU0oc3dhcHBlZF9hcmdzLCAwLCBuYW1lKTsKIAlmb3IgKGk9MTsgaTxQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOyArK2kpIHsKQEAgLTEyOTcsNyArMTMwNyw3IEBACiAJaWYgKCFzdGdkaWN0KSAvKiBYWFggbGVha3MgcmVzdWx0ISAqLwogCQlyZXR1cm4gTlVMTDsKIAotCXN0Z2RpY3QtPmZmaV90eXBlID0gKmZtdC0+cGZmaV90eXBlOworCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSAqZm10LT5wZmZpX3R5cGU7CiAJc3RnZGljdC0+YWxpZ24gPSBmbXQtPnBmZmlfdHlwZS0+YWxpZ25tZW50OwogCXN0Z2RpY3QtPmxlbmd0aCA9IDA7CiAJc3RnZGljdC0+c2l6ZSA9IGZtdC0+cGZmaV90eXBlLT5zaXplOwpAQCAtMTM1NSw3ICsxMzY1LDcgQEAKIAogCWZtdCA9IGdldGVudHJ5KFB5U3RyaW5nX0FTX1NUUklORyhwcm90bykpOwogCi0Jc3RnZGljdC0+ZmZpX3R5cGUgPSAqZm10LT5wZmZpX3R5cGU7CisJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9ICpmbXQtPnBmZmlfdHlwZTsKIAlzdGdkaWN0LT5hbGlnbiA9IGZtdC0+cGZmaV90eXBlLT5hbGlnbm1lbnQ7CiAJc3RnZGljdC0+bGVuZ3RoID0gMDsKIAlzdGdkaWN0LT5zaXplID0gZm10LT5wZmZpX3R5cGUtPnNpemU7CkBAIC0xNDUwLDYgKzE0NjAsNyBAQAogCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2xlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOwogCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2JlX18iLCBzd2FwcGVkKTsKICNlbmRpZgorCQlQeV9ERUNSRUYoc3dhcHBlZCk7CiAJfTsKIAogCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CkBAIC0xNjI0LDcgKzE2MzUsNyBAQAogCXN0Z2RpY3QtPnNpemUgPSBzaXplb2Yodm9pZCAqKTsKIAlzdGdkaWN0LT5zZXRmdW5jID0gTlVMTDsKIAlzdGdkaWN0LT5nZXRmdW5jID0gTlVMTDsKLQlzdGdkaWN0LT5mZmlfdHlwZSA9IGZmaV90eXBlX3BvaW50ZXI7CisJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9IGZmaV90eXBlX3BvaW50ZXI7CiAKIAlvYiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKXN0Z2RpY3QsICJfZmxhZ3NfIik7CiAJaWYgKCFvYiB8fCAhUHlJbnRfQ2hlY2sob2IpKSB7CkBAIC0xODQ2LDcgKzE4NTcsNyBAQAogCVN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwogCVB5X0NMRUFSKHNlbGYtPmJfb2JqZWN0cyk7CiAJaWYgKChzZWxmLT5iX25lZWRzZnJlZSkKLQkgICAgJiYgKGRpY3QtPnNpemUgPiBzaXplb2Yoc2VsZi0+Yl92YWx1ZSkpKQorCSAgICAmJiAoKHNpemVfdClkaWN0LT5zaXplID4gc2l6ZW9mKHNlbGYtPmJfdmFsdWUpKSkKIAkJUHlNZW1fRnJlZShzZWxmLT5iX3B0cik7CiAJc2VsZi0+Yl9wdHIgPSBOVUxMOwogCVB5X0NMRUFSKHNlbGYtPmJfYmFzZSk7CkBAIC0xODczLDggKzE4ODQsOSBAQAogCXsgTlVMTCB9LAogfTsKIAotc3RhdGljIFB5X3NzaXplX3QgQ0RhdGFfR2V0QnVmZmVyKENEYXRhT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IHNlZywgdm9pZCAqKnBwdHIpCitzdGF0aWMgUHlfc3NpemVfdCBDRGF0YV9HZXRCdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IHNlZywgdm9pZCAqKnBwdHIpCiB7CisJQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKIAlpZiAoc2VnICE9IDApIHsKIAkJLyogSG0uIE11c3QgdGhpcyBzZXQgYW4gZXhjZXB0aW9uPyAqLwogCQlyZXR1cm4gLTE7CkBAIC0xODgzLDcgKzE4OTUsNyBAQAogCXJldHVybiBzZWxmLT5iX3NpemU7CiB9CiAKLXN0YXRpYyBQeV9zc2l6ZV90IENEYXRhX0dldFNlZ2NvdW50KENEYXRhT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90ICpsZW5wKQorc3RhdGljIFB5X3NzaXplX3QgQ0RhdGFfR2V0U2VnY291bnQoUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90ICpsZW5wKQogewogCWlmIChsZW5wKQogCQkqbGVucCA9IDE7CkBAIC0xODkxLDEwICsxOTAzLDEwIEBACiB9CiAKIHN0YXRpYyBQeUJ1ZmZlclByb2NzIENEYXRhX2FzX2J1ZmZlciA9IHsKLQkocmVhZGJ1ZmZlcnByb2MpQ0RhdGFfR2V0QnVmZmVyLAotCSh3cml0ZWJ1ZmZlcnByb2MpQ0RhdGFfR2V0QnVmZmVyLAotCShzZWdjb3VudHByb2MpQ0RhdGFfR2V0U2VnY291bnQsCi0JKGNoYXJidWZmZXJwcm9jKU5VTEwsCisJQ0RhdGFfR2V0QnVmZmVyLAorCUNEYXRhX0dldEJ1ZmZlciwKKwlDRGF0YV9HZXRTZWdjb3VudCwKKwlOVUxMLAogfTsKIAogLyoKQEAgLTE5NjcsNyArMTk3OSw3IEBACiAKIHN0YXRpYyB2b2lkIENEYXRhX01hbGxvY0J1ZmZlcihDRGF0YU9iamVjdCAqb2JqLCBTdGdEaWN0T2JqZWN0ICpkaWN0KQogewotCWlmIChkaWN0LT5zaXplIDw9IHNpemVvZihvYmotPmJfdmFsdWUpKSB7CisJaWYgKChzaXplX3QpZGljdC0+c2l6ZSA8PSBzaXplb2Yob2JqLT5iX3ZhbHVlKSkgewogCQkvKiBObyBuZWVkIHRvIGNhbGwgbWFsbG9jLCBjYW4gdXNlIHRoZSBkZWZhdWx0IGJ1ZmZlciAqLwogCQlvYmotPmJfcHRyID0gKGNoYXIgKikmb2JqLT5iX3ZhbHVlOwogCQlvYmotPmJfbmVlZHNmcmVlID0gMTsKQEAgLTE5NzUsNyArMTk4Nyw3IEBACiAJCS8qIEluIHB5dGhvbiAyLjQsIGFuZCBjdHlwZXMgMC45LjYsIHRoZSBtYWxsb2MgY2FsbCB0b29rIGFib3V0CiAJCSAgIDMzJSBvZiB0aGUgY3JlYXRpb24gdGltZSBmb3IgY19pbnQoKS4KIAkJKi8KLQkJb2JqLT5iX3B0ciA9IFB5TWVtX01hbGxvYyhkaWN0LT5zaXplKTsKKwkJb2JqLT5iX3B0ciA9IChjaGFyICopUHlNZW1fTWFsbG9jKGRpY3QtPnNpemUpOwogCQlvYmotPmJfbmVlZHNmcmVlID0gMTsKIAkJbWVtc2V0KG9iai0+Yl9wdHIsIDAsIGRpY3QtPnNpemUpOwogCX0KQEAgLTIwNDAsNyArMjA1Miw3IEBACiAJaWYgKCFwZCkKIAkJcmV0dXJuIE5VTEw7CiAJYXNzZXJ0KENEYXRhT2JqZWN0X0NoZWNrKHBkKSk7Ci0JcGQtPmJfcHRyID0gYnVmOworCXBkLT5iX3B0ciA9IChjaGFyICopYnVmOwogCXBkLT5iX2xlbmd0aCA9IGRpY3QtPmxlbmd0aDsKIAlwZC0+Yl9zaXplID0gZGljdC0+c2l6ZTsKIAlyZXR1cm4gKFB5T2JqZWN0ICopcGQ7CkBAIC0yMzgzLDYgKzIzOTUsMTEgQEAKIAlhZGRyZXNzID0gKFBQUk9DKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbmFtZSk7CiAJaWYgKGFkZHJlc3MpCiAJCXJldHVybiBhZGRyZXNzOworCisJaWYgKCgoc2l6ZV90KW5hbWUgJiB+MHhGRkZGKSA9PSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKwogCS8qIEl0IHNob3VsZCBub3QgaGFwcGVuIHRoYXQgZGljdCBpcyBOVUxMLCBidXQgYmV0dGVyIGJlIHNhZmUgKi8KIAlpZiAoZGljdD09TlVMTCB8fCBkaWN0LT5mbGFncyAmIEZVTkNGTEFHX0NERUNMKQogCQlyZXR1cm4gYWRkcmVzczsKQEAgLTIzOTEsNyArMjQwOCw3IEBACiAJICAgZnVuY25hbWUgLT4gX2Z1bmNuYW1lQDxuPgogCSAgIHdoZXJlIG4gaXMgMCwgNCwgOCwgMTIsIC4uLiwgMTI4CiAJICovCi0JbWFuZ2xlZF9uYW1lID0gX2FsbG9jYShzdHJsZW4obmFtZSkgKyAxICsgMSArIDEgKyAzKTsgLyogXDAgXyBAICVkICovCisJbWFuZ2xlZF9uYW1lID0gYWxsb2NhKHN0cmxlbihuYW1lKSArIDEgKyAxICsgMSArIDMpOyAvKiBcMCBfIEAgJWQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkgewogCQlzcHJpbnRmKG1hbmdsZWRfbmFtZSwgIl8lc0AlZCIsIG5hbWUsIGkqNCk7CiAJCWFkZHJlc3MgPSAoUFBST0MpR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCBtYW5nbGVkX25hbWUpOwpAQCAtMjQ4OCw2ICsyNTA1LDI4IEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbnQKK19nZXRfbmFtZShQeU9iamVjdCAqb2JqLCBjaGFyICoqcG5hbWUpCit7CisjaWZkZWYgTVNfV0lOMzIKKwlpZiAoUHlJbnRfQ2hlY2sob2JqKSB8fCBQeUxvbmdfQ2hlY2sob2JqKSkgeworCQkvKiBXZSBoYXZlIHRvIHVzZSBNQUtFSU5UUkVTT1VSQ0VBIGZvciBXaW5kb3dzIENFLgorCQkgICBXb3JrcyBvbiBXaW5kb3dzIGFzIHdlbGwsIG9mIGNvdXJzZS4KKwkJKi8KKwkJKnBuYW1lID0gTUFLRUlOVFJFU09VUkNFQShQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sob2JqKSAmIDB4RkZGRik7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCWlmIChQeVN0cmluZ19DaGVjayhvYmopIHx8IFB5VW5pY29kZV9DaGVjayhvYmopKSB7CisJCSpwbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG9iaik7CisJCXJldHVybiAqcG5hbWUgPyAxIDogMDsKKwl9CisJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKwkJCSJmdW5jdGlvbiBuYW1lIG11c3QgYmUgc3RyaW5nIG9yIGludGVnZXIiKTsKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Z1bmNQdHJfRnJvbURsbChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKQEAgLTI0OTksNyArMjUzOCw3IEBACiAJdm9pZCAqaGFuZGxlOwogCVB5T2JqZWN0ICpwYXJhbWZsYWdzID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic098TyIsICZuYW1lLCAmZGxsLCAmcGFyYW1mbGFncykpCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIoTyZPKXxPIiwgX2dldF9uYW1lLCAmbmFtZSwgJmRsbCwgJnBhcmFtZmxhZ3MpKQogCQlyZXR1cm4gTlVMTDsKIAlpZiAocGFyYW1mbGFncyA9PSBQeV9Ob25lKQogCQlwYXJhbWZsYWdzID0gTlVMTDsKQEAgLTI1MjQsOSArMjU2MywxNCBAQAogI2lmZGVmIE1TX1dJTjMyCiAJYWRkcmVzcyA9IEZpbmRBZGRyZXNzKGhhbmRsZSwgbmFtZSwgKFB5T2JqZWN0ICopdHlwZSk7CiAJaWYgKCFhZGRyZXNzKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAgICAgImZ1bmN0aW9uICclcycgbm90IGZvdW5kIiwKLQkJCSAgICAgbmFtZSk7CisJCWlmICghSVNfSU5UUkVTT1VSQ0UobmFtZSkpCisJCQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisJCQkJICAgICAiZnVuY3Rpb24gJyVzJyBub3QgZm91bmQiLAorCQkJCSAgICAgbmFtZSk7CisJCWVsc2UKKwkJCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKwkJCQkgICAgICJmdW5jdGlvbiBvcmRpbmFsICVkIG5vdCBmb3VuZCIsCisJCQkJICAgICAoV09SRCkoc2l6ZV90KW5hbWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAjZWxzZQpAQCAtMjYwMyw4ICsyNjQ3LDkgQEAKICAgIk8iIC0gbXVzdCBiZSBhIGNhbGxhYmxlLCBjcmVhdGVzIGEgQyBjYWxsYWJsZSBmdW5jdGlvbgogCiAgIHR3byBvciBtb3JlIGFyZ3VtZW50IGZvcm1zICh0aGUgdGhpcmQgYXJndW1lbnQgaXMgYSBwYXJhbWZsYWdzIHR1cGxlKQotICAic098TyIgLSBmdW5jdGlvbiBuYW1lLCBkbGwgb2JqZWN0ICh3aXRoIGFuIGludGVnZXIgaGFuZGxlKQotICAiaXN8TyIgLSB2dGFibGUgaW5kZXgsIG1ldGhvZCBuYW1lLCBjcmVhdGVzIGNhbGxhYmxlIGNhbGxpbmcgQ09NIHZ0YmwKKyAgIihzTyl8Li4uIiAtIChmdW5jdGlvbiBuYW1lLCBkbGwgb2JqZWN0ICh3aXRoIGFuIGludGVnZXIgaGFuZGxlKSksIHBhcmFtZmxhZ3MKKyAgIihpTyl8Li4uIiAtIChmdW5jdGlvbiBvcmRpbmFsLCBkbGwgb2JqZWN0ICh3aXRoIGFuIGludGVnZXIgaGFuZGxlKSksIHBhcmFtZmxhZ3MKKyAgImlzfC4uLiIgLSB2dGFibGUgaW5kZXgsIG1ldGhvZCBuYW1lLCBjcmVhdGVzIGNhbGxhYmxlIGNhbGxpbmcgQ09NIHZ0YmwKICovCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Z1bmNQdHJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQpAQCAtMjYxMiwxOSArMjY1NywxOCBAQAogCUNGdW5jUHRyT2JqZWN0ICpzZWxmOwogCVB5T2JqZWN0ICpjYWxsYWJsZTsKIAlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCVRIVU5LIHRodW5rOworCWZmaV9pbmZvICp0aHVuazsKIAogCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApCiAJCXJldHVybiBHZW5lcmljQ0RhdGFfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwogCi0JLyogU2hvdWxkbid0IHRoZSBmb2xsb3dpbmcgYmV0dGVyIGJlIGRvbmUgaW4gX19pbml0X18/ICovCi0JaWYgKDIgPD0gUHlUdXBsZV9HRVRfU0laRShhcmdzKSkgewotI2lmZGVmIE1TX1dJTjMyCi0JCWlmIChQeUludF9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKSkKLQkJCXJldHVybiBDRnVuY1B0cl9Gcm9tVnRibEluZGV4KHR5cGUsIGFyZ3MsIGt3ZHMpOwotI2VuZGlmCisJaWYgKDEgPD0gUHlUdXBsZV9HRVRfU0laRShhcmdzKSAmJiBQeVR1cGxlX0NoZWNrKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpKQogCQlyZXR1cm4gQ0Z1bmNQdHJfRnJvbURsbCh0eXBlLCBhcmdzLCBrd2RzKTsKLQl9CisKKyNpZmRlZiBNU19XSU4zMgorCWlmICgyIDw9IFB5VHVwbGVfR0VUX1NJWkUoYXJncykgJiYgUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpCisJCXJldHVybiBDRnVuY1B0cl9Gcm9tVnRibEluZGV4KHR5cGUsIGFyZ3MsIGt3ZHMpOworI2VuZGlmCiAKIAlpZiAoMSA9PSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpCiAJICAgICYmIChQeUludF9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKQpAQCAtMjc4MSw3ICsyODI1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfYnVpbGRfY2FsbGFyZ3MoQ0Z1bmNQdHJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmd0eXBlcywKIAkJUHlPYmplY3QgKmluYXJncywgUHlPYmplY3QgKmt3ZHMsCi0JCWludCAqcG91dG1hc2ssIGludCAqcGlub3V0bWFzaywgaW50ICpwbnVtcmV0dmFscykKKwkJaW50ICpwb3V0bWFzaywgaW50ICpwaW5vdXRtYXNrLCB1bnNpZ25lZCBpbnQgKnBudW1yZXR2YWxzKQogewogCVB5T2JqZWN0ICpwYXJhbWZsYWdzID0gc2VsZi0+cGFyYW1mbGFnczsKIAlQeU9iamVjdCAqY2FsbGFyZ3M7CkBAIC0yODM1LDggKzI4NzksMTQgQEAKIAogCQlzd2l0Y2ggKGZsYWcgJiAoUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUIHwgUEFSQU1GTEFHX0ZMQ0lEKSkgewogCQljYXNlIFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRkxDSUQ6Ci0JCQkvKiBbJ2luJywgJ2xjaWQnXSBwYXJhbWV0ZXIuICBBbHdheXMgdGFrZW4gZnJvbSBkZWZ2YWwgKi8KLQkJCVB5X0lOQ1JFRihkZWZ2YWwpOworCQkJLyogWydpbicsICdsY2lkJ10gcGFyYW1ldGVyLiAgQWx3YXlzIHRha2VuIGZyb20gZGVmdmFsLAorCQkJIGlmIGdpdmVuLCBlbHNlIHRoZSBpbnRlZ2VyIDAuICovCisJCQlpZiAoZGVmdmFsID09IE5VTEwpIHsKKwkJCQlkZWZ2YWwgPSBQeUludF9Gcm9tTG9uZygwKTsKKwkJCQlpZiAoZGVmdmFsID09IE5VTEwpCisJCQkJCWdvdG8gZXJyb3I7CisJCQl9IGVsc2UKKwkJCQlQeV9JTkNSRUYoZGVmdmFsKTsKIAkJCVB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIGksIGRlZnZhbCk7CiAJCQlicmVhazsKIAkJY2FzZSAoUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUKToKQEAgLTI5MzksOSArMjk4OSwxMCBAQAogKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBfYnVpbGRfcmVzdWx0KFB5T2JqZWN0ICpyZXN1bHQsIFB5T2JqZWN0ICpjYWxsYXJncywKLQkgICAgICBpbnQgb3V0bWFzaywgaW50IGlub3V0bWFzaywgaW50IG51bXJldHZhbHMpCisJICAgICAgaW50IG91dG1hc2ssIGludCBpbm91dG1hc2ssIHVuc2lnbmVkIGludCBudW1yZXR2YWxzKQogewotCWludCBpLCBpbmRleCwgYml0OworCXVuc2lnbmVkIGludCBpLCBpbmRleDsKKwlpbnQgYml0OwogCVB5T2JqZWN0ICp0dXAgPSBOVUxMOwogCiAJaWYgKGNhbGxhcmdzID09IE5VTEwpCkBAIC0yOTUyLDYgKzMwMDMsNyBAQAogCX0KIAlQeV9ERUNSRUYocmVzdWx0KTsKIAorCS8qIHR1cCB3aWxsIG5vdCBiZSBhbGxvY2F0ZWQgaWYgbnVtcmV0dmFscyA9PSAxICovCiAJLyogYWxsb2NhdGUgdHVwbGUgdG8gaG9sZCB0aGUgcmVzdWx0ICovCiAJaWYgKG51bXJldHZhbHMgPiAxKSB7CiAJCXR1cCA9IFB5VHVwbGVfTmV3KG51bXJldHZhbHMpOwpAQCAtMzAwOSw3ICszMDYxLDcgQEAKIAogCWludCBpbm91dG1hc2s7CiAJaW50IG91dG1hc2s7Ci0JaW50IG51bXJldHZhbHM7CisJdW5zaWduZWQgaW50IG51bXJldHZhbHM7CiAKIAlhc3NlcnQoZGljdCk7IC8qIGlmIG5vdCwgaXQncyBhIGJ1ZyAqLwogCXJlc3R5cGUgPSBzZWxmLT5yZXN0eXBlID8gc2VsZi0+cmVzdHlwZSA6IGRpY3QtPnJlc3R5cGU7CkBAIC0zMTQ1LDkgKzMxOTcsMTEgQEAKIAlQeV9DTEVBUihzZWxmLT5jb252ZXJ0ZXJzKTsKIAlQeV9DTEVBUihzZWxmLT5wYXJhbWZsYWdzKTsKIAotCWlmIChzZWxmLT50aHVuaykKLQkJRnJlZUNhbGxiYWNrKHNlbGYtPnRodW5rKTsKLQlzZWxmLT50aHVuayA9IE5VTEw7CisJaWYgKHNlbGYtPnRodW5rKSB7CisJCUZyZWVDbG9zdXJlKHNlbGYtPnRodW5rLT5wY2wpOworCQlQeU1lbV9GcmVlKHNlbGYtPnRodW5rKTsKKwkJc2VsZi0+dGh1bmsgPSBOVUxMOworCX0KIAogCXJldHVybiBDRGF0YV9jbGVhcigoQ0RhdGFPYmplY3QgKilzZWxmKTsKIH0KQEAgLTMyNDEsNyArMzI5NSw3IEBACiAKIAlwYXJnLT50YWcgPSAnVic7CiAJc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JcGFyZy0+cGZmaV90eXBlID0gJnN0Z2RpY3QtPmZmaV90eXBlOworCXBhcmctPnBmZmlfdHlwZSA9ICZzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyOwogCS8qIEZvciBzdHJ1Y3R1cmUgcGFyYW1ldGVycyAoYnkgdmFsdWUpLCBwYXJnLT52YWx1ZSBkb2Vzbid0IGNvbnRhaW4gdGhlIHN0cnVjdHVyZQogCSAgIGRhdGEgaXRzZWxmLCBpbnN0ZWFkIHBhcmctPnZhbHVlLnAgKnBvaW50cyogdG8gdGhlIHN0cnVjdHVyZSdzIGRhdGEKIAkgICBTZWUgYWxzbyBfY3R5cGVzLmMsIGZ1bmN0aW9uIF9jYWxsX2Z1bmN0aW9uX3BvaW50ZXIoKS4KQEAgLTMyNzUsNiArMzMyOSw4IEBACiAJCWlmICghZmllbGRzKSB7CiAJCQlQeUVycl9DbGVhcigpOwogCQkJZmllbGRzID0gUHlUdXBsZV9OZXcoMCk7CisJCQlpZiAoIWZpZWxkcykKKwkJCQlyZXR1cm4gLTE7CiAJCX0KIAogCQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA+IFB5U2VxdWVuY2VfTGVuZ3RoKGZpZWxkcykpIHsKQEAgLTM0NDUsOCArMzUwMSw5IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1BcnJheV9pdGVtKENEYXRhT2JqZWN0ICpzZWxmLCBpbnQgaW5kZXgpCitBcnJheV9pdGVtKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbmRleCkKIHsKKwlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCWludCBvZmZzZXQsIHNpemU7CiAJU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIApAQCAtMzQ2OSw4ICszNTI2LDkgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLUFycmF5X3NsaWNlKENEYXRhT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gpCitBcnJheV9zbGljZShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCkKIHsKKwlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKIAlQeU9iamVjdCAqcHJvdG87CiAJUHlMaXN0T2JqZWN0ICpucDsKQEAgLTM1MDQsMTUgKzM1NjIsMTYgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJUHlPYmplY3QgKnYgPSBBcnJheV9pdGVtKHNlbGYsIGkraWxvdyk7CisJCVB5T2JqZWN0ICp2ID0gQXJyYXlfaXRlbShfc2VsZiwgaStpbG93KTsKIAkJUHlMaXN0X1NFVF9JVEVNKG5wLCBpLCB2KTsKIAl9CiAJcmV0dXJuIChQeU9iamVjdCAqKW5wOwogfQogCiBzdGF0aWMgaW50Ci1BcnJheV9hc3NfaXRlbShDRGF0YU9iamVjdCAqc2VsZiwgaW50IGluZGV4LCBQeU9iamVjdCAqdmFsdWUpCitBcnJheV9hc3NfaXRlbShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaW5kZXgsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKKwlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCWludCBzaXplLCBvZmZzZXQ7CiAJU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAljaGFyICpwdHI7CkBAIC0zNTM4LDggKzM1OTcsOSBAQAogfQogCiBzdGF0aWMgaW50Ci1BcnJheV9hc3Nfc2xpY2UoQ0RhdGFPYmplY3QgKnNlbGYsIGludCBpbG93LCBpbnQgaWhpZ2gsIFB5T2JqZWN0ICp2YWx1ZSkKK0FycmF5X2Fzc19zbGljZShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCwgUHlPYmplY3QgKnZhbHVlKQogeworCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAJaW50IGksIGxlbjsKIAogCWlmICh2YWx1ZSA9PSBOVUxMKSB7CkBAIC0zNTcwLDcgKzM2MzAsNyBAQAogCQlpbnQgcmVzdWx0OwogCQlpZiAoaXRlbSA9PSBOVUxMKQogCQkJcmV0dXJuIC0xOwotCQlyZXN1bHQgPSBBcnJheV9hc3NfaXRlbShzZWxmLCBpK2lsb3csIGl0ZW0pOworCQlyZXN1bHQgPSBBcnJheV9hc3NfaXRlbShfc2VsZiwgaStpbG93LCBpdGVtKTsKIAkJUHlfREVDUkVGKGl0ZW0pOwogCQlpZiAocmVzdWx0ID09IC0xKQogCQkJcmV0dXJuIC0xOwpAQCAtMzU3OCwyMCArMzYzOCwyMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1BcnJheV9sZW5ndGgoQ0RhdGFPYmplY3QgKnNlbGYpCitzdGF0aWMgUHlfc3NpemVfdAorQXJyYXlfbGVuZ3RoKFB5T2JqZWN0ICpfc2VsZikKIHsKKwlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCXJldHVybiBzZWxmLT5iX2xlbmd0aDsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIEFycmF5X2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKUFycmF5X2xlbmd0aCwJCQkvKiBzcV9sZW5ndGg7ICovCisJQXJyYXlfbGVuZ3RoLAkJCQkvKiBzcV9sZW5ndGg7ICovCiAJMCwJCQkJCS8qIHNxX2NvbmNhdDsgKi8KIAkwLAkJCQkJLyogc3FfcmVwZWF0OyAqLwotCShzc2l6ZWFyZ2Z1bmMpQXJyYXlfaXRlbSwJCS8qIHNxX2l0ZW07ICovCi0JKHNzaXplc3NpemVhcmdmdW5jKUFycmF5X3NsaWNlLAkJLyogc3Ffc2xpY2U7ICovCi0JKHNzaXplb2JqYXJncHJvYylBcnJheV9hc3NfaXRlbSwJLyogc3FfYXNzX2l0ZW07ICovCi0JKHNzaXplc3NpemVvYmphcmdwcm9jKUFycmF5X2Fzc19zbGljZSwJLyogc3FfYXNzX3NsaWNlOyAqLworCUFycmF5X2l0ZW0sCQkJCS8qIHNxX2l0ZW07ICovCisJQXJyYXlfc2xpY2UsCQkJCS8qIHNxX3NsaWNlOyAqLworCUFycmF5X2Fzc19pdGVtLAkJCQkvKiBzcV9hc3NfaXRlbTsgKi8KKwlBcnJheV9hc3Nfc2xpY2UsCQkJLyogc3FfYXNzX3NsaWNlOyAqLwogCTAsCQkJCQkvKiBzcV9jb250YWluczsgKi8KIAkKIAkwLAkJCQkJLyogc3FfaW5wbGFjZV9jb25jYXQ7ICovCkBAIC0zOTQyLDggKzQwMDMsOSBAQAogICBQb2ludGVyX1R5cGUKICovCiBzdGF0aWMgUHlPYmplY3QgKgotUG9pbnRlcl9pdGVtKENEYXRhT2JqZWN0ICpzZWxmLCBpbnQgaW5kZXgpCitQb2ludGVyX2l0ZW0oUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IGluZGV4KQogeworCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAJaW50IHNpemUsIG9mZnNldDsKIAlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0LCAqaXRlbWRpY3Q7CiAJUHlPYmplY3QgKnByb3RvOwpAQCAtMzk2OSw4ICs0MDMxLDkgQEAKIH0KIAogc3RhdGljIGludAotUG9pbnRlcl9hc3NfaXRlbShDRGF0YU9iamVjdCAqc2VsZiwgaW50IGluZGV4LCBQeU9iamVjdCAqdmFsdWUpCitQb2ludGVyX2Fzc19pdGVtKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QgKnZhbHVlKQogeworCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAJaW50IHNpemU7CiAJU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIApAQCAtNDExMSw4ICs0MTc0LDkgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLVBvaW50ZXJfc2xpY2UoQ0RhdGFPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCkKK1BvaW50ZXJfc2xpY2UoUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gpCiB7CisJQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKIAlQeUxpc3RPYmplY3QgKm5wOwogCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKIAlQeU9iamVjdCAqcHJvdG87CkBAIC00MTQyLDcgKzQyMDYsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlQeU9iamVjdCAqdiA9IFBvaW50ZXJfaXRlbShzZWxmLCBpK2lsb3cpOworCQlQeU9iamVjdCAqdiA9IFBvaW50ZXJfaXRlbShfc2VsZiwgaStpbG93KTsKIAkJUHlMaXN0X1NFVF9JVEVNKG5wLCBpLCB2KTsKIAl9CiAJcmV0dXJuIChQeU9iamVjdCAqKW5wOwpAQCAtNDE1Miw5ICs0MjE2LDkgQEAKIAkwLAkJCQkJLyogaW5xdWlyeSBzcV9sZW5ndGg7ICovCiAJMCwJCQkJCS8qIGJpbmFyeWZ1bmMgc3FfY29uY2F0OyAqLwogCTAsCQkJCQkvKiBpbnRhcmdmdW5jIHNxX3JlcGVhdDsgKi8KLQkoc3NpemVhcmdmdW5jKVBvaW50ZXJfaXRlbSwJCS8qIGludGFyZ2Z1bmMgc3FfaXRlbTsgKi8KLQkoc3NpemVzc2l6ZWFyZ2Z1bmMpUG9pbnRlcl9zbGljZSwJLyogaW50aW50YXJnZnVuYyBzcV9zbGljZTsgKi8KLQkoc3NpemVvYmphcmdwcm9jKVBvaW50ZXJfYXNzX2l0ZW0sCS8qIGludG9iamFyZ3Byb2Mgc3FfYXNzX2l0ZW07ICovCisJUG9pbnRlcl9pdGVtLAkJCQkvKiBpbnRhcmdmdW5jIHNxX2l0ZW07ICovCisJUG9pbnRlcl9zbGljZSwJCQkJLyogaW50aW50YXJnZnVuYyBzcV9zbGljZTsgKi8KKwlQb2ludGVyX2Fzc19pdGVtLAkJCS8qIGludG9iamFyZ3Byb2Mgc3FfYXNzX2l0ZW07ICovCiAJMCwJCQkJCS8qIGludGludG9iamFyZ3Byb2Mgc3FfYXNzX3NsaWNlOyAqLwogCTAsCQkJCQkvKiBvYmpvYmpwcm9jIHNxX2NvbnRhaW5zOyAqLwogCS8qIEFkZGVkIGluIHJlbGVhc2UgMi4wICovCkBAIC00MzM0LDYgKzQzOTgsNDIgQEAKIAlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyLCBzaXplKTsKIH0KIAorc3RhdGljIGludAorY2FzdF9jaGVja19wb2ludGVydHlwZShQeU9iamVjdCAqYXJnKQoreworCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisKKwlpZiAoUG9pbnRlclR5cGVPYmplY3RfQ2hlY2soYXJnKSkKKwkJcmV0dXJuIDE7CisJZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFyZyk7CisJaWYgKGRpY3QpIHsKKwkJaWYgKFB5U3RyaW5nX0NoZWNrKGRpY3QtPnByb3RvKQorCQkgICAgJiYgKHN0cmNocigic1B6VVpYTyIsIFB5U3RyaW5nX0FTX1NUUklORyhkaWN0LT5wcm90bylbMF0pKSkgeworCQkJLyogc2ltcGxlIHBvaW50ZXIgdHlwZXMsIGNfdm9pZF9wLCBjX3djaGFyX3AsIEJTVFIsIC4uLiAqLworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKwkJICAgICAiY2FzdCgpIGFyZ3VtZW50IDIgbXVzdCBiZSBhIHBvaW50ZXIgdHlwZSwgbm90ICVzIiwKKwkJICAgICBQeVR5cGVfQ2hlY2soYXJnKQorCQkgICAgID8gKChQeVR5cGVPYmplY3QgKilhcmcpLT50cF9uYW1lCisJCSAgICAgOiBhcmctPm9iX3R5cGUtPnRwX25hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorY2FzdCh2b2lkICpwdHIsIFB5T2JqZWN0ICpjdHlwZSkKK3sKKwlDRGF0YU9iamVjdCAqcmVzdWx0OworCWlmICgwID09IGNhc3RfY2hlY2tfcG9pbnRlcnR5cGUoY3R5cGUpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXN1bHQgPSAoQ0RhdGFPYmplY3QgKilQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGN0eXBlLCBOVUxMKTsKKwlpZiAocmVzdWx0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCS8qIFNob3VsZCB3ZSBhc3NlcnQgdGhhdCByZXN1bHQgaXMgYSBwb2ludGVyIHR5cGU/ICovCisJbWVtY3B5KHJlc3VsdC0+Yl9wdHIsICZwdHIsIHNpemVvZih2b2lkICopKTsKKwlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworfQogCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00NDY5LDE0ICs0NTY5LDI1IEBACiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfbWVtbW92ZV9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKG1lbW1vdmUpKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9tZW1zZXRfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihtZW1zZXQpKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9zdHJpbmdfYXRfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihzdHJpbmdfYXQpKTsKKwlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9jYXN0X2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIoY2FzdCkpOwogI2lmZGVmIENUWVBFU19VTklDT0RFCiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfd3N0cmluZ19hdF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKHdzdHJpbmdfYXQpKTsKICNlbmRpZgogCi0jaWZkZWYgUlRMRF9MT0NBTAorLyogSWYgUlRMRF9MT0NBTCBpcyBub3QgZGVmaW5lZCAoV2luZG93cyEpLCBzZXQgaXQgdG8gemVyby4gKi8KKyNpZm5kZWYgUlRMRF9MT0NBTAorI2RlZmluZSBSVExEX0xPQ0FMIDAKKyNlbmRpZgorCisvKiBJZiBSVExEX0dMT0JBTCBpcyBub3QgZGVmaW5lZCAoY3lnd2luKSwgc2V0IGl0IHRvIHRoZSBzYW1lIHZhbHVlIGFzCisgICBSVExEX0xPQ0FMLgorKi8KKyNpZm5kZWYgUlRMRF9HTE9CQUwKKyNkZWZpbmUgUlRMRF9HTE9CQUwgUlRMRF9MT0NBTAorI2VuZGlmCisKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlJUTERfTE9DQUwiLCBQeUludF9Gcm9tTG9uZyhSVExEX0xPQ0FMKSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSVExEX0dMT0JBTCIsIFB5SW50X0Zyb21Mb25nKFJUTERfR0xPQkFMKSk7Ci0jZW5kaWYKIAkKIAlQeUV4Y19BcmdFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiY3R5cGVzLkFyZ3VtZW50RXJyb3IiLCBOVUxMLCBOVUxMKTsKIAlpZiAoUHlFeGNfQXJnRXJyb3IpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYwppbmRleCBhNDZmNWU0Li5hZDNiMDQ3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jCkBAIC01MSwyMSArNTEsMjEgQEAKIAkqcHJlc3VsdCA9IGEgKyBiOwogfQogCi1FWFBPUlQoaW50KSBfdGVzdGZ1bmNfaV9iaGlsZmQoY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKK0VYUE9SVChpbnQpIF90ZXN0ZnVuY19pX2JoaWxmZChzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKIHsKIC8vCXByaW50ZigiX3Rlc3RmdW5jX2lfYmhpbGZkIGdvdCAlZCAlZCAlZCAlbGQgJWYgJWZcbiIsCiAvLwkgICAgICAgYiwgaCwgaSwgbCwgZiwgZCk7CiAJcmV0dXJuIChpbnQpKGIgKyBoICsgaSArIGwgKyBmICsgZCk7CiB9CiAKLUVYUE9SVChmbG9hdCkgX3Rlc3RmdW5jX2ZfYmhpbGZkKGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCitFWFBPUlQoZmxvYXQpIF90ZXN0ZnVuY19mX2JoaWxmZChzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKIHsKIC8vCXByaW50ZigiX3Rlc3RmdW5jX2ZfYmhpbGZkIGdvdCAlZCAlZCAlZCAlbGQgJWYgJWZcbiIsCiAvLwkgICAgICAgYiwgaCwgaSwgbCwgZiwgZCk7CiAJcmV0dXJuIChmbG9hdCkoYiArIGggKyBpICsgbCArIGYgKyBkKTsKIH0KIAotRVhQT1JUKGRvdWJsZSkgX3Rlc3RmdW5jX2RfYmhpbGZkKGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCitFWFBPUlQoZG91YmxlKSBfdGVzdGZ1bmNfZF9iaGlsZmQoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCiB7CiAvLwlwcmludGYoIl90ZXN0ZnVuY19kX2JoaWxmZCBnb3QgJWQgJWQgJWQgJWxkICVmICVmXG4iLAogLy8JICAgICAgIGIsIGgsIGksIGwsIGYsIGQpOwpAQCAtNzQsNyArNzQsNyBAQAogCiBFWFBPUlQoY2hhciAqKSBfdGVzdGZ1bmNfcF9wKHZvaWQgKnMpCiB7Ci0JcmV0dXJuIHM7CisJcmV0dXJuIChjaGFyICopczsKIH0KIAogRVhQT1JUKHZvaWQgKikgX3Rlc3RmdW5jX2NfcF9wKGludCAqYXJnY3AsIGNoYXIgKiphcmd2KQpAQCAtODksNyArODksNyBAQAogCiBFWFBPUlQoY2hhciAqKSBteV9zdHJkdXAoY2hhciAqc3JjKQogewotCWNoYXIgKmRzdCA9IG1hbGxvYyhzdHJsZW4oc3JjKSsxKTsKKwljaGFyICpkc3QgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oc3JjKSsxKTsKIAlpZiAoIWRzdCkKIAkJcmV0dXJuIE5VTEw7CiAJc3RyY3B5KGRzdCwgc3JjKTsKQEAgLTk5LDggKzk5LDggQEAKICNpZmRlZiBIQVZFX1dDSEFSX0gKIEVYUE9SVCh3Y2hhcl90ICopIG15X3djc2R1cCh3Y2hhcl90ICpzcmMpCiB7Ci0JaW50IGxlbiA9IHdjc2xlbihzcmMpOwotCXdjaGFyX3QgKnB0ciA9IG1hbGxvYygobGVuICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOworCXNpemVfdCBsZW4gPSB3Y3NsZW4oc3JjKTsKKwl3Y2hhcl90ICpwdHIgPSAod2NoYXJfdCAqKW1hbGxvYygobGVuICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOwogCWlmIChwdHIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJbWVtY3B5KHB0ciwgc3JjLCAobGVuKzEpICogc2l6ZW9mKHdjaGFyX3QpKTsKQEAgLTE1MiwxMyArMTUyLDEzIEBACiB9CiAKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotRVhQT1JUKFBZX0xPTkdfTE9ORykgX3Rlc3RmdW5jX3FfYmhpbGZkcShjaGFyIGIsIHNob3J0IGgsIGludCBpLCBsb25nIGwsIGZsb2F0IGYsCitFWFBPUlQoUFlfTE9OR19MT05HKSBfdGVzdGZ1bmNfcV9iaGlsZmRxKHNpZ25lZCBjaGFyIGIsIHNob3J0IGgsIGludCBpLCBsb25nIGwsIGZsb2F0IGYsCiAJCQkJICAgICBkb3VibGUgZCwgUFlfTE9OR19MT05HIHEpCiB7CiAJcmV0dXJuIChQWV9MT05HX0xPTkcpKGIgKyBoICsgaSArIGwgKyBmICsgZCArIHEpOwogfQogCi1FWFBPUlQoUFlfTE9OR19MT05HKSBfdGVzdGZ1bmNfcV9iaGlsZmQoY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKK0VYUE9SVChQWV9MT05HX0xPTkcpIF90ZXN0ZnVuY19xX2JoaWxmZChzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKIHsKIAlyZXR1cm4gKFBZX0xPTkdfTE9ORykoYiArIGggKyBpICsgbCArIGYgKyBkKTsKIH0KQEAgLTE5MSw3ICsxOTEsNyBAQAogewogCXN0YXRpYyBjaGFyIG1lc3NhZ2VbXSA9ICJIZWxsbywgV29ybGQiOwogCWlmIChwKSB7Ci0JCSpwID0gbWFsbG9jKHNpemVvZihjaGFyICopKTsKKwkJKnAgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikpOwogCQlwcmludGYoIm1hbGxvYyByZXR1cm5lZCAlcFxuIiwgKnApOwogCQkqKnAgPSBtZXNzYWdlOwogCQlyZXR1cm4gMTsKQEAgLTM4NSw3ICszODUsNyBAQAogI2RlZmluZSBTIGxhc3RfdGZfYXJnX3MgPSAoUFlfTE9OR19MT05HKWMKICNkZWZpbmUgVSBsYXN0X3RmX2FyZ191ID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyljCiAKLUVYUE9SVChjaGFyKSB0Zl9iKGNoYXIgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQoc2lnbmVkIGNoYXIpIHRmX2Ioc2lnbmVkIGNoYXIgYykgeyBTOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQodW5zaWduZWQgY2hhcikgdGZfQih1bnNpZ25lZCBjaGFyIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQogRVhQT1JUKHNob3J0KSB0Zl9oKHNob3J0IGMpIHsgUzsgcmV0dXJuIGMvMzsgfQogRVhQT1JUKHVuc2lnbmVkIHNob3J0KSB0Zl9IKHVuc2lnbmVkIHNob3J0IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQpAQCAtMzk5LDcgKzM5OSw3IEBACiBFWFBPUlQoZG91YmxlKSB0Zl9kKGRvdWJsZSBjKSB7IFM7IHJldHVybiBjLzM7IH0KIAogI2lmZGVmIE1TX1dJTjMyCi1FWFBPUlQoY2hhcikgX19zdGRjYWxsIHNfdGZfYihjaGFyIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHNpZ25lZCBjaGFyKSBfX3N0ZGNhbGwgc190Zl9iKHNpZ25lZCBjaGFyIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQogRVhQT1JUKHVuc2lnbmVkIGNoYXIpIF9fc3RkY2FsbCBzX3RmX0IodW5zaWduZWQgY2hhciBjKSB7IFU7IHJldHVybiBjLzM7IH0KIEVYUE9SVChzaG9ydCkgX19zdGRjYWxsIHNfdGZfaChzaG9ydCBjKSB7IFM7IHJldHVybiBjLzM7IH0KIEVYUE9SVCh1bnNpZ25lZCBzaG9ydCkgX19zdGRjYWxsIHNfdGZfSCh1bnNpZ25lZCBzaG9ydCBjKSB7IFU7IHJldHVybiBjLzM7IH0KQEAgLTQxNCwzMyArNDE0LDMzIEBACiAjZW5kaWYKIC8qKioqKioqLwogCi1FWFBPUlQoY2hhcikgdGZfYmIoY2hhciB4LCBjaGFyIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIGNoYXIpIHRmX2JCKGNoYXIgeCwgdW5zaWduZWQgY2hhciBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChzaG9ydCkgdGZfYmgoY2hhciB4LCBzaG9ydCBjKSB7IFM7IHJldHVybiBjLzM7IH0KLUVYUE9SVCh1bnNpZ25lZCBzaG9ydCkgdGZfYkgoY2hhciB4LCB1bnNpZ25lZCBzaG9ydCBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChpbnQpIHRmX2JpKGNoYXIgeCwgaW50IGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIGludCkgdGZfYkkoY2hhciB4LCB1bnNpZ25lZCBpbnQgYykgeyBVOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQobG9uZykgdGZfYmwoY2hhciB4LCBsb25nIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIGxvbmcpIHRmX2JMKGNoYXIgeCwgdW5zaWduZWQgbG9uZyBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChQWV9MT05HX0xPTkcpIHRmX2JxKGNoYXIgeCwgUFlfTE9OR19MT05HIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykgdGZfYlEoY2hhciB4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgYykgeyBVOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQoZmxvYXQpIHRmX2JmKGNoYXIgeCwgZmxvYXQgYykgeyBTOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQoZG91YmxlKSB0Zl9iZChjaGFyIHgsIGRvdWJsZSBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVChzaWduZWQgY2hhcikgdGZfYmIoc2lnbmVkIGNoYXIgeCwgc2lnbmVkIGNoYXIgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgY2hhcikgdGZfYkIoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgY2hhciBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChzaG9ydCkgdGZfYmgoc2lnbmVkIGNoYXIgeCwgc2hvcnQgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgc2hvcnQpIHRmX2JIKHNpZ25lZCBjaGFyIHgsIHVuc2lnbmVkIHNob3J0IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKGludCkgdGZfYmkoc2lnbmVkIGNoYXIgeCwgaW50IGMpIHsgUzsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHVuc2lnbmVkIGludCkgdGZfYkkoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgaW50IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKGxvbmcpIHRmX2JsKHNpZ25lZCBjaGFyIHgsIGxvbmcgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgbG9uZykgdGZfYkwoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgbG9uZyBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChQWV9MT05HX0xPTkcpIHRmX2JxKHNpZ25lZCBjaGFyIHgsIFBZX0xPTkdfTE9ORyBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIHRmX2JRKHNpZ25lZCBjaGFyIHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChmbG9hdCkgdGZfYmYoc2lnbmVkIGNoYXIgeCwgZmxvYXQgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQoZG91YmxlKSB0Zl9iZChzaWduZWQgY2hhciB4LCBkb3VibGUgYykgeyBTOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQodm9pZCkgdHZfaShpbnQgYykgeyBTOyByZXR1cm47IH0KIAogI2lmZGVmIE1TX1dJTjMyCi1FWFBPUlQoY2hhcikgX19zdGRjYWxsIHNfdGZfYmIoY2hhciB4LCBjaGFyIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIGNoYXIpIF9fc3RkY2FsbCBzX3RmX2JCKGNoYXIgeCwgdW5zaWduZWQgY2hhciBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChzaG9ydCkgX19zdGRjYWxsIHNfdGZfYmgoY2hhciB4LCBzaG9ydCBjKSB7IFM7IHJldHVybiBjLzM7IH0KLUVYUE9SVCh1bnNpZ25lZCBzaG9ydCkgX19zdGRjYWxsIHNfdGZfYkgoY2hhciB4LCB1bnNpZ25lZCBzaG9ydCBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChpbnQpIF9fc3RkY2FsbCBzX3RmX2JpKGNoYXIgeCwgaW50IGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIGludCkgX19zdGRjYWxsIHNfdGZfYkkoY2hhciB4LCB1bnNpZ25lZCBpbnQgYykgeyBVOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQobG9uZykgX19zdGRjYWxsIHNfdGZfYmwoY2hhciB4LCBsb25nIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIGxvbmcpIF9fc3RkY2FsbCBzX3RmX2JMKGNoYXIgeCwgdW5zaWduZWQgbG9uZyBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChQWV9MT05HX0xPTkcpIF9fc3RkY2FsbCBzX3RmX2JxKGNoYXIgeCwgUFlfTE9OR19MT05HIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykgX19zdGRjYWxsIHNfdGZfYlEoY2hhciB4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgYykgeyBVOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQoZmxvYXQpIF9fc3RkY2FsbCBzX3RmX2JmKGNoYXIgeCwgZmxvYXQgYykgeyBTOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQoZG91YmxlKSBfX3N0ZGNhbGwgc190Zl9iZChjaGFyIHgsIGRvdWJsZSBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVChzaWduZWQgY2hhcikgX19zdGRjYWxsIHNfdGZfYmIoc2lnbmVkIGNoYXIgeCwgc2lnbmVkIGNoYXIgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgY2hhcikgX19zdGRjYWxsIHNfdGZfYkIoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgY2hhciBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChzaG9ydCkgX19zdGRjYWxsIHNfdGZfYmgoc2lnbmVkIGNoYXIgeCwgc2hvcnQgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgc2hvcnQpIF9fc3RkY2FsbCBzX3RmX2JIKHNpZ25lZCBjaGFyIHgsIHVuc2lnbmVkIHNob3J0IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKGludCkgX19zdGRjYWxsIHNfdGZfYmkoc2lnbmVkIGNoYXIgeCwgaW50IGMpIHsgUzsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHVuc2lnbmVkIGludCkgX19zdGRjYWxsIHNfdGZfYkkoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgaW50IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKGxvbmcpIF9fc3RkY2FsbCBzX3RmX2JsKHNpZ25lZCBjaGFyIHgsIGxvbmcgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgbG9uZykgX19zdGRjYWxsIHNfdGZfYkwoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgbG9uZyBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChQWV9MT05HX0xPTkcpIF9fc3RkY2FsbCBzX3RmX2JxKHNpZ25lZCBjaGFyIHgsIFBZX0xPTkdfTE9ORyBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIF9fc3RkY2FsbCBzX3RmX2JRKHNpZ25lZCBjaGFyIHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChmbG9hdCkgX19zdGRjYWxsIHNfdGZfYmYoc2lnbmVkIGNoYXIgeCwgZmxvYXQgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQoZG91YmxlKSBfX3N0ZGNhbGwgc190Zl9iZChzaWduZWQgY2hhciB4LCBkb3VibGUgYykgeyBTOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQodm9pZCkgX19zdGRjYWxsIHNfdHZfaShpbnQgYykgeyBTOyByZXR1cm47IH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKaW5kZXggMjk0OGQ5OC4uOGMyOWM1NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYwpAQCAtMjY0LDE2ICsyNjQsNiBAQAogCVB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CiB9CiAKLXR5cGVkZWYgc3RydWN0IHsKLQlmZmlfY2xvc3VyZSAqcGNsOyAvKiB0aGUgQyBjYWxsYWJsZSAqLwotCWZmaV9jaWYgY2lmOwotCVB5T2JqZWN0ICpjb252ZXJ0ZXJzOwotCVB5T2JqZWN0ICpjYWxsYWJsZTsKLQlTRVRGVU5DIHNldGZ1bmM7Ci0JZmZpX3R5cGUgKnJlc3R5cGU7Ci0JZmZpX3R5cGUgKmF0eXBlc1swXTsKLX0gZmZpX2luZm87Ci0KIHN0YXRpYyB2b2lkIGNsb3N1cmVfZmNuKGZmaV9jaWYgKmNpZiwKIAkJCXZvaWQgKnJlc3AsCiAJCQl2b2lkICoqYXJncywKQEAgLTI4OSwxNiArMjc5LDEwIEBACiAJCQkgIGFyZ3MpOwogfQogCi12b2lkIEZyZWVDYWxsYmFjayhUSFVOSyB0aHVuaykKLXsKLQlGcmVlQ2xvc3VyZSgoKGZmaV9pbmZvICopdGh1bmspLT5wY2wpOwotCVB5TWVtX0ZyZWUodGh1bmspOwotfQotCi1USFVOSyBBbGxvY0Z1bmN0aW9uQ2FsbGJhY2soUHlPYmplY3QgKmNhbGxhYmxlLAotCQkJICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzLAotCQkJICAgIFB5T2JqZWN0ICpyZXN0eXBlLAotCQkJICAgIGludCBpc19jZGVjbCkKK2ZmaV9pbmZvICpBbGxvY0Z1bmN0aW9uQ2FsbGJhY2soUHlPYmplY3QgKmNhbGxhYmxlLAorCQkJCVB5T2JqZWN0ICpjb252ZXJ0ZXJzLAorCQkJCVB5T2JqZWN0ICpyZXN0eXBlLAorCQkJCWludCBpc19jZGVjbCkKIHsKIAlpbnQgcmVzdWx0OwogCWZmaV9pbmZvICpwOwpAQCAtMzEzLDEzICsyOTcsMTQgQEAKIAl9CiAJcC0+cGNsID0gTWFsbG9jQ2xvc3VyZSgpOwogCWlmIChwLT5wY2wgPT0gTlVMTCkgewotCQlQeU1lbV9GcmVlKHApOwogCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBlcnJvcjsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbkFyZ3M7ICsraSkgewogCQlQeU9iamVjdCAqY252ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGNvbnZlcnRlcnMsIGkpOworCQlpZiAoY252ID09IE5VTEwpCisJCQlnb3RvIGVycm9yOwogCQlwLT5hdHlwZXNbaV0gPSBHZXRUeXBlKGNudik7CiAJCVB5X0RFQ1JFRihjbnYpOwogCX0KQEAgLTMzMCwxMiArMzE1LDEwIEBACiAJCXAtPnJlc3R5cGUgPSAmZmZpX3R5cGVfdm9pZDsKIAl9IGVsc2UgewogCQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QocmVzdHlwZSk7Ci0JCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJCVB5TWVtX0ZyZWUocCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorCQlpZiAoZGljdCA9PSBOVUxMKQorCQkJZ290byBlcnJvcjsKIAkJcC0+c2V0ZnVuYyA9IGRpY3QtPnNldGZ1bmM7Ci0JCXAtPnJlc3R5cGUgPSAmZGljdC0+ZmZpX3R5cGU7CisJCXAtPnJlc3R5cGUgPSAmZGljdC0+ZmZpX3R5cGVfcG9pbnRlcjsKIAl9CiAKIAljYyA9IEZGSV9ERUZBVUxUX0FCSTsKQEAgLTM0OSwyMSArMzMyLDI2IEBACiAJaWYgKHJlc3VsdCAhPSBGRklfT0spIHsKIAkJUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKIAkJCSAgICAgImZmaV9wcmVwX2NpZiBmYWlsZWQgd2l0aCAlZCIsIHJlc3VsdCk7Ci0JCVB5TWVtX0ZyZWUocCk7Ci0JCXJldHVybiBOVUxMOworCQlnb3RvIGVycm9yOwogCX0KIAlyZXN1bHQgPSBmZmlfcHJlcF9jbG9zdXJlKHAtPnBjbCwgJnAtPmNpZiwgY2xvc3VyZV9mY24sIHApOwogCWlmIChyZXN1bHQgIT0gRkZJX09LKSB7CiAJCVB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCiAJCQkgICAgICJmZmlfcHJlcF9jbG9zdXJlIGZhaWxlZCB3aXRoICVkIiwgcmVzdWx0KTsKLQkJUHlNZW1fRnJlZShwKTsKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZXJyb3I7CiAJfQogCiAJcC0+Y29udmVydGVycyA9IGNvbnZlcnRlcnM7CiAJcC0+Y2FsbGFibGUgPSBjYWxsYWJsZTsKKwlyZXR1cm4gcDsKIAotCXJldHVybiAoVEhVTkspcDsKKyAgZXJyb3I6CisJaWYgKHApIHsKKwkJaWYgKHAtPnBjbCkKKwkJCUZyZWVDbG9zdXJlKHAtPnBjbCk7CisJCVB5TWVtX0ZyZWUocCk7CisJfQorCXJldHVybiBOVUxMOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYwppbmRleCA5ZDllMzIyLi44MTYzZjQ5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYwpAQCAtNjQsMTQgKzY0LDE3IEBACiAjZW5kaWYKIAogI2lmZGVmIE1TX1dJTjMyCi0jZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjaW5jbHVkZSA8bWFsbG9jLmg+CiAjZW5kaWYKIAogI2luY2x1ZGUgPGZmaS5oPgogI2luY2x1ZGUgImN0eXBlcy5oIgogCi0jaWZkZWYgX0RFQlVHCi0jZGVmaW5lIERFQlVHX0VYQ0VQVElPTlMgLyogKi8KKyNpZiBkZWZpbmVkKF9ERUJVRykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKy8qIERvbid0IHVzZSBzdHJ1Y3R1cmVkIGV4Y2VwdGlvbiBoYW5kbGluZyBvbiBXaW5kb3dzIGlmIHRoaXMgaXMgZGVmaW5lZC4KKyAgIE1pbmdXLCBBRkFJSywgZG9lc24ndCBzdXBwb3J0IGl0LgorKi8KKyNkZWZpbmUgRE9OVF9VU0VfU0VICiAjZW5kaWYKIAogI2lmZGVmIE1TX1dJTjMyCkBAIC05Niw2ICs5OSw3IEBACiAJcmV0dXJuIGxwTXNnQnVmOwogfQogCisjaWZuZGVmIERPTlRfVVNFX1NFSAogdm9pZCBTZXRFeGNlcHRpb24oRFdPUkQgY29kZSwgRVhDRVBUSU9OX1JFQ09SRCAqcHIpCiB7CiAJVENIQVIgKmxwTXNnQnVmOwpAQCAtMjU0LDYgKzI1OCw3IEBACiAJKnJlY29yZCA9ICpwdHJzLT5FeGNlcHRpb25SZWNvcmQ7CiAJcmV0dXJuIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVI7CiB9CisjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNoZWNrX2hyZXN1bHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQpAQCAtNTc2LDE0ICs1ODEsMTQgQEAKIAkvKiBUaGlzIGxpdHRsZSB0cmljayB3b3JrcyBjb3JyZWN0bHkgd2l0aCBNU1ZDLgogCSAgIEl0IHJldHVybnMgc21hbGwgc3RydWN0dXJlcyBpbiByZWdpc3RlcnMKIAkqLwotCWlmIChkaWN0LT5mZmlfdHlwZS50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkgewotCQlpZiAoZGljdC0+ZmZpX3R5cGUuc2l6ZSA8PSA0KQorCWlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSB7CisJCWlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnNpemUgPD0gNCkKIAkJCXJldHVybiAmZmZpX3R5cGVfc2ludDMyOwotCQllbHNlIGlmIChkaWN0LT5mZmlfdHlwZS5zaXplIDw9IDgpCisJCWVsc2UgaWYgKGRpY3QtPmZmaV90eXBlX3BvaW50ZXIuc2l6ZSA8PSA4KQogCQkJcmV0dXJuICZmZmlfdHlwZV9zaW50NjQ7CiAJfQogI2VuZGlmCi0JcmV0dXJuICZkaWN0LT5mZmlfdHlwZTsKKwlyZXR1cm4gJmRpY3QtPmZmaV90eXBlX3BvaW50ZXI7CiB9CiAKIApAQCAtNjEyLDkgKzYxNywxMSBAQAogCWludCBjYzsKICNpZmRlZiBNU19XSU4zMgogCWludCBkZWx0YTsKKyNpZm5kZWYgRE9OVF9VU0VfU0VICiAJRFdPUkQgZHdFeGNlcHRpb25Db2RlID0gMDsKIAlFWENFUFRJT05fUkVDT1JEIHJlY29yZDsKICNlbmRpZgorI2VuZGlmCiAJLyogWFhYIGNoZWNrIGJlZm9yZSBoZXJlICovCiAJaWYgKHJlc3R5cGUgPT0gTlVMTCkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLApAQCAtNjQwLDE0ICs2NDcsMTQgQEAKIAlpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQogCQlQeV9VTkJMT0NLX1RIUkVBRFMKICNpZmRlZiBNU19XSU4zMgotI2lmbmRlZiBERUJVR19FWENFUFRJT05TCisjaWZuZGVmIERPTlRfVVNFX1NFSAogCV9fdHJ5IHsKICNlbmRpZgogCQlkZWx0YSA9CiAjZW5kaWYKIAkJCWZmaV9jYWxsKCZjaWYsICh2b2lkICopcFByb2MsIHJlc21lbSwgYXZhbHVlcyk7CiAjaWZkZWYgTVNfV0lOMzIKLSNpZm5kZWYgREVCVUdfRVhDRVBUSU9OUworI2lmbmRlZiBET05UX1VTRV9TRUgKIAl9CiAJX19leGNlcHQgKEhhbmRsZUV4Y2VwdGlvbihHZXRFeGNlcHRpb25JbmZvcm1hdGlvbigpLAogCQkJCSAgJmR3RXhjZXB0aW9uQ29kZSwgJnJlY29yZCkpIHsKQEAgLTY1OCwxMCArNjY1LDEyIEBACiAJaWYgKChmbGFncyAmIEZVTkNGTEFHX1BZVEhPTkFQSSkgPT0gMCkKIAkJUHlfQkxPQ0tfVEhSRUFEUwogI2lmZGVmIE1TX1dJTjMyCisjaWZuZGVmIERPTlRfVVNFX1NFSAogCWlmIChkd0V4Y2VwdGlvbkNvZGUpIHsKIAkJU2V0RXhjZXB0aW9uKGR3RXhjZXB0aW9uQ29kZSwgJnJlY29yZCk7CiAJCXJldHVybiAtMTsKIAl9CisjZW5kaWYKIAlpZiAoZGVsdGEgPCAwKSB7CiAJCWlmIChmbGFncyAmIEZVTkNGTEFHX0NERUNMKQogCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCkBAIC03NTgsNiArNzY3LDggQEAKIAlpZiAoY2xzX3N0cikgewogCQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIGNsc19zdHIpOwogCQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIjogIikpOworCQlpZiAocyA9PSBOVUxMKQorCQkJZ290byBlcnJvcjsKIAl9IGVsc2UKIAkJUHlFcnJfQ2xlYXIoKTsKIAltc2dfc3RyID0gUHlPYmplY3RfU3RyKHYpOwpAQCAtNzY2LDEyICs3NzcsMTUgQEAKIAllbHNlIHsKIAkJUHlFcnJfQ2xlYXIoKTsKIAkJUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCI/Pz8iKSk7CisJCWlmIChzID09IE5VTEwpCisJCQlnb3RvIGVycm9yOwogCX0KIAlQeUVycl9TZXRPYmplY3QoZXhjX2NsYXNzLCBzKTsKK2Vycm9yOgogCVB5X1hERUNSRUYodHApOwogCVB5X1hERUNSRUYodik7CiAJUHlfWERFQ1JFRih0Yik7Ci0JUHlfREVDUkVGKHMpOworCVB5X1hERUNSRUYocyk7CiB9CiAKIApAQCAtMTM2Myw3ICsxMzc3LDcgQEAKIGNvbnZlcnRlcihQeU9iamVjdCAqb2JqLCB2b2lkICoqYWRkcmVzcykKIHsKIAkqYWRkcmVzcyA9IFB5TG9uZ19Bc1ZvaWRQdHIob2JqKTsKLQlyZXR1cm4gYWRkcmVzcyAhPSBOVUxMOworCXJldHVybiAqYWRkcmVzcyAhPSBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTQyMyw3MSArMTQzNyw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGNoYXIgY2FzdF9kb2NbXSA9Ci0iY2FzdChjb2JqZWN0LCBjdHlwZSkgLT4gY3R5cGUtaW5zdGFuY2VcblwKLVxuXAotQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGN0eXBlLCBhbmQgY29weSB0aGUgaW50ZXJuYWwgbWVtb3J5IGJ1ZmZlclxuXAotb2YgY29iamVjdCB0byB0aGUgbmV3IGluc3RhbmNlLiAgU2hvdWxkIGJlIHVzZWQgdG8gY2FzdCBvbmUgdHlwZVxuXAotb2YgcG9pbnRlciB0byBhbm90aGVyIHR5cGUgb2YgcG9pbnRlci5cblwKLURvZXNuJ3Qgd29yayBjb3JyZWN0bHkgd2l0aCBjdHlwZXMgaW50ZWdlcnMuXG4iOwotCi1zdGF0aWMgaW50IGNhc3RfY2hlY2tfcG9pbnRlcnR5cGUoUHlPYmplY3QgKmFyZywgUHlPYmplY3QgKipwb2JqKQotewotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0KLQlpZiAoUG9pbnRlclR5cGVPYmplY3RfQ2hlY2soYXJnKSkgewotCQkqcG9iaiA9IGFyZzsKLQkJcmV0dXJuIDE7Ci0JfQotCWRpY3QgPSBQeVR5cGVfc3RnZGljdChhcmcpOwotCWlmIChkaWN0KSB7Ci0JCWlmIChQeVN0cmluZ19DaGVjayhkaWN0LT5wcm90bykKLQkJICAgICYmIChzdHJjaHIoInNQelVaWE8iLCBQeVN0cmluZ19BU19TVFJJTkcoZGljdC0+cHJvdG8pWzBdKSkpIHsKLQkJCS8qIHNpbXBsZSBwb2ludGVyIHR5cGVzLCBjX3ZvaWRfcCwgY193Y2hhcl9wLCBCU1RSLCAuLi4gKi8KLQkJCSpwb2JqID0gYXJnOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JaWYgKFB5VHlwZV9DaGVjayhhcmcpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYXN0KCkgYXJndW1lbnQgMiBtdXN0IGJlIGEgcG9pbnRlciB0eXBlLCBub3QgJXMiLAotCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKWFyZyktPnRwX25hbWUpOwotCX0gZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYXN0KCkgYXJndW1lbnQgMiBtdXN0IGJlIGEgcG9pbnRlciB0eXBlLCBub3QgYSAlcyIsCi0JCQkgICAgIGFyZy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKmNhc3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotCVB5T2JqZWN0ICpvYmosICpjdHlwZTsKLQlzdHJ1Y3QgYXJndW1lbnQgYTsKLQlDRGF0YU9iamVjdCAqcmVzdWx0OwotCi0JLyogV2UgY291bGQgYW5kIHNob3VsZCBhbGxvdyBhcnJheSB0eXBlcyBmb3IgdGhlIHNlY29uZCBhcmd1bWVudAotCSAgIGFsc28sIGJ1dCB3ZSBjYW5ub3QgdXNlIHRoZSBzaW1wbGUgbWVtY3B5IGJlbG93IGZvciB0aGVtLiAqLwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08mOmNhc3QiLCAmb2JqLCAmY2FzdF9jaGVja19wb2ludGVydHlwZSwgJmN0eXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKC0xID09IENvbnZQYXJhbShvYmosIDEsICZhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0ID0gKENEYXRhT2JqZWN0ICopUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjdHlwZSwgTlVMTCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCVB5X1hERUNSRUYoYS5rZWVwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8vIHJlc3VsdC0+Yl9zaXplCi0JLy8gYS5mZmlfdHlwZS0+c2l6ZQotCW1lbWNweShyZXN1bHQtPmJfcHRyLCAmYS52YWx1ZSwKLQkgICAgICAgbWluKHJlc3VsdC0+Yl9zaXplLCAoaW50KWEuZmZpX3R5cGUtPnNpemUpKTsKLQlQeV9YREVDUkVGKGEua2VlcCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKLX0KLQotCiBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewotCXsiY2FzdCIsIGNhc3QsIE1FVEhfVkFSQVJHUywgY2FzdF9kb2N9LAogI2lmZGVmIENUWVBFU19VTklDT0RFCiAJeyJzZXRfY29udmVyc2lvbl9tb2RlIiwgc2V0X2NvbnZlcnNpb25fbW9kZSwgTUVUSF9WQVJBUkdTLCBzZXRfY29udmVyc2lvbl9tb2RlX2RvY30sCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYyBiL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYwppbmRleCAzMzZmMjY1Li43YmVmNDEyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jCkBAIC00OTksNyArNDk5LDcgQEAKIAlsb25nIHZhbDsKIAlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIE5VTEw7Ci0JKihjaGFyICopcHRyID0gKGNoYXIpU0VUKCooY2hhciAqKXB0ciwgKGNoYXIpdmFsLCBzaXplKTsKKwkqKHNpZ25lZCBjaGFyICopcHRyID0gKHNpZ25lZCBjaGFyKVNFVCgqKHNpZ25lZCBjaGFyICopcHRyLCAoc2lnbmVkIGNoYXIpdmFsLCBzaXplKTsKIAlfUkVUKHZhbHVlKTsKIH0KIApAQCAtNTA3LDcgKzUwNyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYl9nZXQodm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCWNoYXIgdmFsID0gKihjaGFyICopcHRyOworCXNpZ25lZCBjaGFyIHZhbCA9ICooc2lnbmVkIGNoYXIgKilwdHI7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CkBAIC01MzYsOSArNTM2LDEyIEBACiBoX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgdW5zaWduZWQgc2l6ZSkKIHsKIAlsb25nIHZhbDsKKwlzaG9ydCB4OwogCWlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQkqKHNob3J0ICopcHRyID0gKHNob3J0KVNFVCgqKHNob3J0ICopcHRyLCAoc2hvcnQpdmFsLCBzaXplKTsKKwltZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKwl4ID0gU0VUKHgsIChzaG9ydCl2YWwsIHNpemUpOworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC01NTAsMjQgKzU1MywyOCBAQAogCXNob3J0IGZpZWxkOwogCWlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQlmaWVsZCA9IFNXQVBfMigqKHNob3J0ICopcHRyKTsKKwltZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworCWZpZWxkID0gU1dBUF8yKGZpZWxkKTsKIAlmaWVsZCA9IFNFVChmaWVsZCwgKHNob3J0KXZhbCwgc2l6ZSk7Ci0JKihzaG9ydCAqKXB0ciA9IFNXQVBfMihmaWVsZCk7CisJZmllbGQgPSBTV0FQXzIoZmllbGQpOworCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBoX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0Jc2hvcnQgdmFsID0gKihzaG9ydCAqKXB0cjsKKwlzaG9ydCB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaF9nZXRfc3codm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCXNob3J0IHZhbCA9ICooc2hvcnQgKilwdHI7CisJc2hvcnQgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKIAl2YWwgPSBTV0FQXzIodmFsKTsKIAlHRVRfQklURklFTEQodmFsLCBzaXplKTsKIAlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKQEAgLTU3NywxMCArNTg0LDEyIEBACiBIX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgdW5zaWduZWQgc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKKwl1bnNpZ25lZCBzaG9ydCB4OwogCWlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIE5VTEw7Ci0JKih1bnNpZ25lZCBzaG9ydCAqKXB0ciA9ICh1bnNpZ25lZCBzaG9ydClTRVQoKih1bnNpZ25lZCBzaG9ydCAqKXB0ciwKLQkJCQkJCSAgICAgKHVuc2lnbmVkIHNob3J0KXZhbCwgc2l6ZSk7CisJbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisJeCA9IFNFVCh4LCAodW5zaWduZWQgc2hvcnQpdmFsLCBzaXplKTsKKwltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKIAlfUkVUKHZhbHVlKTsKIH0KIApAQCAtNTkxLDkgKzYwMCwxMSBAQAogCXVuc2lnbmVkIHNob3J0IGZpZWxkOwogCWlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIE5VTEw7Ci0JZmllbGQgPSBTV0FQXzIoKih1bnNpZ25lZCBzaG9ydCAqKXB0cik7CisJbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKKwlmaWVsZCA9IFNXQVBfMihmaWVsZCk7CiAJZmllbGQgPSBTRVQoZmllbGQsICh1bnNpZ25lZCBzaG9ydCl2YWwsIHNpemUpOwotCSoodW5zaWduZWQgc2hvcnQgKilwdHIgPSBTV0FQXzIoZmllbGQpOworCWZpZWxkID0gU1dBUF8yKGZpZWxkKTsKKwltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC02MDEsNyArNjEyLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBIX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JdW5zaWduZWQgc2hvcnQgdmFsID0gKih1bnNpZ25lZCBzaG9ydCAqKXB0cjsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQpAQCAtNjA5LDcgKzYyMSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogSF9nZXRfc3codm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCXVuc2lnbmVkIHNob3J0IHZhbCA9ICoodW5zaWduZWQgc2hvcnQgKilwdHI7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKIAl2YWwgPSBTV0FQXzIodmFsKTsKIAlHRVRfQklURklFTEQodmFsLCBzaXplKTsKIAlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKQEAgLTYxOSw5ICs2MzIsMTIgQEAKIGlfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKQogewogCWxvbmcgdmFsOworCWludCB4OwogCWlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQkqKGludCAqKXB0ciA9IChpbnQpU0VUKCooaW50ICopcHRyLCAoaW50KXZhbCwgc2l6ZSk7CisJbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisJeCA9IFNFVCh4LCAoaW50KXZhbCwgc2l6ZSk7CisJbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKQEAgLTYzMiw5ICs2NDgsMTEgQEAKIAlpbnQgZmllbGQ7CiAJaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiBOVUxMOwotCWZpZWxkID0gU1dBUF9JTlQoKihpbnQgKilwdHIpOworCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CisJZmllbGQgPSBTV0FQX0lOVChmaWVsZCk7CiAJZmllbGQgPSBTRVQoZmllbGQsIChpbnQpdmFsLCBzaXplKTsKLQkqKGludCAqKXB0ciA9IFNXQVBfSU5UKGZpZWxkKTsKKwlmaWVsZCA9IFNXQVBfSU5UKGZpZWxkKTsKKwltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC02NDIsNyArNjYwLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JaW50IHZhbCA9ICooaW50ICopcHRyOworCWludCB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQpAQCAtNjUwLDcgKzY2OSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaV9nZXRfc3codm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCWludCB2YWwgPSAqKGludCAqKXB0cjsKKwlpbnQgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKIAl2YWwgPSBTV0FQX0lOVCh2YWwpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwpAQCAtNjg0LDkgKzcwNCwxMiBAQAogSV9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIHVuc2lnbmVkIHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CisJdW5zaWduZWQgaW50IHg7CiAJaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gIE5VTEw7Ci0JKih1bnNpZ25lZCBpbnQgKilwdHIgPSAodW5zaWduZWQgaW50KVNFVCgqKHVuc2lnbmVkIGludCAqKXB0ciwgKHVuc2lnbmVkIGludCl2YWwsIHNpemUpOworCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworCXggPSBTRVQoeCwgKHVuc2lnbmVkIGludCl2YWwsIHNpemUpOworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC02OTcsOSArNzIwLDEwIEBACiAJdW5zaWduZWQgaW50IGZpZWxkOwogCWlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuICBOVUxMOwotCWZpZWxkID0gU1dBUF9JTlQoKih1bnNpZ25lZCBpbnQgKilwdHIpOworCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CiAJZmllbGQgPSAodW5zaWduZWQgaW50KVNFVChmaWVsZCwgKHVuc2lnbmVkIGludCl2YWwsIHNpemUpOwotCSoodW5zaWduZWQgaW50ICopcHRyID0gU1dBUF9JTlQoZmllbGQpOworCWZpZWxkID0gU1dBUF9JTlQoZmllbGQpOworCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKQEAgLTcwNyw3ICs3MzEsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIElfZ2V0KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKilwdHI7CisJdW5zaWduZWQgaW50IHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbCk7CiB9CkBAIC03MTUsNyArNzQwLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBJX2dldF9zdyh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JdW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopcHRyOworCXVuc2lnbmVkIGludCB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCXZhbCA9IFNXQVBfSU5UKHZhbCk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbCk7CkBAIC03MjUsOSArNzUxLDEyIEBACiBsX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgdW5zaWduZWQgc2l6ZSkKIHsKIAlsb25nIHZhbDsKKwlsb25nIHg7CiAJaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiBOVUxMOwotCSoobG9uZyAqKXB0ciA9IChsb25nKVNFVCgqKGxvbmcgKilwdHIsIHZhbCwgc2l6ZSk7CisJbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisJeCA9IFNFVCh4LCB2YWwsIHNpemUpOworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC03MzgsOSArNzY3LDExIEBACiAJbG9uZyBmaWVsZDsKIAlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIE5VTEw7Ci0JZmllbGQgPSBTV0FQX0xPTkcoKihsb25nICopcHRyKTsKKwltZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworCWZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKIAlmaWVsZCA9IChsb25nKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKLQkqKGxvbmcgKilwdHIgPSBTV0FQX0xPTkcoZmllbGQpOworCWZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKKwltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC03NDgsNyArNzc5LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JbG9uZyB2YWwgPSAqKGxvbmcgKilwdHI7CisJbG9uZyB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQpAQCAtNzU2LDcgKzc4OCw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbF9nZXRfc3codm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCWxvbmcgdmFsID0gKihsb25nICopcHRyOworCWxvbmcgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKIAl2YWwgPSBTV0FQX0xPTkcodmFsKTsKIAlHRVRfQklURklFTEQodmFsLCBzaXplKTsKIAlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKQEAgLTc2Niw5ICs3OTksMTIgQEAKIExfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgdmFsOworCXVuc2lnbmVkIGxvbmcgeDsKIAlpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiAgTlVMTDsKLQkqKHVuc2lnbmVkIGxvbmcgKilwdHIgPSAodW5zaWduZWQgbG9uZylTRVQoKih1bnNpZ25lZCBsb25nICopcHRyLCB2YWwsIHNpemUpOworCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworCXggPSBTRVQoeCwgdmFsLCBzaXplKTsKKwltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKIAlfUkVUKHZhbHVlKTsKIH0KIApAQCAtNzc5LDkgKzgxNSwxMSBAQAogCXVuc2lnbmVkIGxvbmcgZmllbGQ7CiAJaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gIE5VTEw7Ci0JZmllbGQgPSBTV0FQX0xPTkcoKih1bnNpZ25lZCBsb25nICopcHRyKTsKKwltZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworCWZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKIAlmaWVsZCA9ICh1bnNpZ25lZCBsb25nKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKLQkqKHVuc2lnbmVkIGxvbmcgKilwdHIgPSBTV0FQX0xPTkcoZmllbGQpOworCWZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKKwltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC03ODksNyArODI3LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBMX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWwgPSAqKHVuc2lnbmVkIGxvbmcgKilwdHI7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOwogfQpAQCAtNzk3LDcgKzgzNiw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogTF9nZXRfc3codm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgdmFsID0gKih1bnNpZ25lZCBsb25nICopcHRyOworCXVuc2lnbmVkIGxvbmcgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKIAl2YWwgPSBTV0FQX0xPTkcodmFsKTsKIAlHRVRfQklURklFTEQodmFsLCBzaXplKTsKIAlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodmFsKTsKQEAgLTgwOCw5ICs4NDgsMTIgQEAKIHFfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKQogewogCVBZX0xPTkdfTE9ORyB2YWw7CisJUFlfTE9OR19MT05HIHg7CiAJaWYgKGdldF9sb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQkqKFBZX0xPTkdfTE9ORyAqKXB0ciA9IChQWV9MT05HX0xPTkcpU0VUKCooUFlfTE9OR19MT05HICopcHRyLCB2YWwsIHNpemUpOworCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworCXggPSBTRVQoeCwgdmFsLCBzaXplKTsKKwltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKIAlfUkVUKHZhbHVlKTsKIH0KIApAQCAtODIxLDE2ICs4NjQsMTkgQEAKIAlQWV9MT05HX0xPTkcgZmllbGQ7CiAJaWYgKGdldF9sb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQlmaWVsZCA9IFNXQVBfOCgqKFBZX0xPTkdfTE9ORyAqKXB0cik7CisJbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKKwlmaWVsZCA9IFNXQVBfOChmaWVsZCk7CiAJZmllbGQgPSAoUFlfTE9OR19MT05HKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKLQkqKFBZX0xPTkdfTE9ORyAqKXB0ciA9IFNXQVBfOChmaWVsZCk7CisJZmllbGQgPSBTV0FQXzgoZmllbGQpOworCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBxX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JUFlfTE9OR19MT05HIHZhbCA9ICooUFlfTE9OR19MT05HICopcHRyOworCVBZX0xPTkdfTE9ORyB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbCk7CiB9CkBAIC04MzgsNyArODg0LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBxX2dldF9zdyh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JUFlfTE9OR19MT05HIHZhbCA9ICooUFlfTE9OR19MT05HICopcHRyOworCVBZX0xPTkdfTE9ORyB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCXZhbCA9IFNXQVBfOCh2YWwpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbCk7CkBAIC04NDgsOSArODk1LDEyIEBACiBRX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgdW5zaWduZWQgc2l6ZSkKIHsKIAl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOworCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OwogCWlmIChnZXRfdWxvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiBOVUxMOwotCSoodW5zaWduZWQgUFlfTE9OR19MT05HICopcHRyID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylTRVQoKih1bnNpZ25lZCBQWV9MT05HX0xPTkcgKilwdHIsIHZhbCwgc2l6ZSk7CisJbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisJeCA9IFNFVCh4LCB2YWwsIHNpemUpOworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC04NjEsMTYgKzkxMSwxOSBAQAogCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyBmaWVsZDsKIAlpZiAoZ2V0X3Vsb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQlmaWVsZCA9IFNXQVBfOCgqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqKXB0cik7CisJbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKKwlmaWVsZCA9IFNXQVBfOChmaWVsZCk7CiAJZmllbGQgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKLQkqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqKXB0ciA9IFNXQVBfOChmaWVsZCk7CisJZmllbGQgPSBTV0FQXzgoZmllbGQpOworCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBRX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbCA9ICoodW5zaWduZWQgUFlfTE9OR19MT05HICopcHRyOworCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsKTsKIH0KQEAgLTg3OCw3ICs5MzEsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFFfZ2V0X3N3KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsID0gKih1bnNpZ25lZCBQWV9MT05HX0xPTkcgKilwdHI7CisJdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CiAJdmFsID0gU1dBUF84KHZhbCk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh2YWwpOwpAQCAtOTAzLDE0ICs5NTcsMTYgQEAKIAkJCSAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JKihkb3VibGUgKilwdHIgPSB4OworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoZG91YmxlKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgqKGRvdWJsZSAqKXB0cik7CisJZG91YmxlIHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtOTU3LDE0ICsxMDEzLDE2IEBACiAJCQkgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCSooZmxvYXQgKilwdHIgPSB4OworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogCV9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZl9nZXQodm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKihmbG9hdCAqKXB0cik7CisJZmxvYXQgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKwlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMzE3LDYgKzEzNzUsNyBAQAogCQlpZiAoLTEgPT0gUHlVbmljb2RlX0FzV2lkZUNoYXIoKFB5VW5pY29kZU9iamVjdCAqKXZhbHVlLAogCQkJCQkgICAgICAgYnVmZmVyLCBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpKSkgewogCQkJUHlfREVDUkVGKHZhbHVlKTsKKwkJCVB5X0RFQ1JFRihrZWVwKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCVB5X0RFQ1JFRih2YWx1ZSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmggYi9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKaW5kZXggMTc5ZGNmMS4uNzk4ODU5NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaApAQCAtMiwxNSArMiw2IEBACiAKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQogdHlwZWRlZiBpbnQgUHlfc3NpemVfdDsKLSNkZWZpbmUgbGVuZnVuYyBpbnF1aXJ5Ci0jZGVmaW5lIHJlYWRidWZmZXJwcm9jIGdldHJlYWRidWZmZXJwcm9jCi0jZGVmaW5lIHdyaXRlYnVmZmVycHJvYyBnZXR3cml0ZWJ1ZmZlcnByb2MKLSNkZWZpbmUgc2VnY291bnRwcm9jIGdldHNlZ2NvdW50cHJvYwotI2RlZmluZSBjaGFyYnVmZmVycHJvYyBnZXRjaGFyYnVmZmVycHJvYwotI2RlZmluZSBzc2l6ZWFyZ2Z1bmMgaW50YXJnZnVuYwotI2RlZmluZSBzc2l6ZXNzaXplYXJnZnVuYyBpbnRpbnRhcmdmdW5jCi0jZGVmaW5lIHNzaXplb2JqYXJncHJvYyBpbnRvYmphcmdwcm9jCi0jZGVmaW5lIHNzaXplc3NpemVvYmphcmdwcm9jIGludGludG9iamFyZ3Byb2MKICNlbmRpZgogCiAjaWZuZGVmIE1TX1dJTjMyCkBAIC0zMCw4ICsyMSw5IEBACiAjZGVmaW5lIFBZX0xPTkdfTE9ORyBMT05HX0xPTkcKICNlbmRpZgogCi10eXBlZGVmIGludCAoKlRIVU5LKSh2b2lkKTsKIHR5cGVkZWYgc3RydWN0IHRhZ0NEYXRhT2JqZWN0IENEYXRhT2JqZWN0OwordHlwZWRlZiBQeU9iamVjdCAqKCogR0VURlVOQykodm9pZCAqLCB1bnNpZ25lZCBzaXplKTsKK3R5cGVkZWYgUHlPYmplY3QgKigqIFNFVEZVTkMpKHZvaWQgKiwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKTsKIAogLyogQSBkZWZhdWx0IGJ1ZmZlciBpbiBDRGF0YU9iamVjdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHNtYWxsIEMgdHlwZXMuICBJZgogdGhpcyBidWZmZXIgaXMgdG9vIHNtYWxsLCBQeU1lbV9NYWxsb2Mgd2lsbCBiZSBjYWxsZWQgdG8gY3JlYXRlIGEgbGFyZ2VyIG9uZSwKQEAgLTcyLDYgKzY0LDE2IEBACiB9OwogCiB0eXBlZGVmIHN0cnVjdCB7CisJZmZpX2Nsb3N1cmUgKnBjbDsgLyogdGhlIEMgY2FsbGFibGUgKi8KKwlmZmlfY2lmIGNpZjsKKwlQeU9iamVjdCAqY29udmVydGVyczsKKwlQeU9iamVjdCAqY2FsbGFibGU7CisJU0VURlVOQyBzZXRmdW5jOworCWZmaV90eXBlICpyZXN0eXBlOworCWZmaV90eXBlICphdHlwZXNbMF07Cit9IGZmaV9pbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CiAJLyogRmlyc3QgcGFydCBpZGVudGljYWwgdG8gdGFnQ0RhdGFPYmplY3QgKi8KIAlQeU9iamVjdF9IRUFECiAJY2hhciAqYl9wdHI7CQkvKiBwb2ludGVyIHRvIG1lbW9yeSBibG9jayAqLwpAQCAtODUsNyArODcsNyBAQAogCXVuaW9uIHZhbHVlIGJfdmFsdWU7CiAJLyogZW5kIG9mIHRhZ0NEYXRhT2JqZWN0LCBhZGRpdGlvbmFsIGZpZWxkcyBmb2xsb3cgKi8KIAotCVRIVU5LIHRodW5rOworCWZmaV9pbmZvICp0aHVuazsKIAlQeU9iamVjdCAqY2FsbGFibGU7CiAKIAkvKiBUaGVzZSB0d28gZmllbGRzIHdpbGwgb3ZlcnJpZGUgdGhlIG9uZXMgaW4gdGhlIHR5cGUncyBzdGdkaWN0IGlmCkBAIC0xNTQsMTcgKzE1NiwxMiBAQAogCiBleHRlcm4gdm9pZCBpbml0X2NhbGxiYWNrc19pbl9tb2R1bGUoUHlPYmplY3QgKm0pOwogCi1leHRlcm4gVEhVTksgQWxsb2NGdW5jdGlvbkNhbGxiYWNrKFB5T2JqZWN0ICpjYWxsYWJsZSwKLQkJCQkgICBQeU9iamVjdCAqY29udmVydGVycywKLQkJCQkgICBQeU9iamVjdCAqcmVzdHlwZSwKLQkJCQkgICBpbnQgc3RkY2FsbCk7Ci1leHRlcm4gdm9pZCBGcmVlQ2FsbGJhY2soVEhVTkspOwotCiBleHRlcm4gUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXTsKIAotdHlwZWRlZiBQeU9iamVjdCAqKCogR0VURlVOQykodm9pZCAqLCB1bnNpZ25lZCBzaXplKTsKLXR5cGVkZWYgUHlPYmplY3QgKigqIFNFVEZVTkMpKHZvaWQgKiwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKTsKLQorZXh0ZXJuIGZmaV9pbmZvICpBbGxvY0Z1bmN0aW9uQ2FsbGJhY2soUHlPYmplY3QgKmNhbGxhYmxlLAorCQkJCSAgICAgICBQeU9iamVjdCAqY29udmVydGVycywKKwkJCQkgICAgICAgUHlPYmplY3QgKnJlc3R5cGUsCisJCQkJICAgICAgIGludCBzdGRjYWxsKTsKIC8qIGEgdGFibGUgZW50cnkgZGVzY3JpYmluZyBhIHByZWRlZmluZWQgY3R5cGVzIHR5cGUgKi8KIHN0cnVjdCBmaWVsZGRlc2MgewogCWNoYXIgY29kZTsKQEAgLTIwMSw3ICsxOTgsNyBAQAogCVB5X3NzaXplX3Qgc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzICovCiAJUHlfc3NpemVfdCBhbGlnbjsJLyogYWxpZ25tZW50IHJlcXVpcmVtZW50cyAqLwogCVB5X3NzaXplX3QgbGVuZ3RoOwkvKiBudW1iZXIgb2YgZmllbGRzICovCi0JZmZpX3R5cGUgZmZpX3R5cGU7CisJZmZpX3R5cGUgZmZpX3R5cGVfcG9pbnRlcjsKIAlQeU9iamVjdCAqcHJvdG87CS8qIE9ubHkgZm9yIFBvaW50ZXIvQXJyYXlPYmplY3QgKi8KIAlTRVRGVU5DIHNldGZ1bmM7CS8qIE9ubHkgZm9yIHNpbXBsZSBvYmplY3RzICovCiAJR0VURlVOQyBnZXRmdW5jOwkvKiBPbmx5IGZvciBzaW1wbGUgb2JqZWN0cyAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQppbmRleCAwOTkxYjYzLi5jMWU1Y2Q0IDEwMDc1NQotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQpAQCAtMzQ5MCw2ICszNDkwLDcgQEAKIGkqODYtKi1iZW9zKikgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotZnJlZWJzZCogfCBpKjg2LSota2ZyZWVic2QqLWdudSkgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotbmV0YnNkZWxmKiB8IGkqODYtKi1rbmV0YnNkKi1nbnUpIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OworaSo4Ni0qLW9wZW5ic2QqKSBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi1ydGVtcyopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLXdpbjMyKikgVEFSR0VUPVg4Nl9XSU4zMjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotY3lnd2luKikgVEFSR0VUPVg4Nl9XSU4zMjsgVEFSR0VURElSPXg4Njs7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZS5hYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlLmFjCmluZGV4IDc2YmYxNmUuLmM3ZjA1ZDYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlLmFjCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlLmFjCkBAIC0yOCw2ICsyOCw3IEBACiBpKjg2LSotYmVvcyopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLWZyZWVic2QqIHwgaSo4Ni0qLWtmcmVlYnNkKi1nbnUpIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLW5ldGJzZGVsZiogfCBpKjg2LSota25ldGJzZCotZ251KSBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2OzsKK2kqODYtKi1vcGVuYnNkKikgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotcnRlbXMqKSBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi13aW4zMiopIFRBUkdFVD1YODZfV0lOMzI7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLWN5Z3dpbiopIFRBUkdFVD1YODZfV0lOMzI7IFRBUkdFVERJUj14ODY7OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TCmluZGV4IDc5NTk4MzguLjZkOWEzNjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlMKQEAgLTI0Niw3ICsyNDYsNyBAQAogLyogRU5EKGZmaV9jbG9zdXJlX0FTTSkgICovCiAKIC5kYXRhCi0uc2VjdGlvbiBfX1RFWFQsX19laF9mcmFtZSxjb2FsZXNjZWQsbm9fdG9jK3N0cmlwX3N0YXRpY19zeW1zK2xpdmVfc3VwcG9ydAorLnNlY3Rpb24gX19URVhULF9fZWhfZnJhbWUsY29hbGVzY2VkLG5vX3RvYytzdHJpcF9zdGF0aWNfc3ltcwogRUhfZnJhbWUxOgogCS5zZXQJTCRzZXQkMCxMRUNJRTEtTFNDSUUxCiAJLmxvbmcJTCRzZXQkMAk7IExlbmd0aCBvZiBDb21tb24gSW5mb3JtYXRpb24gRW50cnkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmkuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmkuYwppbmRleCBlNGQ1ZmMzLi43Zjc5MmI3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaS5jCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQogICAgIHsKICAgICBjYXNlIEZGSV9UWVBFX1ZPSUQ6Ci0jaWZuZGVmIFg4Nl9XSU4zMgorI2lmICFkZWZpbmVkKFg4Nl9XSU4zMikgJiYgIWRlZmluZWQoX19PcGVuQlNEX18pICYmICFkZWZpbmVkKF9fRnJlZUJTRF9fKQogICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgogI2VuZGlmCiAgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CkBAIC0xMzUsNyArMTM1LDcgQEAKICAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9TSU5UNjQ7CiAgICAgICBicmVhazsKIAotI2lmZGVmIFg4Nl9XSU4zMgorI2lmIGRlZmluZWQoWDg2X1dJTjMyKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgogICAgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gMSkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYyBiL01vZHVsZXMvX2N0eXBlcy9zdGdkaWN0LmMKaW5kZXggY2IzZDU5OS4uMzM2YmUzNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jCkBAIC0zOCw3ICszOCw3IEBACiBTdGdEaWN0X2RlYWxsb2MoU3RnRGljdE9iamVjdCAqc2VsZikKIHsKIAlTdGdEaWN0X2NsZWFyKHNlbGYpOwotCVB5TWVtX0ZyZWUoc2VsZi0+ZmZpX3R5cGUuZWxlbWVudHMpOworCVB5TWVtX0ZyZWUoc2VsZi0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyk7CiAJUHlEaWN0X1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIApAQCAtNDksOCArNDksOCBAQAogCWludCBzaXplOwogCiAJU3RnRGljdF9jbGVhcihkc3QpOwotCVB5TWVtX0ZyZWUoZHN0LT5mZmlfdHlwZS5lbGVtZW50cyk7Ci0JZHN0LT5mZmlfdHlwZS5lbGVtZW50cyA9IE5VTEw7CisJUHlNZW1fRnJlZShkc3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMpOworCWRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IE5VTEw7CiAKIAlkID0gKGNoYXIgKilkc3Q7CiAJcyA9IChjaGFyICopc3JjOwpAQCAtNjQsMTMgKzY0LDE1IEBACiAJUHlfWElOQ1JFRihkc3QtPnJlc3R5cGUpOwogCVB5X1hJTkNSRUYoZHN0LT5jaGVja2VyKTsKIAotCWlmIChzcmMtPmZmaV90eXBlLmVsZW1lbnRzID09IE5VTEwpCisJaWYgKHNyYy0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAlzaXplID0gc2l6ZW9mKGZmaV90eXBlICopICogKHNyYy0+bGVuZ3RoICsgMSk7Ci0JZHN0LT5mZmlfdHlwZS5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplKTsKLQlpZiAoZHN0LT5mZmlfdHlwZS5lbGVtZW50cyA9PSBOVUxMKQorCWRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplKTsKKwlpZiAoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID09IE5VTEwpCiAJCXJldHVybiAtMTsKLQltZW1jcHkoZHN0LT5mZmlfdHlwZS5lbGVtZW50cywgc3JjLT5mZmlfdHlwZS5lbGVtZW50cywgc2l6ZSk7CisJbWVtY3B5KGRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywKKwkgICAgICAgc3JjLT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAorCSAgICAgICBzaXplKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjM0LDggKzIzNiw4IEBACiAJICAgc3R1ZmYgaXMgc3VjZXNzZnVsbHkgZmluaXNoZWQuICovCiAJc3RnZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7CS8qIHNldCBmaW5hbCAqLwogCi0JaWYgKHN0Z2RpY3QtPmZmaV90eXBlLmVsZW1lbnRzKQotCQlQeU1lbV9GcmVlKHN0Z2RpY3QtPmZmaV90eXBlLmVsZW1lbnRzKTsKKwlpZiAoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cykKKwkJUHlNZW1fRnJlZShzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzKTsKIAogCWJhc2VkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfYmFzZSk7CiAJaWYgKGJhc2VkaWN0ICYmICF1c2VfYnJva2VuX29sZF9jdHlwZXNfc2VtYW50aWNzKSB7CkBAIC0yNDMsMTAgKzI0NSwxMiBAQAogCQlhbGlnbiA9IGJhc2VkaWN0LT5hbGlnbjsKIAkJdW5pb25fc2l6ZSA9IDA7CiAJCXRvdGFsX2FsaWduID0gYWxpZ24gPyBhbGlnbiA6IDE7Ci0JCXN0Z2RpY3QtPmZmaV90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7Ci0JCXN0Z2RpY3QtPmZmaV90eXBlLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoICsgbGVuICsgMSkpOwotCQltZW1zZXQoc3RnZGljdC0+ZmZpX3R5cGUuZWxlbWVudHMsIDAsIHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoICsgbGVuICsgMSkpOwotCQltZW1jcHkoc3RnZGljdC0+ZmZpX3R5cGUuZWxlbWVudHMsIGJhc2VkaWN0LT5mZmlfdHlwZS5lbGVtZW50cywKKwkJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworCQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoICsgbGVuICsgMSkpOworCQltZW1zZXQoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywgMCwKKwkJICAgICAgIHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoICsgbGVuICsgMSkpOworCQltZW1jcHkoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywKKwkJICAgICAgIGJhc2VkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAogCQkgICAgICAgc2l6ZW9mKGZmaV90eXBlICopICogKGJhc2VkaWN0LT5sZW5ndGgpKTsKIAkJZmZpX29mcyA9IGJhc2VkaWN0LT5sZW5ndGg7CiAJfSBlbHNlIHsKQEAgLTI1NSw5ICsyNTksMTAgQEAKIAkJYWxpZ24gPSAwOwogCQl1bmlvbl9zaXplID0gMDsKIAkJdG90YWxfYWxpZ24gPSAxOwotCQlzdGdkaWN0LT5mZmlfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwotCQlzdGdkaWN0LT5mZmlfdHlwZS5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplb2YoZmZpX3R5cGUgKikgKiAobGVuICsgMSkpOwotCQltZW1zZXQoc3RnZGljdC0+ZmZpX3R5cGUuZWxlbWVudHMsIDAsIHNpemVvZihmZmlfdHlwZSAqKSAqIChsZW4gKyAxKSk7CisJCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKwkJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplb2YoZmZpX3R5cGUgKikgKiAobGVuICsgMSkpOworCQltZW1zZXQoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywgMCwKKwkJICAgICAgIHNpemVvZihmZmlfdHlwZSAqKSAqIChsZW4gKyAxKSk7CiAJCWZmaV9vZnMgPSAwOwogCX0KIApAQCAtMjgzLDEwICsyODgsMTAgQEAKIAkJCQkgICAgIGkpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0JCXN0Z2RpY3QtPmZmaV90eXBlLmVsZW1lbnRzW2ZmaV9vZnMgKyBpXSA9ICZkaWN0LT5mZmlfdHlwZTsKKwkJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50c1tmZmlfb2ZzICsgaV0gPSAmZGljdC0+ZmZpX3R5cGVfcG9pbnRlcjsKIAkJZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7IC8qIG1hcmsgZmllbGQgdHlwZSBmaW5hbCAqLwogCQlpZiAoUHlUdXBsZV9TaXplKHBhaXIpID09IDMpIHsgLyogYml0cyBzcGVjaWZpZWQgKi8KLQkJCXN3aXRjaChkaWN0LT5mZmlfdHlwZS50eXBlKSB7CisJCQlzd2l0Y2goZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlKSB7CiAJCQljYXNlIEZGSV9UWVBFX1VJTlQ4OgogCQkJY2FzZSBGRklfVFlQRV9VSU5UMTY6CiAJCQljYXNlIEZGSV9UWVBFX1VJTlQzMjoKQEAgLTM1Nyw4ICszNjIsOCBAQAogCS8qIEFkanVzdCB0aGUgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMgKi8KIAlzaXplID0gKChzaXplICsgdG90YWxfYWxpZ24gLSAxKSAvIHRvdGFsX2FsaWduKSAqIHRvdGFsX2FsaWduOwogCi0Jc3RnZGljdC0+ZmZpX3R5cGUuYWxpZ25tZW50ID0gdG90YWxfYWxpZ247Ci0Jc3RnZGljdC0+ZmZpX3R5cGUuc2l6ZSA9IHNpemU7CisJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5hbGlnbm1lbnQgPSB0b3RhbF9hbGlnbjsKKwlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnNpemUgPSBzaXplOwogCiAJc3RnZGljdC0+c2l6ZSA9IHNpemU7CiAJc3RnZGljdC0+YWxpZ24gPSB0b3RhbF9hbGlnbjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2hvdHNob3QuYyBiL01vZHVsZXMvX2hvdHNob3QuYwppbmRleCBkNWI0Y2RlLi4yZWU0ZWI5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19ob3RzaG90LmMKKysrIGIvTW9kdWxlcy9faG90c2hvdC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaWZuZGVmIEhBVkVfR0VUVElNRU9GREFZCiAjZXJyb3IgIlRoaXMgbW9kdWxlIHJlcXVpcmVzIGdldHRpbWVvZmRheSgpIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcyEiCiAjZW5kaWYKLSNpZiAoZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykpCisjaWYgKGRlZmluZWQoUFlPU19PUzIpICYmIGRlZmluZWQoUFlDQ19HQ0MpKSB8fCBkZWZpbmVkKF9fUU5YX18pCiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNlbHNlCiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CkBAIC0zMDgsNyArMzA4LDcgQEAKICAgICBpZiAoKGVyciA9IHVucGFja19wYWNrZWRfaW50KHNlbGYsICZsZW4sIDApKSkKICAgICAgICAgcmV0dXJuIGVycjsKIAotICAgIGJ1ZiA9IG1hbGxvYyhsZW4pOworICAgIGJ1ZiA9IChjaGFyICopbWFsbG9jKGxlbik7CiAgICAgZm9yIChpPTA7IGkgPCBsZW47IGkrKykgewogICAgICAgICBjaCA9IGZnZXRjKHNlbGYtPmxvZ2ZwKTsKIAlidWZbaV0gPSBjaDsKQEAgLTkxOCw3ICs5MTgsNyBAQAogI2VuZGlmCiAgICAgfQogI2lmIGRlZmluZWQoTVNfV0lORE9XUykgfHwgZGVmaW5lZChQWU9TX09TMikgfHwgXAotICAgIGRlZmluZWQoX19WTVMpCisgICAgZGVmaW5lZChfX1ZNUykgfHwgZGVmaW5lZCAoX19RTlhfXykKICAgICBydXNhZ2VfZGlmZiA9IC0xOwogI2Vsc2UKICAgICB7CkBAIC0xNDAzLDcgKzE0MDMsNyBAQAogICAgICAgICArK3JldjsKICAgICB3aGlsZSAocmV2W2ldICE9ICcgJyAmJiByZXZbaV0gIT0gJ1wwJykKICAgICAgICAgKytpOwotICAgIGJ1ZmZlciA9IG1hbGxvYyhpICsgMSk7CisgICAgYnVmZmVyID0gKGNoYXIgKiltYWxsb2MoaSArIDEpOwogICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewogICAgICAgICBtZW1tb3ZlKGJ1ZmZlciwgcmV2LCBpKTsKICAgICAgICAgYnVmZmVyW2ldID0gJ1wwJzsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2xzcHJvZi5jIGIvTW9kdWxlcy9fbHNwcm9mLmMKaW5kZXggMTdjNzFlOS4uZDY2NWY4MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbHNwcm9mLmMKKysrIGIvTW9kdWxlcy9fbHNwcm9mLmMKQEAgLTUxNSw2ICs1MTUsNyBAQAogCTUKIH07CiAKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CiBzdGF0aWMgUHlUeXBlT2JqZWN0IFN0YXRzRW50cnlUeXBlOwogc3RhdGljIFB5VHlwZU9iamVjdCBTdGF0c1N1YkVudHJ5VHlwZTsKIApAQCAtODU3LDggKzg1OCwxMiBAQAogCQlyZXR1cm47CiAJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlByb2ZpbGVyIiwgKFB5T2JqZWN0ICopJlB5UHJvZmlsZXJfVHlwZSk7CiAKLQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0c0VudHJ5VHlwZSwgJnByb2ZpbGVyX2VudHJ5X2Rlc2MpOwotCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRzU3ViRW50cnlUeXBlLCAmcHJvZmlsZXJfc3ViZW50cnlfZGVzYyk7CisJaWYgKCFpbml0aWFsaXplZCkgeworCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0c0VudHJ5VHlwZSwgCisJCQkJCSAgJnByb2ZpbGVyX2VudHJ5X2Rlc2MpOworCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0c1N1YkVudHJ5VHlwZSwgCisJCQkJCSAgJnByb2ZpbGVyX3N1YmVudHJ5X2Rlc2MpOworCX0KIAlQeV9JTkNSRUYoKFB5T2JqZWN0KikgJlN0YXRzRW50cnlUeXBlKTsKIAlQeV9JTkNSRUYoKFB5T2JqZWN0KikgJlN0YXRzU3ViRW50cnlUeXBlKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAicHJvZmlsZXJfZW50cnkiLApAQCAtODY2LDQgKzg3MSw1IEBACiAJUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgInByb2ZpbGVyX3N1YmVudHJ5IiwKIAkJCSAgIChQeU9iamVjdCopICZTdGF0c1N1YkVudHJ5VHlwZSk7CiAJZW1wdHlfdHVwbGUgPSBQeVR1cGxlX05ldygwKTsKKwlpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvYWRhcHRlcnMuYyBiL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZmRlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvYWRhcHRlcnMuYwpAQCAtMCwwICsxLDQwIEBACisvKiBhZGFwdGVycy5jIC0gZGVmYXVsdCBhZGFwdGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgImFkYXB0ZXJzLmgiCisKKy8qIGR1bW15LCB3aWxsIGJlIGltcGxlbWVudGVkIGluIGEgbGF0ZXIgdmVyc2lvbiAqLworCitQeU9iamVjdCogYWRhcHRfZGF0ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitQeU9iamVjdCogYWRhcHRfZGF0ZXRpbWUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5oIGIvTW9kdWxlcy9fc3FsaXRlL2FkYXB0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlODQ3OQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIGFkYXB0ZXJzLmggLSBkZWZhdWx0IGFkYXB0ZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpZm5kZWYgUFlTUUxJVEVfQURBUFRFUlNfSAorI2RlZmluZSBQWVNRTElURV9BREFQVEVSU19ICisjaW5jbHVkZSAiUHl0aG9uLmgiCisjaW5jbHVkZSAicHl0aHJlYWQuaCIKKyNpbmNsdWRlICJzcWxpdGUzLmgiCisKK1B5T2JqZWN0KiBhZGFwdF9kYXRlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7CitQeU9iamVjdCogYWRhcHRfZGF0ZXRpbWUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuYyBiL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDJlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuYwpAQCAtMCwwICsxLDM2MiBAQAorLyogY2FjaGUgLmMgLSBhIExSVSBjYWNoZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJjYWNoZS5oIgorCisvKiBvbmx5IHVzZWQgaW50ZXJuYWxseSAqLworTm9kZSogbmV3X25vZGUoUHlPYmplY3QqIGtleSwgUHlPYmplY3QqIGRhdGEpCit7CisgICAgTm9kZSogbm9kZTsKKworICAgIG5vZGUgPSAoTm9kZSopIChOb2RlVHlwZS50cF9hbGxvYygmTm9kZVR5cGUsIDApKTsKKyAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfSU5DUkVGKGtleSk7CisgICAgbm9kZS0+a2V5ID0ga2V5OworCisgICAgUHlfSU5DUkVGKGRhdGEpOworICAgIG5vZGUtPmRhdGEgPSBkYXRhOworCisgICAgbm9kZS0+cHJldiA9IE5VTEw7CisgICAgbm9kZS0+bmV4dCA9IE5VTEw7CisKKyAgICByZXR1cm4gbm9kZTsKK30KKwordm9pZCBub2RlX2RlYWxsb2MoTm9kZSogc2VsZikKK3sKKyAgICBQeV9ERUNSRUYoc2VsZi0+a2V5KTsKKyAgICBQeV9ERUNSRUYoc2VsZi0+ZGF0YSk7CisKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKK2ludCBjYWNoZV9pbml0KENhY2hlKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBQeU9iamVjdCogZmFjdG9yeTsKKyAgICBpbnQgc2l6ZSA9IDEwOworCisgICAgc2VsZi0+ZmFjdG9yeSA9IE5VTEw7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aSIsICZmYWN0b3J5LCAmc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gLTE7IAorICAgIH0KKworICAgIGlmIChzaXplIDwgNSkgeworICAgICAgICBzaXplID0gNTsKKyAgICB9CisgICAgc2VsZi0+c2l6ZSA9IHNpemU7CisgICAgc2VsZi0+Zmlyc3QgPSBOVUxMOworICAgIHNlbGYtPmxhc3QgPSBOVUxMOworCisgICAgc2VsZi0+bWFwcGluZyA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIXNlbGYtPm1hcHBpbmcpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFB5X0lOQ1JFRihmYWN0b3J5KTsKKyAgICBzZWxmLT5mYWN0b3J5ID0gZmFjdG9yeTsKKworICAgIHNlbGYtPmRlY3JlZl9mYWN0b3J5ID0gMTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGNhY2hlX2RlYWxsb2MoQ2FjaGUqIHNlbGYpCit7CisgICAgTm9kZSogbm9kZTsKKyAgICBOb2RlKiBkZWxldGVfbm9kZTsKKworICAgIGlmICghc2VsZi0+ZmFjdG9yeSkgeworICAgICAgICAvKiBjb25zdHJ1Y3RvciBmYWlsZWQsIGp1c3QgZ2V0IG91dCBvZiBoZXJlICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBub2RlID0gc2VsZi0+Zmlyc3Q7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgZGVsZXRlX25vZGUgPSBub2RlOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgUHlfREVDUkVGKGRlbGV0ZV9ub2RlKTsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+ZGVjcmVmX2ZhY3RvcnkpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPmZhY3RvcnkpOworICAgIH0KKyAgICBQeV9ERUNSRUYoc2VsZi0+bWFwcGluZyk7CisKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKK1B5T2JqZWN0KiBjYWNoZV9nZXQoQ2FjaGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIFB5T2JqZWN0KiBrZXkgPSBhcmdzOworICAgIE5vZGUqIG5vZGU7CisgICAgTm9kZSogcHRyOworICAgIFB5T2JqZWN0KiBkYXRhOworCisgICAgbm9kZSA9IChOb2RlKilQeURpY3RfR2V0SXRlbShzZWxmLT5tYXBwaW5nLCBrZXkpOworICAgIGlmIChub2RlKSB7CisgICAgICAgIG5vZGUtPmNvdW50Kys7CisgICAgICAgIGlmIChub2RlLT5wcmV2ICYmIG5vZGUtPmNvdW50ID4gbm9kZS0+cHJldi0+Y291bnQpIHsKKyAgICAgICAgICAgIHB0ciA9IG5vZGUtPnByZXY7CisKKyAgICAgICAgICAgIHdoaWxlIChwdHItPnByZXYgJiYgbm9kZS0+Y291bnQgPiBwdHItPnByZXYtPmNvdW50KSB7CisgICAgICAgICAgICAgICAgcHRyID0gcHRyLT5wcmV2OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobm9kZS0+bmV4dCkgeworICAgICAgICAgICAgICAgIG5vZGUtPm5leHQtPnByZXYgPSBub2RlLT5wcmV2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5sYXN0ID0gbm9kZS0+cHJldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChub2RlLT5wcmV2KSB7CisgICAgICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHRyLT5wcmV2KSB7CisgICAgICAgICAgICAgICAgcHRyLT5wcmV2LT5uZXh0ID0gbm9kZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VsZi0+Zmlyc3QgPSBub2RlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBub2RlLT5uZXh0ID0gcHRyOworICAgICAgICAgICAgbm9kZS0+cHJldiA9IHB0ci0+cHJldjsKKyAgICAgICAgICAgIGlmICghbm9kZS0+cHJldikgeworICAgICAgICAgICAgICAgIHNlbGYtPmZpcnN0ID0gbm9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB0ci0+cHJldiA9IG5vZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoUHlEaWN0X1NpemUoc2VsZi0+bWFwcGluZykgPT0gc2VsZi0+c2l6ZSkgeworICAgICAgICAgICAgaWYgKHNlbGYtPmxhc3QpIHsKKyAgICAgICAgICAgICAgICBub2RlID0gc2VsZi0+bGFzdDsKKworICAgICAgICAgICAgICAgIGlmIChQeURpY3RfRGVsSXRlbShzZWxmLT5tYXBwaW5nLCBzZWxmLT5sYXN0LT5rZXkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5vZGUtPnByZXYpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYtPmxhc3QgPSBub2RlLT5wcmV2OworICAgICAgICAgICAgICAgIG5vZGUtPnByZXYgPSBOVUxMOworCisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGF0YSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5mYWN0b3J5LCAiTyIsIGtleSk7CisKKyAgICAgICAgaWYgKCFkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIG5vZGUgPSBuZXdfbm9kZShrZXksIGRhdGEpOworICAgICAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG5vZGUtPnByZXYgPSBzZWxmLT5sYXN0OworCisgICAgICAgIFB5X0RFQ1JFRihkYXRhKTsKKworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+bWFwcGluZywga2V5LCAoUHlPYmplY3QqKW5vZGUpICE9IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihub2RlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYtPmxhc3QpIHsKKyAgICAgICAgICAgIHNlbGYtPmxhc3QtPm5leHQgPSBub2RlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi0+Zmlyc3QgPSBub2RlOworICAgICAgICB9CisgICAgICAgIHNlbGYtPmxhc3QgPSBub2RlOworICAgIH0KKworICAgIFB5X0lOQ1JFRihub2RlLT5kYXRhKTsKKyAgICByZXR1cm4gbm9kZS0+ZGF0YTsKK30KKworUHlPYmplY3QqIGNhY2hlX2Rpc3BsYXkoQ2FjaGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIE5vZGUqIHB0cjsKKyAgICBQeU9iamVjdCogcHJldmtleTsKKyAgICBQeU9iamVjdCogbmV4dGtleTsKKyAgICBQeU9iamVjdCogZm10X2FyZ3M7CisgICAgUHlPYmplY3QqIHRlbXBsYXRlOworICAgIFB5T2JqZWN0KiBkaXNwbGF5X3N0cjsKKworICAgIHB0ciA9IHNlbGYtPmZpcnN0OworCisgICAgd2hpbGUgKHB0cikgeworICAgICAgICBpZiAocHRyLT5wcmV2KSB7CisgICAgICAgICAgICBwcmV2a2V5ID0gcHRyLT5wcmV2LT5rZXk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2a2V5ID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYocHJldmtleSk7CisKKyAgICAgICAgaWYgKHB0ci0+bmV4dCkgeworICAgICAgICAgICAgbmV4dGtleSA9IHB0ci0+bmV4dC0+a2V5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV4dGtleSA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKG5leHRrZXkpOworCisgICAgICAgIGZtdF9hcmdzID0gUHlfQnVpbGRWYWx1ZSgiT09PIiwgcHJldmtleSwgcHRyLT5rZXksIG5leHRrZXkpOworICAgICAgICBpZiAoIWZtdF9hcmdzKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiVzIDwtICVzIC0+JXNcbiIpOworICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBkaXNwbGF5X3N0ciA9IFB5U3RyaW5nX0Zvcm1hdCh0ZW1wbGF0ZSwgZm10X2FyZ3MpOworICAgICAgICBQeV9ERUNSRUYodGVtcGxhdGUpOworICAgICAgICBQeV9ERUNSRUYoZm10X2FyZ3MpOworICAgICAgICBpZiAoIWRpc3BsYXlfc3RyKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeU9iamVjdF9QcmludChkaXNwbGF5X3N0ciwgc3Rkb3V0LCBQeV9QUklOVF9SQVcpOworICAgICAgICBQeV9ERUNSRUYoZGlzcGxheV9zdHIpOworCisgICAgICAgIFB5X0RFQ1JFRihwcmV2a2V5KTsKKyAgICAgICAgUHlfREVDUkVGKG5leHRrZXkpOworCisgICAgICAgIHB0ciA9IHB0ci0+bmV4dDsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBQeU1ldGhvZERlZiBjYWNoZV9tZXRob2RzW10gPSB7CisgICAgeyJnZXQiLCAoUHlDRnVuY3Rpb24pY2FjaGVfZ2V0LCBNRVRIX08sCisgICAgICAgIFB5RG9jX1NUUigiR2V0cyBhbiBlbnRyeSBmcm9tIHRoZSBjYWNoZS4iKX0sCisgICAgeyJkaXNwbGF5IiwgKFB5Q0Z1bmN0aW9uKWNhY2hlX2Rpc3BsYXksIE1FVEhfTk9BUkdTLAorICAgICAgICBQeURvY19TVFIoIkZvciBkZWJ1Z2dpbmcgb25seS4iKX0sCisgICAge05VTEwsIE5VTEx9Cit9OworCitQeVR5cGVPYmplY3QgTm9kZVR5cGUgPSB7CisgICAgICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCisgICAgICAgIE1PRFVMRV9OQU1FICJOb2RlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAgICAgc2l6ZW9mKE5vZGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgICAgIChkZXN0cnVjdG9yKW5vZGVfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAgICAgKGluaXRwcm9jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworfTsKKworUHlUeXBlT2JqZWN0IENhY2hlVHlwZSA9IHsKKyAgICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAgICAgTU9EVUxFX05BTUUgIi5DYWNoZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICAgICBzaXplb2YoQ2FjaGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAgICAgKGRlc3RydWN0b3IpY2FjaGVfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgICAgIGNhY2hlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgICAgICAoaW5pdHByb2MpY2FjaGVfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCit9OworCitleHRlcm4gaW50IGNhY2hlX3NldHVwX3R5cGVzKHZvaWQpCit7CisgICAgaW50IHJjOworCisgICAgTm9kZVR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgQ2FjaGVUeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworCisgICAgcmMgPSBQeVR5cGVfUmVhZHkoJk5vZGVUeXBlKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByYyA9IFB5VHlwZV9SZWFkeSgmQ2FjaGVUeXBlKTsKKyAgICByZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuaCBiL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzE2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuaApAQCAtMCwwICsxLDYxIEBACisvKiBjYWNoZS5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBMUlUgY2FjaGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFBZU1FMSVRFX0NBQ0hFX0gKKyNkZWZpbmUgUFlTUUxJVEVfQ0FDSEVfSAorI2luY2x1ZGUgIlB5dGhvbi5oIgorCit0eXBlZGVmIHN0cnVjdCBfTm9kZQoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCoga2V5OworICAgIFB5T2JqZWN0KiBkYXRhOworICAgIGxvbmcgY291bnQ7CisgICAgc3RydWN0IF9Ob2RlKiBwcmV2OworICAgIHN0cnVjdCBfTm9kZSogbmV4dDsKK30gTm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgaW50IHNpemU7CisgICAgUHlPYmplY3QqIG1hcHBpbmc7CisgICAgUHlPYmplY3QqIGZhY3Rvcnk7CisgICAgTm9kZSogZmlyc3Q7CisgICAgTm9kZSogbGFzdDsKKyAgICBpbnQgZGVjcmVmX2ZhY3Rvcnk7Cit9IENhY2hlOworCitleHRlcm4gUHlUeXBlT2JqZWN0IE5vZGVUeXBlOworZXh0ZXJuIFB5VHlwZU9iamVjdCBDYWNoZVR5cGU7CisKK2ludCBub2RlX2luaXQoTm9kZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOwordm9pZCBub2RlX2RlYWxsb2MoTm9kZSogc2VsZik7CisKK2ludCBjYWNoZV9pbml0KENhY2hlKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7Cit2b2lkIGNhY2hlX2RlYWxsb2MoQ2FjaGUqIHNlbGYpOworUHlPYmplY3QqIGNhY2hlX2dldChDYWNoZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworCitpbnQgY2FjaGVfc2V0dXBfdHlwZXModm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhYWQzNwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKQEAgLTAsMCArMSwxMDgyIEBACisvKiBjb25uZWN0aW9uLmMgLSB0aGUgY29ubmVjdGlvbiB0eXBlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJzdGF0ZW1lbnQuaCIKKyNpbmNsdWRlICJjdXJzb3IuaCIKKyNpbmNsdWRlICJwcmVwYXJlX3Byb3RvY29sLmgiCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgInNxbGl0ZWNvbXBhdC5oIgorCisjaW5jbHVkZSAicHl0aHJlYWQuaCIKKworc3RhdGljIGludCBjb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWwoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCk7CisKK2ludCBjb25uZWN0aW9uX2luaXQoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkYXRhYmFzZSIsICJ0aW1lb3V0IiwgImRldGVjdF90eXBlcyIsICJpc29sYXRpb25fbGV2ZWwiLCAiY2hlY2tfc2FtZV90aHJlYWQiLCAiZmFjdG9yeSIsICJjYWNoZWRfc3RhdGVtZW50cyIsIE5VTEwsIE5VTEx9OworCisgICAgY2hhciogZGF0YWJhc2U7CisgICAgaW50IGRldGVjdF90eXBlcyA9IDA7CisgICAgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCA9IE5VTEw7CisgICAgUHlPYmplY3QqIGZhY3RvcnkgPSBOVUxMOworICAgIGludCBjaGVja19zYW1lX3RocmVhZCA9IDE7CisgICAgaW50IGNhY2hlZF9zdGF0ZW1lbnRzID0gMTAwOworICAgIGRvdWJsZSB0aW1lb3V0ID0gNS4wOworICAgIGludCByYzsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInN8ZGlPaU9pIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhYmFzZSwgJnRpbWVvdXQsICZkZXRlY3RfdHlwZXMsICZpc29sYXRpb25fbGV2ZWwsICZjaGVja19zYW1lX3RocmVhZCwgJmZhY3RvcnksICZjYWNoZWRfc3RhdGVtZW50cykpCisgICAgeworICAgICAgICByZXR1cm4gLTE7IAorICAgIH0KKworICAgIHNlbGYtPmJlZ2luX3N0YXRlbWVudCA9IE5VTEw7CisKKyAgICBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUgPSBOVUxMOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHNlbGYtPnJvd19mYWN0b3J5ID0gUHlfTm9uZTsKKworICAgIFB5X0lOQ1JFRigmUHlVbmljb2RlX1R5cGUpOworICAgIHNlbGYtPnRleHRfZmFjdG9yeSA9IChQeU9iamVjdCopJlB5VW5pY29kZV9UeXBlOworCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gc3FsaXRlM19vcGVuKGRhdGFiYXNlLCAmc2VsZi0+ZGIpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIWlzb2xhdGlvbl9sZXZlbCkgeworICAgICAgICBpc29sYXRpb25fbGV2ZWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoaXNvbGF0aW9uX2xldmVsKTsKKyAgICB9CisgICAgc2VsZi0+aXNvbGF0aW9uX2xldmVsID0gTlVMTDsKKyAgICBjb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWwoc2VsZiwgaXNvbGF0aW9uX2xldmVsKTsKKyAgICBQeV9ERUNSRUYoaXNvbGF0aW9uX2xldmVsKTsKKworICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZSA9IChDYWNoZSopUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopJkNhY2hlVHlwZSwgIk9pIiwgc2VsZiwgY2FjaGVkX3N0YXRlbWVudHMpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBCeSBkZWZhdWx0LCB0aGUgQ2FjaGUgY2xhc3MgSU5DUkVGcyB0aGUgZmFjdG9yeSBpbiBpdHMgaW5pdGlhbGl6ZXIsIGFuZAorICAgICAqIGRlY3JlZnMgaXQgaW4gaXRzIGRlYWxsb2NhdG9yIG1ldGhvZC4gU2luY2UgdGhpcyB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhcgorICAgICAqIHJlZmVyZW5jZSBoZXJlLCB3ZSdyZSBicmVha2luZyBpdCBieSBkZWNyZW1lbnRpbmcgc2VsZiwgYW5kIHRlbGxpbmcgdGhlCisgICAgICogY2FjaGUgY2xhc3MgdG8gbm90IGRlY3JlZiB0aGUgZmFjdG9yeSAoc2VsZikgaW4gaXRzIGRlYWxsb2NhdG9yLgorICAgICAqLworICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZS0+ZGVjcmVmX2ZhY3RvcnkgPSAwOworICAgIFB5X0RFQ1JFRihzZWxmKTsKKworICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAwOworICAgIHNlbGYtPmRldGVjdF90eXBlcyA9IGRldGVjdF90eXBlczsKKyAgICBzZWxmLT50aW1lb3V0ID0gdGltZW91dDsKKyAgICAodm9pZClzcWxpdGUzX2J1c3lfdGltZW91dChzZWxmLT5kYiwgKGludCkodGltZW91dCoxMDAwKSk7CisKKyAgICBzZWxmLT50aHJlYWRfaWRlbnQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CisgICAgc2VsZi0+Y2hlY2tfc2FtZV90aHJlYWQgPSBjaGVja19zYW1lX3RocmVhZDsKKworICAgIHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkID0gUHlEaWN0X05ldygpOworICAgIGlmICghc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHNlbGYtPmNvbGxhdGlvbnMgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFzZWxmLT5jb2xsYXRpb25zKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzZWxmLT5XYXJuaW5nID0gV2FybmluZzsKKyAgICBzZWxmLT5FcnJvciA9IEVycm9yOworICAgIHNlbGYtPkludGVyZmFjZUVycm9yID0gSW50ZXJmYWNlRXJyb3I7CisgICAgc2VsZi0+RGF0YWJhc2VFcnJvciA9IERhdGFiYXNlRXJyb3I7CisgICAgc2VsZi0+RGF0YUVycm9yID0gRGF0YUVycm9yOworICAgIHNlbGYtPk9wZXJhdGlvbmFsRXJyb3IgPSBPcGVyYXRpb25hbEVycm9yOworICAgIHNlbGYtPkludGVncml0eUVycm9yID0gSW50ZWdyaXR5RXJyb3I7CisgICAgc2VsZi0+SW50ZXJuYWxFcnJvciA9IEludGVybmFsRXJyb3I7CisgICAgc2VsZi0+UHJvZ3JhbW1pbmdFcnJvciA9IFByb2dyYW1taW5nRXJyb3I7CisgICAgc2VsZi0+Tm90U3VwcG9ydGVkRXJyb3IgPSBOb3RTdXBwb3J0ZWRFcnJvcjsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZsdXNoX3N0YXRlbWVudF9jYWNoZShDb25uZWN0aW9uKiBzZWxmKQoreworICAgIE5vZGUqIG5vZGU7CisgICAgU3RhdGVtZW50KiBzdGF0ZW1lbnQ7CisKKyAgICBub2RlID0gc2VsZi0+c3RhdGVtZW50X2NhY2hlLT5maXJzdDsKKworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIHN0YXRlbWVudCA9IChTdGF0ZW1lbnQqKShub2RlLT5kYXRhKTsKKyAgICAgICAgKHZvaWQpc3RhdGVtZW50X2ZpbmFsaXplKHN0YXRlbWVudCk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKworICAgIFB5X0RFQ1JFRihzZWxmLT5zdGF0ZW1lbnRfY2FjaGUpOworICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZSA9IChDYWNoZSopUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopJkNhY2hlVHlwZSwgIk8iLCBzZWxmKTsKKyAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgc2VsZi0+c3RhdGVtZW50X2NhY2hlLT5kZWNyZWZfZmFjdG9yeSA9IDA7Cit9CisKK3ZvaWQgcmVzZXRfYWxsX3N0YXRlbWVudHMoQ29ubmVjdGlvbiogc2VsZikKK3sKKyAgICBOb2RlKiBub2RlOworICAgIFN0YXRlbWVudCogc3RhdGVtZW50OworCisgICAgbm9kZSA9IHNlbGYtPnN0YXRlbWVudF9jYWNoZS0+Zmlyc3Q7CisKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50Kikobm9kZS0+ZGF0YSk7CisgICAgICAgICh2b2lkKXN0YXRlbWVudF9yZXNldChzdGF0ZW1lbnQpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKK3ZvaWQgY29ubmVjdGlvbl9kZWFsbG9jKENvbm5lY3Rpb24qIHNlbGYpCit7CisgICAgUHlfWERFQ1JFRihzZWxmLT5zdGF0ZW1lbnRfY2FjaGUpOworCisgICAgLyogQ2xlYW4gdXAgaWYgdXNlciBoYXMgbm90IGNhbGxlZCAuY2xvc2UoKSBleHBsaWNpdGx5LiAqLworICAgIGlmIChzZWxmLT5kYikgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHNxbGl0ZTNfY2xvc2Uoc2VsZi0+ZGIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKworICAgIGlmIChzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpIHsKKyAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpOworICAgIH0KKyAgICBQeV9YREVDUkVGKHNlbGYtPmlzb2xhdGlvbl9sZXZlbCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5yb3dfZmFjdG9yeSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT50ZXh0X2ZhY3RvcnkpOworICAgIFB5X1hERUNSRUYoc2VsZi0+Y29sbGF0aW9ucyk7CisKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2N1cnNvcihDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZhY3RvcnkiLCBOVUxMLCBOVUxMfTsKKyAgICBQeU9iamVjdCogZmFjdG9yeSA9IE5VTEw7CisgICAgUHlPYmplY3QqIGN1cnNvcjsKKworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE8iLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY3RvcnkpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFjaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChmYWN0b3J5ID09IE5VTEwpIHsKKyAgICAgICAgZmFjdG9yeSA9IChQeU9iamVjdCopJkN1cnNvclR5cGU7CisgICAgfQorCisgICAgY3Vyc29yID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZhY3RvcnksICJPIiwgc2VsZik7CisKKyAgICBpZiAoY3Vyc29yICYmIHNlbGYtPnJvd19mYWN0b3J5ICE9IFB5X05vbmUpIHsKKyAgICAgICAgUHlfWERFQ1JFRigoKEN1cnNvciopY3Vyc29yKS0+cm93X2ZhY3RvcnkpOworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+cm93X2ZhY3RvcnkpOworICAgICAgICAoKEN1cnNvciopY3Vyc29yKS0+cm93X2ZhY3RvcnkgPSBzZWxmLT5yb3dfZmFjdG9yeTsKKyAgICB9CisKKyAgICByZXR1cm4gY3Vyc29yOworfQorCitQeU9iamVjdCogY29ubmVjdGlvbl9jbG9zZShDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmbHVzaF9zdGF0ZW1lbnRfY2FjaGUoc2VsZik7CisKKyAgICBpZiAoc2VsZi0+ZGIpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByYyA9IHNxbGl0ZTNfY2xvc2Uoc2VsZi0+ZGIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYtPmRiID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworLyoKKyAqIENoZWNrcyBpZiBhIGNvbm5lY3Rpb24gb2JqZWN0IGlzIHVzYWJsZSAoaS4gZS4gbm90IGNsb3NlZCkuCisgKgorICogMCA9PiBlcnJvcjsgMSA9PiBvaworICovCitpbnQgY2hlY2tfY29ubmVjdGlvbihDb25uZWN0aW9uKiBjb24pCit7CisgICAgaWYgKCFjb24tPmRiKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQcm9ncmFtbWluZ0Vycm9yLCAiQ2Fubm90IG9wZXJhdGUgb24gYSBjbG9zZWQgZGF0YWJhc2UuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworUHlPYmplY3QqIF9jb25uZWN0aW9uX2JlZ2luKENvbm5lY3Rpb24qIHNlbGYpCit7CisgICAgaW50IHJjOworICAgIGNvbnN0IGNoYXIqIHRhaWw7CisgICAgc3FsaXRlM19zdG10KiBzdGF0ZW1lbnQ7CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoc2VsZi0+ZGIsIHNlbGYtPmJlZ2luX3N0YXRlbWVudCwgLTEsICZzdGF0ZW1lbnQsICZ0YWlsKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc3RhdGVtZW50LCBzZWxmKTsKKyAgICBpZiAocmMgPT0gU1FMSVRFX0RPTkUpIHsKKyAgICAgICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICB9CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIGlmIChyYyAhPSBTUUxJVEVfT0sgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICB9CisKK2Vycm9yOgorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorfQorCitQeU9iamVjdCogY29ubmVjdGlvbl9jb21taXQoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgaW50IHJjOworICAgIGNvbnN0IGNoYXIqIHRhaWw7CisgICAgc3FsaXRlM19zdG10KiBzdGF0ZW1lbnQ7CisKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmKSB8fCAhY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+aW5UcmFuc2FjdGlvbikgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmRiLCAiQ09NTUlUIiwgLTEsICZzdGF0ZW1lbnQsICZ0YWlsKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICByYyA9IF9zcWxpdGVfc3RlcF93aXRoX2J1c3loYW5kbGVyKHN0YXRlbWVudCwgc2VsZik7CisgICAgICAgIGlmIChyYyA9PSBTUUxJVEVfRE9ORSkgeworICAgICAgICAgICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICB9CisKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgfQorCisgICAgfQorCitlcnJvcjoKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KK30KKworUHlPYmplY3QqIGNvbm5lY3Rpb25fcm9sbGJhY2soQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgaW50IHJjOworICAgIGNvbnN0IGNoYXIqIHRhaWw7CisgICAgc3FsaXRlM19zdG10KiBzdGF0ZW1lbnQ7CisKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmKSB8fCAhY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+aW5UcmFuc2FjdGlvbikgeworICAgICAgICByZXNldF9hbGxfc3RhdGVtZW50cyhzZWxmKTsKKworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmRiLCAiUk9MTEJBQ0siLCAtMSwgJnN0YXRlbWVudCwgJnRhaWwpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc3RhdGVtZW50LCBzZWxmKTsKKyAgICAgICAgaWYgKHJjID09IFNRTElURV9ET05FKSB7CisgICAgICAgICAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIH0KKworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJjID0gc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICB9CisKKyAgICB9CisKK2Vycm9yOgorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorfQorCit2b2lkIF9zZXRfcmVzdWx0KHNxbGl0ZTNfY29udGV4dCogY29udGV4dCwgUHlPYmplY3QqIHB5X3ZhbCkKK3sKKyAgICBsb25nIGxvbmd2YWw7CisgICAgY29uc3QgY2hhciogYnVmZmVyOworICAgIFB5X3NzaXplX3QgYnVmbGVuOworICAgIFB5T2JqZWN0KiBzdHJpbmd2YWw7CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAvKiBFcnJvcnMgaW4gY2FsbGJhY2tzIGFyZSBpZ25vcmVkLCBhbmQgd2UgcmV0dXJuIE5VTEwgKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgc3FsaXRlM19yZXN1bHRfbnVsbChjb250ZXh0KTsKKyAgICB9IGVsc2UgaWYgKHB5X3ZhbCA9PSBQeV9Ob25lKSB7CisgICAgICAgIHNxbGl0ZTNfcmVzdWx0X251bGwoY29udGV4dCk7CisgICAgfSBlbHNlIGlmIChQeUludF9DaGVjayhweV92YWwpKSB7CisgICAgICAgIGxvbmd2YWwgPSBQeUludF9Bc0xvbmcocHlfdmFsKTsKKyAgICAgICAgLyogVE9ETzogaW52ZXN0aWdhdGUgd2hhdCB0byBkbyB3aXRoIHJhbmdlIG92ZXJmbG93cyAtIGxvbmcgdnMuIGxvbmcgbG9uZyAqLworICAgICAgICBzcWxpdGUzX3Jlc3VsdF9pbnQ2NChjb250ZXh0LCAoUFlfTE9OR19MT05HKWxvbmd2YWwpOworICAgIH0gZWxzZSBpZiAoUHlGbG9hdF9DaGVjayhweV92YWwpKSB7CisgICAgICAgIHNxbGl0ZTNfcmVzdWx0X2RvdWJsZShjb250ZXh0LCBQeUZsb2F0X0FzRG91YmxlKHB5X3ZhbCkpOworICAgIH0gZWxzZSBpZiAoUHlCdWZmZXJfQ2hlY2socHlfdmFsKSkgeworICAgICAgICBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHB5X3ZhbCwgJmJ1ZmZlciwgJmJ1ZmxlbikgIT0gMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJjb3VsZCBub3QgY29udmVydCBCTE9CIHRvIGJ1ZmZlciIpOworICAgICAgICB9CisgICAgICAgIHNxbGl0ZTNfcmVzdWx0X2Jsb2IoY29udGV4dCwgYnVmZmVyLCBidWZsZW4sIFNRTElURV9UUkFOU0lFTlQpOworICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socHlfdmFsKSkgeworICAgICAgICBzcWxpdGUzX3Jlc3VsdF90ZXh0KGNvbnRleHQsIFB5U3RyaW5nX0FzU3RyaW5nKHB5X3ZhbCksIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhweV92YWwpKSB7CisgICAgICAgIHN0cmluZ3ZhbCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcocHlfdmFsKTsKKyAgICAgICAgc3FsaXRlM19yZXN1bHRfdGV4dChjb250ZXh0LCBQeVN0cmluZ19Bc1N0cmluZyhzdHJpbmd2YWwpLCAtMSwgU1FMSVRFX1RSQU5TSUVOVCk7CisgICAgICAgIFB5X0RFQ1JFRihzdHJpbmd2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRPRE86IHJhaXNlIGVycm9yICovCisgICAgfQorfQorCitQeU9iamVjdCogX2J1aWxkX3B5X3BhcmFtcyhzcWxpdGUzX2NvbnRleHQgKmNvbnRleHQsIGludCBhcmdjLCBzcWxpdGUzX3ZhbHVlKiogYXJndikKK3sKKyAgICBQeU9iamVjdCogYXJnczsKKyAgICBpbnQgaTsKKyAgICBzcWxpdGUzX3ZhbHVlKiBjdXJfdmFsdWU7CisgICAgUHlPYmplY3QqIGN1cl9weV92YWx1ZTsKKyAgICBjb25zdCBjaGFyKiB2YWxfc3RyOworICAgIFBZX0xPTkdfTE9ORyB2YWxfaW50OworICAgIFB5X3NzaXplX3QgYnVmbGVuOworICAgIHZvaWQqIHJhd19idWZmZXI7CisKKyAgICBhcmdzID0gUHlUdXBsZV9OZXcoYXJnYyk7CisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgY3VyX3ZhbHVlID0gYXJndltpXTsKKyAgICAgICAgc3dpdGNoIChzcWxpdGUzX3ZhbHVlX3R5cGUoYXJndltpXSkpIHsKKyAgICAgICAgICAgIGNhc2UgU1FMSVRFX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgdmFsX2ludCA9IHNxbGl0ZTNfdmFsdWVfaW50NjQoY3VyX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeUludF9Gcm9tTG9uZygobG9uZyl2YWxfaW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1FMSVRFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IFB5RmxvYXRfRnJvbURvdWJsZShzcWxpdGUzX3ZhbHVlX2RvdWJsZShjdXJfdmFsdWUpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1FMSVRFX1RFWFQ6CisgICAgICAgICAgICAgICAgdmFsX3N0ciA9IChjb25zdCBjaGFyKilzcWxpdGUzX3ZhbHVlX3RleHQoY3VyX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOCh2YWxfc3RyLCBzdHJsZW4odmFsX3N0ciksIE5VTEwpOworICAgICAgICAgICAgICAgIC8qIFRPRE86IGhhdmUgYSB3YXkgdG8gc2hvdyBlcnJvcnMgaGVyZSAqLworICAgICAgICAgICAgICAgIGlmICghY3VyX3B5X3ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNRTElURV9CTE9COgorICAgICAgICAgICAgICAgIGJ1ZmxlbiA9IHNxbGl0ZTNfdmFsdWVfYnl0ZXMoY3VyX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeUJ1ZmZlcl9OZXcoYnVmbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoIWN1cl9weV92YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBlcnJvciAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihjdXJfcHlfdmFsdWUsICZyYXdfYnVmZmVyLCAmYnVmbGVuKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBlcnJvciAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkocmF3X2J1ZmZlciwgc3FsaXRlM192YWx1ZV9ibG9iKGN1cl92YWx1ZSksIGJ1Zmxlbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNRTElURV9OVUxMOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgaSwgY3VyX3B5X3ZhbHVlKTsKKworICAgIH0KKworICAgIHJldHVybiBhcmdzOworfQorCit2b2lkIF9mdW5jX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCogY29udGV4dCwgaW50IGFyZ2MsIHNxbGl0ZTNfdmFsdWUqKiBhcmd2KQoreworICAgIFB5T2JqZWN0KiBhcmdzOworICAgIFB5T2JqZWN0KiBweV9mdW5jOworICAgIFB5T2JqZWN0KiBweV9yZXR2YWw7CisKKworICAgIFB5R0lMU3RhdGVfU1RBVEUgdGhyZWFkc3RhdGU7CisKKyAgICB0aHJlYWRzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisKKyAgICBweV9mdW5jID0gKFB5T2JqZWN0KilzcWxpdGUzX3VzZXJfZGF0YShjb250ZXh0KTsKKworICAgIGFyZ3MgPSBfYnVpbGRfcHlfcGFyYW1zKGNvbnRleHQsIGFyZ2MsIGFyZ3YpOworCisgICAgcHlfcmV0dmFsID0gUHlPYmplY3RfQ2FsbE9iamVjdChweV9mdW5jLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisKKyAgICBfc2V0X3Jlc3VsdChjb250ZXh0LCBweV9yZXR2YWwpOworICAgIFB5X1hERUNSRUYocHlfcmV0dmFsKTsKKworICAgIFB5R0lMU3RhdGVfUmVsZWFzZSh0aHJlYWRzdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9zdGVwX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCAqY29udGV4dCwgaW50IGFyZ2MsIHNxbGl0ZTNfdmFsdWUqKiBwYXJhbXMpCit7CisgICAgUHlPYmplY3QqIGFyZ3M7CisgICAgUHlPYmplY3QqIGZ1bmN0aW9uX3Jlc3VsdDsKKyAgICBQeU9iamVjdCogYWdncmVnYXRlX2NsYXNzOworICAgIFB5T2JqZWN0KiogYWdncmVnYXRlX2luc3RhbmNlOworICAgIFB5T2JqZWN0KiBzdGVwbWV0aG9kOworCisgICAgUHlHSUxTdGF0ZV9TVEFURSB0aHJlYWRzdGF0ZTsKKworICAgIHRocmVhZHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKworICAgIGFnZ3JlZ2F0ZV9jbGFzcyA9IChQeU9iamVjdCopc3FsaXRlM191c2VyX2RhdGEoY29udGV4dCk7CisKKyAgICBhZ2dyZWdhdGVfaW5zdGFuY2UgPSAoUHlPYmplY3QqKilzcWxpdGUzX2FnZ3JlZ2F0ZV9jb250ZXh0KGNvbnRleHQsIHNpemVvZihQeU9iamVjdCopKTsKKworICAgIGlmICgqYWdncmVnYXRlX2luc3RhbmNlID09IDApIHsKKyAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihhZ2dyZWdhdGVfY2xhc3MsICIiKTsKKworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICphZ2dyZWdhdGVfaW5zdGFuY2UgPSAwOworICAgICAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZXBtZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKCphZ2dyZWdhdGVfaW5zdGFuY2UsICJzdGVwIik7CisgICAgaWYgKCFzdGVwbWV0aG9kKQorICAgIHsKKyAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFyZ3MgPSBfYnVpbGRfcHlfcGFyYW1zKGNvbnRleHQsIGFyZ2MsIHBhcmFtcyk7CisKKyAgICBmdW5jdGlvbl9yZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHN0ZXBtZXRob2QsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYoc3RlcG1ldGhvZCk7CisKKyAgICBpZiAoZnVuY3Rpb25fcmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9ERUNSRUYoZnVuY3Rpb25fcmVzdWx0KTsKKyAgICB9CisKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOworfQorCit2b2lkIF9maW5hbF9jYWxsYmFjayhzcWxpdGUzX2NvbnRleHQqIGNvbnRleHQpCit7CisgICAgUHlPYmplY3QqIGFyZ3M7CisgICAgUHlPYmplY3QqIGZ1bmN0aW9uX3Jlc3VsdDsKKyAgICBQeU9iamVjdCoqIGFnZ3JlZ2F0ZV9pbnN0YW5jZTsKKyAgICBQeU9iamVjdCogYWdncmVnYXRlX2NsYXNzOworICAgIFB5T2JqZWN0KiBmaW5hbGl6ZW1ldGhvZDsKKworICAgIFB5R0lMU3RhdGVfU1RBVEUgdGhyZWFkc3RhdGU7CisKKyAgICB0aHJlYWRzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisKKyAgICBhZ2dyZWdhdGVfY2xhc3MgPSAoUHlPYmplY3QqKXNxbGl0ZTNfdXNlcl9kYXRhKGNvbnRleHQpOworCisgICAgYWdncmVnYXRlX2luc3RhbmNlID0gKFB5T2JqZWN0Kiopc3FsaXRlM19hZ2dyZWdhdGVfY29udGV4dChjb250ZXh0LCBzaXplb2YoUHlPYmplY3QqKSk7CisgICAgaWYgKCEqYWdncmVnYXRlX2luc3RhbmNlKSB7CisgICAgICAgIC8qIHRoaXMgYnJhbmNoIGlzIGV4ZWN1dGVkIGlmIHRoZXJlIHdhcyBhbiBleGNlcHRpb24gaW4gdGhlIGFnZ3JlZ2F0ZSdzCisgICAgICAgICAqIF9faW5pdF9fICovCisKKyAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZpbmFsaXplbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygqYWdncmVnYXRlX2luc3RhbmNlLCAiZmluYWxpemUiKTsKKworICAgIGlmICghZmluYWxpemVtZXRob2QpIHsKKyAgICAgICAgLyoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFByb2dyYW1taW5nRXJyb3IsICJmaW5hbGl6ZSBtZXRob2QgbWlzc2luZyIpOworICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIGZ1bmN0aW9uX3Jlc3VsdCA9IFB5X05vbmU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICBpZiAoIWFyZ3MpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBmdW5jdGlvbl9yZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGZpbmFsaXplbWV0aG9kLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoZmluYWxpemVtZXRob2QpOworICAgIH0KKworICAgIF9zZXRfcmVzdWx0KGNvbnRleHQsIGZ1bmN0aW9uX3Jlc3VsdCk7CisgICAgUHlfWERFQ1JFRigqYWdncmVnYXRlX2luc3RhbmNlKTsKKyAgICBQeV9YREVDUkVGKGZ1bmN0aW9uX3Jlc3VsdCk7CisKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOworfQorCisKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2NyZWF0ZV9mdW5jdGlvbihDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAibmFyZyIsICJmdW5jIiwgTlVMTCwgTlVMTH07CisKKyAgICBQeU9iamVjdCogZnVuYzsKKyAgICBjaGFyKiBuYW1lOworICAgIGludCBuYXJnOworICAgIGludCByYzsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInNpTyIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwgJm5hcmcsICZmdW5jKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJjID0gc3FsaXRlM19jcmVhdGVfZnVuY3Rpb24oc2VsZi0+ZGIsIG5hbWUsIG5hcmcsIFNRTElURV9VVEY4LCAodm9pZCopZnVuYywgX2Z1bmNfY2FsbGJhY2ssIE5VTEwsIE5VTEwpOworCisgICAgUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGZ1bmMsIFB5X05vbmUpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitQeU9iamVjdCogY29ubmVjdGlvbl9jcmVhdGVfYWdncmVnYXRlKENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIFB5T2JqZWN0KiBhZ2dyZWdhdGVfY2xhc3M7CisKKyAgICBpbnQgbl9hcmc7CisgICAgY2hhciogbmFtZTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ICJuYW1lIiwgIm5fYXJnIiwgImFnZ3JlZ2F0ZV9jbGFzcyIsIE5VTEwgfTsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzaU86Y3JlYXRlX2FnZ3JlZ2F0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm5hbWUsICZuX2FyZywgJmFnZ3JlZ2F0ZV9jbGFzcykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmMgPSBzcWxpdGUzX2NyZWF0ZV9mdW5jdGlvbihzZWxmLT5kYiwgbmFtZSwgbl9hcmcsIFNRTElURV9VVEY4LCAodm9pZCopYWdncmVnYXRlX2NsYXNzLCAwLCAmX3N0ZXBfY2FsbGJhY2ssICZfZmluYWxfY2FsbGJhY2spOworICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGFnZ3JlZ2F0ZV9jbGFzcywgUHlfTm9uZSk7CisKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9Cit9CisKK2ludCBjaGVja190aHJlYWQoQ29ubmVjdGlvbiogc2VsZikKK3sKKyAgICBpZiAoc2VsZi0+Y2hlY2tfc2FtZV90aHJlYWQpIHsKKyAgICAgICAgaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBzZWxmLT50aHJlYWRfaWRlbnQpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQcm9ncmFtbWluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNRTGl0ZSBvYmplY3RzIGNyZWF0ZWQgaW4gYSB0aHJlYWQgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGF0IHNhbWUgdGhyZWFkLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgb2JqZWN0IHdhcyBjcmVhdGVkIGluIHRocmVhZCBpZCAlbGQgYW5kIHRoaXMgaXMgdGhyZWFkIGlkICVsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT50aHJlYWRfaWRlbnQsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogY29ubmVjdGlvbl9nZXRfaXNvbGF0aW9uX2xldmVsKENvbm5lY3Rpb24qIHNlbGYsIHZvaWQqIHVudXNlZCkKK3sKKyAgICBQeV9JTkNSRUYoc2VsZi0+aXNvbGF0aW9uX2xldmVsKTsKKyAgICByZXR1cm4gc2VsZi0+aXNvbGF0aW9uX2xldmVsOworfQorCitzdGF0aWMgUHlPYmplY3QqIGNvbm5lY3Rpb25fZ2V0X3RvdGFsX2NoYW5nZXMoQ29ubmVjdGlvbiogc2VsZiwgdm9pZCogdW51c2VkKQoreworICAgIGlmICghY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHNxbGl0ZTNfdG90YWxfY2hhbmdlcyhzZWxmLT5kYikpOworICAgIH0KK30KKworc3RhdGljIGludCBjb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWwoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCkKK3sKKyAgICBQeU9iamVjdCogZW1wdHk7CisgICAgUHlPYmplY3QqIHJlczsKKyAgICBQeU9iamVjdCogYmVnaW5fc3RhdGVtZW50OworCisgICAgUHlfWERFQ1JFRihzZWxmLT5pc29sYXRpb25fbGV2ZWwpOworCisgICAgaWYgKHNlbGYtPmJlZ2luX3N0YXRlbWVudCkgeworICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPmJlZ2luX3N0YXRlbWVudCk7CisgICAgICAgIHNlbGYtPmJlZ2luX3N0YXRlbWVudCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGlzb2xhdGlvbl9sZXZlbCA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgc2VsZi0+aXNvbGF0aW9uX2xldmVsID0gUHlfTm9uZTsKKworICAgICAgICBlbXB0eSA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICBpZiAoIWVtcHR5KSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gY29ubmVjdGlvbl9jb21taXQoc2VsZiwgZW1wdHkpOworICAgICAgICBpZiAoIXJlcykgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihlbXB0eSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworCisgICAgICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihpc29sYXRpb25fbGV2ZWwpOworICAgICAgICBzZWxmLT5pc29sYXRpb25fbGV2ZWwgPSBpc29sYXRpb25fbGV2ZWw7CisKKyAgICAgICAgYmVnaW5fc3RhdGVtZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiQkVHSU4gIik7CisgICAgICAgIGlmICghYmVnaW5fc3RhdGVtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlTdHJpbmdfQ29uY2F0KCZiZWdpbl9zdGF0ZW1lbnQsIGlzb2xhdGlvbl9sZXZlbCk7CisgICAgICAgIGlmICghYmVnaW5fc3RhdGVtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzZWxmLT5iZWdpbl9zdGF0ZW1lbnQgPSBQeU1lbV9NYWxsb2MoUHlTdHJpbmdfU2l6ZShiZWdpbl9zdGF0ZW1lbnQpICsgMik7CisgICAgICAgIGlmICghc2VsZi0+YmVnaW5fc3RhdGVtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzdHJjcHkoc2VsZi0+YmVnaW5fc3RhdGVtZW50LCBQeVN0cmluZ19Bc1N0cmluZyhiZWdpbl9zdGF0ZW1lbnQpKTsKKyAgICAgICAgUHlfREVDUkVGKGJlZ2luX3N0YXRlbWVudCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2NhbGwoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlPYmplY3QqIHNxbDsKKyAgICBTdGF0ZW1lbnQqIHN0YXRlbWVudDsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8iLCAmc3FsKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzdGF0ZW1lbnQgPSBQeU9iamVjdF9OZXcoU3RhdGVtZW50LCAmU3RhdGVtZW50VHlwZSk7CisgICAgaWYgKCFzdGF0ZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmMgPSBzdGF0ZW1lbnRfY3JlYXRlKHN0YXRlbWVudCwgc2VsZiwgc3FsKTsKKworICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgaWYgKHJjID09IFBZU1FMSVRFX1RPT19NVUNIX1NRTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFdhcm5pbmcsICJZb3UgY2FuIG9ubHkgZXhlY3V0ZSBvbmUgc3RhdGVtZW50IGF0IGEgdGltZS4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChyYyA9PSBQWVNRTElURV9TUUxfV1JPTkdfVFlQRSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFdhcm5pbmcsICJTUUwgaXMgb2Ygd3JvbmcgdHlwZS4gTXVzdCBiZSBzdHJpbmcgb3IgdW5pY29kZS4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIH0KKworICAgICAgICBQeV9ERUNSRUYoc3RhdGVtZW50KTsKKyAgICAgICAgc3RhdGVtZW50ID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0KilzdGF0ZW1lbnQ7Cit9CisKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2V4ZWN1dGUoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlPYmplY3QqIGN1cnNvciA9IDA7CisgICAgUHlPYmplY3QqIHJlc3VsdCA9IDA7CisgICAgUHlPYmplY3QqIG1ldGhvZCA9IDA7CisKKyAgICBjdXJzb3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgImN1cnNvciIsICIiKTsKKyAgICBpZiAoIWN1cnNvcikgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY3Vyc29yLCAiZXhlY3V0ZSIpOworICAgIGlmICghbWV0aG9kKSB7CisgICAgICAgIFB5X0RFQ1JFRihjdXJzb3IpOworICAgICAgICBjdXJzb3IgPSAwOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QobWV0aG9kLCBhcmdzKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBQeV9ERUNSRUYoY3Vyc29yKTsKKyAgICAgICAgY3Vyc29yID0gMDsKKyAgICB9CisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICBQeV9YREVDUkVGKG1ldGhvZCk7CisKKyAgICByZXR1cm4gY3Vyc29yOworfQorCitQeU9iamVjdCogY29ubmVjdGlvbl9leGVjdXRlbWFueShDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBQeU9iamVjdCogY3Vyc29yID0gMDsKKyAgICBQeU9iamVjdCogcmVzdWx0ID0gMDsKKyAgICBQeU9iamVjdCogbWV0aG9kID0gMDsKKworICAgIGN1cnNvciA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0KilzZWxmLCAiY3Vyc29yIiwgIiIpOworICAgIGlmICghY3Vyc29yKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjdXJzb3IsICJleGVjdXRlbWFueSIpOworICAgIGlmICghbWV0aG9kKSB7CisgICAgICAgIFB5X0RFQ1JFRihjdXJzb3IpOworICAgICAgICBjdXJzb3IgPSAwOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QobWV0aG9kLCBhcmdzKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBQeV9ERUNSRUYoY3Vyc29yKTsKKyAgICAgICAgY3Vyc29yID0gMDsKKyAgICB9CisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICBQeV9YREVDUkVGKG1ldGhvZCk7CisKKyAgICByZXR1cm4gY3Vyc29yOworfQorCitQeU9iamVjdCogY29ubmVjdGlvbl9leGVjdXRlc2NyaXB0KENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIFB5T2JqZWN0KiBjdXJzb3IgPSAwOworICAgIFB5T2JqZWN0KiByZXN1bHQgPSAwOworICAgIFB5T2JqZWN0KiBtZXRob2QgPSAwOworCisgICAgY3Vyc29yID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QqKXNlbGYsICJjdXJzb3IiLCAiIik7CisgICAgaWYgKCFjdXJzb3IpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBtZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGN1cnNvciwgImV4ZWN1dGVzY3JpcHQiKTsKKyAgICBpZiAoIW1ldGhvZCkgeworICAgICAgICBQeV9ERUNSRUYoY3Vyc29yKTsKKyAgICAgICAgY3Vyc29yID0gMDsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KG1ldGhvZCwgYXJncyk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgUHlfREVDUkVGKGN1cnNvcik7CisgICAgICAgIGN1cnNvciA9IDA7CisgICAgfQorCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgUHlfWERFQ1JFRihtZXRob2QpOworCisgICAgcmV0dXJuIGN1cnNvcjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDT0xMQVRJT04gQ09ERSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludAorY29sbGF0aW9uX2NhbGxiYWNrKAorICAgICAgICB2b2lkKiBjb250ZXh0LAorICAgICAgICBpbnQgdGV4dDFfbGVuZ3RoLCBjb25zdCB2b2lkKiB0ZXh0MV9kYXRhLAorICAgICAgICBpbnQgdGV4dDJfbGVuZ3RoLCBjb25zdCB2b2lkKiB0ZXh0Ml9kYXRhKQoreworICAgIFB5T2JqZWN0KiBjYWxsYmFjayA9IChQeU9iamVjdCopY29udGV4dDsKKyAgICBQeU9iamVjdCogc3RyaW5nMSA9IDA7CisgICAgUHlPYmplY3QqIHN0cmluZzIgPSAwOworICAgIFB5R0lMU3RhdGVfU1RBVEUgZ2lsc3RhdGU7CisKKyAgICBQeU9iamVjdCogcmV0dmFsID0gTlVMTDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisKKyAgICBzdHJpbmcxID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNvbnN0IGNoYXIqKXRleHQxX2RhdGEsIHRleHQxX2xlbmd0aCk7CisgICAgc3RyaW5nMiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjb25zdCBjaGFyKil0ZXh0Ml9kYXRhLCB0ZXh0Ml9sZW5ndGgpOworCisgICAgaWYgKCFzdHJpbmcxIHx8ICFzdHJpbmcyKSB7CisgICAgICAgIGdvdG8gZmluYWxseTsgLyogZmFpbGVkIHRvIGFsbG9jYXRlIHN0cmluZ3MgKi8KKyAgICB9CisKKyAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNhbGxiYWNrLCBzdHJpbmcxLCBzdHJpbmcyLCBOVUxMKTsKKworICAgIGlmICghcmV0dmFsKSB7CisgICAgICAgIC8qIGV4ZWN1dGlvbiBmYWlsZWQgKi8KKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKworICAgIHJlc3VsdCA9IFB5SW50X0FzTG9uZyhyZXR2YWwpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgfQorCitmaW5hbGx5OgorICAgIFB5X1hERUNSRUYoc3RyaW5nMSk7CisgICAgUHlfWERFQ1JFRihzdHJpbmcyKTsKKyAgICBQeV9YREVDUkVGKHJldHZhbCk7CisKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2UoZ2lsc3RhdGUpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2Nvbm5lY3Rpb25fY3JlYXRlX2NvbGxhdGlvbihDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBQeU9iamVjdCogY2FsbGFibGU7CisgICAgUHlPYmplY3QqIHVwcGVyY2FzZV9uYW1lID0gMDsKKyAgICBQeU9iamVjdCogbmFtZTsKKyAgICBQeU9iamVjdCogcmV0dmFsOworICAgIGNoYXIqIGNoazsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmKSB8fCAhY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgeworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIU86Y3JlYXRlX2NvbGxhdGlvbihuYW1lLCBjYWxsYmFjaykiLCAmUHlTdHJpbmdfVHlwZSwgJm5hbWUsICZjYWxsYWJsZSkpIHsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKworICAgIHVwcGVyY2FzZV9uYW1lID0gUHlPYmplY3RfQ2FsbE1ldGhvZChuYW1lLCAidXBwZXIiLCAiIik7CisgICAgaWYgKCF1cHBlcmNhc2VfbmFtZSkgeworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorCisgICAgY2hrID0gUHlTdHJpbmdfQXNTdHJpbmcodXBwZXJjYXNlX25hbWUpOworICAgIHdoaWxlICgqY2hrKSB7CisgICAgICAgIGlmICgoKmNoayA+PSAnMCcgJiYgKmNoayA8PSAnOScpCisgICAgICAgICB8fCAoKmNoayA+PSAnQScgJiYgKmNoayA8PSAnWicpCisgICAgICAgICB8fCAoKmNoayA9PSAnXycpKQorICAgICAgICB7CisgICAgICAgICAgICBjaGsrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQcm9ncmFtbWluZ0Vycm9yLCAiaW52YWxpZCBjaGFyYWN0ZXIgaW4gY29sbGF0aW9uIG5hbWUiKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjYWxsYWJsZSAhPSBQeV9Ob25lICYmICFQeUNhbGxhYmxlX0NoZWNrKGNhbGxhYmxlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicGFyYW1ldGVyIG11c3QgYmUgY2FsbGFibGUiKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKworICAgIGlmIChjYWxsYWJsZSAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5RGljdF9TZXRJdGVtKHNlbGYtPmNvbGxhdGlvbnMsIHVwcGVyY2FzZV9uYW1lLCBjYWxsYWJsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlEaWN0X0RlbEl0ZW0oc2VsZi0+Y29sbGF0aW9ucywgdXBwZXJjYXNlX25hbWUpOworICAgIH0KKworICAgIHJjID0gc3FsaXRlM19jcmVhdGVfY29sbGF0aW9uKHNlbGYtPmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKHVwcGVyY2FzZV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUxJVEVfVVRGOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FsbGFibGUgIT0gUHlfTm9uZSkgPyBjYWxsYWJsZSA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGxhYmxlICE9IFB5X05vbmUpID8gY29sbGF0aW9uX2NhbGxiYWNrIDogTlVMTCk7CisgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICBQeURpY3RfRGVsSXRlbShzZWxmLT5jb2xsYXRpb25zLCB1cHBlcmNhc2VfbmFtZSk7CisgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisKK2ZpbmFsbHk6CisgICAgUHlfWERFQ1JFRih1cHBlcmNhc2VfbmFtZSk7CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICByZXR2YWwgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgY2hhciBjb25uZWN0aW9uX2RvY1tdID0KK1B5RG9jX1NUUigiPG1pc3NpbmcgZG9jc3RyaW5nPiIpOworCitzdGF0aWMgUHlHZXRTZXREZWYgY29ubmVjdGlvbl9nZXRzZXRbXSA9IHsKKyAgICB7Imlzb2xhdGlvbl9sZXZlbCIsICAoZ2V0dGVyKWNvbm5lY3Rpb25fZ2V0X2lzb2xhdGlvbl9sZXZlbCwgKHNldHRlciljb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWx9LAorICAgIHsidG90YWxfY2hhbmdlcyIsICAoZ2V0dGVyKWNvbm5lY3Rpb25fZ2V0X3RvdGFsX2NoYW5nZXMsIChzZXR0ZXIpMH0sCisgICAge05VTEx9Cit9OworCitzdGF0aWMgUHlNZXRob2REZWYgY29ubmVjdGlvbl9tZXRob2RzW10gPSB7CisgICAgeyJjdXJzb3IiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jdXJzb3IsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAorICAgICAgICBQeURvY19TVFIoIlJldHVybiBhIGN1cnNvciBmb3IgdGhlIGNvbm5lY3Rpb24uIil9LAorICAgIHsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jbG9zZSwgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiQ2xvc2VzIHRoZSBjb25uZWN0aW9uLiIpfSwKKyAgICB7ImNvbW1pdCIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2NvbW1pdCwgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiQ29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiIpfSwKKyAgICB7InJvbGxiYWNrIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcm9sbGJhY2ssIE1FVEhfTk9BUkdTLAorICAgICAgICBQeURvY19TVFIoIlJvbGwgYmFjayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4iKX0sCisgICAgeyJjcmVhdGVfZnVuY3Rpb24iLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jcmVhdGVfZnVuY3Rpb24sIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAorICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBuZXcgZnVuY3Rpb24uIE5vbi1zdGFuZGFyZC4iKX0sCisgICAgeyJjcmVhdGVfYWdncmVnYXRlIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fY3JlYXRlX2FnZ3JlZ2F0ZSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCisgICAgICAgIFB5RG9jX1NUUigiQ3JlYXRlcyBhIG5ldyBhZ2dyZWdhdGUuIE5vbi1zdGFuZGFyZC4iKX0sCisgICAgeyJleGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fZXhlY3V0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIkV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4gTm9uLXN0YW5kYXJkLiIpfSwKKyAgICB7ImV4ZWN1dGVtYW55IiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fZXhlY3V0ZW1hbnksIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJSZXBlYXRlZGx5IGV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4gTm9uLXN0YW5kYXJkLiIpfSwKKyAgICB7ImV4ZWN1dGVzY3JpcHQiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9leGVjdXRlc2NyaXB0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiRXhlY3V0ZXMgYSBtdWx0aXBsZSBTUUwgc3RhdGVtZW50cyBhdCBvbmNlLiBOb24tc3RhbmRhcmQuIil9LAorICAgIHsiY3JlYXRlX2NvbGxhdGlvbiIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2NyZWF0ZV9jb2xsYXRpb24sIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJDcmVhdGVzIGEgY29sbGF0aW9uIGZ1bmN0aW9uLiIpfSwKKyAgICB7TlVMTCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgUHlNZW1iZXJEZWYgY29ubmVjdGlvbl9tZW1iZXJzW10gPQoreworICAgIHsiV2FybmluZyIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCBXYXJuaW5nKSwgUk99LAorICAgIHsiRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ29ubmVjdGlvbiwgRXJyb3IpLCBST30sCisgICAgeyJJbnRlcmZhY2VFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCBJbnRlcmZhY2VFcnJvciksIFJPfSwKKyAgICB7IkRhdGFiYXNlRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ29ubmVjdGlvbiwgRGF0YWJhc2VFcnJvciksIFJPfSwKKyAgICB7IkRhdGFFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCBEYXRhRXJyb3IpLCBST30sCisgICAgeyJPcGVyYXRpb25hbEVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKENvbm5lY3Rpb24sIE9wZXJhdGlvbmFsRXJyb3IpLCBST30sCisgICAgeyJJbnRlZ3JpdHlFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCBJbnRlZ3JpdHlFcnJvciksIFJPfSwKKyAgICB7IkludGVybmFsRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ29ubmVjdGlvbiwgSW50ZXJuYWxFcnJvciksIFJPfSwKKyAgICB7IlByb2dyYW1taW5nRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ29ubmVjdGlvbiwgUHJvZ3JhbW1pbmdFcnJvciksIFJPfSwKKyAgICB7Ik5vdFN1cHBvcnRlZEVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKENvbm5lY3Rpb24sIE5vdFN1cHBvcnRlZEVycm9yKSwgUk99LAorICAgIHsicm93X2ZhY3RvcnkiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ29ubmVjdGlvbiwgcm93X2ZhY3RvcnkpfSwKKyAgICB7InRleHRfZmFjdG9yeSIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCB0ZXh0X2ZhY3RvcnkpfSwKKyAgICB7TlVMTH0KK307CisKK1B5VHlwZU9iamVjdCBDb25uZWN0aW9uVHlwZSA9IHsKKyAgICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAgICAgTU9EVUxFX05BTUUgIi5Db25uZWN0aW9uIiwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICAgICBzaXplb2YoQ29ubmVjdGlvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAgICAgKGRlc3RydWN0b3IpY29ubmVjdGlvbl9kZWFsbG9jLCAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAgICAgKHRlcm5hcnlmdW5jKWNvbm5lY3Rpb25fY2FsbCwgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICAgIGNvbm5lY3Rpb25fZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgICAgIGNvbm5lY3Rpb25fbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAgICAgY29ubmVjdGlvbl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgICAgICBjb25uZWN0aW9uX2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgICAgICAoaW5pdHByb2MpY29ubmVjdGlvbl9pbml0LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCit9OworCitleHRlcm4gaW50IGNvbm5lY3Rpb25fc2V0dXBfdHlwZXModm9pZCkKK3sKKyAgICBDb25uZWN0aW9uVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICByZXR1cm4gUHlUeXBlX1JlYWR5KCZDb25uZWN0aW9uVHlwZSk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5oIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWFlNmU0Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uaApAQCAtMCwwICsxLDEwNiBAQAorLyogY29ubmVjdGlvbi5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uIHR5cGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFBZU1FMSVRFX0NPTk5FQ1RJT05fSAorI2RlZmluZSBQWVNRTElURV9DT05ORUNUSU9OX0gKKyNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJweXRocmVhZC5oIgorI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgorCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKworI2luY2x1ZGUgInNxbGl0ZTMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgc3FsaXRlMyogZGI7CisKKyAgICBpbnQgaW5UcmFuc2FjdGlvbjsKKyAgICBpbnQgZGV0ZWN0X3R5cGVzOworCisgICAgLyogdGhlIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcyBmb3IgZGF0YWJhc2UgbG9ja3MgKi8KKyAgICBkb3VibGUgdGltZW91dDsKKworICAgIC8qIGZvciBpbnRlcm5hbCB1c2UgaW4gdGhlIHRpbWVvdXQgaGFuZGxlcjogd2hlbiBkaWQgdGhlIHRpbWVvdXQgaGFuZGxlcgorICAgICAqIGZpcnN0IGdldCBjYWxsZWQgd2l0aCBjb3VudD0wPyAqLworICAgIGRvdWJsZSB0aW1lb3V0X3N0YXJ0ZWQ7CisKKyAgICAvKiBOb25lIGZvciBhdXRvY29tbWl0LCBvdGhlcndpc2UgYSBQeVN0cmluZyB3aXRoIHRoZSBpc29sYXRpb24gbGV2ZWwgKi8KKyAgICBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsOworCisgICAgLyogTlVMTCBmb3IgYXV0b2NvbW1pdCwgb3RoZXJ3aXNlIGEgc3RyaW5nIHdpdGggdGhlIEJFR0lOIHN0YXRtZW50OyB3aWxsIGJlCisgICAgICogZnJlZWQgaW4gY29ubmVjdGlvbiBkZXN0cnVjdG9yICovCisgICAgY2hhciogYmVnaW5fc3RhdGVtZW50OworCisgICAgaW50IGNoZWNrX3NhbWVfdGhyZWFkOworICAgIGxvbmcgdGhyZWFkX2lkZW50OworCisgICAgQ2FjaGUqIHN0YXRlbWVudF9jYWNoZTsKKworICAgIFB5T2JqZWN0KiByb3dfZmFjdG9yeTsKKworICAgIFB5T2JqZWN0KiB0ZXh0X2ZhY3Rvcnk7CisKKyAgICAvKiByZW1lbWJlciByZWZlcmVuY2VzIHRvIGZ1bmN0aW9ucy9jbGFzc2VzIHVzZWQgaW4KKyAgICAgKiBjcmVhdGVfZnVuY3Rpb24vY3JlYXRlL2FnZ3JlZ2F0ZSwgdXNlIHRoZXNlIGFzIGRpY3Rpb25hcnkga2V5cywgc28gd2UKKyAgICAgKiBjYW4ga2VlcCB0aGUgdG90YWwgc3lzdGVtIHJlZmNvdW50IGNvbnN0YW50IGJ5IGNsZWFyaW5nIHRoYXQgZGljdGlvbmFyeQorICAgICAqIGluIGNvbm5lY3Rpb25fZGVhbGxvYyAqLworICAgIFB5T2JqZWN0KiBmdW5jdGlvbl9waW5ib2FyZDsKKworICAgIC8qIGEgZGljdGlvbmFyeSBvZiByZWdpc3RlcmVkIGNvbGxhdGlvbiBuYW1lID0+IGNvbGxhdGlvbiBjYWxsYWJsZSBtYXBwaW5ncyAqLworICAgIFB5T2JqZWN0KiBjb2xsYXRpb25zOworCisgICAgLyogRXhjZXB0aW9uIG9iamVjdHMgKi8KKyAgICBQeU9iamVjdCogV2FybmluZzsKKyAgICBQeU9iamVjdCogRXJyb3I7CisgICAgUHlPYmplY3QqIEludGVyZmFjZUVycm9yOworICAgIFB5T2JqZWN0KiBEYXRhYmFzZUVycm9yOworICAgIFB5T2JqZWN0KiBEYXRhRXJyb3I7CisgICAgUHlPYmplY3QqIE9wZXJhdGlvbmFsRXJyb3I7CisgICAgUHlPYmplY3QqIEludGVncml0eUVycm9yOworICAgIFB5T2JqZWN0KiBJbnRlcm5hbEVycm9yOworICAgIFB5T2JqZWN0KiBQcm9ncmFtbWluZ0Vycm9yOworICAgIFB5T2JqZWN0KiBOb3RTdXBwb3J0ZWRFcnJvcjsKK30gQ29ubmVjdGlvbjsKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBDb25uZWN0aW9uVHlwZTsKKworUHlPYmplY3QqIGNvbm5lY3Rpb25fYWxsb2MoUHlUeXBlT2JqZWN0KiB0eXBlLCBpbnQgYXdhcmUpOwordm9pZCBjb25uZWN0aW9uX2RlYWxsb2MoQ29ubmVjdGlvbiogc2VsZik7CitQeU9iamVjdCogY29ubmVjdGlvbl9jdXJzb3IoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOworUHlPYmplY3QqIGNvbm5lY3Rpb25fY2xvc2UoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIF9jb25uZWN0aW9uX2JlZ2luKENvbm5lY3Rpb24qIHNlbGYpOworUHlPYmplY3QqIGNvbm5lY3Rpb25fYmVnaW4oQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIGNvbm5lY3Rpb25fY29tbWl0KENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK1B5T2JqZWN0KiBjb25uZWN0aW9uX3JvbGxiYWNrKENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK1B5T2JqZWN0KiBjb25uZWN0aW9uX25ldyhQeVR5cGVPYmplY3QqIHR5cGUsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3cpOworaW50IGNvbm5lY3Rpb25faW5pdChDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7CisKK2ludCBjaGVja190aHJlYWQoQ29ubmVjdGlvbiogc2VsZik7CitpbnQgY2hlY2tfY29ubmVjdGlvbihDb25uZWN0aW9uKiBjb24pOworCitpbnQgY29ubmVjdGlvbl9zZXR1cF90eXBlcyh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY29udmVydGVycy5jIGIvTW9kdWxlcy9fc3FsaXRlL2NvbnZlcnRlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTgwNjNhCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2NvbnZlcnRlcnMuYwpAQCAtMCwwICsxLDQwIEBACisvKiBjb252ZXJ0ZXJzLmMgLSBkZWZhdWx0IGNvbnZlcnRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJhZGFwdGVycy5oIgorCisvKiBkdW1teSwgd2lsbCBiZSBpbXBsZW1lbnRlZCBpbiBhIGxhdGVyIHZlcnNpb24gKi8KKworUHlPYmplY3QqIGNvbnZlcnRfZGF0ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitQeU9iamVjdCogY29udmVydF90aW1lc3RhbXAoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jb252ZXJ0ZXJzLmggYi9Nb2R1bGVzL19zcWxpdGUvY29udmVydGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMzc2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY29udmVydGVycy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIGNvbnZlcnRlcnMuaCAtIGRlZmF1bHQgY29udmVydGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFBZU1FMSVRFX0NPTlZFUlRFUlNfSAorI2RlZmluZSBQWVNRTElURV9DT05WRVJURVJTX0gKKyNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJweXRocmVhZC5oIgorI2luY2x1ZGUgInNxbGl0ZTMuaCIKKworUHlPYmplY3QqIGNvbnZlcnRfZGF0ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOworUHlPYmplY3QqIGNvbnZlcnRfdGltZXN0YW1wKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YjhjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKQEAgLTAsMCArMSwxMDI3IEBACisvKiBjdXJzb3IuYyAtIHRoZSBjdXJzb3IgdHlwZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJjdXJzb3IuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAic3FsaXRlY29tcGF0LmgiCisKKy8qIHVzZWQgdG8gZGVjaWRlIHdldGhlciB0byBjYWxsIFB5SW50X0Zyb21Mb25nIG9yIFB5TG9uZ19Gcm9tTG9uZ0xvbmcgKi8KKyNkZWZpbmUgSU5UMzJfTUlOICgtMjE0NzQ4MzY0NyAtIDEpCisjZGVmaW5lIElOVDMyX01BWCAyMTQ3NDgzNjQ3CisKK1B5T2JqZWN0KiBjdXJzb3JfaXRlcm5leHQoQ3Vyc29yICpzZWxmKTsKKworc3RhdGljIFN0YXRlbWVudEtpbmQgZGV0ZWN0X3N0YXRlbWVudF90eXBlKGNoYXIqIHN0YXRlbWVudCkKK3sKKyAgICBjaGFyIGJ1ZlsyMF07CisgICAgY2hhciogc3JjOworICAgIGNoYXIqIGRzdDsKKworICAgIHNyYyA9IHN0YXRlbWVudDsKKyAgICAvKiBza2lwIG92ZXIgd2hpdGVwYWNlICovCisgICAgd2hpbGUgKCpzcmMgPT0gJ1xyJyB8fCAqc3JjID09ICdcbicgfHwgKnNyYyA9PSAnICcgfHwgKnNyYyA9PSAnXHQnKSB7CisgICAgICAgIHNyYysrOworICAgIH0KKworICAgIGlmICgqc3JjID09IDApCisgICAgICAgIHJldHVybiBTVEFURU1FTlRfSU5WQUxJRDsKKworICAgIGRzdCA9IGJ1ZjsKKyAgICAqZHN0ID0gMDsKKyAgICB3aGlsZSAoaXNhbHBoYSgqc3JjKSAmJiBkc3QgLSBidWYgPCBzaXplb2YoYnVmKSAtIDIpIHsKKyAgICAgICAgKmRzdCsrID0gdG9sb3dlcigqc3JjKyspOworICAgIH0KKworICAgICpkc3QgPSAwOworCisgICAgaWYgKCFzdHJjbXAoYnVmLCAic2VsZWN0IikpIHsKKyAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9TRUxFQ1Q7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgImluc2VydCIpKSB7CisgICAgICAgIHJldHVybiBTVEFURU1FTlRfSU5TRVJUOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChidWYsICJ1cGRhdGUiKSkgeworICAgICAgICByZXR1cm4gU1RBVEVNRU5UX1VQREFURTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAiZGVsZXRlIikpIHsKKyAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9ERUxFVEU7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInJlcGxhY2UiKSkgeworICAgICAgICByZXR1cm4gU1RBVEVNRU5UX1JFUExBQ0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9PVEhFUjsKKyAgICB9Cit9CisKK2ludCBjdXJzb3JfaW5pdChDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIENvbm5lY3Rpb24qIGNvbm5lY3Rpb247CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJkNvbm5lY3Rpb25UeXBlLCAmY29ubmVjdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gLTE7IAorICAgIH0KKworICAgIFB5X0lOQ1JFRihjb25uZWN0aW9uKTsKKyAgICBzZWxmLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICBzZWxmLT5zdGF0ZW1lbnQgPSBOVUxMOworICAgIHNlbGYtPm5leHRfcm93ID0gTlVMTDsKKworICAgIHNlbGYtPnJvd19jYXN0X21hcCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKCFzZWxmLT5yb3dfY2FzdF9tYXApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBzZWxmLT5kZXNjcmlwdGlvbiA9IFB5X05vbmU7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgc2VsZi0+bGFzdHJvd2lkPSBQeV9Ob25lOworCisgICAgc2VsZi0+YXJyYXlzaXplID0gMTsKKworICAgIHNlbGYtPnJvd2NvdW50ID0gUHlJbnRfRnJvbUxvbmcoLTFMKTsKKyAgICBpZiAoIXNlbGYtPnJvd2NvdW50KSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgc2VsZi0+cm93X2ZhY3RvcnkgPSBQeV9Ob25lOworCisgICAgaWYgKCFjaGVja190aHJlYWQoc2VsZi0+Y29ubmVjdGlvbikpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGN1cnNvcl9kZWFsbG9jKEN1cnNvciogc2VsZikKK3sKKyAgICBpbnQgcmM7CisKKyAgICAvKiBSZXNldCB0aGUgc3RhdGVtZW50IGlmIHRoZSB1c2VyIGhhcyBub3QgY2xvc2VkIHRoZSBjdXJzb3IgKi8KKyAgICBpZiAoc2VsZi0+c3RhdGVtZW50KSB7CisgICAgICAgIHJjID0gc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5zdGF0ZW1lbnQpOworICAgIH0KKworICAgIFB5X1hERUNSRUYoc2VsZi0+Y29ubmVjdGlvbik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5yb3dfY2FzdF9tYXApOworICAgIFB5X1hERUNSRUYoc2VsZi0+ZGVzY3JpcHRpb24pOworICAgIFB5X1hERUNSRUYoc2VsZi0+bGFzdHJvd2lkKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJvd2NvdW50KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJvd19mYWN0b3J5KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm5leHRfcm93KTsKKworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworaW50IGJ1aWxkX3Jvd19jYXN0X21hcChDdXJzb3IqIHNlbGYpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgY2hhciogdHlwZV9zdGFydCA9IChjb25zdCBjaGFyKiktMTsKKyAgICBjb25zdCBjaGFyKiBwb3M7CisKKyAgICBjb25zdCBjaGFyKiBjb2xuYW1lOworICAgIGNvbnN0IGNoYXIqIGRlY2x0eXBlOworICAgIFB5T2JqZWN0KiBweV9kZWNsdHlwZTsKKyAgICBQeU9iamVjdCogY29udmVydGVyOworICAgIFB5T2JqZWN0KiBrZXk7CisKKyAgICBpZiAoIXNlbGYtPmNvbm5lY3Rpb24tPmRldGVjdF90eXBlcykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJvd19jYXN0X21hcCk7CisgICAgc2VsZi0+cm93X2Nhc3RfbWFwID0gUHlMaXN0X05ldygwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzcWxpdGUzX2NvbHVtbl9jb3VudChzZWxmLT5zdGF0ZW1lbnQtPnN0KTsgaSsrKSB7CisgICAgICAgIGNvbnZlcnRlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKHNlbGYtPmNvbm5lY3Rpb24tPmRldGVjdF90eXBlcyB8IFBBUlNFX0NPTE5BTUVTKSB7CisgICAgICAgICAgICBjb2xuYW1lID0gc3FsaXRlM19jb2x1bW5fbmFtZShzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKKworICAgICAgICAgICAgZm9yIChwb3MgPSBjb2xuYW1lOyAqcG9zICE9IDA7IHBvcysrKSB7CisgICAgICAgICAgICAgICAgaWYgKCpwb3MgPT0gJ1snKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVfc3RhcnQgPSBwb3MgKyAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKnBvcyA9PSAnXScgJiYgdHlwZV9zdGFydCAhPSAoY29uc3QgY2hhciopLTEpIHsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodHlwZV9zdGFydCwgcG9zIC0gdHlwZV9zdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGluZyBhIHN0cmluZyBmYWlsZWQsIGJ1dCBpdCBpcyB0b28gY29tcGxpY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIHByb3BhZ2F0ZSB0aGUgZXJyb3IgaGVyZSwgd2UganVzdCBhc3N1bWUgdGhlcmUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG5vIGNvbnZlcnRlciBhbmQgcHJvY2VlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBQeURpY3RfR2V0SXRlbShjb252ZXJ0ZXJzLCBrZXkpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNvbnZlcnRlciAmJiBzZWxmLT5jb25uZWN0aW9uLT5kZXRlY3RfdHlwZXMgfCBQQVJTRV9ERUNMVFlQRVMpIHsKKyAgICAgICAgICAgIGRlY2x0eXBlID0gc3FsaXRlM19jb2x1bW5fZGVjbHR5cGUoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CisgICAgICAgICAgICBpZiAoZGVjbHR5cGUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHBvcyA9IGRlY2x0eXBlOztwb3MrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKnBvcyA9PSAnICcgfHwgKnBvcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBweV9kZWNsdHlwZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRlY2x0eXBlLCBwb3MgLSBkZWNsdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB5X2RlY2x0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBQeURpY3RfR2V0SXRlbShjb252ZXJ0ZXJzLCBweV9kZWNsdHlwZSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHB5X2RlY2x0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29udmVydGVyKSB7CisgICAgICAgICAgICBjb252ZXJ0ZXIgPSBQeV9Ob25lOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoc2VsZi0+cm93X2Nhc3RfbWFwLCBjb252ZXJ0ZXIpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0ZXIgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjb252ZXJ0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5yb3dfY2FzdF9tYXApOworICAgICAgICAgICAgc2VsZi0+cm93X2Nhc3RfbWFwID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK1B5T2JqZWN0KiBfYnVpbGRfY29sdW1uX25hbWUoY29uc3QgY2hhciogY29sbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyKiBwb3M7CisKKyAgICBpZiAoIWNvbG5hbWUpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisKKyAgICBmb3IgKHBvcyA9IGNvbG5hbWU7OyBwb3MrKykgeworICAgICAgICBpZiAoKnBvcyA9PSAwIHx8ICpwb3MgPT0gJyAnKSB7CisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY29sbmFtZSwgcG9zIC0gY29sbmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1B5T2JqZWN0KiB1bmljb2RlX2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIqIHZhbF9zdHIsIGludCBvcHRpbWl6ZSkKK3sKKyAgICBjb25zdCBjaGFyKiBjaGVjazsKKyAgICBpbnQgaXNfYXNjaWkgPSAwOworCisgICAgaWYgKG9wdGltaXplKSB7CisgICAgICAgIGlzX2FzY2lpID0gMTsKKworICAgICAgICBjaGVjayA9IHZhbF9zdHI7CisgICAgICAgIHdoaWxlICgqY2hlY2spIHsKKyAgICAgICAgICAgIGlmICgqY2hlY2sgJiAweDgwKSB7CisgICAgICAgICAgICAgICAgaXNfYXNjaWkgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGVjaysrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzX2FzY2lpKSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbF9zdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlVVRGOCh2YWxfc3RyLCBzdHJsZW4odmFsX3N0ciksIE5VTEwpOworICAgIH0KK30KKworLyoKKyAqIFJldHVybnMgYSByb3cgZnJvbSB0aGUgY3VycmVudGx5IGFjdGl2ZSBTUUxpdGUgc3RhdGVtZW50CisgKgorICogUHJlY29uZGlkaXRpb246CisgKiAtIHNxbGl0ZTNfc3RlcCgpIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUgYW5kIGl0IHJldHVybmVkIFNRTElURV9ST1cuCisgKi8KK1B5T2JqZWN0KiBfZmV0Y2hfb25lX3JvdyhDdXJzb3IqIHNlbGYpCit7CisgICAgaW50IGksIG51bWNvbHM7CisgICAgUHlPYmplY3QqIHJvdzsKKyAgICBQeU9iamVjdCogaXRlbSA9IE5VTEw7CisgICAgaW50IGNvbHR5cGU7CisgICAgUFlfTE9OR19MT05HIGludHZhbDsKKyAgICBQeU9iamVjdCogY29udmVydGVyOworICAgIFB5T2JqZWN0KiBjb252ZXJ0ZWQ7CisgICAgUHlfc3NpemVfdCBuYnl0ZXM7CisgICAgUHlPYmplY3QqIGJ1ZmZlcjsKKyAgICB2b2lkKiByYXdfYnVmZmVyOworICAgIGNvbnN0IGNoYXIqIHZhbF9zdHI7CisgICAgY2hhciBidWZbMjAwXTsKKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBudW1jb2xzID0gc3FsaXRlM19kYXRhX2NvdW50KHNlbGYtPnN0YXRlbWVudC0+c3QpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICByb3cgPSBQeVR1cGxlX05ldyhudW1jb2xzKTsKKyAgICBpZiAoIXJvdykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtY29sczsgaSsrKSB7CisgICAgICAgIGlmIChzZWxmLT5jb25uZWN0aW9uLT5kZXRlY3RfdHlwZXMpIHsKKyAgICAgICAgICAgIGNvbnZlcnRlciA9IFB5TGlzdF9HZXRJdGVtKHNlbGYtPnJvd19jYXN0X21hcCwgaSk7CisgICAgICAgICAgICBpZiAoIWNvbnZlcnRlcikgeworICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IFB5X05vbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb252ZXJ0ZXIgPSBQeV9Ob25lOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICB2YWxfc3RyID0gKGNvbnN0IGNoYXIqKXNxbGl0ZTNfY29sdW1uX3RleHQoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CisgICAgICAgICAgICBpZiAoIXZhbF9zdHIpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlfTm9uZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsX3N0cik7CisgICAgICAgICAgICAgICAgaWYgKCFpdGVtKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY29udmVydGVyLCAiTyIsIGl0ZW0pOworICAgICAgICAgICAgICAgIGlmICghY29udmVydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IGhhdmUgYSB3YXkgdG8gbG9nIHRoZXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5X05vbmU7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGNvbHR5cGUgPSBzcWxpdGUzX2NvbHVtbl90eXBlKHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGlmIChjb2x0eXBlID09IFNRTElURV9OVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5X05vbmU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHR5cGUgPT0gU1FMSVRFX0lOVEVHRVIpIHsKKyAgICAgICAgICAgICAgICBpbnR2YWwgPSBzcWxpdGUzX2NvbHVtbl9pbnQ2NChzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW50dmFsIDwgSU5UMzJfTUlOIHx8IGludHZhbCA+IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKGludHZhbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaW50dmFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHR5cGUgPT0gU1FMSVRFX0ZMT0FUKSB7CisgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlGbG9hdF9Gcm9tRG91YmxlKHNxbGl0ZTNfY29sdW1uX2RvdWJsZShzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHR5cGUgPT0gU1FMSVRFX1RFWFQpIHsKKyAgICAgICAgICAgICAgICB2YWxfc3RyID0gKGNvbnN0IGNoYXIqKXNxbGl0ZTNfY29sdW1uX3RleHQoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CisgICAgICAgICAgICAgICAgaWYgKChzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgPT0gKFB5T2JqZWN0KikmUHlVbmljb2RlX1R5cGUpCisgICAgICAgICAgICAgICAgICAgIHx8IChzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgPT0gT3B0aW1pemVkVW5pY29kZSkpIHsKKworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSB1bmljb2RlX2Zyb21fc3RyaW5nKHZhbF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgPT0gT3B0aW1pemVkVW5pY29kZSA/IDEgOiAwKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpIC0gMSwgIkNvdWxkIG5vdCBkZWNvZGUgdG8gVVRGLTggY29sdW1uICVzIHdpdGggdGV4dCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWxpdGUzX2NvbHVtbl9uYW1lKHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpLCB2YWxfc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhPcGVyYXRpb25hbEVycm9yLCBidWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgPT0gKFB5T2JqZWN0KikmUHlTdHJpbmdfVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbF9zdHIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnksICJzIiwgdmFsX3N0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBjb2x0eXBlID09IFNRTElURV9CTE9CICovCisgICAgICAgICAgICAgICAgbmJ5dGVzID0gc3FsaXRlM19jb2x1bW5fYnl0ZXMoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gUHlCdWZmZXJfTmV3KG5ieXRlcyk7CisgICAgICAgICAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChQeU9iamVjdF9Bc1dyaXRlQnVmZmVyKGJ1ZmZlciwgJnJhd19idWZmZXIsICZuYnl0ZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkocmF3X2J1ZmZlciwgc3FsaXRlM19jb2x1bW5fYmxvYihzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKSwgbmJ5dGVzKTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBidWZmZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBQeVR1cGxlX1NldEl0ZW0ocm93LCBpLCBjb252ZXJ0ZWQpOworICAgIH0KKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyb3cpOworICAgICAgICByb3cgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiByb3c7Cit9CisKK1B5T2JqZWN0KiBfcXVlcnlfZXhlY3V0ZShDdXJzb3IqIHNlbGYsIGludCBtdWx0aXBsZSwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgUHlPYmplY3QqIG9wZXJhdGlvbjsKKyAgICBQeU9iamVjdCogb3BlcmF0aW9uX2J5dGVzdHIgPSBOVUxMOworICAgIGNoYXIqIG9wZXJhdGlvbl9jc3RyOworICAgIFB5T2JqZWN0KiBwYXJhbWV0ZXJzX2xpc3QgPSBOVUxMOworICAgIFB5T2JqZWN0KiBwYXJhbWV0ZXJzX2l0ZXIgPSBOVUxMOworICAgIFB5T2JqZWN0KiBwYXJhbWV0ZXJzID0gTlVMTDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmM7CisgICAgUHlPYmplY3QqIGZ1bmNfYXJnczsKKyAgICBQeU9iamVjdCogcmVzdWx0OworICAgIGludCBudW1jb2xzOworICAgIFBZX0xPTkdfTE9ORyBsYXN0cm93aWQ7CisgICAgaW50IHN0YXRlbWVudF90eXBlOworICAgIFB5T2JqZWN0KiBkZXNjcmlwdG9yOworICAgIFB5T2JqZWN0KiBzZWNvbmRfYXJndW1lbnQgPSBOVUxMOworICAgIGxvbmcgcm93Y291bnQgPSAwOworCisgICAgaWYgKCFjaGVja190aHJlYWQoc2VsZi0+Y29ubmVjdGlvbikgfHwgIWNoZWNrX2Nvbm5lY3Rpb24oc2VsZi0+Y29ubmVjdGlvbikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfWERFQ1JFRihzZWxmLT5uZXh0X3Jvdyk7CisgICAgc2VsZi0+bmV4dF9yb3cgPSBOVUxMOworCisgICAgaWYgKG11bHRpcGxlKSB7CisgICAgICAgIC8qIGV4ZWN1dGVtYW55KCkgKi8KKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyIsICZvcGVyYXRpb24sICZzZWNvbmRfYXJndW1lbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsgCisgICAgICAgIH0KKworICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG9wZXJhdGlvbikgJiYgIVB5VW5pY29kZV9DaGVjayhvcGVyYXRpb24pKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm9wZXJhdGlvbiBwYXJhbWV0ZXIgbXVzdCBiZSBzdHIgb3IgdW5pY29kZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoUHlJdGVyX0NoZWNrKHNlY29uZF9hcmd1bWVudCkpIHsKKyAgICAgICAgICAgIC8qIGl0ZXJhdG9yICovCisgICAgICAgICAgICBQeV9JTkNSRUYoc2Vjb25kX2FyZ3VtZW50KTsKKyAgICAgICAgICAgIHBhcmFtZXRlcnNfaXRlciA9IHNlY29uZF9hcmd1bWVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHNlcXVlbmNlICovCisgICAgICAgICAgICBwYXJhbWV0ZXJzX2l0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlY29uZF9hcmd1bWVudCk7CisgICAgICAgICAgICBpZiAoIXBhcmFtZXRlcnNfaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGV4ZWN1dGUoKSAqLworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyIsICZvcGVyYXRpb24sICZzZWNvbmRfYXJndW1lbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsgCisgICAgICAgIH0KKworICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG9wZXJhdGlvbikgJiYgIVB5VW5pY29kZV9DaGVjayhvcGVyYXRpb24pKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm9wZXJhdGlvbiBwYXJhbWV0ZXIgbXVzdCBiZSBzdHIgb3IgdW5pY29kZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBwYXJhbWV0ZXJzX2xpc3QgPSBQeUxpc3RfTmV3KDApOworICAgICAgICBpZiAoIXBhcmFtZXRlcnNfbGlzdCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2Vjb25kX2FyZ3VtZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNlY29uZF9hcmd1bWVudCA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICAgICAgaWYgKCFzZWNvbmRfYXJndW1lbnQpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKHNlY29uZF9hcmd1bWVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQocGFyYW1ldGVyc19saXN0LCBzZWNvbmRfYXJndW1lbnQpICE9IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWNvbmRfYXJndW1lbnQpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoc2Vjb25kX2FyZ3VtZW50KTsKKworICAgICAgICBwYXJhbWV0ZXJzX2l0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHBhcmFtZXRlcnNfbGlzdCk7CisgICAgICAgIGlmICghcGFyYW1ldGVyc19pdGVyKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNlbGYtPnN0YXRlbWVudCAhPSBOVUxMKSB7CisgICAgICAgIC8qIFRoZXJlIGlzIGFuIGFjdGl2ZSBzdGF0ZW1lbnQgKi8KKyAgICAgICAgcmMgPSBzdGF0ZW1lbnRfcmVzZXQoc2VsZi0+c3RhdGVtZW50KTsKKyAgICB9CisKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sob3BlcmF0aW9uKSkgeworICAgICAgICBvcGVyYXRpb25fY3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9wZXJhdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3BlcmF0aW9uX2J5dGVzdHIgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKG9wZXJhdGlvbik7CisgICAgICAgIGlmICghb3BlcmF0aW9uX2J5dGVzdHIpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBvcGVyYXRpb25fY3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9wZXJhdGlvbl9ieXRlc3RyKTsKKyAgICB9CisKKyAgICAvKiByZXNldCBkZXNjcmlwdGlvbiBhbmQgcm93Y291bnQgKi8KKyAgICBQeV9ERUNSRUYoc2VsZi0+ZGVzY3JpcHRpb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBzZWxmLT5kZXNjcmlwdGlvbiA9IFB5X05vbmU7CisKKyAgICBQeV9ERUNSRUYoc2VsZi0+cm93Y291bnQpOworICAgIHNlbGYtPnJvd2NvdW50ID0gUHlJbnRfRnJvbUxvbmcoLTFMKTsKKyAgICBpZiAoIXNlbGYtPnJvd2NvdW50KSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgc3RhdGVtZW50X3R5cGUgPSBkZXRlY3Rfc3RhdGVtZW50X3R5cGUob3BlcmF0aW9uX2NzdHIpOworICAgIGlmIChzZWxmLT5jb25uZWN0aW9uLT5iZWdpbl9zdGF0ZW1lbnQpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZW1lbnRfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfVVBEQVRFOgorICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfREVMRVRFOgorICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfSU5TRVJUOgorICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfUkVQTEFDRToKKyAgICAgICAgICAgICAgICBpZiAoIXNlbGYtPmNvbm5lY3Rpb24tPmluVHJhbnNhY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Nvbm5lY3Rpb25fYmVnaW4oc2VsZi0+Y29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX09USEVSOgorICAgICAgICAgICAgICAgIC8qIGl0J3MgYSBEREwgc3RhdGVtZW50IG9yIHNvbWV0aGluZyBzaW1pbGFyCisgICAgICAgICAgICAgICAgICAgLSB3ZSBiZXR0ZXIgQ09NTUlUIGZpcnN0IHNvIGl0IHdvcmtzIGZvciBhbGwgY2FzZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAoc2VsZi0+Y29ubmVjdGlvbi0+aW5UcmFuc2FjdGlvbikgeworICAgICAgICAgICAgICAgICAgICBmdW5jX2FyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmdW5jX2FyZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29ubmVjdGlvbl9jb21taXQoc2VsZi0+Y29ubmVjdGlvbiwgZnVuY19hcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmNfYXJncyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX1NFTEVDVDoKKyAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFByb2dyYW1taW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgY2Fubm90IGV4ZWN1dGUgU0VMRUNUIHN0YXRlbWVudHMgaW4gZXhlY3V0ZW1hbnkoKS4iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jX2FyZ3MgPSBQeVR1cGxlX05ldygxKTsKKyAgICBpZiAoIWZ1bmNfYXJncykgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeV9JTkNSRUYob3BlcmF0aW9uKTsKKyAgICBpZiAoUHlUdXBsZV9TZXRJdGVtKGZ1bmNfYXJncywgMCwgb3BlcmF0aW9uKSAhPSAwKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKHNlbGYtPnN0YXRlbWVudCkgeworICAgICAgICAodm9pZClzdGF0ZW1lbnRfcmVzZXQoc2VsZi0+c3RhdGVtZW50KTsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPnN0YXRlbWVudCk7CisgICAgfQorCisgICAgc2VsZi0+c3RhdGVtZW50ID0gKFN0YXRlbWVudCopY2FjaGVfZ2V0KHNlbGYtPmNvbm5lY3Rpb24tPnN0YXRlbWVudF9jYWNoZSwgZnVuY19hcmdzKTsKKyAgICBQeV9ERUNSRUYoZnVuY19hcmdzKTsKKworICAgIGlmICghc2VsZi0+c3RhdGVtZW50KSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKHNlbGYtPnN0YXRlbWVudC0+aW5fdXNlKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5zdGF0ZW1lbnQpOworICAgICAgICBzZWxmLT5zdGF0ZW1lbnQgPSBQeU9iamVjdF9OZXcoU3RhdGVtZW50LCAmU3RhdGVtZW50VHlwZSk7CisgICAgICAgIGlmICghc2VsZi0+c3RhdGVtZW50KSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHJjID0gc3RhdGVtZW50X2NyZWF0ZShzZWxmLT5zdGF0ZW1lbnQsIHNlbGYtPmNvbm5lY3Rpb24sIG9wZXJhdGlvbik7CisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlbWVudCA9IDA7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CisgICAgc3RhdGVtZW50X21hcmtfZGlydHkoc2VsZi0+c3RhdGVtZW50KTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHBhcmFtZXRlcnMgPSBQeUl0ZXJfTmV4dChwYXJhbWV0ZXJzX2l0ZXIpOworICAgICAgICBpZiAoIXBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGVtZW50X21hcmtfZGlydHkoc2VsZi0+c3RhdGVtZW50KTsKKworICAgICAgICBzdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXJzKHNlbGYtPnN0YXRlbWVudCwgcGFyYW1ldGVycyk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ1aWxkX3Jvd19jYXN0X21hcChzZWxmKSAhPSAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoT3BlcmF0aW9uYWxFcnJvciwgIkVycm9yIHdoaWxlIGJ1aWxkaW5nIHJvd19jYXN0X21hcCIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc2VsZi0+c3RhdGVtZW50LT5zdCwgc2VsZi0+Y29ubmVjdGlvbik7CisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfRE9ORSAmJiByYyAhPSBTUUxJVEVfUk9XKSB7CisgICAgICAgICAgICByYyA9IHN0YXRlbWVudF9yZXNldChzZWxmLT5zdGF0ZW1lbnQpOworICAgICAgICAgICAgaWYgKHJjID09IFNRTElURV9TQ0hFTUEpIHsKKyAgICAgICAgICAgICAgICByYyA9IHN0YXRlbWVudF9yZWNvbXBpbGUoc2VsZi0+c3RhdGVtZW50LCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc2VsZi0+c3RhdGVtZW50LT5zdCwgc2VsZi0+Y29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyYyA9PSBTUUxJVEVfUk9XIHx8IChyYyA9PSBTUUxJVEVfRE9ORSAmJiBzdGF0ZW1lbnRfdHlwZSA9PSBTVEFURU1FTlRfU0VMRUNUKSkgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgbnVtY29scyA9IHNxbGl0ZTNfY29sdW1uX2NvdW50KHNlbGYtPnN0YXRlbWVudC0+c3QpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgICAgICAgICAgaWYgKHNlbGYtPmRlc2NyaXB0aW9uID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZi0+ZGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAgIHNlbGYtPmRlc2NyaXB0aW9uID0gUHlUdXBsZV9OZXcobnVtY29scyk7CisgICAgICAgICAgICAgICAgaWYgKCFzZWxmLT5kZXNjcmlwdGlvbikgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtY29sczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBQeVR1cGxlX05ldyg3KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShkZXNjcmlwdG9yLCAwLCBfYnVpbGRfY29sdW1uX25hbWUoc3FsaXRlM19jb2x1bW5fbmFtZShzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKSkpOworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7IFB5VHVwbGVfU2V0SXRlbShkZXNjcmlwdG9yLCAxLCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOyBQeVR1cGxlX1NldEl0ZW0oZGVzY3JpcHRvciwgMiwgUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsgUHlUdXBsZV9TZXRJdGVtKGRlc2NyaXB0b3IsIDMsIFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7IFB5VHVwbGVfU2V0SXRlbShkZXNjcmlwdG9yLCA0LCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOyBQeVR1cGxlX1NldEl0ZW0oZGVzY3JpcHRvciwgNSwgUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsgUHlUdXBsZV9TZXRJdGVtKGRlc2NyaXB0b3IsIDYsIFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0oc2VsZi0+ZGVzY3JpcHRpb24sIGksIGRlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyYyA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgICAgICBpZiAobXVsdGlwbGUpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHJvZ3JhbW1pbmdFcnJvciwgImV4ZWN1dGVtYW55KCkgY2FuIG9ubHkgZXhlY3V0ZSBETUwgc3RhdGVtZW50cy4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZWxmLT5uZXh0X3JvdyA9IF9mZXRjaF9vbmVfcm93KHNlbGYpOworICAgICAgICB9IGVsc2UgaWYgKHJjID09IFNRTElURV9ET05FICYmICFtdWx0aXBsZSkgeworICAgICAgICAgICAgc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZi0+c3RhdGVtZW50KTsKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlbWVudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHN0YXRlbWVudF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9VUERBVEU6CisgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9ERUxFVEU6CisgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9JTlNFUlQ6CisgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9SRVBMQUNFOgorICAgICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgICAgICByb3djb3VudCArPSAobG9uZylzcWxpdGUzX2NoYW5nZXMoc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOworICAgICAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYtPnJvd2NvdW50KTsKKyAgICAgICAgICAgICAgICBzZWxmLT5yb3djb3VudCA9IFB5SW50X0Zyb21Mb25nKHJvd2NvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5sYXN0cm93aWQpOworICAgICAgICBpZiAoc3RhdGVtZW50X3R5cGUgPT0gU1RBVEVNRU5UX0lOU0VSVCkgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgbGFzdHJvd2lkID0gc3FsaXRlM19sYXN0X2luc2VydF9yb3dpZChzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgc2VsZi0+bGFzdHJvd2lkID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbGFzdHJvd2lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIHNlbGYtPmxhc3Ryb3dpZCA9IFB5X05vbmU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobXVsdGlwbGUpIHsKKyAgICAgICAgICAgIHJjID0gc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgUHlfWERFQ1JFRihwYXJhbWV0ZXJzKTsKKyAgICB9CisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYob3BlcmF0aW9uX2J5dGVzdHIpOworICAgIFB5X1hERUNSRUYocGFyYW1ldGVycyk7CisgICAgUHlfWERFQ1JFRihwYXJhbWV0ZXJzX2l0ZXIpOworICAgIFB5X1hERUNSRUYocGFyYW1ldGVyc19saXN0KTsKKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKKyAgICB9Cit9CisKK1B5T2JqZWN0KiBjdXJzb3JfZXhlY3V0ZShDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIHJldHVybiBfcXVlcnlfZXhlY3V0ZShzZWxmLCAwLCBhcmdzKTsKK30KKworUHlPYmplY3QqIGN1cnNvcl9leGVjdXRlbWFueShDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIHJldHVybiBfcXVlcnlfZXhlY3V0ZShzZWxmLCAxLCBhcmdzKTsKK30KKworUHlPYmplY3QqIGN1cnNvcl9leGVjdXRlc2NyaXB0KEN1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgUHlPYmplY3QqIHNjcmlwdF9vYmo7CisgICAgUHlPYmplY3QqIHNjcmlwdF9zdHIgPSBOVUxMOworICAgIGNvbnN0IGNoYXIqIHNjcmlwdF9jc3RyOworICAgIHNxbGl0ZTNfc3RtdCogc3RhdGVtZW50OworICAgIGludCByYzsKKyAgICBQeU9iamVjdCogZnVuY19hcmdzOworICAgIFB5T2JqZWN0KiByZXN1bHQ7CisgICAgaW50IHN0YXRlbWVudF9jb21wbGV0ZWQgPSAwOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIiwgJnNjcmlwdF9vYmopKSB7CisgICAgICAgIHJldHVybiBOVUxMOyAKKyAgICB9CisKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmLT5jb25uZWN0aW9uKSB8fCAhY2hlY2tfY29ubmVjdGlvbihzZWxmLT5jb25uZWN0aW9uKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc2NyaXB0X29iaikpIHsKKyAgICAgICAgc2NyaXB0X2NzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhzY3JpcHRfb2JqKTsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzY3JpcHRfb2JqKSkgeworICAgICAgICBzY3JpcHRfc3RyID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhzY3JpcHRfb2JqKTsKKyAgICAgICAgaWYgKCFzY3JpcHRfc3RyKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHNjcmlwdF9jc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoc2NyaXB0X3N0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzY3JpcHQgYXJndW1lbnQgbXVzdCBiZSB1bmljb2RlIG9yIHN0cmluZy4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogY29tbWl0IGZpcnN0ICovCisgICAgZnVuY19hcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgaWYgKCFmdW5jX2FyZ3MpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcmVzdWx0ID0gY29ubmVjdGlvbl9jb21taXQoc2VsZi0+Y29ubmVjdGlvbiwgZnVuY19hcmdzKTsKKyAgICBQeV9ERUNSRUYoZnVuY19hcmdzKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghc3FsaXRlM19jb21wbGV0ZShzY3JpcHRfY3N0cikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudF9jb21wbGV0ZWQgPSAxOworCisgICAgICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmNvbm5lY3Rpb24tPmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfY3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRfY3N0cik7CisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgLyogZXhlY3V0ZSBzdGF0ZW1lbnQsIGFuZCBpZ25vcmUgcmVzdWx0cyBvZiBTRUxFQ1Qgc3RhdGVtZW50cyAqLworICAgICAgICByYyA9IFNRTElURV9ST1c7CisgICAgICAgIHdoaWxlIChyYyA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgICAgICByYyA9IF9zcWxpdGVfc3RlcF93aXRoX2J1c3loYW5kbGVyKHN0YXRlbWVudCwgc2VsZi0+Y29ubmVjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmMgIT0gU1FMSVRFX0RPTkUpIHsKKyAgICAgICAgICAgICh2b2lkKXNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKHNjcmlwdF9zdHIpOworCisgICAgaWYgKCFzdGF0ZW1lbnRfY29tcGxldGVkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQcm9ncmFtbWluZ0Vycm9yLCAieW91IGRpZCBub3QgcHJvdmlkZSBhIGNvbXBsZXRlIFNRTCBzdGF0ZW1lbnQiKTsKKyAgICB9CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CisgICAgfQorfQorCitQeU9iamVjdCogY3Vyc29yX2dldGl0ZXIoQ3Vyc29yICpzZWxmKQoreworICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOworfQorCitQeU9iamVjdCogY3Vyc29yX2l0ZXJuZXh0KEN1cnNvciAqc2VsZikKK3sKKyAgICBQeU9iamVjdCogbmV4dF9yb3dfdHVwbGU7CisgICAgUHlPYmplY3QqIG5leHRfcm93OworICAgIGludCByYzsKKworICAgIGlmICghY2hlY2tfdGhyZWFkKHNlbGYtPmNvbm5lY3Rpb24pIHx8ICFjaGVja19jb25uZWN0aW9uKHNlbGYtPmNvbm5lY3Rpb24pKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghc2VsZi0+bmV4dF9yb3cpIHsKKyAgICAgICAgIGlmIChzZWxmLT5zdGF0ZW1lbnQpIHsKKyAgICAgICAgICAgICh2b2lkKXN0YXRlbWVudF9yZXNldChzZWxmLT5zdGF0ZW1lbnQpOworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgICAgICBzZWxmLT5zdGF0ZW1lbnQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG5leHRfcm93X3R1cGxlID0gc2VsZi0+bmV4dF9yb3c7CisgICAgc2VsZi0+bmV4dF9yb3cgPSBOVUxMOworCisgICAgaWYgKHNlbGYtPnJvd19mYWN0b3J5ICE9IFB5X05vbmUpIHsKKyAgICAgICAgbmV4dF9yb3cgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+cm93X2ZhY3RvcnksICJPTyIsIHNlbGYsIG5leHRfcm93X3R1cGxlKTsKKyAgICAgICAgUHlfREVDUkVGKG5leHRfcm93X3R1cGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXh0X3JvdyA9IG5leHRfcm93X3R1cGxlOworICAgIH0KKworICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc2VsZi0+c3RhdGVtZW50LT5zdCwgc2VsZi0+Y29ubmVjdGlvbik7CisgICAgaWYgKHJjICE9IFNRTElURV9ET05FICYmIHJjICE9IFNRTElURV9ST1cpIHsKKyAgICAgICAgUHlfREVDUkVGKG5leHRfcm93KTsKKyAgICAgICAgX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHJjID09IFNRTElURV9ST1cpIHsKKyAgICAgICAgc2VsZi0+bmV4dF9yb3cgPSBfZmV0Y2hfb25lX3JvdyhzZWxmKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV4dF9yb3c7Cit9CisKK1B5T2JqZWN0KiBjdXJzb3JfZmV0Y2hvbmUoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBQeU9iamVjdCogcm93OworCisgICAgcm93ID0gY3Vyc29yX2l0ZXJuZXh0KHNlbGYpOworICAgIGlmICghcm93ICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorCisgICAgcmV0dXJuIHJvdzsKK30KKworUHlPYmplY3QqIGN1cnNvcl9mZXRjaG1hbnkoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBQeU9iamVjdCogcm93OworICAgIFB5T2JqZWN0KiBsaXN0OworICAgIGludCBtYXhyb3dzID0gc2VsZi0+YXJyYXlzaXplOworICAgIGludCBjb3VudGVyID0gMDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGkiLCAmbWF4cm93cykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7IAorICAgIH0KKworICAgIGxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgIGlmICghbGlzdCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBqdXN0IG1ha2Ugc3VyZSB3ZSBlbnRlciB0aGUgbG9vcCAqLworICAgIHJvdyA9IFB5X05vbmU7CisKKyAgICB3aGlsZSAocm93KSB7CisgICAgICAgIHJvdyA9IGN1cnNvcl9pdGVybmV4dChzZWxmKTsKKyAgICAgICAgaWYgKHJvdykgeworICAgICAgICAgICAgUHlMaXN0X0FwcGVuZChsaXN0LCByb3cpOworICAgICAgICAgICAgUHlfREVDUkVGKHJvdyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgrK2NvdW50ZXIgPT0gbWF4cm93cykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KK30KKworUHlPYmplY3QqIGN1cnNvcl9mZXRjaGFsbChDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIFB5T2JqZWN0KiByb3c7CisgICAgUHlPYmplY3QqIGxpc3Q7CisKKyAgICBsaXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoIWxpc3QpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyoganVzdCBtYWtlIHN1cmUgd2UgZW50ZXIgdGhlIGxvb3AgKi8KKyAgICByb3cgPSAoUHlPYmplY3QqKVB5X05vbmU7CisKKyAgICB3aGlsZSAocm93KSB7CisgICAgICAgIHJvdyA9IGN1cnNvcl9pdGVybmV4dChzZWxmKTsKKyAgICAgICAgaWYgKHJvdykgeworICAgICAgICAgICAgUHlMaXN0X0FwcGVuZChsaXN0LCByb3cpOworICAgICAgICAgICAgUHlfREVDUkVGKHJvdyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KK30KKworUHlPYmplY3QqIHB5c3FsaXRlX25vb3AoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgLyogZG9uJ3QgY2FyZSwgcmV0dXJuIE5vbmUgKi8KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK1B5T2JqZWN0KiBjdXJzb3JfY2xvc2UoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmLT5jb25uZWN0aW9uKSB8fCAhY2hlY2tfY29ubmVjdGlvbihzZWxmLT5jb25uZWN0aW9uKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+c3RhdGVtZW50KSB7CisgICAgICAgICh2b2lkKXN0YXRlbWVudF9yZXNldChzZWxmLT5zdGF0ZW1lbnQpOworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+c3RhdGVtZW50KTsKKyAgICAgICAgc2VsZi0+c3RhdGVtZW50ID0gMDsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBQeU1ldGhvZERlZiBjdXJzb3JfbWV0aG9kc1tdID0geworICAgIHsiZXhlY3V0ZSIsIChQeUNGdW5jdGlvbiljdXJzb3JfZXhlY3V0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIkV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4iKX0sCisgICAgeyJleGVjdXRlbWFueSIsIChQeUNGdW5jdGlvbiljdXJzb3JfZXhlY3V0ZW1hbnksIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJSZXBlYXRlZGx5IGV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4iKX0sCisgICAgeyJleGVjdXRlc2NyaXB0IiwgKFB5Q0Z1bmN0aW9uKWN1cnNvcl9leGVjdXRlc2NyaXB0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiRXhlY3V0ZXMgYSBtdWx0aXBsZSBTUUwgc3RhdGVtZW50cyBhdCBvbmNlLiBOb24tc3RhbmRhcmQuIil9LAorICAgIHsiZmV0Y2hvbmUiLCAoUHlDRnVuY3Rpb24pY3Vyc29yX2ZldGNob25lLCBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJGZXRjaGVzIHNldmVyYWwgcm93cyBmcm9tIHRoZSByZXN1bHRzZXQuIil9LAorICAgIHsiZmV0Y2htYW55IiwgKFB5Q0Z1bmN0aW9uKWN1cnNvcl9mZXRjaG1hbnksIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJGZXRjaGVzIGFsbCByb3dzIGZyb20gdGhlIHJlc3VsdHNldC4iKX0sCisgICAgeyJmZXRjaGFsbCIsIChQeUNGdW5jdGlvbiljdXJzb3JfZmV0Y2hhbGwsIE1FVEhfTk9BUkdTLAorICAgICAgICBQeURvY19TVFIoIkZldGNoZXMgb25lIHJvdyBmcm9tIHRoZSByZXN1bHRzZXQuIil9LAorICAgIHsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pY3Vyc29yX2Nsb3NlLCBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJDbG9zZXMgdGhlIGN1cnNvci4iKX0sCisgICAgeyJzZXRpbnB1dHNpemVzIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX25vb3AsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJSZXF1aXJlZCBieSBEQi1BUEkuIERvZXMgbm90aGluZyBpbiBweXNxbGl0ZS4iKX0sCisgICAgeyJzZXRvdXRwdXRzaXplIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX25vb3AsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJSZXF1aXJlZCBieSBEQi1BUEkuIERvZXMgbm90aGluZyBpbiBweXNxbGl0ZS4iKX0sCisgICAge05VTEwsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IFB5TWVtYmVyRGVmIGN1cnNvcl9tZW1iZXJzW10gPQoreworICAgIHsiY29ubmVjdGlvbiIsIFRfT0JKRUNULCBvZmZzZXRvZihDdXJzb3IsIGNvbm5lY3Rpb24pLCBST30sCisgICAgeyJkZXNjcmlwdGlvbiIsIFRfT0JKRUNULCBvZmZzZXRvZihDdXJzb3IsIGRlc2NyaXB0aW9uKSwgUk99LAorICAgIHsiYXJyYXlzaXplIiwgVF9JTlQsIG9mZnNldG9mKEN1cnNvciwgYXJyYXlzaXplKSwgMH0sCisgICAgeyJsYXN0cm93aWQiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ3Vyc29yLCBsYXN0cm93aWQpLCBST30sCisgICAgeyJyb3djb3VudCIsIFRfT0JKRUNULCBvZmZzZXRvZihDdXJzb3IsIHJvd2NvdW50KSwgUk99LAorICAgIHsicm93X2ZhY3RvcnkiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ3Vyc29yLCByb3dfZmFjdG9yeSksIDB9LAorICAgIHtOVUxMfQorfTsKKworUHlUeXBlT2JqZWN0IEN1cnNvclR5cGUgPSB7CisgICAgICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCisgICAgICAgIE1PRFVMRV9OQU1FICIuQ3Vyc29yIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAgICAgc2l6ZW9mKEN1cnNvciksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgICAgIChkZXN0cnVjdG9yKWN1cnNvcl9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19IQVZFX0lURVJ8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgICAgIChnZXRpdGVyZnVuYyljdXJzb3JfZ2V0aXRlciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAgICAgKGl0ZXJuZXh0ZnVuYyljdXJzb3JfaXRlcm5leHQsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAgICAgY3Vyc29yX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgICAgICBjdXJzb3JfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgICAgIChpbml0cHJvYyljdXJzb3JfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KK307CisKK2V4dGVybiBpbnQgY3Vyc29yX3NldHVwX3R5cGVzKHZvaWQpCit7CisgICAgQ3Vyc29yVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICByZXR1cm4gUHlUeXBlX1JlYWR5KCZDdXJzb3JUeXBlKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuaCBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjU2Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIGN1cnNvci5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBjdXJzb3IgdHlwZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpZm5kZWYgUFlTUUxJVEVfQ1VSU09SX0gKKyNkZWZpbmUgUFlTUUxJVEVfQ1VSU09SX0gKKyNpbmNsdWRlICJQeXRob24uaCIKKworI2luY2x1ZGUgInN0YXRlbWVudC5oIgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ29ubmVjdGlvbiogY29ubmVjdGlvbjsKKyAgICBQeU9iamVjdCogZGVzY3JpcHRpb247CisgICAgUHlPYmplY3QqIHJvd19jYXN0X21hcDsKKyAgICBpbnQgYXJyYXlzaXplOworICAgIFB5T2JqZWN0KiBsYXN0cm93aWQ7CisgICAgUHlPYmplY3QqIHJvd2NvdW50OworICAgIFB5T2JqZWN0KiByb3dfZmFjdG9yeTsKKyAgICBTdGF0ZW1lbnQqIHN0YXRlbWVudDsKKworICAgIC8qIHRoZSBuZXh0IHJvdyB0byBiZSByZXR1cm5lZCwgTlVMTCBpZiBubyBuZXh0IHJvdyBhdmFpbGFibGUgKi8KKyAgICBQeU9iamVjdCogbmV4dF9yb3c7Cit9IEN1cnNvcjsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBTVEFURU1FTlRfSU5WQUxJRCwgU1RBVEVNRU5UX0lOU0VSVCwgU1RBVEVNRU5UX0RFTEVURSwKKyAgICBTVEFURU1FTlRfVVBEQVRFLCBTVEFURU1FTlRfUkVQTEFDRSwgU1RBVEVNRU5UX1NFTEVDVCwKKyAgICBTVEFURU1FTlRfT1RIRVIKK30gU3RhdGVtZW50S2luZDsKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBDdXJzb3JUeXBlOworCitpbnQgY3Vyc29yX2luaXQoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7Cit2b2lkIGN1cnNvcl9kZWFsbG9jKEN1cnNvciogc2VsZik7CitQeU9iamVjdCogY3Vyc29yX2V4ZWN1dGUoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitQeU9iamVjdCogY3Vyc29yX2V4ZWN1dGVtYW55KEN1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIGN1cnNvcl9nZXRpdGVyKEN1cnNvciAqc2VsZik7CitQeU9iamVjdCogY3Vyc29yX2l0ZXJuZXh0KEN1cnNvciAqc2VsZik7CitQeU9iamVjdCogY3Vyc29yX2ZldGNob25lKEN1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIGN1cnNvcl9mZXRjaG1hbnkoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitQeU9iamVjdCogY3Vyc29yX2ZldGNoYWxsKEN1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIHB5c3FsaXRlX25vb3AoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIGN1cnNvcl9jbG9zZShDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKKworaW50IGN1cnNvcl9zZXR1cF90eXBlcyh2b2lkKTsKKworI2RlZmluZSBVTktOT1dOICgtMSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL21pY3JvcHJvdG9jb2xzLmMgYi9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTU2YWMwCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21pY3JvcHJvdG9jb2xzLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qIG1pY3JvcHJvdG9jb2xzLmMgLSBtaW5pbWFsaXN0IGFuZCBub24tdmFsaWRhdGluZyBwcm90b2NvbHMgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBGZWRlcmljbyBEaSBHcmVnb3JpbyA8Zm9nQGRlYmlhbi5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHN5Y29wZyBhbmQgd2FzIGFkYXB0ZWQgZm9yIHB5c3FsaXRlLiBGZWRlcmljbyBEaQorICogR3JlZ29yaW8gZ2F2ZSB0aGUgcGVybWlzc2lvbiB0byB1c2UgaXQgd2l0aGluIHB5c3FsaXRlIHVuZGVyIHRoZSBmb2xsb3dpbmcKKyAqIGxpY2Vuc2U6CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSA8c3RydWN0bWVtYmVyLmg+CisKKyNpbmNsdWRlICJjdXJzb3IuaCIKKyNpbmNsdWRlICJtaWNyb3Byb3RvY29scy5oIgorI2luY2x1ZGUgInByZXBhcmVfcHJvdG9jb2wuaCIKKworCisvKiogdGhlIGFkYXB0ZXJzIHJlZ2lzdHJ5ICoqLworCitQeU9iamVjdCAqcHN5Y29fYWRhcHRlcnM7CisKKy8qIG1pY3JvcHJvdG9jb2xzX2luaXQgLSBpbml0aWFsaXplIHRoZSBhZGFwdGVycyBkaWN0aW9uYXJ5ICovCisKK2ludAorbWljcm9wcm90b2NvbHNfaW5pdChQeU9iamVjdCAqZGljdCkKK3sKKyAgICAvKiBjcmVhdGUgYWRhcHRlcnMgZGljdGlvbmFyeSBhbmQgcHV0IGl0IGluIG1vZHVsZSBuYW1lc3BhY2UgKi8KKyAgICBpZiAoKHBzeWNvX2FkYXB0ZXJzID0gUHlEaWN0X05ldygpKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgImFkYXB0ZXJzIiwgcHN5Y29fYWRhcHRlcnMpOworfQorCisKKy8qIG1pY3JvcHJvdG9jb2xzX2FkZCAtIGFkZCBhIHJldmVyc2UgdHlwZS1jYXN0ZXIgdG8gdGhlIGRpY3Rpb25hcnkgKi8KKworaW50CittaWNyb3Byb3RvY29sc19hZGQoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqcHJvdG8sIFB5T2JqZWN0ICpjYXN0KQoreworICAgIFB5T2JqZWN0KiBrZXk7CisgICAgaW50IHJjOworCisgICAgaWYgKHByb3RvID09IE5VTEwpIHByb3RvID0gKFB5T2JqZWN0KikmU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZTsKKworICAgIGtleSA9IFB5X0J1aWxkVmFsdWUoIihPTykiLCAoUHlPYmplY3QqKXR5cGUsIHByb3RvKTsKKyAgICBpZiAoIWtleSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmMgPSBQeURpY3RfU2V0SXRlbShwc3ljb19hZGFwdGVycywga2V5LCBjYXN0KTsKKyAgICBQeV9ERUNSRUYoa2V5KTsKKworICAgIHJldHVybiByYzsKK30KKworLyogbWljcm9wcm90b2NvbHNfYWRhcHQgLSBhZGFwdCBhbiBvYmplY3QgdG8gdGhlIGJ1aWx0LWluIHByb3RvY29sICovCisKK1B5T2JqZWN0ICoKK21pY3JvcHJvdG9jb2xzX2FkYXB0KFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICpwcm90bywgUHlPYmplY3QgKmFsdCkKK3sKKyAgICBQeU9iamVjdCAqYWRhcHRlciwgKmtleTsKKworICAgIC8qIHdlIGRvbid0IGNoZWNrIGZvciBleGFjdCB0eXBlIGNvbmZvcm1hbmNlIGFzIHNwZWNpZmllZCBpbiBQRVAgMjQ2CisgICAgICAgYmVjYXVzZSB0aGUgU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZSB0eXBlIGlzIGFic3RyYWN0IGFuZCB0aGVyZSBpcyBubworICAgICAgIHdheSB0byBnZXQgYSBxdW90YWJsZSBvYmplY3QgdG8gYmUgaXRzIGluc3RhbmNlICovCisKKyAgICAvKiBsb29rIGZvciBhbiBhZGFwdGVyIGluIHRoZSByZWdpc3RyeSAqLworICAgIGtleSA9IFB5X0J1aWxkVmFsdWUoIihPTykiLCAoUHlPYmplY3QqKW9iai0+b2JfdHlwZSwgcHJvdG8pOworICAgIGlmICgha2V5KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhZGFwdGVyID0gUHlEaWN0X0dldEl0ZW0ocHN5Y29fYWRhcHRlcnMsIGtleSk7CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgaWYgKGFkYXB0ZXIpIHsKKyAgICAgICAgUHlPYmplY3QgKmFkYXB0ZWQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGFkYXB0ZXIsIG9iaiwgTlVMTCk7CisgICAgICAgIHJldHVybiBhZGFwdGVkOworICAgIH0KKworICAgIC8qIHRyeSB0byBoYXZlIHRoZSBwcm90b2NvbCBhZGFwdCB0aGlzIG9iamVjdCovCisgICAgaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcocHJvdG8sICJfX2FkYXB0X18iKSkgeworICAgICAgICBQeU9iamVjdCAqYWRhcHRlZCA9IFB5T2JqZWN0X0NhbGxNZXRob2QocHJvdG8sICJfX2FkYXB0X18iLCAiTyIsIG9iaik7CisgICAgICAgIGlmIChhZGFwdGVkKSB7CisgICAgICAgICAgICBpZiAoYWRhcHRlZCAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhZGFwdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpICYmICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBhbmQgZmluYWxseSB0cnkgdG8gaGF2ZSB0aGUgb2JqZWN0IGFkYXB0IGl0c2VsZiAqLworICAgIGlmIChQeU9iamVjdF9IYXNBdHRyU3RyaW5nKG9iaiwgIl9fY29uZm9ybV9fIikpIHsKKyAgICAgICAgUHlPYmplY3QgKmFkYXB0ZWQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG9iaiwgIl9fY29uZm9ybV9fIiwiTyIsIHByb3RvKTsKKyAgICAgICAgaWYgKGFkYXB0ZWQpIHsKKyAgICAgICAgICAgIGlmIChhZGFwdGVkICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRhcHRlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFkYXB0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkgJiYgIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBlbHNlIHNldCB0aGUgcmlnaHQgZXhjZXB0aW9uIGFuZCByZXR1cm4gTlVMTCAqLworICAgIFB5RXJyX1NldFN0cmluZyhQcm9ncmFtbWluZ0Vycm9yLCAiY2FuJ3QgYWRhcHQiKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqIG1vZHVsZS1sZXZlbCBmdW5jdGlvbnMgKiovCisKK1B5T2JqZWN0ICoKK3BzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0KEN1cnNvciAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlPYmplY3QgKm9iaiwgKmFsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnByb3RvID0gKFB5T2JqZWN0KikmU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPTyIsICZvYmosICZwcm90bywgJmFsdCkpIHJldHVybiBOVUxMOworICAgIHJldHVybiBtaWNyb3Byb3RvY29sc19hZGFwdChvYmosIHByb3RvLCBhbHQpOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL21pY3JvcHJvdG9jb2xzLmggYi9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmQ5YjY1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21pY3JvcHJvdG9jb2xzLmgKQEAgLTAsMCArMSw1OSBAQAorLyogbWljcm9wcm90b2NvbHMuYyAtIGRlZmluaXRpb25zIGZvciBtaW5pbWFsaXN0IGFuZCBub24tdmFsaWRhdGluZyBwcm90b2NvbHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBGZWRlcmljbyBEaSBHcmVnb3JpbyA8Zm9nQGRlYmlhbi5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHN5Y29wZyBhbmQgd2FzIGFkYXB0ZWQgZm9yIHB5c3FsaXRlLiBGZWRlcmljbyBEaQorICogR3JlZ29yaW8gZ2F2ZSB0aGUgcGVybWlzc2lvbiB0byB1c2UgaXQgd2l0aGluIHB5c3FsaXRlIHVuZGVyIHRoZSBmb2xsb3dpbmcKKyAqIGxpY2Vuc2U6CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFBTWUNPUEdfTUlDUk9QUk9UT0NPTFNfSAorI2RlZmluZSBQU1lDT1BHX01JQ1JPUFJPVE9DT0xTX0ggMQorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIGFkYXB0ZXJzIHJlZ2lzdHJ5ICoqLworCitleHRlcm4gUHlPYmplY3QgKnBzeWNvX2FkYXB0ZXJzOworCisvKiogdGhlIG5hbWVzIG9mIHRoZSB0aHJlZSBtYW5kYXRvcnkgbWV0aG9kcyAqKi8KKworI2RlZmluZSBNSUNST1BST1RPQ09MU19HRVRRVU9URURfTkFNRSAiZ2V0cXVvdGVkIgorI2RlZmluZSBNSUNST1BST1RPQ09MU19HRVRTVFJJTkdfTkFNRSAiZ2V0c3RyaW5nIgorI2RlZmluZSBNSUNST1BST1RPQ09MU19HRVRCSU5BUllfTkFNRSAiZ2V0YmluYXJ5IgorCisvKiogZXhwb3J0ZWQgZnVuY3Rpb25zICoqLworCisvKiB1c2VkIGJ5IG1vZHVsZS5jIHRvIGluaXQgdGhlIG1pY3JvcHJvdG9jb2xzIHN5c3RlbSAqLworZXh0ZXJuIGludCBtaWNyb3Byb3RvY29sc19pbml0KFB5T2JqZWN0ICpkaWN0KTsKK2V4dGVybiBpbnQgbWljcm9wcm90b2NvbHNfYWRkKAorICAgIFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnByb3RvLCBQeU9iamVjdCAqY2FzdCk7CitleHRlcm4gUHlPYmplY3QgKm1pY3JvcHJvdG9jb2xzX2FkYXB0KAorICAgIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICpwcm90bywgUHlPYmplY3QgKmFsdCk7CisKK2V4dGVybiBQeU9iamVjdCAqCisgICAgcHN5Y29fbWljcm9wcm90b2NvbHNfYWRhcHQoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCAqYXJncyk7ICAgCisjZGVmaW5lIHBzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0X2RvYyBcCisgICAgImFkYXB0KG9iaiwgcHJvdG9jb2wsIGFsdGVybmF0ZSkgLT4gYWRhcHQgb2JqIHRvIGdpdmVuIHByb3RvY29sIgorICAgIAorI2VuZGlmIC8qICFkZWZpbmVkKFBTWUNPUEdfTUlDUk9QUk9UT0NPTFNfSCkgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTM3ZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCkBAIC0wLDAgKzEsMzI1IEBACisvKiBtb2R1bGUuYyAtIHRoZSBtb2R1bGUgaXRzZWxmCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJzdGF0ZW1lbnQuaCIKKyNpbmNsdWRlICJjdXJzb3IuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInByZXBhcmVfcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJtaWNyb3Byb3RvY29scy5oIgorI2luY2x1ZGUgInJvdy5oIgorCisjaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDMwMDMKKyNkZWZpbmUgSEFWRV9TSEFSRURfQ0FDSEUKKyNlbmRpZgorCisvKiBzdGF0aWMgb2JqZWN0cyBhdCBtb2R1bGUtbGV2ZWwgKi8KKworUHlPYmplY3QqIEVycm9yLCAqV2FybmluZywgKkludGVyZmFjZUVycm9yLCAqRGF0YWJhc2VFcnJvciwgKkludGVybmFsRXJyb3IsCisgICAgKk9wZXJhdGlvbmFsRXJyb3IsICpQcm9ncmFtbWluZ0Vycm9yLCAqSW50ZWdyaXR5RXJyb3IsICpEYXRhRXJyb3IsCisgICAgKk5vdFN1cHBvcnRlZEVycm9yLCAqT3B0aW1pemVkVW5pY29kZTsKKworUHlPYmplY3QqIGNvbnZlcnRlcnM7CisKK3N0YXRpYyBQeU9iamVjdCogbW9kdWxlX2Nvbm5lY3QoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKKyAgICAgICAga3dhcmdzKQoreworICAgIC8qIFB5dGhvbiBzZWVtcyB0byBoYXZlIG5vIHdheSBvZiBleHRyYWN0aW5nIGEgc2luZ2xlIGtleXdvcmQtYXJnIGF0CisgICAgICogQy1sZXZlbCwgc28gdGhpcyBjb2RlIGlzIHJlZHVuZGFudCB3aXRoIHRoZSBvbmUgaW4gY29ubmVjdGlvbl9pbml0IGluCisgICAgICogY29ubmVjdGlvbi5jIGFuZCBtdXN0IGFsd2F5cyBiZSBjb3BpZWQgZnJvbSB0aGVyZSAuLi4gKi8KKworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YWJhc2UiLCAidGltZW91dCIsICJkZXRlY3RfdHlwZXMiLCAiaXNvbGF0aW9uX2xldmVsIiwgImNoZWNrX3NhbWVfdGhyZWFkIiwgImZhY3RvcnkiLCAiY2FjaGVkX3N0YXRlbWVudHMiLCBOVUxMLCBOVUxMfTsKKyAgICBjaGFyKiBkYXRhYmFzZTsKKyAgICBpbnQgZGV0ZWN0X3R5cGVzID0gMDsKKyAgICBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsOworICAgIFB5T2JqZWN0KiBmYWN0b3J5ID0gTlVMTDsKKyAgICBpbnQgY2hlY2tfc2FtZV90aHJlYWQgPSAxOworICAgIGludCBjYWNoZWRfc3RhdGVtZW50czsKKyAgICBkb3VibGUgdGltZW91dCA9IDUuMDsKKworICAgIFB5T2JqZWN0KiByZXN1bHQ7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzfGRpT2lPaSIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWJhc2UsICZ0aW1lb3V0LCAmZGV0ZWN0X3R5cGVzLCAmaXNvbGF0aW9uX2xldmVsLCAmY2hlY2tfc2FtZV90aHJlYWQsICZmYWN0b3J5LCAmY2FjaGVkX3N0YXRlbWVudHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7IAorICAgIH0KKworICAgIGlmIChmYWN0b3J5ID09IE5VTEwpIHsKKyAgICAgICAgZmFjdG9yeSA9IChQeU9iamVjdCopJkNvbm5lY3Rpb25UeXBlOworICAgIH0KKworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoZmFjdG9yeSwgYXJncywga3dhcmdzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogbW9kdWxlX2NvbXBsZXRlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqCisgICAgICAgIGt3YXJncykKK3sKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InN0YXRlbWVudCIsIE5VTEwsIE5VTEx9OworICAgIGNoYXIqIHN0YXRlbWVudDsKKworICAgIFB5T2JqZWN0KiByZXN1bHQ7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzIiwga3dsaXN0LCAmc3RhdGVtZW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOyAKKyAgICB9CisKKyAgICBpZiAoc3FsaXRlM19jb21wbGV0ZShzdGF0ZW1lbnQpKSB7CisgICAgICAgIHJlc3VsdCA9IFB5X1RydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlfRmFsc2U7CisgICAgfQorCisgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgSEFWRV9TSEFSRURfQ0FDSEUKK3N0YXRpYyBQeU9iamVjdCogbW9kdWxlX2VuYWJsZV9zaGFyZWRfY2FjaGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKKyAgICAgICAga3dhcmdzKQoreworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZG9fZW5hYmxlIiwgTlVMTCwgTlVMTH07CisgICAgaW50IGRvX2VuYWJsZTsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpIiwga3dsaXN0LCAmZG9fZW5hYmxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOyAKKyAgICB9CisKKyAgICByYyA9IHNxbGl0ZTNfZW5hYmxlX3NoYXJlZF9jYWNoZShkb19lbmFibGUpOworCisgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoT3BlcmF0aW9uYWxFcnJvciwgIkNoYW5naW5nIHRoZSBzaGFyZWRfY2FjaGUgZmxhZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9Cit9CisjZW5kaWYgLyogSEFWRV9TSEFSRURfQ0FDSEUgKi8KKworc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfcmVnaXN0ZXJfYWRhcHRlcihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlUeXBlT2JqZWN0KiB0eXBlOworICAgIFB5T2JqZWN0KiBjYXN0ZXI7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJnR5cGUsICZjYXN0ZXIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1pY3JvcHJvdG9jb2xzX2FkZCh0eXBlLCAoUHlPYmplY3QqKSZTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlLCBjYXN0ZXIpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9yZWdpc3Rlcl9jb252ZXJ0ZXIoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIFB5T2JqZWN0KiBuYW1lOworICAgIFB5T2JqZWN0KiBjYWxsYWJsZTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmbmFtZSwgJmNhbGxhYmxlKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW0oY29udmVydGVycywgbmFtZSwgY2FsbGFibGUpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCit2b2lkIGNvbnZlcnRlcnNfaW5pdChQeU9iamVjdCogZGljdCkKK3sKKyAgICBjb252ZXJ0ZXJzID0gUHlEaWN0X05ldygpOworICAgIGlmICghY29udmVydGVycykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgImNvbnZlcnRlcnMiLCBjb252ZXJ0ZXJzKTsKK30KKworc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7CisgICAgeyJjb25uZWN0IiwgIChQeUNGdW5jdGlvbiltb2R1bGVfY29ubmVjdCwgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBQeURvY19TVFIoIkNyZWF0ZXMgYSBjb25uZWN0aW9uLiIpfSwKKyAgICB7ImNvbXBsZXRlX3N0YXRlbWVudCIsICAoUHlDRnVuY3Rpb24pbW9kdWxlX2NvbXBsZXRlLCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFB5RG9jX1NUUigiQ2hlY2tzIGlmIGEgc3RyaW5nIGNvbnRhaW5zIGEgY29tcGxldGUgU1FMIHN0YXRlbWVudC4iKX0sCisjaWZkZWYgSEFWRV9TSEFSRURfQ0FDSEUKKyAgICB7ImVuYWJsZV9zaGFyZWRfY2FjaGUiLCAgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9lbmFibGVfc2hhcmVkX2NhY2hlLCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFB5RG9jX1NUUigiRW5hYmxlIG9yIGRpc2FibGUgc2hhcmVkIGNhY2hlIG1vZGUgZm9yIHRoZSBjYWxsaW5nIHRocmVhZC4iKX0sCisjZW5kaWYKKyAgICB7InJlZ2lzdGVyX2FkYXB0ZXIiLCAoUHlDRnVuY3Rpb24pbW9kdWxlX3JlZ2lzdGVyX2FkYXB0ZXIsIE1FVEhfVkFSQVJHUywgUHlEb2NfU1RSKCJSZWdpc3RlcnMgYW4gYWRhcHRlciB3aXRoIHNxbGl0ZSdzIGFkYXB0ZXIgcmVnaXN0cnkuIil9LAorICAgIHsicmVnaXN0ZXJfY29udmVydGVyIiwgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9yZWdpc3Rlcl9jb252ZXJ0ZXIsIE1FVEhfVkFSQVJHUywgUHlEb2NfU1RSKCJSZWdpc3RlcnMgYSBjb252ZXJ0ZXIgd2l0aCBzcWxpdGUuIil9LAorICAgIHsiYWRhcHQiLCAgKFB5Q0Z1bmN0aW9uKXBzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0LCBNRVRIX1ZBUkFSR1MsIHBzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0X2RvY30sCisgICAge05VTEwsIE5VTEx9Cit9OworCitQeU1PRElOSVRfRlVOQyBpbml0X3NxbGl0ZTModm9pZCkKK3sKKyAgICBQeU9iamVjdCAqbW9kdWxlLCAqZGljdDsKKyAgICBQeU9iamVjdCAqdG1wX29iajsKKworICAgIG1vZHVsZSA9IFB5X0luaXRNb2R1bGUoIl9zcWxpdGUzIiwgbW9kdWxlX21ldGhvZHMpOworCisgICAgaWYgKCFtb2R1bGUgfHwKKyAgICAgICAgKHJvd19zZXR1cF90eXBlcygpIDwgMCkgfHwKKyAgICAgICAgKGN1cnNvcl9zZXR1cF90eXBlcygpIDwgMCkgfHwKKyAgICAgICAgKGNvbm5lY3Rpb25fc2V0dXBfdHlwZXMoKSA8IDApIHx8CisgICAgICAgIChjYWNoZV9zZXR1cF90eXBlcygpIDwgMCkgfHwKKyAgICAgICAgKHN0YXRlbWVudF9zZXR1cF90eXBlcygpIDwgMCkgfHwKKyAgICAgICAgKHByZXBhcmVfcHJvdG9jb2xfc2V0dXBfdHlwZXMoKSA8IDApCisgICAgICAgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoJkNvbm5lY3Rpb25UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ29ubmVjdGlvbiIsIChQeU9iamVjdCopICZDb25uZWN0aW9uVHlwZSk7CisgICAgUHlfSU5DUkVGKCZDdXJzb3JUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ3Vyc29yIiwgKFB5T2JqZWN0KikgJkN1cnNvclR5cGUpOworICAgIFB5X0lOQ1JFRigmQ2FjaGVUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiU3RhdGVtZW50IiwgKFB5T2JqZWN0KikmU3RhdGVtZW50VHlwZSk7CisgICAgUHlfSU5DUkVGKCZTdGF0ZW1lbnRUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ2FjaGUiLCAoUHlPYmplY3QqKSAmQ2FjaGVUeXBlKTsKKyAgICBQeV9JTkNSRUYoJlNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJQcmVwYXJlUHJvdG9jb2wiLCAoUHlPYmplY3QqKSAmU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZSk7CisgICAgUHlfSU5DUkVGKCZSb3dUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiUm93IiwgKFB5T2JqZWN0KikgJlJvd1R5cGUpOworCisgICAgaWYgKCEoZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKSkpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKioqIENyZWF0ZSBEQi1BUEkgRXhjZXB0aW9uIGhpZXJhcmNoeSAqLworCisgICAgaWYgKCEoRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5FcnJvciIsIFB5RXhjX1N0YW5kYXJkRXJyb3IsIE5VTEwpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiRXJyb3IiLCBFcnJvcik7CisKKyAgICBpZiAoIShXYXJuaW5nID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuV2FybmluZyIsIFB5RXhjX1N0YW5kYXJkRXJyb3IsIE5VTEwpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiV2FybmluZyIsIFdhcm5pbmcpOworCisgICAgLyogRXJyb3Igc3ViY2xhc3NlcyAqLworCisgICAgaWYgKCEoSW50ZXJmYWNlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5JbnRlcmZhY2VFcnJvciIsIEVycm9yLCBOVUxMKSkpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkludGVyZmFjZUVycm9yIiwgSW50ZXJmYWNlRXJyb3IpOworCisgICAgaWYgKCEoRGF0YWJhc2VFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkRhdGFiYXNlRXJyb3IiLCBFcnJvciwgTlVMTCkpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJEYXRhYmFzZUVycm9yIiwgRGF0YWJhc2VFcnJvcik7CisKKyAgICAvKiBEYXRhYmFzZUVycm9yIHN1YmNsYXNzZXMgKi8KKworICAgIGlmICghKEludGVybmFsRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5JbnRlcm5hbEVycm9yIiwgRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJJbnRlcm5hbEVycm9yIiwgSW50ZXJuYWxFcnJvcik7CisKKyAgICBpZiAoIShPcGVyYXRpb25hbEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuT3BlcmF0aW9uYWxFcnJvciIsIERhdGFiYXNlRXJyb3IsIE5VTEwpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiT3BlcmF0aW9uYWxFcnJvciIsIE9wZXJhdGlvbmFsRXJyb3IpOworCisgICAgaWYgKCEoUHJvZ3JhbW1pbmdFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLlByb2dyYW1taW5nRXJyb3IiLCBEYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIlByb2dyYW1taW5nRXJyb3IiLCBQcm9ncmFtbWluZ0Vycm9yKTsKKworICAgIGlmICghKEludGVncml0eUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuSW50ZWdyaXR5RXJyb3IiLCBEYXRhYmFzZUVycm9yLE5VTEwpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiSW50ZWdyaXR5RXJyb3IiLCBJbnRlZ3JpdHlFcnJvcik7CisKKyAgICBpZiAoIShEYXRhRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5EYXRhRXJyb3IiLCBEYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkRhdGFFcnJvciIsIERhdGFFcnJvcik7CisKKyAgICBpZiAoIShOb3RTdXBwb3J0ZWRFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLk5vdFN1cHBvcnRlZEVycm9yIiwgRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJOb3RTdXBwb3J0ZWRFcnJvciIsIE5vdFN1cHBvcnRlZEVycm9yKTsKKworICAgIC8qIFdlIGp1c3QgbmVlZCAic29tZXRoaW5nIiB1bmlxdWUgZm9yIE9wdGltaXplZFVuaWNvZGUuIEl0IGRvZXMgbm90IHJlYWxseQorICAgICAqIG5lZWQgdG8gYmUgYSBzdHJpbmcgc3ViY2xhc3MuIEp1c3QgYW55dGhpbmcgdGhhdCBjYW4gYWN0IGFzIGEgc3BlY2lhbAorICAgICAqIG1hcmtlciBmb3IgdXMuIFNvIEkgcHVsbGVkIFB5Q2VsbF9UeXBlIG91dCBvZiBteSBtYWdpYyBoYXQuCisgICAgICovCisgICAgUHlfSU5DUkVGKChQeU9iamVjdCopJlB5Q2VsbF9UeXBlKTsKKyAgICBPcHRpbWl6ZWRVbmljb2RlID0gKFB5T2JqZWN0KikmUHlDZWxsX1R5cGU7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIk9wdGltaXplZFVuaWNvZGUiLCBPcHRpbWl6ZWRVbmljb2RlKTsKKworICAgIGlmICghKHRtcF9vYmogPSBQeUludF9Gcm9tTG9uZyhQQVJTRV9ERUNMVFlQRVMpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiUEFSU0VfREVDTFRZUEVTIiwgdG1wX29iaik7CisKKyAgICBpZiAoISh0bXBfb2JqID0gUHlJbnRfRnJvbUxvbmcoUEFSU0VfQ09MTkFNRVMpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiUEFSU0VfQ09MTkFNRVMiLCB0bXBfb2JqKTsKKworICAgIGlmICghKHRtcF9vYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFBZU1FMSVRFX1ZFUlNJT04pKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAidmVyc2lvbiIsIHRtcF9vYmopOworCisgICAgaWYgKCEodG1wX29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoc3FsaXRlM19saWJ2ZXJzaW9uKCkpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAic3FsaXRlX3ZlcnNpb24iLCB0bXBfb2JqKTsKKworICAgIC8qIGluaXRpYWxpemUgbWljcm9wcm90b2NvbHMgbGF5ZXIgKi8KKyAgICBtaWNyb3Byb3RvY29sc19pbml0KGRpY3QpOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBjb252ZXJ0ZXJzICovCisgICAgY29udmVydGVyc19pbml0KGRpY3QpOworCisgICAgLyogT3JpZ2luYWwgY29tbWVudCBmb3JtIF9ic2RkYi5jIGluIHRoZSBQeXRob24gY29yZS4gVGhpcyBpcyBhbHNvIHN0aWxsCisgICAgICogbmVlZGVkIG5vd2FkYXlzIGZvciBQeXRob24gMi4zLzIuNC4KKyAgICAgKiAKKyAgICAgKiBQeUV2YWxfSW5pdFRocmVhZHMgaXMgY2FsbGVkIGhlcmUgZHVlIHRvIGEgcXVpcmsgaW4gcHl0aG9uIDEuNQorICAgICAqIC0gMi4yLjEgKGF0IGxlYXN0KSBhY2NvcmRpbmcgdG8gUnVzc2VsbCBXaWxsaWFtc29uIDxtZXJlbEB3dC5uZXQ+OgorICAgICAqIFRoZSBnbG9iYWwgaW50ZXJlcHJldGVyIGxvY2sgaXMgbm90IGluaXRpYWxpemVkIHVudGlsIHRoZSBmaXJzdAorICAgICAqIHRocmVhZCBpcyBjcmVhdGVkIHVzaW5nIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKCkgb3IgZm9yaygpIGlzCisgICAgICogY2FsbGVkLiAgdGhhdCB3b3VsZCBjYXVzZSB0aGUgQUxMT1dfVEhSRUFEUyBoZXJlIHRvIHNlZ2ZhdWx0IGR1ZQorICAgICAqIHRvIGEgbnVsbCBwb2ludGVyIHJlZmVyZW5jZSBpZiBubyB0aHJlYWRzIG9yIGNoaWxkIHByb2Nlc3NlcworICAgICAqIGhhdmUgYmVlbiBjcmVhdGVkLiAgVGhpcyB3b3JrcyBhcm91bmQgdGhhdCBhbmQgaXMgYSBuby1vcCBpZgorICAgICAqIHRocmVhZHMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgICogIChzZWUgcHlic2RkYi11c2VycyBtYWlsaW5nIGxpc3QgcG9zdCBvbiAyMDAyLTA4LTA3KQorICAgICAqLworICAgIFB5RXZhbF9Jbml0VGhyZWFkcygpOworCitlcnJvcjoKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgTU9EVUxFX05BTUUgIjogaW5pdCBmYWlsZWQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmggYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5NDczNQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuaApAQCAtMCwwICsxLDU1IEBACisvKiBtb2R1bGUuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgbW9kdWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmbmRlZiBQWVNRTElURV9NT0RVTEVfSAorI2RlZmluZSBQWVNRTElURV9NT0RVTEVfSAorI2luY2x1ZGUgIlB5dGhvbi5oIgorCisjZGVmaW5lIFBZU1FMSVRFX1ZFUlNJT04gIjIuMi4wIgorCitleHRlcm4gUHlPYmplY3QqIEVycm9yOworZXh0ZXJuIFB5T2JqZWN0KiBXYXJuaW5nOworZXh0ZXJuIFB5T2JqZWN0KiBJbnRlcmZhY2VFcnJvcjsKK2V4dGVybiBQeU9iamVjdCogRGF0YWJhc2VFcnJvcjsKK2V4dGVybiBQeU9iamVjdCogSW50ZXJuYWxFcnJvcjsKK2V4dGVybiBQeU9iamVjdCogT3BlcmF0aW9uYWxFcnJvcjsKK2V4dGVybiBQeU9iamVjdCogUHJvZ3JhbW1pbmdFcnJvcjsKK2V4dGVybiBQeU9iamVjdCogSW50ZWdyaXR5RXJyb3I7CitleHRlcm4gUHlPYmplY3QqIERhdGFFcnJvcjsKK2V4dGVybiBQeU9iamVjdCogTm90U3VwcG9ydGVkRXJyb3I7CisKK2V4dGVybiBQeU9iamVjdCogT3B0aW1pemVkVW5pY29kZTsKKworLyogdGhlIGZ1bmN0aW9ucyB0aW1lLnRpbWUoKSBhbmQgdGltZS5zbGVlcCgpICovCitleHRlcm4gUHlPYmplY3QqIHRpbWVfdGltZTsKK2V4dGVybiBQeU9iamVjdCogdGltZV9zbGVlcDsKKworLyogQSBkaWN0aW9uYXJ5LCBtYXBwaW5nIGNvbHVtIHR5cGVzIChJTlRFR0VSLCBWQVJDSEFSLCBldGMuKSB0byBjb252ZXJ0ZXIKKyAqIGZ1bmN0aW9ucywgdGhhdCBjb252ZXJ0IHRoZSBTUUwgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIFB5dGhvbiB2YWx1ZS4KKyAqIFRoZSBrZXkgaXMgdXBwZXJjYXNlLgorICovCitleHRlcm4gUHlPYmplY3QqIGNvbnZlcnRlcnM7CisKKyNkZWZpbmUgUEFSU0VfREVDTFRZUEVTIDEKKyNkZWZpbmUgUEFSU0VfQ09MTkFNRVMgMgorI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvcHJlcGFyZV9wcm90b2NvbC5jIGIvTW9kdWxlcy9fc3FsaXRlL3ByZXBhcmVfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmI2NjNiCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3ByZXBhcmVfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDg0IEBACisvKiBwcmVwYXJlX3Byb3RvY29sLmMgLSB0aGUgcHJvdG9jb2wgZm9yIHByZXBhcmluZyB2YWx1ZXMgZm9yIFNRTGl0ZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJwcmVwYXJlX3Byb3RvY29sLmgiCisKK2ludCBwcmVwYXJlX3Byb3RvY29sX2luaXQoU1FMaXRlUHJlcGFyZVByb3RvY29sKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBwcmVwYXJlX3Byb3RvY29sX2RlYWxsb2MoU1FMaXRlUHJlcGFyZVByb3RvY29sKiBzZWxmKQoreworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworUHlUeXBlT2JqZWN0IFNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGU9IHsKKyAgICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAgICAgTU9EVUxFX05BTUUgIi5QcmVwYXJlUHJvdG9jb2wiLCAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICAgICBzaXplb2YoU1FMaXRlUHJlcGFyZVByb3RvY29sKSwgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAgICAgKGRlc3RydWN0b3IpcHJlcGFyZV9wcm90b2NvbF9kZWFsbG9jLCAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgICAgICAoaW5pdHByb2MpcHJlcGFyZV9wcm90b2NvbF9pbml0LCAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCit9OworCitleHRlcm4gaW50IHByZXBhcmVfcHJvdG9jb2xfc2V0dXBfdHlwZXModm9pZCkKK3sKKyAgICBTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIFNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGUub2JfdHlwZT0gJlB5VHlwZV9UeXBlOworICAgIHJldHVybiBQeVR5cGVfUmVhZHkoJlNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGUpOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL3ByZXBhcmVfcHJvdG9jb2wuaCBiL01vZHVsZXMvX3NxbGl0ZS9wcmVwYXJlX3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjNGY2MQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9wcmVwYXJlX3Byb3RvY29sLmgKQEAgLTAsMCArMSw0MSBAQAorLyogcHJlcGFyZV9wcm90b2NvbC5oIC0gdGhlIHByb3RvY29sIGZvciBwcmVwYXJpbmcgdmFsdWVzIGZvciBTUUxpdGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmbmRlZiBQWVNRTElURV9QUkVQQVJFX1BST1RPQ09MX0gKKyNkZWZpbmUgUFlTUUxJVEVfUFJFUEFSRV9QUk9UT0NPTF9ICisjaW5jbHVkZSAiUHl0aG9uLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorfSBTUUxpdGVQcmVwYXJlUHJvdG9jb2w7CisKK2V4dGVybiBQeVR5cGVPYmplY3QgU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZTsKKworaW50IHByZXBhcmVfcHJvdG9jb2xfaW5pdChTUUxpdGVQcmVwYXJlUHJvdG9jb2wqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKK3ZvaWQgcHJlcGFyZV9wcm90b2NvbF9kZWFsbG9jKFNRTGl0ZVByZXBhcmVQcm90b2NvbCogc2VsZik7CisKK2ludCBwcmVwYXJlX3Byb3RvY29sX3NldHVwX3R5cGVzKHZvaWQpOworCisjZGVmaW5lIFVOS05PV04gKC0xKQorI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvcm93LmMgYi9Nb2R1bGVzL19zcWxpdGUvcm93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiNjEzNQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9yb3cuYwpAQCAtMCwwICsxLDIwMiBAQAorLyogcm93LmMgLSBhbiBlbmhhbmNlZCB0dXBsZSBmb3IgZGF0YWJhc2Ugcm93cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJyb3cuaCIKKyNpbmNsdWRlICJjdXJzb3IuaCIKKyNpbmNsdWRlICJzcWxpdGVjb21wYXQuaCIKKwordm9pZCByb3dfZGVhbGxvYyhSb3cqIHNlbGYpCit7CisgICAgUHlfWERFQ1JFRihzZWxmLT5kYXRhKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmRlc2NyaXB0aW9uKTsKKworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworaW50IHJvd19pbml0KFJvdyogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlPYmplY3QqIGRhdGE7CisgICAgQ3Vyc29yKiBjdXJzb3I7CisKKyAgICBzZWxmLT5kYXRhID0gMDsKKyAgICBzZWxmLT5kZXNjcmlwdGlvbiA9IDA7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJmN1cnNvciwgJmRhdGEpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIVB5T2JqZWN0X0lzSW5zdGFuY2UoKFB5T2JqZWN0KiljdXJzb3IsIChQeU9iamVjdCopJkN1cnNvclR5cGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJpbnN0YW5jZSBvZiBjdXJzb3IgcmVxdWlyZWQgZm9yIGZpcnN0IGFyZ3VtZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soZGF0YSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInR1cGxlIHJlcXVpcmVkIGZvciBzZWNvbmQgYXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFB5X0lOQ1JFRihkYXRhKTsKKyAgICBzZWxmLT5kYXRhID0gZGF0YTsKKworICAgIFB5X0lOQ1JFRihjdXJzb3ItPmRlc2NyaXB0aW9uKTsKKyAgICBzZWxmLT5kZXNjcmlwdGlvbiA9IGN1cnNvci0+ZGVzY3JpcHRpb247CisKKyAgICByZXR1cm4gMDsKK30KKworUHlPYmplY3QqIHJvd19zdWJzY3JpcHQoUm93KiBzZWxmLCBQeU9iamVjdCogaWR4KQoreworICAgIGxvbmcgX2lkeDsKKyAgICBjaGFyKiBrZXk7CisgICAgaW50IG5pdGVtcywgaTsKKyAgICBjaGFyKiBjb21wYXJlX2tleTsKKworICAgIGNoYXIqIHAxOworICAgIGNoYXIqIHAyOworCisgICAgUHlPYmplY3QqIGl0ZW07CisKKyAgICBpZiAoUHlJbnRfQ2hlY2soaWR4KSkgeworICAgICAgICBfaWR4ID0gUHlJbnRfQXNMb25nKGlkeCk7CisgICAgICAgIGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW0oc2VsZi0+ZGF0YSwgX2lkeCk7CisgICAgICAgIFB5X1hJTkNSRUYoaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKGlkeCkpIHsKKyAgICAgICAgX2lkeCA9IFB5TG9uZ19Bc0xvbmcoaWR4KTsKKyAgICAgICAgaXRlbSA9IFB5VHVwbGVfR2V0SXRlbShzZWxmLT5kYXRhLCBfaWR4KTsKKyAgICAgICAgUHlfWElOQ1JFRihpdGVtKTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhpZHgpKSB7CisgICAgICAgIGtleSA9IFB5U3RyaW5nX0FzU3RyaW5nKGlkeCk7CisKKyAgICAgICAgbml0ZW1zID0gUHlUdXBsZV9TaXplKHNlbGYtPmRlc2NyaXB0aW9uKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbml0ZW1zOyBpKyspIHsKKyAgICAgICAgICAgIGNvbXBhcmVfa2V5ID0gUHlTdHJpbmdfQXNTdHJpbmcoUHlUdXBsZV9HRVRfSVRFTShQeVR1cGxlX0dFVF9JVEVNKHNlbGYtPmRlc2NyaXB0aW9uLCBpKSwgMCkpOworICAgICAgICAgICAgaWYgKCFjb21wYXJlX2tleSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwMSA9IGtleTsKKyAgICAgICAgICAgIHAyID0gY29tcGFyZV9rZXk7CisKKyAgICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgICAgaWYgKCgqcDEgPT0gKGNoYXIpMCkgfHwgKCpwMiA9PSAoY2hhcikwKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKCpwMSB8IDB4MjApICE9ICgqcDIgfCAweDIwKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwMSsrOworICAgICAgICAgICAgICAgIHAyKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKnAxID09IChjaGFyKTApICYmICgqcDIgPT0gKGNoYXIpMCkpIHsKKyAgICAgICAgICAgICAgICAvKiBmb3VuZCBpdGVtICovCisgICAgICAgICAgICAgICAgaXRlbSA9IFB5VHVwbGVfR2V0SXRlbShzZWxmLT5kYXRhLCBpKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiTm8gaXRlbSB3aXRoIHRoYXQga2V5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpZHgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2xpY2VzIG5vdCBpbXBsZW1lbnRlZCwgeWV0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiSW5kZXggbXVzdCBiZSBpbnQgb3Igc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworUHlfc3NpemVfdCByb3dfbGVuZ3RoKFJvdyogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgcmV0dXJuIFB5VHVwbGVfR0VUX1NJWkUoc2VsZi0+ZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcm93X3ByaW50KFJvdyogc2VsZiwgRklMRSAqZnAsIGludCBmbGFncykKK3sKKyAgICByZXR1cm4gKCZQeVR1cGxlX1R5cGUpLT50cF9wcmludChzZWxmLT5kYXRhLCBmcCwgZmxhZ3MpOworfQorCisKK1B5TWFwcGluZ01ldGhvZHMgcm93X2FzX21hcHBpbmcgPSB7CisgICAgLyogbXBfbGVuZ3RoICAgICAgICAqLyAobGVuZnVuYylyb3dfbGVuZ3RoLAorICAgIC8qIG1wX3N1YnNjcmlwdCAgICAgKi8gKGJpbmFyeWZ1bmMpcm93X3N1YnNjcmlwdCwKKyAgICAvKiBtcF9hc3Nfc3Vic2NyaXB0ICovIChvYmpvYmphcmdwcm9jKTAsCit9OworCisKK1B5VHlwZU9iamVjdCBSb3dUeXBlID0geworICAgICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworICAgICAgICBNT0RVTEVfTkFNRSAiLlJvdyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgICAgIHNpemVvZihSb3cpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgICAgICAoZGVzdHJ1Y3Rvcilyb3dfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgICAgIChwcmludGZ1bmMpcm93X3ByaW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgICAgIChpbml0cHJvYylyb3dfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KK307CisKK2V4dGVybiBpbnQgcm93X3NldHVwX3R5cGVzKHZvaWQpCit7CisgICAgUm93VHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICBSb3dUeXBlLnRwX2FzX21hcHBpbmcgPSAmcm93X2FzX21hcHBpbmc7CisgICAgcmV0dXJuIFB5VHlwZV9SZWFkeSgmUm93VHlwZSk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvcm93LmggYi9Nb2R1bGVzL19zcWxpdGUvcm93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlMDgzYwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9yb3cuaApAQCAtMCwwICsxLDM5IEBACisvKiByb3cuaCAtIGFuIGVuaGFuY2VkIHR1cGxlIGZvciBkYXRhYmFzZSByb3dzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpZm5kZWYgUFlTUUxJVEVfUk9XX0gKKyNkZWZpbmUgUFlTUUxJVEVfUk9XX0gKKyNpbmNsdWRlICJQeXRob24uaCIKKwordHlwZWRlZiBzdHJ1Y3QgX1JvdworeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCogZGF0YTsKKyAgICBQeU9iamVjdCogZGVzY3JpcHRpb247Cit9IFJvdzsKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBSb3dUeXBlOworCitpbnQgcm93X3NldHVwX3R5cGVzKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9zcWxpdGVjb21wYXQuaCBiL01vZHVsZXMvX3NxbGl0ZS9zcWxpdGVjb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzc5ODI1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3NxbGl0ZWNvbXBhdC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIHNxbGl0ZWNvbXBhdC5oIC0gY29tcGF0aWJpbGl0eSBtYWNyb3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmbmRlZiBQWVNRTElURV9DT01QQVRfSAorI2RlZmluZSBQWVNRTElURV9DT01QQVRfSAorCisvKiBkZWZpbmUgUHlfc3NpemVfdCBmb3IgcHJlLTIuNSB2ZXJzaW9ucyBvZiBQeXRob24gKi8KKworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMAordHlwZWRlZiBpbnQgUHlfc3NpemVfdDsKK3R5cGVkZWYgaW50ICgqbGVuZnVuYykoUHlPYmplY3QqKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuYyBiL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzkzNjUxCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5jCkBAIC0wLDAgKzEsNDI3IEBACisvKiBzdGF0ZW1lbnQuYyAtIHRoZSBzdGF0ZW1lbnQgdHlwZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJzdGF0ZW1lbnQuaCIKKyNpbmNsdWRlICJjdXJzb3IuaCIKKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAibWljcm9wcm90b2NvbHMuaCIKKyNpbmNsdWRlICJwcmVwYXJlX3Byb3RvY29sLmgiCisjaW5jbHVkZSAic3FsaXRlY29tcGF0LmgiCisKKy8qIHByb3RvdHlwZXMgKi8KK2ludCBjaGVja19yZW1haW5pbmdfc3FsKGNvbnN0IGNoYXIqIHRhaWwpOworCit0eXBlZGVmIGVudW0geworICAgIExJTkVDT01NRU5UXzEsCisgICAgSU5fTElORUNPTU1FTlQsCisgICAgQ09NTUVOVFNUQVJUXzEsCisgICAgSU5fQ09NTUVOVCwKKyAgICBDT01NRU5URU5EXzEsCisgICAgTk9STUFMCit9IHBhcnNlX3JlbWFpbmluZ19zcWxfc3RhdGU7CisKK2ludCBzdGF0ZW1lbnRfY3JlYXRlKFN0YXRlbWVudCogc2VsZiwgQ29ubmVjdGlvbiogY29ubmVjdGlvbiwgUHlPYmplY3QqIHNxbCkKK3sKKyAgICBjb25zdCBjaGFyKiB0YWlsOworICAgIGludCByYzsKKyAgICBQeU9iamVjdCogc3FsX3N0cjsKKyAgICBjaGFyKiBzcWxfY3N0cjsKKworICAgIHNlbGYtPnN0ID0gTlVMTDsKKyAgICBzZWxmLT5pbl91c2UgPSAwOworCisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHNxbCkpIHsKKyAgICAgICAgc3FsX3N0ciA9IHNxbDsKKyAgICAgICAgUHlfSU5DUkVGKHNxbF9zdHIpOworICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHNxbCkpIHsKKyAgICAgICAgc3FsX3N0ciA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoc3FsKTsKKyAgICAgICAgaWYgKCFzcWxfc3RyKSB7CisgICAgICAgICAgICByYyA9IFBZU1FMSVRFX1NRTF9XUk9OR19UWVBFOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmMgPSBQWVNRTElURV9TUUxfV1JPTkdfVFlQRTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHNlbGYtPnNxbCA9IHNxbF9zdHI7CisKKyAgICBzcWxfY3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHNxbF9zdHIpOworCisgICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoY29ubmVjdGlvbi0+ZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3FsX2NzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWlsKTsKKworICAgIHNlbGYtPmRiID0gY29ubmVjdGlvbi0+ZGI7CisKKyAgICBpZiAocmMgPT0gU1FMSVRFX09LICYmIGNoZWNrX3JlbWFpbmluZ19zcWwodGFpbCkpIHsKKyAgICAgICAgKHZvaWQpc3FsaXRlM19maW5hbGl6ZShzZWxmLT5zdCk7CisgICAgICAgIHNlbGYtPnN0ID0gTlVMTDsKKyAgICAgICAgcmMgPSBQWVNRTElURV9UT09fTVVDSF9TUUw7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVyKFN0YXRlbWVudCogc2VsZiwgaW50IHBvcywgUHlPYmplY3QqIHBhcmFtZXRlcikKK3sKKyAgICBpbnQgcmMgPSBTUUxJVEVfT0s7CisgICAgbG9uZyBsb25ndmFsOworI2lmZGVmIEhBVkVfTE9OR19MT05HCisgICAgUFlfTE9OR19MT05HIGxvbmdsb25ndmFsOworI2VuZGlmCisgICAgY29uc3QgY2hhciogYnVmZmVyOworICAgIGNoYXIqIHN0cmluZzsKKyAgICBQeV9zc2l6ZV90IGJ1ZmxlbjsKKyAgICBQeU9iamVjdCogc3RyaW5ndmFsOworCisgICAgaWYgKHBhcmFtZXRlciA9PSBQeV9Ob25lKSB7CisgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX251bGwoc2VsZi0+c3QsIHBvcyk7CisgICAgfSBlbHNlIGlmIChQeUludF9DaGVjayhwYXJhbWV0ZXIpKSB7CisgICAgICAgIGxvbmd2YWwgPSBQeUludF9Bc0xvbmcocGFyYW1ldGVyKTsKKyAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfaW50NjQoc2VsZi0+c3QsIHBvcywgKHNxbGl0ZV9pbnQ2NClsb25ndmFsKTsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworICAgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKHBhcmFtZXRlcikpIHsKKyAgICAgICAgbG9uZ2xvbmd2YWwgPSBQeUxvbmdfQXNMb25nTG9uZyhwYXJhbWV0ZXIpOworICAgICAgICAvKiBpbiB0aGUgb3ZlcmZsb3cgZXJyb3IgY2FzZSwgbG9uZ2xvbmd2YWwgaXMgLTEsIGFuZCBhbiBleGNlcHRpb24gaXMgc2V0ICovCisgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2ludDY0KHNlbGYtPnN0LCBwb3MsIChzcWxpdGVfaW50NjQpbG9uZ2xvbmd2YWwpOworI2VuZGlmCisgICAgfSBlbHNlIGlmIChQeUZsb2F0X0NoZWNrKHBhcmFtZXRlcikpIHsKKyAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfZG91YmxlKHNlbGYtPnN0LCBwb3MsIFB5RmxvYXRfQXNEb3VibGUocGFyYW1ldGVyKSk7CisgICAgfSBlbHNlIGlmIChQeUJ1ZmZlcl9DaGVjayhwYXJhbWV0ZXIpKSB7CisgICAgICAgIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIocGFyYW1ldGVyLCAmYnVmZmVyLCAmYnVmbGVuKSA9PSAwKSB7CisgICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9ibG9iKHNlbGYtPnN0LCBwb3MsIGJ1ZmZlciwgYnVmbGVuLCBTUUxJVEVfVFJBTlNJRU5UKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY291bGQgbm90IGNvbnZlcnQgQkxPQiB0byBidWZmZXIiKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgUHlTdHJpbmdfQ2hlY2socGFyYW1ldGVyKSB7CisgICAgICAgIHN0cmluZyA9IFB5U3RyaW5nX0FzU3RyaW5nKHBhcmFtZXRlcik7CisgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX3RleHQoc2VsZi0+c3QsIHBvcywgc3RyaW5nLCAtMSwgU1FMSVRFX1RSQU5TSUVOVCk7CisgICAgfSBlbHNlIGlmIFB5VW5pY29kZV9DaGVjayhwYXJhbWV0ZXIpIHsKKyAgICAgICAgc3RyaW5ndmFsID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhwYXJhbWV0ZXIpOworICAgICAgICBzdHJpbmcgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHJpbmd2YWwpOworICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF90ZXh0KHNlbGYtPnN0LCBwb3MsIHN0cmluZywgLTEsIFNRTElURV9UUkFOU0lFTlQpOworICAgICAgICBQeV9ERUNSRUYoc3RyaW5ndmFsKTsKKyAgICB9IGVsc2UgeworICAgICAgICByYyA9IC0xOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKwordm9pZCBzdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXJzKFN0YXRlbWVudCogc2VsZiwgUHlPYmplY3QqIHBhcmFtZXRlcnMpCit7CisgICAgUHlPYmplY3QqIGN1cnJlbnRfcGFyYW07CisgICAgUHlPYmplY3QqIGFkYXB0ZWQ7CisgICAgY29uc3QgY2hhciogYmluZGluZ19uYW1lOworICAgIGludCBpOworICAgIGludCByYzsKKyAgICBpbnQgbnVtX3BhcmFtc19uZWVkZWQ7CisgICAgaW50IG51bV9wYXJhbXM7CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgbnVtX3BhcmFtc19uZWVkZWQgPSBzcWxpdGUzX2JpbmRfcGFyYW1ldGVyX2NvdW50KHNlbGYtPnN0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgaWYgKFB5RGljdF9DaGVjayhwYXJhbWV0ZXJzKSkgeworICAgICAgICAvKiBwYXJhbWV0ZXJzIHBhc3NlZCBhcyBkaWN0aW9uYXJ5ICovCisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbnVtX3BhcmFtc19uZWVkZWQ7IGkrKykgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgYmluZGluZ19uYW1lID0gc3FsaXRlM19iaW5kX3BhcmFtZXRlcl9uYW1lKHNlbGYtPnN0LCBpKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgICAgICBpZiAoIWJpbmRpbmdfbmFtZSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQcm9ncmFtbWluZ0Vycm9yLCAiQmluZGluZyAlZCBoYXMgbm8gbmFtZSwgYnV0IHlvdSBzdXBwbGllZCBhIGRpY3Rpb25hcnkgKHdoaWNoIGhhcyBvbmx5IG5hbWVzKS4iLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJpbmRpbmdfbmFtZSsrOyAvKiBza2lwIGZpcnN0IGNoYXIgKHRoZSBjb2xvbikgKi8KKyAgICAgICAgICAgIGN1cnJlbnRfcGFyYW0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhwYXJhbWV0ZXJzLCBiaW5kaW5nX25hbWUpOworICAgICAgICAgICAgaWYgKCFjdXJyZW50X3BhcmFtKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFByb2dyYW1taW5nRXJyb3IsICJZb3UgZGlkIG5vdCBzdXBwbHkgYSB2YWx1ZSBmb3IgYmluZGluZyAlZC4iLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFB5X0lOQ1JFRihjdXJyZW50X3BhcmFtKTsKKyAgICAgICAgICAgIGFkYXB0ZWQgPSBtaWNyb3Byb3RvY29sc19hZGFwdChjdXJyZW50X3BhcmFtLCAoUHlPYmplY3QqKSZTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChhZGFwdGVkKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGN1cnJlbnRfcGFyYW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBjdXJyZW50X3BhcmFtOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IHN0YXRlbWVudF9iaW5kX3BhcmFtZXRlcihzZWxmLCBpLCBhZGFwdGVkKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhZGFwdGVkKTsKKworICAgICAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChJbnRlcmZhY2VFcnJvciwgIkVycm9yIGJpbmRpbmcgcGFyYW1ldGVyIDolcyAtIHByb2JhYmx5IHVuc3VwcG9ydGVkIHR5cGUuIiwgYmluZGluZ19uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHBhcmFtZXRlcnMgcGFzc2VkIGFzIHNlcXVlbmNlICovCisgICAgICAgIG51bV9wYXJhbXMgPSBQeVNlcXVlbmNlX0xlbmd0aChwYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKG51bV9wYXJhbXMgIT0gbnVtX3BhcmFtc19uZWVkZWQpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQcm9ncmFtbWluZ0Vycm9yLCAiSW5jb3JyZWN0IG51bWJlciBvZiBiaW5kaW5ncyBzdXBwbGllZC4gVGhlIGN1cnJlbnQgc3RhdGVtZW50IHVzZXMgJWQsIGFuZCB0aGVyZSBhcmUgJWQgc3VwcGxpZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGFyYW1zX25lZWRlZCwgbnVtX3BhcmFtcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYXJhbXM7IGkrKykgeworICAgICAgICAgICAgY3VycmVudF9wYXJhbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShwYXJhbWV0ZXJzLCBpKTsKKyAgICAgICAgICAgIGlmICghY3VycmVudF9wYXJhbSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkYXB0ZWQgPSBtaWNyb3Byb3RvY29sc19hZGFwdChjdXJyZW50X3BhcmFtLCAoUHlPYmplY3QqKSZTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlLCBOVUxMKTsKKworICAgICAgICAgICAgaWYgKGFkYXB0ZWQpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VycmVudF9wYXJhbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgYWRhcHRlZCA9IGN1cnJlbnRfcGFyYW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVyKHNlbGYsIGkgKyAxLCBhZGFwdGVkKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhZGFwdGVkKTsKKworICAgICAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChJbnRlcmZhY2VFcnJvciwgIkVycm9yIGJpbmRpbmcgcGFyYW1ldGVyICVkIC0gcHJvYmFibHkgdW5zdXBwb3J0ZWQgdHlwZS4iLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBzdGF0ZW1lbnRfcmVjb21waWxlKFN0YXRlbWVudCogc2VsZiwgUHlPYmplY3QqIHBhcmFtcykKK3sKKyAgICBjb25zdCBjaGFyKiB0YWlsOworICAgIGludCByYzsKKyAgICBjaGFyKiBzcWxfY3N0cjsKKyAgICBzcWxpdGUzX3N0bXQqIG5ld19zdDsKKworICAgIHNxbF9jc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+c3FsKTsKKworICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNxbF9jc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRhaWwpOworCisgICAgaWYgKHJjID09IFNRTElURV9PSykgeworICAgICAgICAvKiBUaGUgZWZmaWNpZW50IHNxbGl0ZTNfdHJhbnNmZXJfYmluZGluZ3MgaXMgb25seSBhdmFpbGFibGUgaW4gU1FMaXRlCisgICAgICAgICAqIHZlcnNpb24gMy4yLjIgb3IgbGF0ZXIuIEZvciBvbGRlciBTUUxpdGUgcmVsZWFzZXMsIHRoYXQgbWlnaHQgbm90CisgICAgICAgICAqIGV2ZW4gZGVmaW5lIFNRTElURV9WRVJTSU9OX05VTUJFUiwgd2UgZG8gaXQgdGhlIG1hbnVhbCB3YXkuCisgICAgICAgICAqLworICAgICAgICAjaWZkZWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSCisgICAgICAgICNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMjAwMgorICAgICAgICAodm9pZClzcWxpdGUzX3RyYW5zZmVyX2JpbmRpbmdzKHNlbGYtPnN0LCBuZXdfc3QpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVycyhzZWxmLCBwYXJhbXMpOworICAgICAgICAjZW5kaWYKKworICAgICAgICAodm9pZClzcWxpdGUzX2ZpbmFsaXplKHNlbGYtPnN0KTsKKyAgICAgICAgc2VsZi0+c3QgPSBuZXdfc3Q7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgc3RhdGVtZW50X2ZpbmFsaXplKFN0YXRlbWVudCogc2VsZikKK3sKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IFNRTElURV9PSzsKKyAgICBpZiAoc2VsZi0+c3QpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc2VsZi0+c3QpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBzZWxmLT5zdCA9IE5VTEw7CisgICAgfQorCisgICAgc2VsZi0+aW5fdXNlID0gMDsKKworICAgIHJldHVybiByYzsKK30KKworaW50IHN0YXRlbWVudF9yZXNldChTdGF0ZW1lbnQqIHNlbGYpCit7CisgICAgaW50IHJjOworCisgICAgcmMgPSBTUUxJVEVfT0s7CisKKyAgICBpZiAoc2VsZi0+aW5fdXNlICYmIHNlbGYtPnN0KSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmMgPSBzcWxpdGUzX3Jlc2V0KHNlbGYtPnN0KTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgICAgICBpZiAocmMgPT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICBzZWxmLT5pbl91c2UgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIHN0YXRlbWVudF9tYXJrX2RpcnR5KFN0YXRlbWVudCogc2VsZikKK3sKKyAgICBzZWxmLT5pbl91c2UgPSAxOworfQorCit2b2lkIHN0YXRlbWVudF9kZWFsbG9jKFN0YXRlbWVudCogc2VsZikKK3sKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoc2VsZi0+c3QpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc2VsZi0+c3QpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKworICAgIHNlbGYtPnN0ID0gTlVMTDsKKworICAgIFB5X1hERUNSRUYoc2VsZi0+c3FsKTsKKworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworLyoKKyAqIENoZWNrcyBpZiB0aGVyZSBpcyBhbnl0aGluZyBsZWZ0IGluIGFuIFNRTCBzdHJpbmcgYWZ0ZXIgU1FMaXRlIGNvbXBpbGVkIGl0LgorICogVGhpcyBpcyB1c2VkIHRvIGNoZWNrIGlmIHNvbWVib2R5IHRyaWVkIHRvIGV4ZWN1dGUgbW9yZSB0aGFuIG9uZSBTUUwgY29tbWFuZAorICogd2l0aCBvbmUgZXhlY3V0ZSgpL2V4ZWN1dGVtYW55KCkgY29tbWFuZCwgd2hpY2ggdGhlIERCLUFQSSBhbmQgd2UgZG9uJ3QKKyAqIGFsbG93LgorICoKKyAqIFJldHVybnMgMSBpZiB0aGVyZSBpcyBtb3JlIGxlZnQgdGhhbiBzaG91bGQgYmUuIDAgaWYgb2suCisgKi8KK2ludCBjaGVja19yZW1haW5pbmdfc3FsKGNvbnN0IGNoYXIqIHRhaWwpCit7CisgICAgY29uc3QgY2hhciogcG9zID0gdGFpbDsKKworICAgIHBhcnNlX3JlbWFpbmluZ19zcWxfc3RhdGUgc3RhdGUgPSBOT1JNQUw7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHN3aXRjaCAoKnBvcykgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IE5PUk1BTCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSAgPSBMSU5FQ09NTUVOVF8xOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gTElORUNPTU1FTlRfMSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOX0xJTkVDT01NRU5UOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gSU5fTElORUNPTU1FTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBOT1JNQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IE5PUk1BTCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IENPTU1FTlRTVEFSVF8xOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQ09NTUVOVEVORF8xKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gTk9STUFMOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQ09NTUVOVFNUQVJUXzEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnKic6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IE5PUk1BTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IExJTkVDT01NRU5UXzEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBDT01NRU5UU1RBUlRfMSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOX0NPTU1FTlQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBJTl9DT01NRU5UKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gQ09NTUVOVEVORF8xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IENPTU1FTlRFTkRfMSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOX0NPTU1FTlQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBJTl9MSU5FQ09NTUVOVCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gSU5fQ09NTUVOVCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBvcysrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitQeVR5cGVPYmplY3QgU3RhdGVtZW50VHlwZSA9IHsKKyAgICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAgICAgTU9EVUxFX05BTUUgIi5TdGF0ZW1lbnQiLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICAgICBzaXplb2YoU3RhdGVtZW50KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAgICAgKGRlc3RydWN0b3Ipc3RhdGVtZW50X2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgICAgICAoaW5pdHByb2MpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCit9OworCitleHRlcm4gaW50IHN0YXRlbWVudF9zZXR1cF90eXBlcyh2b2lkKQoreworICAgIFN0YXRlbWVudFR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgcmV0dXJuIFB5VHlwZV9SZWFkeSgmU3RhdGVtZW50VHlwZSk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmggYi9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1YTBmYwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuaApAQCAtMCwwICsxLDU4IEBACisvKiBzdGF0ZW1lbnQuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgc3RhdGVtZW50IHR5cGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmbmRlZiBQWVNRTElURV9TVEFURU1FTlRfSAorI2RlZmluZSBQWVNRTElURV9TVEFURU1FTlRfSAorI2luY2x1ZGUgIlB5dGhvbi5oIgorCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgInNxbGl0ZTMuaCIKKworI2RlZmluZSBQWVNRTElURV9UT09fTVVDSF9TUUwgKC0xMDApCisjZGVmaW5lIFBZU1FMSVRFX1NRTF9XUk9OR19UWVBFICgtMTAxKQorCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBzcWxpdGUzKiBkYjsKKyAgICBzcWxpdGUzX3N0bXQqIHN0OworICAgIFB5T2JqZWN0KiBzcWw7CisgICAgaW50IGluX3VzZTsKK30gU3RhdGVtZW50OworCitleHRlcm4gUHlUeXBlT2JqZWN0IFN0YXRlbWVudFR5cGU7CisKK2ludCBzdGF0ZW1lbnRfY3JlYXRlKFN0YXRlbWVudCogc2VsZiwgQ29ubmVjdGlvbiogY29ubmVjdGlvbiwgUHlPYmplY3QqIHNxbCk7Cit2b2lkIHN0YXRlbWVudF9kZWFsbG9jKFN0YXRlbWVudCogc2VsZik7CisKK2ludCBzdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXIoU3RhdGVtZW50KiBzZWxmLCBpbnQgcG9zLCBQeU9iamVjdCogcGFyYW1ldGVyKTsKK3ZvaWQgc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVycyhTdGF0ZW1lbnQqIHNlbGYsIFB5T2JqZWN0KiBwYXJhbWV0ZXJzKTsKKworaW50IHN0YXRlbWVudF9yZWNvbXBpbGUoU3RhdGVtZW50KiBzZWxmLCBQeU9iamVjdCogcGFyYW1ldGVycyk7CitpbnQgc3RhdGVtZW50X2ZpbmFsaXplKFN0YXRlbWVudCogc2VsZik7CitpbnQgc3RhdGVtZW50X3Jlc2V0KFN0YXRlbWVudCogc2VsZik7Cit2b2lkIHN0YXRlbWVudF9tYXJrX2RpcnR5KFN0YXRlbWVudCogc2VsZik7CisKK2ludCBzdGF0ZW1lbnRfc2V0dXBfdHlwZXModm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYyBiL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3NDhhNgotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMKQEAgLTAsMCArMSw5NiBAQAorLyogdXRpbC5jIC0gdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisKK2ludCBfc3FsaXRlX3N0ZXBfd2l0aF9idXN5aGFuZGxlcihzcWxpdGUzX3N0bXQqIHN0YXRlbWVudCwgQ29ubmVjdGlvbiogY29ubmVjdGlvbgorKQoreworICAgIGludCByYzsKKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IHNxbGl0ZTNfc3RlcChzdGF0ZW1lbnQpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKgorICogQ2hlY2tzIHRoZSBTUUxpdGUgZXJyb3IgY29kZSBhbmQgc2V0cyB0aGUgYXBwcm9wcmlhdGUgREItQVBJIGV4Y2VwdGlvbi4KKyAqIFJldHVybnMgdGhlIGVycm9yIGNvZGUgKDAgbWVhbnMgbm8gZXJyb3Igb2NjdXJlZCkuCisgKi8KK2ludCBfc2V0ZXJyb3Ioc3FsaXRlMyogZGIpCit7CisgICAgaW50IGVycm9yY29kZTsKKworICAgIGVycm9yY29kZSA9IHNxbGl0ZTNfZXJyY29kZShkYik7CisKKyAgICBzd2l0Y2ggKGVycm9yY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgU1FMSVRFX09LOgorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9JTlRFUk5BTDoKKyAgICAgICAgY2FzZSBTUUxJVEVfTk9URk9VTkQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW50ZXJuYWxFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9OT01FTToKKyAgICAgICAgICAgICh2b2lkKVB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfRVJST1I6CisgICAgICAgIGNhc2UgU1FMSVRFX1BFUk06CisgICAgICAgIGNhc2UgU1FMSVRFX0FCT1JUOgorICAgICAgICBjYXNlIFNRTElURV9CVVNZOgorICAgICAgICBjYXNlIFNRTElURV9MT0NLRUQ6CisgICAgICAgIGNhc2UgU1FMSVRFX1JFQURPTkxZOgorICAgICAgICBjYXNlIFNRTElURV9JTlRFUlJVUFQ6CisgICAgICAgIGNhc2UgU1FMSVRFX0lPRVJSOgorICAgICAgICBjYXNlIFNRTElURV9GVUxMOgorICAgICAgICBjYXNlIFNRTElURV9DQU5UT1BFTjoKKyAgICAgICAgY2FzZSBTUUxJVEVfUFJPVE9DT0w6CisgICAgICAgIGNhc2UgU1FMSVRFX0VNUFRZOgorICAgICAgICBjYXNlIFNRTElURV9TQ0hFTUE6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoT3BlcmF0aW9uYWxFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9DT1JSVVBUOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERhdGFiYXNlRXJyb3IsIHNxbGl0ZTNfZXJybXNnKGRiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfVE9PQklHOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERhdGFFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9DT05TVFJBSU5UOgorICAgICAgICBjYXNlIFNRTElURV9NSVNNQVRDSDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbnRlZ3JpdHlFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9NSVNVU0U6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHJvZ3JhbW1pbmdFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERhdGFiYXNlRXJyb3IsIHNxbGl0ZTNfZXJybXNnKGRiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyb3Jjb2RlOworfQorCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvdXRpbC5oIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTlhNGRkCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuaApAQCAtMCwwICsxLDM4IEBACisvKiB1dGlsLmggLSB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmbmRlZiBQWVNRTElURV9VVElMX0gKKyNkZWZpbmUgUFlTUUxJVEVfVVRJTF9ICisjaW5jbHVkZSAiUHl0aG9uLmgiCisjaW5jbHVkZSAicHl0aHJlYWQuaCIKKyNpbmNsdWRlICJzcWxpdGUzLmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorCitpbnQgX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc3FsaXRlM19zdG10KiBzdGF0ZW1lbnQsIENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pOworCisvKioKKyAqIENoZWNrcyB0aGUgU1FMaXRlIGVycm9yIGNvZGUgYW5kIHNldHMgdGhlIGFwcHJvcHJpYXRlIERCLUFQSSBleGNlcHRpb24uCisgKiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlICgwIG1lYW5zIG5vIGVycm9yIG9jY3VyZWQpLgorICovCitpbnQgX3NldGVycm9yKHNxbGl0ZTMqIGRiKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3JlLmMgYi9Nb2R1bGVzL19zcmUuYwppbmRleCA4MTIyM2Q3Li40YWYwOGVkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcmUuYworKysgYi9Nb2R1bGVzL19zcmUuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiAgICAgICAgICAgICBkYXRhX3N0YWNrX2RlYWxsb2Moc3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuIFNSRV9FUlJPUl9NRU1PUlk7CiAgICAgICAgIH0KLSAgICAgICAgc3RhdGUtPmRhdGFfc3RhY2sgPSBzdGFjazsKKyAgICAgICAgc3RhdGUtPmRhdGFfc3RhY2sgPSAoY2hhciAqKXN0YWNrOwogICAgICAgICBzdGF0ZS0+ZGF0YV9zdGFja19zaXplID0gY3Vyc2l6ZTsKICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0zMzUsNyArMzM1LDcgQEAKIHsKICAgICAvKiBjaGVjayBpZiBwb2ludGVyIGlzIGF0IGdpdmVuIHBvc2l0aW9uICovCiAKLSAgICBpbnQgdGhpcywgdGhhdDsKKyAgICBpbnQgdGhpc3AsIHRoYXRwOwogCiAgICAgc3dpdGNoIChhdCkgewogCkBAIC0zNjIsNTcgKzM2Miw1NyBAQAogICAgIGNhc2UgU1JFX0FUX0JPVU5EQVJZOgogICAgICAgICBpZiAoc3RhdGUtPmJlZ2lubmluZyA9PSBzdGF0ZS0+ZW5kKQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHRoYXQgPSAoKHZvaWQqKSBwdHIgPiBzdGF0ZS0+YmVnaW5uaW5nKSA/CisgICAgICAgIHRoYXRwID0gKCh2b2lkKikgcHRyID4gc3RhdGUtPmJlZ2lubmluZykgPwogICAgICAgICAgICAgU1JFX0lTX1dPUkQoKGludCkgcHRyWy0xXSkgOiAwOwotICAgICAgICB0aGlzID0gKCh2b2lkKikgcHRyIDwgc3RhdGUtPmVuZCkgPworICAgICAgICB0aGlzcCA9ICgodm9pZCopIHB0ciA8IHN0YXRlLT5lbmQpID8KICAgICAgICAgICAgIFNSRV9JU19XT1JEKChpbnQpIHB0clswXSkgOiAwOwotICAgICAgICByZXR1cm4gdGhpcyAhPSB0aGF0OworICAgICAgICByZXR1cm4gdGhpc3AgIT0gdGhhdHA7CiAKICAgICBjYXNlIFNSRV9BVF9OT05fQk9VTkRBUlk6CiAgICAgICAgIGlmIChzdGF0ZS0+YmVnaW5uaW5nID09IHN0YXRlLT5lbmQpCiAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgdGhhdCA9ICgodm9pZCopIHB0ciA+IHN0YXRlLT5iZWdpbm5pbmcpID8KKyAgICAgICAgdGhhdHAgPSAoKHZvaWQqKSBwdHIgPiBzdGF0ZS0+YmVnaW5uaW5nKSA/CiAgICAgICAgICAgICBTUkVfSVNfV09SRCgoaW50KSBwdHJbLTFdKSA6IDA7Ci0gICAgICAgIHRoaXMgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CisgICAgICAgIHRoaXNwID0gKCh2b2lkKikgcHRyIDwgc3RhdGUtPmVuZCkgPwogICAgICAgICAgICAgU1JFX0lTX1dPUkQoKGludCkgcHRyWzBdKSA6IDA7Ci0gICAgICAgIHJldHVybiB0aGlzID09IHRoYXQ7CisgICAgICAgIHJldHVybiB0aGlzcCA9PSB0aGF0cDsKIAogICAgIGNhc2UgU1JFX0FUX0xPQ19CT1VOREFSWToKICAgICAgICAgaWYgKHN0YXRlLT5iZWdpbm5pbmcgPT0gc3RhdGUtPmVuZCkKICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB0aGF0ID0gKCh2b2lkKikgcHRyID4gc3RhdGUtPmJlZ2lubmluZykgPworICAgICAgICB0aGF0cCA9ICgodm9pZCopIHB0ciA+IHN0YXRlLT5iZWdpbm5pbmcpID8KICAgICAgICAgICAgIFNSRV9MT0NfSVNfV09SRCgoaW50KSBwdHJbLTFdKSA6IDA7Ci0gICAgICAgIHRoaXMgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CisgICAgICAgIHRoaXNwID0gKCh2b2lkKikgcHRyIDwgc3RhdGUtPmVuZCkgPwogICAgICAgICAgICAgU1JFX0xPQ19JU19XT1JEKChpbnQpIHB0clswXSkgOiAwOwotICAgICAgICByZXR1cm4gdGhpcyAhPSB0aGF0OworICAgICAgICByZXR1cm4gdGhpc3AgIT0gdGhhdHA7CiAKICAgICBjYXNlIFNSRV9BVF9MT0NfTk9OX0JPVU5EQVJZOgogICAgICAgICBpZiAoc3RhdGUtPmJlZ2lubmluZyA9PSBzdGF0ZS0+ZW5kKQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHRoYXQgPSAoKHZvaWQqKSBwdHIgPiBzdGF0ZS0+YmVnaW5uaW5nKSA/CisgICAgICAgIHRoYXRwID0gKCh2b2lkKikgcHRyID4gc3RhdGUtPmJlZ2lubmluZykgPwogICAgICAgICAgICAgU1JFX0xPQ19JU19XT1JEKChpbnQpIHB0clstMV0pIDogMDsKLSAgICAgICAgdGhpcyA9ICgodm9pZCopIHB0ciA8IHN0YXRlLT5lbmQpID8KKyAgICAgICAgdGhpc3AgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CiAgICAgICAgICAgICBTUkVfTE9DX0lTX1dPUkQoKGludCkgcHRyWzBdKSA6IDA7Ci0gICAgICAgIHJldHVybiB0aGlzID09IHRoYXQ7CisgICAgICAgIHJldHVybiB0aGlzcCA9PSB0aGF0cDsKIAogI2lmIGRlZmluZWQoSEFWRV9VTklDT0RFKQogICAgIGNhc2UgU1JFX0FUX1VOSV9CT1VOREFSWToKICAgICAgICAgaWYgKHN0YXRlLT5iZWdpbm5pbmcgPT0gc3RhdGUtPmVuZCkKICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB0aGF0ID0gKCh2b2lkKikgcHRyID4gc3RhdGUtPmJlZ2lubmluZykgPworICAgICAgICB0aGF0cCA9ICgodm9pZCopIHB0ciA+IHN0YXRlLT5iZWdpbm5pbmcpID8KICAgICAgICAgICAgIFNSRV9VTklfSVNfV09SRCgoaW50KSBwdHJbLTFdKSA6IDA7Ci0gICAgICAgIHRoaXMgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CisgICAgICAgIHRoaXNwID0gKCh2b2lkKikgcHRyIDwgc3RhdGUtPmVuZCkgPwogICAgICAgICAgICAgU1JFX1VOSV9JU19XT1JEKChpbnQpIHB0clswXSkgOiAwOwotICAgICAgICByZXR1cm4gdGhpcyAhPSB0aGF0OworICAgICAgICByZXR1cm4gdGhpc3AgIT0gdGhhdHA7CiAKICAgICBjYXNlIFNSRV9BVF9VTklfTk9OX0JPVU5EQVJZOgogICAgICAgICBpZiAoc3RhdGUtPmJlZ2lubmluZyA9PSBzdGF0ZS0+ZW5kKQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHRoYXQgPSAoKHZvaWQqKSBwdHIgPiBzdGF0ZS0+YmVnaW5uaW5nKSA/CisgICAgICAgIHRoYXRwID0gKCh2b2lkKikgcHRyID4gc3RhdGUtPmJlZ2lubmluZykgPwogICAgICAgICAgICAgU1JFX1VOSV9JU19XT1JEKChpbnQpIHB0clstMV0pIDogMDsKLSAgICAgICAgdGhpcyA9ICgodm9pZCopIHB0ciA8IHN0YXRlLT5lbmQpID8KKyAgICAgICAgdGhpc3AgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CiAgICAgICAgICAgICBTUkVfVU5JX0lTX1dPUkQoKGludCkgcHRyWzBdKSA6IDA7Ci0gICAgICAgIHJldHVybiB0aGlzID09IHRoYXQ7CisgICAgICAgIHJldHVybiB0aGlzcCA9PSB0aGF0cDsKICNlbmRpZgogCiAgICAgfQpAQCAtNTE2LDggKzUxNiw4IEBACiBTUkVfQ09VTlQoU1JFX1NUQVRFKiBzdGF0ZSwgU1JFX0NPREUqIHBhdHRlcm4sIGludCBtYXhjb3VudCkKIHsKICAgICBTUkVfQ09ERSBjaHI7Ci0gICAgU1JFX0NIQVIqIHB0ciA9IHN0YXRlLT5wdHI7Ci0gICAgU1JFX0NIQVIqIGVuZCA9IHN0YXRlLT5lbmQ7CisgICAgU1JFX0NIQVIqIHB0ciA9IChTUkVfQ0hBUiAqKXN0YXRlLT5wdHI7CisgICAgU1JFX0NIQVIqIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7CiAgICAgaW50IGk7CiAKICAgICAvKiBhZGp1c3QgZW5kICovCkBAIC04MDMsNyArODAzLDcgQEAKIExPQ0FMKGludCkKIFNSRV9NQVRDSChTUkVfU1RBVEUqIHN0YXRlLCBTUkVfQ09ERSogcGF0dGVybikKIHsKLSAgICBTUkVfQ0hBUiogZW5kID0gc3RhdGUtPmVuZDsKKyAgICBTUkVfQ0hBUiogZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKICAgICBpbnQgYWxsb2NfcG9zLCBjdHhfcG9zID0gLTE7CiAgICAgaW50IGksIHJldCA9IDA7CiAgICAgaW50IGp1bXA7CkBAIC04MjEsNyArODIxLDcgQEAKIAogZW50cmFuY2U6CiAKLSAgICBjdHgtPnB0ciA9IHN0YXRlLT5wdHI7CisgICAgY3R4LT5wdHIgPSAoU1JFX0NIQVIgKilzdGF0ZS0+cHRyOwogCiAgICAgaWYgKGN0eC0+cGF0dGVyblswXSA9PSBTUkVfT1BfSU5GTykgewogICAgICAgICAvKiBvcHRpbWl6YXRpb24gaW5mbyBibG9jayAqLwpAQCAtMTQ3Nyw4ICsxNDc3LDggQEAKIExPQ0FMKGludCkKIFNSRV9TRUFSQ0goU1JFX1NUQVRFKiBzdGF0ZSwgU1JFX0NPREUqIHBhdHRlcm4pCiB7Ci0gICAgU1JFX0NIQVIqIHB0ciA9IHN0YXRlLT5zdGFydDsKLSAgICBTUkVfQ0hBUiogZW5kID0gc3RhdGUtPmVuZDsKKyAgICBTUkVfQ0hBUiogcHRyID0gKFNSRV9DSEFSICopc3RhdGUtPnN0YXJ0OworICAgIFNSRV9DSEFSKiBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwogICAgIGludCBzdGF0dXMgPSAwOwogICAgIGludCBwcmVmaXhfbGVuID0gMDsKICAgICBpbnQgcHJlZml4X3NraXAgPSAwOwpAQCAtMTUyNCw3ICsxNTI0LDcgQEAKICAgICAgICAgLyogcGF0dGVybiBzdGFydHMgd2l0aCBhIGtub3duIHByZWZpeC4gIHVzZSB0aGUgb3ZlcmxhcAogICAgICAgICAgICB0YWJsZSB0byBza2lwIGZvcndhcmQgYXMgZmFzdCBhcyB3ZSBwb3NzaWJseSBjYW4gKi8KICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBlbmQgPSBzdGF0ZS0+ZW5kOworICAgICAgICBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwogICAgICAgICB3aGlsZSAocHRyIDwgZW5kKSB7CiAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgaWYgKChTUkVfQ09ERSkgcHRyWzBdICE9IHByZWZpeFtpXSkgewpAQCAtMTU1OSw3ICsxNTU5LDcgQEAKICAgICAgICAgLyogcGF0dGVybiBzdGFydHMgd2l0aCBhIGxpdGVyYWwgY2hhcmFjdGVyLiAgdGhpcyBpcyB1c2VkCiAgICAgICAgICAgIGZvciBzaG9ydCBwcmVmaXhlcywgYW5kIGlmIGZhc3Qgc2VhcmNoIGlzIGRpc2FibGVkICovCiAgICAgICAgIFNSRV9DT0RFIGNociA9IHBhdHRlcm5bMV07Ci0gICAgICAgIGVuZCA9IHN0YXRlLT5lbmQ7CisgICAgICAgIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7CiAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgIHdoaWxlIChwdHIgPCBlbmQgJiYgKFNSRV9DT0RFKSBwdHJbMF0gIT0gY2hyKQogICAgICAgICAgICAgICAgIHB0cisrOwpAQCAtMTU3Niw3ICsxNTc2LDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoY2hhcnNldCkgewogICAgICAgICAvKiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgY2hhcmFjdGVyIGZyb20gYSBrbm93biBzZXQgKi8KLSAgICAgICAgZW5kID0gc3RhdGUtPmVuZDsKKyAgICAgICAgZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgd2hpbGUgKHB0ciA8IGVuZCAmJiAhU1JFX0NIQVJTRVQoY2hhcnNldCwgcHRyWzBdKSkKICAgICAgICAgICAgICAgICBwdHIrKzsKQEAgLTE2MTksNzIgKzE2MTksOCBAQAogLyogZmFjdG9yaWVzIGFuZCBkZXN0cnVjdG9ycyAqLwogCiAvKiBzZWUgc3JlLmggZm9yIG9iamVjdCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIFB5VHlwZU9iamVjdCBQYXR0ZXJuX1R5cGU7Ci1zdGF0aWMgUHlUeXBlT2JqZWN0IE1hdGNoX1R5cGU7Ci1zdGF0aWMgUHlUeXBlT2JqZWN0IFNjYW5uZXJfVHlwZTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLV9jb21waWxlKFB5T2JqZWN0KiBzZWxmXywgUHlPYmplY3QqIGFyZ3MpCi17Ci0gICAgLyogImNvbXBpbGUiIHBhdHRlcm4gZGVzY3JpcHRvciB0byBwYXR0ZXJuIG9iamVjdCAqLwotCi0gICAgUGF0dGVybk9iamVjdCogc2VsZjsKLSAgICBpbnQgaSwgbjsKLQotICAgIFB5T2JqZWN0KiBwYXR0ZXJuOwotICAgIGludCBmbGFncyA9IDA7Ci0gICAgUHlPYmplY3QqIGNvZGU7Ci0gICAgaW50IGdyb3VwcyA9IDA7Ci0gICAgUHlPYmplY3QqIGdyb3VwaW5kZXggPSBOVUxMOwotICAgIFB5T2JqZWN0KiBpbmRleGdyb3VwID0gTlVMTDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pTyF8aU9PIiwgJnBhdHRlcm4sICZmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5TGlzdF9UeXBlLCAmY29kZSwgJmdyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwaW5kZXgsICZpbmRleGdyb3VwKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGNvZGUpOwotCi0gICAgc2VsZiA9IFB5T2JqZWN0X05FV19WQVIoUGF0dGVybk9iamVjdCwgJlBhdHRlcm5fVHlwZSwgbik7Ci0gICAgaWYgKCFzZWxmKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHNlbGYtPmNvZGVzaXplID0gbjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgUHlPYmplY3QgKm8gPSBQeUxpc3RfR0VUX0lURU0oY29kZSwgaSk7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUgPSBQeUludF9DaGVjayhvKSA/ICh1bnNpZ25lZCBsb25nKVB5SW50X0FzTG9uZyhvKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUHlMb25nX0FzVW5zaWduZWRMb25nKG8pOwotICAgICAgICBzZWxmLT5jb2RlW2ldID0gKFNSRV9DT0RFKSB2YWx1ZTsKLSAgICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBzZWxmLT5jb2RlW2ldICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVndWxhciBleHByZXNzaW9uIGNvZGUgc2l6ZSBsaW1pdCBleGNlZWRlZCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeU9iamVjdF9ERUwoc2VsZik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFB5X0lOQ1JFRihwYXR0ZXJuKTsKLSAgICBzZWxmLT5wYXR0ZXJuID0gcGF0dGVybjsKLQotICAgIHNlbGYtPmZsYWdzID0gZmxhZ3M7Ci0KLSAgICBzZWxmLT5ncm91cHMgPSBncm91cHM7Ci0KLSAgICBQeV9YSU5DUkVGKGdyb3VwaW5kZXgpOwotICAgIHNlbGYtPmdyb3VwaW5kZXggPSBncm91cGluZGV4OwotCi0gICAgUHlfWElOQ1JFRihpbmRleGdyb3VwKTsKLSAgICBzZWxmLT5pbmRleGdyb3VwID0gaW5kZXhncm91cDsKLQotICAgIHNlbGYtPndlYWtyZWZsaXN0ID0gTlVMTDsKLQotICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwotfQorc3RhdGljIFB5T2JqZWN0KnBhdHRlcm5fbmV3X21hdGNoKFBhdHRlcm5PYmplY3QqLCBTUkVfU1RBVEUqLCBpbnQpOworc3RhdGljIFB5T2JqZWN0KnBhdHRlcm5fc2Nhbm5lcihQYXR0ZXJuT2JqZWN0KiwgUHlPYmplY3QqKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNyZV9jb2Rlc2l6ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCkBAIC0xOTAwLDk4ICsxODM2LDYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBQeU9iamVjdCoKLXBhdHRlcm5fbmV3X21hdGNoKFBhdHRlcm5PYmplY3QqIHBhdHRlcm4sIFNSRV9TVEFURSogc3RhdGUsIGludCBzdGF0dXMpCi17Ci0gICAgLyogY3JlYXRlIG1hdGNoIG9iamVjdCAoZnJvbSBzdGF0ZSBvYmplY3QpICovCi0KLSAgICBNYXRjaE9iamVjdCogbWF0Y2g7Ci0gICAgaW50IGksIGo7Ci0gICAgY2hhciogYmFzZTsKLSAgICBpbnQgbjsKLQotICAgIGlmIChzdGF0dXMgPiAwKSB7Ci0KLSAgICAgICAgLyogY3JlYXRlIG1hdGNoIG9iamVjdCAod2l0aCByb29tIGZvciBleHRyYSBncm91cCBtYXJrcykgKi8KLSAgICAgICAgbWF0Y2ggPSBQeU9iamVjdF9ORVdfVkFSKE1hdGNoT2JqZWN0LCAmTWF0Y2hfVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIqKHBhdHRlcm4tPmdyb3VwcysxKSk7Ci0gICAgICAgIGlmICghbWF0Y2gpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICBQeV9JTkNSRUYocGF0dGVybik7Ci0gICAgICAgIG1hdGNoLT5wYXR0ZXJuID0gcGF0dGVybjsKLQotICAgICAgICBQeV9JTkNSRUYoc3RhdGUtPnN0cmluZyk7Ci0gICAgICAgIG1hdGNoLT5zdHJpbmcgPSBzdGF0ZS0+c3RyaW5nOwotCi0gICAgICAgIG1hdGNoLT5yZWdzID0gTlVMTDsKLSAgICAgICAgbWF0Y2gtPmdyb3VwcyA9IHBhdHRlcm4tPmdyb3VwcysxOwotCi0gICAgICAgIC8qIGZpbGwgaW4gZ3JvdXAgc2xpY2VzICovCi0KLSAgICAgICAgYmFzZSA9IChjaGFyKikgc3RhdGUtPmJlZ2lubmluZzsKLSAgICAgICAgbiA9IHN0YXRlLT5jaGFyc2l6ZTsKLQotICAgICAgICBtYXRjaC0+bWFya1swXSA9ICgoY2hhciopIHN0YXRlLT5zdGFydCAtIGJhc2UpIC8gbjsKLSAgICAgICAgbWF0Y2gtPm1hcmtbMV0gPSAoKGNoYXIqKSBzdGF0ZS0+cHRyIC0gYmFzZSkgLyBuOwotCi0gICAgICAgIGZvciAoaSA9IGogPSAwOyBpIDwgcGF0dGVybi0+Z3JvdXBzOyBpKyssIGorPTIpCi0gICAgICAgICAgICBpZiAoaisxIDw9IHN0YXRlLT5sYXN0bWFyayAmJiBzdGF0ZS0+bWFya1tqXSAmJiBzdGF0ZS0+bWFya1tqKzFdKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2gtPm1hcmtbaisyXSA9ICgoY2hhciopIHN0YXRlLT5tYXJrW2pdIC0gYmFzZSkgLyBuOwotICAgICAgICAgICAgICAgIG1hdGNoLT5tYXJrW2orM10gPSAoKGNoYXIqKSBzdGF0ZS0+bWFya1tqKzFdIC0gYmFzZSkgLyBuOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgbWF0Y2gtPm1hcmtbaisyXSA9IG1hdGNoLT5tYXJrW2orM10gPSAtMTsgLyogdW5kZWZpbmVkICovCi0KLSAgICAgICAgbWF0Y2gtPnBvcyA9IHN0YXRlLT5wb3M7Ci0gICAgICAgIG1hdGNoLT5lbmRwb3MgPSBzdGF0ZS0+ZW5kcG9zOwotCi0gICAgICAgIG1hdGNoLT5sYXN0aW5kZXggPSBzdGF0ZS0+bGFzdGluZGV4OwotCi0gICAgICAgIHJldHVybiAoUHlPYmplY3QqKSBtYXRjaDsKLQotICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IDApIHsKLQotICAgICAgICAvKiBubyBtYXRjaCAqLwotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOwotCi0gICAgfQotCi0gICAgLyogaW50ZXJuYWwgZXJyb3IgKi8KLSAgICBwYXR0ZXJuX2Vycm9yKHN0YXR1cyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCoKLXBhdHRlcm5fc2Nhbm5lcihQYXR0ZXJuT2JqZWN0KiBwYXR0ZXJuLCBQeU9iamVjdCogYXJncykKLXsKLSAgICAvKiBjcmVhdGUgc2VhcmNoIHN0YXRlIG9iamVjdCAqLwotCi0gICAgU2Nhbm5lck9iamVjdCogc2VsZjsKLQotICAgIFB5T2JqZWN0KiBzdHJpbmc7Ci0gICAgaW50IHN0YXJ0ID0gMDsKLSAgICBpbnQgZW5kID0gSU5UX01BWDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aWk6c2Nhbm5lciIsICZzdHJpbmcsICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogY3JlYXRlIHNjYW5uZXIgb2JqZWN0ICovCi0gICAgc2VsZiA9IFB5T2JqZWN0X05FVyhTY2FubmVyT2JqZWN0LCAmU2Nhbm5lcl9UeXBlKTsKLSAgICBpZiAoIXNlbGYpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgc3RyaW5nID0gc3RhdGVfaW5pdCgmc2VsZi0+c3RhdGUsIHBhdHRlcm4sIHN0cmluZywgc3RhcnQsIGVuZCk7Ci0gICAgaWYgKCFzdHJpbmcpIHsKLSAgICAgICAgUHlPYmplY3RfREVMKHNlbGYpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBQeV9JTkNSRUYocGF0dGVybik7Ci0gICAgc2VsZi0+cGF0dGVybiA9IChQeU9iamVjdCopIHBhdHRlcm47Ci0KLSAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKLX0KLQogc3RhdGljIHZvaWQKIHBhdHRlcm5fZGVhbGxvYyhQYXR0ZXJuT2JqZWN0KiBzZWxmKQogewpAQCAtMjQxNCw3ICsyMjU4LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0KgotcGF0dGVybl9zdWJ4KFBhdHRlcm5PYmplY3QqIHNlbGYsIFB5T2JqZWN0KiB0ZW1wbGF0ZSwgUHlPYmplY3QqIHN0cmluZywKK3BhdHRlcm5fc3VieChQYXR0ZXJuT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogcHRlbXBsYXRlLCBQeU9iamVjdCogc3RyaW5nLAogICAgICAgICAgICAgIGludCBjb3VudCwgaW50IHN1Ym4pCiB7CiAgICAgU1JFX1NUQVRFIHN0YXRlOwpAQCAtMjQyOSwyMSArMjI3MywyMSBAQAogICAgIGludCBpLCBiLCBlOwogICAgIGludCBmaWx0ZXJfaXNfY2FsbGFibGU7CiAKLSAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayh0ZW1wbGF0ZSkpIHsKKyAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayhwdGVtcGxhdGUpKSB7CiAgICAgICAgIC8qIHN1Yi9zdWJuIHRha2VzIGVpdGhlciBhIGZ1bmN0aW9uIG9yIGEgdGVtcGxhdGUgKi8KLSAgICAgICAgZmlsdGVyID0gdGVtcGxhdGU7CisgICAgICAgIGZpbHRlciA9IHB0ZW1wbGF0ZTsKICAgICAgICAgUHlfSU5DUkVGKGZpbHRlcik7CiAgICAgICAgIGZpbHRlcl9pc19jYWxsYWJsZSA9IDE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogaWYgbm90IGNhbGxhYmxlLCBjaGVjayBpZiBpdCdzIGEgbGl0ZXJhbCBzdHJpbmcgKi8KICAgICAgICAgaW50IGxpdGVyYWw7Ci0gICAgICAgIHB0ciA9IGdldHN0cmluZyh0ZW1wbGF0ZSwgJm4sICZiKTsKKyAgICAgICAgcHRyID0gZ2V0c3RyaW5nKHB0ZW1wbGF0ZSwgJm4sICZiKTsKICAgICAgICAgaWYgKHB0cikgewogICAgICAgICAgICAgaWYgKGIgPT0gMSkgewotICAgICAgICAgICAgICAgIGxpdGVyYWwgPSBzcmVfbGl0ZXJhbF90ZW1wbGF0ZShwdHIsIG4pOworCQkgICAgbGl0ZXJhbCA9IHNyZV9saXRlcmFsX3RlbXBsYXRlKCh1bnNpZ25lZCBjaGFyICopcHRyLCBuKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAjaWYgZGVmaW5lZChIQVZFX1VOSUNPREUpCi0gICAgICAgICAgICAgICAgbGl0ZXJhbCA9IHNyZV91bGl0ZXJhbF90ZW1wbGF0ZShwdHIsIG4pOworCQkgICAgbGl0ZXJhbCA9IHNyZV91bGl0ZXJhbF90ZW1wbGF0ZSgoUHlfVU5JQ09ERSAqKXB0ciwgbik7CiAjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKQEAgLTI0NTEsMTQgKzIyOTUsMTQgQEAKICAgICAgICAgICAgIGxpdGVyYWwgPSAwOwogICAgICAgICB9CiAgICAgICAgIGlmIChsaXRlcmFsKSB7Ci0gICAgICAgICAgICBmaWx0ZXIgPSB0ZW1wbGF0ZTsKKyAgICAgICAgICAgIGZpbHRlciA9IHB0ZW1wbGF0ZTsKICAgICAgICAgICAgIFB5X0lOQ1JFRihmaWx0ZXIpOwogICAgICAgICAgICAgZmlsdGVyX2lzX2NhbGxhYmxlID0gMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIG5vdCBhIGxpdGVyYWw7IGhhbmQgaXQgb3ZlciB0byB0aGUgdGVtcGxhdGUgY29tcGlsZXIgKi8KICAgICAgICAgICAgIGZpbHRlciA9IGNhbGwoCiAgICAgICAgICAgICAgICAgU1JFX1BZX01PRFVMRSwgIl9zdWJ4IiwKLSAgICAgICAgICAgICAgICBQeVR1cGxlX1BhY2soMiwgc2VsZiwgdGVtcGxhdGUpCisgICAgICAgICAgICAgICAgUHlUdXBsZV9QYWNrKDIsIHNlbGYsIHB0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgaWYgKCFmaWx0ZXIpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yNTk3LDI5ICsyNDQxLDI5IEBACiBzdGF0aWMgUHlPYmplY3QqCiBwYXR0ZXJuX3N1YihQYXR0ZXJuT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3KQogewotICAgIFB5T2JqZWN0KiB0ZW1wbGF0ZTsKKyAgICBQeU9iamVjdCogcHRlbXBsYXRlOwogICAgIFB5T2JqZWN0KiBzdHJpbmc7CiAgICAgaW50IGNvdW50ID0gMDsKICAgICBzdGF0aWMgY2hhcioga3dsaXN0W10gPSB7ICJyZXBsIiwgInN0cmluZyIsICJjb3VudCIsIE5VTEwgfTsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfGk6c3ViIiwga3dsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wbGF0ZSwgJnN0cmluZywgJmNvdW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRlbXBsYXRlLCAmc3RyaW5nLCAmY291bnQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHJldHVybiBwYXR0ZXJuX3N1Yngoc2VsZiwgdGVtcGxhdGUsIHN0cmluZywgY291bnQsIDApOworICAgIHJldHVybiBwYXR0ZXJuX3N1Yngoc2VsZiwgcHRlbXBsYXRlLCBzdHJpbmcsIGNvdW50LCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcGF0dGVybl9zdWJuKFBhdHRlcm5PYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3cpCiB7Ci0gICAgUHlPYmplY3QqIHRlbXBsYXRlOworICAgIFB5T2JqZWN0KiBwdGVtcGxhdGU7CiAgICAgUHlPYmplY3QqIHN0cmluZzsKICAgICBpbnQgY291bnQgPSAwOwogICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInJlcGwiLCAic3RyaW5nIiwgImNvdW50IiwgTlVMTCB9OwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098aTpzdWJuIiwga3dsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wbGF0ZSwgJnN0cmluZywgJmNvdW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRlbXBsYXRlLCAmc3RyaW5nLCAmY291bnQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHJldHVybiBwYXR0ZXJuX3N1Yngoc2VsZiwgdGVtcGxhdGUsIHN0cmluZywgY291bnQsIDEpOworICAgIHJldHVybiBwYXR0ZXJuX3N1Yngoc2VsZiwgcHRlbXBsYXRlLCBzdHJpbmcsIGNvdW50LCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgpAQCAtMjc5OSw2ICsyNjQzLDY4IEBACiAgICAgb2Zmc2V0b2YoUGF0dGVybk9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogfTsKIAorc3RhdGljIFB5T2JqZWN0ICoKK19jb21waWxlKFB5T2JqZWN0KiBzZWxmXywgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgLyogImNvbXBpbGUiIHBhdHRlcm4gZGVzY3JpcHRvciB0byBwYXR0ZXJuIG9iamVjdCAqLworCisgICAgUGF0dGVybk9iamVjdCogc2VsZjsKKyAgICBpbnQgaSwgbjsKKworICAgIFB5T2JqZWN0KiBwYXR0ZXJuOworICAgIGludCBmbGFncyA9IDA7CisgICAgUHlPYmplY3QqIGNvZGU7CisgICAgaW50IGdyb3VwcyA9IDA7CisgICAgUHlPYmplY3QqIGdyb3VwaW5kZXggPSBOVUxMOworICAgIFB5T2JqZWN0KiBpbmRleGdyb3VwID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pTyF8aU9PIiwgJnBhdHRlcm4sICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5TGlzdF9UeXBlLCAmY29kZSwgJmdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwaW5kZXgsICZpbmRleGdyb3VwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGNvZGUpOworCisgICAgc2VsZiA9IFB5T2JqZWN0X05FV19WQVIoUGF0dGVybk9iamVjdCwgJlBhdHRlcm5fVHlwZSwgbik7CisgICAgaWYgKCFzZWxmKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHNlbGYtPmNvZGVzaXplID0gbjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKm8gPSBQeUxpc3RfR0VUX0lURU0oY29kZSwgaSk7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUgPSBQeUludF9DaGVjayhvKSA/ICh1bnNpZ25lZCBsb25nKVB5SW50X0FzTG9uZyhvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUHlMb25nX0FzVW5zaWduZWRMb25nKG8pOworICAgICAgICBzZWxmLT5jb2RlW2ldID0gKFNSRV9DT0RFKSB2YWx1ZTsKKyAgICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBzZWxmLT5jb2RlW2ldICE9IHZhbHVlKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVndWxhciBleHByZXNzaW9uIGNvZGUgc2l6ZSBsaW1pdCBleGNlZWRlZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeU9iamVjdF9ERUwoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X0lOQ1JFRihwYXR0ZXJuKTsKKyAgICBzZWxmLT5wYXR0ZXJuID0gcGF0dGVybjsKKworICAgIHNlbGYtPmZsYWdzID0gZmxhZ3M7CisKKyAgICBzZWxmLT5ncm91cHMgPSBncm91cHM7CisKKyAgICBQeV9YSU5DUkVGKGdyb3VwaW5kZXgpOworICAgIHNlbGYtPmdyb3VwaW5kZXggPSBncm91cGluZGV4OworCisgICAgUHlfWElOQ1JFRihpbmRleGdyb3VwKTsKKyAgICBzZWxmLT5pbmRleGdyb3VwID0gaW5kZXhncm91cDsKKworICAgIHNlbGYtPndlYWtyZWZsaXN0ID0gTlVMTDsKKworICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogbWF0Y2ggbWV0aG9kcyAqLwogCkBAIC0yODY4LDE0ICsyNzc0LDE0IEBACiBzdGF0aWMgUHlPYmplY3QqCiBtYXRjaF9leHBhbmQoTWF0Y2hPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotICAgIFB5T2JqZWN0KiB0ZW1wbGF0ZTsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86ZXhwYW5kIiwgJnRlbXBsYXRlKSkKKyAgICBQeU9iamVjdCogcHRlbXBsYXRlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpleHBhbmQiLCAmcHRlbXBsYXRlKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICAvKiBkZWxlZ2F0ZSB0byBQeXRob24gY29kZSAqLwogICAgIHJldHVybiBjYWxsKAogICAgICAgICBTUkVfUFlfTU9EVUxFLCAiX2V4cGFuZCIsCi0gICAgICAgIFB5VHVwbGVfUGFjaygzLCBzZWxmLT5wYXR0ZXJuLCBzZWxmLCB0ZW1wbGF0ZSkKKyAgICAgICAgUHlUdXBsZV9QYWNrKDMsIHNlbGYtPnBhdHRlcm4sIHNlbGYsIHB0ZW1wbGF0ZSkKICAgICAgICAgKTsKIH0KIApAQCAtMzI2Miw2ICszMTY4LDY5IEBACiAgICAgKGdldGF0dHJmdW5jKW1hdGNoX2dldGF0dHIgLyp0cF9nZXRhdHRyKi8KIH07CiAKK3N0YXRpYyBQeU9iamVjdCoKK3BhdHRlcm5fbmV3X21hdGNoKFBhdHRlcm5PYmplY3QqIHBhdHRlcm4sIFNSRV9TVEFURSogc3RhdGUsIGludCBzdGF0dXMpCit7CisgICAgLyogY3JlYXRlIG1hdGNoIG9iamVjdCAoZnJvbSBzdGF0ZSBvYmplY3QpICovCisKKyAgICBNYXRjaE9iamVjdCogbWF0Y2g7CisgICAgaW50IGksIGo7CisgICAgY2hhciogYmFzZTsKKyAgICBpbnQgbjsKKworICAgIGlmIChzdGF0dXMgPiAwKSB7CisKKyAgICAgICAgLyogY3JlYXRlIG1hdGNoIG9iamVjdCAod2l0aCByb29tIGZvciBleHRyYSBncm91cCBtYXJrcykgKi8KKyAgICAgICAgbWF0Y2ggPSBQeU9iamVjdF9ORVdfVkFSKE1hdGNoT2JqZWN0LCAmTWF0Y2hfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIqKHBhdHRlcm4tPmdyb3VwcysxKSk7CisgICAgICAgIGlmICghbWF0Y2gpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBQeV9JTkNSRUYocGF0dGVybik7CisgICAgICAgIG1hdGNoLT5wYXR0ZXJuID0gcGF0dGVybjsKKworICAgICAgICBQeV9JTkNSRUYoc3RhdGUtPnN0cmluZyk7CisgICAgICAgIG1hdGNoLT5zdHJpbmcgPSBzdGF0ZS0+c3RyaW5nOworCisgICAgICAgIG1hdGNoLT5yZWdzID0gTlVMTDsKKyAgICAgICAgbWF0Y2gtPmdyb3VwcyA9IHBhdHRlcm4tPmdyb3VwcysxOworCisgICAgICAgIC8qIGZpbGwgaW4gZ3JvdXAgc2xpY2VzICovCisKKyAgICAgICAgYmFzZSA9IChjaGFyKikgc3RhdGUtPmJlZ2lubmluZzsKKyAgICAgICAgbiA9IHN0YXRlLT5jaGFyc2l6ZTsKKworICAgICAgICBtYXRjaC0+bWFya1swXSA9ICgoY2hhciopIHN0YXRlLT5zdGFydCAtIGJhc2UpIC8gbjsKKyAgICAgICAgbWF0Y2gtPm1hcmtbMV0gPSAoKGNoYXIqKSBzdGF0ZS0+cHRyIC0gYmFzZSkgLyBuOworCisgICAgICAgIGZvciAoaSA9IGogPSAwOyBpIDwgcGF0dGVybi0+Z3JvdXBzOyBpKyssIGorPTIpCisgICAgICAgICAgICBpZiAoaisxIDw9IHN0YXRlLT5sYXN0bWFyayAmJiBzdGF0ZS0+bWFya1tqXSAmJiBzdGF0ZS0+bWFya1tqKzFdKSB7CisgICAgICAgICAgICAgICAgbWF0Y2gtPm1hcmtbaisyXSA9ICgoY2hhciopIHN0YXRlLT5tYXJrW2pdIC0gYmFzZSkgLyBuOworICAgICAgICAgICAgICAgIG1hdGNoLT5tYXJrW2orM10gPSAoKGNoYXIqKSBzdGF0ZS0+bWFya1tqKzFdIC0gYmFzZSkgLyBuOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbWF0Y2gtPm1hcmtbaisyXSA9IG1hdGNoLT5tYXJrW2orM10gPSAtMTsgLyogdW5kZWZpbmVkICovCisKKyAgICAgICAgbWF0Y2gtPnBvcyA9IHN0YXRlLT5wb3M7CisgICAgICAgIG1hdGNoLT5lbmRwb3MgPSBzdGF0ZS0+ZW5kcG9zOworCisgICAgICAgIG1hdGNoLT5sYXN0aW5kZXggPSBzdGF0ZS0+bGFzdGluZGV4OworCisgICAgICAgIHJldHVybiAoUHlPYmplY3QqKSBtYXRjaDsKKworICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IDApIHsKKworICAgICAgICAvKiBubyBtYXRjaCAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworCisgICAgfQorCisgICAgLyogaW50ZXJuYWwgZXJyb3IgKi8KKyAgICBwYXR0ZXJuX2Vycm9yKHN0YXR1cyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIHNjYW5uZXIgbWV0aG9kcyAoZXhwZXJpbWVudGFsKSAqLwogCkBAIC0zMzcyLDYgKzMzNDEsMzYgQEAKICAgICAoZ2V0YXR0cmZ1bmMpc2Nhbm5lcl9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwogfTsKIAorc3RhdGljIFB5T2JqZWN0KgorcGF0dGVybl9zY2FubmVyKFBhdHRlcm5PYmplY3QqIHBhdHRlcm4sIFB5T2JqZWN0KiBhcmdzKQoreworICAgIC8qIGNyZWF0ZSBzZWFyY2ggc3RhdGUgb2JqZWN0ICovCisKKyAgICBTY2FubmVyT2JqZWN0KiBzZWxmOworCisgICAgUHlPYmplY3QqIHN0cmluZzsKKyAgICBpbnQgc3RhcnQgPSAwOworICAgIGludCBlbmQgPSBJTlRfTUFYOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpaTpzY2FubmVyIiwgJnN0cmluZywgJnN0YXJ0LCAmZW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBjcmVhdGUgc2Nhbm5lciBvYmplY3QgKi8KKyAgICBzZWxmID0gUHlPYmplY3RfTkVXKFNjYW5uZXJPYmplY3QsICZTY2FubmVyX1R5cGUpOworICAgIGlmICghc2VsZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzdHJpbmcgPSBzdGF0ZV9pbml0KCZzZWxmLT5zdGF0ZSwgcGF0dGVybiwgc3RyaW5nLCBzdGFydCwgZW5kKTsKKyAgICBpZiAoIXN0cmluZykgeworICAgICAgICBQeU9iamVjdF9ERUwoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X0lOQ1JFRihwYXR0ZXJuKTsKKyAgICBzZWxmLT5wYXR0ZXJuID0gKFB5T2JqZWN0KikgcGF0dGVybjsKKworICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOworfQorCiBzdGF0aWMgUHlNZXRob2REZWYgX2Z1bmN0aW9uc1tdID0gewogICAgIHsiY29tcGlsZSIsIF9jb21waWxlLCBNRVRIX1ZBUkFSR1N9LAogICAgIHsiZ2V0Y29kZXNpemUiLCBzcmVfY29kZXNpemUsIE1FVEhfVkFSQVJHU30sCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zc2wuYyBiL01vZHVsZXMvX3NzbC5jCmluZGV4IDVmNTQxZjUuLjRjMGRhNmYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NzbC5jCisrKyBiL01vZHVsZXMvX3NzbC5jCkBAIC01NSw3ICs1NSw2IEBACiAJU1NMX0NUWCogCWN0eDsKIAlTU0wqICAgICAJc3NsOwogCVg1MDkqICAgIAlzZXJ2ZXJfY2VydDsKLQlCSU8qCQlzYmlvOwogCWNoYXIgICAgCXNlcnZlcltYNTA5X05BTUVfTUFYTEVOXTsKIAljaGFyCQlpc3N1ZXJbWDUwOV9OQU1FX01BWExFTl07CiAKQEAgLTQ3NCwxNSArNDczLDIyIEBACiAKIAlpZiAoIShidWYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSAwLCBsZW4pKSkKIAkJcmV0dXJuIE5VTEw7CisJCisJLyogZmlyc3QgY2hlY2sgaWYgdGhlcmUgYXJlIGJ5dGVzIHJlYWR5IHRvIGJlIHJlYWQgKi8KKwlQeV9CRUdJTl9BTExPV19USFJFQURTCisJY291bnQgPSBTU0xfcGVuZGluZyhzZWxmLT5zc2wpOworCVB5X0VORF9BTExPV19USFJFQURTCiAKLQlzb2Nrc3RhdGUgPSBjaGVja19zb2NrZXRfYW5kX3dhaXRfZm9yX3RpbWVvdXQoc2VsZi0+U29ja2V0LCAwKTsKLQlpZiAoc29ja3N0YXRlID09IFNPQ0tFVF9IQVNfVElNRURfT1VUKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeVNTTEVycm9yT2JqZWN0LCAiVGhlIHJlYWQgb3BlcmF0aW9uIHRpbWVkIG91dCIpOwotCQlQeV9ERUNSRUYoYnVmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIGlmIChzb2Nrc3RhdGUgPT0gU09DS0VUX1RPT19MQVJHRV9GT1JfU0VMRUNUKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeVNTTEVycm9yT2JqZWN0LCAiVW5kZXJseWluZyBzb2NrZXQgdG9vIGxhcmdlIGZvciBzZWxlY3QoKS4iKTsKLQkJcmV0dXJuIE5VTEw7CisJaWYgKCFjb3VudCkgeworCQlzb2Nrc3RhdGUgPSBjaGVja19zb2NrZXRfYW5kX3dhaXRfZm9yX3RpbWVvdXQoc2VsZi0+U29ja2V0LCAwKTsKKwkJaWYgKHNvY2tzdGF0ZSA9PSBTT0NLRVRfSEFTX1RJTUVEX09VVCkgeworCQkJUHlFcnJfU2V0U3RyaW5nKFB5U1NMRXJyb3JPYmplY3QsICJUaGUgcmVhZCBvcGVyYXRpb24gdGltZWQgb3V0Iik7CisJCQlQeV9ERUNSRUYoYnVmKTsKKwkJCXJldHVybiBOVUxMOworCQl9IGVsc2UgaWYgKHNvY2tzdGF0ZSA9PSBTT0NLRVRfVE9PX0xBUkdFX0ZPUl9TRUxFQ1QpIHsKKwkJCVB5RXJyX1NldFN0cmluZyhQeVNTTEVycm9yT2JqZWN0LCAiVW5kZXJseWluZyBzb2NrZXQgdG9vIGxhcmdlIGZvciBzZWxlY3QoKS4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CiAJfQogCWRvIHsKIAkJZXJyID0gMDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMgYi9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCmluZGV4IDZkOGVhM2MuLmU4ODgxZGMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYwpAQCAtMTAsNyArMTAsNiBAQAogI2lmZGVmIFdJVEhfVEhSRUFECiAjaW5jbHVkZSAicHl0aHJlYWQuaCIKICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwotCiBzdGF0aWMgUHlPYmplY3QgKlRlc3RFcnJvcjsJLyogc2V0IHRvIGV4Y2VwdGlvbiBvYmplY3QgaW4gaW5pdCAqLwogCiAvKiBSYWlzZSBUZXN0RXJyb3Igd2l0aCB0ZXN0X25hbWUgKyAiOiAiICsgbXNnLCBhbmQgcmV0dXJuIE5VTEwuICovCkBAIC0yMzUsNyArMjM0LDcgQEAKICNpbmNsdWRlICJ0ZXN0Y2FwaV9sb25nLmgiCiAKIHN0YXRpYyBQeU9iamVjdCAqCi10ZXN0X2xvbmdsb25nX2FwaShQeU9iamVjdCogc2VsZikKK3Rlc3RfbG9uZ2xvbmdfYXBpKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAlyZXR1cm4gVEVTVE5BTUUocmFpc2VfdGVzdF9sb25nbG9uZ19lcnJvcik7CiB9CkBAIC0zNjEsNiArMzYwLDE1IEBACiAJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh2YWx1ZSk7CiB9CiAKK3N0YXRpYyBQeU9iamVjdCAqCitnZXRhcmdzX24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCVB5X3NzaXplX3QgdmFsdWU7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuIiwgJnZhbHVlKSkKKwlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QodmFsdWUpOworfQorCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX0woUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQpAQCAtNDA1LDcgKzQxMyw3IEBACiAKICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgbnVtKTsKIAotICAgICAgICB2YWx1ZSA9IC0xOworICAgICAgICB2YWx1ZSA9IDA7CiAgICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAiazp0ZXN0X2tfY29kZSIsICZ2YWx1ZSkgPCAwKQogICAgICAgICAJcmV0dXJuIE5VTEw7CiAgICAgICAgIGlmICh2YWx1ZSAhPSBVTE9OR19NQVgpCkBAIC00MjQsNyArNDMyLDcgQEAKIAogICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOwogCi0JdmFsdWUgPSAtMTsKKwl2YWx1ZSA9IDA7CiAgICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAiazp0ZXN0X2tfY29kZSIsICZ2YWx1ZSkgPCAwKQogICAgICAgICAJcmV0dXJuIE5VTEw7CiAgICAgICAgIGlmICh2YWx1ZSAhPSAodW5zaWduZWQgbG9uZyktMHg0MikKQEAgLTQ3OCw2ICs0ODYsMjYgQEAKIAlyZXR1cm4gUHlfTm9uZTsKIH0KIAorc3RhdGljCitQeU9iamVjdCAqY29kZWNfaW5jcmVtZW50YWxlbmNvZGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwljb25zdCBjaGFyICplbmNvZGluZywgKmVycm9ycyA9IE5VTEw7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHM6dGVzdF9pbmNyZW1lbnRhbGVuY29kZXIiLAorCQkJICAgICAgJmVuY29kaW5nLCAmZXJyb3JzKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIFB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyKGVuY29kaW5nLCBlcnJvcnMpOworfQorCitzdGF0aWMKK1B5T2JqZWN0ICpjb2RlY19pbmNyZW1lbnRhbGRlY29kZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCWNvbnN0IGNoYXIgKmVuY29kaW5nLCAqZXJyb3JzID0gTlVMTDsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8czp0ZXN0X2luY3JlbWVudGFsZGVjb2RlciIsCisJCQkgICAgICAmZW5jb2RpbmcsICZlcnJvcnMpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXIoZW5jb2RpbmcsIGVycm9ycyk7Cit9CisKICNlbmRpZgogCiAvKiBTaW1wbGUgdGVzdCBvZiBfUHlMb25nX051bUJpdHMgYW5kIF9QeUxvbmdfU2lnbi4gKi8KQEAgLTU2Myw3ICs1OTEsMTcgQEAKIAogI2lmZGVmIFdJVEhfVEhSRUFECiAKLXZvaWQgX21ha2VfY2FsbCh2b2lkICpjYWxsYWJsZSkKKy8qIHRlc3RfdGhyZWFkX3N0YXRlIHNwYXducyBhIHRocmVhZCBvZiBpdHMgb3duLCBhbmQgdGhhdCB0aHJlYWQgcmVsZWFzZXMKKyAqIGB0aHJlYWRfZG9uZWAgd2hlbiBpdCdzIGZpbmlzaGVkLiAgVGhlIGRyaXZlciBjb2RlIGhhcyB0byBrbm93IHdoZW4gdGhlCisgKiB0aHJlYWQgZmluaXNoZXMsIGJlY2F1c2UgdGhlIHRocmVhZCB1c2VzIGEgUHlPYmplY3QgKHRoZSBjYWxsYWJsZSkgdGhhdAorICogbWF5IGdvIGF3YXkgd2hlbiB0aGUgZHJpdmVyIGZpbmlzaGVzLiAgVGhlIGZvcm1lciBsYWNrIG9mIHRoaXMgZXhwbGljaXQKKyAqIHN5bmNocm9uaXphdGlvbiBjYXVzZWQgcmFyZSBzZWdmYXVsdHMsIHNvIHJhcmUgdGhhdCB0aGV5IHdlcmUgc2VlbiBvbmx5CisgKiBvbiBhIE1hYyBidWlsZGJvdCAoYWx0aG91Z2ggdGhleSB3ZXJlIHBvc3NpYmxlIG9uIGFueSBib3gpLgorICovCitzdGF0aWMgUHlUaHJlYWRfdHlwZV9sb2NrIHRocmVhZF9kb25lID0gTlVMTDsKKworc3RhdGljIHZvaWQKK19tYWtlX2NhbGwodm9pZCAqY2FsbGFibGUpCiB7CiAJUHlPYmplY3QgKnJjOwogCVB5R0lMU3RhdGVfU1RBVEUgcyA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CkBAIC01NzIsMzIgKzYxMCw1MyBAQAogCVB5R0lMU3RhdGVfUmVsZWFzZShzKTsKIH0KIAorLyogU2FtZSB0aGluZywgYnV0IHJlbGVhc2VzIGB0aHJlYWRfZG9uZWAgd2hlbiBpdCByZXR1cm5zLiAgVGhpcyB2YXJpYW50CisgKiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgZnJvbSB0aHJlYWRzIHNwYXduZWQgYnkgdGVzdF90aHJlYWRfc3RhdGUoKS4KKyAqLworc3RhdGljIHZvaWQKK19tYWtlX2NhbGxfZnJvbV90aHJlYWQodm9pZCAqY2FsbGFibGUpCit7CisJX21ha2VfY2FsbChjYWxsYWJsZSk7CisJUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRocmVhZF9kb25lKTsKK30KKwogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfdGhyZWFkX3N0YXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAlQeU9iamVjdCAqZm47CisKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86dGVzdF90aHJlYWRfc3RhdGUiLCAmZm4pKQogCQlyZXR1cm4gTlVMTDsKLQkvKiBFbnN1cmUgUHl0aG9uIGlzIHNldHVwIGZvciB0aHJlYWRpbmcgKi8KKworCS8qIEVuc3VyZSBQeXRob24gaXMgc2V0IHVwIGZvciB0aHJlYWRpbmcgKi8KIAlQeUV2YWxfSW5pdFRocmVhZHMoKTsKLQkvKiBTdGFydCBhIG5ldyB0aHJlYWQgZm9yIG91ciBjYWxsYmFjay4gKi8KLQlQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKCBfbWFrZV9jYWxsLCBmbik7CisJdGhyZWFkX2RvbmUgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisJaWYgKHRocmVhZF9kb25lID09IE5VTEwpCisJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworCVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0aHJlYWRfZG9uZSwgMSk7CisKKwkvKiBTdGFydCBhIG5ldyB0aHJlYWQgd2l0aCBvdXIgY2FsbGJhY2suICovCisJUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZChfbWFrZV9jYWxsX2Zyb21fdGhyZWFkLCBmbik7CiAJLyogTWFrZSB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgdGhyZWFkIGxvY2sgaGVsZCBieSB0aGlzIHRocmVhZCAqLwogCV9tYWtlX2NhbGwoZm4pOwogCS8qIERvIGl0IGFsbCBhZ2FpbiwgYnV0IHRoaXMgdGltZSB3aXRoIHRoZSB0aHJlYWQtbG9jayByZWxlYXNlZCAqLwogCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAlfbWFrZV9jYWxsKGZuKTsKKwlQeVRocmVhZF9hY3F1aXJlX2xvY2sodGhyZWFkX2RvbmUsIDEpOyAgLyogd2FpdCBmb3IgdGhyZWFkIHRvIGZpbmlzaCAqLwogCVB5X0VORF9BTExPV19USFJFQURTCisKIAkvKiBBbmQgb25jZSBtb3JlIHdpdGggYW5kIHdpdGhvdXQgYSB0aHJlYWQKLQkgICBYWFggLSBzaG91bGQgdXNlIGEgbG9jayBhbmQgd29yayBvdXQgZXhhY3RseSB3aGF0IHdlIGFyZSB0cnlpbmcgCi0JICAgdG8gdGVzdCA8d2luaz4gCisJICAgWFhYIC0gc2hvdWxkIHVzZSBhIGxvY2sgYW5kIHdvcmsgb3V0IGV4YWN0bHkgd2hhdCB3ZSBhcmUgdHJ5aW5nCisJICAgdG8gdGVzdCA8d2luaz4KIAkqLwogCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKCBfbWFrZV9jYWxsLCBmbik7CisJUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZChfbWFrZV9jYWxsX2Zyb21fdGhyZWFkLCBmbik7CiAJX21ha2VfY2FsbChmbik7CisJUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRocmVhZF9kb25lLCAxKTsgIC8qIHdhaXQgZm9yIHRocmVhZCB0byBmaW5pc2ggKi8KIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKworCVB5VGhyZWFkX2ZyZWVfbG9jayh0aHJlYWRfZG9uZSk7CisJUHlfUkVUVVJOX05PTkU7CiB9CiAjZW5kaWYKIApAQCAtNjExLDI0ICs2NzAsMjkgQEAKIAl7InRlc3Rfa19jb2RlIiwJCShQeUNGdW5jdGlvbil0ZXN0X2tfY29kZSwJIE1FVEhfTk9BUkdTfSwKIAl7InRlc3RfbnVsbF9zdHJpbmdzIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfbnVsbF9zdHJpbmdzLAkgTUVUSF9OT0FSR1N9LAogCi0JeyJnZXRhcmdzX2IiLAkJKFB5Q0Z1bmN0aW9uKWdldGFyZ3NfYiwJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19CIiwJCShQeUNGdW5jdGlvbilnZXRhcmdzX0IsCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfSCIsCQkoUHlDRnVuY3Rpb24pZ2V0YXJnc19ILAkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX0kiLAkJKFB5Q0Z1bmN0aW9uKWdldGFyZ3NfSSwJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19rIiwJCShQeUNGdW5jdGlvbilnZXRhcmdzX2ssCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfaSIsCQkoUHlDRnVuY3Rpb24pZ2V0YXJnc19pLAkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX2wiLAkJKFB5Q0Z1bmN0aW9uKWdldGFyZ3NfbCwJCSBNRVRIX1ZBUkFSR1N9LAorCXsiZ2V0YXJnc19iIiwJCWdldGFyZ3NfYiwJCQkgTUVUSF9WQVJBUkdTfSwKKwl7ImdldGFyZ3NfQiIsCQlnZXRhcmdzX0IsCQkJIE1FVEhfVkFSQVJHU30sCisJeyJnZXRhcmdzX0giLAkJZ2V0YXJnc19ILAkJCSBNRVRIX1ZBUkFSR1N9LAorCXsiZ2V0YXJnc19JIiwJCWdldGFyZ3NfSSwJCQkgTUVUSF9WQVJBUkdTfSwKKwl7ImdldGFyZ3NfayIsCQlnZXRhcmdzX2ssCQkJIE1FVEhfVkFSQVJHU30sCisJeyJnZXRhcmdzX2kiLAkJZ2V0YXJnc19pLAkJCSBNRVRIX1ZBUkFSR1N9LAorCXsiZ2V0YXJnc19sIiwJCWdldGFyZ3NfbCwJCQkgTUVUSF9WQVJBUkdTfSwKKwl7ImdldGFyZ3NfbiIsCQlnZXRhcmdzX24sIAkJCSBNRVRIX1ZBUkFSR1N9LAogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JeyJnZXRhcmdzX0wiLAkJKFB5Q0Z1bmN0aW9uKWdldGFyZ3NfTCwJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19LIiwJCShQeUNGdW5jdGlvbilnZXRhcmdzX0ssCQkgTUVUSF9WQVJBUkdTfSwKLQl7InRlc3RfbG9uZ2xvbmdfYXBpIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfbG9uZ2xvbmdfYXBpLAkgTUVUSF9OT0FSR1N9LAorCXsiZ2V0YXJnc19MIiwJCWdldGFyZ3NfTCwJCQkgTUVUSF9WQVJBUkdTfSwKKwl7ImdldGFyZ3NfSyIsCQlnZXRhcmdzX0ssCQkJIE1FVEhfVkFSQVJHU30sCisJeyJ0ZXN0X2xvbmdsb25nX2FwaSIsCXRlc3RfbG9uZ2xvbmdfYXBpLAkJIE1FVEhfTk9BUkdTfSwKIAl7InRlc3RfTF9jb2RlIiwJCShQeUNGdW5jdGlvbil0ZXN0X0xfY29kZSwJIE1FVEhfTk9BUkdTfSwKKwl7ImNvZGVjX2luY3JlbWVudGFsZW5jb2RlciIsCisJIChQeUNGdW5jdGlvbiljb2RlY19pbmNyZW1lbnRhbGVuY29kZXIsCSBNRVRIX1ZBUkFSR1N9LAorCXsiY29kZWNfaW5jcmVtZW50YWxkZWNvZGVyIiwKKwkgKFB5Q0Z1bmN0aW9uKWNvZGVjX2luY3JlbWVudGFsZGVjb2RlciwJIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiAJeyJ0ZXN0X3VfY29kZSIsCQkoUHlDRnVuY3Rpb24pdGVzdF91X2NvZGUsCSBNRVRIX05PQVJHU30sCiAjZW5kaWYKICNpZmRlZiBXSVRIX1RIUkVBRAotCXsiX3Rlc3RfdGhyZWFkX3N0YXRlIiwgKFB5Q0Z1bmN0aW9uKXRlc3RfdGhyZWFkX3N0YXRlLCBNRVRIX1ZBUkFSR1N9LAorCXsiX3Rlc3RfdGhyZWFkX3N0YXRlIiwgIHRlc3RfdGhyZWFkX3N0YXRlLCAJCSBNRVRIX1ZBUkFSR1N9LAogI2VuZGlmCiAJe05VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCiB9OwpAQCAtNjUwLDggKzcxNCwxMCBAQAogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVUxPTkdfTUFYIiwgUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoVUxPTkdfTUFYKSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJTlRfTUlOIiwgUHlJbnRfRnJvbUxvbmcoSU5UX01JTikpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTE9OR19NSU4iLCBQeUludF9Gcm9tTG9uZyhMT05HX01JTikpOworCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUFlfU1NJWkVfVF9NSU4iLCBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01JTikpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiSU5UX01BWCIsIFB5SW50X0Zyb21Mb25nKElOVF9NQVgpKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxPTkdfTUFYIiwgUHlJbnRfRnJvbUxvbmcoTE9OR19NQVgpKTsKKwlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBZX1NTSVpFX1RfTUFYIiwgUHlJbnRfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NQVgpKTsKIAogCVRlc3RFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiX3Rlc3RjYXBpLmVycm9yIiwgTlVMTCwgTlVMTCk7CiAJUHlfSU5DUkVGKFRlc3RFcnJvcik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL190a2ludGVyLmMgYi9Nb2R1bGVzL190a2ludGVyLmMKaW5kZXggZThlZmFhNy4uYzE3YjZjNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGtpbnRlci5jCisrKyBiL01vZHVsZXMvX3RraW50ZXIuYwpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAKIAlzdHJjcHkoYXJndjAsIGNsYXNzTmFtZSk7CiAJaWYgKGlzdXBwZXIoUHlfQ0hBUk1BU0soYXJndjBbMF0pKSkKLQkJYXJndjBbMF0gPSB0b2xvd2VyKGFyZ3YwWzBdKTsKKwkJYXJndjBbMF0gPSB0b2xvd2VyKFB5X0NIQVJNQVNLKGFyZ3YwWzBdKSk7CiAJVGNsX1NldFZhcih2LT5pbnRlcnAsICJhcmd2MCIsIGFyZ3YwLCBUQ0xfR0xPQkFMX09OTFkpOwogCWNrZnJlZShhcmd2MCk7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvYWxtb2R1bGUuYyBiL01vZHVsZXMvYWxtb2R1bGUuYwppbmRleCA1MjU0ZmNhLi5mYmViMTNhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2FsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9hbG1vZHVsZS5jCkBAIC0xNDgyLDcgKzE0ODIsOCBAQAogCX0KIAlpZiAoYWxHZXRQYXJhbXMocmVzb3VyY2UsIHB2cywgbnB2cykgPCAwKQogCQlnb3RvIGVycm9yOwotCXYgPSBQeUxpc3RfTmV3KG5wdnMpOworCWlmICghKHYgPSBQeUxpc3RfTmV3KG5wdnMpKSkKKwkJZ290byBlcnJvcjsKIAlmb3IgKGkgPSAwOyBpIDwgbnB2czsgaSsrKSB7CiAJCWlmIChwdnNbaV0uc2l6ZU91dCA8IDApIHsKIAkJCWNoYXIgYnVmWzMyXTsKQEAgLTE2OTIsNiArMTY5Myw3IEBACiAJaWYgKGFsR2V0UGFyYW1JbmZvKHJlcywgcGFyYW0sICZwaW5mbykgPCAwKQogCQlyZXR1cm4gTlVMTDsKIAl2ID0gUHlEaWN0X05ldygpOworCWlmICghdikgcmV0dXJuIE5VTEw7CiAKIAlpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLnJlc291cmNlKTsKIAlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAicmVzb3VyY2UiLCBpdGVtKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvYXJyYXltb2R1bGUuYyBiL01vZHVsZXMvYXJyYXltb2R1bGUuYwppbmRleCAxNjUwZmYyLi41MmE3ZjVlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCkBAIC0xODYsNyArMTg2LDggQEAKIAlpZiAoIVB5QXJnX1BhcnNlKHYsICJ1IzthcnJheSBpdGVtIG11c3QgYmUgdW5pY29kZSBjaGFyYWN0ZXIiLCAmcCwgJmxlbikpCiAJCXJldHVybiAtMTsKIAlpZiAobGVuICE9IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFycmF5IGl0ZW0gbXVzdCBiZSB1bmljb2RlIGNoYXJhY3RlciIpOworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorCQkJCSJhcnJheSBpdGVtIG11c3QgYmUgdW5pY29kZSBjaGFyYWN0ZXIiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAoaSA+PSAwKQpAQCAtMTE2Myw3ICsxMTY0LDcgQEAKIAlyZWdpc3RlciBjaGFyICpwLCAqcTsKIAkvKiBsaXR0bGUgYnVmZmVyIHRvIGhvbGQgaXRlbXMgd2hpbGUgc3dhcHBpbmcgKi8KIAljaGFyIHRtcFsyNTZdOwkvKiA4IGlzIHByb2JhYmx5IGVub3VnaCAtLSBidXQgd2h5IHNraW1wICovCi0JYXNzZXJ0KGl0ZW1zaXplIDw9IHNpemVvZih0bXApKTsKKwlhc3NlcnQoKHNpemVfdClpdGVtc2l6ZSA8PSBzaXplb2YodG1wKSk7CiAKIAlpZiAoc2VsZi0+b2Jfc2l6ZSA+IDEpIHsKIAkJZm9yIChwID0gc2VsZi0+b2JfaXRlbSwKQEAgLTE2NzMsNyArMTY3NCw4IEBACiAJCQl9CiAKIAkJCXNlbGYtPm9iX3NpemUgLT0gc2xpY2VsZW5ndGg7Ci0JCQlzZWxmLT5vYl9pdGVtID0gUHlNZW1fUkVBTExPQyhzZWxmLT5vYl9pdGVtLCBpdGVtc2l6ZSpzZWxmLT5vYl9zaXplKTsKKwkJCXNlbGYtPm9iX2l0ZW0gPSAoY2hhciAqKVB5TWVtX1JFQUxMT0Moc2VsZi0+b2JfaXRlbSwKKwkJCQkJCQkgICAgICBpdGVtc2l6ZSpzZWxmLT5vYl9zaXplKTsKIAkJCXNlbGYtPmFsbG9jYXRlZCA9IHNlbGYtPm9iX3NpemU7CiAKIAkJCXJldHVybiAwOwpAQCAtMTg2NSw3ICsxODY3LDcgQEAKIAkJCQlpZiAobiA+IDApIHsKIAkJCQkJYXJyYXlvYmplY3QgKnNlbGYgPSAoYXJyYXlvYmplY3QgKilhOwogCQkJCQljaGFyICppdGVtID0gc2VsZi0+b2JfaXRlbTsKLQkJCQkJaXRlbSA9IFB5TWVtX1JlYWxsb2MoaXRlbSwgbik7CisJCQkJCWl0ZW0gPSAoY2hhciAqKVB5TWVtX1JlYWxsb2MoaXRlbSwgbik7CiAJCQkJCWlmIChpdGVtID09IE5VTEwpIHsKIAkJCQkJCVB5RXJyX05vTWVtb3J5KCk7CiAJCQkJCQlQeV9ERUNSRUYoYSk7CkBAIC0yMDYwLDggKzIwNjIsNyBAQAogc3RhdGljIGludAogYXJyYXlpdGVyX3RyYXZlcnNlKGFycmF5aXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWlmIChpdC0+YW8gIT0gTlVMTCkKLQkJcmV0dXJuIHZpc2l0KChQeU9iamVjdCAqKShpdC0+YW8pLCBhcmcpOworCVB5X1ZJU0lUKGl0LT5hbyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvYXVkaW9vcC5jIGIvTW9kdWxlcy9hdWRpb29wLmMKaW5kZXggYmVlYWNkMy4uZWQ3MGNkZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9hdWRpb29wLmMKKysrIGIvTW9kdWxlcy9hdWRpb29wLmMKQEAgLTE1LDYgKzE1LDggQEAKICNlbmRpZgogI2VuZGlmCiAKK3R5cGVkZWYgc2hvcnQgUHlJbnQxNjsKKwogI2lmIGRlZmluZWQoX19DSEFSX1VOU0lHTkVEX18pCiAjaWYgZGVmaW5lZChzaWduZWQpCiAvKiBUaGlzIG1vZHVsZSBjdXJyZW50bHkgZG9lcyBub3Qgd29yayBvbiBzeXN0ZW1zIHdoZXJlIG9ubHkgdW5zaWduZWQKQEAgLTIyLDEyMiArMjQsMjY3IEBACiAjZW5kaWYKICNlbmRpZgogCi0vKiBDb2RlIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHNveCwKKy8qIENvZGUgc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gc294LCAxMi4xNy43LCBnNzExLmMKICoqIChjKSBDcmFpZyBSZWVzZSwgSm9lIENhbXBiZWxsIGFuZCBKZWZmIFBvc2thbnplciAxOTg5ICovCiAKLSNkZWZpbmUgTUlOTElOIC0zMjc2OAotI2RlZmluZSBNQVhMSU4gMzI3NjcKLSNkZWZpbmUgTElOQ0xJUCh4KSBkbyB7IGlmICggeCA8IE1JTkxJTiApIHggPSBNSU5MSU4gOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggeCA+IE1BWExJTiApIHggPSBNQVhMSU47IFwKLSAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICggMCApCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHN0X2xpbmVhcl90b191bGF3KGludCBzYW1wbGUpOwotCi0vKgotKiogVGhpcyBtYWNybyBjb252ZXJ0cyBmcm9tIHVsYXcgdG8gMTYgYml0IGxpbmVhciwgZmFzdGVyLgotKioKLSoqIEplZiBQb3NrYW56ZXIKLSoqIDIzIE9jdG9iZXIgMTk4OQotKioKLSoqIElucHV0OiA4IGJpdCB1bGF3IHNhbXBsZQotKiogT3V0cHV0OiBzaWduZWQgMTYgYml0IGxpbmVhciBzYW1wbGUKLSovCi0jZGVmaW5lIHN0X3VsYXdfdG9fbGluZWFyKHVsYXdieXRlKSB1bGF3X3RhYmxlW3VsYXdieXRlXQotCi1zdGF0aWMgaW50IHVsYXdfdGFibGVbMjU2XSA9IHsKLQktMzIxMjQsIC0zMTEwMCwgLTMwMDc2LCAtMjkwNTIsIC0yODAyOCwgLTI3MDA0LCAtMjU5ODAsIC0yNDk1NiwKLQktMjM5MzIsIC0yMjkwOCwgLTIxODg0LCAtMjA4NjAsIC0xOTgzNiwgLTE4ODEyLCAtMTc3ODgsIC0xNjc2NCwKLQktMTU5OTYsIC0xNTQ4NCwgLTE0OTcyLCAtMTQ0NjAsIC0xMzk0OCwgLTEzNDM2LCAtMTI5MjQsIC0xMjQxMiwKLQktMTE5MDAsIC0xMTM4OCwgLTEwODc2LCAtMTAzNjQsICAtOTg1MiwgIC05MzQwLCAgLTg4MjgsICAtODMxNiwKLQktNzkzMiwgIC03Njc2LCAgLTc0MjAsICAtNzE2NCwgIC02OTA4LCAgLTY2NTIsICAtNjM5NiwgIC02MTQwLAotCS01ODg0LCAgLTU2MjgsICAtNTM3MiwgIC01MTE2LCAgLTQ4NjAsICAtNDYwNCwgIC00MzQ4LCAgLTQwOTIsCi0JLTM5MDAsICAtMzc3MiwgIC0zNjQ0LCAgLTM1MTYsICAtMzM4OCwgIC0zMjYwLCAgLTMxMzIsICAtMzAwNCwKLQktMjg3NiwgIC0yNzQ4LCAgLTI2MjAsICAtMjQ5MiwgIC0yMzY0LCAgLTIyMzYsICAtMjEwOCwgIC0xOTgwLAotCS0xODg0LCAgLTE4MjAsICAtMTc1NiwgIC0xNjkyLCAgLTE2MjgsICAtMTU2NCwgIC0xNTAwLCAgLTE0MzYsCi0JLTEzNzIsICAtMTMwOCwgIC0xMjQ0LCAgLTExODAsICAtMTExNiwgIC0xMDUyLCAgIC05ODgsICAgLTkyNCwKLQktODc2LCAgIC04NDQsICAgLTgxMiwgICAtNzgwLCAgIC03NDgsICAgLTcxNiwgICAtNjg0LCAgIC02NTIsCi0JLTYyMCwgICAtNTg4LCAgIC01NTYsICAgLTUyNCwgICAtNDkyLCAgIC00NjAsICAgLTQyOCwgICAtMzk2LAotCS0zNzIsICAgLTM1NiwgICAtMzQwLCAgIC0zMjQsICAgLTMwOCwgICAtMjkyLCAgIC0yNzYsICAgLTI2MCwKLQktMjQ0LCAgIC0yMjgsICAgLTIxMiwgICAtMTk2LCAgIC0xODAsICAgLTE2NCwgICAtMTQ4LCAgIC0xMzIsCi0JLTEyMCwgICAtMTEyLCAgIC0xMDQsICAgIC05NiwgICAgLTg4LCAgICAtODAsICAgIC03MiwgICAgLTY0LAotCS01NiwgICAgLTQ4LCAgICAtNDAsICAgIC0zMiwgICAgLTI0LCAgICAtMTYsICAgICAtOCwgICAgICAwLAotCTMyMTI0LCAgMzExMDAsICAzMDA3NiwgIDI5MDUyLCAgMjgwMjgsICAyNzAwNCwgIDI1OTgwLCAgMjQ5NTYsCi0JMjM5MzIsICAyMjkwOCwgIDIxODg0LCAgMjA4NjAsICAxOTgzNiwgIDE4ODEyLCAgMTc3ODgsICAxNjc2NCwKLQkxNTk5NiwgIDE1NDg0LCAgMTQ5NzIsICAxNDQ2MCwgIDEzOTQ4LCAgMTM0MzYsICAxMjkyNCwgIDEyNDEyLAotCTExOTAwLCAgMTEzODgsICAxMDg3NiwgIDEwMzY0LCAgIDk4NTIsICAgOTM0MCwgICA4ODI4LCAgIDgzMTYsCi0JNzkzMiwgICA3Njc2LCAgIDc0MjAsICAgNzE2NCwgICA2OTA4LCAgIDY2NTIsICAgNjM5NiwgICA2MTQwLAotCTU4ODQsICAgNTYyOCwgICA1MzcyLCAgIDUxMTYsICAgNDg2MCwgICA0NjA0LCAgIDQzNDgsICAgNDA5MiwKLQkzOTAwLCAgIDM3NzIsICAgMzY0NCwgICAzNTE2LCAgIDMzODgsICAgMzI2MCwgICAzMTMyLCAgIDMwMDQsCi0JMjg3NiwgICAyNzQ4LCAgIDI2MjAsICAgMjQ5MiwgICAyMzY0LCAgIDIyMzYsICAgMjEwOCwgICAxOTgwLAotCTE4ODQsICAgMTgyMCwgICAxNzU2LCAgIDE2OTIsICAgMTYyOCwgICAxNTY0LCAgIDE1MDAsICAgMTQzNiwKLQkxMzcyLCAgIDEzMDgsICAgMTI0NCwgICAxMTgwLCAgIDExMTYsICAgMTA1MiwgICAgOTg4LCAgICA5MjQsCi0JODc2LCAgICA4NDQsICAgIDgxMiwgICAgNzgwLCAgICA3NDgsICAgIDcxNiwgICAgNjg0LCAgICA2NTIsCi0JNjIwLCAgICA1ODgsICAgIDU1NiwgICAgNTI0LCAgICA0OTIsICAgIDQ2MCwgICAgNDI4LCAgICAzOTYsCi0JMzcyLCAgICAzNTYsICAgIDM0MCwgICAgMzI0LCAgICAzMDgsICAgIDI5MiwgICAgMjc2LCAgICAyNjAsCi0JMjQ0LCAgICAyMjgsICAgIDIxMiwgICAgMTk2LCAgICAxODAsICAgIDE2NCwgICAgMTQ4LCAgICAxMzIsCi0JMTIwLCAgICAxMTIsICAgIDEwNCwgICAgIDk2LCAgICAgODgsICAgICA4MCwgICAgIDcyLCAgICAgNjQsCi0JNTYsICAgICA0OCwgICAgIDQwLCAgICAgMzIsICAgICAyNCwgICAgIDE2LCAgICAgIDgsICAgICAgMCB9OwotCi0vKiAjZGVmaW5lIFpFUk9UUkFQICovICAgLyogdHVybiBvbiB0aGUgdHJhcCBhcyBwZXIgdGhlIE1JTC1TVEQgKi8KKy8qIEZyb20gZzcxMS5jOgorICoKKyAqIERlY2VtYmVyIDMwLCAxOTk0OgorICogRnVuY3Rpb25zIGxpbmVhcjJhbGF3LCBsaW5lYXIydWxhdyBoYXZlIGJlZW4gdXBkYXRlZCB0byBjb3JyZWN0bHkKKyAqIGNvbnZlcnQgdW5xdWFudGl6ZWQgMTYgYml0IHZhbHVlcy4KKyAqIFRhYmxlcyBmb3IgZGlyZWN0IHUtIHRvIEEtbGF3IGFuZCBBLSB0byB1LWxhdyBjb252ZXJzaW9ucyBoYXZlIGJlZW4KKyAqIGNvcnJlY3RlZC4KKyAqIEJvcmdlIExpbmRiZXJnLCBDZW50ZXIgZm9yIFBlcnNvbktvbW11bmlrYXRpb24sIEFhbGJvcmcgVW5pdmVyc2l0eS4KKyAqIGJsaUBjcGsuYXVjLmRrCisgKgorICovCiAjZGVmaW5lIEJJQVMgMHg4NCAgIC8qIGRlZmluZSB0aGUgYWRkLWluIGJpYXMgZm9yIDE2IGJpdCBzYW1wbGVzICovCiAjZGVmaW5lIENMSVAgMzI2MzUKKyNkZWZpbmUgU0lHTl9CSVQgICAgICAgICgweDgwKSAgICAgICAgICAvKiBTaWduIGJpdCBmb3IgYSBBLWxhdyBieXRlLiAqLworI2RlZmluZSBRVUFOVF9NQVNLICAgICAgKDB4ZikgICAgICAgICAgIC8qIFF1YW50aXphdGlvbiBmaWVsZCBtYXNrLiAqLworI2RlZmluZSBTRUdfU0hJRlQgICAgICAgKDQpICAgICAgICAgICAgIC8qIExlZnQgc2hpZnQgZm9yIHNlZ21lbnQgbnVtYmVyLiAqLworI2RlZmluZSBTRUdfTUFTSyAgICAgICAgKDB4NzApICAgICAgICAgIC8qIFNlZ21lbnQgZmllbGQgbWFzay4gKi8KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIKLXN0X2xpbmVhcl90b191bGF3KGludCBzYW1wbGUpCitzdGF0aWMgUHlJbnQxNiBzZWdfYWVuZFs4XSA9IHsweDFGLCAweDNGLCAweDdGLCAweEZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRkYsIDB4M0ZGLCAweDdGRiwgMHhGRkZ9Oworc3RhdGljIFB5SW50MTYgc2VnX3VlbmRbOF0gPSB7MHgzRiwgMHg3RiwgMHhGRiwgMHgxRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNGRiwgMHg3RkYsIDB4RkZGLCAweDFGRkZ9OworCitzdGF0aWMgUHlJbnQxNgorc2VhcmNoKFB5SW50MTYgdmFsLCBQeUludDE2ICp0YWJsZSwgaW50IHNpemUpCiB7Ci0Jc3RhdGljIGludCBleHBfbHV0WzI1Nl0gPSB7MCwwLDEsMSwyLDIsMiwyLDMsMywzLDMsMywzLDMsMywKLQkJCQkgICA0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAotCQkJCSAgIDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsCi0JCQkJICAgNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSwKLQkJCQkgICA2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAotCQkJCSAgIDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCi0JCQkJICAgNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKLQkJCQkgICA2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAotCQkJCSAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi0JCQkJICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKLQkJCQkgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAotCQkJCSAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi0JCQkJICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKLQkJCQkgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAotCQkJCSAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi0JCQkJICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsN307Ci0JaW50IHNpZ24sIGV4cG9uZW50LCBtYW50aXNzYTsKLQl1bnNpZ25lZCBjaGFyIHVsYXdieXRlOworICAgICAgICBpbnQgaTsKIAotCS8qIEdldCB0aGUgc2FtcGxlIGludG8gc2lnbi1tYWduaXR1ZGUuICovCi0Jc2lnbiA9IChzYW1wbGUgPj4gOCkgJiAweDgwOwkJLyogc2V0IGFzaWRlIHRoZSBzaWduICovCi0JaWYgKCBzaWduICE9IDAgKSBzYW1wbGUgPSAtc2FtcGxlOwkvKiBnZXQgbWFnbml0dWRlICovCi0JaWYgKCBzYW1wbGUgPiBDTElQICkgc2FtcGxlID0gQ0xJUDsJLyogY2xpcCB0aGUgbWFnbml0dWRlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsIDw9ICp0YWJsZSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHNpemUpOworfQorI2RlZmluZSBzdF91bGF3MmxpbmVhcjE2KHVjKSAoX3N0X3VsYXcybGluZWFyMTZbdWNdKQorI2RlZmluZSBzdF9hbGF3MmxpbmVhcjE2KHVjKSAoX3N0X2FsYXcybGluZWFyMTZbdWNdKQogCi0JLyogQ29udmVydCBmcm9tIDE2IGJpdCBsaW5lYXIgdG8gdWxhdy4gKi8KLQlzYW1wbGUgPSBzYW1wbGUgKyBCSUFTOwotCWV4cG9uZW50ID0gZXhwX2x1dFsoIHNhbXBsZSA+PiA3ICkgJiAweEZGXTsKLQltYW50aXNzYSA9ICggc2FtcGxlID4+ICggZXhwb25lbnQgKyAzICkgKSAmIDB4MEY7Ci0JdWxhd2J5dGUgPSB+ICggc2lnbiB8ICggZXhwb25lbnQgPDwgNCApIHwgbWFudGlzc2EgKTsKLSNpZmRlZiBaRVJPVFJBUAotCWlmICggdWxhd2J5dGUgPT0gMCApIHVsYXdieXRlID0gMHgwMjsJLyogb3B0aW9uYWwgQ0NJVFQgdHJhcCAqLwotI2VuZGlmCitzdGF0aWMgUHlJbnQxNiBfc3RfdWxhdzJsaW5lYXIxNlsyNTZdID0geworICAgIC0zMjEyNCwgIC0zMTEwMCwgIC0zMDA3NiwgIC0yOTA1MiwgIC0yODAyOCwgIC0yNzAwNCwgIC0yNTk4MCwKKyAgICAtMjQ5NTYsICAtMjM5MzIsICAtMjI5MDgsICAtMjE4ODQsICAtMjA4NjAsICAtMTk4MzYsICAtMTg4MTIsCisgICAgLTE3Nzg4LCAgLTE2NzY0LCAgLTE1OTk2LCAgLTE1NDg0LCAgLTE0OTcyLCAgLTE0NDYwLCAgLTEzOTQ4LAorICAgIC0xMzQzNiwgIC0xMjkyNCwgIC0xMjQxMiwgIC0xMTkwMCwgIC0xMTM4OCwgIC0xMDg3NiwgIC0xMDM2NCwKKyAgICAgLTk4NTIsICAgLTkzNDAsICAgLTg4MjgsICAgLTgzMTYsICAgLTc5MzIsICAgLTc2NzYsICAgLTc0MjAsCisgICAgIC03MTY0LCAgIC02OTA4LCAgIC02NjUyLCAgIC02Mzk2LCAgIC02MTQwLCAgIC01ODg0LCAgIC01NjI4LAorICAgICAtNTM3MiwgICAtNTExNiwgICAtNDg2MCwgICAtNDYwNCwgICAtNDM0OCwgICAtNDA5MiwgICAtMzkwMCwKKyAgICAgLTM3NzIsICAgLTM2NDQsICAgLTM1MTYsICAgLTMzODgsICAgLTMyNjAsICAgLTMxMzIsICAgLTMwMDQsCisgICAgIC0yODc2LCAgIC0yNzQ4LCAgIC0yNjIwLCAgIC0yNDkyLCAgIC0yMzY0LCAgIC0yMjM2LCAgIC0yMTA4LAorICAgICAtMTk4MCwgICAtMTg4NCwgICAtMTgyMCwgICAtMTc1NiwgICAtMTY5MiwgICAtMTYyOCwgICAtMTU2NCwKKyAgICAgLTE1MDAsICAgLTE0MzYsICAgLTEzNzIsICAgLTEzMDgsICAgLTEyNDQsICAgLTExODAsICAgLTExMTYsCisgICAgIC0xMDUyLCAgICAtOTg4LCAgICAtOTI0LCAgICAtODc2LCAgICAtODQ0LCAgICAtODEyLCAgICAtNzgwLAorICAgICAgLTc0OCwgICAgLTcxNiwgICAgLTY4NCwgICAgLTY1MiwgICAgLTYyMCwgICAgLTU4OCwgICAgLTU1NiwKKyAgICAgIC01MjQsICAgIC00OTIsICAgIC00NjAsICAgIC00MjgsICAgIC0zOTYsICAgIC0zNzIsICAgIC0zNTYsCisgICAgICAtMzQwLCAgICAtMzI0LCAgICAtMzA4LCAgICAtMjkyLCAgICAtMjc2LCAgICAtMjYwLCAgICAtMjQ0LAorICAgICAgLTIyOCwgICAgLTIxMiwgICAgLTE5NiwgICAgLTE4MCwgICAgLTE2NCwgICAgLTE0OCwgICAgLTEzMiwKKyAgICAgIC0xMjAsICAgIC0xMTIsICAgIC0xMDQsICAgICAtOTYsICAgICAtODgsICAgICAtODAsICAgICAtNzIsCisgICAgICAgLTY0LCAgICAgLTU2LCAgICAgLTQ4LCAgICAgLTQwLCAgICAgLTMyLCAgICAgLTI0LCAgICAgLTE2LAorICAgICAgICAtOCwgICAgICAgMCwgICAzMjEyNCwgICAzMTEwMCwgICAzMDA3NiwgICAyOTA1MiwgICAyODAyOCwKKyAgICAgMjcwMDQsICAgMjU5ODAsICAgMjQ5NTYsICAgMjM5MzIsICAgMjI5MDgsICAgMjE4ODQsICAgMjA4NjAsCisgICAgIDE5ODM2LCAgIDE4ODEyLCAgIDE3Nzg4LCAgIDE2NzY0LCAgIDE1OTk2LCAgIDE1NDg0LCAgIDE0OTcyLAorICAgICAxNDQ2MCwgICAxMzk0OCwgICAxMzQzNiwgICAxMjkyNCwgICAxMjQxMiwgICAxMTkwMCwgICAxMTM4OCwKKyAgICAgMTA4NzYsICAgMTAzNjQsICAgIDk4NTIsICAgIDkzNDAsICAgIDg4MjgsICAgIDgzMTYsICAgIDc5MzIsCisgICAgICA3Njc2LCAgICA3NDIwLCAgICA3MTY0LCAgICA2OTA4LCAgICA2NjUyLCAgICA2Mzk2LCAgICA2MTQwLAorICAgICAgNTg4NCwgICAgNTYyOCwgICAgNTM3MiwgICAgNTExNiwgICAgNDg2MCwgICAgNDYwNCwgICAgNDM0OCwKKyAgICAgIDQwOTIsICAgIDM5MDAsICAgIDM3NzIsICAgIDM2NDQsICAgIDM1MTYsICAgIDMzODgsICAgIDMyNjAsCisgICAgICAzMTMyLCAgICAzMDA0LCAgICAyODc2LCAgICAyNzQ4LCAgICAyNjIwLCAgICAyNDkyLCAgICAyMzY0LAorICAgICAgMjIzNiwgICAgMjEwOCwgICAgMTk4MCwgICAgMTg4NCwgICAgMTgyMCwgICAgMTc1NiwgICAgMTY5MiwKKyAgICAgIDE2MjgsICAgIDE1NjQsICAgIDE1MDAsICAgIDE0MzYsICAgIDEzNzIsICAgIDEzMDgsICAgIDEyNDQsCisgICAgICAxMTgwLCAgICAxMTE2LCAgICAxMDUyLCAgICAgOTg4LCAgICAgOTI0LCAgICAgODc2LCAgICAgODQ0LAorICAgICAgIDgxMiwgICAgIDc4MCwgICAgIDc0OCwgICAgIDcxNiwgICAgIDY4NCwgICAgIDY1MiwgICAgIDYyMCwKKyAgICAgICA1ODgsICAgICA1NTYsICAgICA1MjQsICAgICA0OTIsICAgICA0NjAsICAgICA0MjgsICAgICAzOTYsCisgICAgICAgMzcyLCAgICAgMzU2LCAgICAgMzQwLCAgICAgMzI0LCAgICAgMzA4LCAgICAgMjkyLCAgICAgMjc2LAorICAgICAgIDI2MCwgICAgIDI0NCwgICAgIDIyOCwgICAgIDIxMiwgICAgIDE5NiwgICAgIDE4MCwgICAgIDE2NCwKKyAgICAgICAxNDgsICAgICAxMzIsICAgICAxMjAsICAgICAxMTIsICAgICAxMDQsICAgICAgOTYsICAgICAgODgsCisgICAgICAgIDgwLCAgICAgIDcyLCAgICAgIDY0LCAgICAgIDU2LCAgICAgIDQ4LCAgICAgIDQwLCAgICAgIDMyLAorICAgICAgICAyNCwgICAgICAxNiwgICAgICAgOCwgICAgICAgMAorfTsKIAotCXJldHVybiB1bGF3Ynl0ZTsKKy8qCisgKiBsaW5lYXIydWxhdygpIGFjY2VwdHMgYSAxNC1iaXQgc2lnbmVkIGludGVnZXIgYW5kIGVuY29kZXMgaXQgYXMgdS1sYXcgZGF0YQorICogc3RvcmVkIGluIGEgdW5zaWduZWQgY2hhci4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdpdGgKKyAqIHRoZSBkYXRhIHNoaWZ0ZWQgc3VjaCB0aGF0IGl0IG9ubHkgY29udGFpbnMgaW5mb3JtYXRpb24gaW4gdGhlIGxvd2VyCisgKiAxNC1iaXRzLgorICoKKyAqIEluIG9yZGVyIHRvIHNpbXBsaWZ5IHRoZSBlbmNvZGluZyBwcm9jZXNzLCB0aGUgb3JpZ2luYWwgbGluZWFyIG1hZ25pdHVkZQorICogaXMgYmlhc2VkIGJ5IGFkZGluZyAzMyB3aGljaCBzaGlmdHMgdGhlIGVuY29kaW5nIHJhbmdlIGZyb20gKDAgLSA4MTU4KSB0bworICogKDMzIC0gODE5MSkuIFRoZSByZXN1bHQgY2FuIGJlIHNlZW4gaW4gdGhlIGZvbGxvd2luZyBlbmNvZGluZyB0YWJsZToKKyAqCisgKiAgICAgIEJpYXNlZCBMaW5lYXIgSW5wdXQgQ29kZSAgICAgICAgQ29tcHJlc3NlZCBDb2RlCisgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIDAwMDAwMDAxd3h5emEgICAgICAgICAgICAgICAgICAgMDAwd3h5egorICogICAgICAwMDAwMDAxd3h5emFiICAgICAgICAgICAgICAgICAgIDAwMXd4eXoKKyAqICAgICAgMDAwMDAxd3h5emFiYyAgICAgICAgICAgICAgICAgICAwMTB3eHl6CisgKiAgICAgIDAwMDAxd3h5emFiY2QgICAgICAgICAgICAgICAgICAgMDExd3h5egorICogICAgICAwMDAxd3h5emFiY2RlICAgICAgICAgICAgICAgICAgIDEwMHd4eXoKKyAqICAgICAgMDAxd3h5emFiY2RlZiAgICAgICAgICAgICAgICAgICAxMDF3eHl6CisgKiAgICAgIDAxd3h5emFiY2RlZmcgICAgICAgICAgICAgICAgICAgMTEwd3h5egorICogICAgICAxd3h5emFiY2RlZmdoICAgICAgICAgICAgICAgICAgIDExMXd4eXoKKyAqCisgKiBFYWNoIGJpYXNlZCBsaW5lYXIgY29kZSBoYXMgYSBsZWFkaW5nIDEgd2hpY2ggaWRlbnRpZmllcyB0aGUgc2VnbWVudAorICogbnVtYmVyLiBUaGUgdmFsdWUgb2YgdGhlIHNlZ21lbnQgbnVtYmVyIGlzIGVxdWFsIHRvIDcgbWludXMgdGhlIG51bWJlcgorICogb2YgbGVhZGluZyAwJ3MuIFRoZSBxdWFudGl6YXRpb24gaW50ZXJ2YWwgaXMgZGlyZWN0bHkgYXZhaWxhYmxlIGFzIHRoZQorICogZm91ciBiaXRzIHd4eXouICAqIFRoZSB0cmFpbGluZyBiaXRzIChhIC0gaCkgYXJlIGlnbm9yZWQuCisgKgorICogT3JkaW5hcmlseSB0aGUgY29tcGxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGNvZGUgd29yZCBpcyB1c2VkIGZvcgorICogdHJhbnNtaXNzaW9uLCBhbmQgc28gdGhlIGNvZGUgd29yZCBpcyBjb21wbGVtZW50ZWQgYmVmb3JlIGl0IGlzIHJldHVybmVkLgorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZSBKb2huIEMuIEJlbGxhbXkncyBEaWdpdGFsIFRlbGVwaG9ueSwgMTk4MiwKKyAqIEpvaG4gV2lsZXkgJiBTb25zLCBwcHMgOTgtMTExIGFuZCA0NzItNDc2LgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhcgorc3RfMTRsaW5lYXIydWxhdyhQeUludDE2IHBjbV92YWwpCS8qIDIncyBjb21wbGVtZW50ICgxNC1iaXQgcmFuZ2UpICovCit7CisgICAgICAgIFB5SW50MTYgICAgICAgICBtYXNrOworICAgICAgICBQeUludDE2ICAgICAgICAgc2VnOworICAgICAgICB1bnNpZ25lZCBjaGFyICAgdXZhbDsKKworICAgICAgICAvKiBUaGUgb3JpZ2luYWwgc294IGNvZGUgZG9lcyB0aGlzIGluIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLCBub3QgaGVyZSAqLworICAgICAgICBwY21fdmFsID0gcGNtX3ZhbCA+PiAyOworCisgICAgICAgIC8qIHUtbGF3IGludmVydHMgYWxsIGJpdHMgKi8KKyAgICAgICAgLyogR2V0IHRoZSBzaWduIGFuZCB0aGUgbWFnbml0dWRlIG9mIHRoZSB2YWx1ZS4gKi8KKyAgICAgICAgaWYgKHBjbV92YWwgPCAwKSB7CisgICAgICAgICAgICAgICAgcGNtX3ZhbCA9IC1wY21fdmFsOworICAgICAgICAgICAgICAgIG1hc2sgPSAweDdGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1hc2sgPSAweEZGOworICAgICAgICB9CisgICAgICAgIGlmICggcGNtX3ZhbCA+IENMSVAgKSBwY21fdmFsID0gQ0xJUDsgICAgICAgICAgIC8qIGNsaXAgdGhlIG1hZ25pdHVkZSAqLworICAgICAgICBwY21fdmFsICs9IChCSUFTID4+IDIpOworCisgICAgICAgIC8qIENvbnZlcnQgdGhlIHNjYWxlZCBtYWduaXR1ZGUgdG8gc2VnbWVudCBudW1iZXIuICovCisgICAgICAgIHNlZyA9IHNlYXJjaChwY21fdmFsLCBzZWdfdWVuZCwgOCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29tYmluZSB0aGUgc2lnbiwgc2VnbWVudCwgcXVhbnRpemF0aW9uIGJpdHM7CisgICAgICAgICAqIGFuZCBjb21wbGVtZW50IHRoZSBjb2RlIHdvcmQuCisgICAgICAgICAqLworICAgICAgICBpZiAoc2VnID49IDgpICAgICAgICAgICAvKiBvdXQgb2YgcmFuZ2UsIHJldHVybiBtYXhpbXVtIHZhbHVlLiAqLworICAgICAgICAgICAgICAgIHJldHVybiAodW5zaWduZWQgY2hhcikgKDB4N0YgXiBtYXNrKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdXZhbCA9ICh1bnNpZ25lZCBjaGFyKSAoc2VnIDw8IDQpIHwgKChwY21fdmFsID4+IChzZWcgKyAxKSkgJiAweEYpOworICAgICAgICAgICAgICAgIHJldHVybiAodXZhbCBeIG1hc2spOworICAgICAgICB9CisKK30KKworc3RhdGljIFB5SW50MTYgX3N0X2FsYXcybGluZWFyMTZbMjU2XSA9IHsKKyAgICAgLTU1MDQsICAgLTUyNDgsICAgLTYwMTYsICAgLTU3NjAsICAgLTQ0ODAsICAgLTQyMjQsICAgLTQ5OTIsCisgICAgIC00NzM2LCAgIC03NTUyLCAgIC03Mjk2LCAgIC04MDY0LCAgIC03ODA4LCAgIC02NTI4LCAgIC02MjcyLAorICAgICAtNzA0MCwgICAtNjc4NCwgICAtMjc1MiwgICAtMjYyNCwgICAtMzAwOCwgICAtMjg4MCwgICAtMjI0MCwKKyAgICAgLTIxMTIsICAgLTI0OTYsICAgLTIzNjgsICAgLTM3NzYsICAgLTM2NDgsICAgLTQwMzIsICAgLTM5MDQsCisgICAgIC0zMjY0LCAgIC0zMTM2LCAgIC0zNTIwLCAgIC0zMzkyLCAgLTIyMDE2LCAgLTIwOTkyLCAgLTI0MDY0LAorICAgIC0yMzA0MCwgIC0xNzkyMCwgIC0xNjg5NiwgIC0xOTk2OCwgIC0xODk0NCwgIC0zMDIwOCwgIC0yOTE4NCwKKyAgICAtMzIyNTYsICAtMzEyMzIsICAtMjYxMTIsICAtMjUwODgsICAtMjgxNjAsICAtMjcxMzYsICAtMTEwMDgsCisgICAgLTEwNDk2LCAgLTEyMDMyLCAgLTExNTIwLCAgIC04OTYwLCAgIC04NDQ4LCAgIC05OTg0LCAgIC05NDcyLAorICAgIC0xNTEwNCwgIC0xNDU5MiwgIC0xNjEyOCwgIC0xNTYxNiwgIC0xMzA1NiwgIC0xMjU0NCwgIC0xNDA4MCwKKyAgICAtMTM1NjgsICAgIC0zNDQsICAgIC0zMjgsICAgIC0zNzYsICAgIC0zNjAsICAgIC0yODAsICAgIC0yNjQsCisgICAgICAtMzEyLCAgICAtMjk2LCAgICAtNDcyLCAgICAtNDU2LCAgICAtNTA0LCAgICAtNDg4LCAgICAtNDA4LAorICAgICAgLTM5MiwgICAgLTQ0MCwgICAgLTQyNCwgICAgIC04OCwgICAgIC03MiwgICAgLTEyMCwgICAgLTEwNCwKKyAgICAgICAtMjQsICAgICAgLTgsICAgICAtNTYsICAgICAtNDAsICAgIC0yMTYsICAgIC0yMDAsICAgIC0yNDgsCisgICAgICAtMjMyLCAgICAtMTUyLCAgICAtMTM2LCAgICAtMTg0LCAgICAtMTY4LCAgIC0xMzc2LCAgIC0xMzEyLAorICAgICAtMTUwNCwgICAtMTQ0MCwgICAtMTEyMCwgICAtMTA1NiwgICAtMTI0OCwgICAtMTE4NCwgICAtMTg4OCwKKyAgICAgLTE4MjQsICAgLTIwMTYsICAgLTE5NTIsICAgLTE2MzIsICAgLTE1NjgsICAgLTE3NjAsICAgLTE2OTYsCisgICAgICAtNjg4LCAgICAtNjU2LCAgICAtNzUyLCAgICAtNzIwLCAgICAtNTYwLCAgICAtNTI4LCAgICAtNjI0LAorICAgICAgLTU5MiwgICAgLTk0NCwgICAgLTkxMiwgICAtMTAwOCwgICAgLTk3NiwgICAgLTgxNiwgICAgLTc4NCwKKyAgICAgIC04ODAsICAgIC04NDgsICAgIDU1MDQsICAgIDUyNDgsICAgIDYwMTYsICAgIDU3NjAsICAgIDQ0ODAsCisgICAgICA0MjI0LCAgICA0OTkyLCAgICA0NzM2LCAgICA3NTUyLCAgICA3Mjk2LCAgICA4MDY0LCAgICA3ODA4LAorICAgICAgNjUyOCwgICAgNjI3MiwgICAgNzA0MCwgICAgNjc4NCwgICAgMjc1MiwgICAgMjYyNCwgICAgMzAwOCwKKyAgICAgIDI4ODAsICAgIDIyNDAsICAgIDIxMTIsICAgIDI0OTYsICAgIDIzNjgsICAgIDM3NzYsICAgIDM2NDgsCisgICAgICA0MDMyLCAgICAzOTA0LCAgICAzMjY0LCAgICAzMTM2LCAgICAzNTIwLCAgICAzMzkyLCAgIDIyMDE2LAorICAgICAyMDk5MiwgICAyNDA2NCwgICAyMzA0MCwgICAxNzkyMCwgICAxNjg5NiwgICAxOTk2OCwgICAxODk0NCwKKyAgICAgMzAyMDgsICAgMjkxODQsICAgMzIyNTYsICAgMzEyMzIsICAgMjYxMTIsICAgMjUwODgsICAgMjgxNjAsCisgICAgIDI3MTM2LCAgIDExMDA4LCAgIDEwNDk2LCAgIDEyMDMyLCAgIDExNTIwLCAgICA4OTYwLCAgICA4NDQ4LAorICAgICAgOTk4NCwgICAgOTQ3MiwgICAxNTEwNCwgICAxNDU5MiwgICAxNjEyOCwgICAxNTYxNiwgICAxMzA1NiwKKyAgICAgMTI1NDQsICAgMTQwODAsICAgMTM1NjgsICAgICAzNDQsICAgICAzMjgsICAgICAzNzYsICAgICAzNjAsCisgICAgICAgMjgwLCAgICAgMjY0LCAgICAgMzEyLCAgICAgMjk2LCAgICAgNDcyLCAgICAgNDU2LCAgICAgNTA0LAorICAgICAgIDQ4OCwgICAgIDQwOCwgICAgIDM5MiwgICAgIDQ0MCwgICAgIDQyNCwgICAgICA4OCwgICAgICA3MiwKKyAgICAgICAxMjAsICAgICAxMDQsICAgICAgMjQsICAgICAgIDgsICAgICAgNTYsICAgICAgNDAsICAgICAyMTYsCisgICAgICAgMjAwLCAgICAgMjQ4LCAgICAgMjMyLCAgICAgMTUyLCAgICAgMTM2LCAgICAgMTg0LCAgICAgMTY4LAorICAgICAgMTM3NiwgICAgMTMxMiwgICAgMTUwNCwgICAgMTQ0MCwgICAgMTEyMCwgICAgMTA1NiwgICAgMTI0OCwKKyAgICAgIDExODQsICAgIDE4ODgsICAgIDE4MjQsICAgIDIwMTYsICAgIDE5NTIsICAgIDE2MzIsICAgIDE1NjgsCisgICAgICAxNzYwLCAgICAxNjk2LCAgICAgNjg4LCAgICAgNjU2LCAgICAgNzUyLCAgICAgNzIwLCAgICAgNTYwLAorICAgICAgIDUyOCwgICAgIDYyNCwgICAgIDU5MiwgICAgIDk0NCwgICAgIDkxMiwgICAgMTAwOCwgICAgIDk3NiwKKyAgICAgICA4MTYsICAgICA3ODQsICAgICA4ODAsICAgICA4NDgKK307CisKKy8qCisgKiBsaW5lYXIyYWxhdygpIGFjY2VwdHMgYW4gMTMtYml0IHNpZ25lZCBpbnRlZ2VyIGFuZCBlbmNvZGVzIGl0IGFzIEEtbGF3IGRhdGEKKyAqIHN0b3JlZCBpbiBhIHVuc2lnbmVkIGNoYXIuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aXRoCisgKiB0aGUgZGF0YSBzaGlmdGVkIHN1Y2ggdGhhdCBpdCBvbmx5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGluIHRoZSBsb3dlcgorICogMTMtYml0cy4KKyAqCisgKiAgICAgICAgICAgICAgTGluZWFyIElucHV0IENvZGUgICAgICAgQ29tcHJlc3NlZCBDb2RlCisgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIDAwMDAwMDB3eHl6YSAgICAgICAgICAgICAgICAgICAgMDAwd3h5egorICogICAgICAwMDAwMDAxd3h5emEgICAgICAgICAgICAgICAgICAgIDAwMXd4eXoKKyAqICAgICAgMDAwMDAxd3h5emFiICAgICAgICAgICAgICAgICAgICAwMTB3eHl6CisgKiAgICAgIDAwMDAxd3h5emFiYyAgICAgICAgICAgICAgICAgICAgMDExd3h5egorICogICAgICAwMDAxd3h5emFiY2QgICAgICAgICAgICAgICAgICAgIDEwMHd4eXoKKyAqICAgICAgMDAxd3h5emFiY2RlICAgICAgICAgICAgICAgICAgICAxMDF3eHl6CisgKiAgICAgIDAxd3h5emFiY2RlZiAgICAgICAgICAgICAgICAgICAgMTEwd3h5egorICogICAgICAxd3h5emFiY2RlZmcgICAgICAgICAgICAgICAgICAgIDExMXd4eXoKKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBzZWUgSm9obiBDLiBCZWxsYW15J3MgRGlnaXRhbCBUZWxlcGhvbnksIDE5ODIsCisgKiBKb2huIFdpbGV5ICYgU29ucywgcHBzIDk4LTExMSBhbmQgNDcyLTQ3Ni4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIKK3N0X2xpbmVhcjJhbGF3KFB5SW50MTYgcGNtX3ZhbCkJLyogMidzIGNvbXBsZW1lbnQgKDEzLWJpdCByYW5nZSkgKi8KK3sKKyAgICAgICAgUHlJbnQxNiAgICAgICAgIG1hc2s7CisgICAgICAgIHNob3J0ICAgICAgICAgICBzZWc7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgICBhdmFsOworCisgICAgICAgIC8qIFRoZSBvcmlnaW5hbCBzb3ggY29kZSBkb2VzIHRoaXMgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCBoZXJlICovCisgICAgICAgIHBjbV92YWwgPSBwY21fdmFsID4+IDM7CisKKyAgICAgICAgLyogQS1sYXcgdXNpbmcgZXZlbiBiaXQgaW52ZXJzaW9uICovCisgICAgICAgIGlmIChwY21fdmFsID49IDApIHsKKyAgICAgICAgICAgICAgICBtYXNrID0gMHhENTsgICAgICAgICAgICAvKiBzaWduICg3dGgpIGJpdCA9IDEgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXNrID0gMHg1NTsgICAgICAgICAgICAvKiBzaWduIGJpdCA9IDAgKi8KKyAgICAgICAgICAgICAgICBwY21fdmFsID0gLXBjbV92YWwgLSAxOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29udmVydCB0aGUgc2NhbGVkIG1hZ25pdHVkZSB0byBzZWdtZW50IG51bWJlci4gKi8KKyAgICAgICAgc2VnID0gc2VhcmNoKHBjbV92YWwsIHNlZ19hZW5kLCA4KTsKKworICAgICAgICAvKiBDb21iaW5lIHRoZSBzaWduLCBzZWdtZW50LCBhbmQgcXVhbnRpemF0aW9uIGJpdHMuICovCisKKyAgICAgICAgaWYgKHNlZyA+PSA4KSAgICAgICAgICAgLyogb3V0IG9mIHJhbmdlLCByZXR1cm4gbWF4aW11bSB2YWx1ZS4gKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpICgweDdGIF4gbWFzayk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGF2YWwgPSAodW5zaWduZWQgY2hhcikgc2VnIDw8IFNFR19TSElGVDsKKyAgICAgICAgICAgICAgICBpZiAoc2VnIDwgMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWwgfD0gKHBjbV92YWwgPj4gMSkgJiBRVUFOVF9NQVNLOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWwgfD0gKHBjbV92YWwgPj4gc2VnKSAmIFFVQU5UX01BU0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIChhdmFsIF4gbWFzayk7CisgICAgICAgIH0KIH0KIC8qIEVuZCBvZiBjb2RlIHRha2VuIGZyb20gc294ICovCiAKIC8qIEludGVsIEFEUENNIHN0ZXAgdmFyaWF0aW9uIHRhYmxlICovCiBzdGF0aWMgaW50IGluZGV4VGFibGVbMTZdID0gewotCS0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAotCS0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgMiwgNCwgNiwgOCwKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIDIsIDQsIDYsIDgsCiB9OwogCiBzdGF0aWMgaW50IHN0ZXBzaXplVGFibGVbODldID0gewotCTcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTYsIDE3LAotCTE5LCAyMSwgMjMsIDI1LCAyOCwgMzEsIDM0LCAzNywgNDEsIDQ1LAotCTUwLCA1NSwgNjAsIDY2LCA3MywgODAsIDg4LCA5NywgMTA3LCAxMTgsCi0JMTMwLCAxNDMsIDE1NywgMTczLCAxOTAsIDIwOSwgMjMwLCAyNTMsIDI3OSwgMzA3LAotCTMzNywgMzcxLCA0MDgsIDQ0OSwgNDk0LCA1NDQsIDU5OCwgNjU4LCA3MjQsIDc5NiwKLQk4NzYsIDk2MywgMTA2MCwgMTE2NiwgMTI4MiwgMTQxMSwgMTU1MiwgMTcwNywgMTg3OCwgMjA2NiwKLQkyMjcyLCAyNDk5LCAyNzQ5LCAzMDI0LCAzMzI3LCAzNjYwLCA0MDI2LCA0NDI4LCA0ODcxLCA1MzU4LAotCTU4OTQsIDY0ODQsIDcxMzIsIDc4NDUsIDg2MzAsIDk0OTMsIDEwNDQyLCAxMTQ4NywgMTI2MzUsIDEzODk5LAotCTE1Mjg5LCAxNjgxOCwgMTg1MDAsIDIwMzUwLCAyMjM4NSwgMjQ2MjMsIDI3MDg2LCAyOTc5NCwgMzI3NjcKKyAgICAgICAgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTcsCisgICAgICAgIDE5LCAyMSwgMjMsIDI1LCAyOCwgMzEsIDM0LCAzNywgNDEsIDQ1LAorICAgICAgICA1MCwgNTUsIDYwLCA2NiwgNzMsIDgwLCA4OCwgOTcsIDEwNywgMTE4LAorICAgICAgICAxMzAsIDE0MywgMTU3LCAxNzMsIDE5MCwgMjA5LCAyMzAsIDI1MywgMjc5LCAzMDcsCisgICAgICAgIDMzNywgMzcxLCA0MDgsIDQ0OSwgNDk0LCA1NDQsIDU5OCwgNjU4LCA3MjQsIDc5NiwKKyAgICAgICAgODc2LCA5NjMsIDEwNjAsIDExNjYsIDEyODIsIDE0MTEsIDE1NTIsIDE3MDcsIDE4NzgsIDIwNjYsCisgICAgICAgIDIyNzIsIDI0OTksIDI3NDksIDMwMjQsIDMzMjcsIDM2NjAsIDQwMjYsIDQ0MjgsIDQ4NzEsIDUzNTgsCisgICAgICAgIDU4OTQsIDY0ODQsIDcxMzIsIDc4NDUsIDg2MzAsIDk0OTMsIDEwNDQyLCAxMTQ4NywgMTI2MzUsIDEzODk5LAorICAgICAgICAxNTI4OSwgMTY4MTgsIDE4NTAwLCAyMDM1MCwgMjIzODUsIDI0NjIzLCAyNzA4NiwgMjk3OTQsIDMyNzY3CiB9OwogICAgIAogI2RlZmluZSBDSEFSUChjcCwgaSkgKChzaWduZWQgY2hhciAqKShjcCtpKSkKQEAgLTE1MSwxMzcgKzI5OCwxMzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2dldHNhbXBsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwOwotCWludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0JaW50IGk7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICAgICAgaW50IGk7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWkpIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJmkpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCBpIDwgMCB8fCBpID49IGxlbi9zaXplICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiSW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotCWVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkqMik7Ci0JZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKjQpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWkpIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJmkpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBpIDwgMCB8fCBpID49IGxlbi9zaXplICkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKjIpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkqNCk7CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9tYXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotCWludCBpOwotCWludCBtYXggPSAwOworICAgICAgICBzaWduZWQgY2hhciAqY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgbWF4ID0gMDsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0JCWlmICggdmFsIDwgMCApIHZhbCA9ICgtdmFsKTsKLQkJaWYgKCB2YWwgPiBtYXggKSBtYXggPSB2YWw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZyhtYXgpOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGZvciAoIGk9MDsgaTxsZW47IGkrPSBzaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOworICAgICAgICAgICAgICAgIGlmICggdmFsIDwgMCApIHZhbCA9ICgtdmFsKTsKKyAgICAgICAgICAgICAgICBpZiAoIHZhbCA+IG1heCApIG1heCA9IHZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobWF4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfbWlubWF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlpbnQgaTsKLQlpbnQgbWluID0gMHg3ZmZmZmZmZiwgbWF4ID0gLTB4N2ZmZmZmZmY7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBtaW4gPSAweDdmZmZmZmZmLCBtYXggPSAtMHg3ZmZmZmZmZjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwLCAmbGVuLCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IHNpemUpIHsKLQkJaWYgKHNpemUgPT0gMSkgdmFsID0gKGludCkgKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoc2l6ZSA9PSAyKSB2YWwgPSAoaW50KSAqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoc2l6ZSA9PSA0KSB2YWwgPSAoaW50KSAqTE9OR1AoY3AsIGkpOwotCQlpZiAodmFsID4gbWF4KSBtYXggPSB2YWw7Ci0JCWlmICh2YWwgPCBtaW4pIG1pbiA9IHZhbDsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaSkiLCBtaW4sIG1heCk7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwLCAmbGVuLCAmc2l6ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IHNpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKSB2YWwgPSAoaW50KSAqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikgdmFsID0gKGludCkgKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KSB2YWwgPSAoaW50KSAqTE9OR1AoY3AsIGkpOworICAgICAgICAgICAgICAgIGlmICh2YWwgPiBtYXgpIG1heCA9IHZhbDsKKyAgICAgICAgICAgICAgICBpZiAodmFsIDwgbWluKSBtaW4gPSB2YWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaSkiLCBtaW4sIG1heCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2F2ZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwOwotCWludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0JaW50IGk7Ci0JZG91YmxlIGF2ZyA9IDAuMDsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZG91YmxlIGF2ZyA9IDAuMDsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0JCWF2ZyArPSB2YWw7Ci0JfQotCWlmICggbGVuID09IDAgKQotCQl2YWwgPSAwOwotCWVsc2UKLQkJdmFsID0gKGludCkoYXZnIC8gKGRvdWJsZSkobGVuL3NpemUpKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBhdmcgKz0gdmFsOworICAgICAgICB9CisgICAgICAgIGlmICggbGVuID09IDAgKQorICAgICAgICAgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKShsZW4vc2l6ZSkpOworICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3Bfcm1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlpbnQgaTsKLQlkb3VibGUgc3VtX3NxdWFyZXMgPSAwLjA7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGRvdWJsZSBzdW1fc3F1YXJlcyA9IDAuMDsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0JCXN1bV9zcXVhcmVzICs9IChkb3VibGUpdmFsKihkb3VibGUpdmFsOwotCX0KLQlpZiAoIGxlbiA9PSAwICkKLQkJdmFsID0gMDsKLQllbHNlCi0JCXZhbCA9IChpbnQpc3FydChzdW1fc3F1YXJlcyAvIChkb3VibGUpKGxlbi9zaXplKSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgICAgICAgICAgc3VtX3NxdWFyZXMgKz0gKGRvdWJsZSl2YWwqKGRvdWJsZSl2YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBsZW4gPT0gMCApCisgICAgICAgICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbCA9IChpbnQpc3FydChzdW1fc3F1YXJlcyAvIChkb3VibGUpKGxlbi9zaXplKSk7CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgZG91YmxlIF9zdW0yKHNob3J0ICphLCBzaG9ydCAqYiwgaW50IGxlbikKIHsKLQlpbnQgaTsKLQlkb3VibGUgc3VtID0gMC4wOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZG91YmxlIHN1bSA9IDAuMDsKIAotCWZvciggaT0wOyBpPGxlbjsgaSsrKSB7Ci0JCXN1bSA9IHN1bSArIChkb3VibGUpYVtpXSooZG91YmxlKWJbaV07Ci0JfQotCXJldHVybiBzdW07CisgICAgICAgIGZvciggaT0wOyBpPGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3VtID0gc3VtICsgKGRvdWJsZSlhW2ldKihkb3VibGUpYltpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VtOwogfQogCiAvKgpAQCAtMzAzLDE1ICs0NTAsMTUgQEAKICoqIHZqID0gKCBzdW0oQVtqK2ldXjIpKnN1bShSW2ldXjIpIC0gc3VtKEFbaitpXVJbaV0pXjIgKSAvIHN1bSggQVtqK2ldXjIgKQogKioKICoqIEluIHRoZSBjb2RlIHZhcmlhYmxlcyBjb3JyZXNwb25kIGFzIGZvbGxvd3M6Ci0qKiBjcDEJCUEKLSoqIGNwMgkJUgotKiogbGVuMQkJTgotKiogbGVuMgkJbgotKiogYWpfbTEJQVtqLTFdCi0qKiBhal9sbTEJQVtqK24tMV0KLSoqIHN1bV9yaV8yCXN1bShSW2ldXjIpCi0qKiBzdW1fYWlqXzIJc3VtKEFbaStqXV4yKQotKiogc3VtX2Fpal9yaQlzdW0oQVtpK2pdUltpXSkKKyoqIGNwMSAgICAgICAgICBBCisqKiBjcDIgICAgICAgICAgUgorKiogbGVuMSAgICAgICAgIE4KKyoqIGxlbjIgICAgICAgICBuCisqKiBhal9tMSAgICAgICAgQVtqLTFdCisqKiBhal9sbTEgICAgICAgQVtqK24tMV0KKyoqIHN1bV9yaV8yICAgICBzdW0oUltpXV4yKQorKiogc3VtX2Fpal8yICAgIHN1bShBW2kral1eMikKKyoqIHN1bV9haWpfcmkgICBzdW0oQVtpK2pdUltpXSkKICoqCiAqKiBzdW1fcmkgaXMgY2FsY3VsYXRlZCBvbmNlLCBzdW1fYWlqXzIgaXMgdXBkYXRlZCBlYWNoIHN0ZXAgYW5kIHN1bV9haWpfcmkKICoqIGlzIGNvbXBsZXRlbHkgcmVjYWxjdWxhdGVkIGVhY2ggc3RlcC4KQEAgLTMxOSw1NSArNDY2LDU1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9maW5kZml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCAqY3AxLCAqY3AyOwotCWludCBsZW4xLCBsZW4yOwotCWludCBqLCBiZXN0X2o7Ci0JZG91YmxlIGFqX20xLCBhal9sbTE7Ci0JZG91YmxlIHN1bV9yaV8yLCBzdW1fYWlqXzIsIHN1bV9haWpfcmksIHJlc3VsdCwgYmVzdF9yZXN1bHQsIGZhY3RvcjsKKyAgICAgICAgc2hvcnQgKmNwMSwgKmNwMjsKKyAgICAgICAgaW50IGxlbjEsIGxlbjI7CisgICAgICAgIGludCBqLCBiZXN0X2o7CisgICAgICAgIGRvdWJsZSBhal9tMSwgYWpfbG0xOworICAgICAgICBkb3VibGUgc3VtX3JpXzIsIHN1bV9haWpfMiwgc3VtX2Fpal9yaSwgcmVzdWx0LCBiZXN0X3Jlc3VsdCwgZmFjdG9yOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI3MjKSIsICZjcDEsICZsZW4xLCAmY3AyLCAmbGVuMikgKQotCQlyZXR1cm4gMDsKLQlpZiAoIGxlbjEgJiAxIHx8IGxlbjIgJiAxICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JbGVuMSA+Pj0gMTsKLQlsZW4yID4+PSAxOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjcyMpIiwgJmNwMSwgJmxlbjEsICZjcDIsICZsZW4yKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICggbGVuMSAmIDEgfHwgbGVuMiAmIDEgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlN0cmluZ3Mgc2hvdWxkIGJlIGV2ZW4tc2l6ZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBsZW4xID4+PSAxOworICAgICAgICBsZW4yID4+PSAxOwogICAgIAotCWlmICggbGVuMSA8IGxlbjIgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJGaXJzdCBzYW1wbGUgc2hvdWxkIGJlIGxvbmdlciIpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc3VtX3JpXzIgPSBfc3VtMihjcDIsIGNwMiwgbGVuMik7Ci0Jc3VtX2Fpal8yID0gX3N1bTIoY3AxLCBjcDEsIGxlbjIpOwotCXN1bV9haWpfcmkgPSBfc3VtMihjcDEsIGNwMiwgbGVuMik7CisgICAgICAgIGlmICggbGVuMSA8IGxlbjIgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIkZpcnN0IHNhbXBsZSBzaG91bGQgYmUgbG9uZ2VyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgc3VtX3JpXzIgPSBfc3VtMihjcDIsIGNwMiwgbGVuMik7CisgICAgICAgIHN1bV9haWpfMiA9IF9zdW0yKGNwMSwgY3AxLCBsZW4yKTsKKyAgICAgICAgc3VtX2Fpal9yaSA9IF9zdW0yKGNwMSwgY3AyLCBsZW4yKTsKIAotCXJlc3VsdCA9IChzdW1fcmlfMipzdW1fYWlqXzIgLSBzdW1fYWlqX3JpKnN1bV9haWpfcmkpIC8gc3VtX2Fpal8yOworICAgICAgICByZXN1bHQgPSAoc3VtX3JpXzIqc3VtX2Fpal8yIC0gc3VtX2Fpal9yaSpzdW1fYWlqX3JpKSAvIHN1bV9haWpfMjsKIAotCWJlc3RfcmVzdWx0ID0gcmVzdWx0OwotCWJlc3RfaiA9IDA7Ci0JaiA9IDA7CisgICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICBiZXN0X2ogPSAwOworICAgICAgICBqID0gMDsKIAotCWZvciAoIGo9MTsgajw9bGVuMS1sZW4yOyBqKyspIHsKLQkJYWpfbTEgPSAoZG91YmxlKWNwMVtqLTFdOwotCQlhal9sbTEgPSAoZG91YmxlKWNwMVtqK2xlbjItMV07CisgICAgICAgIGZvciAoIGo9MTsgajw9bGVuMS1sZW4yOyBqKyspIHsKKyAgICAgICAgICAgICAgICBhal9tMSA9IChkb3VibGUpY3AxW2otMV07CisgICAgICAgICAgICAgICAgYWpfbG0xID0gKGRvdWJsZSljcDFbaitsZW4yLTFdOwogCi0JCXN1bV9haWpfMiA9IHN1bV9haWpfMiArIGFqX2xtMSphal9sbTEgLSBhal9tMSphal9tMTsKLQkJc3VtX2Fpal9yaSA9IF9zdW0yKGNwMStqLCBjcDIsIGxlbjIpOworICAgICAgICAgICAgICAgIHN1bV9haWpfMiA9IHN1bV9haWpfMiArIGFqX2xtMSphal9sbTEgLSBhal9tMSphal9tMTsKKyAgICAgICAgICAgICAgICBzdW1fYWlqX3JpID0gX3N1bTIoY3AxK2osIGNwMiwgbGVuMik7CiAKLQkJcmVzdWx0ID0gKHN1bV9yaV8yKnN1bV9haWpfMiAtIHN1bV9haWpfcmkqc3VtX2Fpal9yaSkKLQkJCS8gc3VtX2Fpal8yOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzdW1fcmlfMipzdW1fYWlqXzIgLSBzdW1fYWlqX3JpKnN1bV9haWpfcmkpCisgICAgICAgICAgICAgICAgICAgICAgICAvIHN1bV9haWpfMjsKIAotCQlpZiAoIHJlc3VsdCA8IGJlc3RfcmVzdWx0ICkgewotCQkJYmVzdF9yZXN1bHQgPSByZXN1bHQ7Ci0JCQliZXN0X2ogPSBqOwotCQl9Ci0JCi0JfQorICAgICAgICAgICAgICAgIGlmICggcmVzdWx0IDwgYmVzdF9yZXN1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3Jlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfaiA9IGo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQogCi0JZmFjdG9yID0gX3N1bTIoY3AxK2Jlc3RfaiwgY3AyLCBsZW4yKSAvIHN1bV9yaV8yOworICAgICAgICBmYWN0b3IgPSBfc3VtMihjcDErYmVzdF9qLCBjcDIsIGxlbjIpIC8gc3VtX3JpXzI7CiAgICAgCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpZikiLCBiZXN0X2osIGZhY3Rvcik7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWYpIiwgYmVzdF9qLCBmYWN0b3IpOwogfQogCiAvKgpAQCAtMzc3LDI3ICs1MjQsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2ZpbmRmYWN0b3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0ICpjcDEsICpjcDI7Ci0JaW50IGxlbjEsIGxlbjI7Ci0JZG91YmxlIHN1bV9yaV8yLCBzdW1fYWlqX3JpLCByZXN1bHQ7CisgICAgICAgIHNob3J0ICpjcDEsICpjcDI7CisgICAgICAgIGludCBsZW4xLCBsZW4yOworICAgICAgICBkb3VibGUgc3VtX3JpXzIsIHN1bV9haWpfcmksIHJlc3VsdDsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNzIykiLCAmY3AxLCAmbGVuMSwgJmNwMiwgJmxlbjIpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBsZW4xICYgMSB8fCBsZW4yICYgMSApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlN0cmluZ3Mgc2hvdWxkIGJlIGV2ZW4tc2l6ZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICggbGVuMSAhPSBsZW4yICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2FtcGxlcyBzaG91bGQgYmUgc2FtZSBzaXplIik7Ci0JCXJldHVybiAwOwotCX0KLQlsZW4yID4+PSAxOwotCXN1bV9yaV8yID0gX3N1bTIoY3AyLCBjcDIsIGxlbjIpOwotCXN1bV9haWpfcmkgPSBfc3VtMihjcDEsIGNwMiwgbGVuMik7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNzIykiLCAmY3AxLCAmbGVuMSwgJmNwMiwgJmxlbjIpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBsZW4xICYgMSB8fCBsZW4yICYgMSApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICggbGVuMSAhPSBsZW4yICkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTYW1wbGVzIHNob3VsZCBiZSBzYW1lIHNpemUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBsZW4yID4+PSAxOworICAgICAgICBzdW1fcmlfMiA9IF9zdW0yKGNwMiwgY3AyLCBsZW4yKTsKKyAgICAgICAgc3VtX2Fpal9yaSA9IF9zdW0yKGNwMSwgY3AyLCBsZW4yKTsKIAotCXJlc3VsdCA9IHN1bV9haWpfcmkgLyBzdW1fcmlfMjsKKyAgICAgICAgcmVzdWx0ID0gc3VtX2Fpal9yaSAvIHN1bV9yaV8yOwogCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyZXN1bHQpOworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJlc3VsdCk7CiB9CiAKIC8qCkBAIC00MDcsOTgxICs1NTQsMTA1MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfZmluZG1heChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgKmNwMTsKLQlpbnQgbGVuMSwgbGVuMjsKLQlpbnQgaiwgYmVzdF9qOwotCWRvdWJsZSBhal9tMSwgYWpfbG0xOwotCWRvdWJsZSByZXN1bHQsIGJlc3RfcmVzdWx0OworICAgICAgICBzaG9ydCAqY3AxOworICAgICAgICBpbnQgbGVuMSwgbGVuMjsKKyAgICAgICAgaW50IGosIGJlc3RfajsKKyAgICAgICAgZG91YmxlIGFqX20xLCBhal9sbTE7CisgICAgICAgIGRvdWJsZSByZXN1bHQsIGJlc3RfcmVzdWx0OwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwMSwgJmxlbjEsICZsZW4yKSApCi0JCXJldHVybiAwOwotCWlmICggbGVuMSAmIDEgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTdHJpbmdzIHNob3VsZCBiZSBldmVuLXNpemVkIik7Ci0JCXJldHVybiAwOwotCX0KLQlsZW4xID4+PSAxOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AxLCAmbGVuMSwgJmxlbjIpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBsZW4xICYgMSApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGxlbjEgPj49IDE7CiAgICAgCi0JaWYgKCBsZW4xIDwgbGVuMiApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIklucHV0IHNhbXBsZSBzaG91bGQgYmUgbG9uZ2VyIik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBsZW4xIDwgbGVuMiApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiSW5wdXQgc2FtcGxlIHNob3VsZCBiZSBsb25nZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogCi0JcmVzdWx0ID0gX3N1bTIoY3AxLCBjcDEsIGxlbjIpOworICAgICAgICByZXN1bHQgPSBfc3VtMihjcDEsIGNwMSwgbGVuMik7CiAKLQliZXN0X3Jlc3VsdCA9IHJlc3VsdDsKLQliZXN0X2ogPSAwOwotCWogPSAwOworICAgICAgICBiZXN0X3Jlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgYmVzdF9qID0gMDsKKyAgICAgICAgaiA9IDA7CiAKLQlmb3IgKCBqPTE7IGo8PWxlbjEtbGVuMjsgaisrKSB7Ci0JCWFqX20xID0gKGRvdWJsZSljcDFbai0xXTsKLQkJYWpfbG0xID0gKGRvdWJsZSljcDFbaitsZW4yLTFdOworICAgICAgICBmb3IgKCBqPTE7IGo8PWxlbjEtbGVuMjsgaisrKSB7CisgICAgICAgICAgICAgICAgYWpfbTEgPSAoZG91YmxlKWNwMVtqLTFdOworICAgICAgICAgICAgICAgIGFqX2xtMSA9IChkb3VibGUpY3AxW2orbGVuMi0xXTsKIAotCQlyZXN1bHQgPSByZXN1bHQgKyBhal9sbTEqYWpfbG0xIC0gYWpfbTEqYWpfbTE7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgYWpfbG0xKmFqX2xtMSAtIGFqX20xKmFqX20xOwogCi0JCWlmICggcmVzdWx0ID4gYmVzdF9yZXN1bHQgKSB7Ci0JCQliZXN0X3Jlc3VsdCA9IHJlc3VsdDsKLQkJCWJlc3RfaiA9IGo7Ci0JCX0KLQkKLQl9CisgICAgICAgICAgICAgICAgaWYgKCByZXN1bHQgPiBiZXN0X3Jlc3VsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9qID0gajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoYmVzdF9qKTsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGJlc3Rfaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2F2Z3BwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMCwgcHJldnZhbCA9IDAsIHByZXZleHRyZW1ldmFsaWQgPSAwLAotCQlwcmV2ZXh0cmVtZSA9IDA7Ci0JaW50IGk7Ci0JZG91YmxlIGF2ZyA9IDAuMDsKLQlpbnQgZGlmZiwgcHJldmRpZmYsIGV4dHJlbWVkaWZmLCBuZXh0cmVtZSA9IDA7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMCwgcHJldnZhbCA9IDAsIHByZXZleHRyZW1ldmFsaWQgPSAwLAorICAgICAgICAgICAgICAgIHByZXZleHRyZW1lID0gMDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGRvdWJsZSBhdmcgPSAwLjA7CisgICAgICAgIGludCBkaWZmLCBwcmV2ZGlmZiwgZXh0cmVtZWRpZmYsIG5leHRyZW1lID0gMDsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogQ29tcHV0ZSBmaXJzdCBkZWx0YSB2YWx1ZSBhaGVhZC4gQWxzbyBhdXRvbWF0aWNhbGx5IG1ha2VzIHVzCi0JKiogc2tpcCB0aGUgZmlyc3QgZXh0cmVtZSB2YWx1ZQotCSovCi0JaWYgKCBzaXplID09IDEgKSAgICAgIHByZXZ2YWwgPSAoaW50KSpDSEFSUChjcCwgMCk7Ci0JZWxzZSBpZiAoIHNpemUgPT0gMiApIHByZXZ2YWwgPSAoaW50KSpTSE9SVFAoY3AsIDApOwotCWVsc2UgaWYgKCBzaXplID09IDQgKSBwcmV2dmFsID0gKGludCkqTE9OR1AoY3AsIDApOwotCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgc2l6ZSk7Ci0JZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgc2l6ZSk7Ci0JZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBzaXplKTsKLQlwcmV2ZGlmZiA9IHZhbCAtIHByZXZ2YWw7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLyogQ29tcHV0ZSBmaXJzdCBkZWx0YSB2YWx1ZSBhaGVhZC4gQWxzbyBhdXRvbWF0aWNhbGx5IG1ha2VzIHVzCisgICAgICAgICoqIHNraXAgdGhlIGZpcnN0IGV4dHJlbWUgdmFsdWUKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHByZXZ2YWwgPSAoaW50KSpDSEFSUChjcCwgMCk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBwcmV2dmFsID0gKGludCkqU0hPUlRQKGNwLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHByZXZ2YWwgPSAoaW50KSpMT05HUChjcCwgMCk7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgc2l6ZSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIHNpemUpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIHNpemUpOworICAgICAgICBwcmV2ZGlmZiA9IHZhbCAtIHByZXZ2YWw7CiAgICAgCi0JZm9yICggaT1zaXplOyBpPGxlbjsgaSs9IHNpemUpIHsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0JCWRpZmYgPSB2YWwgLSBwcmV2dmFsOwotCQlpZiAoIGRpZmYqcHJldmRpZmYgPCAwICkgewotCQkJLyogRGVyaXZhdGl2ZSBjaGFuZ2VkIHNpZ24uIENvbXB1dGUgZGlmZmVyZW5jZSB0byBsYXN0Ci0JCQkqKiBleHRyZW1lIHZhbHVlIGFuZCByZW1lbWJlci4KLQkJCSovCi0JCQlpZiAoIHByZXZleHRyZW1ldmFsaWQgKSB7Ci0JCQkJZXh0cmVtZWRpZmYgPSBwcmV2dmFsIC0gcHJldmV4dHJlbWU7Ci0JCQkJaWYgKCBleHRyZW1lZGlmZiA8IDAgKQotCQkJCQlleHRyZW1lZGlmZiA9IC1leHRyZW1lZGlmZjsKLQkJCQlhdmcgKz0gZXh0cmVtZWRpZmY7Ci0JCQkJbmV4dHJlbWUrKzsKLQkJCX0KLQkJCXByZXZleHRyZW1ldmFsaWQgPSAxOwotCQkJcHJldmV4dHJlbWUgPSBwcmV2dmFsOwotCQl9Ci0JCXByZXZ2YWwgPSB2YWw7Ci0JCWlmICggZGlmZiAhPSAwICkKLQkJCXByZXZkaWZmID0gZGlmZjsJCi0JfQotCWlmICggbmV4dHJlbWUgPT0gMCApCi0JCXZhbCA9IDA7Ci0JZWxzZQotCQl2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKW5leHRyZW1lKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICAgICAgZm9yICggaT1zaXplOyBpPGxlbjsgaSs9IHNpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZGlmZiA9IHZhbCAtIHByZXZ2YWw7CisgICAgICAgICAgICAgICAgaWYgKCBkaWZmKnByZXZkaWZmIDwgMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlcml2YXRpdmUgY2hhbmdlZCBzaWduLiBDb21wdXRlIGRpZmZlcmVuY2UgdG8gbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgKiogZXh0cmVtZSB2YWx1ZSBhbmQgcmVtZW1iZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwcmV2ZXh0cmVtZXZhbGlkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyZW1lZGlmZiA9IHByZXZ2YWwgLSBwcmV2ZXh0cmVtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBleHRyZW1lZGlmZiA8IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gLWV4dHJlbWVkaWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmcgKz0gZXh0cmVtZWRpZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRyZW1lKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZXZhbGlkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZleHRyZW1lID0gcHJldnZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldnZhbCA9IHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoIGRpZmYgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZGlmZiA9IGRpZmY7ICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBpZiAoIG5leHRyZW1lID09IDAgKQorICAgICAgICAgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKW5leHRyZW1lKTsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX21heHBwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMCwgcHJldnZhbCA9IDAsIHByZXZleHRyZW1ldmFsaWQgPSAwLAotCQlwcmV2ZXh0cmVtZSA9IDA7Ci0JaW50IGk7Ci0JaW50IG1heCA9IDA7Ci0JaW50IGRpZmYsIHByZXZkaWZmLCBleHRyZW1lZGlmZjsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBwcmV2dmFsID0gMCwgcHJldmV4dHJlbWV2YWxpZCA9IDAsCisgICAgICAgICAgICAgICAgcHJldmV4dHJlbWUgPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IG1heCA9IDA7CisgICAgICAgIGludCBkaWZmLCBwcmV2ZGlmZiwgZXh0cmVtZWRpZmY7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AsICZsZW4sICZzaXplKSApCi0JCXJldHVybiAwOwotCWlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIENvbXB1dGUgZmlyc3QgZGVsdGEgdmFsdWUgYWhlYWQuIEFsc28gYXV0b21hdGljYWxseSBtYWtlcyB1cwotCSoqIHNraXAgdGhlIGZpcnN0IGV4dHJlbWUgdmFsdWUKLQkqLwotCWlmICggc2l6ZSA9PSAxICkgICAgICBwcmV2dmFsID0gKGludCkqQ0hBUlAoY3AsIDApOwotCWVsc2UgaWYgKCBzaXplID09IDIgKSBwcmV2dmFsID0gKGludCkqU0hPUlRQKGNwLCAwKTsKLQllbHNlIGlmICggc2l6ZSA9PSA0ICkgcHJldnZhbCA9IChpbnQpKkxPTkdQKGNwLCAwKTsKLQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIHNpemUpOwotCWVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIHNpemUpOwotCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgc2l6ZSk7Ci0JcHJldmRpZmYgPSB2YWwgLSBwcmV2dmFsOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8qIENvbXB1dGUgZmlyc3QgZGVsdGEgdmFsdWUgYWhlYWQuIEFsc28gYXV0b21hdGljYWxseSBtYWtlcyB1cworICAgICAgICAqKiBza2lwIHRoZSBmaXJzdCBleHRyZW1lIHZhbHVlCisgICAgICAgICovCisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICBwcmV2dmFsID0gKGludCkqQ0hBUlAoY3AsIDApOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgcHJldnZhbCA9IChpbnQpKlNIT1JUUChjcCwgMCk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBwcmV2dmFsID0gKGludCkqTE9OR1AoY3AsIDApOworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIHNpemUpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBzaXplKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBzaXplKTsKKyAgICAgICAgcHJldmRpZmYgPSB2YWwgLSBwcmV2dmFsOwogCi0JZm9yICggaT1zaXplOyBpPGxlbjsgaSs9IHNpemUpIHsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0JCWRpZmYgPSB2YWwgLSBwcmV2dmFsOwotCQlpZiAoIGRpZmYqcHJldmRpZmYgPCAwICkgewotCQkJLyogRGVyaXZhdGl2ZSBjaGFuZ2VkIHNpZ24uIENvbXB1dGUgZGlmZmVyZW5jZSB0bwotCQkJKiogbGFzdCBleHRyZW1lIHZhbHVlIGFuZCByZW1lbWJlci4KLQkJCSovCi0JCQlpZiAoIHByZXZleHRyZW1ldmFsaWQgKSB7Ci0JCQkJZXh0cmVtZWRpZmYgPSBwcmV2dmFsIC0gcHJldmV4dHJlbWU7Ci0JCQkJaWYgKCBleHRyZW1lZGlmZiA8IDAgKQotCQkJCQlleHRyZW1lZGlmZiA9IC1leHRyZW1lZGlmZjsKLQkJCQlpZiAoIGV4dHJlbWVkaWZmID4gbWF4ICkKLQkJCQkJbWF4ID0gZXh0cmVtZWRpZmY7Ci0JCQl9Ci0JCQlwcmV2ZXh0cmVtZXZhbGlkID0gMTsKLQkJCXByZXZleHRyZW1lID0gcHJldnZhbDsKLQkJfQotCQlwcmV2dmFsID0gdmFsOwotCQlpZiAoIGRpZmYgIT0gMCApCi0JCQlwcmV2ZGlmZiA9IGRpZmY7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZyhtYXgpOworICAgICAgICBmb3IgKCBpPXNpemU7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBkaWZmID0gdmFsIC0gcHJldnZhbDsKKyAgICAgICAgICAgICAgICBpZiAoIGRpZmYqcHJldmRpZmYgPCAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVyaXZhdGl2ZSBjaGFuZ2VkIHNpZ24uIENvbXB1dGUgZGlmZmVyZW5jZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgKiogbGFzdCBleHRyZW1lIHZhbHVlIGFuZCByZW1lbWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByZXZleHRyZW1ldmFsaWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gcHJldnZhbCAtIHByZXZleHRyZW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGV4dHJlbWVkaWZmIDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSAtZXh0cmVtZWRpZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZXh0cmVtZWRpZmYgPiBtYXggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IGV4dHJlbWVkaWZmOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJldmV4dHJlbWV2YWxpZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZSA9IHByZXZ2YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZXZ2YWwgPSB2YWw7CisgICAgICAgICAgICAgICAgaWYgKCBkaWZmICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJldmRpZmYgPSBkaWZmOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhtYXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9jcm9zcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwOwotCWludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0JaW50IGk7Ci0JaW50IHByZXZ2YWwsIG5jcm9zczsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IHByZXZ2YWwsIG5jcm9zczsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JbmNyb3NzID0gLTE7Ci0JcHJldnZhbCA9IDE3OyAvKiBBbnl0aGluZyA8PiAwLDEgKi8KLQlmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPj4gNzsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9ICgoaW50KSpTSE9SVFAoY3AsIGkpKSA+PiAxNTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDMxOwotCQl2YWwgPSB2YWwgJiAxOwotCQlpZiAoIHZhbCAhPSBwcmV2dmFsICkgbmNyb3NzKys7Ci0JCXByZXZ2YWwgPSB2YWw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZyhuY3Jvc3MpOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIG5jcm9zcyA9IC0xOworICAgICAgICBwcmV2dmFsID0gMTc7IC8qIEFueXRoaW5nIDw+IDAsMSAqLworICAgICAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA+PiA3OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoKGludCkqU0hPUlRQKGNwLCBpKSkgPj4gMTU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDMxOworICAgICAgICAgICAgICAgIHZhbCA9IHZhbCAmIDE7CisgICAgICAgICAgICAgICAgaWYgKCB2YWwgIT0gcHJldnZhbCApIG5jcm9zcysrOworICAgICAgICAgICAgICAgIHByZXZ2YWwgPSB2YWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG5jcm9zcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX211bChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotCWludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0JZG91YmxlIGZhY3RvciwgZnZhbCwgbWF4dmFsOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaTsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBkb3VibGUgZmFjdG9yLCBmdmFsLCBtYXh2YWw7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGk7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWQpIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJmZhY3RvciApICkKLQkJcmV0dXJuIDA7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpZCkiLCAmY3AsICZsZW4sICZzaXplLCAmZmFjdG9yICkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgIAotCWlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKLQllbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOwotCWVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgICAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAgICAgCiAgICAgCi0JZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotCQlmdmFsID0gKGRvdWJsZSl2YWwqZmFjdG9yOwotCQlpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOwotCQllbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLQkJdmFsID0gKGludClmdmFsOwotCQlpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpdmFsOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KXZhbDsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKXZhbDsKLQl9Ci0JcmV0dXJuIHJ2OworICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsKmZhY3RvcjsKKyAgICAgICAgICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOworICAgICAgICAgICAgICAgIHZhbCA9IChpbnQpZnZhbDsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpdmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpdmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMil2YWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF90b21vbm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwxID0gMCwgdmFsMiA9IDA7Ci0JZG91YmxlIGZhYzEsIGZhYzIsIGZ2YWwsIG1heHZhbDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGk7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsMSA9IDAsIHZhbDIgPSAwOworICAgICAgICBkb3VibGUgZmFjMSwgZmFjMiwgZnZhbCwgbWF4dmFsOworICAgICAgICBQeU9iamVjdCAqcnY7CisgICAgICAgIGludCBpOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2lkZCkiLCAmY3AsICZsZW4sICZzaXplLCAmZmFjMSwgJmZhYzIgKSApCi0JCXJldHVybiAwOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWRkKSIsICZjcCwgJmxlbiwgJnNpemUsICZmYWMxLCAmZmFjMiApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAKLQlpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7Ci0JZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZjsKLQllbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZjsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZmZmZmY7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuLzIpOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vMik7CisgICAgICAgIGlmICggcnYgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKICAgICAKICAgICAKLQlmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSoyICkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMSA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDEgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMSA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbDIgPSAoaW50KSpDSEFSUChjcCwgaSsxKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDIgPSAoaW50KSpTSE9SVFAoY3AsIGkrMik7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwyID0gKGludCkqTE9OR1AoY3AsIGkrNCk7Ci0JCWZ2YWwgPSAoZG91YmxlKXZhbDEqZmFjMSArIChkb3VibGUpdmFsMipmYWMyOwotCQlpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOwotCQllbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLQkJdmFsMSA9IChpbnQpZnZhbDsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkvMikgPSAoc2lnbmVkIGNoYXIpdmFsMTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpLzIpID0gKHNob3J0KXZhbDE7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpLzIpPSAoUHlfSW50MzIpdmFsMTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSoyICkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwxID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwxID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMSA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMiA9IChpbnQpKkNIQVJQKGNwLCBpKzEpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwyID0gKGludCkqU0hPUlRQKGNwLCBpKzIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwyID0gKGludCkqTE9OR1AoY3AsIGkrNCk7CisgICAgICAgICAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsMSpmYWMxICsgKGRvdWJsZSl2YWwyKmZhYzI7CisgICAgICAgICAgICAgICAgaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKKyAgICAgICAgICAgICAgICB2YWwxID0gKGludClmdmFsOworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpLzIpID0gKHNpZ25lZCBjaGFyKXZhbDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpLzIpID0gKHNob3J0KXZhbDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkvMik9IChQeV9JbnQzMil2YWwxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfdG9zdGVyZW8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwxLCB2YWwyLCB2YWwgPSAwOwotCWRvdWJsZSBmYWMxLCBmYWMyLCBmdmFsLCBtYXh2YWw7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpOworICAgICAgICBzaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbDEsIHZhbDIsIHZhbCA9IDA7CisgICAgICAgIGRvdWJsZSBmYWMxLCBmYWMyLCBmdmFsLCBtYXh2YWw7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGk7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWRkKSIsICZjcCwgJmxlbiwgJnNpemUsICZmYWMxLCAmZmFjMiApICkKLQkJcmV0dXJuIDA7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpZGQpIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJmZhYzEsICZmYWMyICkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgIAotCWlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKLQllbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOwotCWVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qMik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKTsKKyAgICAgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogICAgIAogICAgIAotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwogCi0JCWZ2YWwgPSAoZG91YmxlKXZhbCpmYWMxOwotCQlpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOwotCQllbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLQkJdmFsMSA9IChpbnQpZnZhbDsKKyAgICAgICAgICAgICAgICBmdmFsID0gKGRvdWJsZSl2YWwqZmFjMTsKKyAgICAgICAgICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOworICAgICAgICAgICAgICAgIHZhbDEgPSAoaW50KWZ2YWw7CiAKLQkJZnZhbCA9IChkb3VibGUpdmFsKmZhYzI7Ci0JCWlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7Ci0JCWVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOwotCQl2YWwyID0gKGludClmdmFsOworICAgICAgICAgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbCpmYWMyOworICAgICAgICAgICAgICAgIGlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGZ2YWwgPCAtbWF4dmFsICkgZnZhbCA9IC1tYXh2YWw7CisgICAgICAgICAgICAgICAgdmFsMiA9IChpbnQpZnZhbDsKIAotCQlpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSoyKSA9IChzaWduZWQgY2hhcil2YWwxOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkqMikgPSAoc2hvcnQpdmFsMTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkqMikgPSAoUHlfSW50MzIpdmFsMTsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSoyKSA9IChzaWduZWQgY2hhcil2YWwxOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSoyKSA9IChzaG9ydCl2YWwxOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKjIpID0gKFB5X0ludDMyKXZhbDE7CiAKLQkJaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkqMisxKSA9IChzaWduZWQgY2hhcil2YWwyOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkqMisyKSA9IChzaG9ydCl2YWwyOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSoyKzQpID0gKFB5X0ludDMyKXZhbDI7Ci0JfQotCXJldHVybiBydjsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSoyKzEpID0gKHNpZ25lZCBjaGFyKXZhbDI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKjIrMikgPSAoc2hvcnQpdmFsMjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSoyKzQpID0gKFB5X0ludDMyKXZhbDI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9hZGQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDEsICpjcDIsICpuY3A7Ci0JaW50IGxlbjEsIGxlbjIsIHNpemUsIHZhbDEgPSAwLCB2YWwyID0gMCwgbWF4dmFsLCBuZXd2YWw7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpOworICAgICAgICBzaWduZWQgY2hhciAqY3AxLCAqY3AyLCAqbmNwOworICAgICAgICBpbnQgbGVuMSwgbGVuMiwgc2l6ZSwgdmFsMSA9IDAsIHZhbDIgPSAwLCBtYXh2YWwsIG5ld3ZhbDsKKyAgICAgICAgUHlPYmplY3QgKnJ2OworICAgICAgICBpbnQgaTsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNzI2kpIiwKLQkJCSAgJmNwMSwgJmxlbjEsICZjcDIsICZsZW4yLCAmc2l6ZSApICkKLQkJcmV0dXJuIDA7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNzI2kpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwMSwgJmxlbjEsICZjcDIsICZsZW4yLCAmc2l6ZSApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotCWlmICggbGVuMSAhPSBsZW4yICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiTGVuZ3RocyBzaG91bGQgYmUgdGhlIHNhbWUiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIGxlbjEgIT0gbGVuMiApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiTGVuZ3RocyBzaG91bGQgYmUgdGhlIHNhbWUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIAotCWlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gMHg3ZjsKLQllbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gMHg3ZmZmOwotCWVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAweDdmZmZmZmZmOwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAweDdmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gMHg3ZmZmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gMHg3ZmZmZmZmZjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbjEpOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4xKTsKKyAgICAgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JZm9yICggaT0wOyBpIDwgbGVuMTsgaSArPSBzaXplICkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMSA9IChpbnQpKkNIQVJQKGNwMSwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwxID0gKGludCkqU0hPUlRQKGNwMSwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwxID0gKGludCkqTE9OR1AoY3AxLCBpKTsKLQkKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbDIgPSAoaW50KSpDSEFSUChjcDIsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMiA9IChpbnQpKlNIT1JUUChjcDIsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMiA9IChpbnQpKkxPTkdQKGNwMiwgaSk7CisgICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjE7IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMSA9IChpbnQpKkNIQVJQKGNwMSwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDEgPSAoaW50KSpTSE9SVFAoY3AxLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMSA9IChpbnQpKkxPTkdQKGNwMSwgaSk7CisgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwyID0gKGludCkqQ0hBUlAoY3AyLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMiA9IChpbnQpKlNIT1JUUChjcDIsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwyID0gKGludCkqTE9OR1AoY3AyLCBpKTsKIAotCQluZXd2YWwgPSB2YWwxICsgdmFsMjsKLQkJLyogdHJ1bmNhdGUgaW4gY2FzZSBvZiBvdmVyZmxvdyAqLwotCQlpZiAobmV3dmFsID4gbWF4dmFsKSBuZXd2YWwgPSBtYXh2YWw7Ci0JCWVsc2UgaWYgKG5ld3ZhbCA8IC1tYXh2YWwpIG5ld3ZhbCA9IC1tYXh2YWw7Ci0JCWVsc2UgaWYgKHNpemUgPT0gNCAmJiAobmV3dmFsXnZhbDEpIDwgMCAmJiAobmV3dmFsXnZhbDIpIDwgMCkKLQkJCW5ld3ZhbCA9IHZhbDEgPiAwID8gbWF4dmFsIDogLSBtYXh2YWw7CisgICAgICAgICAgICAgICAgbmV3dmFsID0gdmFsMSArIHZhbDI7CisgICAgICAgICAgICAgICAgLyogdHJ1bmNhdGUgaW4gY2FzZSBvZiBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIGlmIChuZXd2YWwgPiBtYXh2YWwpIG5ld3ZhbCA9IG1heHZhbDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXd2YWwgPCAtbWF4dmFsKSBuZXd2YWwgPSAtbWF4dmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCAmJiAobmV3dmFsXnZhbDEpIDwgMCAmJiAobmV3dmFsXnZhbDIpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbCA9IHZhbDEgPiAwID8gbWF4dmFsIDogLSBtYXh2YWw7CiAKLQkJaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKW5ld3ZhbDsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCluZXd2YWw7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMiluZXd2YWw7Ci0JfQotCXJldHVybiBydjsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpbmV3dmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpbmV3dmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMiluZXd2YWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9iaWFzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3AsICpuY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGk7Ci0JaW50IGJpYXM7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICAgICAgUHlPYmplY3QgKnJ2OworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGJpYXM7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWkpIiwKLQkJCSAgJmNwLCAmbGVuLCAmc2l6ZSAsICZiaWFzKSApCi0JCXJldHVybiAwOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSAsICZiaWFzKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgICAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAgICAgCiAgICAgCi0JZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotCQotCQlpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbCtiaWFzKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFsK2JpYXMpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbCtiaWFzKTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFsK2JpYXMpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbCtiaWFzKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbCtiaWFzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX3JldmVyc2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQl1bnNpZ25lZCBjaGFyICpuY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGksIGo7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBQeU9iamVjdCAqcnY7CisgICAgICAgIGludCBpLCBqOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwKLQkJCSAgJmNwLCAmbGVuLCAmc2l6ZSkgKQotCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisgICAgICAgIGlmICggcnYgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogICAgIAotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKyAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OwogCi0JCWogPSBsZW4gLSBpIC0gc2l6ZTsKLQkKLQkJaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGopID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaikgPSAoc2hvcnQpKHZhbCk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBqKSA9IChQeV9JbnQzMikodmFsPDwxNik7Ci0JfQotCXJldHVybiBydjsKKyAgICAgICAgICAgICAgICBqID0gbGVuIC0gaSAtIHNpemU7CisgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBqKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaikgPSAoc2hvcnQpKHZhbCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGopID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2xpbjJsaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQl1bnNpZ25lZCBjaGFyICpuY3A7Ci0JaW50IGxlbiwgc2l6ZSwgc2l6ZTIsIHZhbCA9IDA7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpLCBqOworICAgICAgICBzaWduZWQgY2hhciAqY3A7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgc2l6ZTIsIHZhbCA9IDA7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGksIGo7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWkpIiwKLQkJCSAgJmNwLCAmbGVuLCAmc2l6ZSwgJnNpemUyKSApCi0JCXJldHVybiAwOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJnNpemUyKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgfHwKLQkgICAgIChzaXplMiAhPSAxICYmIHNpemUyICE9IDIgJiYgc2l6ZTIgIT0gNCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGlmICggKHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB8fAorICAgICAgICAgICAgIChzaXplMiAhPSAxICYmIHNpemUyICE9IDIgJiYgc2l6ZTIgIT0gNCkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4vc2l6ZSkqc2l6ZTIpOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4vc2l6ZSkqc2l6ZTIpOworICAgICAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKICAgICAKLQlmb3IgKCBpPTAsIGo9MDsgaSA8IGxlbjsgaSArPSBzaXplLCBqICs9IHNpemUyICkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKyAgICAgICAgZm9yICggaT0wLCBqPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSwgaiArPSBzaXplMiApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CiAKLQkJaWYgKCBzaXplMiA9PSAxICkgICpDSEFSUChuY3AsIGopID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7Ci0JCWVsc2UgaWYgKCBzaXplMiA9PSAyICkgKlNIT1JUUChuY3AsIGopID0gKHNob3J0KSh2YWwpOwotCQllbHNlIGlmICggc2l6ZTIgPT0gNCApICpMT05HUChuY3AsIGopID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgICAgICAgICAgICAgIGlmICggc2l6ZTIgPT0gMSApICAqQ0hBUlAobmNwLCBqKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplMiA9PSAyICkgKlNIT1JUUChuY3AsIGopID0gKHNob3J0KSh2YWwpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplMiA9PSA0ICkgKkxPTkdQKG5jcCwgaikgPSAoUHlfSW50MzIpKHZhbDw8MTYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIGludAogZ2NkKGludCBhLCBpbnQgYikKIHsKLQl3aGlsZSAoYiA+IDApIHsKLQkJaW50IHRtcCA9IGEgJSBiOwotCQlhID0gYjsKLQkJYiA9IHRtcDsKLQl9Ci0JcmV0dXJuIGE7CisgICAgICAgIHdoaWxlIChiID4gMCkgeworICAgICAgICAgICAgICAgIGludCB0bXAgPSBhICUgYjsKKyAgICAgICAgICAgICAgICBhID0gYjsKKyAgICAgICAgICAgICAgICBiID0gdG1wOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9yYXRlY3YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmNwLCAqbmNwOwotCWludCBsZW4sIHNpemUsIG5jaGFubmVscywgaW5yYXRlLCBvdXRyYXRlLCB3ZWlnaHRBLCB3ZWlnaHRCOwotCWludCBjaGFuLCBkLCAqcHJldl9pLCAqY3VyX2ksIGN1cl9vOwotCVB5T2JqZWN0ICpzdGF0ZSwgKnNhbXBzLCAqc3RyLCAqcnYgPSBOVUxMOwotCWludCBieXRlc19wZXJfZnJhbWU7CisgICAgICAgIGNoYXIgKmNwLCAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCBuY2hhbm5lbHMsIGlucmF0ZSwgb3V0cmF0ZSwgd2VpZ2h0QSwgd2VpZ2h0QjsKKyAgICAgICAgaW50IGNoYW4sIGQsICpwcmV2X2ksICpjdXJfaSwgY3VyX287CisgICAgICAgIFB5T2JqZWN0ICpzdGF0ZSwgKnNhbXBzLCAqc3RyLCAqcnYgPSBOVUxMOworICAgICAgICBpbnQgYnl0ZXNfcGVyX2ZyYW1lOwogCi0Jd2VpZ2h0QSA9IDE7Ci0Jd2VpZ2h0QiA9IDA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaWlPfGlpOnJhdGVjdiIsICZjcCwgJmxlbiwgJnNpemUsICZuY2hhbm5lbHMsCi0JCQkgICAgICAmaW5yYXRlLCAmb3V0cmF0ZSwgJnN0YXRlLCAmd2VpZ2h0QSwgJndlaWdodEIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG5jaGFubmVscyA8IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIiMgb2YgY2hhbm5lbHMgc2hvdWxkIGJlID49IDEiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJ5dGVzX3Blcl9mcmFtZSA9IHNpemUgKiBuY2hhbm5lbHM7Ci0JaWYgKGJ5dGVzX3Blcl9mcmFtZSAvIG5jaGFubmVscyAhPSBzaXplKSB7Ci0JCS8qIFRoaXMgb3ZlcmZsb3cgdGVzdCBpcyByaWdvcm91c2x5IGNvcnJlY3QgYmVjYXVzZQotCQkgICBib3RoIG11bHRpcGxpY2FuZHMgYXJlID49IDEuICBVc2UgdGhlIGFyZ3VtZW50IG5hbWVzCi0JCSAgIGZyb20gdGhlIGRvY3MgZm9yIHRoZSBlcnJvciBtc2cuICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkgICAgICAgICAgICAgICAgIndpZHRoICogbmNoYW5uZWxzIHRvbyBiaWcgZm9yIGEgQyBpbnQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh3ZWlnaHRBIDwgMSB8fCB3ZWlnaHRCIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLAotCQkJIndlaWdodEEgc2hvdWxkIGJlID49IDEsIHdlaWdodEIgc2hvdWxkIGJlID49IDAiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChsZW4gJSBieXRlc19wZXJfZnJhbWUgIT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAibm90IGEgd2hvbGUgbnVtYmVyIG9mIGZyYW1lcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGlucmF0ZSA8PSAwIHx8IG91dHJhdGUgPD0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAic2FtcGxpbmcgcmF0ZSBub3QgPiAwIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBkaXZpZGUgaW5yYXRlIGFuZCBvdXRyYXRlIGJ5IHRoZWlyIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yICovCi0JZCA9IGdjZChpbnJhdGUsIG91dHJhdGUpOwotCWlucmF0ZSAvPSBkOwotCW91dHJhdGUgLz0gZDsKKyAgICAgICAgd2VpZ2h0QSA9IDE7CisgICAgICAgIHdlaWdodEIgPSAwOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWlpaU98aWk6cmF0ZWN2IiwgJmNwLCAmbGVuLCAmc2l6ZSwgJm5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnJhdGUsICZvdXRyYXRlLCAmc3RhdGUsICZ3ZWlnaHRBLCAmd2VpZ2h0QikpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAobmNoYW5uZWxzIDwgMSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICIjIG9mIGNoYW5uZWxzIHNob3VsZCBiZSA+PSAxIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZXNfcGVyX2ZyYW1lID0gc2l6ZSAqIG5jaGFubmVsczsKKyAgICAgICAgaWYgKGJ5dGVzX3Blcl9mcmFtZSAvIG5jaGFubmVscyAhPSBzaXplKSB7CisgICAgICAgICAgICAgICAgLyogVGhpcyBvdmVyZmxvdyB0ZXN0IGlzIHJpZ29yb3VzbHkgY29ycmVjdCBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgYm90aCBtdWx0aXBsaWNhbmRzIGFyZSA+PSAxLiAgVXNlIHRoZSBhcmd1bWVudCBuYW1lcworICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGRvY3MgZm9yIHRoZSBlcnJvciBtc2cuICovCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCAqIG5jaGFubmVscyB0b28gYmlnIGZvciBhIEMgaW50Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdlaWdodEEgPCAxIHx8IHdlaWdodEIgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWlnaHRBIHNob3VsZCBiZSA+PSAxLCB3ZWlnaHRCIHNob3VsZCBiZSA+PSAwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbiAlIGJ5dGVzX3Blcl9mcmFtZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIm5vdCBhIHdob2xlIG51bWJlciBvZiBmcmFtZXMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5yYXRlIDw9IDAgfHwgb3V0cmF0ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgInNhbXBsaW5nIHJhdGUgbm90ID4gMCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIGRpdmlkZSBpbnJhdGUgYW5kIG91dHJhdGUgYnkgdGhlaXIgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3IgKi8KKyAgICAgICAgZCA9IGdjZChpbnJhdGUsIG91dHJhdGUpOworICAgICAgICBpbnJhdGUgLz0gZDsKKyAgICAgICAgb3V0cmF0ZSAvPSBkOwogCi0JcHJldl9pID0gKGludCAqKSBtYWxsb2MobmNoYW5uZWxzICogc2l6ZW9mKGludCkpOwotCWN1cl9pID0gKGludCAqKSBtYWxsb2MobmNoYW5uZWxzICogc2l6ZW9mKGludCkpOwotCWlmIChwcmV2X2kgPT0gTlVMTCB8fCBjdXJfaSA9PSBOVUxMKSB7Ci0JCSh2b2lkKSBQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGV4aXQ7Ci0JfQorICAgICAgICBwcmV2X2kgPSAoaW50ICopIG1hbGxvYyhuY2hhbm5lbHMgKiBzaXplb2YoaW50KSk7CisgICAgICAgIGN1cl9pID0gKGludCAqKSBtYWxsb2MobmNoYW5uZWxzICogc2l6ZW9mKGludCkpOworICAgICAgICBpZiAocHJldl9pID09IE5VTEwgfHwgY3VyX2kgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICh2b2lkKSBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQogCi0JbGVuIC89IGJ5dGVzX3Blcl9mcmFtZTsJLyogIyBvZiBmcmFtZXMgKi8KKyAgICAgICAgbGVuIC89IGJ5dGVzX3Blcl9mcmFtZTsgLyogIyBvZiBmcmFtZXMgKi8KIAotCWlmIChzdGF0ZSA9PSBQeV9Ob25lKSB7Ci0JCWQgPSAtb3V0cmF0ZTsKLQkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKQotCQkJcHJldl9pW2NoYW5dID0gY3VyX2lbY2hhbl0gPSAwOwotCX0KLQllbHNlIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLAotCQkJCSJpTyE7YXVkaW9vcC5yYXRlY3Y6IGlsbGVnYWwgc3RhdGUgYXJndW1lbnQiLAotCQkJCSZkLCAmUHlUdXBsZV9UeXBlLCAmc2FtcHMpKQotCQkJZ290byBleGl0OwotCQlpZiAoUHlUdXBsZV9TaXplKHNhbXBzKSAhPSBuY2hhbm5lbHMpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsCi0JCQkJCSJpbGxlZ2FsIHN0YXRlIGFyZ3VtZW50Iik7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7Ci0JCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoUHlUdXBsZV9HZXRJdGVtKHNhbXBzLCBjaGFuKSwKLQkJCQkJICAgICAgImlpOnJhdGVjdiIsJnByZXZfaVtjaGFuXSwmY3VyX2lbY2hhbl0pKQotCQkJCWdvdG8gZXhpdDsKLQkJfQotCX0KKyAgICAgICAgaWYgKHN0YXRlID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBkID0gLW91dHJhdGU7CisgICAgICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9pW2NoYW5dID0gY3VyX2lbY2hhbl0gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlPITthdWRpb29wLnJhdGVjdjogaWxsZWdhbCBzdGF0ZSBhcmd1bWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkLCAmUHlUdXBsZV9UeXBlLCAmc2FtcHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIGlmIChQeVR1cGxlX1NpemUoc2FtcHMpICE9IG5jaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCBzdGF0ZSBhcmd1bWVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShQeVR1cGxlX0dldEl0ZW0oc2FtcHMsIGNoYW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpaTpyYXRlY3YiLCZwcmV2X2lbY2hhbl0sJmN1cl9pW2NoYW5dKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JLyogc3RyIDwtIFNwYWNlIGZvciB0aGUgb3V0cHV0IGJ1ZmZlci4gKi8KLQl7Ci0JCS8qIFRoZXJlIGFyZSBsZW4gaW5wdXQgZnJhbWVzLCBzbyB3ZSBuZWVkIChtYXRoZW1hdGljYWxseSkKLQkJICAgY2VpbGluZyhsZW4qb3V0cmF0ZS9pbnJhdGUpIG91dHB1dCBmcmFtZXMsIGFuZCBlYWNoIGZyYW1lCi0JCSAgIHJlcXVpcmVzIGJ5dGVzX3Blcl9mcmFtZSBieXRlcy4gIENvbXB1dGluZyB0aGlzCi0JCSAgIHdpdGhvdXQgc3B1cmlvdXMgb3ZlcmZsb3cgaXMgdGhlIGNoYWxsZW5nZTsgd2UgY2FuCi0JCSAgIHNldHRsZSBmb3IgYSByZWFzb25hYmxlIHVwcGVyIGJvdW5kLCB0aG91Z2guICovCi0JCWludCBjZWlsaW5nOyAgIC8qIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcyAqLwotCQlpbnQgbmJ5dGVzOyAgICAvKiB0aGUgbnVtYmVyIG9mIG91dHB1dCBieXRlcyBuZWVkZWQgKi8KLQkJaW50IHEgPSBsZW4gLyBpbnJhdGU7Ci0JCS8qIE5vdyBsZW4gPSBxICogaW5yYXRlICsgciBleGFjdGx5ICh3aXRoIHIgPSBsZW4gJSBpbnJhdGUpLAotCQkgICBhbmQgdGhpcyBpcyBsZXNzIHRoYW4gcSAqIGlucmF0ZSArIGlucmF0ZSA9IChxKzEpKmlucmF0ZS4KLQkJICAgU28gYSByZWFzb25hYmxlIHVwcGVyIGJvdW5kIG9uIGxlbipvdXRyYXRlL2lucmF0ZSBpcwotCQkgICAoKHErMSkqaW5yYXRlKSpvdXRyYXRlL2lucmF0ZSA9Ci0JCSAgIChxKzEpKm91dHJhdGUuCi0JCSovCi0JCWNlaWxpbmcgPSAocSsxKSAqIG91dHJhdGU7Ci0JCW5ieXRlcyA9IGNlaWxpbmcgKiBieXRlc19wZXJfZnJhbWU7Ci0JCS8qIFNlZSB3aGV0aGVyIGFueXRoaW5nIG92ZXJmbG93ZWQ7IGlmIG5vdCwgZ2V0IHRoZSBzcGFjZS4gKi8KLQkJaWYgKHErMSA8IDAgfHwKLQkJICAgIGNlaWxpbmcgLyBvdXRyYXRlICE9IHErMSB8fAotCQkgICAgbmJ5dGVzIC8gYnl0ZXNfcGVyX2ZyYW1lICE9IGNlaWxpbmcpCi0JCQlzdHIgPSBOVUxMOwotCQllbHNlCi0JCQlzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuYnl0ZXMpOworICAgICAgICAvKiBzdHIgPC0gU3BhY2UgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLiAqLworICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVGhlcmUgYXJlIGxlbiBpbnB1dCBmcmFtZXMsIHNvIHdlIG5lZWQgKG1hdGhlbWF0aWNhbGx5KQorICAgICAgICAgICAgICAgICAgIGNlaWxpbmcobGVuKm91dHJhdGUvaW5yYXRlKSBvdXRwdXQgZnJhbWVzLCBhbmQgZWFjaCBmcmFtZQorICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzIGJ5dGVzX3Blcl9mcmFtZSBieXRlcy4gIENvbXB1dGluZyB0aGlzCisgICAgICAgICAgICAgICAgICAgd2l0aG91dCBzcHVyaW91cyBvdmVyZmxvdyBpcyB0aGUgY2hhbGxlbmdlOyB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgICBzZXR0bGUgZm9yIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCwgdGhvdWdoLiAqLworICAgICAgICAgICAgICAgIGludCBjZWlsaW5nOyAgIC8qIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcyAqLworICAgICAgICAgICAgICAgIGludCBuYnl0ZXM7ICAgIC8qIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzIG5lZWRlZCAqLworICAgICAgICAgICAgICAgIGludCBxID0gbGVuIC8gaW5yYXRlOworICAgICAgICAgICAgICAgIC8qIE5vdyBsZW4gPSBxICogaW5yYXRlICsgciBleGFjdGx5ICh3aXRoIHIgPSBsZW4gJSBpbnJhdGUpLAorICAgICAgICAgICAgICAgICAgIGFuZCB0aGlzIGlzIGxlc3MgdGhhbiBxICogaW5yYXRlICsgaW5yYXRlID0gKHErMSkqaW5yYXRlLgorICAgICAgICAgICAgICAgICAgIFNvIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCBvbiBsZW4qb3V0cmF0ZS9pbnJhdGUgaXMKKyAgICAgICAgICAgICAgICAgICAoKHErMSkqaW5yYXRlKSpvdXRyYXRlL2lucmF0ZSA9CisgICAgICAgICAgICAgICAgICAgKHErMSkqb3V0cmF0ZS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGNlaWxpbmcgPSAocSsxKSAqIG91dHJhdGU7CisgICAgICAgICAgICAgICAgbmJ5dGVzID0gY2VpbGluZyAqIGJ5dGVzX3Blcl9mcmFtZTsKKyAgICAgICAgICAgICAgICAvKiBTZWUgd2hldGhlciBhbnl0aGluZyBvdmVyZmxvd2VkOyBpZiBub3QsIGdldCB0aGUgc3BhY2UuICovCisgICAgICAgICAgICAgICAgaWYgKHErMSA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgY2VpbGluZyAvIG91dHJhdGUgIT0gcSsxIHx8CisgICAgICAgICAgICAgICAgICAgIG5ieXRlcyAvIGJ5dGVzX3Blcl9mcmFtZSAhPSBjZWlsaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuYnl0ZXMpOwogCi0JCWlmIChzdHIgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJCSJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOwotCQkJZ290byBleGl0OwotCQl9Ci0JfQotCW5jcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CisgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBuY3AgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpOwogCi0JZm9yICg7OykgewotCQl3aGlsZSAoZCA8IDApIHsKLQkJCWlmIChsZW4gPT0gMCkgewotCQkJCXNhbXBzID0gUHlUdXBsZV9OZXcobmNoYW5uZWxzKTsKLQkJCQlpZiAoc2FtcHMgPT0gTlVMTCkKLQkJCQkJZ290byBleGl0OwotCQkJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykKLQkJCQkJUHlUdXBsZV9TZXRJdGVtKHNhbXBzLCBjaGFuLAotCQkJCQkJUHlfQnVpbGRWYWx1ZSgiKGlpKSIsCi0JCQkJCQkJICAgICAgcHJldl9pW2NoYW5dLAotCQkJCQkJCSAgICAgIGN1cl9pW2NoYW5dKSk7Ci0JCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJCWdvdG8gZXhpdDsKLQkJCQkvKiBXZSBoYXZlIGNoZWNrZWQgYmVmb3JlIHRoYXQgdGhlIGxlbmd0aAotCQkJCSAqIG9mIHRoZSBzdHJpbmcgZml0cyBpbnRvIGludC4gKi8KLQkJCQlsZW4gPSAoaW50KShuY3AgLSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpKTsKLQkJCQlpZiAobGVuID09IDApIHsKLQkJCQkJLypkb24ndCB3YW50IHRvIHJlc2l6ZSB0byB6ZXJvIGxlbmd0aCovCi0JCQkJCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOwotCQkJCQlQeV9ERUNSRUYoc3RyKTsKLQkJCQkJc3RyID0gcnY7Ci0JCQkJfSBlbHNlIGlmIChfUHlTdHJpbmdfUmVzaXplKCZzdHIsIGxlbikgPCAwKQotCQkJCQlnb3RvIGV4aXQ7Ci0JCQkJcnYgPSBQeV9CdWlsZFZhbHVlKCIoTyhpTykpIiwgc3RyLCBkLCBzYW1wcyk7Ci0JCQkJUHlfREVDUkVGKHNhbXBzKTsKLQkJCQlQeV9ERUNSRUYoc3RyKTsKLQkJCQlnb3RvIGV4aXQ7IC8qIHJldHVybiBydiAqLwotCQkJfQotCQkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7Ci0JCQkJcHJldl9pW2NoYW5dID0gY3VyX2lbY2hhbl07Ci0JCQkJaWYgKHNpemUgPT0gMSkKLQkJCQkgICAgY3VyX2lbY2hhbl0gPSAoKGludCkqQ0hBUlAoY3AsIDApKSA8PCA4OwotCQkJCWVsc2UgaWYgKHNpemUgPT0gMikKLQkJCQkgICAgY3VyX2lbY2hhbl0gPSAoaW50KSpTSE9SVFAoY3AsIDApOwotCQkJCWVsc2UgaWYgKHNpemUgPT0gNCkKLQkJCQkgICAgY3VyX2lbY2hhbl0gPSAoKGludCkqTE9OR1AoY3AsIDApKSA+PiAxNjsKLQkJCQljcCArPSBzaXplOwotCQkJCS8qIGltcGxlbWVudHMgYSBzaW1wbGUgZGlnaXRhbCBmaWx0ZXIgKi8KLQkJCQljdXJfaVtjaGFuXSA9Ci0JCQkJCSh3ZWlnaHRBICogY3VyX2lbY2hhbl0gKwotCQkJCQkgd2VpZ2h0QiAqIHByZXZfaVtjaGFuXSkgLwotCQkJCQkod2VpZ2h0QSArIHdlaWdodEIpOwotCQkJfQotCQkJbGVuLS07Ci0JCQlkICs9IG91dHJhdGU7Ci0JCX0KLQkJd2hpbGUgKGQgPj0gMCkgewotCQkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7Ci0JCQkJY3VyX28gPSAocHJldl9pW2NoYW5dICogZCArCi0JCQkJCSBjdXJfaVtjaGFuXSAqIChvdXRyYXRlIC0gZCkpIC8KLQkJCQkJb3V0cmF0ZTsKLQkJCQlpZiAoc2l6ZSA9PSAxKQotCQkJCSAgICAqQ0hBUlAobmNwLCAwKSA9IChzaWduZWQgY2hhcikoY3VyX28gPj4gOCk7Ci0JCQkJZWxzZSBpZiAoc2l6ZSA9PSAyKQotCQkJCSAgICAqU0hPUlRQKG5jcCwgMCkgPSAoc2hvcnQpKGN1cl9vKTsKLQkJCQllbHNlIGlmIChzaXplID09IDQpCi0JCQkJICAgICpMT05HUChuY3AsIDApID0gKFB5X0ludDMyKShjdXJfbzw8MTYpOwotCQkJCW5jcCArPSBzaXplOwotCQkJfQotCQkJZCAtPSBpbnJhdGU7Ci0JCX0KLQl9CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wcyA9IFB5VHVwbGVfTmV3KG5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYW1wcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShzYW1wcywgY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoIihpaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSBjaGVja2VkIGJlZm9yZSB0aGF0IHRoZSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHN0cmluZyBmaXRzIGludG8gaW50LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAoaW50KShuY3AgLSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypkb24ndCB3YW50IHRvIHJlc2l6ZSB0byB6ZXJvIGxlbmd0aCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gcnY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmc3RyLCBsZW4pIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlfQnVpbGRWYWx1ZSgiKE8oaU8pKSIsIHN0ciwgZCwgc2FtcHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2FtcHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OyAvKiByZXR1cm4gcnYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0gPSBjdXJfaVtjaGFuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dID0gKChpbnQpKkNIQVJQKGNwLCAwKSkgPDwgODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoaW50KSpTSE9SVFAoY3AsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9ICgoaW50KSpMT05HUChjcCwgMCkpID4+IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCArPSBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbXBsZW1lbnRzIGEgc2ltcGxlIGRpZ2l0YWwgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2VpZ2h0QSAqIGN1cl9pW2NoYW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0QiAqIHByZXZfaVtjaGFuXSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZWlnaHRBICsgd2VpZ2h0Qik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gb3V0cmF0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKGQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9vID0gKHByZXZfaVtjaGFuXSAqIGQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSAqIChvdXRyYXRlIC0gZCkpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRyYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkNIQVJQKG5jcCwgMCkgPSAoc2lnbmVkIGNoYXIpKGN1cl9vID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU0hPUlRQKG5jcCwgMCkgPSAoc2hvcnQpKGN1cl9vKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkxPTkdQKG5jcCwgMCkgPSAoUHlfSW50MzIpKGN1cl9vPDwxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jcCArPSBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZCAtPSBpbnJhdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CiAgIGV4aXQ6Ci0JaWYgKHByZXZfaSAhPSBOVUxMKQotCQlmcmVlKHByZXZfaSk7Ci0JaWYgKGN1cl9pICE9IE5VTEwpCi0JCWZyZWUoY3VyX2kpOwotCXJldHVybiBydjsKKyAgICAgICAgaWYgKHByZXZfaSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGZyZWUocHJldl9pKTsKKyAgICAgICAgaWYgKGN1cl9pICE9IE5VTEwpCisgICAgICAgICAgICAgICAgZnJlZShjdXJfaSk7CisgICAgICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfbGluMnVsYXcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQl1bnNpZ25lZCBjaGFyICpuY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGk7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBQeU9iamVjdCAqcnY7CisgICAgICAgIGludCBpOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwKLQkJCSAgJmNwLCAmbGVuLCAmc2l6ZSkgKQotCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuL3NpemUpOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi9zaXplKTsKKyAgICAgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAgICAgCi0JZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CiAKLQkJKm5jcCsrID0gc3RfbGluZWFyX3RvX3VsYXcodmFsKTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgICAgICAgICAgICAgICpuY3ArKyA9IHN0XzE0bGluZWFyMnVsYXcodmFsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX3VsYXcybGluKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBjaGFyICpjcDsKLQl1bnNpZ25lZCBjaGFyIGN2YWw7Ci0Jc2lnbmVkIGNoYXIgKm5jcDsKLQlpbnQgbGVuLCBzaXplLCB2YWw7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpOworICAgICAgICB1bnNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjdmFsOworICAgICAgICBzaWduZWQgY2hhciAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWw7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGk7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLAotCQkJICAmY3AsICZsZW4sICZzaXplKSApCi0JCXJldHVybiAwOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qc2l6ZSk7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbipzaXplKTsKKyAgICAgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogICAgIAotCWZvciAoIGk9MDsgaSA8IGxlbipzaXplOyBpICs9IHNpemUgKSB7Ci0JCWN2YWwgPSAqY3ArKzsKLQkJdmFsID0gc3RfdWxhd190b19saW5lYXIoY3ZhbCk7Ci0JCi0JCWlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWwpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbDw8MTYpOwotCX0KLQlyZXR1cm4gcnY7CisgICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbipzaXplOyBpICs9IHNpemUgKSB7CisgICAgICAgICAgICAgICAgY3ZhbCA9ICpjcCsrOworICAgICAgICAgICAgICAgIHZhbCA9IHN0X3VsYXcybGluZWFyMTYoY3ZhbCk7CisgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCithdWRpb29wX2xpbjJhbGF3KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICB1bnNpZ25lZCBjaGFyICpuY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vc2l6ZSk7CisgICAgICAgIGlmICggcnYgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIAorICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CisKKyAgICAgICAgICAgICAgICAqbmNwKysgPSBzdF9saW5lYXIyYWxhdyh2YWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2F1ZGlvb3BfYWxhdzJsaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjdmFsOworICAgICAgICBzaWduZWQgY2hhciAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWw7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qc2l6ZSk7CisgICAgICAgIGlmICggcnYgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAKKyAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuKnNpemU7IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBjdmFsID0gKmNwKys7CisgICAgICAgICAgICAgICAgdmFsID0gc3RfYWxhdzJsaW5lYXIxNihjdmFsKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFsKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbDw8MTYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfbGluMmFkcGNtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3A7Ci0Jc2lnbmVkIGNoYXIgKm5jcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBzdGVwLCB2YWxwcmVkLCBkZWx0YSwKLQkJaW5kZXgsIHNpZ24sIHZwZGlmZiwgZGlmZjsKLQlQeU9iamVjdCAqcnYsICpzdGF0ZSwgKnN0cjsKLQlpbnQgaSwgb3V0cHV0YnVmZmVyID0gMCwgYnVmZmVyc3RlcDsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICBzaWduZWQgY2hhciAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBzdGVwLCB2YWxwcmVkLCBkZWx0YSwKKyAgICAgICAgICAgICAgICBpbmRleCwgc2lnbiwgdnBkaWZmLCBkaWZmOworICAgICAgICBQeU9iamVjdCAqcnYsICpzdGF0ZSwgKnN0cjsKKyAgICAgICAgaW50IGksIG91dHB1dGJ1ZmZlciA9IDAsIGJ1ZmZlcnN0ZXA7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaU8pIiwKLQkJCSAgJmNwLCAmbGVuLCAmc2l6ZSwgJnN0YXRlKSApCi0JCXJldHVybiAwOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaU8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJnN0YXRlKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgCiAKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0Jc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuLyhzaXplKjIpKTsKLQlpZiAoIHN0ciA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcoc3RyKTsKKyAgICAgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuLyhzaXplKjIpKTsKKyAgICAgICAgaWYgKCBzdHIgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CiAKLQkvKiBEZWNvZGUgc3RhdGUsIHNob3VsZCBoYXZlICh2YWx1ZSwgc3RlcCkgKi8KLQlpZiAoIHN0YXRlID09IFB5X05vbmUgKSB7Ci0JCS8qIEZpcnN0IHRpbWUsIGl0IHNlZW1zLiBTZXQgZGVmYXVsdHMgKi8KLQkJdmFscHJlZCA9IDA7Ci0JCXN0ZXAgPSA3OwotCQlpbmRleCA9IDA7Ci0JfSBlbHNlIGlmICggIVB5QXJnX1BhcnNlKHN0YXRlLCAiKGlpKSIsICZ2YWxwcmVkLCAmaW5kZXgpICkKLQkJcmV0dXJuIDA7CisgICAgICAgIC8qIERlY29kZSBzdGF0ZSwgc2hvdWxkIGhhdmUgKHZhbHVlLCBzdGVwKSAqLworICAgICAgICBpZiAoIHN0YXRlID09IFB5X05vbmUgKSB7CisgICAgICAgICAgICAgICAgLyogRmlyc3QgdGltZSwgaXQgc2VlbXMuIFNldCBkZWZhdWx0cyAqLworICAgICAgICAgICAgICAgIHZhbHByZWQgPSAwOworICAgICAgICAgICAgICAgIHN0ZXAgPSA3OworICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICggIVB5QXJnX1BhcnNlKHN0YXRlLCAiKGlpKSIsICZ2YWxwcmVkLCAmaW5kZXgpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotCXN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKLQlidWZmZXJzdGVwID0gMTsKKyAgICAgICAgc3RlcCA9IHN0ZXBzaXplVGFibGVbaW5kZXhdOworICAgICAgICBidWZmZXJzdGVwID0gMTsKIAotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKyAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OwogCi0JCS8qIFN0ZXAgMSAtIGNvbXB1dGUgZGlmZmVyZW5jZSB3aXRoIHByZXZpb3VzIHZhbHVlICovCi0JCWRpZmYgPSB2YWwgLSB2YWxwcmVkOwotCQlzaWduID0gKGRpZmYgPCAwKSA/IDggOiAwOwotCQlpZiAoIHNpZ24gKSBkaWZmID0gKC1kaWZmKTsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDEgLSBjb21wdXRlIGRpZmZlcmVuY2Ugd2l0aCBwcmV2aW91cyB2YWx1ZSAqLworICAgICAgICAgICAgICAgIGRpZmYgPSB2YWwgLSB2YWxwcmVkOworICAgICAgICAgICAgICAgIHNpZ24gPSAoZGlmZiA8IDApID8gOCA6IDA7CisgICAgICAgICAgICAgICAgaWYgKCBzaWduICkgZGlmZiA9ICgtZGlmZik7CiAKLQkJLyogU3RlcCAyIC0gRGl2aWRlIGFuZCBjbGFtcCAqLwotCQkvKiBOb3RlOgotCQkqKiBUaGlzIGNvZGUgKmFwcHJveGltYXRlbHkqIGNvbXB1dGVzOgotCQkqKiAgICBkZWx0YSA9IGRpZmYqNC9zdGVwOwotCQkqKiAgICB2cGRpZmYgPSAoZGVsdGErMC41KSpzdGVwLzQ7Ci0JCSoqIGJ1dCBpbiBzaGlmdCBzdGVwIGJpdHMgYXJlIGRyb3BwZWQuIFRoZSBuZXQgcmVzdWx0IG9mIHRoaXMKLQkJKiogaXMgdGhhdCBldmVuIGlmIHlvdSBoYXZlIGZhc3QgbXVsL2RpdiBoYXJkd2FyZSB5b3UgY2Fubm90Ci0JCSoqIHB1dCBpdCB0byBnb29kIHVzZSBzaW5jZSB0aGUgZml4dXAgd291bGQgYmUgdG9vIGV4cGVuc2l2ZS4KLQkJKi8KLQkJZGVsdGEgPSAwOwotCQl2cGRpZmYgPSAoc3RlcCA+PiAzKTsKLQkKLQkJaWYgKCBkaWZmID49IHN0ZXAgKSB7Ci0JCQlkZWx0YSA9IDQ7Ci0JCQlkaWZmIC09IHN0ZXA7Ci0JCQl2cGRpZmYgKz0gc3RlcDsKLQkJfQotCQlzdGVwID4+PSAxOwotCQlpZiAoIGRpZmYgPj0gc3RlcCAgKSB7Ci0JCQlkZWx0YSB8PSAyOwotCQkJZGlmZiAtPSBzdGVwOwotCQkJdnBkaWZmICs9IHN0ZXA7Ci0JCX0KLQkJc3RlcCA+Pj0gMTsKLQkJaWYgKCBkaWZmID49IHN0ZXAgKSB7Ci0JCQlkZWx0YSB8PSAxOwotCQkJdnBkaWZmICs9IHN0ZXA7Ci0JCX0KKyAgICAgICAgICAgICAgICAvKiBTdGVwIDIgLSBEaXZpZGUgYW5kIGNsYW1wICovCisgICAgICAgICAgICAgICAgLyogTm90ZToKKyAgICAgICAgICAgICAgICAqKiBUaGlzIGNvZGUgKmFwcHJveGltYXRlbHkqIGNvbXB1dGVzOgorICAgICAgICAgICAgICAgICoqICAgIGRlbHRhID0gZGlmZio0L3N0ZXA7CisgICAgICAgICAgICAgICAgKiogICAgdnBkaWZmID0gKGRlbHRhKzAuNSkqc3RlcC80OworICAgICAgICAgICAgICAgICoqIGJ1dCBpbiBzaGlmdCBzdGVwIGJpdHMgYXJlIGRyb3BwZWQuIFRoZSBuZXQgcmVzdWx0IG9mIHRoaXMKKyAgICAgICAgICAgICAgICAqKiBpcyB0aGF0IGV2ZW4gaWYgeW91IGhhdmUgZmFzdCBtdWwvZGl2IGhhcmR3YXJlIHlvdSBjYW5ub3QKKyAgICAgICAgICAgICAgICAqKiBwdXQgaXQgdG8gZ29vZCB1c2Ugc2luY2UgdGhlIGZpeHVwIHdvdWxkIGJlIHRvbyBleHBlbnNpdmUuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBkZWx0YSA9IDA7CisgICAgICAgICAgICAgICAgdnBkaWZmID0gKHN0ZXAgPj4gMyk7CisgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggZGlmZiA+PSBzdGVwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiAtPSBzdGVwOworICAgICAgICAgICAgICAgICAgICAgICAgdnBkaWZmICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZXAgPj49IDE7CisgICAgICAgICAgICAgICAgaWYgKCBkaWZmID49IHN0ZXAgICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgfD0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgLT0gc3RlcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwZGlmZiArPSBzdGVwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGVwID4+PSAxOworICAgICAgICAgICAgICAgIGlmICggZGlmZiA+PSBzdGVwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgfD0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwZGlmZiArPSBzdGVwOworICAgICAgICAgICAgICAgIH0KIAotCQkvKiBTdGVwIDMgLSBVcGRhdGUgcHJldmlvdXMgdmFsdWUgKi8KLQkJaWYgKCBzaWduICkKLQkJCXZhbHByZWQgLT0gdnBkaWZmOwotCQllbHNlCi0JCQl2YWxwcmVkICs9IHZwZGlmZjsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDMgLSBVcGRhdGUgcHJldmlvdXMgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIHNpZ24gKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFscHJlZCAtPSB2cGRpZmY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdmFscHJlZCArPSB2cGRpZmY7CiAKLQkJLyogU3RlcCA0IC0gQ2xhbXAgcHJldmlvdXMgdmFsdWUgdG8gMTYgYml0cyAqLwotCQlpZiAoIHZhbHByZWQgPiAzMjc2NyApCi0JCQl2YWxwcmVkID0gMzI3Njc7Ci0JCWVsc2UgaWYgKCB2YWxwcmVkIDwgLTMyNzY4ICkKLQkJCXZhbHByZWQgPSAtMzI3Njg7CisgICAgICAgICAgICAgICAgLyogU3RlcCA0IC0gQ2xhbXAgcHJldmlvdXMgdmFsdWUgdG8gMTYgYml0cyAqLworICAgICAgICAgICAgICAgIGlmICggdmFscHJlZCA+IDMyNzY3ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgPSAzMjc2NzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggdmFscHJlZCA8IC0zMjc2OCApCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkID0gLTMyNzY4OwogCi0JCS8qIFN0ZXAgNSAtIEFzc2VtYmxlIHZhbHVlLCB1cGRhdGUgaW5kZXggYW5kIHN0ZXAgdmFsdWVzICovCi0JCWRlbHRhIHw9IHNpZ247Ci0JCi0JCWluZGV4ICs9IGluZGV4VGFibGVbZGVsdGFdOwotCQlpZiAoIGluZGV4IDwgMCApIGluZGV4ID0gMDsKLQkJaWYgKCBpbmRleCA+IDg4ICkgaW5kZXggPSA4ODsKLQkJc3RlcCA9IHN0ZXBzaXplVGFibGVbaW5kZXhdOworICAgICAgICAgICAgICAgIC8qIFN0ZXAgNSAtIEFzc2VtYmxlIHZhbHVlLCB1cGRhdGUgaW5kZXggYW5kIHN0ZXAgdmFsdWVzICovCisgICAgICAgICAgICAgICAgZGVsdGEgfD0gc2lnbjsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaW5kZXggKz0gaW5kZXhUYWJsZVtkZWx0YV07CisgICAgICAgICAgICAgICAgaWYgKCBpbmRleCA8IDAgKSBpbmRleCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCBpbmRleCA+IDg4ICkgaW5kZXggPSA4ODsKKyAgICAgICAgICAgICAgICBzdGVwID0gc3RlcHNpemVUYWJsZVtpbmRleF07CiAKLQkJLyogU3RlcCA2IC0gT3V0cHV0IHZhbHVlICovCi0JCWlmICggYnVmZmVyc3RlcCApIHsKLQkJCW91dHB1dGJ1ZmZlciA9IChkZWx0YSA8PCA0KSAmIDB4ZjA7Ci0JCX0gZWxzZSB7Ci0JCQkqbmNwKysgPSAoZGVsdGEgJiAweDBmKSB8IG91dHB1dGJ1ZmZlcjsKLQkJfQotCQlidWZmZXJzdGVwID0gIWJ1ZmZlcnN0ZXA7Ci0JfQotCXJ2ID0gUHlfQnVpbGRWYWx1ZSgiKE8oaWkpKSIsIHN0ciwgdmFscHJlZCwgaW5kZXgpOwotCVB5X0RFQ1JFRihzdHIpOwotCXJldHVybiBydjsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDYgLSBPdXRwdXQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIGJ1ZmZlcnN0ZXAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRidWZmZXIgPSAoZGVsdGEgPDwgNCkgJiAweGYwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqbmNwKysgPSAoZGVsdGEgJiAweDBmKSB8IG91dHB1dGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmZmVyc3RlcCA9ICFidWZmZXJzdGVwOworICAgICAgICB9CisgICAgICAgIHJ2ID0gUHlfQnVpbGRWYWx1ZSgiKE8oaWkpKSIsIHN0ciwgdmFscHJlZCwgaW5kZXgpOworICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9hZHBjbTJsaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQlzaWduZWQgY2hhciAqbmNwOwotCWludCBsZW4sIHNpemUsIHZhbHByZWQsIHN0ZXAsIGRlbHRhLCBpbmRleCwgc2lnbiwgdnBkaWZmOwotCVB5T2JqZWN0ICpydiwgKnN0ciwgKnN0YXRlOwotCWludCBpLCBpbnB1dGJ1ZmZlciA9IDAsIGJ1ZmZlcnN0ZXA7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgc2lnbmVkIGNoYXIgKm5jcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFscHJlZCwgc3RlcCwgZGVsdGEsIGluZGV4LCBzaWduLCB2cGRpZmY7CisgICAgICAgIFB5T2JqZWN0ICpydiwgKnN0ciwgKnN0YXRlOworICAgICAgICBpbnQgaSwgaW5wdXRidWZmZXIgPSAwLCBidWZmZXJzdGVwOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2lPKSIsCi0JCQkgICZjcCwgJmxlbiwgJnNpemUsICZzdGF0ZSkgKQotCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2lPKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUsICZzdGF0ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIAotCS8qIERlY29kZSBzdGF0ZSwgc2hvdWxkIGhhdmUgKHZhbHVlLCBzdGVwKSAqLwotCWlmICggc3RhdGUgPT0gUHlfTm9uZSApIHsKLQkJLyogRmlyc3QgdGltZSwgaXQgc2VlbXMuIFNldCBkZWZhdWx0cyAqLwotCQl2YWxwcmVkID0gMDsKLQkJc3RlcCA9IDc7Ci0JCWluZGV4ID0gMDsKLQl9IGVsc2UgaWYgKCAhUHlBcmdfUGFyc2Uoc3RhdGUsICIoaWkpIiwgJnZhbHByZWQsICZpbmRleCkgKQotCQlyZXR1cm4gMDsKKyAgICAgICAgLyogRGVjb2RlIHN0YXRlLCBzaG91bGQgaGF2ZSAodmFsdWUsIHN0ZXApICovCisgICAgICAgIGlmICggc3RhdGUgPT0gUHlfTm9uZSApIHsKKyAgICAgICAgICAgICAgICAvKiBGaXJzdCB0aW1lLCBpdCBzZWVtcy4gU2V0IGRlZmF1bHRzICovCisgICAgICAgICAgICAgICAgdmFscHJlZCA9IDA7CisgICAgICAgICAgICAgICAgc3RlcCA9IDc7CisgICAgICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICB9IGVsc2UgaWYgKCAhUHlBcmdfUGFyc2Uoc3RhdGUsICIoaWkpIiwgJnZhbHByZWQsICZpbmRleCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgIAotCXN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbipzaXplKjIpOwotCWlmICggc3RyID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhzdHIpOworICAgICAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qc2l6ZSoyKTsKKyAgICAgICAgaWYgKCBzdHIgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CiAKLQlzdGVwID0gc3RlcHNpemVUYWJsZVtpbmRleF07Ci0JYnVmZmVyc3RlcCA9IDA7CisgICAgICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKKyAgICAgICAgYnVmZmVyc3RlcCA9IDA7CiAgICAgCi0JZm9yICggaT0wOyBpIDwgbGVuKnNpemUqMjsgaSArPSBzaXplICkgewotCQkvKiBTdGVwIDEgLSBnZXQgdGhlIGRlbHRhIHZhbHVlIGFuZCBjb21wdXRlIG5leHQgaW5kZXggKi8KLQkJaWYgKCBidWZmZXJzdGVwICkgewotCQkJZGVsdGEgPSBpbnB1dGJ1ZmZlciAmIDB4ZjsKLQkJfSBlbHNlIHsKLQkJCWlucHV0YnVmZmVyID0gKmNwKys7Ci0JCQlkZWx0YSA9IChpbnB1dGJ1ZmZlciA+PiA0KSAmIDB4ZjsKLQkJfQorICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW4qc2l6ZSoyOyBpICs9IHNpemUgKSB7CisgICAgICAgICAgICAgICAgLyogU3RlcCAxIC0gZ2V0IHRoZSBkZWx0YSB2YWx1ZSBhbmQgY29tcHV0ZSBuZXh0IGluZGV4ICovCisgICAgICAgICAgICAgICAgaWYgKCBidWZmZXJzdGVwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBpbnB1dGJ1ZmZlciAmIDB4ZjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRidWZmZXIgPSAqY3ArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gKGlucHV0YnVmZmVyID4+IDQpICYgMHhmOworICAgICAgICAgICAgICAgIH0KIAotCQlidWZmZXJzdGVwID0gIWJ1ZmZlcnN0ZXA7CisgICAgICAgICAgICAgICAgYnVmZmVyc3RlcCA9ICFidWZmZXJzdGVwOwogCi0JCS8qIFN0ZXAgMiAtIEZpbmQgbmV3IGluZGV4IHZhbHVlIChmb3IgbGF0ZXIpICovCi0JCWluZGV4ICs9IGluZGV4VGFibGVbZGVsdGFdOwotCQlpZiAoIGluZGV4IDwgMCApIGluZGV4ID0gMDsKLQkJaWYgKCBpbmRleCA+IDg4ICkgaW5kZXggPSA4ODsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDIgLSBGaW5kIG5ldyBpbmRleCB2YWx1ZSAoZm9yIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGluZGV4ICs9IGluZGV4VGFibGVbZGVsdGFdOworICAgICAgICAgICAgICAgIGlmICggaW5kZXggPCAwICkgaW5kZXggPSAwOworICAgICAgICAgICAgICAgIGlmICggaW5kZXggPiA4OCApIGluZGV4ID0gODg7CiAKLQkJLyogU3RlcCAzIC0gU2VwYXJhdGUgc2lnbiBhbmQgbWFnbml0dWRlICovCi0JCXNpZ24gPSBkZWx0YSAmIDg7Ci0JCWRlbHRhID0gZGVsdGEgJiA3OworICAgICAgICAgICAgICAgIC8qIFN0ZXAgMyAtIFNlcGFyYXRlIHNpZ24gYW5kIG1hZ25pdHVkZSAqLworICAgICAgICAgICAgICAgIHNpZ24gPSBkZWx0YSAmIDg7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBkZWx0YSAmIDc7CiAKLQkJLyogU3RlcCA0IC0gQ29tcHV0ZSBkaWZmZXJlbmNlIGFuZCBuZXcgcHJlZGljdGVkIHZhbHVlICovCi0JCS8qCi0JCSoqIENvbXB1dGVzICd2cGRpZmYgPSAoZGVsdGErMC41KSpzdGVwLzQnLCBidXQgc2VlIGNvbW1lbnQKLQkJKiogaW4gYWRwY21fY29kZXIuCi0JCSovCi0JCXZwZGlmZiA9IHN0ZXAgPj4gMzsKLQkJaWYgKCBkZWx0YSAmIDQgKSB2cGRpZmYgKz0gc3RlcDsKLQkJaWYgKCBkZWx0YSAmIDIgKSB2cGRpZmYgKz0gc3RlcD4+MTsKLQkJaWYgKCBkZWx0YSAmIDEgKSB2cGRpZmYgKz0gc3RlcD4+MjsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDQgLSBDb21wdXRlIGRpZmZlcmVuY2UgYW5kIG5ldyBwcmVkaWN0ZWQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICoqIENvbXB1dGVzICd2cGRpZmYgPSAoZGVsdGErMC41KSpzdGVwLzQnLCBidXQgc2VlIGNvbW1lbnQKKyAgICAgICAgICAgICAgICAqKiBpbiBhZHBjbV9jb2Rlci4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHZwZGlmZiA9IHN0ZXAgPj4gMzsKKyAgICAgICAgICAgICAgICBpZiAoIGRlbHRhICYgNCApIHZwZGlmZiArPSBzdGVwOworICAgICAgICAgICAgICAgIGlmICggZGVsdGEgJiAyICkgdnBkaWZmICs9IHN0ZXA+PjE7CisgICAgICAgICAgICAgICAgaWYgKCBkZWx0YSAmIDEgKSB2cGRpZmYgKz0gc3RlcD4+MjsKIAotCQlpZiAoIHNpZ24gKQotCQkJdmFscHJlZCAtPSB2cGRpZmY7Ci0JCWVsc2UKLQkJCXZhbHByZWQgKz0gdnBkaWZmOworICAgICAgICAgICAgICAgIGlmICggc2lnbiApCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkIC09IHZwZGlmZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkICs9IHZwZGlmZjsKIAotCQkvKiBTdGVwIDUgLSBjbGFtcCBvdXRwdXQgdmFsdWUgKi8KLQkJaWYgKCB2YWxwcmVkID4gMzI3NjcgKQotCQkJdmFscHJlZCA9IDMyNzY3OwotCQllbHNlIGlmICggdmFscHJlZCA8IC0zMjc2OCApCi0JCQl2YWxwcmVkID0gLTMyNzY4OworICAgICAgICAgICAgICAgIC8qIFN0ZXAgNSAtIGNsYW1wIG91dHB1dCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIGlmICggdmFscHJlZCA+IDMyNzY3ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgPSAzMjc2NzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggdmFscHJlZCA8IC0zMjc2OCApCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkID0gLTMyNzY4OwogCi0JCS8qIFN0ZXAgNiAtIFVwZGF0ZSBzdGVwIHZhbHVlICovCi0JCXN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDYgLSBVcGRhdGUgc3RlcCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKIAotCQkvKiBTdGVwIDYgLSBPdXRwdXQgdmFsdWUgKi8KLQkJaWYgKCBzaXplID09IDEgKSAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFscHJlZCA+PiA4KTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFscHJlZCk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFscHJlZDw8MTYpOwotCX0KKyAgICAgICAgICAgICAgICAvKiBTdGVwIDYgLSBPdXRwdXQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWxwcmVkID4+IDgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbHByZWQpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFscHJlZDw8MTYpOworICAgICAgICB9CiAKLQlydiA9IFB5X0J1aWxkVmFsdWUoIihPKGlpKSkiLCBzdHIsIHZhbHByZWQsIGluZGV4KTsKLQlQeV9ERUNSRUYoc3RyKTsKLQlyZXR1cm4gcnY7CisgICAgICAgIHJ2ID0gUHlfQnVpbGRWYWx1ZSgiKE8oaWkpKSIsIHN0ciwgdmFscHJlZCwgaW5kZXgpOworICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgYXVkaW9vcF9tZXRob2RzW10gPSB7Ci0JeyAibWF4IiwgYXVkaW9vcF9tYXgsIE1FVEhfT0xEQVJHUyB9LAotCXsgIm1pbm1heCIsIGF1ZGlvb3BfbWlubWF4LCBNRVRIX09MREFSR1MgfSwKLQl7ICJhdmciLCBhdWRpb29wX2F2ZywgTUVUSF9PTERBUkdTIH0sCi0JeyAibWF4cHAiLCBhdWRpb29wX21heHBwLCBNRVRIX09MREFSR1MgfSwKLQl7ICJhdmdwcCIsIGF1ZGlvb3BfYXZncHAsIE1FVEhfT0xEQVJHUyB9LAotCXsgInJtcyIsIGF1ZGlvb3Bfcm1zLCBNRVRIX09MREFSR1MgfSwKLQl7ICJmaW5kZml0IiwgYXVkaW9vcF9maW5kZml0LCBNRVRIX09MREFSR1MgfSwKLQl7ICJmaW5kbWF4IiwgYXVkaW9vcF9maW5kbWF4LCBNRVRIX09MREFSR1MgfSwKLQl7ICJmaW5kZmFjdG9yIiwgYXVkaW9vcF9maW5kZmFjdG9yLCBNRVRIX09MREFSR1MgfSwKLQl7ICJjcm9zcyIsIGF1ZGlvb3BfY3Jvc3MsIE1FVEhfT0xEQVJHUyB9LAotCXsgIm11bCIsIGF1ZGlvb3BfbXVsLCBNRVRIX09MREFSR1MgfSwKLQl7ICJhZGQiLCBhdWRpb29wX2FkZCwgTUVUSF9PTERBUkdTIH0sCi0JeyAiYmlhcyIsIGF1ZGlvb3BfYmlhcywgTUVUSF9PTERBUkdTIH0sCi0JeyAidWxhdzJsaW4iLCBhdWRpb29wX3VsYXcybGluLCBNRVRIX09MREFSR1MgfSwKLQl7ICJsaW4ydWxhdyIsIGF1ZGlvb3BfbGluMnVsYXcsIE1FVEhfT0xEQVJHUyB9LAotCXsgImxpbjJsaW4iLCBhdWRpb29wX2xpbjJsaW4sIE1FVEhfT0xEQVJHUyB9LAotCXsgImFkcGNtMmxpbiIsIGF1ZGlvb3BfYWRwY20ybGluLCBNRVRIX09MREFSR1MgfSwKLQl7ICJsaW4yYWRwY20iLCBhdWRpb29wX2xpbjJhZHBjbSwgTUVUSF9PTERBUkdTIH0sCi0JeyAidG9tb25vIiwgYXVkaW9vcF90b21vbm8sIE1FVEhfT0xEQVJHUyB9LAotCXsgInRvc3RlcmVvIiwgYXVkaW9vcF90b3N0ZXJlbywgTUVUSF9PTERBUkdTIH0sCi0JeyAiZ2V0c2FtcGxlIiwgYXVkaW9vcF9nZXRzYW1wbGUsIE1FVEhfT0xEQVJHUyB9LAotCXsgInJldmVyc2UiLCBhdWRpb29wX3JldmVyc2UsIE1FVEhfT0xEQVJHUyB9LAotCXsgInJhdGVjdiIsIGF1ZGlvb3BfcmF0ZWN2LCBNRVRIX1ZBUkFSR1MgfSwKLQl7IDAsICAgICAgICAgIDAgfQorICAgICAgICB7ICJtYXgiLCBhdWRpb29wX21heCwgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgIm1pbm1heCIsIGF1ZGlvb3BfbWlubWF4LCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAiYXZnIiwgYXVkaW9vcF9hdmcsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJtYXhwcCIsIGF1ZGlvb3BfbWF4cHAsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJhdmdwcCIsIGF1ZGlvb3BfYXZncHAsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJybXMiLCBhdWRpb29wX3JtcywgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgImZpbmRmaXQiLCBhdWRpb29wX2ZpbmRmaXQsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJmaW5kbWF4IiwgYXVkaW9vcF9maW5kbWF4LCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAiZmluZGZhY3RvciIsIGF1ZGlvb3BfZmluZGZhY3RvciwgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgImNyb3NzIiwgYXVkaW9vcF9jcm9zcywgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgIm11bCIsIGF1ZGlvb3BfbXVsLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAiYWRkIiwgYXVkaW9vcF9hZGQsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJiaWFzIiwgYXVkaW9vcF9iaWFzLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAidWxhdzJsaW4iLCBhdWRpb29wX3VsYXcybGluLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAibGluMnVsYXciLCBhdWRpb29wX2xpbjJ1bGF3LCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAiYWxhdzJsaW4iLCBhdWRpb29wX2FsYXcybGluLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAibGluMmFsYXciLCBhdWRpb29wX2xpbjJhbGF3LCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAibGluMmxpbiIsIGF1ZGlvb3BfbGluMmxpbiwgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgImFkcGNtMmxpbiIsIGF1ZGlvb3BfYWRwY20ybGluLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAibGluMmFkcGNtIiwgYXVkaW9vcF9saW4yYWRwY20sIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJ0b21vbm8iLCBhdWRpb29wX3RvbW9ubywgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgInRvc3RlcmVvIiwgYXVkaW9vcF90b3N0ZXJlbywgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgImdldHNhbXBsZSIsIGF1ZGlvb3BfZ2V0c2FtcGxlLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAicmV2ZXJzZSIsIGF1ZGlvb3BfcmV2ZXJzZSwgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgInJhdGVjdiIsIGF1ZGlvb3BfcmF0ZWN2LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICAgICAgeyAwLCAgICAgICAgICAwIH0KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0YXVkaW9vcCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQltID0gUHlfSW5pdE1vZHVsZSgiYXVkaW9vcCIsIGF1ZGlvb3BfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUF1ZGlvb3BFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYXVkaW9vcC5lcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmIChBdWRpb29wRXJyb3IgIT0gTlVMTCkKLQkgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsImVycm9yIixBdWRpb29wRXJyb3IpOworICAgICAgICBQeU9iamVjdCAqbSwgKmQ7CisgICAgICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJhdWRpb29wIiwgYXVkaW9vcF9tZXRob2RzKTsKKyAgICAgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgICAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgQXVkaW9vcEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJhdWRpb29wLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmIChBdWRpb29wRXJyb3IgIT0gTlVMTCkKKyAgICAgICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCJlcnJvciIsQXVkaW9vcEVycm9yKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY1BpY2tsZS5jIGIvTW9kdWxlcy9jUGlja2xlLmMKaW5kZXggNzI3ZGNjOS4uMThkZjU5OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jUGlja2xlLmMKKysrIGIvTW9kdWxlcy9jUGlja2xlLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogICAqX19nZXRzdGF0ZV9fX3N0ciwgKl9fc2V0c3RhdGVfX19zdHIsICpfX25hbWVfX19zdHIsICpfX3JlZHVjZV9fX3N0ciwKICAgKl9fcmVkdWNlX2V4X19fc3RyLAogICAqd3JpdGVfc3RyLCAqYXBwZW5kX3N0ciwKLSAgKnJlYWRfc3RyLCAqcmVhZGxpbmVfc3RyLCAqX19tYWluX19fc3RyLCAqX19iYXNpY25ld19fX3N0ciwKKyAgKnJlYWRfc3RyLCAqcmVhZGxpbmVfc3RyLCAqX19tYWluX19fc3RyLCAKICAgKmNvcHlfcmVnX3N0ciwgKmRpc3BhdGNoX3RhYmxlX3N0cjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI5MDksMzggKzI5MDksMjggQEAKIHN0YXRpYyBpbnQKIFBpY2tsZXJfdHJhdmVyc2UoUGlja2xlcm9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaW50IGVycjsKLSNkZWZpbmUgVklTSVQoU0xPVCkgXAotCWlmIChTTE9UKSB7IFwKLQkJZXJyID0gdmlzaXQoKFB5T2JqZWN0ICopKFNMT1QpLCBhcmcpOyBcCi0JCWlmIChlcnIpIFwKLQkJCXJldHVybiBlcnI7IFwKLQl9Ci0JVklTSVQoc2VsZi0+d3JpdGUpOwotCVZJU0lUKHNlbGYtPm1lbW8pOwotCVZJU0lUKHNlbGYtPmZhc3RfbWVtbyk7Ci0JVklTSVQoc2VsZi0+YXJnKTsKLQlWSVNJVChzZWxmLT5maWxlKTsKLQlWSVNJVChzZWxmLT5wZXJzX2Z1bmMpOwotCVZJU0lUKHNlbGYtPmluc3RfcGVyc19mdW5jKTsKLQlWSVNJVChzZWxmLT5kaXNwYXRjaF90YWJsZSk7Ci0jdW5kZWYgVklTSVQKKwlQeV9WSVNJVChzZWxmLT53cml0ZSk7CisJUHlfVklTSVQoc2VsZi0+bWVtbyk7CisJUHlfVklTSVQoc2VsZi0+ZmFzdF9tZW1vKTsKKwlQeV9WSVNJVChzZWxmLT5hcmcpOworCVB5X1ZJU0lUKHNlbGYtPmZpbGUpOworCVB5X1ZJU0lUKHNlbGYtPnBlcnNfZnVuYyk7CisJUHlfVklTSVQoc2VsZi0+aW5zdF9wZXJzX2Z1bmMpOworCVB5X1ZJU0lUKHNlbGYtPmRpc3BhdGNoX3RhYmxlKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogUGlja2xlcl9jbGVhcihQaWNrbGVyb2JqZWN0ICpzZWxmKQogewotI2RlZmluZSBDTEVBUihTTE9UKSBQeV9YREVDUkVGKFNMT1QpOyBTTE9UID0gTlVMTDsKLQlDTEVBUihzZWxmLT53cml0ZSk7Ci0JQ0xFQVIoc2VsZi0+bWVtbyk7Ci0JQ0xFQVIoc2VsZi0+ZmFzdF9tZW1vKTsKLQlDTEVBUihzZWxmLT5hcmcpOwotCUNMRUFSKHNlbGYtPmZpbGUpOwotCUNMRUFSKHNlbGYtPnBlcnNfZnVuYyk7Ci0JQ0xFQVIoc2VsZi0+aW5zdF9wZXJzX2Z1bmMpOwotCUNMRUFSKHNlbGYtPmRpc3BhdGNoX3RhYmxlKTsKLSN1bmRlZiBDTEVBUgorCVB5X0NMRUFSKHNlbGYtPndyaXRlKTsKKwlQeV9DTEVBUihzZWxmLT5tZW1vKTsKKwlQeV9DTEVBUihzZWxmLT5mYXN0X21lbW8pOworCVB5X0NMRUFSKHNlbGYtPmFyZyk7CisJUHlfQ0xFQVIoc2VsZi0+ZmlsZSk7CisJUHlfQ0xFQVIoc2VsZi0+cGVyc19mdW5jKTsKKwlQeV9DTEVBUihzZWxmLT5pbnN0X3BlcnNfZnVuYyk7CisJUHlfQ0xFQVIoc2VsZi0+ZGlzcGF0Y2hfdGFibGUpOwogCXJldHVybiAwOwogfQogCkBAIC01MjYwLDQxICs1MjUwLDMwIEBACiBzdGF0aWMgaW50CiBVbnBpY2tsZXJfdHJhdmVyc2UoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpbnQgZXJyOwotCi0jZGVmaW5lIFZJU0lUKFNMT1QpIFwKLQlpZiAoU0xPVCkgeyBcCi0JCWVyciA9IHZpc2l0KChQeU9iamVjdCAqKShTTE9UKSwgYXJnKTsgXAotCQlpZiAoZXJyKSBcCi0JCQlyZXR1cm4gZXJyOyBcCi0JfQotCVZJU0lUKHNlbGYtPnJlYWRsaW5lKTsKLQlWSVNJVChzZWxmLT5yZWFkKTsKLQlWSVNJVChzZWxmLT5maWxlKTsKLQlWSVNJVChzZWxmLT5tZW1vKTsKLQlWSVNJVChzZWxmLT5zdGFjayk7Ci0JVklTSVQoc2VsZi0+cGVyc19mdW5jKTsKLQlWSVNJVChzZWxmLT5hcmcpOwotCVZJU0lUKHNlbGYtPmxhc3Rfc3RyaW5nKTsKLQlWSVNJVChzZWxmLT5maW5kX2NsYXNzKTsKLSN1bmRlZiBWSVNJVAorCVB5X1ZJU0lUKHNlbGYtPnJlYWRsaW5lKTsKKwlQeV9WSVNJVChzZWxmLT5yZWFkKTsKKwlQeV9WSVNJVChzZWxmLT5maWxlKTsKKwlQeV9WSVNJVChzZWxmLT5tZW1vKTsKKwlQeV9WSVNJVChzZWxmLT5zdGFjayk7CisJUHlfVklTSVQoc2VsZi0+cGVyc19mdW5jKTsKKwlQeV9WSVNJVChzZWxmLT5hcmcpOworCVB5X1ZJU0lUKHNlbGYtPmxhc3Rfc3RyaW5nKTsKKwlQeV9WSVNJVChzZWxmLT5maW5kX2NsYXNzKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogVW5waWNrbGVyX2NsZWFyKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLSNkZWZpbmUgQ0xFQVIoU0xPVCkgUHlfWERFQ1JFRihTTE9UKTsgU0xPVCA9IE5VTEwKLQlDTEVBUihzZWxmLT5yZWFkbGluZSk7Ci0JQ0xFQVIoc2VsZi0+cmVhZCk7Ci0JQ0xFQVIoc2VsZi0+ZmlsZSk7Ci0JQ0xFQVIoc2VsZi0+bWVtbyk7Ci0JQ0xFQVIoc2VsZi0+c3RhY2spOwotCUNMRUFSKHNlbGYtPnBlcnNfZnVuYyk7Ci0JQ0xFQVIoc2VsZi0+YXJnKTsKLQlDTEVBUihzZWxmLT5sYXN0X3N0cmluZyk7Ci0JQ0xFQVIoc2VsZi0+ZmluZF9jbGFzcyk7Ci0jdW5kZWYgQ0xFQVIKKwlQeV9DTEVBUihzZWxmLT5yZWFkbGluZSk7CisJUHlfQ0xFQVIoc2VsZi0+cmVhZCk7CisJUHlfQ0xFQVIoc2VsZi0+ZmlsZSk7CisJUHlfQ0xFQVIoc2VsZi0+bWVtbyk7CisJUHlfQ0xFQVIoc2VsZi0+c3RhY2spOworCVB5X0NMRUFSKHNlbGYtPnBlcnNfZnVuYyk7CisJUHlfQ0xFQVIoc2VsZi0+YXJnKTsKKwlQeV9DTEVBUihzZWxmLT5sYXN0X3N0cmluZyk7CisJUHlfQ0xFQVIoc2VsZi0+ZmluZF9jbGFzcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU2MDIsNyArNTU4MSw2IEBACiAJSU5JVF9TVFIocmVhZGxpbmUpOwogCUlOSVRfU1RSKGNvcHlfcmVnKTsKIAlJTklUX1NUUihkaXNwYXRjaF90YWJsZSk7Ci0JSU5JVF9TVFIoX19iYXNpY25ld19fKTsKIAogCWlmICghKCBjb3B5X3JlZyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiY29weV9yZWciKSkpCiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvY1N0cmluZ0lPLmMgYi9Nb2R1bGVzL2NTdHJpbmdJTy5jCmluZGV4IGJkYzlmMDAuLjRkZWJiNzIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY1N0cmluZ0lPLmMKKysrIGIvTW9kdWxlcy9jU3RyaW5nSU8uYwpAQCAtNTAzLDE3ICs1MDMsMTcgQEAKICAgMCwJICAgICAgIAkJCS8qdHBfaXRlbXNpemUqLwogICAvKiBtZXRob2RzICovCiAgIChkZXN0cnVjdG9yKU9fZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLSAgKHByaW50ZnVuYykwLAkJCS8qdHBfcHJpbnQqLworICAwLAkJCQkvKnRwX3ByaW50Ki8KICAgMCwJCSAJCS8qdHBfZ2V0YXR0ciAqLwogICAwLAkJIAkJLyp0cF9zZXRhdHRyICovCi0gIChjbXBmdW5jKTAsCQkJLyp0cF9jb21wYXJlKi8KLSAgKHJlcHJmdW5jKTAsCQkJLyp0cF9yZXByKi8KKyAgMCwJCQkJLyp0cF9jb21wYXJlKi8KKyAgMCwJCQkJLyp0cF9yZXByKi8KICAgMCwJCQkJLyp0cF9hc19udW1iZXIqLwogICAwLAkJCQkvKnRwX2FzX3NlcXVlbmNlKi8KICAgMCwJCQkJLyp0cF9hc19tYXBwaW5nKi8KLSAgKGhhc2hmdW5jKTAsCQkJLyp0cF9oYXNoKi8KLSAgKHRlcm5hcnlmdW5jKTAsCQkvKnRwX2NhbGwqLwotICAocmVwcmZ1bmMpMCwJCQkvKnRwX3N0ciovCisgIDAsCQkJCS8qdHBfaGFzaCovCisgIDAJLAkJCS8qdHBfY2FsbCovCisgIDAsCQkJCS8qdHBfc3RyKi8KICAgMCwJCQkJLyp0cF9nZXRhdHRybyAqLwogICAwLAkJCQkvKnRwX3NldGF0dHJvICovCiAgIDAsCQkJCS8qdHBfYXNfYnVmZmVyICovCkBAIC02MjQsMTcgKzYyNCwxNyBAQAogICAwLAkJCQkJLyp0cF9pdGVtc2l6ZSovCiAgIC8qIG1ldGhvZHMgKi8KICAgKGRlc3RydWN0b3IpSV9kZWFsbG9jLAkJLyp0cF9kZWFsbG9jKi8KLSAgKHByaW50ZnVuYykwLAkJCQkvKnRwX3ByaW50Ki8KKyAgMCwJCQkJCS8qdHBfcHJpbnQqLwogICAwLAkJIAkJCS8qIHRwX2dldGF0dHIgKi8KLSAgKHNldGF0dHJmdW5jKTAsCQkJLyp0cF9zZXRhdHRyKi8KLSAgKGNtcGZ1bmMpMCwJCQkJLyp0cF9jb21wYXJlKi8KLSAgKHJlcHJmdW5jKTAsCQkJCS8qdHBfcmVwciovCisgIDAsCQkJCQkvKnRwX3NldGF0dHIqLworICAwLAkJCQkJLyp0cF9jb21wYXJlKi8KKyAgMCwJCQkJCS8qdHBfcmVwciovCiAgIDAsCQkJCQkvKnRwX2FzX251bWJlciovCiAgIDAsCQkJCQkvKnRwX2FzX3NlcXVlbmNlKi8KICAgMCwJCQkJCS8qdHBfYXNfbWFwcGluZyovCi0gIChoYXNoZnVuYykwLAkJCQkvKnRwX2hhc2gqLwotICAodGVybmFyeWZ1bmMpMCwJCQkvKnRwX2NhbGwqLwotICAocmVwcmZ1bmMpMCwJCQkJLyp0cF9zdHIqLworICAwLAkJCQkJLyp0cF9oYXNoKi8KKyAgMCwJCQkJCS8qdHBfY2FsbCovCisgIDAsCQkJCQkvKnRwX3N0ciovCiAgIDAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwogICAwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KICAgMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jY3B5dGhvbi5jYyBiL01vZHVsZXMvY2NweXRob24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZTk3ZmYuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9jY3B5dGhvbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qIE1pbmltYWwgbWFpbiBwcm9ncmFtIC0tIGV2ZXJ5dGhpbmcgaXMgbG9hZGVkIGZyb20gdGhlIGxpYnJhcnkgKi8KLQotI2luY2x1ZGUgIlB5dGhvbi5oIgotCi1leHRlcm4gIkMiCi1ETF9FWFBPUlQoaW50KSBQeV9NYWluKCBpbnQgYXJnYywgY2hhciAqYXJndltdICk7Ci0KLWludCBtYWluKCBpbnQgYXJnYywgY2hhciAqYXJndltdICkKLXsKLQlyZXR1cm4gUHlfTWFpbihhcmdjLCBhcmd2KTsKLX0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfY24uYyBiL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfY24uYwppbmRleCBmZDA0OGQ5Li5mYjUxMjk3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2NuLmMKKysrIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19jbi5jCkBAIC0yMTcsMTEgKzIxNyw4IEBACiAJCQkJCWJyZWFrOwogCQkJCX0KIAotCQkJaWYgKHV0cnJhbmdlLT5maXJzdCA9PSAwKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJCSJ1bmljb2RlIG1hcHBpbmcgaW52YWxpZCIpOworCQkJaWYgKHV0cnJhbmdlLT5maXJzdCA9PSAwKQogCQkJCXJldHVybiAxOwotCQkJfQogCQkJY29udGludWU7CiAJCX0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYyBiL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmMKaW5kZXggZjUxYjZmMi4uMzQwZGUxOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYworKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5jCkBAIC02LDYgKzYsNyBAQAogCiAjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KICNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKICNpbmNsdWRlICJtdWx0aWJ5dGVjb2RlYy5oIgogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0zOCwyMiArMzksMTQgQEAKIGFyZSAnaWdub3JlJyBhbmQgJ3JlcGxhY2UnIGFzIHdlbGwgYXMgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJkIHdpdGhcblwKIGNvZGVjcy5yZWdpc3Rlcl9lcnJvciB0aGF0IGlzIGFibGUgdG8gaGFuZGxlIFVuaWNvZGVEZWNvZGVFcnJvcnMuIik7CiAKLVB5RG9jX1NUUlZBUihNdWx0aWJ5dGVDb2RlY19TdHJlYW1SZWFkZXJfX2RvY19fLAotIkkuU3RyZWFtUmVhZGVyKHN0cmVhbVssIGVycm9yc10pIC0+IFN0cmVhbVJlYWRlciBpbnN0YW5jZSIpOwotCi1QeURvY19TVFJWQVIoTXVsdGlieXRlQ29kZWNfU3RyZWFtV3JpdGVyX19kb2NfXywKLSJJLlN0cmVhbVdyaXRlcihzdHJlYW1bLCBlcnJvcnNdKSAtPiBTdHJlYW1Xcml0ZXIgaW5zdGFuY2UiKTsKLQogc3RhdGljIGNoYXIgKmNvZGVja3dhcmdsaXN0W10gPSB7ImlucHV0IiwgImVycm9ycyIsIE5VTEx9Oworc3RhdGljIGNoYXIgKmluY25ld2t3YXJnbGlzdFtdID0geyJlcnJvcnMiLCBOVUxMfTsKK3N0YXRpYyBjaGFyICppbmNyZW1lbnRhbGt3YXJnbGlzdFtdID0geyJpbnB1dCIsICJmaW5hbCIsIE5VTEx9Owogc3RhdGljIGNoYXIgKnN0cmVhbWt3YXJnbGlzdFtdID0geyJzdHJlYW0iLCAiZXJyb3JzIiwgTlVMTH07CiAKIHN0YXRpYyBQeU9iamVjdCAqbXVsdGlieXRlY29kZWNfZW5jb2RlKE11bHRpYnl0ZUNvZGVjICosCiAJCU11bHRpYnl0ZUNvZGVjX1N0YXRlICosIGNvbnN0IFB5X1VOSUNPREUgKiosIFB5X3NzaXplX3QsCiAJCVB5T2JqZWN0ICosIGludCk7Ci1zdGF0aWMgUHlPYmplY3QgKm1ic3RyZWFtcmVhZGVyX2NyZWF0ZShNdWx0aWJ5dGVDb2RlYyAqLAotCQlQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIFB5T2JqZWN0ICptYnN0cmVhbXdyaXRlcl9jcmVhdGUoTXVsdGlieXRlQ29kZWMgKiwKLQkJUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKIAogI2RlZmluZSBNQkVOQ19SRVNFVAlNQkVOQ19NQVg8PDEgLyogcmVzZXQgYWZ0ZXIgYW4gZW5jb2Rpbmcgc2Vzc2lvbiAqLwogCkBAIC04Myw3ICs3Niw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1nZXRfZXJyb3JjYWxsYmFjayhjb25zdCBjaGFyICplcnJvcnMpCitpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhjb25zdCBjaGFyICplcnJvcnMpCiB7CiAJaWYgKGVycm9ycyA9PSBOVUxMIHx8IHN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSA9PSAwKQogCQlyZXR1cm4gRVJST1JfU1RSSUNUOwpAQCAtOTEsMTcgKzg0LDg4IEBACiAJCXJldHVybiBFUlJPUl9JR05PUkU7CiAJZWxzZSBpZiAoc3RyY21wKGVycm9ycywgInJlcGxhY2UiKSA9PSAwKQogCQlyZXR1cm4gRVJST1JfUkVQTEFDRTsKLQllbHNlIHsKLQkJcmV0dXJuIFB5Q29kZWNfTG9va3VwRXJyb3IoZXJyb3JzKTsKLQl9CisJZWxzZQorCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhlcnJvcnMpOwogfQogCitzdGF0aWMgUHlPYmplY3QgKgorY2FsbF9lcnJvcl9jYWxsYmFjayhQeU9iamVjdCAqZXJyb3JzLCBQeU9iamVjdCAqZXhjKQoreworCVB5T2JqZWN0ICphcmdzLCAqY2IsICpyOworCisJYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKGVycm9ycykpOworCWNiID0gUHlDb2RlY19Mb29rdXBFcnJvcihQeVN0cmluZ19BU19TVFJJTkcoZXJyb3JzKSk7CisJaWYgKGNiID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJYXJncyA9IFB5VHVwbGVfTmV3KDEpOworCWlmIChhcmdzID09IE5VTEwpIHsKKwkJUHlfREVDUkVGKGNiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCBleGMpOworCVB5X0lOQ1JFRihleGMpOworCisJciA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2IsIGFyZ3MpOworCVB5X0RFQ1JFRihhcmdzKTsKKwlQeV9ERUNSRUYoY2IpOworCXJldHVybiByOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorY29kZWNjdHhfZXJyb3JzX2dldChNdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjQ29udGV4dCAqc2VsZikKK3sKKwljb25zdCBjaGFyICplcnJvcnM7CisKKwlpZiAoc2VsZi0+ZXJyb3JzID09IEVSUk9SX1NUUklDVCkKKwkJZXJyb3JzID0gInN0cmljdCI7CisJZWxzZSBpZiAoc2VsZi0+ZXJyb3JzID09IEVSUk9SX0lHTk9SRSkKKwkJZXJyb3JzID0gImlnbm9yZSI7CisJZWxzZSBpZiAoc2VsZi0+ZXJyb3JzID09IEVSUk9SX1JFUExBQ0UpCisJCWVycm9ycyA9ICJyZXBsYWNlIjsKKwllbHNlIHsKKwkJUHlfSU5DUkVGKHNlbGYtPmVycm9ycyk7CisJCXJldHVybiBzZWxmLT5lcnJvcnM7CisJfQorCisJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZXJyb3JzKTsKK30KKworc3RhdGljIGludAorY29kZWNjdHhfZXJyb3JzX3NldChNdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjQ29udGV4dCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAorCQkgICAgdm9pZCAqY2xvc3VyZSkKK3sKKwlQeU9iamVjdCAqY2I7CisKKwlpZiAoIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXJyb3JzIG11c3QgYmUgYSBzdHJpbmciKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNiID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKSk7CisJaWYgKGNiID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCUVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOworCXNlbGYtPmVycm9ycyA9IGNiOworCXJldHVybiAwOworfQorCisvKiBUaGlzIGdldHNldCBoYW5kbGVycyBsaXN0IGlzIHVzZWQgYnkgYWxsIHRoZSBzdGF0ZWZ1bCBjb2RlYyBvYmplY3RzICovCitzdGF0aWMgUHlHZXRTZXREZWYgY29kZWNjdHhfZ2V0c2V0c1tdID0geworCXsiZXJyb3JzIiwJKGdldHRlciljb2RlY2N0eF9lcnJvcnNfZ2V0LAorCQkJKHNldHRlciljb2RlY2N0eF9lcnJvcnNfc2V0LAorCQkJUHlEb2NfU1RSKCJob3cgdG8gdHJlYXQgZXJyb3JzIil9LAorCXtOVUxMLH0KK307CisKIHN0YXRpYyBpbnQKIGV4cGFuZF9lbmNvZGVidWZmZXIoTXVsdGlieXRlRW5jb2RlQnVmZmVyICpidWYsIFB5X3NzaXplX3QgZXNpemUpCiB7CiAJUHlfc3NpemVfdCBvcmdwb3MsIG9yZ3NpemU7CiAKLQlvcmdwb3MgPSAoUHlfc3NpemVfdCkoKGNoYXIqKWJ1Zi0+b3V0YnVmIC0KKwlvcmdwb3MgPSAoUHlfc3NpemVfdCkoKGNoYXIgKilidWYtPm91dGJ1ZiAtCiAJCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi0+b3V0b2JqKSk7CiAJb3Jnc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi0+b3V0b2JqKTsKIAlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLT5vdXRvYmosIG9yZ3NpemUgKyAoCkBAIC0xMjUsOCArMTg5LDcgQEAKIHsKIAlQeV9zc2l6ZV90IG9yZ3Bvcywgb3Jnc2l6ZTsKIAotCW9yZ3BvcyA9IChQeV9zc2l6ZV90KShidWYtPm91dGJ1ZiAtCi0JCQkJUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLT5vdXRvYmopKTsKKwlvcmdwb3MgPSAoUHlfc3NpemVfdCkoYnVmLT5vdXRidWYgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYtPm91dG9iaikpOwogCW9yZ3NpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOwogCWlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYtPm91dG9iaiwgb3Jnc2l6ZSArICgKIAkgICAgZXNpemUgPCAob3Jnc2l6ZSA+PiAxKSA/IChvcmdzaXplID4+IDEpIHwgMSA6IGVzaXplKSkgPT0gLTEpCkBAIC0xNDQsMTYgKzIwNywyMSBAQAogCQkJZ290byBlcnJvcmV4aXQ7CQkJCQlcCiB9CiAKKworLyoqCisgKiBNdWx0aWJ5dGVDb2RlYyBvYmplY3QKKyAqLworCiBzdGF0aWMgaW50CiBtdWx0aWJ5dGVjb2RlY19lbmNlcnJvcihNdWx0aWJ5dGVDb2RlYyAqY29kZWMsCiAJCQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCiAJCQlNdWx0aWJ5dGVFbmNvZGVCdWZmZXIgKmJ1ZiwKIAkJCVB5T2JqZWN0ICplcnJvcnMsIFB5X3NzaXplX3QgZSkKIHsKLQlQeU9iamVjdCAqcmV0b2JqID0gTlVMTCwgKnJldHN0ciA9IE5VTEwsICphcmdzb2JqLCAqdG9iajsKKwlQeU9iamVjdCAqcmV0b2JqID0gTlVMTCwgKnJldHN0ciA9IE5VTEwsICp0b2JqOwogCVB5X3NzaXplX3QgcmV0c3Ryc2l6ZSwgbmV3cG9zOwotCWNvbnN0IGNoYXIgKnJlYXNvbjsKIAlQeV9zc2l6ZV90IGVzaXplLCBzdGFydCwgZW5kOworCWNvbnN0IGNoYXIgKnJlYXNvbjsKIAogCWlmIChlID4gMCkgewogCQlyZWFzb24gPSAiaWxsZWdhbCBtdWx0aWJ5dGUgc2VxdWVuY2UiOwpAQCAtMTY2LDcgKzIzNCw3IEBACiAJCQlyZXR1cm4gMDsgLyogcmV0cnkgaXQgKi8KIAkJY2FzZSBNQkVSUl9UT09GRVc6CiAJCQlyZWFzb24gPSAiaW5jb21wbGV0ZSBtdWx0aWJ5dGUgc2VxdWVuY2UiOwotCQkJZXNpemUgPSAoc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOworCQkJZXNpemUgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKIAkJCWJyZWFrOwogCQljYXNlIE1CRVJSX0lOVEVSTkFMOgogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKQEAgLTIzMCwyMSArMjk4LDE1IEBACiAJCWdvdG8gZXJyb3JleGl0OwogCX0KIAotCWFyZ3NvYmogPSBQeVR1cGxlX05ldygxKTsKLQlpZiAoYXJnc29iaiA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQotCVB5VHVwbGVfU0VUX0lURU0oYXJnc29iaiwgMCwgYnVmLT5leGNvYmopOwotCVB5X0lOQ1JFRihidWYtPmV4Y29iaik7Ci0JcmV0b2JqID0gUHlPYmplY3RfQ2FsbE9iamVjdChlcnJvcnMsIGFyZ3NvYmopOwotCVB5X0RFQ1JFRihhcmdzb2JqKTsKKwlyZXRvYmogPSBjYWxsX2Vycm9yX2NhbGxiYWNrKGVycm9ycywgYnVmLT5leGNvYmopOwogCWlmIChyZXRvYmogPT0gTlVMTCkKIAkJZ290byBlcnJvcmV4aXQ7CiAKIAlpZiAoIVB5VHVwbGVfQ2hlY2socmV0b2JqKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJldG9iaikgIT0gMiB8fAogCSAgICAhUHlVbmljb2RlX0NoZWNrKCh0b2JqID0gUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDApKSkgfHwKLQkgICAgIVB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisJICAgICEoUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSB8fAorCSAgICAgIFB5TG9uZ19DaGVjayhQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogCQkJCSJlbmNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuICIKIAkJCQkiKHVuaWNvZGUsIGludCkgdHVwbGUiKTsKIAkJZ290byBlcnJvcmV4aXQ7CkBAIC0yNjcsMTIgKzMyOSwxMyBAQAogCWJ1Zi0+b3V0YnVmICs9IHJldHN0cnNpemU7CiAKIAluZXdwb3MgPSBQeUludF9Bc1NzaXplX3QoUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKTsKLQlpZiAobmV3cG9zIDwgMCkKKwlpZiAobmV3cG9zIDwgMCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKIAkJbmV3cG9zICs9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wKTsKIAlpZiAobmV3cG9zIDwgMCB8fCBidWYtPmluYnVmX3RvcCArIG5ld3BvcyA+IGJ1Zi0+aW5idWZfZW5kKSB7CisJCVB5RXJyX0NsZWFyKCk7CiAJCVB5RXJyX0Zvcm1hdChQeUV4Y19JbmRleEVycm9yLAotCQkJICAgICAicG9zaXRpb24gJWQgZnJvbSBlcnJvciBoYW5kbGVyIG91dCBvZiBib3VuZHMiLAotCQkJICAgICAoaW50KW5ld3Bvcyk7CisJCQkgICAgICJwb3NpdGlvbiAlemQgZnJvbSBlcnJvciBoYW5kbGVyIG91dCBvZiBib3VuZHMiLAorCQkJICAgICBuZXdwb3MpOwogCQlnb3RvIGVycm9yZXhpdDsKIAl9CiAJYnVmLT5pbmJ1ZiA9IGJ1Zi0+aW5idWZfdG9wICsgbmV3cG9zOwpAQCAtMjkzLDcgKzM1Niw3IEBACiAJCQlNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgKmJ1ZiwKIAkJCVB5T2JqZWN0ICplcnJvcnMsIFB5X3NzaXplX3QgZSkKIHsKLQlQeU9iamVjdCAqYXJnc29iaiwgKnJldG9iaiA9IE5VTEwsICpyZXR1bmkgPSBOVUxMOworCVB5T2JqZWN0ICpyZXRvYmogPSBOVUxMLCAqcmV0dW5pID0gTlVMTDsKIAlQeV9zc2l6ZV90IHJldHVuaXNpemUsIG5ld3BvczsKIAljb25zdCBjaGFyICpyZWFzb247CiAJUHlfc3NpemVfdCBlc2l6ZSwgc3RhcnQsIGVuZDsKQEAgLTMwOSw3ICszNzIsNyBAQAogCQkJcmV0dXJuIDA7IC8qIHJldHJ5IGl0ICovCiAJCWNhc2UgTUJFUlJfVE9PRkVXOgogCQkJcmVhc29uID0gImluY29tcGxldGUgbXVsdGlieXRlIHNlcXVlbmNlIjsKLQkJCWVzaXplID0gKHNpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKKwkJCWVzaXplID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zik7CiAJCQlicmVhazsKIAkJY2FzZSBNQkVSUl9JTlRFUk5BTDoKIAkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCkBAIC0zNTQsMjEgKzQxNywxNSBAQAogCQlnb3RvIGVycm9yZXhpdDsKIAl9CiAKLQlhcmdzb2JqID0gUHlUdXBsZV9OZXcoMSk7Ci0JaWYgKGFyZ3NvYmogPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0KLQlQeVR1cGxlX1NFVF9JVEVNKGFyZ3NvYmosIDAsIGJ1Zi0+ZXhjb2JqKTsKLQlQeV9JTkNSRUYoYnVmLT5leGNvYmopOwotCXJldG9iaiA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZXJyb3JzLCBhcmdzb2JqKTsKLQlQeV9ERUNSRUYoYXJnc29iaik7CisJcmV0b2JqID0gY2FsbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMsIGJ1Zi0+ZXhjb2JqKTsKIAlpZiAocmV0b2JqID09IE5VTEwpCiAJCWdvdG8gZXJyb3JleGl0OwogCiAJaWYgKCFQeVR1cGxlX0NoZWNrKHJldG9iaikgfHwgUHlUdXBsZV9HRVRfU0laRShyZXRvYmopICE9IDIgfHwKIAkgICAgIVB5VW5pY29kZV9DaGVjaygocmV0dW5pID0gUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDApKSkgfHwKLQkgICAgIVB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisJICAgICEoUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSB8fAorCSAgICAgIFB5TG9uZ19DaGVjayhQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogCQkJCSJkZWNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuICIKIAkJCQkiKHVuaWNvZGUsIGludCkgdHVwbGUiKTsKIAkJZ290byBlcnJvcmV4aXQ7CkBAIC0zODMsMTIgKzQ0MCwxMyBAQAogCX0KIAogCW5ld3BvcyA9IFB5SW50X0FzU3NpemVfdChQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpOwotCWlmIChuZXdwb3MgPCAwKQorCWlmIChuZXdwb3MgPCAwICYmICFQeUVycl9PY2N1cnJlZCgpKQogCQluZXdwb3MgKz0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zl90b3ApOwogCWlmIChuZXdwb3MgPCAwIHx8IGJ1Zi0+aW5idWZfdG9wICsgbmV3cG9zID4gYnVmLT5pbmJ1Zl9lbmQpIHsKKwkJUHlFcnJfQ2xlYXIoKTsKIAkJUHlFcnJfRm9ybWF0KFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJInBvc2l0aW9uICVkIGZyb20gZXJyb3IgaGFuZGxlciBvdXQgb2YgYm91bmRzIiwKLQkJCQkoaW50KW5ld3Bvcyk7CisJCQkgICAgICJwb3NpdGlvbiAlemQgZnJvbSBlcnJvciBoYW5kbGVyIG91dCBvZiBib3VuZHMiLAorCQkJICAgICBuZXdwb3MpOwogCQlnb3RvIGVycm9yZXhpdDsKIAl9CiAJYnVmLT5pbmJ1ZiA9IGJ1Zi0+aW5idWZfdG9wICsgbmV3cG9zOwpAQCAtNDUzLDcgKzUxMSw3IEBACiAJCQkJZ290byBlcnJvcmV4aXQ7CiAJCX0KIAotCWZpbmFsc2l6ZSA9IChQeV9zc2l6ZV90KSgoY2hhciopYnVmLm91dGJ1ZiAtCisJZmluYWxzaXplID0gKFB5X3NzaXplX3QpKChjaGFyICopYnVmLm91dGJ1ZiAtCiAJCQkJIFB5U3RyaW5nX0FTX1NUUklORyhidWYub3V0b2JqKSk7CiAKIAlpZiAoZmluYWxzaXplICE9IFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi5vdXRvYmopKQpAQCAtNTAwLDcgKzU1OCw3IEBACiAJZGF0YSA9IFB5VW5pY29kZV9BU19VTklDT0RFKGFyZyk7CiAJZGF0YWxlbiA9IFB5VW5pY29kZV9HRVRfU0laRShhcmcpOwogCi0JZXJyb3JjYiA9IGdldF9lcnJvcmNhbGxiYWNrKGVycm9ycyk7CisJZXJyb3JjYiA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CiAJaWYgKGVycm9yY2IgPT0gTlVMTCkgewogCQlQeV9YREVDUkVGKHVjdnQpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTUxNSwxNiArNTczLDEyIEBACiAJaWYgKHIgPT0gTlVMTCkKIAkJZ290byBlcnJvcmV4aXQ7CiAKLQlpZiAoZXJyb3JjYiA+IEVSUk9SX01BWCkgewotCQlQeV9ERUNSRUYoZXJyb3JjYik7Ci0JfQorCUVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKIAlQeV9YREVDUkVGKHVjdnQpOwogCXJldHVybiBtYWtlX3R1cGxlKHIsIGRhdGFsZW4pOwogCiBlcnJvcmV4aXQ6Ci0JaWYgKGVycm9yY2IgPiBFUlJPUl9NQVgpIHsKLQkJUHlfREVDUkVGKGVycm9yY2IpOwotCX0KKwlFUlJPUl9ERUNSRUYoZXJyb3JjYik7CiAJUHlfWERFQ1JFRih1Y3Z0KTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTU0MywxOCArNTk3LDE2IEBACiAJCQkJY29kZWNrd2FyZ2xpc3QsICZkYXRhLCAmZGF0YWxlbiwgJmVycm9ycykpCiAJCXJldHVybiBOVUxMOwogCi0JZXJyb3JjYiA9IGdldF9lcnJvcmNhbGxiYWNrKGVycm9ycyk7CisJZXJyb3JjYiA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CiAJaWYgKGVycm9yY2IgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoZGF0YWxlbiA9PSAwKSB7Ci0JCWlmIChlcnJvcmNiID4gRVJST1JfTUFYKSB7Ci0JCQlQeV9ERUNSRUYoZXJyb3JjYik7Ci0JCX0KKwkJRVJST1JfREVDUkVGKGVycm9yY2IpOwogCQlyZXR1cm4gbWFrZV90dXBsZShQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgMCksIDApOwogCX0KIAotCWJ1Zi5vdXRvYmogPSBidWYuZXhjb2JqID0gTlVMTDsKKwlidWYuZXhjb2JqID0gTlVMTDsKIAlidWYuaW5idWYgPSBidWYuaW5idWZfdG9wID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOwogCWJ1Zi5pbmJ1Zl9lbmQgPSBidWYuaW5idWZfdG9wICsgZGF0YWxlbjsKIAlidWYub3V0b2JqID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIGRhdGFsZW4pOwpAQCAtNTkwLDQ5ICs2NDIsMTcgQEAKIAkJCWdvdG8gZXJyb3JleGl0OwogCiAJUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKLQlpZiAoZXJyb3JjYiA+IEVSUk9SX01BWCkgewotCQlQeV9ERUNSRUYoZXJyb3JjYik7Ci0JfQorCUVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKIAlyZXR1cm4gbWFrZV90dXBsZShidWYub3V0b2JqLCBkYXRhbGVuKTsKIAogZXJyb3JleGl0OgotCWlmIChlcnJvcmNiID4gRVJST1JfTUFYKSB7Ci0JCVB5X0RFQ1JFRihlcnJvcmNiKTsKLQl9CisJRVJST1JfREVDUkVGKGVycm9yY2IpOwogCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7CiAJUHlfWERFQ1JFRihidWYub3V0b2JqKTsKIAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgUHlPYmplY3QgKgotTXVsdGlieXRlQ29kZWNfU3RyZWFtUmVhZGVyKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICpzZWxmLAotCQkJICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQotewotCVB5T2JqZWN0ICpzdHJlYW07Ci0JY2hhciAqZXJyb3JzID0gTlVMTDsKLQotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98czpTdHJlYW1SZWFkZXIiLAotCQkJCXN0cmVhbWt3YXJnbGlzdCwgJnN0cmVhbSwgJmVycm9ycykpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIG1ic3RyZWFtcmVhZGVyX2NyZWF0ZShzZWxmLT5jb2RlYywgc3RyZWFtLCBlcnJvcnMpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotTXVsdGlieXRlQ29kZWNfU3RyZWFtV3JpdGVyKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICpzZWxmLAotCQkJICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQotewotCVB5T2JqZWN0ICpzdHJlYW07Ci0JY2hhciAqZXJyb3JzID0gTlVMTDsKLQotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98czpTdHJlYW1Xcml0ZXIiLAotCQkJCXN0cmVhbWt3YXJnbGlzdCwgJnN0cmVhbSwgJmVycm9ycykpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIG1ic3RyZWFtd3JpdGVyX2NyZWF0ZShzZWxmLT5jb2RlYywgc3RyZWFtLCBlcnJvcnMpOwotfQotCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG11bHRpYnl0ZWNvZGVjX21ldGhvZHNbXSA9IHsKIAl7ImVuY29kZSIsCShQeUNGdW5jdGlvbilNdWx0aWJ5dGVDb2RlY19FbmNvZGUsCiAJCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLApAQCAtNjQwLDEyICs2NjAsNiBAQAogCXsiZGVjb2RlIiwJKFB5Q0Z1bmN0aW9uKU11bHRpYnl0ZUNvZGVjX0RlY29kZSwKIAkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCiAJCQlNdWx0aWJ5dGVDb2RlY19EZWNvZGVfX2RvY19ffSwKLQl7IlN0cmVhbVJlYWRlciIsKFB5Q0Z1bmN0aW9uKU11bHRpYnl0ZUNvZGVjX1N0cmVhbVJlYWRlciwKLQkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JCQlNdWx0aWJ5dGVDb2RlY19TdHJlYW1SZWFkZXJfX2RvY19ffSwKLQl7IlN0cmVhbVdyaXRlciIsKFB5Q0Z1bmN0aW9uKU11bHRpYnl0ZUNvZGVjX1N0cmVhbVdyaXRlciwKLQkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JCQlNdWx0aWJ5dGVDb2RlY19TdHJlYW1Xcml0ZXJfX2RvY19ffSwKIAl7TlVMTCwJCU5VTEx9LAogfTsKIApAQCAtNjU1LDggKzY2OSw2IEBACiAJUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCi0KLQogc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVDb2RlY19UeXBlID0gewogCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQogCTAsCQkJCS8qIG9iX3NpemUgKi8KQEAgLTY5MCwxMyArNzAyLDQ5OCBAQAogCW11bHRpYnl0ZWNvZGVjX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCiB9OwogCisKKy8qKgorICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHN0YXRlZnVsIGNvZGVjIG1lY2hhbmlzbQorICovCisKKyNkZWZpbmUgU1RBVEVGVUxfRENUWChvKQkoKE11bHRpYnl0ZVN0YXRlZnVsRGVjb2RlckNvbnRleHQgKikobykpCisjZGVmaW5lIFNUQVRFRlVMX0VDVFgobykJKChNdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJDb250ZXh0ICopKG8pKQorCitzdGF0aWMgUHlPYmplY3QgKgorZW5jb2Rlcl9lbmNvZGVfc3RhdGVmdWwoTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyQ29udGV4dCAqY3R4LAorCQkJUHlPYmplY3QgKnVuaXN0ciwgaW50IGZpbmFsKQoreworCVB5T2JqZWN0ICp1Y3Z0LCAqciA9IE5VTEw7CisJUHlfVU5JQ09ERSAqaW5idWYsICppbmJ1Zl9lbmQsICppbmJ1Zl90bXAgPSBOVUxMOworCVB5X3NzaXplX3QgZGF0YWxlbiwgb3JpZ3BlbmRpbmc7CisKKwlpZiAoUHlVbmljb2RlX0NoZWNrKHVuaXN0cikpCisJCXVjdnQgPSBOVUxMOworCWVsc2UgeworCQl1bmlzdHIgPSB1Y3Z0ID0gUHlPYmplY3RfVW5pY29kZSh1bmlzdHIpOworCQlpZiAodW5pc3RyID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayh1bmlzdHIpKSB7CisJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorCQkJCSJjb3VsZG4ndCBjb252ZXJ0IHRoZSBvYmplY3QgdG8gdW5pY29kZS4iKTsKKwkJCVB5X0RFQ1JFRih1Y3Z0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJZGF0YWxlbiA9IFB5VW5pY29kZV9HRVRfU0laRSh1bmlzdHIpOworCW9yaWdwZW5kaW5nID0gY3R4LT5wZW5kaW5nc2l6ZTsKKworCWlmIChvcmlncGVuZGluZyA+IDApIHsKKwkJaW5idWZfdG1wID0gUHlNZW1fTmV3KFB5X1VOSUNPREUsIGRhdGFsZW4gKyBjdHgtPnBlbmRpbmdzaXplKTsKKwkJaWYgKGluYnVmX3RtcCA9PSBOVUxMKQorCQkJZ290byBlcnJvcmV4aXQ7CisJCW1lbWNweShpbmJ1Zl90bXAsIGN0eC0+cGVuZGluZywKKwkJCVB5X1VOSUNPREVfU0laRSAqIGN0eC0+cGVuZGluZ3NpemUpOworCQltZW1jcHkoaW5idWZfdG1wICsgY3R4LT5wZW5kaW5nc2l6ZSwKKwkJCVB5VW5pY29kZV9BU19VTklDT0RFKHVuaXN0ciksCisJCQlQeV9VTklDT0RFX1NJWkUgKiBkYXRhbGVuKTsKKwkJZGF0YWxlbiArPSBjdHgtPnBlbmRpbmdzaXplOworCQljdHgtPnBlbmRpbmdzaXplID0gMDsKKwkJaW5idWYgPSBpbmJ1Zl90bXA7CisJfQorCWVsc2UKKwkJaW5idWYgPSAoUHlfVU5JQ09ERSAqKVB5VW5pY29kZV9BU19VTklDT0RFKHVuaXN0cik7CisKKwlpbmJ1Zl9lbmQgPSBpbmJ1ZiArIGRhdGFsZW47CisKKwlyID0gbXVsdGlieXRlY29kZWNfZW5jb2RlKGN0eC0+Y29kZWMsICZjdHgtPnN0YXRlLAorCQkJKGNvbnN0IFB5X1VOSUNPREUgKiopJmluYnVmLAorCQkJZGF0YWxlbiwgY3R4LT5lcnJvcnMsIGZpbmFsID8gTUJFTkNfRkxVU0ggOiAwKTsKKwlpZiAociA9PSBOVUxMKSB7CisJCS8qIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBlbmRpbmcgYnVmZmVyICovCisJCWlmIChvcmlncGVuZGluZyA+IDApCisJCQltZW1jcHkoY3R4LT5wZW5kaW5nLCBpbmJ1Zl90bXAsCisJCQkJUHlfVU5JQ09ERV9TSVpFICogb3JpZ3BlbmRpbmcpOworCQljdHgtPnBlbmRpbmdzaXplID0gb3JpZ3BlbmRpbmc7CisJCWdvdG8gZXJyb3JleGl0OworCX0KKworCWlmIChpbmJ1ZiA8IGluYnVmX2VuZCkgeworCQljdHgtPnBlbmRpbmdzaXplID0gKFB5X3NzaXplX3QpKGluYnVmX2VuZCAtIGluYnVmKTsKKwkJaWYgKGN0eC0+cGVuZGluZ3NpemUgPiBNQVhFTkNQRU5ESU5HKSB7CisJCQkvKiBub3JtYWwgY29kZWNzIGNhbid0IHJlYWNoIGhlcmUgKi8KKwkJCWN0eC0+cGVuZGluZ3NpemUgPSAwOworCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1VuaWNvZGVFcnJvciwKKwkJCQkJInBlbmRpbmcgYnVmZmVyIG92ZXJmbG93Iik7CisJCQlnb3RvIGVycm9yZXhpdDsKKwkJfQorCQltZW1jcHkoY3R4LT5wZW5kaW5nLCBpbmJ1ZiwKKwkJCWN0eC0+cGVuZGluZ3NpemUgKiBQeV9VTklDT0RFX1NJWkUpOworCX0KKworCWlmIChpbmJ1Zl90bXAgIT0gTlVMTCkKKwkJUHlNZW1fRGVsKGluYnVmX3RtcCk7CisJUHlfWERFQ1JFRih1Y3Z0KTsKKwlyZXR1cm4gcjsKKworZXJyb3JleGl0OgorCWlmIChpbmJ1Zl90bXAgIT0gTlVMTCkKKwkJUHlNZW1fRGVsKGluYnVmX3RtcCk7CisJUHlfWERFQ1JFRihyKTsKKwlQeV9YREVDUkVGKHVjdnQpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CitkZWNvZGVyX2FwcGVuZF9wZW5kaW5nKE11bHRpYnl0ZVN0YXRlZnVsRGVjb2RlckNvbnRleHQgKmN0eCwKKwkJICAgICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmKQoreworCVB5X3NzaXplX3QgbnBlbmRpbmdzOworCisJbnBlbmRpbmdzID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zik7CisJaWYgKG5wZW5kaW5ncyArIGN0eC0+cGVuZGluZ3NpemUgPiBNQVhERUNQRU5ESU5HKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Vbmljb2RlRXJyb3IsICJwZW5kaW5nIGJ1ZmZlciBvdmVyZmxvdyIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweShjdHgtPnBlbmRpbmcgKyBjdHgtPnBlbmRpbmdzaXplLCBidWYtPmluYnVmLCBucGVuZGluZ3MpOworCWN0eC0+cGVuZGluZ3NpemUgKz0gbnBlbmRpbmdzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkZWNvZGVyX3ByZXBhcmVfYnVmZmVyKE11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmLCBjb25zdCBjaGFyICpkYXRhLAorCQkgICAgICAgUHlfc3NpemVfdCBzaXplKQoreworCWJ1Zi0+aW5idWYgPSBidWYtPmluYnVmX3RvcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopZGF0YTsKKwlidWYtPmluYnVmX2VuZCA9IGJ1Zi0+aW5idWZfdG9wICsgc2l6ZTsKKwlpZiAoYnVmLT5vdXRvYmogPT0gTlVMTCkgeyAvKiBvbmx5IGlmIG91dG9iaiBpcyBub3QgYWxsb2NhdGVkIHlldCAqLworCQlidWYtPm91dG9iaiA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBzaXplKTsKKwkJaWYgKGJ1Zi0+b3V0b2JqID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCWJ1Zi0+b3V0YnVmID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLT5vdXRvYmopOworCQlidWYtPm91dGJ1Zl9lbmQgPSBidWYtPm91dGJ1ZiArCisJCQkJICBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkZWNvZGVyX2ZlZWRfYnVmZmVyKE11bHRpYnl0ZVN0YXRlZnVsRGVjb2RlckNvbnRleHQgKmN0eCwKKwkJICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmKQoreworCXdoaWxlIChidWYtPmluYnVmIDwgYnVmLT5pbmJ1Zl9lbmQpIHsKKwkJUHlfc3NpemVfdCBpbmxlZnQsIG91dGxlZnQ7CisJCWludCByOworCisJCWlubGVmdCA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOworCQlvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+b3V0YnVmX2VuZCAtIGJ1Zi0+b3V0YnVmKTsKKworCQlyID0gY3R4LT5jb2RlYy0+ZGVjb2RlKCZjdHgtPnN0YXRlLCBjdHgtPmNvZGVjLT5jb25maWcsCisJCQkmYnVmLT5pbmJ1ZiwgaW5sZWZ0LCAmYnVmLT5vdXRidWYsIG91dGxlZnQpOworCQlpZiAociA9PSAwIHx8IHIgPT0gTUJFUlJfVE9PRkVXKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKG11bHRpYnl0ZWNvZGVjX2RlY2Vycm9yKGN0eC0+Y29kZWMsICZjdHgtPnN0YXRlLAorCQkJCQkJIGJ1ZiwgY3R4LT5lcnJvcnMsIHIpKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciBvYmplY3QKKyAqLworCitzdGF0aWMgUHlPYmplY3QgKgorbWJpZW5jb2Rlcl9lbmNvZGUoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmLAorCQkgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworCVB5T2JqZWN0ICpkYXRhOworCWludCBmaW5hbCA9IDA7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfGk6ZW5jb2RlIiwKKwkJCWluY3JlbWVudGFsa3dhcmdsaXN0LCAmZGF0YSwgJmZpbmFsKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZW5jb2Rlcl9lbmNvZGVfc3RhdGVmdWwoU1RBVEVGVUxfRUNUWChzZWxmKSwgZGF0YSwgZmluYWwpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbWJpZW5jb2Rlcl9yZXNldChNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGYpCit7CisJaWYgKHNlbGYtPmNvZGVjLT5kZWNyZXNldCAhPSBOVUxMICYmCisJICAgIHNlbGYtPmNvZGVjLT5kZWNyZXNldCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisJCXJldHVybiBOVUxMOworCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKKworCVB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG1iaWVuY29kZXJfbWV0aG9kc1tdID0geworCXsiZW5jb2RlIiwJKFB5Q0Z1bmN0aW9uKW1iaWVuY29kZXJfZW5jb2RlLAorCQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgTlVMTH0sCisJeyJyZXNldCIsCShQeUNGdW5jdGlvbiltYmllbmNvZGVyX3Jlc2V0LAorCQkJTUVUSF9OT0FSR1MsIE5VTEx9LAorCXtOVUxMLAkJTlVMTH0sCit9OworCitzdGF0aWMgUHlPYmplY3QgKgorbWJpZW5jb2Rlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisJTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmOworCVB5T2JqZWN0ICpjb2RlYyA9IE5VTEw7CisJY2hhciAqZXJyb3JzID0gTlVMTDsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8czpJbmNyZW1lbnRhbEVuY29kZXIiLAorCQkJCQkgaW5jbmV3a3dhcmdsaXN0LCAmZXJyb3JzKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzZWxmID0gKE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlck9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworCWlmIChzZWxmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlnb3RvIGVycm9yZXhpdDsKKwlpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7CisJCWdvdG8gZXJyb3JleGl0OworCX0KKworCXNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7CisJc2VsZi0+cGVuZGluZ3NpemUgPSAwOworCXNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CisJaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQorCQlnb3RvIGVycm9yZXhpdDsKKwlpZiAoc2VsZi0+Y29kZWMtPmVuY2luaXQgIT0gTlVMTCAmJgorCSAgICBzZWxmLT5jb2RlYy0+ZW5jaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisJCWdvdG8gZXJyb3JleGl0OworCisJUHlfREVDUkVGKGNvZGVjKTsKKwlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKworZXJyb3JleGl0OgorCVB5X1hERUNSRUYoc2VsZik7CisJUHlfWERFQ1JFRihjb2RlYyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK21iaWVuY29kZXJfdHJhdmVyc2UoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmLAorCQkgICAgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCit7CisJaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCisJCVB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCittYmllbmNvZGVyX2RlYWxsb2MoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmKQoreworCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisJRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7CisJc2VsZi0+b2JfdHlwZS0+dHBfZnJlZShzZWxmKTsKK30KKworc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJfVHlwZSA9IHsKKwlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKwkwLAkJCQkvKiBvYl9zaXplICovCisJIk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciIsCS8qIHRwX25hbWUgKi8KKwlzaXplb2YoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0KSwgLyogdHBfYmFzaWNzaXplICovCisJMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KKwkvKiAgbWV0aG9kcyAgKi8KKwkoZGVzdHJ1Y3RvciltYmllbmNvZGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KKwkwLAkJCQkvKiB0cF9wcmludCAqLworCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KKwkwLAkJCQkvKiB0cF9zZXRhdHRyICovCisJMCwJCQkJLyogdHBfY29tcGFyZSAqLworCTAsCQkJCS8qIHRwX3JlcHIgKi8KKwkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KKwkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLworCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KKwkwLAkJCQkvKiB0cF9oYXNoICovCisJMCwJCQkJLyogdHBfY2FsbCAqLworCTAsCQkJCS8qIHRwX3N0ciAqLworCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLworCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCisJMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCisJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCisJCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KKwkwLAkJCQkvKiB0cF9kb2MgKi8KKwkodHJhdmVyc2Vwcm9jKW1iaWVuY29kZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCisJMCwJCQkJLyogdHBfY2xlYXIgKi8KKwkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLworCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisJMCwJCQkJLyogdHBfaXRlciAqLworCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KKwltYmllbmNvZGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCisJMCwJCQkJLyogdHBfbWVtYmVycyAqLworCWNvZGVjY3R4X2dldHNldHMsCQkvKiB0cF9nZXRzZXQgKi8KKwkwLAkJCQkvKiB0cF9iYXNlICovCisJMCwJCQkJLyogdHBfZGljdCAqLworCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLworCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLworCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KKwkwLAkJCQkvKiB0cF9pbml0ICovCisJMCwJCQkJLyogdHBfYWxsb2MgKi8KKwltYmllbmNvZGVyX25ldywJCQkvKiB0cF9uZXcgKi8KK307CisKKworLyoqCisgKiBNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIgb2JqZWN0CisgKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK21iaWRlY29kZXJfZGVjb2RlKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZiwKKwkJICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK3sKKwlNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgYnVmOworCWNoYXIgKmRhdGEsICp3ZGF0YTsKKwlQeV9zc2l6ZV90IHdzaXplLCBmaW5hbHNpemUgPSAwLCBzaXplLCBvcmlncGVuZGluZzsKKwlpbnQgZmluYWwgPSAwOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAidCN8aTpkZWNvZGUiLAorCQkJaW5jcmVtZW50YWxrd2FyZ2xpc3QsICZkYXRhLCAmc2l6ZSwgJmZpbmFsKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlidWYub3V0b2JqID0gYnVmLmV4Y29iaiA9IE5VTEw7CisJb3JpZ3BlbmRpbmcgPSBzZWxmLT5wZW5kaW5nc2l6ZTsKKworCWlmIChzZWxmLT5wZW5kaW5nc2l6ZSA9PSAwKSB7CisJCXdzaXplID0gc2l6ZTsKKwkJd2RhdGEgPSBkYXRhOworCX0KKwllbHNlIHsKKwkJd3NpemUgPSBzaXplICsgc2VsZi0+cGVuZGluZ3NpemU7CisJCXdkYXRhID0gUHlNZW1fTWFsbG9jKHdzaXplKTsKKwkJaWYgKHdkYXRhID09IE5VTEwpCisJCQlnb3RvIGVycm9yZXhpdDsKKwkJbWVtY3B5KHdkYXRhLCBzZWxmLT5wZW5kaW5nLCBzZWxmLT5wZW5kaW5nc2l6ZSk7CisJCW1lbWNweSh3ZGF0YSArIHNlbGYtPnBlbmRpbmdzaXplLCBkYXRhLCBzaXplKTsKKwkJc2VsZi0+cGVuZGluZ3NpemUgPSAwOworCX0KKworCWlmIChkZWNvZGVyX3ByZXBhcmVfYnVmZmVyKCZidWYsIHdkYXRhLCB3c2l6ZSkgIT0gMCkKKwkJZ290byBlcnJvcmV4aXQ7CisKKwlpZiAoZGVjb2Rlcl9mZWVkX2J1ZmZlcihTVEFURUZVTF9EQ1RYKHNlbGYpLCAmYnVmKSkKKwkJZ290byBlcnJvcmV4aXQ7CisKKwlpZiAoZmluYWwgJiYgYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgeworCQlpZiAobXVsdGlieXRlY29kZWNfZGVjZXJyb3Ioc2VsZi0+Y29kZWMsICZzZWxmLT5zdGF0ZSwKKwkJCQkmYnVmLCBzZWxmLT5lcnJvcnMsIE1CRVJSX1RPT0ZFVykpIHsKKwkJCS8qIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBlbmRpbmcgYnVmZmVyICovCisJCQltZW1jcHkoc2VsZi0+cGVuZGluZywgd2RhdGEsIG9yaWdwZW5kaW5nKTsKKwkJCXNlbGYtPnBlbmRpbmdzaXplID0gb3JpZ3BlbmRpbmc7CisJCQlnb3RvIGVycm9yZXhpdDsKKwkJfQorCX0KKworCWlmIChidWYuaW5idWYgPCBidWYuaW5idWZfZW5kKSB7IC8qIHBlbmRpbmcgc2VxdWVuY2Ugc3RpbGwgZXhpc3RzICovCisJCWlmIChkZWNvZGVyX2FwcGVuZF9wZW5kaW5nKFNUQVRFRlVMX0RDVFgoc2VsZiksICZidWYpICE9IDApCisJCQlnb3RvIGVycm9yZXhpdDsKKwl9CisKKwlmaW5hbHNpemUgPSAoUHlfc3NpemVfdCkoYnVmLm91dGJ1ZiAtIFB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi5vdXRvYmopKTsKKwlpZiAoZmluYWxzaXplICE9IFB5VW5pY29kZV9HRVRfU0laRShidWYub3V0b2JqKSkKKwkJaWYgKFB5VW5pY29kZV9SZXNpemUoJmJ1Zi5vdXRvYmosIGZpbmFsc2l6ZSkgPT0gLTEpCisJCQlnb3RvIGVycm9yZXhpdDsKKworCWlmICh3ZGF0YSAhPSBkYXRhKQorCQlQeU1lbV9EZWwod2RhdGEpOworCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7CisJcmV0dXJuIGJ1Zi5vdXRvYmo7CisKK2Vycm9yZXhpdDoKKwlpZiAod2RhdGEgIT0gTlVMTCAmJiB3ZGF0YSAhPSBkYXRhKQorCQlQeU1lbV9EZWwod2RhdGEpOworCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7CisJUHlfWERFQ1JFRihidWYub3V0b2JqKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK21iaWRlY29kZXJfcmVzZXQoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0ICpzZWxmKQoreworCWlmIChzZWxmLT5jb2RlYy0+ZGVjcmVzZXQgIT0gTlVMTCAmJgorCSAgICBzZWxmLT5jb2RlYy0+ZGVjcmVzZXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKwlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CisKKwlQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtYmlkZWNvZGVyX21ldGhvZHNbXSA9IHsKKwl7ImRlY29kZSIsCShQeUNGdW5jdGlvbiltYmlkZWNvZGVyX2RlY29kZSwKKwkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIE5VTEx9LAorCXsicmVzZXQiLAkoUHlDRnVuY3Rpb24pbWJpZGVjb2Rlcl9yZXNldCwKKwkJCU1FVEhfTk9BUkdTLCBOVUxMfSwKKwl7TlVMTCwJCU5VTEx9LAorfTsKKworc3RhdGljIFB5T2JqZWN0ICoKK21iaWRlY29kZXJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworCU11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZjsKKwlQeU9iamVjdCAqY29kZWMgPSBOVUxMOworCWNoYXIgKmVycm9ycyA9IE5VTEw7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifHM6SW5jcmVtZW50YWxEZWNvZGVyIiwKKwkJCQkJIGluY25ld2t3YXJnbGlzdCwgJmVycm9ycykpCisJCXJldHVybiBOVUxMOworCisJc2VsZiA9IChNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKwlpZiAoc2VsZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWNvZGVjID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKil0eXBlLCAiY29kZWMiKTsKKwlpZiAoY29kZWMgPT0gTlVMTCkKKwkJZ290byBlcnJvcmV4aXQ7CisJaWYgKCFNdWx0aWJ5dGVDb2RlY19DaGVjayhjb2RlYykpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNvZGVjIGlzIHVuZXhwZWN0ZWQgdHlwZSIpOworCQlnb3RvIGVycm9yZXhpdDsKKwl9CisKKwlzZWxmLT5jb2RlYyA9ICgoTXVsdGlieXRlQ29kZWNPYmplY3QgKiljb2RlYyktPmNvZGVjOworCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKKwlzZWxmLT5lcnJvcnMgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOworCWlmIChzZWxmLT5lcnJvcnMgPT0gTlVMTCkKKwkJZ290byBlcnJvcmV4aXQ7CisJaWYgKHNlbGYtPmNvZGVjLT5kZWNpbml0ICE9IE5VTEwgJiYKKwkgICAgc2VsZi0+Y29kZWMtPmRlY2luaXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorCQlnb3RvIGVycm9yZXhpdDsKKworCVB5X0RFQ1JFRihjb2RlYyk7CisJcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisKK2Vycm9yZXhpdDoKKwlQeV9YREVDUkVGKHNlbGYpOworCVB5X1hERUNSRUYoY29kZWMpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CittYmlkZWNvZGVyX3RyYXZlcnNlKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZiwKKwkJICAgIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQoreworCWlmIChFUlJPUl9JU0NVU1RPTShzZWxmLT5lcnJvcnMpKQorCQlQeV9WSVNJVChzZWxmLT5lcnJvcnMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbWJpZGVjb2Rlcl9kZWFsbG9jKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZikKK3sKKwlQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworCUVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOworCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoc2VsZik7Cit9CisKK3N0YXRpYyBQeVR5cGVPYmplY3QgTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyX1R5cGUgPSB7CisJUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisJMCwJCQkJLyogb2Jfc2l6ZSAqLworCSJNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIiLAkvKiB0cF9uYW1lICovCisJc2l6ZW9mKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCksIC8qIHRwX2Jhc2ljc2l6ZSAqLworCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCisJLyogIG1ldGhvZHMgICovCisJKGRlc3RydWN0b3IpbWJpZGVjb2Rlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCisJMCwJCQkJLyogdHBfcHJpbnQgKi8KKwkwLAkJCQkvKiB0cF9nZXRhdHRyICovCisJMCwJCQkJLyogdHBfc2V0YXR0ciAqLworCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KKwkwLAkJCQkvKiB0cF9yZXByICovCisJMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCisJMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KKwkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCisJMCwJCQkJLyogdHBfaGFzaCAqLworCTAsCQkJCS8qIHRwX2NhbGwgKi8KKwkwLAkJCQkvKiB0cF9zdHIgKi8KKwlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KKwkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLworCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLworCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQworCQl8IFB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCisJMCwJCQkJLyogdHBfZG9jICovCisJKHRyYXZlcnNlcHJvYyltYmlkZWNvZGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLworCTAsCQkJCS8qIHRwX2NsZWFyICovCisJMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KKwkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworCTAsCQkJCS8qIHRwX2l0ZXIgKi8KKwkwLAkJCQkvKiB0cF9pdGVyZXh0ICovCisJbWJpZGVjb2Rlcl9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLworCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KKwljb2RlY2N0eF9nZXRzZXRzLAkJLyogdHBfZ2V0c2V0ICovCisJMCwJCQkJLyogdHBfYmFzZSAqLworCTAsCQkJCS8qIHRwX2RpY3QgKi8KKwkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KKwkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KKwkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCisJMCwJCQkJLyogdHBfaW5pdCAqLworCTAsCQkJCS8qIHRwX2FsbG9jICovCisJbWJpZGVjb2Rlcl9uZXcsCQkJLyogdHBfbmV3ICovCit9OworCisKKy8qKgorICogTXVsdGlieXRlU3RyZWFtUmVhZGVyIG9iamVjdAorICovCisKIHN0YXRpYyBQeU9iamVjdCAqCiBtYnN0cmVhbXJlYWRlcl9pcmVhZChNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QgKnNlbGYsCiAJCSAgICAgY29uc3QgY2hhciAqbWV0aG9kLCBQeV9zc2l6ZV90IHNpemVoaW50KQogewogCU11bHRpYnl0ZURlY29kZUJ1ZmZlciBidWY7CiAJUHlPYmplY3QgKmNyZXM7Ci0JUHlfc3NpemVfdCByc2l6ZSwgciwgZmluYWxzaXplID0gMDsKKwlQeV9zc2l6ZV90IHJzaXplLCBmaW5hbHNpemUgPSAwOwogCiAJaWYgKHNpemVoaW50ID09IDApCiAJCXJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgMCk7CkBAIC03NDAsMzkgKzEyMzcsMTMgQEAKIAkJfQogCiAJCXJzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoY3Jlcyk7Ci0JCWJ1Zi5pbmJ1ZiA9IGJ1Zi5pbmJ1Zl90b3AgPQotCQkJKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoY3Jlcyk7Ci0JCWJ1Zi5pbmJ1Zl9lbmQgPSBidWYuaW5idWZfdG9wICsgcnNpemU7Ci0JCWlmIChidWYub3V0b2JqID09IE5VTEwpIHsKLQkJCWJ1Zi5vdXRvYmogPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgcnNpemUpOwotCQkJaWYgKGJ1Zi5vdXRvYmogPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yZXhpdDsKLQkJCWJ1Zi5vdXRidWYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYub3V0b2JqKTsKLQkJCWJ1Zi5vdXRidWZfZW5kID0gYnVmLm91dGJ1ZiArCi0JCQkJCVB5VW5pY29kZV9HRVRfU0laRShidWYub3V0b2JqKTsKLQkJfQorCQlpZiAoZGVjb2Rlcl9wcmVwYXJlX2J1ZmZlcigmYnVmLCBQeVN0cmluZ19BU19TVFJJTkcoY3JlcyksCisJCQkJCSAgIHJzaXplKSAhPSAwKQorCQkJZ290byBlcnJvcmV4aXQ7CiAKLQkJciA9IDA7Ci0JCWlmIChyc2l6ZSA+IDApCi0JCQl3aGlsZSAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgewotCQkJCVB5X3NzaXplX3QgaW5sZWZ0LCBvdXRsZWZ0OwotCi0JCQkJaW5sZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5pbmJ1Zl9lbmQgLQotCQkJCQkJICAgICAgYnVmLmluYnVmKTsKLQkJCQlvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWZfZW5kIC0KLQkJCQkJCSAgICAgICBidWYub3V0YnVmKTsKLQotCQkJCXIgPSBzZWxmLT5jb2RlYy0+ZGVjb2RlKCZzZWxmLT5zdGF0ZSwKLQkJCQkJCQlzZWxmLT5jb2RlYy0+Y29uZmlnLAotCQkJCQkJCSZidWYuaW5idWYsIGlubGVmdCwKLQkJCQkJCQkmYnVmLm91dGJ1Ziwgb3V0bGVmdCk7Ci0JCQkJaWYgKHIgPT0gMCB8fCByID09IE1CRVJSX1RPT0ZFVykKLQkJCQkJYnJlYWs7Ci0JCQkJZWxzZSBpZiAobXVsdGlieXRlY29kZWNfZGVjZXJyb3Ioc2VsZi0+Y29kZWMsCi0JCQkJCQkmc2VsZi0+c3RhdGUsICZidWYsCi0JCQkJCQlzZWxmLT5lcnJvcnMsIHIpKQotCQkJCQlnb3RvIGVycm9yZXhpdDsKLQkJCX0KKwkJaWYgKHJzaXplID4gMCAmJiBkZWNvZGVyX2ZlZWRfYnVmZmVyKAorCQkJCShNdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJDb250ZXh0ICopc2VsZiwgJmJ1ZikpCisJCQlnb3RvIGVycm9yZXhpdDsKIAogCQlpZiAocnNpemUgPT0gMCB8fCBzaXplaGludCA8IDApIHsgLyogZW5kIG9mIGZpbGUgKi8KIAkJCWlmIChidWYuaW5idWYgPCBidWYuaW5idWZfZW5kICYmCkBAIC03ODIsMjAgKzEyNTMsOSBAQAogCQl9CiAKIAkJaWYgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsgLyogcGVuZGluZyBzZXF1ZW5jZSBleGlzdHMgKi8KLQkJCVB5X3NzaXplX3QgbnBlbmRpbmdzOwotCi0JCQkvKiB3ZSBjYW4ndCBhc3N1bWUgdGhhdCBwZW5kaW5nc2l6ZSBpcyBzdGlsbCAwIGhlcmUuCi0JCQkgKiBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCByZWN1cnNpdmVseQotCQkJICogZnJvbSBlcnJvciBjYWxsYmFjayAqLwotCQkJbnBlbmRpbmdzID0gKFB5X3NzaXplX3QpKGJ1Zi5pbmJ1Zl9lbmQgLSBidWYuaW5idWYpOwotCQkJaWYgKG5wZW5kaW5ncyArIHNlbGYtPnBlbmRpbmdzaXplID4gTUFYREVDUEVORElORykgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJCQkicGVuZGluZyBidWZmZXIgb3ZlcmZsb3ciKTsKKwkJCWlmIChkZWNvZGVyX2FwcGVuZF9wZW5kaW5nKFNUQVRFRlVMX0RDVFgoc2VsZiksCisJCQkJCQkgICAmYnVmKSAhPSAwKQogCQkJCWdvdG8gZXJyb3JleGl0OwotCQkJfQotCQkJbWVtY3B5KHNlbGYtPnBlbmRpbmcgKyBzZWxmLT5wZW5kaW5nc2l6ZSwgYnVmLmluYnVmLAotCQkJCW5wZW5kaW5ncyk7Ci0JCQlzZWxmLT5wZW5kaW5nc2l6ZSArPSBucGVuZGluZ3M7CiAJCX0KIAogCQlmaW5hbHNpemUgPSAoUHlfc3NpemVfdCkoYnVmLm91dGJ1ZiAtCkBAIC05MDEsOCArMTM2MSw3IEBACiAJCXJldHVybiBOVUxMOwogCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKwlQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtYnN0cmVhbXJlYWRlcl9tZXRob2RzW10gPSB7CkBAIC05MTcsMTggKzEzNzYsNzUgQEAKIAl7TlVMTCwJCU5VTEx9LAogfTsKIAorc3RhdGljIFB5TWVtYmVyRGVmIG1ic3RyZWFtcmVhZGVyX21lbWJlcnNbXSA9IHsKKwl7InN0cmVhbSIsCVRfT0JKRUNULAorCQkJb2Zmc2V0b2YoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0LCBzdHJlYW0pLAorCQkJUkVBRE9OTFksIE5VTEx9LAorCXtOVUxMLH0KK307CisKK3N0YXRpYyBQeU9iamVjdCAqCittYnN0cmVhbXJlYWRlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisJTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmOworCVB5T2JqZWN0ICpzdHJlYW0sICpjb2RlYyA9IE5VTEw7CisJY2hhciAqZXJyb3JzID0gTlVMTDsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfHM6U3RyZWFtUmVhZGVyIiwKKwkJCQlzdHJlYW1rd2FyZ2xpc3QsICZzdHJlYW0sICZlcnJvcnMpKQorCQlyZXR1cm4gTlVMTDsKKworCXNlbGYgPSAoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisJaWYgKHNlbGYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwljb2RlYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopdHlwZSwgImNvZGVjIik7CisJaWYgKGNvZGVjID09IE5VTEwpCisJCWdvdG8gZXJyb3JleGl0OworCWlmICghTXVsdGlieXRlQ29kZWNfQ2hlY2soY29kZWMpKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjb2RlYyBpcyB1bmV4cGVjdGVkIHR5cGUiKTsKKwkJZ290byBlcnJvcmV4aXQ7CisJfQorCisJc2VsZi0+Y29kZWMgPSAoKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICopY29kZWMpLT5jb2RlYzsKKwlzZWxmLT5zdHJlYW0gPSBzdHJlYW07CisJUHlfSU5DUkVGKHN0cmVhbSk7CisJc2VsZi0+cGVuZGluZ3NpemUgPSAwOworCXNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CisJaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQorCQlnb3RvIGVycm9yZXhpdDsKKwlpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgorCSAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisJCWdvdG8gZXJyb3JleGl0OworCisJUHlfREVDUkVGKGNvZGVjKTsKKwlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKworZXJyb3JleGl0OgorCVB5X1hERUNSRUYoc2VsZik7CisJUHlfWERFQ1JFRihjb2RlYyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK21ic3RyZWFtcmVhZGVyX3RyYXZlcnNlKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZiwKKwkJCXZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQoreworCWlmIChFUlJPUl9JU0NVU1RPTShzZWxmLT5lcnJvcnMpKQorCQlQeV9WSVNJVChzZWxmLT5lcnJvcnMpOworCVB5X1ZJU0lUKHNlbGYtPnN0cmVhbSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkCiBtYnN0cmVhbXJlYWRlcl9kZWFsbG9jKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+ZXJyb3JzID4gRVJST1JfTUFYKSB7Ci0JCVB5X0RFQ1JFRihzZWxmLT5lcnJvcnMpOwotCX0KKwlQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworCUVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOwogCVB5X0RFQ1JFRihzZWxmLT5zdHJlYW0pOwotCVB5T2JqZWN0X0RlbChzZWxmKTsKKwlzZWxmLT5vYl90eXBlLT50cF9mcmVlKHNlbGYpOwogfQogCi0KLQogc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVTdHJlYW1SZWFkZXJfVHlwZSA9IHsKIAlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKIAkwLAkJCQkvKiBvYl9zaXplICovCkBAIC05NTEsOTcgKzE0NjcsNTAgQEAKIAlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KIAkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwogCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCisJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCisJCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KIAkwLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkvKiB0cF90cmF2ZXJzZSAqLworCSh0cmF2ZXJzZXByb2MpbWJzdHJlYW1yZWFkZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCiAJMCwJCQkJLyogdHBfY2xlYXIgKi8KIAkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwogCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAJMCwJCQkJLyogdHBfaXRlciAqLwogCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KIAltYnN0cmVhbXJlYWRlcl9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLworCW1ic3RyZWFtcmVhZGVyX21lbWJlcnMsCQkvKiB0cF9tZW1iZXJzICovCisJY29kZWNjdHhfZ2V0c2V0cywJCS8qIHRwX2dldHNldCAqLworCTAsCQkJCS8qIHRwX2Jhc2UgKi8KKwkwLAkJCQkvKiB0cF9kaWN0ICovCisJMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCisJMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCisJMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLworCTAsCQkJCS8qIHRwX2luaXQgKi8KKwkwLAkJCQkvKiB0cF9hbGxvYyAqLworCW1ic3RyZWFtcmVhZGVyX25ldywJCS8qIHRwX25ldyAqLwogfTsKIAorCisvKioKKyAqIE11bHRpYnl0ZVN0cmVhbVdyaXRlciBvYmplY3QKKyAqLworCiBzdGF0aWMgaW50CiBtYnN0cmVhbXdyaXRlcl9pd3JpdGUoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmLAogCQkgICAgICBQeU9iamVjdCAqdW5pc3RyKQogewotCVB5T2JqZWN0ICp3ciwgKnVjdnQsICpyID0gTlVMTDsKLQlQeV9VTklDT0RFICppbmJ1ZiwgKmluYnVmX2VuZCwgKmluYnVmX3RtcCA9IE5VTEw7Ci0JUHlfc3NpemVfdCBkYXRhbGVuOworCVB5T2JqZWN0ICpzdHIsICp3cjsKIAotCWlmIChQeVVuaWNvZGVfQ2hlY2sodW5pc3RyKSkKLQkJdWN2dCA9IE5VTEw7Ci0JZWxzZSB7Ci0JCXVuaXN0ciA9IHVjdnQgPSBQeU9iamVjdF9Vbmljb2RlKHVuaXN0cik7Ci0JCWlmICh1bmlzdHIgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayh1bmlzdHIpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjb3VsZG4ndCBjb252ZXJ0IHRoZSBvYmplY3QgdG8gdW5pY29kZS4iKTsKLQkJCVB5X0RFQ1JFRih1Y3Z0KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKwlzdHIgPSBlbmNvZGVyX2VuY29kZV9zdGF0ZWZ1bChTVEFURUZVTF9FQ1RYKHNlbGYpLCB1bmlzdHIsIDApOworCWlmIChzdHIgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOwogCi0JZGF0YWxlbiA9IFB5VW5pY29kZV9HRVRfU0laRSh1bmlzdHIpOwotCWlmIChkYXRhbGVuID09IDApIHsKLQkJUHlfWERFQ1JFRih1Y3Z0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHNlbGYtPnBlbmRpbmdzaXplID4gMCkgewotCQlpbmJ1Zl90bXAgPSBQeU1lbV9OZXcoUHlfVU5JQ09ERSwgZGF0YWxlbiArIHNlbGYtPnBlbmRpbmdzaXplKTsKLQkJaWYgKGluYnVmX3RtcCA9PSBOVUxMKQotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCW1lbWNweShpbmJ1Zl90bXAsIHNlbGYtPnBlbmRpbmcsCi0JCQlQeV9VTklDT0RFX1NJWkUgKiBzZWxmLT5wZW5kaW5nc2l6ZSk7Ci0JCW1lbWNweShpbmJ1Zl90bXAgKyBzZWxmLT5wZW5kaW5nc2l6ZSwKLQkJCVB5VW5pY29kZV9BU19VTklDT0RFKHVuaXN0ciksCi0JCQlQeV9VTklDT0RFX1NJWkUgKiBkYXRhbGVuKTsKLQkJZGF0YWxlbiArPSBzZWxmLT5wZW5kaW5nc2l6ZTsKLQkJc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCQlpbmJ1ZiA9IGluYnVmX3RtcDsKLQl9Ci0JZWxzZQotCQlpbmJ1ZiA9IChQeV9VTklDT0RFICopUHlVbmljb2RlX0FTX1VOSUNPREUodW5pc3RyKTsKLQotCWluYnVmX2VuZCA9IGluYnVmICsgZGF0YWxlbjsKLQotCXIgPSBtdWx0aWJ5dGVjb2RlY19lbmNvZGUoc2VsZi0+Y29kZWMsICZzZWxmLT5zdGF0ZSwKLQkJCShjb25zdCBQeV9VTklDT0RFICoqKSZpbmJ1ZiwgZGF0YWxlbiwgc2VsZi0+ZXJyb3JzLCAwKTsKLQlpZiAociA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQotCWlmIChpbmJ1ZiA8IGluYnVmX2VuZCkgewotCQlzZWxmLT5wZW5kaW5nc2l6ZSA9IChQeV9zc2l6ZV90KShpbmJ1Zl9lbmQgLSBpbmJ1Zik7Ci0JCWlmIChzZWxmLT5wZW5kaW5nc2l6ZSA+IE1BWEVOQ1BFTkRJTkcpIHsKLQkJCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJCSJwZW5kaW5nIGJ1ZmZlciBvdmVyZmxvdyIpOwotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KLQkJbWVtY3B5KHNlbGYtPnBlbmRpbmcsIGluYnVmLAotCQkJc2VsZi0+cGVuZGluZ3NpemUgKiBQeV9VTklDT0RFX1NJWkUpOwotCX0KLQotCXdyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5zdHJlYW0sICJ3cml0ZSIsICJPIiwgcik7CisJd3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPnN0cmVhbSwgIndyaXRlIiwgIk8iLCBzdHIpOworCVB5X0RFQ1JFRihzdHIpOwogCWlmICh3ciA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKKwkJcmV0dXJuIC0xOwogCi0JaWYgKGluYnVmX3RtcCAhPSBOVUxMKQotCQlQeU1lbV9EZWwoaW5idWZfdG1wKTsKLQlQeV9ERUNSRUYocik7CiAJUHlfREVDUkVGKHdyKTsKLQlQeV9YREVDUkVGKHVjdnQpOwogCXJldHVybiAwOwotCi1lcnJvcmV4aXQ6Ci0JaWYgKGluYnVmX3RtcCAhPSBOVUxMKQotCQlQeU1lbV9EZWwoaW5idWZfdG1wKTsKLQlQeV9YREVDUkVGKHIpOwotCVB5X1hERUNSRUYodWN2dCk7Ci0JcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTA1NCwxMCArMTUyMyw4IEBACiAKIAlpZiAobWJzdHJlYW13cml0ZXJfaXdyaXRlKHNlbGYsIHN0cm9iaikpCiAJCXJldHVybiBOVUxMOwotCWVsc2UgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKwllbHNlCisJCVB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTA4Nyw4ICsxNTU0LDcgQEAKIAkJCXJldHVybiBOVUxMOwogCX0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKwlQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTExMTksMTggKzE1ODUsNjkgQEAKIAl9CiAJUHlfREVDUkVGKHB3cnQpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworCVB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbWJzdHJlYW13cml0ZXJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworCU11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqc2VsZjsKKwlQeU9iamVjdCAqc3RyZWFtLCAqY29kZWMgPSBOVUxMOworCWNoYXIgKmVycm9ycyA9IE5VTEw7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xzOlN0cmVhbVdyaXRlciIsCisJCQkJc3RyZWFta3dhcmdsaXN0LCAmc3RyZWFtLCAmZXJyb3JzKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzZWxmID0gKE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworCWlmIChzZWxmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlnb3RvIGVycm9yZXhpdDsKKwlpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7CisJCWdvdG8gZXJyb3JleGl0OworCX0KKworCXNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7CisJc2VsZi0+c3RyZWFtID0gc3RyZWFtOworCVB5X0lOQ1JFRihzdHJlYW0pOworCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKKwlzZWxmLT5lcnJvcnMgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOworCWlmIChzZWxmLT5lcnJvcnMgPT0gTlVMTCkKKwkJZ290byBlcnJvcmV4aXQ7CisJaWYgKHNlbGYtPmNvZGVjLT5lbmNpbml0ICE9IE5VTEwgJiYKKwkgICAgc2VsZi0+Y29kZWMtPmVuY2luaXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorCQlnb3RvIGVycm9yZXhpdDsKKworCVB5X0RFQ1JFRihjb2RlYyk7CisJcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisKK2Vycm9yZXhpdDoKKwlQeV9YREVDUkVGKHNlbGYpOworCVB5X1hERUNSRUYoY29kZWMpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CittYnN0cmVhbXdyaXRlcl90cmF2ZXJzZShNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKnNlbGYsCisJCQl2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKK3sKKwlpZiAoRVJST1JfSVNDVVNUT00oc2VsZi0+ZXJyb3JzKSkKKwkJUHlfVklTSVQoc2VsZi0+ZXJyb3JzKTsKKwlQeV9WSVNJVChzZWxmLT5zdHJlYW0pOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogbWJzdHJlYW13cml0ZXJfZGVhbGxvYyhNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmVycm9ycyA+IEVSUk9SX01BWCkgewotCQlQeV9ERUNSRUYoc2VsZi0+ZXJyb3JzKTsKLQl9CisJUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKKwlFUlJPUl9ERUNSRUYoc2VsZi0+ZXJyb3JzKTsKIAlQeV9ERUNSRUYoc2VsZi0+c3RyZWFtKTsKLQlQeU9iamVjdF9EZWwoc2VsZik7CisJc2VsZi0+b2JfdHlwZS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtYnN0cmVhbXdyaXRlcl9tZXRob2RzW10gPSB7CkBAIC0xMTQzLDcgKzE2NjAsMTIgQEAKIAl7TlVMTCwJCU5VTEx9LAogfTsKIAotCitzdGF0aWMgUHlNZW1iZXJEZWYgbWJzdHJlYW13cml0ZXJfbWVtYmVyc1tdID0geworCXsic3RyZWFtIiwJVF9PQkpFQ1QsCisJCQlvZmZzZXRvZihNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QsIHN0cmVhbSksCisJCQlSRUFET05MWSwgTlVMTH0sCisJe05VTEwsfQorfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJfVHlwZSA9IHsKIAlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKQEAgLTExNjcsMTcgKzE2ODksMzMgQEAKIAlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KIAkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwogCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCisJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCisJCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KIAkwLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkvKiB0cF90cmF2ZXJzZSAqLworCSh0cmF2ZXJzZXByb2MpbWJzdHJlYW13cml0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCiAJMCwJCQkJLyogdHBfY2xlYXIgKi8KIAkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwogCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAJMCwJCQkJLyogdHBfaXRlciAqLwogCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KIAltYnN0cmVhbXdyaXRlcl9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLworCW1ic3RyZWFtd3JpdGVyX21lbWJlcnMsCQkvKiB0cF9tZW1iZXJzICovCisJY29kZWNjdHhfZ2V0c2V0cywJCS8qIHRwX2dldHNldCAqLworCTAsCQkJCS8qIHRwX2Jhc2UgKi8KKwkwLAkJCQkvKiB0cF9kaWN0ICovCisJMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCisJMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCisJMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLworCTAsCQkJCS8qIHRwX2luaXQgKi8KKwkwLAkJCQkvKiB0cF9hbGxvYyAqLworCW1ic3RyZWFtd3JpdGVyX25ldywJCS8qIHRwX25ldyAqLwogfTsKIAorCisvKioKKyAqIEV4cG9zZWQgZmFjdG9yeSBmdW5jdGlvbgorICovCisKIHN0YXRpYyBQeU9iamVjdCAqCiBfX2NyZWF0ZV9jb2RlYyhQeU9iamVjdCAqaWdub3JlLCBQeU9iamVjdCAqYXJnKQogewpAQCAtMTIwMSw4MCArMTczOSwzOCBAQAogCXJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCi1zdGF0aWMgUHlPYmplY3QgKgotbWJzdHJlYW1yZWFkZXJfY3JlYXRlKE11bHRpYnl0ZUNvZGVjICpjb2RlYywKLQkJICAgICAgUHlPYmplY3QgKnN0cmVhbSwgY29uc3QgY2hhciAqZXJyb3JzKQotewotCU11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZjsKLQotCXNlbGYgPSBQeU9iamVjdF9OZXcoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0LAotCQkJJk11bHRpYnl0ZVN0cmVhbVJlYWRlcl9UeXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXNlbGYtPmNvZGVjID0gY29kZWM7Ci0Jc2VsZi0+c3RyZWFtID0gc3RyZWFtOwotCVB5X0lOQ1JFRihzdHJlYW0pOwotCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKLQlzZWxmLT5lcnJvcnMgPSBnZXRfZXJyb3JjYWxsYmFjayhlcnJvcnMpOwotCWlmIChzZWxmLT5lcnJvcnMgPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JaWYgKHNlbGYtPmNvZGVjLT5kZWNpbml0ICE9IE5VTEwgJiYKLQkgICAgc2VsZi0+Y29kZWMtPmRlY2luaXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQotCQlnb3RvIGVycm9yZXhpdDsKLQotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOwotCi1lcnJvcmV4aXQ6Ci0JUHlfWERFQ1JFRihzZWxmKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLW1ic3RyZWFtd3JpdGVyX2NyZWF0ZShNdWx0aWJ5dGVDb2RlYyAqY29kZWMsCi0JCSAgICAgIFB5T2JqZWN0ICpzdHJlYW0sIGNvbnN0IGNoYXIgKmVycm9ycykKLXsKLQlNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKnNlbGY7Ci0KLQlzZWxmID0gUHlPYmplY3RfTmV3KE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCwKLQkJCSZNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJfVHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzZWxmLT5jb2RlYyA9IGNvZGVjOwotCXNlbGYtPnN0cmVhbSA9IHN0cmVhbTsKLQlQeV9JTkNSRUYoc3RyZWFtKTsKLQlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7Ci0Jc2VsZi0+ZXJyb3JzID0gZ2V0X2Vycm9yY2FsbGJhY2soZXJyb3JzKTsKLQlpZiAoc2VsZi0+ZXJyb3JzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OwotCWlmIChzZWxmLT5jb2RlYy0+ZW5jaW5pdCAhPSBOVUxMICYmCi0JICAgIHNlbGYtPmNvZGVjLT5lbmNpbml0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0KLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKLQotZXJyb3JleGl0OgotCVB5X1hERUNSRUYoc2VsZik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgX19tZXRob2RzW10gPSB7CiAJeyJfX2NyZWF0ZV9jb2RlYyIsIChQeUNGdW5jdGlvbilfX2NyZWF0ZV9jb2RlYywgTUVUSF9PfSwKIAl7TlVMTCwgTlVMTH0sCiB9OwogCi12b2lkCitQeU1PRElOSVRfRlVOQwogaW5pdF9tdWx0aWJ5dGVjb2RlYyh2b2lkKQogeworCWludCBpOworCVB5T2JqZWN0ICptOworCVB5VHlwZU9iamVjdCAqdHlwZWxpc3RbXSA9IHsKKwkJJk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlcl9UeXBlLAorCQkmTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyX1R5cGUsCisJCSZNdWx0aWJ5dGVTdHJlYW1SZWFkZXJfVHlwZSwKKwkJJk11bHRpYnl0ZVN0cmVhbVdyaXRlcl9UeXBlLAorCQlOVUxMCisJfTsKKwogCWlmIChQeVR5cGVfUmVhZHkoJk11bHRpYnl0ZUNvZGVjX1R5cGUpIDwgMCkKIAkJcmV0dXJuOwotCWlmIChQeVR5cGVfUmVhZHkoJk11bHRpYnl0ZVN0cmVhbVJlYWRlcl9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlpZiAoUHlUeXBlX1JlYWR5KCZNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJfVHlwZSkgPCAwKQorCisJbSA9IFB5X0luaXRNb2R1bGUoIl9tdWx0aWJ5dGVjb2RlYyIsIF9fbWV0aG9kcyk7CisJaWYgKG0gPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JUHlfSW5pdE1vZHVsZSgiX211bHRpYnl0ZWNvZGVjIiwgX19tZXRob2RzKTsKKwlmb3IgKGkgPSAwOyB0eXBlbGlzdFtpXSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKFB5VHlwZV9SZWFkeSh0eXBlbGlzdFtpXSkgPCAwKQorCQkJcmV0dXJuOworCQlQeV9JTkNSRUYodHlwZWxpc3RbaV0pOworCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgdHlwZWxpc3RbaV0tPnRwX25hbWUsCisJCQkJICAgKFB5T2JqZWN0ICopdHlwZWxpc3RbaV0pOworCX0KIAogCWlmIChQeUVycl9PY2N1cnJlZCgpKQogCQlQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIHRoZSBfbXVsdGlieXRlY29kZWMgbW9kdWxlIik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5oIGIvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuaAppbmRleCBlYzQ5Yzc4Li4yMmVhNWQ0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5oCisrKyBiL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmgKQEAgLTY3LDI0ICs2Nyw1MSBAQAogCU11bHRpYnl0ZUNvZGVjICpjb2RlYzsKIH0gTXVsdGlieXRlQ29kZWNPYmplY3Q7CiAKLSNkZWZpbmUgTUFYREVDUEVORElORwk4CisjZGVmaW5lIE11bHRpYnl0ZUNvZGVjX0NoZWNrKG9wKSAoKG9wKS0+b2JfdHlwZSA9PSAmTXVsdGlieXRlQ29kZWNfVHlwZSkKKworI2RlZmluZSBfTXVsdGlieXRlU3RhdGVmdWxDb2RlY19IRUFECQlcCisJUHlPYmplY3RfSEVBRAkJCQlcCisJTXVsdGlieXRlQ29kZWMgKmNvZGVjOwkJCVwKKwlNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsJCVwKKwlQeU9iamVjdCAqZXJyb3JzOwogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlNdWx0aWJ5dGVDb2RlYyAqY29kZWM7Ci0JTXVsdGlieXRlQ29kZWNfU3RhdGUgc3RhdGU7Ci0JdW5zaWduZWQgY2hhciBwZW5kaW5nW01BWERFQ1BFTkRJTkddOwotCVB5X3NzaXplX3QgcGVuZGluZ3NpemU7Ci0JUHlPYmplY3QgKnN0cmVhbSwgKmVycm9yczsKLX0gTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0OworCV9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQKK30gTXVsdGlieXRlU3RhdGVmdWxDb2RlY0NvbnRleHQ7CiAKICNkZWZpbmUgTUFYRU5DUEVORElORwkyCi10eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCU11bHRpYnl0ZUNvZGVjICpjb2RlYzsKLQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsKLQlQeV9VTklDT0RFIHBlbmRpbmdbTUFYRU5DUEVORElOR107CisjZGVmaW5lIF9NdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJfSEVBRAkJXAorCV9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQJCVwKKwlQeV9VTklDT0RFIHBlbmRpbmdbTUFYRU5DUEVORElOR107CVwKIAlQeV9zc2l6ZV90IHBlbmRpbmdzaXplOwotCVB5T2JqZWN0ICpzdHJlYW0sICplcnJvcnM7Cit0eXBlZGVmIHN0cnVjdCB7CisJX011bHRpYnl0ZVN0YXRlZnVsRW5jb2Rlcl9IRUFECit9IE11bHRpYnl0ZVN0YXRlZnVsRW5jb2RlckNvbnRleHQ7CisKKyNkZWZpbmUgTUFYREVDUEVORElORwk4CisjZGVmaW5lIF9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAkJXAorCV9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQJCVwKKwl1bnNpZ25lZCBjaGFyIHBlbmRpbmdbTUFYREVDUEVORElOR107CVwKKwlQeV9zc2l6ZV90IHBlbmRpbmdzaXplOwordHlwZWRlZiBzdHJ1Y3QgeworCV9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAorfSBNdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCB7CisJX011bHRpYnl0ZVN0YXRlZnVsRW5jb2Rlcl9IRUFECit9IE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlck9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAorfSBNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyX0hFQUQKKwlQeU9iamVjdCAqc3RyZWFtOworfSBNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyX0hFQUQKKwlQeU9iamVjdCAqc3RyZWFtOwogfSBNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3Q7CiAKIC8qIHBvc2l0aXZlIHZhbHVlcyBmb3IgaWxsZWdhbCBzZXF1ZW5jZXMgKi8KQEAgLTk1LDcgKzEyMiwxMiBAQAogI2RlZmluZSBFUlJPUl9TVFJJQ1QJCShQeU9iamVjdCAqKSgxKQogI2RlZmluZSBFUlJPUl9JR05PUkUJCShQeU9iamVjdCAqKSgyKQogI2RlZmluZSBFUlJPUl9SRVBMQUNFCQkoUHlPYmplY3QgKikoMykKLSNkZWZpbmUgRVJST1JfTUFYCQlFUlJPUl9SRVBMQUNFCisjZGVmaW5lIEVSUk9SX0lTQ1VTVE9NKHApCSgocCkgPCBFUlJPUl9TVFJJQ1QgfHwgRVJST1JfUkVQTEFDRSA8IChwKSkKKyNkZWZpbmUgRVJST1JfREVDUkVGKHApIGRvIHsJCQlcCisJaWYgKHAgIT0gTlVMTCAmJiBFUlJPUl9JU0NVU1RPTShwKSkgewlcCisJCVB5X0RFQ1JFRihwKTsJCQlcCisJfQkJCQkJXAorfSB3aGlsZSAoMCk7CiAKICNkZWZpbmUgTUJFTkNfRkxVU0gJCTB4MDAwMSAvKiBlbmNvZGUgYWxsIGNoYXJhY3RlcnMgZW5jb2RhYmxlICovCiAjZGVmaW5lIE1CRU5DX01BWAkJTUJFTkNfRkxVU0gKZGlmZiAtLWdpdCBhL01vZHVsZXMvY29sbGVjdGlvbnNtb2R1bGUuYyBiL01vZHVsZXMvY29sbGVjdGlvbnNtb2R1bGUuYwppbmRleCBiODBhYjA3Li5jN2UyYzg1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NvbGxlY3Rpb25zbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9jb2xsZWN0aW9uc21vZHVsZS5jCkBAIC04MzIsMTEgKzgzMiwxMSBAQAogCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCiAJLyogbWV0aG9kcyAqLwogCShkZXN0cnVjdG9yKWRlcXVlX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKWRlcXVlX3RwX3ByaW50LAkvKiB0cF9wcmludCAqLworCWRlcXVlX3RwX3ByaW50LAkJCS8qIHRwX3ByaW50ICovCiAJMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwogCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KIAkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWRlcXVlX3JlcHIsCQkvKiB0cF9yZXByICovCisJZGVxdWVfcmVwciwJCQkvKiB0cF9yZXByICovCiAJMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCiAJJmRlcXVlX2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KIAkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCkBAIC0xMjM2LDEwICsxMjM2LDcgQEAKIHN0YXRpYyBpbnQKIGRlZmRpY3RfdHBfY2xlYXIoZGVmZGljdG9iamVjdCAqZGQpCiB7Ci0JaWYgKGRkLT5kZWZhdWx0X2ZhY3RvcnkgIT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZGQtPmRlZmF1bHRfZmFjdG9yeSk7Ci0JCWRkLT5kZWZhdWx0X2ZhY3RvcnkgPSBOVUxMOwotCX0KKwlQeV9DTEVBUihkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKIAlyZXR1cm4gUHlEaWN0X1R5cGUudHBfY2xlYXIoKFB5T2JqZWN0ICopZGQpOwogfQogCkBAIC0xMjc3LDggKzEyNzQsMTEgQEAKIEEgZGVmYXVsdGRpY3QgY29tcGFyZXMgZXF1YWwgdG8gYSBkaWN0IHdpdGggdGhlIHNhbWUgaXRlbXMuXG5cCiAiKTsKIAorLyogU2VlIGNvbW1lbnQgaW4geHhzdWJ0eXBlLmMgKi8KKyNkZWZpbmUgREVGRVJSRURfQUREUkVTUyhBRERSKSAwCisKIHN0YXRpYyBQeVR5cGVPYmplY3QgZGVmZGljdF90eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorCVB5T2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSkpCiAJMCwJCQkJLyogb2Jfc2l6ZSAqLwogCSJjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdCIsCS8qIHRwX25hbWUgKi8KIAlzaXplb2YoZGVmZGljdG9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KQEAgLTEzMDIsNyArMTMwMiw3IEBACiAJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CiAJCVB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywJLyogdHBfZmxhZ3MgKi8KIAlkZWZkaWN0X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWRlZmRpY3RfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCisJZGVmZGljdF90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCiAJKGlucXVpcnkpZGVmZGljdF90cF9jbGVhciwJLyogdHBfY2xlYXIgKi8KIAkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwogCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0Ki8KQEAgLTEzMTEsMTIgKzEzMTEsMTIgQEAKIAlkZWZkaWN0X21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCiAJZGVmZGljdF9tZW1iZXJzLAkJLyogdHBfbWVtYmVycyAqLwogCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCSZQeURpY3RfVHlwZSwJCQkvKiB0cF9iYXNlICovCisJREVGRVJSRURfQUREUkVTUygmUHlEaWN0X1R5cGUpLAkvKiB0cF9iYXNlICovCiAJMCwJCQkJLyogdHBfZGljdCAqLwogCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwogCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwogCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpZGVmZGljdF9pbml0LAkJLyogdHBfaW5pdCAqLworCWRlZmRpY3RfaW5pdCwJCQkvKiB0cF9pbml0ICovCiAJUHlUeXBlX0dlbmVyaWNBbGxvYywJCS8qIHRwX2FsbG9jICovCiAJMCwJCQkJLyogdHBfbmV3ICovCiAJUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLwpAQCAtMTM0NCw2ICsxMzQ0LDcgQEAKIAlQeV9JTkNSRUYoJmRlcXVlX3R5cGUpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGVxdWUiLCAoUHlPYmplY3QgKikmZGVxdWVfdHlwZSk7CiAKKwlkZWZkaWN0X3R5cGUudHBfYmFzZSA9ICZQeURpY3RfVHlwZTsKIAlpZiAoUHlUeXBlX1JlYWR5KCZkZWZkaWN0X3R5cGUpIDwgMCkKIAkJcmV0dXJuOwogCVB5X0lOQ1JFRigmZGVmZGljdF90eXBlKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvY29uZmlnLmMuaW4gYi9Nb2R1bGVzL2NvbmZpZy5jLmluCmluZGV4IDllYzI4MWMuLmY4MTE5OTEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY29uZmlnLmMuaW4KKysrIGIvTW9kdWxlcy9jb25maWcuYy5pbgpAQCAtMTcsNiArMTcsMTAgQEAKIAogI2luY2x1ZGUgIlB5dGhvbi5oIgogCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKIAogLyogLS0gQURETU9EVUxFIE1BUktFUiAxIC0tICovCiAKQEAgLTUwLDMgKzU0LDkgQEAKIAkvKiBTZW50aW5lbCAqLwogCXswLCAwfQogfTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2RhdGV0aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL2RhdGV0aW1lbW9kdWxlLmMKaW5kZXggYzFhMGNiMy4uOWFlMjM1YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9kYXRldGltZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvZGF0ZXRpbWVtb2R1bGUuYwpAQCAtMTIyOCw4ICsxMjI4LDggQEAKIAkJCQl9CiAJCQl9CiAJCQlhc3NlcnQoenJlcGxhY2VtZW50ICE9IE5VTEwpOwotCQkJcHRvYXBwZW5kID0gUHlTdHJpbmdfQXNTdHJpbmcoenJlcGxhY2VtZW50KTsKLQkJCW50b2FwcGVuZCA9IFB5U3RyaW5nX1NpemUoenJlcGxhY2VtZW50KTsKKwkJCXB0b2FwcGVuZCA9IFB5U3RyaW5nX0FTX1NUUklORyh6cmVwbGFjZW1lbnQpOworCQkJbnRvYXBwZW5kID0gUHlTdHJpbmdfR0VUX1NJWkUoenJlcGxhY2VtZW50KTsKIAkJfQogCQllbHNlIGlmIChjaCA9PSAnWicpIHsKIAkJCS8qIGZvcm1hdCB0em5hbWUgKi8KQEAgLTEyNTcsMTQgKzEyNTcsMTggQEAKIAkJCQkJCVB5X0RFQ1JFRih0ZW1wKTsKIAkJCQkJCWlmIChacmVwbGFjZW1lbnQgPT0gTlVMTCkKIAkJCQkJCQlnb3RvIERvbmU7CisJCQkJCQlpZiAoIVB5U3RyaW5nX0NoZWNrKFpyZXBsYWNlbWVudCkpIHsKKwkJCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidHpuYW1lLnJlcGxhY2UoKSBkaWQgbm90IHJldHVybiBhIHN0cmluZyIpOworCQkJCQkJCWdvdG8gRG9uZTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCQllbHNlCiAJCQkJCQlQeV9ERUNSRUYodGVtcCk7CiAJCQkJfQogCQkJfQogCQkJYXNzZXJ0KFpyZXBsYWNlbWVudCAhPSBOVUxMKTsKLQkJCXB0b2FwcGVuZCA9IFB5U3RyaW5nX0FzU3RyaW5nKFpyZXBsYWNlbWVudCk7Ci0JCQludG9hcHBlbmQgPSBQeVN0cmluZ19TaXplKFpyZXBsYWNlbWVudCk7CisJCQlwdG9hcHBlbmQgPSBQeVN0cmluZ19BU19TVFJJTkcoWnJlcGxhY2VtZW50KTsKKwkJCW50b2FwcGVuZCA9IFB5U3RyaW5nX0dFVF9TSVpFKFpyZXBsYWNlbWVudCk7CiAJCX0KIAkJZWxzZSB7CiAJCQkvKiBwZXJjZW50IGZvbGxvd2VkIGJ5IG5laXRoZXIgeiBub3IgWiAqLwpAQCAtMTI3NSw2ICsxMjc5LDcgQEAKICAJCS8qIEFwcGVuZCB0aGUgbnRvYXBwZW5kIGNoYXJzIHN0YXJ0aW5nIGF0IHB0b2FwcGVuZCB0bwogIAkJICogdGhlIG5ldyBmb3JtYXQuCiAgCQkgKi8KKyAJCWFzc2VydChwdG9hcHBlbmQgIT0gTlVMTCk7CiAgCQlhc3NlcnQobnRvYXBwZW5kID49IDApOwogIAkJaWYgKG50b2FwcGVuZCA9PSAwKQogIAkJCWNvbnRpbnVlOwpAQCAtMjQwNCwxMSArMjQwOSwxMSBAQAogZGF0ZV9yZXByKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKIAljaGFyIGJ1ZmZlclsxMDI4XTsKLQljb25zdCBjaGFyICp0eXBlbmFtZTsKKwljb25zdCBjaGFyICp0eXBlX25hbWU7CiAKLQl0eXBlbmFtZSA9IHNlbGYtPm9iX3R5cGUtPnRwX25hbWU7CisJdHlwZV9uYW1lID0gc2VsZi0+b2JfdHlwZS0+dHBfbmFtZTsKIAlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcyglZCwgJWQsICVkKSIsCi0JCSAgICAgIHR5cGVuYW1lLAorCQkgICAgICB0eXBlX25hbWUsCiAJCSAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZikpOwogCiAJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKQEAgLTMxMzAsNyArMzEzNSw3IEBACiB0aW1lX3JlcHIoUHlEYXRlVGltZV9UaW1lICpzZWxmKQogewogCWNoYXIgYnVmZmVyWzEwMF07Ci0JY29uc3QgY2hhciAqdHlwZW5hbWUgPSBzZWxmLT5vYl90eXBlLT50cF9uYW1lOworCWNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IHNlbGYtPm9iX3R5cGUtPnRwX25hbWU7CiAJaW50IGggPSBUSU1FX0dFVF9IT1VSKHNlbGYpOwogCWludCBtID0gVElNRV9HRVRfTUlOVVRFKHNlbGYpOwogCWludCBzID0gVElNRV9HRVRfU0VDT05EKHNlbGYpOwpAQCAtMzEzOSwxMyArMzE0NCwxMyBAQAogCiAJaWYgKHVzKQogCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkLCAlZCwgJWQpIiwgdHlwZW5hbWUsIGgsIG0sIHMsIHVzKTsKKwkJCSAgICAgICIlcyglZCwgJWQsICVkLCAlZCkiLCB0eXBlX25hbWUsIGgsIG0sIHMsIHVzKTsKIAllbHNlIGlmIChzKQogCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkLCAlZCkiLCB0eXBlbmFtZSwgaCwgbSwgcyk7CisJCQkgICAgICAiJXMoJWQsICVkLCAlZCkiLCB0eXBlX25hbWUsIGgsIG0sIHMpOwogCWVsc2UKIAkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkJICAgICAgIiVzKCVkLCAlZCkiLCB0eXBlbmFtZSwgaCwgbSk7CisJCQkgICAgICAiJXMoJWQsICVkKSIsIHR5cGVfbmFtZSwgaCwgbSk7CiAJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOwogCWlmIChyZXN1bHQgIT0gTlVMTCAmJiBIQVNUWklORk8oc2VsZikpCiAJCXJlc3VsdCA9IGFwcGVuZF9rZXl3b3JkX3R6aW5mbyhyZXN1bHQsIHNlbGYtPnR6aW5mbyk7CkBAIC0zODE2LDYgKzM4MjEsMTAgQEAKIAkJaWYgKFB5U2VxdWVuY2VfQ2hlY2sob2JqKSAmJiBQeVNlcXVlbmNlX1NpemUob2JqKSA+PSA2KQogCQkJZm9yIChpPTA7IGkgPCA2OyBpKyspIHsKIAkJCQlQeU9iamVjdCAqcCA9IFB5U2VxdWVuY2VfR2V0SXRlbShvYmosIGkpOworCQkJCWlmIChwID09IE5VTEwpIHsKKwkJCQkJUHlfREVDUkVGKG9iaik7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KIAkJCQlpZiAoUHlJbnRfQ2hlY2socCkpCiAJCQkJCWlhW2ldID0gUHlJbnRfQXNMb25nKHApOwogCQkJCWVsc2UKQEAgLTQwMjMsMTMgKzQwMzIsMTMgQEAKIGRhdGV0aW1lX3JlcHIoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKIAljaGFyIGJ1ZmZlclsxMDAwXTsKLQljb25zdCBjaGFyICp0eXBlbmFtZSA9IHNlbGYtPm9iX3R5cGUtPnRwX25hbWU7CisJY29uc3QgY2hhciAqdHlwZV9uYW1lID0gc2VsZi0+b2JfdHlwZS0+dHBfbmFtZTsKIAlQeU9iamVjdCAqYmFzZXJlcHI7CiAKIAlpZiAoREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZikpIHsKIAkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAogCQkJICAgICAgIiVzKCVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkKSIsCi0JCQkgICAgICB0eXBlbmFtZSwKKwkJCSAgICAgIHR5cGVfbmFtZSwKIAkJCSAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZiksCiAJCQkgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCiAJCQkgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksCkBAIC00MDM4LDcgKzQwNDcsNyBAQAogCWVsc2UgaWYgKERBVEVfR0VUX1NFQ09ORChzZWxmKSkgewogCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCiAJCQkgICAgICAiJXMoJWQsICVkLCAlZCwgJWQsICVkLCAlZCkiLAotCQkJICAgICAgdHlwZW5hbWUsCisJCQkgICAgICB0eXBlX25hbWUsCiAJCQkgICAgICBHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpLAogCQkJICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpLAogCQkJICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpKTsKQEAgLTQwNDYsNyArNDA1NSw3IEBACiAJZWxzZSB7CiAJCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKIAkJCSAgICAgICIlcyglZCwgJWQsICVkLCAlZCwgJWQpIiwKLQkJCSAgICAgIHR5cGVuYW1lLAorCQkJICAgICAgdHlwZV9uYW1lLAogCQkJICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSwKIAkJCSAgICAgIERBVEVfR0VUX0hPVVIoc2VsZiksIERBVEVfR0VUX01JTlVURShzZWxmKSk7CiAJfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9mdW5jdGlvbmFsbW9kdWxlLmMgYi9Nb2R1bGVzL2Z1bmN0aW9uYWxtb2R1bGUuYwppbmRleCA0YjJlOWI0Li4zOGVmNDNhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Z1bmN0aW9uYWxtb2R1bGUuYworKysgYi9Nb2R1bGVzL2Z1bmN0aW9uYWxtb2R1bGUuYwpAQCAtNDgsNyArNDgsNyBAQAogCiAJcHRvLT5mbiA9IGZ1bmM7CiAJUHlfSU5DUkVGKGZ1bmMpOwotCXB0by0+YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgSU5UX01BWCk7CisJcHRvLT5hcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBQWV9TU0laRV9UX01BWCk7CiAJaWYgKHB0by0+YXJncyA9PSBOVUxMKSB7CiAJCXB0by0+a3cgPSBOVUxMOwogCQlQeV9ERUNSRUYocHRvKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2Ntb2R1bGUuYyBiL01vZHVsZXMvZ2Ntb2R1bGUuYwppbmRleCA3ZTNmOTVhLi4wMTc2ZDZmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2djbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9nY21vZHVsZS5jCkBAIC00MTMsOCArNDEzLDEyIEBACiAJCWFzc2VydChkZWxzdHIgIT0gTlVMTCk7CiAJCXJldHVybiBfUHlJbnN0YW5jZV9Mb29rdXAob3AsIGRlbHN0cikgIT0gTlVMTDsKIAl9Ci0JZWxzZSAKKwllbHNlIGlmIChQeVR5cGVfSGFzRmVhdHVyZShvcC0+b2JfdHlwZSwgUHlfVFBGTEFHU19IRUFQVFlQRSkpCiAJCXJldHVybiBvcC0+b2JfdHlwZS0+dHBfZGVsICE9IE5VTEw7CisJZWxzZSBpZiAoUHlHZW5fQ2hlY2tFeGFjdChvcCkpCisJCXJldHVybiBQeUdlbl9OZWVkc0ZpbmFsaXppbmcoKFB5R2VuT2JqZWN0ICopb3ApOworCWVsc2UKKwkJcmV0dXJuIDA7CiB9CiAKIC8qIE1vdmUgdGhlIG9iamVjdHMgaW4gdW5yZWFjaGFibGUgd2l0aCBfX2RlbF9fIG1ldGhvZHMgaW50byBgZmluYWxpemVyc2AuCkBAIC03MzAsNiArNzM0LDggQEAKIAlQeUdDX0hlYWQgdW5yZWFjaGFibGU7IC8qIG5vbi1wcm9ibGVtYXRpYyB1bnJlYWNoYWJsZSB0cmFzaCAqLwogCVB5R0NfSGVhZCBmaW5hbGl6ZXJzOyAgLyogb2JqZWN0cyB3aXRoLCAmIHJlYWNoYWJsZSBmcm9tLCBfX2RlbF9fICovCiAJUHlHQ19IZWFkICpnYzsKKwlzdGF0aWMgUHlPYmplY3QgKnRtb2QgPSBOVUxMOworCWRvdWJsZSB0MSA9IDAuMDsKIAogCWlmIChkZWxzdHIgPT0gTlVMTCkgewogCQlkZWxzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbF9fIik7CkBAIC03MzcsMTkgKzc0MywyOSBAQAogCQkJUHlfRmF0YWxFcnJvcigiZ2MgY291bGRuJ3QgYWxsb2NhdGUgXCJfX2RlbF9fXCIiKTsKIAl9CiAKKwlpZiAodG1vZCA9PSBOVUxMKSB7CisJCXRtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInRpbWUiKTsKKwkJaWYgKHRtb2QgPT0gTlVMTCkKKwkJCVB5RXJyX0NsZWFyKCk7CisJfQorCiAJaWYgKGRlYnVnICYgREVCVUdfU1RBVFMpIHsKKwkJaWYgKHRtb2QgIT0gTlVMTCkgeworCQkJUHlPYmplY3QgKmYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRtb2QsICJ0aW1lIiwgTlVMTCk7CisJCQlpZiAoZiA9PSBOVUxMKSB7CisJCQkJUHlFcnJfQ2xlYXIoKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXQxID0gUHlGbG9hdF9Bc0RvdWJsZShmKTsKKwkJCQlQeV9ERUNSRUYoZik7CisJCQl9CisJCX0KIAkJUHlTeXNfV3JpdGVTdGRlcnIoImdjOiBjb2xsZWN0aW5nIGdlbmVyYXRpb24gJWQuLi5cbiIsCiAJCQkJICBnZW5lcmF0aW9uKTsKIAkJUHlTeXNfV3JpdGVTdGRlcnIoImdjOiBvYmplY3RzIGluIGVhY2ggZ2VuZXJhdGlvbjoiKTsKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9HRU5FUkFUSU9OUzsgaSsrKSB7Ci0jaWZkZWYgTVNfV0lONjQKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIgJUlkIiwgZ2NfbGlzdF9zaXplKEdFTl9IRUFEKGkpKSk7Ci0jZWxzZQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiAlbGQiLAotCQkJCVB5X1NBRkVfRE9XTkNBU1QoZ2NfbGlzdF9zaXplKEdFTl9IRUFEKGkpKSwKLQkJCQkJCSBQeV9zc2l6ZV90LCBsb25nKSk7Ci0jZW5kaWYKLQkJfQorCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0dFTkVSQVRJT05TOyBpKyspCisJCQlQeVN5c19Xcml0ZVN0ZGVycigiICUiIFBZX0ZPUk1BVF9TSVpFX1QgImQiLAorCQkJCQkgIGdjX2xpc3Rfc2l6ZShHRU5fSEVBRChpKSkpOwogCQlQeVN5c19Xcml0ZVN0ZGVycigiXG4iKTsKIAl9CiAKQEAgLTgxNiw2ICs4MzIsMTcgQEAKIAkJaWYgKGRlYnVnICYgREVCVUdfQ09MTEVDVEFCTEUpIHsKIAkJCWRlYnVnX2N5Y2xlKCJjb2xsZWN0YWJsZSIsIEZST01fR0MoZ2MpKTsKIAkJfQorCQlpZiAodG1vZCAhPSBOVUxMICYmIChkZWJ1ZyAmIERFQlVHX1NUQVRTKSkgeworCQkJUHlPYmplY3QgKmYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRtb2QsICJ0aW1lIiwgTlVMTCk7CisJCQlpZiAoZiA9PSBOVUxMKSB7CisJCQkJUHlFcnJfQ2xlYXIoKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXQxID0gUHlGbG9hdF9Bc0RvdWJsZShmKS10MTsKKwkJCQlQeV9ERUNSRUYoZik7CisJCQkJUHlTeXNfV3JpdGVTdGRlcnIoImdjOiAlLjRmcyBlbGFwc2VkLlxuIiwgdDEpOworCQkJfQorCQl9CiAJfQogCiAJLyogQ2xlYXIgd2Vha3JlZnMgYW5kIGludm9rZSBjYWxsYmFja3MgYXMgbmVjZXNzYXJ5LiAqLwpAQCAtODM3LDIxICs4NjQsMTQgQEAKIAkJCWRlYnVnX2N5Y2xlKCJ1bmNvbGxlY3RhYmxlIiwgRlJPTV9HQyhnYykpOwogCX0KIAlpZiAoZGVidWcgJiBERUJVR19TVEFUUykgewotCQlpZiAobSA9PSAwICYmIG4gPT0gMCkgeworCQlpZiAobSA9PSAwICYmIG4gPT0gMCkKIAkJCVB5U3lzX1dyaXRlU3RkZXJyKCJnYzogZG9uZS5cbiIpOwotCQl9Ci0JCWVsc2UgewotI2lmZGVmIE1TX1dJTjY0CisJCWVsc2UKIAkJCVB5U3lzX1dyaXRlU3RkZXJyKAotCQkJICAgICJnYzogZG9uZSwgJUlkIHVucmVhY2hhYmxlLCAlSWQgdW5jb2xsZWN0YWJsZS5cbiIsCisJCQkgICAgImdjOiBkb25lLCAiCisJCQkgICAgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgdW5yZWFjaGFibGUsICIKKwkJCSAgICAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCB1bmNvbGxlY3RhYmxlLlxuIiwKIAkJCSAgICBuK20sIG4pOwotI2Vsc2UKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKAotCQkJICAgICJnYzogZG9uZSwgJWxkIHVucmVhY2hhYmxlLCAlbGQgdW5jb2xsZWN0YWJsZS5cbiIsCi0JCQkgICAgUHlfU0FGRV9ET1dOQ0FTVChuK20sIFB5X3NzaXplX3QsIGxvbmcpLAotCQkJICAgIFB5X1NBRkVfRE9XTkNBU1QobiwgUHlfc3NpemVfdCwgbG9uZykpOwotI2VuZGlmCi0JCX0KIAl9CiAKIAkvKiBBcHBlbmQgaW5zdGFuY2VzIGluIHRoZSB1bmNvbGxlY3RhYmxlIHNldCB0byBhIFB5dGhvbgpAQCAtMTA1MCw3ICsxMDcwLDcgQEAKIHN0YXRpYyBpbnQKIHJlZmVycmVyc3Zpc2l0KFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0ICpvYmpzKQogewotCWludCBpOworCVB5X3NzaXplX3QgaTsKIAlmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShvYmpzKTsgaSsrKQogCQlpZiAoUHlUdXBsZV9HRVRfSVRFTShvYmpzLCBpKSA9PSBvYmopCiAJCQlyZXR1cm4gMTsKQEAgLTEwODUsNiArMTEwNSw4IEBACiB7CiAJaW50IGk7CiAJUHlPYmplY3QgKnJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7CisJaWYgKCFyZXN1bHQpIHJldHVybiBOVUxMOworCiAJZm9yIChpID0gMDsgaSA8IE5VTV9HRU5FUkFUSU9OUzsgaSsrKSB7CiAJCWlmICghKGdjX3JlZmVycmVyc19mb3IoYXJncywgR0VOX0hFQUQoaSksIHJlc3VsdCkpKSB7CiAJCQlQeV9ERUNSRUYocmVzdWx0KTsKQEAgLTExMDgsNyArMTEzMCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2NfZ2V0X3JlZmVyZW50cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGk7CisJUHlfc3NpemVfdCBpOwogCVB5T2JqZWN0ICpyZXN1bHQgPSBQeUxpc3RfTmV3KDApOwogCiAJaWYgKHJlc3VsdCA9PSBOVUxMKQpAQCAtMTI4OCw3ICsxMzEwLDggQEAKIF9QeU9iamVjdF9HQ19NYWxsb2Moc2l6ZV90IGJhc2ljc2l6ZSkKIHsKIAlQeU9iamVjdCAqb3A7Ci0JUHlHQ19IZWFkICpnID0gUHlPYmplY3RfTUFMTE9DKHNpemVvZihQeUdDX0hlYWQpICsgYmFzaWNzaXplKTsKKwlQeUdDX0hlYWQgKmcgPSAoUHlHQ19IZWFkICopUHlPYmplY3RfTUFMTE9DKAorICAgICAgICAgICAgICAgIHNpemVvZihQeUdDX0hlYWQpICsgYmFzaWNzaXplKTsKIAlpZiAoZyA9PSBOVUxMKQogCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAlnLT5nYy5nY19yZWZzID0gR0NfVU5UUkFDS0VEOwpAQCAtMTMzMCw3ICsxMzUzLDcgQEAKIHsKIAljb25zdCBzaXplX3QgYmFzaWNzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKG9wLT5vYl90eXBlLCBuaXRlbXMpOwogCVB5R0NfSGVhZCAqZyA9IEFTX0dDKG9wKTsKLQlnID0gUHlPYmplY3RfUkVBTExPQyhnLCAgc2l6ZW9mKFB5R0NfSGVhZCkgKyBiYXNpY3NpemUpOworCWcgPSAoUHlHQ19IZWFkICopUHlPYmplY3RfUkVBTExPQyhnLCAgc2l6ZW9mKFB5R0NfSGVhZCkgKyBiYXNpY3NpemUpOwogCWlmIChnID09IE5VTEwpCiAJCXJldHVybiAoUHlWYXJPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOwogCW9wID0gKFB5VmFyT2JqZWN0ICopIEZST01fR0MoZyk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dldHBhdGguYyBiL01vZHVsZXMvZ2V0cGF0aC5jCmluZGV4IDQ3MTZkMTUuLjhlYmE3MzAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0cGF0aC5jCisrKyBiL01vZHVsZXMvZ2V0cGF0aC5jCkBAIC05MSw2ICs5MSwxMSBAQAogICogcHJvY2VzcyB0byBmaW5kIHRoZSBpbnN0YWxsZWQgUHl0aG9uIHRyZWUuCiAgKi8KIAorI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCiAjaWZuZGVmIFZFUlNJT04KICNpZiBkZWZpbmVkKF9fVk1TKQogI2RlZmluZSBWRVJTSU9OICIyXzEiCkBAIC01NjYsNyArNTcxLDcgQEAKICAgICBidWZzeiArPSBzdHJsZW4oZXhlY19wcmVmaXgpICsgMTsKIAogICAgIC8qIFRoaXMgaXMgdGhlIG9ubHkgbWFsbG9jIGNhbGwgaW4gdGhpcyBmaWxlICovCi0gICAgYnVmID0gUHlNZW1fTWFsbG9jKGJ1ZnN6KTsKKyAgICBidWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhidWZzeik7CiAKICAgICBpZiAoYnVmID09IE5VTEwpIHsKICAgICAgICAgLyogV2UgY2FuJ3QgZXhpdCwgc28gcHJpbnQgYSB3YXJuaW5nIGFuZCBsaW1wIGFsb25nICovCkBAIC02ODEsMyArNjg2LDkgQEAKICAgICAgICAgY2FsY3VsYXRlX3BhdGgoKTsKICAgICByZXR1cm4gcHJvZ3BhdGg7CiB9CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9ncnBtb2R1bGUuYyBiL01vZHVsZXMvZ3JwbW9kdWxlLmMKaW5kZXggZGU4NDljOS4uMTJkMzNkZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9ncnBtb2R1bGUuYworKysgYi9Nb2R1bGVzL2dycG1vZHVsZS5jCkBAIC0yOSw2ICsyOSw3IEBACiB9OwogCiAKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CiBzdGF0aWMgUHlUeXBlT2JqZWN0IFN0cnVjdEdycFR5cGU7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNzQsNiArMTc1LDggQEAKICAgICBpZiAobSA9PSBOVUxMKQogICAgICAgICByZXR1cm47CiAgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0gICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0R3JwVHlwZSwgJnN0cnVjdF9ncm91cF90eXBlX2Rlc2MpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisJICAgIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdEdycFR5cGUsICZzdHJ1Y3RfZ3JvdXBfdHlwZV9kZXNjKTsKICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAic3RydWN0X2dyb3VwIiwgKFB5T2JqZWN0ICopICZTdHJ1Y3RHcnBUeXBlKTsKKyAgICBpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jIGIvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYwppbmRleCA0OWQyNDFmLi45NDYxN2E5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCisrKyBiL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKQEAgLTM0MCw3ICszNDAsNyBAQAogewogCXRlZWRhdGFvYmplY3QgKnRkbzsKIAotCXRkbyA9IFB5T2JqZWN0X05ldyh0ZWVkYXRhb2JqZWN0LCAmdGVlZGF0YW9iamVjdF90eXBlKTsKKwl0ZG8gPSBQeU9iamVjdF9HQ19OZXcodGVlZGF0YW9iamVjdCwgJnRlZWRhdGFvYmplY3RfdHlwZSk7CiAJaWYgKHRkbyA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMzQ4LDYgKzM0OCw3IEBACiAJdGRvLT5uZXh0bGluayA9IE5VTEw7CiAJUHlfSU5DUkVGKGl0KTsKIAl0ZG8tPml0ID0gaXQ7CisJUHlPYmplY3RfR0NfVHJhY2sodGRvKTsKIAlyZXR1cm4gKFB5T2JqZWN0ICopdGRvOwogfQogCkBAIC0zODEsMTYgKzM4MiwzNCBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAorc3RhdGljIGludAordGVlZGF0YW9iamVjdF90cmF2ZXJzZSh0ZWVkYXRhb2JqZWN0ICp0ZG8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqIGFyZykKK3sKKwlpbnQgaTsKKwlQeV9WSVNJVCh0ZG8tPml0KTsKKwlmb3IgKGkgPSAwOyBpIDwgdGRvLT5udW1yZWFkOyBpKyspCisJCVB5X1ZJU0lUKHRkby0+dmFsdWVzW2ldKTsKKwlQeV9WSVNJVCh0ZG8tPm5leHRsaW5rKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGVlZGF0YW9iamVjdF9jbGVhcih0ZWVkYXRhb2JqZWN0ICp0ZG8pCit7CisJaW50IGk7CisJUHlfQ0xFQVIodGRvLT5pdCk7CisJZm9yIChpPTAgOyBpPHRkby0+bnVtcmVhZCA7IGkrKykKKwkJUHlfQ0xFQVIodGRvLT52YWx1ZXNbaV0pOworCVB5X0NMRUFSKHRkby0+bmV4dGxpbmspOworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZAogdGVlZGF0YW9iamVjdF9kZWFsbG9jKHRlZWRhdGFvYmplY3QgKnRkbykKIHsKLQlpbnQgaTsKLQotCWZvciAoaT0wIDsgaTx0ZG8tPm51bXJlYWQgOyBpKyspCi0JCVB5X0RFQ1JFRih0ZG8tPnZhbHVlc1tpXSk7Ci0JUHlfWERFQ1JFRih0ZG8tPml0KTsKLQlQeV9YREVDUkVGKHRkby0+bmV4dGxpbmspOwotCVB5T2JqZWN0X0RlbCh0ZG8pOworCVB5T2JqZWN0X0dDX1VuVHJhY2sodGRvKTsKKwl0ZWVkYXRhb2JqZWN0X2NsZWFyKHRkbyk7CisJUHlPYmplY3RfR0NfRGVsKHRkbyk7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZWVkYXRhb2JqZWN0X2RvYywgIkRhdGEgY29udGFpbmVyIGNvbW1vbiB0byBtdWx0aXBsZSB0ZWUgb2JqZWN0cy4iKTsKQEAgLTQxNyw5ICs0MzYsMjYgQEAKIAlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCiAJMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCiAJMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLworCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywJLyogdHBfZmxhZ3MgKi8KIAl0ZWVkYXRhb2JqZWN0X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KKwkodHJhdmVyc2Vwcm9jKXRlZWRhdGFvYmplY3RfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCisJKGlucXVpcnkpdGVlZGF0YW9iamVjdF9jbGVhciwJCS8qIHRwX2NsZWFyICovCisJMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCisJMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisJMCwJCQkJCS8qIHRwX2l0ZXIgKi8KKwkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KKwkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLworCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCisJMCwJCQkJCS8qIHRwX2dldHNldCAqLworCTAsCQkJCQkvKiB0cF9iYXNlICovCisJMCwJCQkJCS8qIHRwX2RpY3QgKi8KKwkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCisJMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLworCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCisJMCwJCQkJCS8qIHRwX2luaXQgKi8KKwkwLAkJCQkJLyogdHBfYWxsb2MgKi8KKwkwLAkJCQkJLyogdHBfbmV3ICovCisJUHlPYmplY3RfR0NfRGVsLAkJCS8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtNDQzLDE4ICs0NzksMjYgQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKK3N0YXRpYyBpbnQKK3RlZV90cmF2ZXJzZSh0ZWVvYmplY3QgKnRvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKK3sKKwlQeV9WSVNJVCgoUHlPYmplY3QgKil0by0+ZGF0YW9iaik7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZWVfY29weSh0ZWVvYmplY3QgKnRvKQogewogCXRlZW9iamVjdCAqbmV3dG87CiAKLQluZXd0byA9IFB5T2JqZWN0X05ldyh0ZWVvYmplY3QsICZ0ZWVfdHlwZSk7CisJbmV3dG8gPSBQeU9iamVjdF9HQ19OZXcodGVlb2JqZWN0LCAmdGVlX3R5cGUpOwogCWlmIChuZXd0byA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlQeV9JTkNSRUYodG8tPmRhdGFvYmopOwogCW5ld3RvLT5kYXRhb2JqID0gdG8tPmRhdGFvYmo7CiAJbmV3dG8tPmluZGV4ID0gdG8tPmluZGV4OwogCW5ld3RvLT53ZWFrcmVmbGlzdCA9IE5VTEw7CisJUHlPYmplY3RfR0NfVHJhY2sobmV3dG8pOwogCXJldHVybiAoUHlPYmplY3QgKiluZXd0bzsKIH0KIApAQCAtNDc0LDEyICs1MTgsMTMgQEAKIAkJZ290byBkb25lOwogCX0KIAotCXRvID0gUHlPYmplY3RfTmV3KHRlZW9iamVjdCwgJnRlZV90eXBlKTsKKwl0byA9IFB5T2JqZWN0X0dDX05ldyh0ZWVvYmplY3QsICZ0ZWVfdHlwZSk7CiAJaWYgKHRvID09IE5VTEwpIAogCQlnb3RvIGRvbmU7CiAJdG8tPmRhdGFvYmogPSAodGVlZGF0YW9iamVjdCAqKXRlZWRhdGFvYmplY3RfbmV3KGl0KTsKIAl0by0+aW5kZXggPSAwOwogCXRvLT53ZWFrcmVmbGlzdCA9IE5VTEw7CisJUHlPYmplY3RfR0NfVHJhY2sodG8pOwogZG9uZToKIAlQeV9YREVDUkVGKGl0KTsKIAlyZXR1cm4gKFB5T2JqZWN0ICopdG87CkBAIC00OTUsMTMgKzU0MCwyMSBAQAogCXJldHVybiB0ZWVfZnJvbWl0ZXJhYmxlKGl0ZXJhYmxlKTsKIH0KIAotc3RhdGljIHZvaWQKLXRlZV9kZWFsbG9jKHRlZW9iamVjdCAqdG8pCitzdGF0aWMgaW50Cit0ZWVfY2xlYXIodGVlb2JqZWN0ICp0bykKIHsKIAlpZiAodG8tPndlYWtyZWZsaXN0ICE9IE5VTEwpCiAJCVB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIHRvKTsKLQlQeV9YREVDUkVGKHRvLT5kYXRhb2JqKTsKLQlQeU9iamVjdF9EZWwodG8pOworCVB5X0NMRUFSKHRvLT5kYXRhb2JqKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3RlZV9kZWFsbG9jKHRlZW9iamVjdCAqdG8pCit7CisJUHlPYmplY3RfR0NfVW5UcmFjayh0byk7CisJdGVlX2NsZWFyKHRvKTsKKwlQeU9iamVjdF9HQ19EZWwodG8pOwogfQogCiBQeURvY19TVFJWQVIodGVlb2JqZWN0X2RvYywKQEAgLTUzNCwxMCArNTg3LDEwIEBACiAJMCwJCQkJLyogdHBfZ2V0YXR0cm8gKi8KIAkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwogCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCisJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLAkvKiB0cF9mbGFncyAqLwogCXRlZW9iamVjdF9kb2MsCQkJLyogdHBfZG9jICovCi0JMCwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLworCSh0cmF2ZXJzZXByb2MpdGVlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLworCShpbnF1aXJ5KXRlZV9jbGVhciwJCS8qIHRwX2NsZWFyICovCiAJMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KIAlvZmZzZXRvZih0ZWVvYmplY3QsIHdlYWtyZWZsaXN0KSwJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KIAlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KQEAgLTU1Myw3ICs2MDYsNyBAQAogCTAsCQkJCS8qIHRwX2luaXQgKi8KIAkwLAkJCQkvKiB0cF9hbGxvYyAqLwogCXRlZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfRGVsLAkJCS8qIHRwX2ZyZWUgKi8KKwlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tYWluLmMgYi9Nb2R1bGVzL21haW4uYwppbmRleCBiM2NlMTZlLi43MzI2YTI3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL21haW4uYworKysgYi9Nb2R1bGVzL21haW4uYwpAQCAtMjgsNiArMjgsMTAgQEAKICAgICAiVHlwZSBcImhlbHBcIiwgXCJjb3B5cmlnaHRcIiwgXCJjcmVkaXRzXCIgb3IgXCJsaWNlbnNlXCIgIiBcCiAgICAgImZvciBtb3JlIGluZm9ybWF0aW9uLiIKIAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCiAvKiBGb3IgUHlfR2V0QXJnY0FyZ3YoKTsgc2V0IGJ5IG1haW4oKSAqLwogc3RhdGljIGNoYXIgKipvcmlnX2FyZ3Y7CiBzdGF0aWMgaW50ICBvcmlnX2FyZ2M7CkBAIC0yMDYsNyArMjEwLDcgQEAKIAkJCS8qIC1jIGlzIHRoZSBsYXN0IG9wdGlvbjsgZm9sbG93aW5nIGFyZ3VtZW50cwogCQkJICAgdGhhdCBsb29rIGxpa2Ugb3B0aW9ucyBhcmUgbGVmdCBmb3IgdGhlCiAJCQkgICBjb21tYW5kIHRvIGludGVycHJldC4gKi8KLQkJCWNvbW1hbmQgPSBtYWxsb2Moc3RybGVuKF9QeU9TX29wdGFyZykgKyAyKTsKKwkJCWNvbW1hbmQgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oX1B5T1Nfb3B0YXJnKSArIDIpOwogCQkJaWYgKGNvbW1hbmQgPT0gTlVMTCkKIAkJCQlQeV9GYXRhbEVycm9yKAogCQkJCSAgICJub3QgZW5vdWdoIG1lbW9yeSB0byBjb3B5IC1jIGFyZ3VtZW50Iik7CkBAIC0yMTksNyArMjIzLDcgQEAKIAkJCS8qIC1tIGlzIHRoZSBsYXN0IG9wdGlvbjsgZm9sbG93aW5nIGFyZ3VtZW50cwogCQkJICAgdGhhdCBsb29rIGxpa2Ugb3B0aW9ucyBhcmUgbGVmdCBmb3IgdGhlCiAJCQkgICBtb2R1bGUgdG8gaW50ZXJwcmV0LiAqLwotCQkJbW9kdWxlID0gbWFsbG9jKHN0cmxlbihfUHlPU19vcHRhcmcpICsgMik7CisJCQltb2R1bGUgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oX1B5T1Nfb3B0YXJnKSArIDIpOwogCQkJaWYgKG1vZHVsZSA9PSBOVUxMKQogCQkJCVB5X0ZhdGFsRXJyb3IoCiAJCQkJICAgIm5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvcHkgLW0gYXJndW1lbnQiKTsKQEAgLTUwOSwzICs1MTMsOCBAQAogCSphcmdjID0gb3JpZ19hcmdjOwogCSphcmd2ID0gb3JpZ19hcmd2OwogfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9Nb2R1bGVzL21kNS5jIGIvTW9kdWxlcy9tZDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzVkOTZjCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9tZDUuYwpAQCAtMCwwICsxLDM4MSBAQAorLyoKKyAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBMLiBQZXRlciBEZXV0c2NoCisgIGdob3N0QGFsYWRkaW4uY29tCisKKyAqLworLyogJElkOiBtZDUuYyx2IDEuNiAyMDAyLzA0LzEzIDE5OjIwOjI4IGxwZCBFeHAgJCAqLworLyoKKyAgSW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gb2YgTUQ1IChSRkMgMTMyMSkuCisKKyAgVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBBbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgMTMyMSwgd2hvc2UKKyAgdGV4dCBpcyBhdmFpbGFibGUgYXQKKwlodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAorICBUaGUgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIHRleHQgb2YgdGhlIFJGQywgaW5jbHVkaW5nIHRoZSB0ZXN0IHN1aXRlCisgIChzZWN0aW9uIEEuNSkgYnV0IGV4Y2x1ZGluZyB0aGUgcmVzdCBvZiBBcHBlbmRpeCBBLiAgSXQgZG9lcyBub3QgaW5jbHVkZQorICBhbnkgY29kZSBvciBkb2N1bWVudGF0aW9uIHRoYXQgaXMgaWRlbnRpZmllZCBpbiB0aGUgUkZDIGFzIGJlaW5nCisgIGNvcHlyaWdodGVkLgorCisgIFRoZSBvcmlnaW5hbCBhbmQgcHJpbmNpcGFsIGF1dGhvciBvZiBtZDUuYyBpcyBMLiBQZXRlciBEZXV0c2NoCisgIDxnaG9zdEBhbGFkZGluLmNvbT4uICBPdGhlciBhdXRob3JzIGFyZSBub3RlZCBpbiB0aGUgY2hhbmdlIGhpc3RvcnkKKyAgdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgorCisgIDIwMDItMDQtMTMgbHBkIENsYXJpZmllZCBkZXJpdmF0aW9uIGZyb20gUkZDIDEzMjE7IG5vdyBoYW5kbGVzIGJ5dGUgb3JkZXIKKwllaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseTsgYWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RyaW5nLmg+CisJaW4gbGlicmFyeS4KKyAgMjAwMi0wMy0xMSBscGQgQ29ycmVjdGVkIGFyZ3VtZW50IGxpc3QgZm9yIG1haW4oKSwgYW5kIGFkZGVkIGludCByZXR1cm4KKwl0eXBlLCBpbiB0ZXN0IHByb2dyYW0gYW5kIFQgdmFsdWUgcHJvZ3JhbS4KKyAgMjAwMi0wMi0yMSBscGQgQWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RkaW8uaD4gaW4gdGVzdCBwcm9ncmFtLgorICAyMDAwLTA3LTAzIGxwZCBQYXRjaGVkIHRvIGVsaW1pbmF0ZSB3YXJuaW5ncyBhYm91dCAiY29uc3RhbnQgaXMKKwl1bnNpZ25lZCBpbiBBTlNJIEMsIHNpZ25lZCBpbiB0cmFkaXRpb25hbCI7IG1hZGUgdGVzdCBwcm9ncmFtCisJc2VsZi1jaGVja2luZy4KKyAgMTk5OS0xMS0wNCBscGQgRWRpdGVkIGNvbW1lbnRzIHNsaWdodGx5IGZvciBhdXRvbWF0aWMgVE9DIGV4dHJhY3Rpb24uCisgIDE5OTktMTAtMTggbHBkIEZpeGVkIHR5cG8gaW4gaGVhZGVyIGNvbW1lbnQgKGFuc2kya25yIHJhdGhlciB0aGFuIG1kNSkuCisgIDE5OTktMDUtMDMgbHBkIE9yaWdpbmFsIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgIm1kNS5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjdW5kZWYgQllURV9PUkRFUgkvKiAxID0gYmlnLWVuZGlhbiwgLTEgPSBsaXR0bGUtZW5kaWFuLCAwID0gdW5rbm93biAqLworI2lmZGVmIEFSQ0hfSVNfQklHX0VORElBTgorIyAgZGVmaW5lIEJZVEVfT1JERVIgKEFSQ0hfSVNfQklHX0VORElBTiA/IDEgOiAtMSkKKyNlbHNlCisjICBkZWZpbmUgQllURV9PUkRFUiAwCisjZW5kaWYKKworI2RlZmluZSBUX01BU0sgKChtZDVfd29yZF90KX4wKQorI2RlZmluZSBUMSAvKiAweGQ3NmFhNDc4ICovIChUX01BU0sgXiAweDI4OTU1Yjg3KQorI2RlZmluZSBUMiAvKiAweGU4YzdiNzU2ICovIChUX01BU0sgXiAweDE3Mzg0OGE5KQorI2RlZmluZSBUMyAgICAweDI0MjA3MGRiCisjZGVmaW5lIFQ0IC8qIDB4YzFiZGNlZWUgKi8gKFRfTUFTSyBeIDB4M2U0MjMxMTEpCisjZGVmaW5lIFQ1IC8qIDB4ZjU3YzBmYWYgKi8gKFRfTUFTSyBeIDB4MGE4M2YwNTApCisjZGVmaW5lIFQ2ICAgIDB4NDc4N2M2MmEKKyNkZWZpbmUgVDcgLyogMHhhODMwNDYxMyAqLyAoVF9NQVNLIF4gMHg1N2NmYjllYykKKyNkZWZpbmUgVDggLyogMHhmZDQ2OTUwMSAqLyAoVF9NQVNLIF4gMHgwMmI5NmFmZSkKKyNkZWZpbmUgVDkgICAgMHg2OTgwOThkOAorI2RlZmluZSBUMTAgLyogMHg4YjQ0ZjdhZiAqLyAoVF9NQVNLIF4gMHg3NGJiMDg1MCkKKyNkZWZpbmUgVDExIC8qIDB4ZmZmZjViYjEgKi8gKFRfTUFTSyBeIDB4MDAwMGE0NGUpCisjZGVmaW5lIFQxMiAvKiAweDg5NWNkN2JlICovIChUX01BU0sgXiAweDc2YTMyODQxKQorI2RlZmluZSBUMTMgICAgMHg2YjkwMTEyMgorI2RlZmluZSBUMTQgLyogMHhmZDk4NzE5MyAqLyAoVF9NQVNLIF4gMHgwMjY3OGU2YykKKyNkZWZpbmUgVDE1IC8qIDB4YTY3OTQzOGUgKi8gKFRfTUFTSyBeIDB4NTk4NmJjNzEpCisjZGVmaW5lIFQxNiAgICAweDQ5YjQwODIxCisjZGVmaW5lIFQxNyAvKiAweGY2MWUyNTYyICovIChUX01BU0sgXiAweDA5ZTFkYTlkKQorI2RlZmluZSBUMTggLyogMHhjMDQwYjM0MCAqLyAoVF9NQVNLIF4gMHgzZmJmNGNiZikKKyNkZWZpbmUgVDE5ICAgIDB4MjY1ZTVhNTEKKyNkZWZpbmUgVDIwIC8qIDB4ZTliNmM3YWEgKi8gKFRfTUFTSyBeIDB4MTY0OTM4NTUpCisjZGVmaW5lIFQyMSAvKiAweGQ2MmYxMDVkICovIChUX01BU0sgXiAweDI5ZDBlZmEyKQorI2RlZmluZSBUMjIgICAgMHgwMjQ0MTQ1MworI2RlZmluZSBUMjMgLyogMHhkOGExZTY4MSAqLyAoVF9NQVNLIF4gMHgyNzVlMTk3ZSkKKyNkZWZpbmUgVDI0IC8qIDB4ZTdkM2ZiYzggKi8gKFRfTUFTSyBeIDB4MTgyYzA0MzcpCisjZGVmaW5lIFQyNSAgICAweDIxZTFjZGU2CisjZGVmaW5lIFQyNiAvKiAweGMzMzcwN2Q2ICovIChUX01BU0sgXiAweDNjYzhmODI5KQorI2RlZmluZSBUMjcgLyogMHhmNGQ1MGQ4NyAqLyAoVF9NQVNLIF4gMHgwYjJhZjI3OCkKKyNkZWZpbmUgVDI4ICAgIDB4NDU1YTE0ZWQKKyNkZWZpbmUgVDI5IC8qIDB4YTllM2U5MDUgKi8gKFRfTUFTSyBeIDB4NTYxYzE2ZmEpCisjZGVmaW5lIFQzMCAvKiAweGZjZWZhM2Y4ICovIChUX01BU0sgXiAweDAzMTA1YzA3KQorI2RlZmluZSBUMzEgICAgMHg2NzZmMDJkOQorI2RlZmluZSBUMzIgLyogMHg4ZDJhNGM4YSAqLyAoVF9NQVNLIF4gMHg3MmQ1YjM3NSkKKyNkZWZpbmUgVDMzIC8qIDB4ZmZmYTM5NDIgKi8gKFRfTUFTSyBeIDB4MDAwNWM2YmQpCisjZGVmaW5lIFQzNCAvKiAweDg3NzFmNjgxICovIChUX01BU0sgXiAweDc4OGUwOTdlKQorI2RlZmluZSBUMzUgICAgMHg2ZDlkNjEyMgorI2RlZmluZSBUMzYgLyogMHhmZGU1MzgwYyAqLyAoVF9NQVNLIF4gMHgwMjFhYzdmMykKKyNkZWZpbmUgVDM3IC8qIDB4YTRiZWVhNDQgKi8gKFRfTUFTSyBeIDB4NWI0MTE1YmIpCisjZGVmaW5lIFQzOCAgICAweDRiZGVjZmE5CisjZGVmaW5lIFQzOSAvKiAweGY2YmI0YjYwICovIChUX01BU0sgXiAweDA5NDRiNDlmKQorI2RlZmluZSBUNDAgLyogMHhiZWJmYmM3MCAqLyAoVF9NQVNLIF4gMHg0MTQwNDM4ZikKKyNkZWZpbmUgVDQxICAgIDB4Mjg5YjdlYzYKKyNkZWZpbmUgVDQyIC8qIDB4ZWFhMTI3ZmEgKi8gKFRfTUFTSyBeIDB4MTU1ZWQ4MDUpCisjZGVmaW5lIFQ0MyAvKiAweGQ0ZWYzMDg1ICovIChUX01BU0sgXiAweDJiMTBjZjdhKQorI2RlZmluZSBUNDQgICAgMHgwNDg4MWQwNQorI2RlZmluZSBUNDUgLyogMHhkOWQ0ZDAzOSAqLyAoVF9NQVNLIF4gMHgyNjJiMmZjNikKKyNkZWZpbmUgVDQ2IC8qIDB4ZTZkYjk5ZTUgKi8gKFRfTUFTSyBeIDB4MTkyNDY2MWEpCisjZGVmaW5lIFQ0NyAgICAweDFmYTI3Y2Y4CisjZGVmaW5lIFQ0OCAvKiAweGM0YWM1NjY1ICovIChUX01BU0sgXiAweDNiNTNhOTlhKQorI2RlZmluZSBUNDkgLyogMHhmNDI5MjI0NCAqLyAoVF9NQVNLIF4gMHgwYmQ2ZGRiYikKKyNkZWZpbmUgVDUwICAgIDB4NDMyYWZmOTcKKyNkZWZpbmUgVDUxIC8qIDB4YWI5NDIzYTcgKi8gKFRfTUFTSyBeIDB4NTQ2YmRjNTgpCisjZGVmaW5lIFQ1MiAvKiAweGZjOTNhMDM5ICovIChUX01BU0sgXiAweDAzNmM1ZmM2KQorI2RlZmluZSBUNTMgICAgMHg2NTViNTljMworI2RlZmluZSBUNTQgLyogMHg4ZjBjY2M5MiAqLyAoVF9NQVNLIF4gMHg3MGYzMzM2ZCkKKyNkZWZpbmUgVDU1IC8qIDB4ZmZlZmY0N2QgKi8gKFRfTUFTSyBeIDB4MDAxMDBiODIpCisjZGVmaW5lIFQ1NiAvKiAweDg1ODQ1ZGQxICovIChUX01BU0sgXiAweDdhN2JhMjJlKQorI2RlZmluZSBUNTcgICAgMHg2ZmE4N2U0ZgorI2RlZmluZSBUNTggLyogMHhmZTJjZTZlMCAqLyAoVF9NQVNLIF4gMHgwMWQzMTkxZikKKyNkZWZpbmUgVDU5IC8qIDB4YTMwMTQzMTQgKi8gKFRfTUFTSyBeIDB4NWNmZWJjZWIpCisjZGVmaW5lIFQ2MCAgICAweDRlMDgxMWExCisjZGVmaW5lIFQ2MSAvKiAweGY3NTM3ZTgyICovIChUX01BU0sgXiAweDA4YWM4MTdkKQorI2RlZmluZSBUNjIgLyogMHhiZDNhZjIzNSAqLyAoVF9NQVNLIF4gMHg0MmM1MGRjYSkKKyNkZWZpbmUgVDYzICAgIDB4MmFkN2QyYmIKKyNkZWZpbmUgVDY0IC8qIDB4ZWI4NmQzOTEgKi8gKFRfTUFTSyBeIDB4MTQ3OTJjNmUpCisKKworc3RhdGljIHZvaWQKK21kNV9wcm9jZXNzKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEgLypbNjRdKi8pCit7CisgICAgbWQ1X3dvcmRfdAorCWEgPSBwbXMtPmFiY2RbMF0sIGIgPSBwbXMtPmFiY2RbMV0sCisJYyA9IHBtcy0+YWJjZFsyXSwgZCA9IHBtcy0+YWJjZFszXTsKKyAgICBtZDVfd29yZF90IHQ7CisjaWYgQllURV9PUkRFUiA+IDAKKyAgICAvKiBEZWZpbmUgc3RvcmFnZSBvbmx5IGZvciBiaWctZW5kaWFuIENQVXMuICovCisgICAgbWQ1X3dvcmRfdCBYWzE2XTsKKyNlbHNlCisgICAgLyogRGVmaW5lIHN0b3JhZ2UgZm9yIGxpdHRsZS1lbmRpYW4gb3IgYm90aCB0eXBlcyBvZiBDUFVzLiAqLworICAgIG1kNV93b3JkX3QgeGJ1ZlsxNl07CisgICAgY29uc3QgbWQ1X3dvcmRfdCAqWDsKKyNlbmRpZgorCisgICAgeworI2lmIEJZVEVfT1JERVIgPT0gMAorCS8qCisJICogRGV0ZXJtaW5lIGR5bmFtaWNhbGx5IHdoZXRoZXIgdGhpcyBpcyBhIGJpZy1lbmRpYW4gb3IKKwkgKiBsaXR0bGUtZW5kaWFuIG1hY2hpbmUsIHNpbmNlIHdlIGNhbiB1c2UgYSBtb3JlIGVmZmljaWVudAorCSAqIGFsZ29yaXRobSBvbiB0aGUgbGF0dGVyLgorCSAqLworCXN0YXRpYyBjb25zdCBpbnQgdyA9IDE7CisKKwlpZiAoKigoY29uc3QgbWQ1X2J5dGVfdCAqKSZ3KSkgLyogZHluYW1pYyBsaXR0bGUtZW5kaWFuICovCisjZW5kaWYKKyNpZiBCWVRFX09SREVSIDw9IDAJCS8qIGxpdHRsZS1lbmRpYW4gKi8KKwl7CisJICAgIC8qCisJICAgICAqIE9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMsIHdlIGNhbiBwcm9jZXNzIHByb3Blcmx5IGFsaWduZWQKKwkgICAgICogZGF0YSB3aXRob3V0IGNvcHlpbmcgaXQuCisJICAgICAqLworCSAgICBpZiAoISgoZGF0YSAtIChjb25zdCBtZDVfYnl0ZV90ICopMCkgJiAzKSkgeworCQkvKiBkYXRhIGFyZSBwcm9wZXJseSBhbGlnbmVkICovCisJCVggPSAoY29uc3QgbWQ1X3dvcmRfdCAqKWRhdGE7CisJICAgIH0gZWxzZSB7CisJCS8qIG5vdCBhbGlnbmVkICovCisJCW1lbWNweSh4YnVmLCBkYXRhLCA2NCk7CisJCVggPSB4YnVmOworCSAgICB9CisJfQorI2VuZGlmCisjaWYgQllURV9PUkRFUiA9PSAwCisJZWxzZQkJCS8qIGR5bmFtaWMgYmlnLWVuZGlhbiAqLworI2VuZGlmCisjaWYgQllURV9PUkRFUiA+PSAwCQkvKiBiaWctZW5kaWFuICovCisJeworCSAgICAvKgorCSAgICAgKiBPbiBiaWctZW5kaWFuIG1hY2hpbmVzLCB3ZSBtdXN0IGFycmFuZ2UgdGhlIGJ5dGVzIGluIHRoZQorCSAgICAgKiByaWdodCBvcmRlci4KKwkgICAgICovCisJICAgIGNvbnN0IG1kNV9ieXRlX3QgKnhwID0gZGF0YTsKKwkgICAgaW50IGk7CisKKyMgIGlmIEJZVEVfT1JERVIgPT0gMAorCSAgICBYID0geGJ1ZjsJCS8qIChkeW5hbWljIG9ubHkpICovCisjICBlbHNlCisjICAgIGRlZmluZSB4YnVmIFgJCS8qIChzdGF0aWMgb25seSkgKi8KKyMgIGVuZGlmCisJICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpLCB4cCArPSA0KQorCQl4YnVmW2ldID0geHBbMF0gKyAoeHBbMV0gPDwgOCkgKyAoeHBbMl0gPDwgMTYpICsgKHhwWzNdIDw8IDI0KTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyNkZWZpbmUgUk9UQVRFX0xFRlQoeCwgbikgKCgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDMyIC0gKG4pKSkpCisKKyAgICAvKiBSb3VuZCAxLiAqLworICAgIC8qIExldCBbYWJjZCBrIHMgaV0gZGVub3RlIHRoZSBvcGVyYXRpb24KKyAgICAgICBhID0gYiArICgoYSArIEYoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KKyNkZWZpbmUgRih4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAofih4KSAmICh6KSkpCisjZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCisgIHQgPSBhICsgRihiLGMsZCkgKyBYW2tdICsgVGk7XAorICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCisgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLworICAgIFNFVChhLCBiLCBjLCBkLCAgMCwgIDcsICBUMSk7CisgICAgU0VUKGQsIGEsIGIsIGMsICAxLCAxMiwgIFQyKTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDIsIDE3LCAgVDMpOworICAgIFNFVChiLCBjLCBkLCBhLCAgMywgMjIsICBUNCk7CisgICAgU0VUKGEsIGIsIGMsIGQsICA0LCAgNywgIFQ1KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDUsIDEyLCAgVDYpOworICAgIFNFVChjLCBkLCBhLCBiLCAgNiwgMTcsICBUNyk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA3LCAyMiwgIFQ4KTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDgsICA3LCAgVDkpOworICAgIFNFVChkLCBhLCBiLCBjLCAgOSwgMTIsIFQxMCk7CisgICAgU0VUKGMsIGQsIGEsIGIsIDEwLCAxNywgVDExKTsKKyAgICBTRVQoYiwgYywgZCwgYSwgMTEsIDIyLCBUMTIpOworICAgIFNFVChhLCBiLCBjLCBkLCAxMiwgIDcsIFQxMyk7CisgICAgU0VUKGQsIGEsIGIsIGMsIDEzLCAxMiwgVDE0KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTQsIDE3LCBUMTUpOworICAgIFNFVChiLCBjLCBkLCBhLCAxNSwgMjIsIFQxNik7CisjdW5kZWYgU0VUCisKKyAgICAgLyogUm91bmQgMi4gKi8KKyAgICAgLyogTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgorICAgICAgICAgIGEgPSBiICsgKChhICsgRyhiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLworI2RlZmluZSBHKHgsIHksIHopICgoKHgpICYgKHopKSB8ICgoeSkgJiB+KHopKSkKKyNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKKyAgdCA9IGEgKyBHKGIsYyxkKSArIFhba10gKyBUaTtcCisgIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKKyAgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLworICAgIFNFVChhLCBiLCBjLCBkLCAgMSwgIDUsIFQxNyk7CisgICAgU0VUKGQsIGEsIGIsIGMsICA2LCAgOSwgVDE4KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTEsIDE0LCBUMTkpOworICAgIFNFVChiLCBjLCBkLCBhLCAgMCwgMjAsIFQyMCk7CisgICAgU0VUKGEsIGIsIGMsIGQsICA1LCAgNSwgVDIxKTsKKyAgICBTRVQoZCwgYSwgYiwgYywgMTAsICA5LCBUMjIpOworICAgIFNFVChjLCBkLCBhLCBiLCAxNSwgMTQsIFQyMyk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA0LCAyMCwgVDI0KTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDksICA1LCBUMjUpOworICAgIFNFVChkLCBhLCBiLCBjLCAxNCwgIDksIFQyNik7CisgICAgU0VUKGMsIGQsIGEsIGIsICAzLCAxNCwgVDI3KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDgsIDIwLCBUMjgpOworICAgIFNFVChhLCBiLCBjLCBkLCAxMywgIDUsIFQyOSk7CisgICAgU0VUKGQsIGEsIGIsIGMsICAyLCAgOSwgVDMwKTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDcsIDE0LCBUMzEpOworICAgIFNFVChiLCBjLCBkLCBhLCAxMiwgMjAsIFQzMik7CisjdW5kZWYgU0VUCisKKyAgICAgLyogUm91bmQgMy4gKi8KKyAgICAgLyogTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgorICAgICAgICAgIGEgPSBiICsgKChhICsgSChiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLworI2RlZmluZSBIKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCisjZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCisgIHQgPSBhICsgSChiLGMsZCkgKyBYW2tdICsgVGk7XAorICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCisgICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KKyAgICBTRVQoYSwgYiwgYywgZCwgIDUsICA0LCBUMzMpOworICAgIFNFVChkLCBhLCBiLCBjLCAgOCwgMTEsIFQzNCk7CisgICAgU0VUKGMsIGQsIGEsIGIsIDExLCAxNiwgVDM1KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgMTQsIDIzLCBUMzYpOworICAgIFNFVChhLCBiLCBjLCBkLCAgMSwgIDQsIFQzNyk7CisgICAgU0VUKGQsIGEsIGIsIGMsICA0LCAxMSwgVDM4KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDcsIDE2LCBUMzkpOworICAgIFNFVChiLCBjLCBkLCBhLCAxMCwgMjMsIFQ0MCk7CisgICAgU0VUKGEsIGIsIGMsIGQsIDEzLCAgNCwgVDQxKTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDAsIDExLCBUNDIpOworICAgIFNFVChjLCBkLCBhLCBiLCAgMywgMTYsIFQ0Myk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA2LCAyMywgVDQ0KTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDksICA0LCBUNDUpOworICAgIFNFVChkLCBhLCBiLCBjLCAxMiwgMTEsIFQ0Nik7CisgICAgU0VUKGMsIGQsIGEsIGIsIDE1LCAxNiwgVDQ3KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDIsIDIzLCBUNDgpOworI3VuZGVmIFNFVAorCisgICAgIC8qIFJvdW5kIDQuICovCisgICAgIC8qIExldCBbYWJjZCBrIHMgdF0gZGVub3RlIHRoZSBvcGVyYXRpb24KKyAgICAgICAgICBhID0gYiArICgoYSArIEkoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KKyNkZWZpbmUgSSh4LCB5LCB6KSAoKHkpIF4gKCh4KSB8IH4oeikpKQorI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAorICB0ID0gYSArIEkoYixjLGQpICsgWFtrXSArIFRpO1wKKyAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgorICAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCisgICAgU0VUKGEsIGIsIGMsIGQsICAwLCAgNiwgVDQ5KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDcsIDEwLCBUNTApOworICAgIFNFVChjLCBkLCBhLCBiLCAxNCwgMTUsIFQ1MSk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA1LCAyMSwgVDUyKTsKKyAgICBTRVQoYSwgYiwgYywgZCwgMTIsICA2LCBUNTMpOworICAgIFNFVChkLCBhLCBiLCBjLCAgMywgMTAsIFQ1NCk7CisgICAgU0VUKGMsIGQsIGEsIGIsIDEwLCAxNSwgVDU1KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDEsIDIxLCBUNTYpOworICAgIFNFVChhLCBiLCBjLCBkLCAgOCwgIDYsIFQ1Nyk7CisgICAgU0VUKGQsIGEsIGIsIGMsIDE1LCAxMCwgVDU4KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDYsIDE1LCBUNTkpOworICAgIFNFVChiLCBjLCBkLCBhLCAxMywgMjEsIFQ2MCk7CisgICAgU0VUKGEsIGIsIGMsIGQsICA0LCAgNiwgVDYxKTsKKyAgICBTRVQoZCwgYSwgYiwgYywgMTEsIDEwLCBUNjIpOworICAgIFNFVChjLCBkLCBhLCBiLCAgMiwgMTUsIFQ2Myk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA5LCAyMSwgVDY0KTsKKyN1bmRlZiBTRVQKKworICAgICAvKiBUaGVuIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMuIChUaGF0IGlzIGluY3JlbWVudCBlYWNoCisgICAgICAgIG9mIHRoZSBmb3VyIHJlZ2lzdGVycyBieSB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSB0aGlzIGJsb2NrCisgICAgICAgIHdhcyBzdGFydGVkLikgKi8KKyAgICBwbXMtPmFiY2RbMF0gKz0gYTsKKyAgICBwbXMtPmFiY2RbMV0gKz0gYjsKKyAgICBwbXMtPmFiY2RbMl0gKz0gYzsKKyAgICBwbXMtPmFiY2RbM10gKz0gZDsKK30KKwordm9pZAorbWQ1X2luaXQobWQ1X3N0YXRlX3QgKnBtcykKK3sKKyAgICBwbXMtPmNvdW50WzBdID0gcG1zLT5jb3VudFsxXSA9IDA7CisgICAgcG1zLT5hYmNkWzBdID0gMHg2NzQ1MjMwMTsKKyAgICBwbXMtPmFiY2RbMV0gPSAvKjB4ZWZjZGFiODkqLyBUX01BU0sgXiAweDEwMzI1NDc2OworICAgIHBtcy0+YWJjZFsyXSA9IC8qMHg5OGJhZGNmZSovIFRfTUFTSyBeIDB4Njc0NTIzMDE7CisgICAgcG1zLT5hYmNkWzNdID0gMHgxMDMyNTQ3NjsKK30KKwordm9pZAorbWQ1X2FwcGVuZChtZDVfc3RhdGVfdCAqcG1zLCBjb25zdCBtZDVfYnl0ZV90ICpkYXRhLCBpbnQgbmJ5dGVzKQoreworICAgIGNvbnN0IG1kNV9ieXRlX3QgKnAgPSBkYXRhOworICAgIGludCBsZWZ0ID0gbmJ5dGVzOworICAgIGludCBvZmZzZXQgPSAocG1zLT5jb3VudFswXSA+PiAzKSAmIDYzOworICAgIG1kNV93b3JkX3QgbmJpdHMgPSAobWQ1X3dvcmRfdCkobmJ5dGVzIDw8IDMpOworCisgICAgaWYgKG5ieXRlcyA8PSAwKQorCXJldHVybjsKKworICAgIC8qIFVwZGF0ZSB0aGUgbWVzc2FnZSBsZW5ndGguICovCisgICAgcG1zLT5jb3VudFsxXSArPSBuYnl0ZXMgPj4gMjk7CisgICAgcG1zLT5jb3VudFswXSArPSBuYml0czsKKyAgICBpZiAocG1zLT5jb3VudFswXSA8IG5iaXRzKQorCXBtcy0+Y291bnRbMV0rKzsKKworICAgIC8qIFByb2Nlc3MgYW4gaW5pdGlhbCBwYXJ0aWFsIGJsb2NrLiAqLworICAgIGlmIChvZmZzZXQpIHsKKwlpbnQgY29weSA9IChvZmZzZXQgKyBuYnl0ZXMgPiA2NCA/IDY0IC0gb2Zmc2V0IDogbmJ5dGVzKTsKKworCW1lbWNweShwbXMtPmJ1ZiArIG9mZnNldCwgcCwgY29weSk7CisJaWYgKG9mZnNldCArIGNvcHkgPCA2NCkKKwkgICAgcmV0dXJuOworCXAgKz0gY29weTsKKwlsZWZ0IC09IGNvcHk7CisJbWQ1X3Byb2Nlc3MocG1zLCBwbXMtPmJ1Zik7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBmdWxsIGJsb2Nrcy4gKi8KKyAgICBmb3IgKDsgbGVmdCA+PSA2NDsgcCArPSA2NCwgbGVmdCAtPSA2NCkKKwltZDVfcHJvY2VzcyhwbXMsIHApOworCisgICAgLyogUHJvY2VzcyBhIGZpbmFsIHBhcnRpYWwgYmxvY2suICovCisgICAgaWYgKGxlZnQpCisJbWVtY3B5KHBtcy0+YnVmLCBwLCBsZWZ0KTsKK30KKwordm9pZAorbWQ1X2ZpbmlzaChtZDVfc3RhdGVfdCAqcG1zLCBtZDVfYnl0ZV90IGRpZ2VzdFsxNl0pCit7CisgICAgc3RhdGljIGNvbnN0IG1kNV9ieXRlX3QgcGFkWzY0XSA9IHsKKwkweDgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCisgICAgfTsKKyAgICBtZDVfYnl0ZV90IGRhdGFbOF07CisgICAgaW50IGk7CisKKyAgICAvKiBTYXZlIHRoZSBsZW5ndGggYmVmb3JlIHBhZGRpbmcuICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwlkYXRhW2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+Y291bnRbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7CisgICAgLyogUGFkIHRvIDU2IGJ5dGVzIG1vZCA2NC4gKi8KKyAgICBtZDVfYXBwZW5kKHBtcywgcGFkLCAoKDU1IC0gKHBtcy0+Y291bnRbMF0gPj4gMykpICYgNjMpICsgMSk7CisgICAgLyogQXBwZW5kIHRoZSBsZW5ndGguICovCisgICAgbWQ1X2FwcGVuZChwbXMsIGRhdGEsIDgpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQorCWRpZ2VzdFtpXSA9IChtZDVfYnl0ZV90KShwbXMtPmFiY2RbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL21kNS5oIGIvTW9kdWxlcy9tZDUuaAppbmRleCAxMzYyOGRmLi41ZWI2ZDZjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL21kNS5oCisrKyBiL01vZHVsZXMvbWQ1LmgKQEAgLTEsNjIgKzEsOTEgQEAKLS8qIE1ENS5IIC0gaGVhZGVyIGZpbGUgZm9yIE1ENUMuQworLyoKKyAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBMLiBQZXRlciBEZXV0c2NoCisgIGdob3N0QGFsYWRkaW4uY29tCisKKyAqLworLyogJElkJCAqLworLyoKKyAgSW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gb2YgTUQ1IChSRkMgMTMyMSkuCisKKyAgVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBBbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgMTMyMSwgd2hvc2UKKyAgdGV4dCBpcyBhdmFpbGFibGUgYXQKKwlodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAorICBUaGUgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIHRleHQgb2YgdGhlIFJGQywgaW5jbHVkaW5nIHRoZSB0ZXN0IHN1aXRlCisgIChzZWN0aW9uIEEuNSkgYnV0IGV4Y2x1ZGluZyB0aGUgcmVzdCBvZiBBcHBlbmRpeCBBLiAgSXQgZG9lcyBub3QgaW5jbHVkZQorICBhbnkgY29kZSBvciBkb2N1bWVudGF0aW9uIHRoYXQgaXMgaWRlbnRpZmllZCBpbiB0aGUgUkZDIGFzIGJlaW5nCisgIGNvcHlyaWdodGVkLgorCisgIFRoZSBvcmlnaW5hbCBhbmQgcHJpbmNpcGFsIGF1dGhvciBvZiBtZDUuaCBpcyBMLiBQZXRlciBEZXV0c2NoCisgIDxnaG9zdEBhbGFkZGluLmNvbT4uICBPdGhlciBhdXRob3JzIGFyZSBub3RlZCBpbiB0aGUgY2hhbmdlIGhpc3RvcnkKKyAgdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgorCisgIDIwMDItMDQtMTMgbHBkIFJlbW92ZWQgc3VwcG9ydCBmb3Igbm9uLUFOU0kgY29tcGlsZXJzOyByZW1vdmVkCisJcmVmZXJlbmNlcyB0byBHaG9zdHNjcmlwdDsgY2xhcmlmaWVkIGRlcml2YXRpb24gZnJvbSBSRkMgMTMyMTsKKwlub3cgaGFuZGxlcyBieXRlIG9yZGVyIGVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LgorICAxOTk5LTExLTA0IGxwZCBFZGl0ZWQgY29tbWVudHMgc2xpZ2h0bHkgZm9yIGF1dG9tYXRpYyBUT0MgZXh0cmFjdGlvbi4KKyAgMTk5OS0xMC0xOCBscGQgRml4ZWQgdHlwbyBpbiBoZWFkZXIgY29tbWVudCAoYW5zaTJrbnIgcmF0aGVyIHRoYW4gbWQ1KTsKKwlhZGRlZCBjb25kaXRpb25hbGl6YXRpb24gZm9yIEMrKyBjb21waWxhdGlvbiBmcm9tIE1hcnRpbgorCVB1cnNjaGtlIDxwdXJzY2hrZUBibmwuZ292Pi4KKyAgMTk5OS0wNS0wMyBscGQgT3JpZ2luYWwgdmVyc2lvbi4KICAqLwogCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEtMiwgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gQ3JlYXRlZCAxOTkxLiBBbGwKLXJpZ2h0cyByZXNlcnZlZC4KKyNpZm5kZWYgbWQ1X0lOQ0xVREVECisjICBkZWZpbmUgbWQ1X0lOQ0xVREVECiAKLUxpY2Vuc2UgdG8gY29weSBhbmQgdXNlIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGF0IGl0Ci1pcyBpZGVudGlmaWVkIGFzIHRoZSAiUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0Ci1BbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbCBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoaXMgc29mdHdhcmUKLW9yIHRoaXMgZnVuY3Rpb24uCi0KLUxpY2Vuc2UgaXMgYWxzbyBncmFudGVkIHRvIG1ha2UgYW5kIHVzZSBkZXJpdmF0aXZlIHdvcmtzIHByb3ZpZGVkCi10aGF0IHN1Y2ggd29ya3MgYXJlIGlkZW50aWZpZWQgYXMgImRlcml2ZWQgZnJvbSB0aGUgUlNBIERhdGEKLVNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbAotbWVudGlvbmluZyBvciByZWZlcmVuY2luZyB0aGUgZGVyaXZlZCB3b3JrLgotCi1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgY29uY2VybmluZyBlaXRoZXIKLXRoZSBtZXJjaGFudGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBvciB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcwotc29mdHdhcmUgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLXdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5IG9mIGFueSBraW5kLgotCi1UaGVzZSBub3RpY2VzIG11c3QgYmUgcmV0YWluZWQgaW4gYW55IGNvcGllcyBvZiBhbnkgcGFydCBvZiB0aGlzCi1kb2N1bWVudGF0aW9uIGFuZC9vciBzb2Z0d2FyZS4KKy8qCisgKiBUaGlzIHBhY2thZ2Ugc3VwcG9ydHMgYm90aCBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lIGRldGVybWluYXRpb24gb2YgQ1BVCisgKiBieXRlIG9yZGVyLiAgSWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIGRlZmluZWQgYXMgMCwgdGhlIGNvZGUgd2lsbCBiZQorICogY29tcGlsZWQgdG8gcnVuIG9ubHkgb24gbGl0dGxlLWVuZGlhbiBDUFVzOyBpZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMKKyAqIGRlZmluZWQgYXMgbm9uLXplcm8sIHRoZSBjb2RlIHdpbGwgYmUgY29tcGlsZWQgdG8gcnVuIG9ubHkgb24gYmlnLWVuZGlhbgorICogQ1BVczsgaWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIG5vdCBkZWZpbmVkLCB0aGUgY29kZSB3aWxsIGJlIGNvbXBpbGVkIHRvCisgKiBydW4gb24gZWl0aGVyIGJpZy0gb3IgbGl0dGxlLWVuZGlhbiBDUFVzLCBidXQgd2lsbCBydW4gc2xpZ2h0bHkgbGVzcworICogZWZmaWNpZW50bHkgb24gZWl0aGVyIG9uZSB0aGFuIGlmIEFSQ0hfSVNfQklHX0VORElBTiBpcyBkZWZpbmVkLgogICovCiAKLS8qID09PT09PT09PT0gaW5jbHVkZSBnbG9iYWwuaCA9PT09PT09PT09ICovCi0vKiBHTE9CQUwuSCAtIFJTQVJFRiB0eXBlcyBhbmQgY29uc3RhbnRzCi0gKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBtZDVfYnl0ZV90OyAvKiA4LWJpdCBieXRlICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBtZDVfd29yZF90OyAvKiAzMi1iaXQgd29yZCAqLwogCi0vKiBQT0lOVEVSIGRlZmluZXMgYSBnZW5lcmljIHBvaW50ZXIgdHlwZSAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICpQT0lOVEVSOworLyogRGVmaW5lIHRoZSBzdGF0ZSBvZiB0aGUgTUQ1IEFsZ29yaXRobS4gKi8KK3R5cGVkZWYgc3RydWN0IG1kNV9zdGF0ZV9zIHsKKyAgICBtZDVfd29yZF90IGNvdW50WzJdOwkvKiBtZXNzYWdlIGxlbmd0aCBpbiBiaXRzLCBsc3cgZmlyc3QgKi8KKyAgICBtZDVfd29yZF90IGFiY2RbNF07CQkvKiBkaWdlc3QgYnVmZmVyICovCisgICAgbWQ1X2J5dGVfdCBidWZbNjRdOwkJLyogYWNjdW11bGF0ZSBibG9jayAqLworfSBtZDVfc3RhdGVfdDsKIAotLyogVUlOVDQgZGVmaW5lcyBhIGZvdXIgYnl0ZSB3b3JkICovCi0jaWYgU0laRU9GX0xPTkcgPT0gNAotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBVSU5UNDsKLSNlbGlmIFNJWkVPRl9TSE9SVCA9PSA0Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBVSU5UNDsKLSNlbGlmIElOVF9NQVggPT0gMjE0NzQ4MzY0NwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDQ7Ci0jZWxzZQotI2Vycm9yICJDYW4ndCBmaW5kIGEgNC1ieXRlIGludGVncmFsIHR5cGUiCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgCit7CiAjZW5kaWYKIAotLyogPT09PT09PT09PSBFbmQgZ2xvYmFsLmg7IGNvbnRpbnVlIG1kNS5oID09PT09PT09PT0gKi8KKy8qIEluaXRpYWxpemUgdGhlIGFsZ29yaXRobS4gKi8KK3ZvaWQgbWQ1X2luaXQobWQ1X3N0YXRlX3QgKnBtcyk7CiAKLS8qIE1ENSBjb250ZXh0LiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVJTlQ0IHN0YXRlWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhdGUgKEFCQ0QpICovCi0gICAgVUlOVDQgY291bnRbMl07ICAgICAgICAvKiBudW1iZXIgb2YgYml0cywgbW9kdWxvIDJeNjQgKGxzYiBmaXJzdCkgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls2NF07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IGJ1ZmZlciAqLwotfSBNRDVfQ1RYOworLyogQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSBtZXNzYWdlLiAqLwordm9pZCBtZDVfYXBwZW5kKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEsIGludCBuYnl0ZXMpOwogCi0vKiBSZW5hbWUgYWxsIGV4cG9ydGVkIHN5bWJvbHMgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggc2ltaWxhcmx5IG5hbWVkCi0gICBzeW1ib2xzIGluIHNvbWUgc3lzdGVtcycgc3RhbmRhcmQgQyBsaWJyYXJpZXMuLi4gKi8KKy8qIEZpbmlzaCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBkaWdlc3QuICovCit2b2lkIG1kNV9maW5pc2gobWQ1X3N0YXRlX3QgKnBtcywgbWQ1X2J5dGVfdCBkaWdlc3RbMTZdKTsKIAotI2RlZmluZSBNRDVJbml0IF9QeV9NRDVJbml0Ci0jZGVmaW5lIE1ENVVwZGF0ZSBfUHlfTUQ1VXBkYXRlCi0jZGVmaW5lIE1ENUZpbmFsIF9QeV9NRDVGaW5hbAorI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvKiBlbmQgZXh0ZXJuICJDIiAqLworI2VuZGlmCiAKLXZvaWQgTUQ1SW5pdChNRDVfQ1RYICopOwotdm9pZCBNRDVVcGRhdGUoTUQ1X0NUWCAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCk7Ci12b2lkIE1ENUZpbmFsKHVuc2lnbmVkIGNoYXIgWzE2XSwgTUQ1X0NUWCAqKTsKKyNlbmRpZiAvKiBtZDVfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvbWQ1Yy5jIGIvTW9kdWxlcy9tZDVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOGRmZGIuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9tZDVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyogTUQ1Qy5DIC0gUlNBIERhdGEgU2VjdXJpdHksIEluYy4sIE1ENSBtZXNzYWdlLWRpZ2VzdCBhbGdvcml0aG0KLSAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEtMiwgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gQ3JlYXRlZCAxOTkxLiBBbGwKLXJpZ2h0cyByZXNlcnZlZC4KLQotTGljZW5zZSB0byBjb3B5IGFuZCB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIHByb3ZpZGVkIHRoYXQgaXQKLWlzIGlkZW50aWZpZWQgYXMgdGhlICJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QKLUFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhpcyBzb2Z0d2FyZQotb3IgdGhpcyBmdW5jdGlvbi4KLQotTGljZW5zZSBpcyBhbHNvIGdyYW50ZWQgdG8gbWFrZSBhbmQgdXNlIGRlcml2YXRpdmUgd29ya3MgcHJvdmlkZWQKLXRoYXQgc3VjaCB3b3JrcyBhcmUgaWRlbnRpZmllZCBhcyAiZGVyaXZlZCBmcm9tIHRoZSBSU0EgRGF0YQotU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsCi1tZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoZSBkZXJpdmVkIHdvcmsuCi0KLVJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBjb25jZXJuaW5nIGVpdGhlcgotdGhlIG1lcmNoYW50YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIG9yIHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzCi1zb2Z0d2FyZSBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgotd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkgb2YgYW55IGtpbmQuCi0KLVRoZXNlIG5vdGljZXMgbXVzdCBiZSByZXRhaW5lZCBpbiBhbnkgY29waWVzIG9mIGFueSBwYXJ0IG9mIHRoaXMKLWRvY3VtZW50YXRpb24gYW5kL29yIHNvZnR3YXJlLgotICovCi0KLSNpbmNsdWRlICJQeXRob24uaCIKLSNpbmNsdWRlICJtZDUuaCIKLQotLyogQ29uc3RhbnRzIGZvciBNRDVUcmFuc2Zvcm0gcm91dGluZS4gKi8KLQotI2RlZmluZSBTMTEgNwotI2RlZmluZSBTMTIgMTIKLSNkZWZpbmUgUzEzIDE3Ci0jZGVmaW5lIFMxNCAyMgotI2RlZmluZSBTMjEgNQotI2RlZmluZSBTMjIgOQotI2RlZmluZSBTMjMgMTQKLSNkZWZpbmUgUzI0IDIwCi0jZGVmaW5lIFMzMSA0Ci0jZGVmaW5lIFMzMiAxMQotI2RlZmluZSBTMzMgMTYKLSNkZWZpbmUgUzM0IDIzCi0jZGVmaW5lIFM0MSA2Ci0jZGVmaW5lIFM0MiAxMAotI2RlZmluZSBTNDMgMTUKLSNkZWZpbmUgUzQ0IDIxCi0KLXN0YXRpYyB2b2lkIE1ENVRyYW5zZm9ybShVSU5UNFs0XSwgdW5zaWduZWQgY2hhcls2NF0pOwotCi0KLS8qIEVuY29kZXMgaW5wdXQgKFVJTlQ0KSBpbnRvIG91dHB1dCAodW5zaWduZWQgY2hhcikuIEFzc3VtZXMgbGVuIGlzCi0gICBhIG11bHRpcGxlIG9mIDQuCi0gKi8KLXN0YXRpYyB2b2lkCi1FbmNvZGUodW5zaWduZWQgY2hhciAqb3V0cHV0LCBVSU5UNCAqaW5wdXQsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0gICAgdW5zaWduZWQgaW50IGksIGo7Ci0KLSAgICBmb3IgKGkgPSAwLCBqID0gMDsgaiA8IGxlbjsgaSsrLCBqICs9IDQpIHsKLSAgICAgICAgb3V0cHV0W2pdID0gKHVuc2lnbmVkIGNoYXIpKGlucHV0W2ldICYgMHhmZik7Ci0gICAgICAgIG91dHB1dFtqKzFdID0gKHVuc2lnbmVkIGNoYXIpKChpbnB1dFtpXSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICBvdXRwdXRbaisyXSA9ICh1bnNpZ25lZCBjaGFyKSgoaW5wdXRbaV0gPj4gMTYpICYgMHhmZik7Ci0gICAgICAgIG91dHB1dFtqKzNdID0gKHVuc2lnbmVkIGNoYXIpKChpbnB1dFtpXSA+PiAyNCkgJiAweGZmKTsKLSAgICB9Ci19Ci0KLQotLyogRGVjb2RlcyBpbnB1dCAodW5zaWduZWQgY2hhcikgaW50byBvdXRwdXQgKFVJTlQ0KS4gQXNzdW1lcyBsZW4gaXMKLSAgIGEgbXVsdGlwbGUgb2YgNC4KLSAqLwotc3RhdGljIHZvaWQKLURlY29kZShVSU5UNCAqb3V0cHV0LCB1bnNpZ25lZCBjaGFyICppbnB1dCwgdW5zaWduZWQgaW50IGxlbikKLXsKLSAgICB1bnNpZ25lZCBpbnQgaSwgajsKLQotICAgIGZvciAoaSA9IDAsIGogPSAwOyBqIDwgbGVuOyBpKyssIGogKz0gNCkgewotICAgICAgICBvdXRwdXRbaV0gPSAoKFVJTlQ0KWlucHV0W2pdKSB8ICgoKFVJTlQ0KWlucHV0W2orMV0pIDw8IDgpIHwKLSAgICAgICAgICAgICgoKFVJTlQ0KWlucHV0W2orMl0pIDw8IDE2KSB8ICgoKFVJTlQ0KWlucHV0W2orM10pIDw8IDI0KTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgUEFERElOR1s2NF0gPSB7Ci0gICAgMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLX07Ci0KLS8qIEYsIEcsIEggYW5kIEkgYXJlIGJhc2ljIE1ENSBmdW5jdGlvbnMuICovCi0jZGVmaW5lIEYoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKCh+eCkgJiAoeikpKQotI2RlZmluZSBHKHgsIHksIHopICgoKHgpICYgKHopKSB8ICgoeSkgJiAofnopKSkKLSNkZWZpbmUgSCh4LCB5LCB6KSAoKHgpIF4gKHkpIF4gKHopKQotI2RlZmluZSBJKHgsIHksIHopICgoeSkgXiAoKHgpIHwgKH56KSkpCi0KLS8qIFJPVEFURV9MRUZUIHJvdGF0ZXMgeCBsZWZ0IG4gYml0cy4gKi8KLSNkZWZpbmUgUk9UQVRFX0xFRlQoeCwgbikgKCgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDMyLShuKSkpKQotCi0vKiBGRiwgR0csIEhILCBhbmQgSUkgdHJhbnNmb3JtYXRpb25zIGZvciByb3VuZHMgMSwgMiwgMywgYW5kIDQuCi0gICBSb3RhdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGFkZGl0aW9uIHRvIHByZXZlbnQgcmVjb21wdXRhdGlvbi4KLSAqLwotI2RlZmluZSBGRihhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyBcCi0gICAgIChhKSArPSBGICgoYiksIChjKSwgKGQpKSArICh4KSArIChVSU5UNCkoYWMpOyBcCi0gICAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKLSAgICAgKGEpICs9IChiKTsgXAotICAgIH0KLSNkZWZpbmUgR0coYSwgYiwgYywgZCwgeCwgcywgYWMpIHsgXAotICAgICAoYSkgKz0gRyAoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAoVUlOVDQpKGFjKTsgXAotICAgICAoYSkgPSBST1RBVEVfTEVGVCAoKGEpLCAocykpOyBcCi0gICAgIChhKSArPSAoYik7IFwKLSAgICB9Ci0jZGVmaW5lIEhIKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7IFwKLSAgICAgKGEpICs9IEggKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKFVJTlQ0KShhYyk7IFwKLSAgICAgKGEpID0gUk9UQVRFX0xFRlQgKChhKSwgKHMpKTsgXAotICAgICAoYSkgKz0gKGIpOyBcCi0gICAgfQotI2RlZmluZSBJSShhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyBcCi0gICAgIChhKSArPSBJICgoYiksIChjKSwgKGQpKSArICh4KSArIChVSU5UNCkoYWMpOyBcCi0gICAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKLSAgICAgKGEpICs9IChiKTsgXAotICAgIH0KLQotCi0vKiBNRDUgaW5pdGlhbGl6YXRpb24uIEJlZ2lucyBhbiBNRDUgb3BlcmF0aW9uLCB3cml0aW5nIGEgbmV3IGNvbnRleHQuICovCi12b2lkCi1NRDVJbml0KE1ENV9DVFggKmNvbnRleHQpCi17Ci0gICAgY29udGV4dC0+Y291bnRbMF0gPSBjb250ZXh0LT5jb3VudFsxXSA9IDA7Ci0gICAgLyogTG9hZCBtYWdpYyBpbml0aWFsaXphdGlvbiBjb25zdGFudHMuICovCi0gICAgY29udGV4dC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOwotICAgIGNvbnRleHQtPnN0YXRlWzFdID0gMHhlZmNkYWI4OTsKLSAgICBjb250ZXh0LT5zdGF0ZVsyXSA9IDB4OThiYWRjZmU7Ci0gICAgY29udGV4dC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OwotfQotCi0KLS8qIE1ENSBibG9jayB1cGRhdGUgb3BlcmF0aW9uLiBDb250aW51ZXMgYW4gTUQ1IG1lc3NhZ2UtZGlnZXN0Ci0gICBvcGVyYXRpb24sIHByb2Nlc3NpbmcgYW5vdGhlciBtZXNzYWdlIGJsb2NrLCBhbmQgdXBkYXRpbmcgdGhlCi0gICBjb250ZXh0LgotICovCi12b2lkCi1NRDVVcGRhdGUoTUQ1X0NUWCAqY29udGV4dCwgdW5zaWduZWQgY2hhciAqaW5wdXQsIHVuc2lnbmVkIGludCBpbnB1dExlbikKLXsKLSAgICB1bnNpZ25lZCBpbnQgaSwgaW5kZXgsIHBhcnRMZW47Ci0KLSAgICAvKiBDb21wdXRlIG51bWJlciBvZiBieXRlcyBtb2QgNjQgKi8KLSAgICBpbmRleCA9ICh1bnNpZ25lZCBpbnQpKChjb250ZXh0LT5jb3VudFswXSA+PiAzKSAmIDB4M0YpOwotCi0gICAgLyogVXBkYXRlIG51bWJlciBvZiBiaXRzICovCi0gICAgaWYgKChjb250ZXh0LT5jb3VudFswXSArPSAoKFVJTlQ0KWlucHV0TGVuIDw8IDMpKQotICAgICAgICA8ICgoVUlOVDQpaW5wdXRMZW4gPDwgMykpCi0gICAgICAgIGNvbnRleHQtPmNvdW50WzFdKys7Ci0gICAgY29udGV4dC0+Y291bnRbMV0gKz0gKChVSU5UNClpbnB1dExlbiA+PiAyOSk7Ci0KLSAgICBwYXJ0TGVuID0gNjQgLSBpbmRleDsKLQotICAgIC8qIFRyYW5zZm9ybSBhcyBtYW55IHRpbWVzIGFzIHBvc3NpYmxlLiAqLwotICAgIGlmIChpbnB1dExlbiA+PSBwYXJ0TGVuKSB7Ci0gICAgICAgIG1lbWNweSgoUE9JTlRFUikmY29udGV4dC0+YnVmZmVyW2luZGV4XSwgKFBPSU5URVIpaW5wdXQsIHBhcnRMZW4pOwotICAgICAgICBNRDVUcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsIGNvbnRleHQtPmJ1ZmZlcik7Ci0KLSAgICAgICAgZm9yIChpID0gcGFydExlbjsgaSArIDYzIDwgaW5wdXRMZW47IGkgKz0gNjQpCi0gICAgICAgICAgICBNRDVUcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsICZpbnB1dFtpXSk7Ci0KLSAgICAgICAgaW5kZXggPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGkgPSAwOwotCi0gICAgLyogQnVmZmVyIHJlbWFpbmluZyBpbnB1dCAqLwotICAgIG1lbWNweSgoUE9JTlRFUikmY29udGV4dC0+YnVmZmVyW2luZGV4XSwKLSAgICAgICAgICAgICAgIChQT0lOVEVSKSZpbnB1dFtpXSwgaW5wdXRMZW4taSk7Ci19Ci0KLS8qIE1ENSBmaW5hbGl6YXRpb24uIEVuZHMgYW4gTUQ1IG1lc3NhZ2UtZGlnZXN0IG9wZXJhdGlvbiwgd3JpdGluZyB0aGUKLSAgbWVzc2FnZSBkaWdlc3QgYW5kIHplcm9pbmcgdGhlIGNvbnRleHQuCi0gKi8KLXZvaWQKLU1ENUZpbmFsKHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XSwgTUQ1X0NUWCAqY29udGV4dCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGJpdHNbOF07Ci0gICAgdW5zaWduZWQgaW50IGluZGV4LCBwYWRMZW47Ci0KLSAgICAvKiBTYXZlIG51bWJlciBvZiBiaXRzICovCi0gICAgRW5jb2RlIChiaXRzLCBjb250ZXh0LT5jb3VudCwgOCk7Ci0KLSAgICAvKiBQYWQgb3V0IHRvIDU2IG1vZCA2NC4gKi8KLSAgICBpbmRleCA9ICh1bnNpZ25lZCBpbnQpKChjb250ZXh0LT5jb3VudFswXSA+PiAzKSAmIDB4M2YpOwotICAgIHBhZExlbiA9IChpbmRleCA8IDU2KSA/ICg1NiAtIGluZGV4KSA6ICgxMjAgLSBpbmRleCk7Ci0gICAgTUQ1VXBkYXRlKGNvbnRleHQsIFBBRERJTkcsIHBhZExlbik7Ci0KLSAgICAvKiBBcHBlbmQgbGVuZ3RoIChiZWZvcmUgcGFkZGluZykgKi8KLSAgICBNRDVVcGRhdGUoY29udGV4dCwgYml0cywgOCk7Ci0KLSAgICAvKiBTdG9yZSBzdGF0ZSBpbiBkaWdlc3QgKi8KLSAgICBFbmNvZGUoZGlnZXN0LCBjb250ZXh0LT5zdGF0ZSwgMTYpOwotCi0gICAgLyogWmVyb2l6ZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uICovCi0gICAgbWVtc2V0KChQT0lOVEVSKWNvbnRleHQsIDAsIHNpemVvZiAoKmNvbnRleHQpKTsKLX0KLQotCi0vKiBNRDUgYmFzaWMgdHJhbnNmb3JtYXRpb24uIFRyYW5zZm9ybXMgc3RhdGUgYmFzZWQgb24gYmxvY2suICovCi1zdGF0aWMgdm9pZAotTUQ1VHJhbnNmb3JtKFVJTlQ0IHN0YXRlWzRdLCB1bnNpZ25lZCBjaGFyIGJsb2NrWzY0XSkKLXsKLSAgICBVSU5UNCBhID0gc3RhdGVbMF0sIGIgPSBzdGF0ZVsxXSwgYyA9IHN0YXRlWzJdLCBkID0gc3RhdGVbM10sIHhbMTZdOwotCi0gICAgRGVjb2RlICh4LCBibG9jaywgNjQpOwotCi0gICAgLyogUm91bmQgMSAqLwotICAgIEZGKGEsIGIsIGMsIGQsIHhbIDBdLCBTMTEsIDB4ZDc2YWE0NzgpOyAvKiAxICovCi0gICAgRkYoZCwgYSwgYiwgYywgeFsgMV0sIFMxMiwgMHhlOGM3Yjc1Nik7IC8qIDIgKi8KLSAgICBGRihjLCBkLCBhLCBiLCB4WyAyXSwgUzEzLCAweDI0MjA3MGRiKTsgLyogMyAqLwotICAgIEZGKGIsIGMsIGQsIGEsIHhbIDNdLCBTMTQsIDB4YzFiZGNlZWUpOyAvKiA0ICovCi0gICAgRkYoYSwgYiwgYywgZCwgeFsgNF0sIFMxMSwgMHhmNTdjMGZhZik7IC8qIDUgKi8KLSAgICBGRihkLCBhLCBiLCBjLCB4WyA1XSwgUzEyLCAweDQ3ODdjNjJhKTsgLyogNiAqLwotICAgIEZGKGMsIGQsIGEsIGIsIHhbIDZdLCBTMTMsIDB4YTgzMDQ2MTMpOyAvKiA3ICovCi0gICAgRkYoYiwgYywgZCwgYSwgeFsgN10sIFMxNCwgMHhmZDQ2OTUwMSk7IC8qIDggKi8KLSAgICBGRihhLCBiLCBjLCBkLCB4WyA4XSwgUzExLCAweDY5ODA5OGQ4KTsgLyogOSAqLwotICAgIEZGKGQsIGEsIGIsIGMsIHhbIDldLCBTMTIsIDB4OGI0NGY3YWYpOyAvKiAxMCAqLwotICAgIEZGKGMsIGQsIGEsIGIsIHhbMTBdLCBTMTMsIDB4ZmZmZjViYjEpOyAvKiAxMSAqLwotICAgIEZGKGIsIGMsIGQsIGEsIHhbMTFdLCBTMTQsIDB4ODk1Y2Q3YmUpOyAvKiAxMiAqLwotICAgIEZGKGEsIGIsIGMsIGQsIHhbMTJdLCBTMTEsIDB4NmI5MDExMjIpOyAvKiAxMyAqLwotICAgIEZGKGQsIGEsIGIsIGMsIHhbMTNdLCBTMTIsIDB4ZmQ5ODcxOTMpOyAvKiAxNCAqLwotICAgIEZGKGMsIGQsIGEsIGIsIHhbMTRdLCBTMTMsIDB4YTY3OTQzOGUpOyAvKiAxNSAqLwotICAgIEZGKGIsIGMsIGQsIGEsIHhbMTVdLCBTMTQsIDB4NDliNDA4MjEpOyAvKiAxNiAqLwotCi0gICAgLyogUm91bmQgMiAqLwotICAgIEdHKGEsIGIsIGMsIGQsIHhbIDFdLCBTMjEsIDB4ZjYxZTI1NjIpOyAvKiAxNyAqLwotICAgIEdHKGQsIGEsIGIsIGMsIHhbIDZdLCBTMjIsIDB4YzA0MGIzNDApOyAvKiAxOCAqLwotICAgIEdHKGMsIGQsIGEsIGIsIHhbMTFdLCBTMjMsIDB4MjY1ZTVhNTEpOyAvKiAxOSAqLwotICAgIEdHKGIsIGMsIGQsIGEsIHhbIDBdLCBTMjQsIDB4ZTliNmM3YWEpOyAvKiAyMCAqLwotICAgIEdHKGEsIGIsIGMsIGQsIHhbIDVdLCBTMjEsIDB4ZDYyZjEwNWQpOyAvKiAyMSAqLwotICAgIEdHKGQsIGEsIGIsIGMsIHhbMTBdLCBTMjIsICAweDI0NDE0NTMpOyAvKiAyMiAqLwotICAgIEdHKGMsIGQsIGEsIGIsIHhbMTVdLCBTMjMsIDB4ZDhhMWU2ODEpOyAvKiAyMyAqLwotICAgIEdHKGIsIGMsIGQsIGEsIHhbIDRdLCBTMjQsIDB4ZTdkM2ZiYzgpOyAvKiAyNCAqLwotICAgIEdHKGEsIGIsIGMsIGQsIHhbIDldLCBTMjEsIDB4MjFlMWNkZTYpOyAvKiAyNSAqLwotICAgIEdHKGQsIGEsIGIsIGMsIHhbMTRdLCBTMjIsIDB4YzMzNzA3ZDYpOyAvKiAyNiAqLwotICAgIEdHKGMsIGQsIGEsIGIsIHhbIDNdLCBTMjMsIDB4ZjRkNTBkODcpOyAvKiAyNyAqLwotICAgIEdHKGIsIGMsIGQsIGEsIHhbIDhdLCBTMjQsIDB4NDU1YTE0ZWQpOyAvKiAyOCAqLwotICAgIEdHKGEsIGIsIGMsIGQsIHhbMTNdLCBTMjEsIDB4YTllM2U5MDUpOyAvKiAyOSAqLwotICAgIEdHKGQsIGEsIGIsIGMsIHhbIDJdLCBTMjIsIDB4ZmNlZmEzZjgpOyAvKiAzMCAqLwotICAgIEdHKGMsIGQsIGEsIGIsIHhbIDddLCBTMjMsIDB4Njc2ZjAyZDkpOyAvKiAzMSAqLwotICAgIEdHKGIsIGMsIGQsIGEsIHhbMTJdLCBTMjQsIDB4OGQyYTRjOGEpOyAvKiAzMiAqLwotCi0gICAgLyogUm91bmQgMyAqLwotICAgIEhIKGEsIGIsIGMsIGQsIHhbIDVdLCBTMzEsIDB4ZmZmYTM5NDIpOyAvKiAzMyAqLwotICAgIEhIKGQsIGEsIGIsIGMsIHhbIDhdLCBTMzIsIDB4ODc3MWY2ODEpOyAvKiAzNCAqLwotICAgIEhIKGMsIGQsIGEsIGIsIHhbMTFdLCBTMzMsIDB4NmQ5ZDYxMjIpOyAvKiAzNSAqLwotICAgIEhIKGIsIGMsIGQsIGEsIHhbMTRdLCBTMzQsIDB4ZmRlNTM4MGMpOyAvKiAzNiAqLwotICAgIEhIKGEsIGIsIGMsIGQsIHhbIDFdLCBTMzEsIDB4YTRiZWVhNDQpOyAvKiAzNyAqLwotICAgIEhIKGQsIGEsIGIsIGMsIHhbIDRdLCBTMzIsIDB4NGJkZWNmYTkpOyAvKiAzOCAqLwotICAgIEhIKGMsIGQsIGEsIGIsIHhbIDddLCBTMzMsIDB4ZjZiYjRiNjApOyAvKiAzOSAqLwotICAgIEhIKGIsIGMsIGQsIGEsIHhbMTBdLCBTMzQsIDB4YmViZmJjNzApOyAvKiA0MCAqLwotICAgIEhIKGEsIGIsIGMsIGQsIHhbMTNdLCBTMzEsIDB4Mjg5YjdlYzYpOyAvKiA0MSAqLwotICAgIEhIKGQsIGEsIGIsIGMsIHhbIDBdLCBTMzIsIDB4ZWFhMTI3ZmEpOyAvKiA0MiAqLwotICAgIEhIKGMsIGQsIGEsIGIsIHhbIDNdLCBTMzMsIDB4ZDRlZjMwODUpOyAvKiA0MyAqLwotICAgIEhIKGIsIGMsIGQsIGEsIHhbIDZdLCBTMzQsICAweDQ4ODFkMDUpOyAvKiA0NCAqLwotICAgIEhIKGEsIGIsIGMsIGQsIHhbIDldLCBTMzEsIDB4ZDlkNGQwMzkpOyAvKiA0NSAqLwotICAgIEhIKGQsIGEsIGIsIGMsIHhbMTJdLCBTMzIsIDB4ZTZkYjk5ZTUpOyAvKiA0NiAqLwotICAgIEhIKGMsIGQsIGEsIGIsIHhbMTVdLCBTMzMsIDB4MWZhMjdjZjgpOyAvKiA0NyAqLwotICAgIEhIKGIsIGMsIGQsIGEsIHhbIDJdLCBTMzQsIDB4YzRhYzU2NjUpOyAvKiA0OCAqLwotCi0gICAgLyogUm91bmQgNCAqLwotICAgIElJKGEsIGIsIGMsIGQsIHhbIDBdLCBTNDEsIDB4ZjQyOTIyNDQpOyAvKiA0OSAqLwotICAgIElJKGQsIGEsIGIsIGMsIHhbIDddLCBTNDIsIDB4NDMyYWZmOTcpOyAvKiA1MCAqLwotICAgIElJKGMsIGQsIGEsIGIsIHhbMTRdLCBTNDMsIDB4YWI5NDIzYTcpOyAvKiA1MSAqLwotICAgIElJKGIsIGMsIGQsIGEsIHhbIDVdLCBTNDQsIDB4ZmM5M2EwMzkpOyAvKiA1MiAqLwotICAgIElJKGEsIGIsIGMsIGQsIHhbMTJdLCBTNDEsIDB4NjU1YjU5YzMpOyAvKiA1MyAqLwotICAgIElJKGQsIGEsIGIsIGMsIHhbIDNdLCBTNDIsIDB4OGYwY2NjOTIpOyAvKiA1NCAqLwotICAgIElJKGMsIGQsIGEsIGIsIHhbMTBdLCBTNDMsIDB4ZmZlZmY0N2QpOyAvKiA1NSAqLwotICAgIElJKGIsIGMsIGQsIGEsIHhbIDFdLCBTNDQsIDB4ODU4NDVkZDEpOyAvKiA1NiAqLwotICAgIElJKGEsIGIsIGMsIGQsIHhbIDhdLCBTNDEsIDB4NmZhODdlNGYpOyAvKiA1NyAqLwotICAgIElJKGQsIGEsIGIsIGMsIHhbMTVdLCBTNDIsIDB4ZmUyY2U2ZTApOyAvKiA1OCAqLwotICAgIElJKGMsIGQsIGEsIGIsIHhbIDZdLCBTNDMsIDB4YTMwMTQzMTQpOyAvKiA1OSAqLwotICAgIElJKGIsIGMsIGQsIGEsIHhbMTNdLCBTNDQsIDB4NGUwODExYTEpOyAvKiA2MCAqLwotICAgIElJKGEsIGIsIGMsIGQsIHhbIDRdLCBTNDEsIDB4Zjc1MzdlODIpOyAvKiA2MSAqLwotICAgIElJKGQsIGEsIGIsIGMsIHhbMTFdLCBTNDIsIDB4YmQzYWYyMzUpOyAvKiA2MiAqLwotICAgIElJKGMsIGQsIGEsIGIsIHhbIDJdLCBTNDMsIDB4MmFkN2QyYmIpOyAvKiA2MyAqLwotICAgIElJKGIsIGMsIGQsIGEsIHhbIDldLCBTNDQsIDB4ZWI4NmQzOTEpOyAvKiA2NCAqLwotCi0gICAgc3RhdGVbMF0gKz0gYTsKLSAgICBzdGF0ZVsxXSArPSBiOwotICAgIHN0YXRlWzJdICs9IGM7Ci0gICAgc3RhdGVbM10gKz0gZDsKLQotICAgIC8qIFplcm9pemUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiAqLwotICAgIG1lbXNldCgoUE9JTlRFUil4LCAwLCBzaXplb2YgKHgpKTsKLX0KZGlmZiAtLWdpdCBhL01vZHVsZXMvbWQ1bW9kdWxlLmMgYi9Nb2R1bGVzL21kNW1vZHVsZS5jCmluZGV4IGUxMmJlZjguLjVlNGYxMTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWQ1bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9tZDVtb2R1bGUuYwpAQCAtMTUsNyArMTUsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAJUHlPYmplY3RfSEVBRAotICAgICAgICBNRDVfQ1RYCW1kNTsJCS8qIHRoZSBjb250ZXh0IGhvbGRlciAqLworICAgICAgICBtZDVfc3RhdGVfdAltZDU7CQkvKiB0aGUgY29udGV4dCBob2xkZXIgKi8KIH0gbWQ1b2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE1ENXR5cGU7CkBAIC0zMSw3ICszMSw3IEBACiAJaWYgKG1kNXAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlNRDVJbml0KCZtZDVwLT5tZDUpOwkvKiBhY3R1YWwgaW5pdGlhbGlzYXRpb24gKi8KKwltZDVfaW5pdCgmbWQ1cC0+bWQ1KTsJLyogYWN0dWFsIGluaXRpYWxpc2F0aW9uICovCiAJcmV0dXJuIG1kNXA7CiB9CiAKQEAgLTU2LDcgKzU2LDcgQEAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOnVwZGF0ZSIsICZjcCwgJmxlbikpCiAJCXJldHVybiBOVUxMOwogCi0JTUQ1VXBkYXRlKCZzZWxmLT5tZDUsIGNwLCBsZW4pOworCW1kNV9hcHBlbmQoJnNlbGYtPm1kNSwgY3AsIGxlbik7CiAKIAlQeV9JTkNSRUYoUHlfTm9uZSk7CiAJcmV0dXJuIFB5X05vbmU7CkBAIC03MywxMiArNzMsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZDVfZGlnZXN0KG1kNW9iamVjdCAqc2VsZikKIHsKLSAJTUQ1X0NUWCBtZENvbnRleHQ7CisgCW1kNV9zdGF0ZV90IG1kQ29udGV4dDsKIAl1bnNpZ25lZCBjaGFyIGFEaWdlc3RbMTZdOwogCiAJLyogbWFrZSBhIHRlbXBvcmFyeSBjb3B5LCBhbmQgcGVyZm9ybSB0aGUgZmluYWwgKi8KIAltZENvbnRleHQgPSBzZWxmLT5tZDU7Ci0JTUQ1RmluYWwoYURpZ2VzdCwgJm1kQ29udGV4dCk7CisJbWQ1X2ZpbmlzaCgmbWRDb250ZXh0LCBhRGlnZXN0KTsKIAogCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKWFEaWdlc3QsIDE2KTsKIH0KQEAgLTk0LDE0ICs5NCwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1kNV9oZXhkaWdlc3QobWQ1b2JqZWN0ICpzZWxmKQogewotIAlNRDVfQ1RYIG1kQ29udGV4dDsKKyAJbWQ1X3N0YXRlX3QgbWRDb250ZXh0OwogCXVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XTsKIAl1bnNpZ25lZCBjaGFyIGhleGRpZ2VzdFszMl07CiAJaW50IGksIGo7CiAKIAkvKiBtYWtlIGEgdGVtcG9yYXJ5IGNvcHksIGFuZCBwZXJmb3JtIHRoZSBmaW5hbCAqLwogCW1kQ29udGV4dCA9IHNlbGYtPm1kNTsKLQlNRDVGaW5hbChkaWdlc3QsICZtZENvbnRleHQpOworCW1kNV9maW5pc2goJm1kQ29udGV4dCwgZGlnZXN0KTsKIAogCS8qIE1ha2UgaGV4IHZlcnNpb24gb2YgdGhlIGRpZ2VzdCAqLwogCWZvcihpPWo9MDsgaTwxNjsgaSsrKSB7CkBAIC0yNzIsNyArMjcyLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoY3ApCi0JCU1ENVVwZGF0ZSgmbWQ1cC0+bWQ1LCBjcCwgbGVuKTsKKwkJbWQ1X2FwcGVuZCgmbWQ1cC0+bWQ1LCBjcCwgbGVuKTsKIAogCXJldHVybiAoUHlPYmplY3QgKiltZDVwOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9vcGVyYXRvci5jIGIvTW9kdWxlcy9vcGVyYXRvci5jCmluZGV4IDI0ZjRlMGEuLmNiY2UxNmUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvb3BlcmF0b3IuYworKysgYi9Nb2R1bGVzL29wZXJhdG9yLmMKQEAgLTM1NCw4ICszNTQsNyBAQAogc3RhdGljIGludAogaXRlbWdldHRlcl90cmF2ZXJzZShpdGVtZ2V0dGVyb2JqZWN0ICppZywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKGlnLT5pdGVtKQotCQlyZXR1cm4gdmlzaXQoaWctPml0ZW0sIGFyZyk7CisJUHlfVklTSVQoaWctPml0ZW0pOwogCXJldHVybiAwOwogfQogCkBAIC00OTMsOCArNDkyLDcgQEAKIHN0YXRpYyBpbnQKIGF0dHJnZXR0ZXJfdHJhdmVyc2UoYXR0cmdldHRlcm9iamVjdCAqYWcsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWlmIChhZy0+YXR0cikKLQkJcmV0dXJuIHZpc2l0KGFnLT5hdHRyLCBhcmcpOworCVB5X1ZJU0lUKGFnLT5hdHRyKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9vc3NhdWRpb2Rldi5jIGIvTW9kdWxlcy9vc3NhdWRpb2Rldi5jCmluZGV4IGNlOGEwZDAuLjU2MzYyMGMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvb3NzYXVkaW9kZXYuYworKysgYi9Nb2R1bGVzL29zc2F1ZGlvZGV2LmMKQEAgLTkzNSwyNCArOTM1LDMyIEBACiAKICAgICBsYWJlbHMgPSBQeUxpc3RfTmV3KG51bV9jb250cm9scyk7CiAgICAgbmFtZXMgPSBQeUxpc3RfTmV3KG51bV9jb250cm9scyk7CisgICAgaWYgKGxhYmVscyA9PSBOVUxMIHx8IG5hbWVzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3IyOwogICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29udHJvbHM7IGkrKykgewogICAgICAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjb250cm9sX2xhYmVsc1tpXSk7CiAgICAgICAgIGlmIChzID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBnb3RvIGVycm9yMjsKICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGxhYmVscywgaSwgcyk7CiAKICAgICAgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoY29udHJvbF9uYW1lc1tpXSk7CiAgICAgICAgIGlmIChzID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBnb3RvIGVycm9yMjsKICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKG5hbWVzLCBpLCBzKTsKICAgICB9CiAKICAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgImNvbnRyb2xfbGFiZWxzIiwgbGFiZWxzKSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBnb3RvIGVycm9yMjsKICAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgImNvbnRyb2xfbmFtZXMiLCBuYW1lcykgPT0gLTEpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZ290byBlcnJvcjE7CiAKICAgICByZXR1cm4gMDsKKworZXJyb3IyOgorICAgIFB5X1hERUNSRUYobGFiZWxzKTsKK2Vycm9yMToKKyAgICBQeV9YREVDUkVGKG5hbWVzKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYyBiL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKaW5kZXggODMxNjViYS4uYzllZGFlNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYworKysgYi9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCkBAIC02NTcsOSArNjU3LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFvaykgewotICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KHBhcnNlcl9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCJvcyIsIGVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCBub2RlIGNvbnN0cnVjdC4iKSk7CisgICAgICAgICAgICBQeU9iamVjdCAqZXJyID0gUHlfQnVpbGRWYWx1ZSgib3MiLCBlbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgbm9kZSBjb25zdHJ1Y3QuIik7CisgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QocGFyc2VyX2Vycm9yLCBlcnIpOworICAgICAgICAgICAgUHlfWERFQ1JFRihlcnIpOwogICAgICAgICAgICAgUHlfWERFQ1JFRihlbGVtKTsKICAgICAgICAgICAgIHJldHVybiAoMCk7CiAgICAgICAgIH0KQEAgLTcwMCw3ICs3MDEsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRlbXApICsgMTsKLSAgICAgICAgICAgIHN0cm4gPSAoY2hhciAqKVB5TWVtX01BTExPQyhsZW4pOworICAgICAgICAgICAgc3RybiA9IChjaGFyICopUHlPYmplY3RfTUFMTE9DKGxlbik7CiAgICAgICAgICAgICBpZiAoc3RybiAhPSBOVUxMKQogICAgICAgICAgICAgICAgICh2b2lkKSBtZW1jcHkoc3RybiwgUHlTdHJpbmdfQVNfU1RSSU5HKHRlbXApLCBsZW4pOwogICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOwpAQCAtNzEwLDE4ICs3MTEsMTkgQEAKICAgICAgICAgICAgICAqICBJdCBoYXMgdG8gYmUgb25lIG9yIHRoZSBvdGhlcjsgdGhpcyBpcyBhbiBlcnJvci4KICAgICAgICAgICAgICAqICBUaHJvdyBhbiBleGNlcHRpb24uCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChwYXJzZXJfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgib3MiLCBlbGVtLCAidW5rbm93biBub2RlIHR5cGUuIikpOworICAgICAgICAgICAgUHlPYmplY3QgKmVyciA9IFB5X0J1aWxkVmFsdWUoIm9zIiwgZWxlbSwgInVua25vd24gbm9kZSB0eXBlLiIpOworICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KHBhcnNlcl9lcnJvciwgZXJyKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoZXJyKTsKICAgICAgICAgICAgIFB5X1hERUNSRUYoZWxlbSk7CiAgICAgICAgICAgICByZXR1cm4gKDApOwogICAgICAgICB9CiAgICAgICAgIGVyciA9IFB5Tm9kZV9BZGRDaGlsZChyb290LCB0eXBlLCBzdHJuLCAqbGluZV9udW0sIDApOwogICAgICAgICBpZiAoZXJyID09IEVfTk9NRU0pIHsKLSAgICAgICAgICAgIFB5TWVtX0RFTChzdHJuKTsKKyAgICAgICAgICAgIFB5T2JqZWN0X0ZSRUUoc3Rybik7CiAgICAgICAgICAgICByZXR1cm4gKG5vZGUgKikgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZXJyID09IEVfT1ZFUkZMT1cpIHsKLSAgICAgICAgICAgIFB5TWVtX0RFTChzdHJuKTsKKyAgICAgICAgICAgIFB5T2JqZWN0X0ZSRUUoc3Rybik7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoaWxkIG5vZGVzIik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTc0MCw3ICs3NDIsNyBAQAogICAgICAgICB9CiAgICAgICAgIFB5X1hERUNSRUYoZWxlbSk7CiAgICAgfQotICAgIHJldHVybiAocm9vdCk7CisgICAgcmV0dXJuIHJvb3Q7CiB9CiAKIApAQCAtNzYyLDYgKzc2NCw3IEBACiAgICAgICAgIHR1cGxlID0gUHlfQnVpbGRWYWx1ZSgib3MiLCB0dXBsZSwKICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgc3ludGF4LXRyZWU7IGNhbm5vdCBzdGFydCB3aXRoIHRlcm1pbmFsIHN5bWJvbC4iKTsKICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KHBhcnNlcl9lcnJvciwgdHVwbGUpOworICAgICAgICBQeV9YREVDUkVGKHR1cGxlKTsKICAgICB9CiAgICAgZWxzZSBpZiAoSVNOT05URVJNSU5BTChudW0pKSB7CiAgICAgICAgIC8qCkBAIC03ODQsNyArNzg3LDcgQEAKICAgICAgICAgICAgIGlmIChyZXMgJiYgZW5jb2RpbmcpIHsKICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbjsKICAgICAgICAgICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShlbmNvZGluZykgKyAxOwotICAgICAgICAgICAgICAgIHJlcy0+bl9zdHIgPSAoY2hhciAqKVB5TWVtX01BTExPQyhsZW4pOworICAgICAgICAgICAgICAgIHJlcy0+bl9zdHIgPSAoY2hhciAqKVB5T2JqZWN0X01BTExPQyhsZW4pOwogICAgICAgICAgICAgICAgIGlmIChyZXMtPm5fc3RyICE9IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBtZW1jcHkocmVzLT5uX3N0ciwgUHlTdHJpbmdfQVNfU1RSSU5HKGVuY29kaW5nKSwgbGVuKTsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZW5jb2RpbmcpOwpAQCAtNzkyLDE0ICs3OTUsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBlbHNlCisgICAgZWxzZSB7CiAgICAgICAgIC8qICBUaGUgdHVwbGUgaXMgaWxsZWdhbCAtLSBpZiB0aGUgbnVtYmVyIGlzIG5laXRoZXIgVEVSTUlOQUwgbm9yCiAgICAgICAgICAqICBOT05URVJNSU5BTCwgd2UgY2FuJ3QgdXNlIGl0LiAgTm90IHN1cmUgdGhlIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAqICBhbGxvd3MgdGhpcyBjb25kaXRpb24sIGJ1dCB0aGUgQVBJIGRvZXNuJ3QgcHJlY2x1ZGUgaXQuCiAgICAgICAgICAqLwotICAgICAgICBQeUVycl9TZXRPYmplY3QocGFyc2VyX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgib3MiLCB0dXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgY29tcG9uZW50IHR1cGxlLiIpKTsKKyAgICAgICAgUHlPYmplY3QgKmVyciA9IFB5X0J1aWxkVmFsdWUoIm9zIiwgdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIGNvbXBvbmVudCB0dXBsZS4iKTsKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KHBhcnNlcl9lcnJvciwgZXJyKTsKKyAgICAgICAgUHlfWERFQ1JFRihlcnIpOworICAgIH0KIAogICAgIHJldHVybiAocmVzKTsKIH0KQEAgLTEzMjEsNyArMTMyNiw3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotLyogIGxpc3RfaWY6ICAnaWYnIHRlc3QgW2xpc3RfaXRlcl0KKy8qICBsaXN0X2lmOiAgJ2lmJyBvbGRfdGVzdCBbbGlzdF9pdGVyXQogICovCiBzdGF0aWMgaW50CiB2YWxpZGF0ZV9saXN0X2lmKG5vZGUgKnRyZWUpCkBAIC0xMzM2LDEyICsxMzQxLDEyIEBACiAKICAgICBpZiAocmVzKQogICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImlmIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMSkpKTsKKyAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX29sZF90ZXN0KENISUxEKHRyZWUsIDEpKSk7CiAKICAgICByZXR1cm4gcmVzOwogfQogCi0vKiAgZ2VuX2lmOiAgJ2lmJyB0ZXN0IFtnZW5faXRlcl0KKy8qICBnZW5faWY6ICAnaWYnIG9sZF90ZXN0IFtnZW5faXRlcl0KICAqLwogc3RhdGljIGludAogdmFsaWRhdGVfZ2VuX2lmKG5vZGUgKnRyZWUpCkBAIC0xMzU2LDcgKzEzNjEsNyBAQAogICAgIAogICAgIGlmIChyZXMpCiAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiaWYiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAxKSkpOworICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfb2xkX3Rlc3QoQ0hJTEQodHJlZSwgMSkpKTsKIAogICAgIHJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMgYi9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKaW5kZXggMWZiYzM1My4uYjUxYmE1ZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCisrKyBiL01vZHVsZXMvcG9zaXhtb2R1bGUuYwpAQCAtMjIsNiArMjIsMTAgQEAKICMgICAgaW5jbHVkZSA8dW5peGlvLmg+CiAjZW5kaWYgLyogZGVmaW5lZChfX1ZNUykgKi8KIAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCiBQeURvY19TVFJWQVIocG9zaXhfX2RvY19fLAogIlRoaXMgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0byBvcGVyYXRpbmcgc3lzdGVtIGZ1bmN0aW9uYWxpdHkgdGhhdCBpc1xuXAogc3RhbmRhcmRpemVkIGJ5IHRoZSBDIFN0YW5kYXJkIGFuZCB0aGUgUE9TSVggc3RhbmRhcmQgKGEgdGhpbmx5XG5cCkBAIC0yNjQsNiArMjY4LDEyIEBACiAjZGVmaW5lIFdURVJNU0lHKHVfd2FpdCkgKCh1X3dhaXQpLndfdGVybXNpZykKICNlbmRpZgogCisjZGVmaW5lIFdBSVRfVFlQRSB1bmlvbiB3YWl0CisjZGVmaW5lIFdBSVRfU1RBVFVTX0lOVChzKSAocy53X3N0YXR1cykKKworI2Vsc2UgLyogIVVOSU9OX1dBSVQgKi8KKyNkZWZpbmUgV0FJVF9UWVBFIGludAorI2RlZmluZSBXQUlUX1NUQVRVU19JTlQocykgKHMpCiAjZW5kaWYgLyogVU5JT05fV0FJVCAqLwogCiAvKiBEb24ndCB1c2UgdGhlICJfciIgZm9ybSBpZiB3ZSBkb24ndCBuZWVkIGl0IChhbHNvLCB3b24ndCBoYXZlIGEKQEAgLTk3MSw2ICs5ODEsNyBAQAogCTEwCiB9OwogCitzdGF0aWMgaW50IGluaXRpYWxpemVkOwogc3RhdGljIFB5VHlwZU9iamVjdCBTdGF0UmVzdWx0VHlwZTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgU3RhdFZGU1Jlc3VsdFR5cGU7CiBzdGF0aWMgbmV3ZnVuYyBzdHJ1Y3RzZXFfbmV3OwpAQCAtMTgzOSw2ICsxODUwLDcgQEAKIAlzdHJ1Y3QgZGlyZW50ICplcDsKIAlpbnQgYXJnX2lzX3VuaWNvZGUgPSAxOwogCisJZXJybm8gPSAwOwogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVTpsaXN0ZGlyIiwgJnYpKSB7CiAJCWFyZ19pc191bmljb2RlID0gMDsKIAkJUHlFcnJfQ2xlYXIoKTsKQEAgLTE4OTUsNiArMTkwNywxMiBAQAogCQl9CiAJCVB5X0RFQ1JFRih2KTsKIAl9CisJaWYgKGVycm5vICE9IDAgJiYgZCAhPSBOVUxMKSB7CisJCS8qIHJlYWRkaXIoKSByZXR1cm5lZCBOVUxMIGFuZCBzZXQgZXJybm8gKi8KKwkJY2xvc2VkaXIoZGlycCk7CisJCVB5X0RFQ1JFRihkKTsKKwkJcmV0dXJuIHBvc2l4X2Vycm9yX3dpdGhfYWxsb2NhdGVkX2ZpbGVuYW1lKG5hbWUpOyAKKwl9CiAJY2xvc2VkaXIoZGlycCk7CiAJUHlNZW1fRnJlZShuYW1lKTsKIApAQCAtMTk5NSwxMyArMjAxMywxMyBAQAogfQogCiAKLSNpZmRlZiBIQVZFX05JQ0UKLSNpZiBkZWZpbmVkKEhBVkVfQlJPS0VOX05JQ0UpICYmIGRlZmluZWQoSEFWRV9TWVNfUkVTT1VSQ0VfSCkKLSNpZiBkZWZpbmVkKEhBVkVfR0VUUFJJT1JJVFkpICYmICFkZWZpbmVkKFBSSU9fUFJPQ0VTUykKKy8qIHN5cy9yZXNvdXJjZS5oIGlzIG5lZWRlZCBmb3IgYXQgbGVhc3Q6IHdhaXQzKCksIHdhaXQ0KCksIGJyb2tlbiBuaWNlLiAqLworI2lmIGRlZmluZWQoSEFWRV9TWVNfUkVTT1VSQ0VfSCkKICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KICNlbmRpZgotI2VuZGlmCiAKKworI2lmZGVmIEhBVkVfTklDRQogUHlEb2NfU1RSVkFSKHBvc2l4X25pY2VfX2RvY19fLAogIm5pY2UoaW5jKSAtPiBuZXdfcHJpb3JpdHlcblxuXAogRGVjcmVhc2UgdGhlIHByaW9yaXR5IG9mIHByb2Nlc3MgYnkgaW5jIGFuZCByZXR1cm4gdGhlIG5ldyBwcmlvcml0eS4iKTsKQEAgLTMwODgsNyArMzEwNiw3IEBACiAjaWYgZGVmaW5lZChIQVZFX0RFVl9QVE1YKSAmJiAhZGVmaW5lZChIQVZFX09QRU5QVFkpICYmICFkZWZpbmVkKEhBVkVfX0dFVFBUWSkKIAlQeU9TX3NpZ2hhbmRsZXJfdCBzaWdfc2F2ZWQ7CiAjaWZkZWYgc3VuCi0JZXh0ZXJuIGNoYXIgKnB0c25hbWUoKTsKKwlleHRlcm4gY2hhciAqcHRzbmFtZShpbnQgZmlsZGVzKTsKICNlbmRpZgogI2VuZGlmCiAKQEAgLTUwOTEsNiArNTEwOSwxMTQgQEAKIH0KICNlbmRpZiAvKiBIQVZFX1NFVEdST1VQUyAqLwogCisjaWYgZGVmaW5lZChIQVZFX1dBSVQzKSB8fCBkZWZpbmVkKEhBVkVfV0FJVDQpCitzdGF0aWMgUHlPYmplY3QgKgord2FpdF9oZWxwZXIoaW50IHBpZCwgaW50IHN0YXR1cywgc3RydWN0IHJ1c2FnZSAqcnUpCit7CisJUHlPYmplY3QgKnJlc3VsdDsKKyAgIAlzdGF0aWMgUHlPYmplY3QgKnN0cnVjdF9ydXNhZ2U7CisKKwlpZiAocGlkID09IC0xKQorCQlyZXR1cm4gcG9zaXhfZXJyb3IoKTsKKworCWlmIChzdHJ1Y3RfcnVzYWdlID09IE5VTEwpIHsKKwkJUHlPYmplY3QgKm0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInJlc291cmNlIik7CisJCWlmIChtID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJc3RydWN0X3J1c2FnZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobSwgInN0cnVjdF9ydXNhZ2UiKTsKKwkJUHlfREVDUkVGKG0pOworCQlpZiAoc3RydWN0X3J1c2FnZSA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogWFhYKG5ub3J3aXR6KTogQ29waWVkICh3L21vZHMpIGZyb20gcmVzb3VyY2UuYywgdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lLiAqLworCXJlc3VsdCA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KChQeVR5cGVPYmplY3QqKSBzdHJ1Y3RfcnVzYWdlKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIE5VTEw7CisKKyNpZm5kZWYgZG91YmxldGltZQorI2RlZmluZSBkb3VibGV0aW1lKFRWKSAoKGRvdWJsZSkoVFYpLnR2X3NlYyArIChUVikudHZfdXNlYyAqIDAuMDAwMDAxKQorI2VuZGlmCisKKwlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMCwKKwkJCVB5RmxvYXRfRnJvbURvdWJsZShkb3VibGV0aW1lKHJ1LT5ydV91dGltZSkpKTsKKwlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMSwKKwkJCVB5RmxvYXRfRnJvbURvdWJsZShkb3VibGV0aW1lKHJ1LT5ydV9zdGltZSkpKTsKKyNkZWZpbmUgU0VUX0lOVChyZXN1bHQsIGluZGV4LCB2YWx1ZSlcCisJCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCBpbmRleCwgUHlJbnRfRnJvbUxvbmcodmFsdWUpKQorCVNFVF9JTlQocmVzdWx0LCAyLCBydS0+cnVfbWF4cnNzKTsKKwlTRVRfSU5UKHJlc3VsdCwgMywgcnUtPnJ1X2l4cnNzKTsKKwlTRVRfSU5UKHJlc3VsdCwgNCwgcnUtPnJ1X2lkcnNzKTsKKwlTRVRfSU5UKHJlc3VsdCwgNSwgcnUtPnJ1X2lzcnNzKTsKKwlTRVRfSU5UKHJlc3VsdCwgNiwgcnUtPnJ1X21pbmZsdCk7CisJU0VUX0lOVChyZXN1bHQsIDcsIHJ1LT5ydV9tYWpmbHQpOworCVNFVF9JTlQocmVzdWx0LCA4LCBydS0+cnVfbnN3YXApOworCVNFVF9JTlQocmVzdWx0LCA5LCBydS0+cnVfaW5ibG9jayk7CisJU0VUX0lOVChyZXN1bHQsIDEwLCBydS0+cnVfb3VibG9jayk7CisJU0VUX0lOVChyZXN1bHQsIDExLCBydS0+cnVfbXNnc25kKTsKKwlTRVRfSU5UKHJlc3VsdCwgMTIsIHJ1LT5ydV9tc2dyY3YpOworCVNFVF9JTlQocmVzdWx0LCAxMywgcnUtPnJ1X25zaWduYWxzKTsKKwlTRVRfSU5UKHJlc3VsdCwgMTQsIHJ1LT5ydV9udmNzdyk7CisJU0VUX0lOVChyZXN1bHQsIDE1LCBydS0+cnVfbml2Y3N3KTsKKyN1bmRlZiBTRVRfSU5UCisKKwlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworCQlQeV9ERUNSRUYocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpTiIsIHBpZCwgc3RhdHVzLCByZXN1bHQpOworfQorI2VuZGlmIC8qIEhBVkVfV0FJVDMgfHwgSEFWRV9XQUlUNCAqLworCisjaWZkZWYgSEFWRV9XQUlUMworUHlEb2NfU1RSVkFSKHBvc2l4X3dhaXQzX19kb2NfXywKKyJ3YWl0MyhvcHRpb25zKSAtPiAocGlkLCBzdGF0dXMsIHJ1c2FnZSlcblxuXAorV2FpdCBmb3IgY29tcGxldGlvbiBvZiBhIGNoaWxkIHByb2Nlc3MuIik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitwb3NpeF93YWl0MyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJaW50IHBpZCwgb3B0aW9uczsKKwlzdHJ1Y3QgcnVzYWdlIHJ1OworCVdBSVRfVFlQRSBzdGF0dXM7CisJV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykgPSAwOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOndhaXQzIiwgJm9wdGlvbnMpKQorCQlyZXR1cm4gTlVMTDsKKworCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKwlwaWQgPSB3YWl0Mygmc3RhdHVzLCBvcHRpb25zLCAmcnUpOworCVB5X0VORF9BTExPV19USFJFQURTCisKKwlyZXR1cm4gd2FpdF9oZWxwZXIocGlkLCBXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSwgJnJ1KTsKK30KKyNlbmRpZiAvKiBIQVZFX1dBSVQzICovCisKKyNpZmRlZiBIQVZFX1dBSVQ0CitQeURvY19TVFJWQVIocG9zaXhfd2FpdDRfX2RvY19fLAorIndhaXQ0KHBpZCwgb3B0aW9ucykgLT4gKHBpZCwgc3RhdHVzLCBydXNhZ2UpXG5cblwKK1dhaXQgZm9yIGNvbXBsZXRpb24gb2YgYSBnaXZlbiBjaGlsZCBwcm9jZXNzLiIpOworCitzdGF0aWMgUHlPYmplY3QgKgorcG9zaXhfd2FpdDQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCWludCBwaWQsIG9wdGlvbnM7CisJc3RydWN0IHJ1c2FnZSBydTsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6d2FpdDQiLCAmcGlkLCAmb3B0aW9ucykpCisJCXJldHVybiBOVUxMOworCisJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCXBpZCA9IHdhaXQ0KHBpZCwgJnN0YXR1cywgb3B0aW9ucywgJnJ1KTsKKwlQeV9FTkRfQUxMT1dfVEhSRUFEUworCisJcmV0dXJuIHdhaXRfaGVscGVyKHBpZCwgV0FJVF9TVEFUVVNfSU5UKHN0YXR1cyksICZydSk7Cit9CisjZW5kaWYgLyogSEFWRV9XQUlUNCAqLworCiAjaWZkZWYgSEFWRV9XQUlUUElECiBQeURvY19TVFJWQVIocG9zaXhfd2FpdHBpZF9fZG9jX18sCiAid2FpdHBpZChwaWQsIG9wdGlvbnMpIC0+IChwaWQsIHN0YXR1cylcblxuXApAQCAtNTEwMCwxNCArNTIyNiw4IEBACiBwb3NpeF93YWl0cGlkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAlpbnQgcGlkLCBvcHRpb25zOwotI2lmZGVmIFVOSU9OX1dBSVQKLQl1bmlvbiB3YWl0IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgKHN0YXR1cy53X3N0YXR1cykKLSNlbHNlCi0JaW50IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgc3RhdHVzCi0jZW5kaWYKLQlzdGF0dXNfaSA9IDA7CisJV0FJVF9UWVBFIHN0YXR1czsKKwlXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSA9IDA7CiAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOndhaXRwaWQiLCAmcGlkLCAmb3B0aW9ucykpCiAJCXJldHVybiBOVUxMOwpAQCAtNTExNiw4ICs1MjM2LDggQEAKIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCWlmIChwaWQgPT0gLTEpCiAJCXJldHVybiBwb3NpeF9lcnJvcigpOwotCWVsc2UKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgcGlkLCBzdGF0dXNfaSk7CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCBwaWQsIFdBSVRfU1RBVFVTX0lOVChzdGF0dXMpKTsKIH0KIAogI2VsaWYgZGVmaW5lZChIQVZFX0NXQUlUKQpAQCAtNTE0MCwxMCArNTI2MCw5IEBACiAJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAlpZiAocGlkID09IC0xKQogCQlyZXR1cm4gcG9zaXhfZXJyb3IoKTsKLQllbHNlCi0JCS8qIHNoaWZ0IHRoZSBzdGF0dXMgbGVmdCBhIGJ5dGUgc28gdGhpcyBpcyBtb3JlIGxpa2UgdGhlCi0JCSAgIFBPU0lYIHdhaXRwaWQgKi8KLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgcGlkLCBzdGF0dXMgPDwgOCk7CisKKwkvKiBzaGlmdCB0aGUgc3RhdHVzIGxlZnQgYSBieXRlIHNvIHRoaXMgaXMgbW9yZSBsaWtlIHRoZSBQT1NJWCB3YWl0cGlkICovCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgcGlkLCBzdGF0dXMgPDwgOCk7CiB9CiAjZW5kaWYgLyogSEFWRV9XQUlUUElEIHx8IEhBVkVfQ1dBSVQgKi8KIApAQCAtNTE1NiwyMyArNTI3NSwxNiBAQAogcG9zaXhfd2FpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKIAlpbnQgcGlkOwotI2lmZGVmIFVOSU9OX1dBSVQKLQl1bmlvbiB3YWl0IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgKHN0YXR1cy53X3N0YXR1cykKLSNlbHNlCi0JaW50IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgc3RhdHVzCi0jZW5kaWYKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAotCXN0YXR1c19pID0gMDsKIAlQeV9CRUdJTl9BTExPV19USFJFQURTCiAJcGlkID0gd2FpdCgmc3RhdHVzKTsKIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCWlmIChwaWQgPT0gLTEpCiAJCXJldHVybiBwb3NpeF9lcnJvcigpOwotCWVsc2UKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgcGlkLCBzdGF0dXNfaSk7Ci0jdW5kZWYgc3RhdHVzX2kKKworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIHBpZCwgV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykpOwogfQogI2VuZGlmCiAKQEAgLTU2NjgsOSArNTc4MCwyNCBAQAogCQkJICAgICAiaW52YWxpZCBmaWxlIG1vZGUgJyVzJyIsIG1vZGUpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0KIAlQeV9CRUdJTl9BTExPV19USFJFQURTCisjaWYgIWRlZmluZWQoTVNfV0lORE9XUykgJiYgZGVmaW5lZChIQVZFX0ZDTlRMX0gpCisJaWYgKG1vZGVbMF0gPT0gJ2EnKSB7CisJCS8qIHRyeSB0byBtYWtlIHN1cmUgdGhlIE9fQVBQRU5EIGZsYWcgaXMgc2V0ICovCisJCWludCBmbGFnczsKKwkJZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCk7CisJCWlmIChmbGFncyAhPSAtMSkKKwkJCWZjbnRsKGZkLCBGX1NFVEZMLCBmbGFncyB8IE9fQVBQRU5EKTsKKwkJZnAgPSBmZG9wZW4oZmQsIG1vZGUpOworCQlpZiAoZnAgPT0gTlVMTCAmJiBmbGFncyAhPSAtMSkKKwkJCS8qIHJlc3RvcmUgb2xkIG1vZGUgaWYgZmRvcGVuIGZhaWxlZCAqLworCQkJZmNudGwoZmQsIEZfU0VURkwsIGZsYWdzKTsKKwl9IGVsc2UgeworCQlmcCA9IGZkb3BlbihmZCwgbW9kZSk7CisJfQorI2Vsc2UKIAlmcCA9IGZkb3BlbihmZCwgbW9kZSk7CisjZW5kaWYKIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCWlmIChmcCA9PSBOVUxMKQogCQlyZXR1cm4gcG9zaXhfZXJyb3IoKTsKQEAgLTU4ODcsNyArNjAxNCw3IEBACiBwb3NpeF9wdXRlbnYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgICAgICBjaGFyICpzMSwgKnMyOwotICAgICAgICBjaGFyICpuZXc7CisgICAgICAgIGNoYXIgKm5ld2VudjsKIAlQeU9iamVjdCAqbmV3c3RyOwogCXNpemVfdCBsZW47CiAKQEAgLTU5MTgsOSArNjA0NSw5IEBACiAJbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGludClsZW4gLSAxKTsKIAlpZiAobmV3c3RyID09IE5VTEwpCiAJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCW5ldyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdzdHIpOwotCVB5T1Nfc25wcmludGYobmV3LCBsZW4sICIlcz0lcyIsIHMxLCBzMik7Ci0JaWYgKHB1dGVudihuZXcpKSB7CisJbmV3ZW52ID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5ld3N0cik7CisJUHlPU19zbnByaW50ZihuZXdlbnYsIGxlbiwgIiVzPSVzIiwgczEsIHMyKTsKKwlpZiAocHV0ZW52KG5ld2VudikpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3c3RyKTsKICAgICAgICAgICAgICAgICBwb3NpeF9lcnJvcigpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNjAxMCwyMiArNjEzNywxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X1dDT1JFRFVNUChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0jaWZkZWYgVU5JT05fV0FJVAotCXVuaW9uIHdhaXQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSAoc3RhdHVzLndfc3RhdHVzKQotI2Vsc2UKLQlpbnQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSBzdGF0dXMKLSNlbmRpZgotCXN0YXR1c19pID0gMDsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXQ09SRURVTVAiLCAmc3RhdHVzX2kpKQotCXsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6V0NPUkVEVU1QIiwgJldBSVRfU1RBVFVTX0lOVChzdGF0dXMpKSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhXQ09SRURVTVAoc3RhdHVzKSk7Ci0jdW5kZWYgc3RhdHVzX2kKIH0KICNlbmRpZiAvKiBXQ09SRURVTVAgKi8KIApAQCAtNjAzOCwyMiArNjE1NiwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X1dJRkNPTlRJTlVFRChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0jaWZkZWYgVU5JT05fV0FJVAotCXVuaW9uIHdhaXQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSAoc3RhdHVzLndfc3RhdHVzKQotI2Vsc2UKLQlpbnQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSBzdGF0dXMKLSNlbmRpZgotCXN0YXR1c19pID0gMDsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXQ09OVElOVUVEIiwgJnN0YXR1c19pKSkKLQl7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldDT05USU5VRUQiLCAmV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykpKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKFdJRkNPTlRJTlVFRChzdGF0dXMpKTsKLSN1bmRlZiBzdGF0dXNfaQogfQogI2VuZGlmIC8qIFdJRkNPTlRJTlVFRCAqLwogCkBAIC02MDY1LDIyICs2MTc0LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfV0lGU1RPUFBFRChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0jaWZkZWYgVU5JT05fV0FJVAotCXVuaW9uIHdhaXQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSAoc3RhdHVzLndfc3RhdHVzKQotI2Vsc2UKLQlpbnQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSBzdGF0dXMKLSNlbmRpZgotCXN0YXR1c19pID0gMDsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXSUZTVE9QUEVEIiwgJnN0YXR1c19pKSkKLQl7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldJRlNUT1BQRUQiLCAmV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykpKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKFdJRlNUT1BQRUQoc3RhdHVzKSk7Ci0jdW5kZWYgc3RhdHVzX2kKIH0KICNlbmRpZiAvKiBXSUZTVE9QUEVEICovCiAKQEAgLTYwOTIsMjIgKzYxOTIsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF9XSUZTSUdOQUxFRChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0jaWZkZWYgVU5JT05fV0FJVAotCXVuaW9uIHdhaXQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSAoc3RhdHVzLndfc3RhdHVzKQotI2Vsc2UKLQlpbnQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSBzdGF0dXMKLSNlbmRpZgotCXN0YXR1c19pID0gMDsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXSUZTSUdOQUxFRCIsICZzdGF0dXNfaSkpCi0JeworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXSUZTSUdOQUxFRCIsICZXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSkpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoV0lGU0lHTkFMRUQoc3RhdHVzKSk7Ci0jdW5kZWYgc3RhdHVzX2kKIH0KICNlbmRpZiAvKiBXSUZTSUdOQUxFRCAqLwogCkBAIC02MTIwLDIyICs2MjExLDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfV0lGRVhJVEVEKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSNpZmRlZiBVTklPTl9XQUlUCi0JdW5pb24gd2FpdCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIChzdGF0dXMud19zdGF0dXMpCi0jZWxzZQotCWludCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIHN0YXR1cwotI2VuZGlmCi0Jc3RhdHVzX2kgPSAwOworCVdBSVRfVFlQRSBzdGF0dXM7CisJV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldJRkVYSVRFRCIsICZzdGF0dXNfaSkpCi0JeworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXSUZFWElURUQiLCAmV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykpKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKFdJRkVYSVRFRChzdGF0dXMpKTsKLSN1bmRlZiBzdGF0dXNfaQogfQogI2VuZGlmIC8qIFdJRkVYSVRFRCAqLwogCkBAIC02MTQ3LDIyICs2MjI5LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfV0VYSVRTVEFUVVMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotI2lmZGVmIFVOSU9OX1dBSVQKLQl1bmlvbiB3YWl0IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgKHN0YXR1cy53X3N0YXR1cykKLSNlbHNlCi0JaW50IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgc3RhdHVzCi0jZW5kaWYKLQlzdGF0dXNfaSA9IDA7CisJV0FJVF9UWVBFIHN0YXR1czsKKwlXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6V0VYSVRTVEFUVVMiLCAmc3RhdHVzX2kpKQotCXsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6V0VYSVRTVEFUVVMiLCAmV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykpKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIFdFWElUU1RBVFVTKHN0YXR1cykpOwotI3VuZGVmIHN0YXR1c19pCiB9CiAjZW5kaWYgLyogV0VYSVRTVEFUVVMgKi8KIApAQCAtNjE3NSwyMiArNjI0OCwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X1dURVJNU0lHKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSNpZmRlZiBVTklPTl9XQUlUCi0JdW5pb24gd2FpdCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIChzdGF0dXMud19zdGF0dXMpCi0jZWxzZQotCWludCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIHN0YXR1cwotI2VuZGlmCi0Jc3RhdHVzX2kgPSAwOworCVdBSVRfVFlQRSBzdGF0dXM7CisJV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldURVJNU0lHIiwgJnN0YXR1c19pKSkKLQl7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldURVJNU0lHIiwgJldBSVRfU1RBVFVTX0lOVChzdGF0dXMpKSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBXVEVSTVNJRyhzdGF0dXMpKTsKLSN1bmRlZiBzdGF0dXNfaQogfQogI2VuZGlmIC8qIFdURVJNU0lHICovCiAKQEAgLTYyMDMsMjIgKzYyNjcsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF9XU1RPUFNJRyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0jaWZkZWYgVU5JT05fV0FJVAotCXVuaW9uIHdhaXQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSAoc3RhdHVzLndfc3RhdHVzKQotI2Vsc2UKLQlpbnQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSBzdGF0dXMKLSNlbmRpZgotCXN0YXR1c19pID0gMDsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXU1RPUFNJRyIsICZzdGF0dXNfaSkpCi0JeworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXU1RPUFNJRyIsICZXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSkpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgV1NUT1BTSUcoc3RhdHVzKSk7Ci0jdW5kZWYgc3RhdHVzX2kKIH0KICNlbmRpZiAvKiBXU1RPUFNJRyAqLwogCkBAIC02Mzk2LDE1ICs2NDUxLDE2IEBACiAgICAgbmFtZSA9IHRtcG5hbShidWZmZXIpOwogI2VuZGlmCiAgICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfT1NFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoImlzIiwgMCwKKwlQeU9iamVjdCAqZXJyID0gUHlfQnVpbGRWYWx1ZSgiaXMiLCAwLAogI2lmZGVmIFVTRV9UTVBOQU1fUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBOVUxMIGZyb20gdG1wbmFtX3IiCiAjZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBOVUxMIGZyb20gdG1wbmFtIgogI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKwlQeUVycl9TZXRPYmplY3QoUHlFeGNfT1NFcnJvciwgZXJyKTsKKwlQeV9YREVDUkVGKGVycik7CisJcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CiB9CkBAIC02NzUzLDI2ICs2ODA5LDMwIEBACiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAgICAgaW50IG5hbWU7Ci0gICAgY2hhciBidWZmZXJbNjRdOworICAgIGNoYXIgYnVmZmVyWzI1Nl07CiAKICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyY6Y29uZnN0ciIsIGNvbnZfY29uZnN0cl9jb25mbmFtZSwgJm5hbWUpKSB7Ci0gICAgICAgIGludCBsZW4gPSBjb25mc3RyKG5hbWUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCWludCBsZW47CiAKICAgICAgICAgZXJybm8gPSAwOwotICAgICAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgICAgIGlmIChlcnJubyAhPSAwKQotICAgICAgICAgICAgICAgIHBvc2l4X2Vycm9yKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisJbGVuID0gY29uZnN0cihuYW1lLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKwlpZiAobGVuID09IDApIHsKKwkgICAgaWYgKGVycm5vKSB7CisJCXBvc2l4X2Vycm9yKCk7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCXJlc3VsdCA9IFB5X05vbmU7CisJCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwkgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGxlbiA+PSBzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisJICAgIGlmICgodW5zaWduZWQgaW50KWxlbiA+PSBzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi0xKTsKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGNvbmZzdHIobmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCksIGxlbisxKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZnN0cihuYW1lLCBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSwgbGVuKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLCBsZW4tMSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTc0MjMsNiArNzQ4Myw0NCBAQAogCWNoYXIgKmZpbGVwYXRoOwogCWNoYXIgKm9wZXJhdGlvbiA9IE5VTEw7CiAJSElOU1RBTkNFIHJjOworI2lmZGVmIFB5X1dJTl9XSURFX0ZJTEVOQU1FUworCWlmICh1bmljb2RlX2ZpbGVfbmFtZXMoKSkgeworCQlQeU9iamVjdCAqdW5pcGF0aCwgKndvcGVyYXRpb24gPSBOVUxMOworCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8czpzdGFydGZpbGUiLAorCQkJCSAgICAgICZ1bmlwYXRoLCAmb3BlcmF0aW9uKSkgeworCQkJUHlFcnJfQ2xlYXIoKTsKKwkJCWdvdG8gbm9ybWFsOworCQl9CisJCQorCisJCWlmIChvcGVyYXRpb24pIHsKKwkJICAgIHdvcGVyYXRpb24gPSBQeVVuaWNvZGVfRGVjb2RlQVNDSUkob3BlcmF0aW9uLCAKKwkJCQkJCSAgICAgICBzdHJsZW4ob3BlcmF0aW9uKSwgTlVMTCk7CisJCSAgICBpZiAoIXdvcGVyYXRpb24pIHsKKwkJCSAgICBQeUVycl9DbGVhcigpOworCQkJICAgIG9wZXJhdGlvbiA9IE5VTEw7CisJCQkgICAgZ290byBub3JtYWw7CisJCSAgICB9CisJCX0KKwkJCQorCQlQeV9CRUdJTl9BTExPV19USFJFQURTCisJCXJjID0gU2hlbGxFeGVjdXRlVygoSFdORCkwLCB3b3BlcmF0aW9uID8gUHlVbmljb2RlX0FTX1VOSUNPREUod29wZXJhdGlvbikgOiAwLAorCQkJUHlVbmljb2RlX0FTX1VOSUNPREUodW5pcGF0aCksCisJCQlOVUxMLCBOVUxMLCBTV19TSE9XTk9STUFMKTsKKwkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworCQlQeV9YREVDUkVGKHdvcGVyYXRpb24pOworCQlpZiAocmMgPD0gKEhJTlNUQU5DRSkzMikgeworCQkJUHlPYmplY3QgKmVycnZhbCA9IHdpbjMyX2Vycm9yX3VuaWNvZGUoInN0YXJ0ZmlsZSIsCisJCQkJCQlQeVVuaWNvZGVfQVNfVU5JQ09ERSh1bmlwYXRoKSk7CisJCQlyZXR1cm4gZXJydmFsOworCQl9CisJCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwkJcmV0dXJuIFB5X05vbmU7CisJfQorI2VuZGlmCisKK25vcm1hbDoKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0fHM6c3RhcnRmaWxlIiwgCiAJCQkgICAgICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmZmlsZXBhdGgsIAogCQkJICAgICAgJm9wZXJhdGlvbikpCkBAIC03Njk1LDYgKzc3OTMsMTIgQEAKICNpZmRlZiBIQVZFX1dBSVQKIAl7IndhaXQiLAlwb3NpeF93YWl0LCBNRVRIX05PQVJHUywgcG9zaXhfd2FpdF9fZG9jX199LAogI2VuZGlmIC8qIEhBVkVfV0FJVCAqLworI2lmZGVmIEhBVkVfV0FJVDMKKyAgICAgICAgeyJ3YWl0MyIsCXBvc2l4X3dhaXQzLCBNRVRIX1ZBUkFSR1MsIHBvc2l4X3dhaXQzX19kb2NfX30sCisjZW5kaWYgLyogSEFWRV9XQUlUMyAqLworI2lmZGVmIEhBVkVfV0FJVDQKKyAgICAgICAgeyJ3YWl0NCIsCXBvc2l4X3dhaXQ0LCBNRVRIX1ZBUkFSR1MsIHBvc2l4X3dhaXQ0X19kb2NfX30sCisjZW5kaWYgLyogSEFWRV9XQUlUNCAqLwogI2lmIGRlZmluZWQoSEFWRV9XQUlUUElEKSB8fCBkZWZpbmVkKEhBVkVfQ1dBSVQpCiAJeyJ3YWl0cGlkIiwJcG9zaXhfd2FpdHBpZCwgTUVUSF9WQVJBUkdTLCBwb3NpeF93YWl0cGlkX19kb2NfX30sCiAjZW5kaWYgLyogSEFWRV9XQUlUUElEICovCkBAIC04MTQyLDE5ICs4MjQ2LDI3IEBACiAJCXBvc2l4X3B1dGVudl9nYXJiYWdlID0gUHlEaWN0X05ldygpOwogI2VuZGlmCiAKLQlzdGF0X3Jlc3VsdF9kZXNjLm5hbWUgPSBNT0ROQU1FICIuc3RhdF9yZXN1bHQiOwotCXN0YXRfcmVzdWx0X2Rlc2MuZmllbGRzWzddLm5hbWUgPSBQeVN0cnVjdFNlcXVlbmNlX1VubmFtZWRGaWVsZDsKLQlzdGF0X3Jlc3VsdF9kZXNjLmZpZWxkc1s4XS5uYW1lID0gUHlTdHJ1Y3RTZXF1ZW5jZV9Vbm5hbWVkRmllbGQ7Ci0Jc3RhdF9yZXN1bHRfZGVzYy5maWVsZHNbOV0ubmFtZSA9IFB5U3RydWN0U2VxdWVuY2VfVW5uYW1lZEZpZWxkOwotCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRSZXN1bHRUeXBlLCAmc3RhdF9yZXN1bHRfZGVzYyk7Ci0Jc3RydWN0c2VxX25ldyA9IFN0YXRSZXN1bHRUeXBlLnRwX25ldzsKLQlTdGF0UmVzdWx0VHlwZS50cF9uZXcgPSBzdGF0cmVzdWx0X25ldzsKKwlpZiAoIWluaXRpYWxpemVkKSB7CisJCXN0YXRfcmVzdWx0X2Rlc2MubmFtZSA9IE1PRE5BTUUgIi5zdGF0X3Jlc3VsdCI7CisJCXN0YXRfcmVzdWx0X2Rlc2MuZmllbGRzWzddLm5hbWUgPSBQeVN0cnVjdFNlcXVlbmNlX1VubmFtZWRGaWVsZDsKKwkJc3RhdF9yZXN1bHRfZGVzYy5maWVsZHNbOF0ubmFtZSA9IFB5U3RydWN0U2VxdWVuY2VfVW5uYW1lZEZpZWxkOworCQlzdGF0X3Jlc3VsdF9kZXNjLmZpZWxkc1s5XS5uYW1lID0gUHlTdHJ1Y3RTZXF1ZW5jZV9Vbm5hbWVkRmllbGQ7CisJCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRSZXN1bHRUeXBlLCAmc3RhdF9yZXN1bHRfZGVzYyk7CisJCXN0cnVjdHNlcV9uZXcgPSBTdGF0UmVzdWx0VHlwZS50cF9uZXc7CisJCVN0YXRSZXN1bHRUeXBlLnRwX25ldyA9IHN0YXRyZXN1bHRfbmV3OworCisJCXN0YXR2ZnNfcmVzdWx0X2Rlc2MubmFtZSA9IE1PRE5BTUUgIi5zdGF0dmZzX3Jlc3VsdCI7CisJCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRWRlNSZXN1bHRUeXBlLCAmc3RhdHZmc19yZXN1bHRfZGVzYyk7CisJfQogCVB5X0lOQ1JFRigoUHlPYmplY3QqKSAmU3RhdFJlc3VsdFR5cGUpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RhdF9yZXN1bHQiLCAoUHlPYmplY3QqKSAmU3RhdFJlc3VsdFR5cGUpOwotCi0Jc3RhdHZmc19yZXN1bHRfZGVzYy5uYW1lID0gTU9ETkFNRSAiLnN0YXR2ZnNfcmVzdWx0IjsKLQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0VkZTUmVzdWx0VHlwZSwgJnN0YXR2ZnNfcmVzdWx0X2Rlc2MpOwogCVB5X0lOQ1JFRigoUHlPYmplY3QqKSAmU3RhdFZGU1Jlc3VsdFR5cGUpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RhdHZmc19yZXN1bHQiLAogCQkJICAgKFB5T2JqZWN0KikgJlN0YXRWRlNSZXN1bHRUeXBlKTsKKwlpbml0aWFsaXplZCA9IDE7CiB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvcHdkbW9kdWxlLmMgYi9Nb2R1bGVzL3B3ZG1vZHVsZS5jCmluZGV4IDllN2I4NjQuLjllMDFmNDggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcHdkbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wd2Rtb2R1bGUuYwpAQCAtNDIsNiArNDIsNyBAQAogZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiB0aGUgZW50cnkgYXNrZWQgZm9yIGNhbm5vdCBiZSBmb3VuZC4iKTsKIAogICAgICAgCitzdGF0aWMgaW50IGluaXRpYWxpemVkOwogc3RhdGljIFB5VHlwZU9iamVjdCBTdHJ1Y3RQd2RUeXBlOwogCiBzdGF0aWMgdm9pZApAQCAtMTg2LDkgKzE4NywxMiBAQAogCWlmIChtID09IE5VTEwpCiAgICAgCQlyZXR1cm47CiAKLQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RQd2RUeXBlLCAmc3RydWN0X3B3ZF90eXBlX2Rlc2MpOworCWlmICghaW5pdGlhbGl6ZWQpCisJCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFB3ZFR5cGUsIAorCQkJCQkgICZzdHJ1Y3RfcHdkX3R5cGVfZGVzYyk7CiAJUHlfSU5DUkVGKChQeU9iamVjdCAqKSAmU3RydWN0UHdkVHlwZSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcGFzc3dkIiwgKFB5T2JqZWN0ICopICZTdHJ1Y3RQd2RUeXBlKTsKIAkvKiBBbmQgZm9yIGIvdyBjb21wYXRpYmlsaXR5ICh0aGlzIHdhcyBkZWZpbmVkIGJ5IG1pc3Rha2UpOiAqLwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3B3ZW50IiwgKFB5T2JqZWN0ICopICZTdHJ1Y3RQd2RUeXBlKTsKKwlpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3B5ZXhwYXQuYyBiL01vZHVsZXMvcHlleHBhdC5jCmluZGV4IGU0YmYxODAuLmZlNTBlMzYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcHlleHBhdC5jCisrKyBiL01vZHVsZXMvcHlleHBhdC5jCkBAIC0xNTE5LDYgKzE1MTksOCBAQAogICAgIGlmIChzdHJjbXAobmFtZSwgIl9fbWVtYmVyc19fIikgPT0gMCkgewogICAgICAgICBpbnQgaTsKICAgICAgICAgUHlPYmplY3QgKnJjID0gUHlMaXN0X05ldygwKTsKKwlpZiAoIXJjKQorCQlyZXR1cm4gTlVMTDsKICAgICAgICAgZm9yIChpID0gMDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqbyA9IGdldF9oYW5kbGVyX25hbWUoJmhhbmRsZXJfaW5mb1tpXSk7CiAgICAgICAgICAgICBpZiAobyAhPSBOVUxMKQpAQCAtMTY1MiwxNCArMTY1NCw5IEBACiBzdGF0aWMgaW50CiB4bWxwYXJzZV90cmF2ZXJzZSh4bWxwYXJzZW9iamVjdCAqb3AsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotICAgIGludCBpLCBlcnI7Ci0gICAgZm9yIChpID0gMDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7Ci0gICAgICAgIGlmICghb3AtPmhhbmRsZXJzW2ldKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGVyciA9IHZpc2l0KG9wLT5oYW5kbGVyc1tpXSwgYXJnKTsKLSAgICAgICAgaWYgKGVycikKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQorICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGhhbmRsZXJfaW5mb1tpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgUHlfVklTSVQob3AtPmhhbmRsZXJzW2ldKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTY2Nyw4ICsxNjY0LDcgQEAKIHhtbHBhcnNlX2NsZWFyKHhtbHBhcnNlb2JqZWN0ICpvcCkKIHsKICAgICBjbGVhcl9oYW5kbGVycyhvcCwgMCk7Ci0gICAgUHlfWERFQ1JFRihvcC0+aW50ZXJuKTsKLSAgICBvcC0+aW50ZXJuID0gMDsKKyAgICBQeV9DTEVBUihvcC0+aW50ZXJuKTsKICAgICByZXR1cm4gMDsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9yZWdleG1vZHVsZS5jIGIvTW9kdWxlcy9yZWdleG1vZHVsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmI0MTk4Li4wMDAwMDAwCi0tLSBhL01vZHVsZXMvcmVnZXhtb2R1bGUuYworKysgL2Rldi9udWxsCkBAIC0xLDY5MCArMCwwIEBACi0vKgotWFhYIHN1cHBvcnQgcmFuZ2UgcGFyYW1ldGVyIG9uIHNlYXJjaAotWFhYIHN1cHBvcnQgbXN0b3AgcGFyYW1ldGVyIG9uIHNlYXJjaAotKi8KLQotCi0vKiBSZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0cyAqLwotLyogVGhpcyB1c2VzIFRhdHUgWWxvbmVuJ3MgY29weWxlZnQtZnJlZSByZWltcGxlbWVudGF0aW9uIG9mCi0gICBHTlUgcmVndWxhciBleHByZXNzaW9ucyAqLwotCi0jaW5jbHVkZSAiUHl0aG9uLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAicmVnZXhwci5oIgotCi1zdGF0aWMgUHlPYmplY3QgKlJlZ2V4RXJyb3I7CS8qIEV4Y2VwdGlvbiAqLwkKLQotdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgcmVfcGF0YnVmOyAvKiBUaGUgY29tcGlsZWQgZXhwcmVzc2lvbiAqLwotCXN0cnVjdCByZV9yZWdpc3RlcnMgcmVfcmVnczsgLyogVGhlIHJlZ2lzdGVycyBmcm9tIHRoZSBsYXN0IG1hdGNoICovCi0JY2hhciByZV9mYXN0bWFwWzI1Nl07CS8qIFN0b3JhZ2UgZm9yIGZhc3RtYXAgKi8KLQlQeU9iamVjdCAqcmVfdHJhbnNsYXRlOwkvKiBTdHJpbmcgb2JqZWN0IGZvciB0cmFuc2xhdGUgdGFibGUgKi8KLQlQeU9iamVjdCAqcmVfbGFzdG9rOwkvKiBTdHJpbmcgb2JqZWN0IGxhc3QgbWF0Y2hlZC9zZWFyY2hlZCAqLwotCVB5T2JqZWN0ICpyZV9ncm91cGluZGV4OwkvKiBHcm91cCBuYW1lIHRvIGluZGV4IGRpY3Rpb25hcnkgKi8KLQlQeU9iamVjdCAqcmVfZ2l2ZW5wYXQ7CS8qIFBhdHRlcm4gd2l0aCBzeW1ib2xpYyBncm91cHMgKi8KLQlQeU9iamVjdCAqcmVfcmVhbHBhdDsJLyogUGF0dGVybiB3aXRob3V0IHN5bWJvbGljIGdyb3VwcyAqLwotfSByZWdleG9iamVjdDsKLQotLyogUmVnZXggb2JqZWN0IG1ldGhvZHMgKi8KLQotc3RhdGljIHZvaWQKLXJlZ19kZWFsbG9jKHJlZ2V4b2JqZWN0ICpyZSkKLXsKLQlpZiAocmUtPnJlX3BhdGJ1Zi5idWZmZXIpCi0JCWZyZWUocmUtPnJlX3BhdGJ1Zi5idWZmZXIpOwotCVB5X1hERUNSRUYocmUtPnJlX3RyYW5zbGF0ZSk7Ci0JUHlfWERFQ1JFRihyZS0+cmVfbGFzdG9rKTsKLQlQeV9YREVDUkVGKHJlLT5yZV9ncm91cGluZGV4KTsKLQlQeV9YREVDUkVGKHJlLT5yZV9naXZlbnBhdCk7Ci0JUHlfWERFQ1JFRihyZS0+cmVfcmVhbHBhdCk7Ci0JUHlPYmplY3RfRGVsKHJlKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLW1ha2VyZXN1bHQoc3RydWN0IHJlX3JlZ2lzdGVycyAqcmVncykKLXsKLQlQeU9iamVjdCAqdjsKLQlpbnQgaTsKLQlzdGF0aWMgUHlPYmplY3QgKmZpbGxlciA9IE5VTEw7Ci0KLQlpZiAoZmlsbGVyID09IE5VTEwpIHsKLQkJZmlsbGVyID0gUHlfQnVpbGRWYWx1ZSgiKGlpKSIsIC0xLCAtMSk7Ci0JCWlmIChmaWxsZXIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQl2ID0gUHlUdXBsZV9OZXcoUkVfTlJFR1MpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8IFJFX05SRUdTOyBpKyspIHsKLQkJaW50IGxvID0gcmVncy0+c3RhcnRbaV07Ci0JCWludCBoaSA9IHJlZ3MtPmVuZFtpXTsKLQkJUHlPYmplY3QgKnc7Ci0JCWlmIChsbyA9PSAtMSAmJiBoaSA9PSAtMSkgewotCQkJdyA9IGZpbGxlcjsKLQkJCVB5X0lOQ1JFRih3KTsKLQkJfQotCQllbHNlCi0JCQl3ID0gUHlfQnVpbGRWYWx1ZSgiKGlpKSIsIGxvLCBoaSk7Ci0JCWlmICh3ID09IE5VTEwgfHwgUHlUdXBsZV9TZXRJdGVtKHYsIGksIHcpIDwgMCkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHY7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1yZWdvYmpfbWF0Y2gocmVnZXhvYmplY3QgKnJlLCBQeU9iamVjdCAqYXJncykKLXsKLQlQeU9iamVjdCAqYXJnc3RyaW5nOwotCWNoYXIgKmJ1ZmZlcjsKLQlpbnQgc2l6ZTsKLQlpbnQgb2Zmc2V0ID0gMDsKLQlpbnQgcmVzdWx0OwotCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6bWF0Y2giLCAmYXJnc3RyaW5nLCAmb2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZShhcmdzdHJpbmcsICJ0IyIsICZidWZmZXIsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBzaXplKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhSZWdleEVycm9yLCAibWF0Y2ggb2Zmc2V0IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfWERFQ1JFRihyZS0+cmVfbGFzdG9rKTsKLQlyZS0+cmVfbGFzdG9rID0gTlVMTDsKLQlyZXN1bHQgPSBfUHlfcmVfbWF0Y2goJnJlLT5yZV9wYXRidWYsICh1bnNpZ25lZCBjaGFyICopYnVmZmVyLCBzaXplLCBvZmZzZXQsCi0JCQkgICAgICAmcmUtPnJlX3JlZ3MpOwotCWlmIChyZXN1bHQgPCAtMSkgewotCQkvKiBTZXJpb3VzIGZhaWx1cmUgb2Ygc29tZSBzb3J0OyBpZiByZV9tYXRjaCBkaWRuJ3QgCi0JCSAgIHNldCBhbiBleGNlcHRpb24sIHJhaXNlIGEgZ2VuZXJpYyBlcnJvciAqLwotCSAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhSZWdleEVycm9yLCAibWF0Y2ggZmFpbHVyZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHJlc3VsdCA+PSAwKSB7Ci0JCVB5X0lOQ1JFRihhcmdzdHJpbmcpOwotCQlyZS0+cmVfbGFzdG9rID0gYXJnc3RyaW5nOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmVzdWx0KTsgLyogTGVuZ3RoIG9mIHRoZSBtYXRjaCBvciAtMSAqLwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotcmVnb2JqX3NlYXJjaChyZWdleG9iamVjdCAqcmUsIFB5T2JqZWN0ICphcmdzKQotewotCVB5T2JqZWN0ICphcmdzdHJpbmc7Ci0JY2hhciAqYnVmZmVyOwotCWludCBzaXplOwotCWludCBvZmZzZXQgPSAwOwotCWludCByYW5nZTsKLQlpbnQgcmVzdWx0OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnNlYXJjaCIsICZhcmdzdHJpbmcsICZvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3N0cmluZywgInQjOnNlYXJjaCIsICZidWZmZXIsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBzaXplKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhSZWdleEVycm9yLCAic2VhcmNoIG9mZnNldCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIE5COiBJbiBFbWFjcyAxOC41NywgdGhlIGRvY3VtZW50YXRpb24gZm9yIHJlX3NlYXJjaFtfMl0gYW5kCi0JICAgdGhlIGltcGxlbWVudGF0aW9uIGRvbid0IG1hdGNoOiB0aGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdAotCSAgIHxyYW5nZXwgcG9zaXRpb25zIGFyZSB0cmllZCwgd2hpbGUgdGhlIGNvZGUgdHJpZXMgfHJhbmdlfCsxCi0JICAgcG9zaXRpb25zLiAgSXQgc2VlbXMgbW9yZSBwcm9kdWN0aXZlIHRvIGJlbGlldmUgdGhlIGNvZGUhICovCi0JcmFuZ2UgPSBzaXplIC0gb2Zmc2V0OwotCVB5X1hERUNSRUYocmUtPnJlX2xhc3Rvayk7Ci0JcmUtPnJlX2xhc3RvayA9IE5VTEw7Ci0JcmVzdWx0ID0gX1B5X3JlX3NlYXJjaCgmcmUtPnJlX3BhdGJ1ZiwgKHVuc2lnbmVkIGNoYXIgKilidWZmZXIsIHNpemUsIG9mZnNldCwgcmFuZ2UsCi0JCQkgICAmcmUtPnJlX3JlZ3MpOwotCWlmIChyZXN1bHQgPCAtMSkgewotCQkvKiBTZXJpb3VzIGZhaWx1cmUgb2Ygc29tZSBzb3J0OyBpZiByZV9tYXRjaCBkaWRuJ3QgCi0JCSAgIHNldCBhbiBleGNlcHRpb24sIHJhaXNlIGEgZ2VuZXJpYyBlcnJvciAqLwotCSAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCSAgCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFJlZ2V4RXJyb3IsICJtYXRjaCBmYWlsdXJlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocmVzdWx0ID49IDApIHsKLQkJUHlfSU5DUkVGKGFyZ3N0cmluZyk7Ci0JCXJlLT5yZV9sYXN0b2sgPSBhcmdzdHJpbmc7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXN1bHQpOyAvKiBQb3NpdGlvbiBvZiB0aGUgbWF0Y2ggb3IgLTEgKi8KLX0KLQotLyogZ2V0IHRoZSBncm91cCBmcm9tIHRoZSByZWdleCB3aGVyZSBpbmRleCBjYW4gYmUgYSBzdHJpbmcgKGdyb3VwIG5hbWUpIG9yCi0gICBhbiBpbnRlZ2VyIGluZGV4IFswIC4uIDk5XQotICovCi1zdGF0aWMgUHlPYmplY3QqCi1ncm91cF9mcm9tX2luZGV4KHJlZ2V4b2JqZWN0ICpyZSwgUHlPYmplY3QgKmluZGV4KQotewotCWludCBpLCBhLCBiOwotCWNoYXIgKnY7Ci0KLQlpZiAoUHlTdHJpbmdfQ2hlY2soaW5kZXgpKQotCQlpZiAocmUtPnJlX2dyb3VwaW5kZXggPT0gTlVMTCB8fAotCQkgICAgIShpbmRleCA9IFB5RGljdF9HZXRJdGVtKHJlLT5yZV9ncm91cGluZGV4LCBpbmRleCkpKQotCQl7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUmVnZXhFcnJvciwKLQkJCQkJImdyb3VwKCkgZ3JvdXAgbmFtZSBkb2Vzbid0IGV4aXN0Iik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JaSA9IFB5SW50X0FzTG9uZyhpbmRleCk7Ci0JaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoaSA8IDAgfHwgaSA+PSBSRV9OUkVHUykgewotCQlQeUVycl9TZXRTdHJpbmcoUmVnZXhFcnJvciwgImdyb3VwKCkgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocmUtPnJlX2xhc3RvayA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhSZWdleEVycm9yLAotCQkJICAgImdyb3VwKCkgb25seSB2YWxpZCBhZnRlciBzdWNjZXNzZnVsIG1hdGNoL3NlYXJjaCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYSA9IHJlLT5yZV9yZWdzLnN0YXJ0W2ldOwotCWIgPSByZS0+cmVfcmVncy5lbmRbaV07Ci0JaWYgKGEgPCAwIHx8IGIgPCAwKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCQotCWlmICghKHYgPSBQeVN0cmluZ19Bc1N0cmluZyhyZS0+cmVfbGFzdG9rKSkpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHYrYSwgYi1hKTsKLX0KLQotCi1zdGF0aWMgUHlPYmplY3QgKgotcmVnb2JqX2dyb3VwKHJlZ2V4b2JqZWN0ICpyZSwgUHlPYmplY3QgKmFyZ3MpCi17Ci0JaW50IG4gPSBQeVR1cGxlX1NpemUoYXJncyk7Ci0JaW50IGk7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0KLQlpZiAobiA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm5vdCBlbm91Z2ggYXJndW1lbnRzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAobiA9PSAxKSB7Ci0JCS8qIHJldHVybiB2YWx1ZSBpcyBhIHNpbmdsZSBzdHJpbmcgKi8KLQkJUHlPYmplY3QgKmluZGV4ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOwotCQlpZiAoIWluZGV4KQotCQkJcmV0dXJuIE5VTEw7Ci0JCQotCQlyZXR1cm4gZ3JvdXBfZnJvbV9pbmRleChyZSwgaW5kZXgpOwotCX0KLQotCS8qIHJldHVybiB2YWx1ZSBpcyBhIHR1cGxlICovCi0JaWYgKCEocmVzID0gUHlUdXBsZV9OZXcobikpKQotCQlyZXR1cm4gTlVMTDsKLQotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKmluZGV4ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpOwotCQlQeU9iamVjdCAqZ3JvdXAgPSBOVUxMOwotCi0JCWlmICghaW5kZXgpCi0JCQlnb3RvIGZpbmFsbHk7Ci0JCWlmICghKGdyb3VwID0gZ3JvdXBfZnJvbV9pbmRleChyZSwgaW5kZXgpKSkKLQkJCWdvdG8gZmluYWxseTsKLQkJaWYgKFB5VHVwbGVfU2V0SXRlbShyZXMsIGksIGdyb3VwKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQotCXJldHVybiByZXM7Ci0KLSAgZmluYWxseToKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIHJlZ19tZXRob2RzW10gPSB7Ci0JeyJtYXRjaCIsCShQeUNGdW5jdGlvbilyZWdvYmpfbWF0Y2gsIE1FVEhfVkFSQVJHU30sCi0JeyJzZWFyY2giLAkoUHlDRnVuY3Rpb24pcmVnb2JqX3NlYXJjaCwgTUVUSF9WQVJBUkdTfSwKLQl7Imdyb3VwIiwJKFB5Q0Z1bmN0aW9uKXJlZ29ial9ncm91cCwgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLwotfTsKLQotCi0MCi1zdGF0aWMgY2hhciogbWVtYmVyc1tdID0gewotCSJsYXN0IiwgInJlZ3MiLCAidHJhbnNsYXRlIiwKLQkiZ3JvdXBpbmRleCIsICJyZWFscGF0IiwgImdpdmVucGF0IiwKLQlOVUxMCi19OwotCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1yZWdvYmpfZ2V0YXR0cihyZWdleG9iamVjdCAqcmUsIGNoYXIgKm5hbWUpCi17Ci0JaWYgKHN0cmNtcChuYW1lLCAicmVncyIpID09IDApIHsKLQkJaWYgKHJlLT5yZV9sYXN0b2sgPT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJcmV0dXJuIFB5X05vbmU7Ci0JCX0KLQkJcmV0dXJuIG1ha2VyZXN1bHQoJnJlLT5yZV9yZWdzKTsKLQl9Ci0JaWYgKHN0cmNtcChuYW1lLCAibGFzdCIpID09IDApIHsKLQkJaWYgKHJlLT5yZV9sYXN0b2sgPT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJcmV0dXJuIFB5X05vbmU7Ci0JCX0KLQkJUHlfSU5DUkVGKHJlLT5yZV9sYXN0b2spOwotCQlyZXR1cm4gcmUtPnJlX2xhc3RvazsKLQl9Ci0JaWYgKHN0cmNtcChuYW1lLCAidHJhbnNsYXRlIikgPT0gMCkgewotCQlpZiAocmUtPnJlX3RyYW5zbGF0ZSA9PSBOVUxMKSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCQlQeV9JTkNSRUYocmUtPnJlX3RyYW5zbGF0ZSk7Ci0JCXJldHVybiByZS0+cmVfdHJhbnNsYXRlOwotCX0KLQlpZiAoc3RyY21wKG5hbWUsICJncm91cGluZGV4IikgPT0gMCkgewotCQlpZiAocmUtPnJlX2dyb3VwaW5kZXggPT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJcmV0dXJuIFB5X05vbmU7Ci0JCX0KLQkJUHlfSU5DUkVGKHJlLT5yZV9ncm91cGluZGV4KTsKLQkJcmV0dXJuIHJlLT5yZV9ncm91cGluZGV4OwotCX0KLQlpZiAoc3RyY21wKG5hbWUsICJyZWFscGF0IikgPT0gMCkgewotCQlpZiAocmUtPnJlX3JlYWxwYXQgPT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJcmV0dXJuIFB5X05vbmU7Ci0JCX0KLQkJUHlfSU5DUkVGKHJlLT5yZV9yZWFscGF0KTsKLQkJcmV0dXJuIHJlLT5yZV9yZWFscGF0OwotCX0KLQlpZiAoc3RyY21wKG5hbWUsICJnaXZlbnBhdCIpID09IDApIHsKLQkJaWYgKHJlLT5yZV9naXZlbnBhdCA9PSBOVUxMKSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCQlQeV9JTkNSRUYocmUtPnJlX2dpdmVucGF0KTsKLQkJcmV0dXJuIHJlLT5yZV9naXZlbnBhdDsKLQl9Ci0JaWYgKHN0cmNtcChuYW1lLCAiX19tZW1iZXJzX18iKSA9PSAwKSB7Ci0JCWludCBpID0gMDsKLQkJUHlPYmplY3QgKmxpc3QgPSBOVUxMOwotCi0JCS8qIG9rYXksIHNvIGl0J3MgdW5saWtlbHkgdGhpcyBsaXN0IHdpbGwgY2hhbmdlIHRoYXQgb2Z0ZW4uCi0JCSAgIHN0aWxsLCBpdCdzIGVhc2llciB0byBjaGFuZ2UgaXQgaW4ganVzdCBvbmUgcGxhY2UuCi0JCSAqLwotCQl3aGlsZSAobWVtYmVyc1tpXSkKLQkJCWkrKzsKLQkJaWYgKCEobGlzdCA9IFB5TGlzdF9OZXcoaSkpKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJaSA9IDA7Ci0JCXdoaWxlIChtZW1iZXJzW2ldKSB7Ci0JCQlQeU9iamVjdCogdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobWVtYmVyc1tpXSk7Ci0JCQlpZiAoIXYgfHwgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgdikgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKGxpc3QpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaSsrOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQlyZXR1cm4gUHlfRmluZE1ldGhvZChyZWdfbWV0aG9kcywgKFB5T2JqZWN0ICopcmUsIG5hbWUpOwotfQotCi1zdGF0aWMgUHlUeXBlT2JqZWN0IFJlZ2V4dHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLAkJCQkgICAgIC8qb2Jfc2l6ZSovCi0JInJlZ2V4LnJlZ2V4IiwJCQkgICAgIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKHJlZ2V4b2JqZWN0KSwJCSAgICAgLyp0cF9zaXplKi8KLQkwLAkJCQkgICAgIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilyZWdfZGVhbGxvYywJICAgICAvKnRwX2RlYWxsb2MqLwotCTAsCQkJCSAgICAgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKXJlZ29ial9nZXRhdHRyLAkgICAgIC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkJICAgICAvKnRwX3NldGF0dHIqLwotCTAsCQkJCSAgICAgLyp0cF9jb21wYXJlKi8KLQkwLAkJCQkgICAgIC8qdHBfcmVwciovCi19OwotCi0vKiByZWZlcmVuY2UgY291bnRpbmcgaW52YXJpYW50czoKLSAgIHBhdHRlcm46IGJvcnJvd2VkCi0gICB0cmFuc2xhdGU6IGJvcnJvd2VkCi0gICBnaXZlbnBhdDogYm9ycm93ZWQKLSAgIGdyb3VwaW5kZXg6IHRyYW5zZmVycmVkCi0qLwotc3RhdGljIFB5T2JqZWN0ICoKLW5ld3JlZ2V4b2JqZWN0KFB5T2JqZWN0ICpwYXR0ZXJuLCBQeU9iamVjdCAqdHJhbnNsYXRlLCBQeU9iamVjdCAqZ2l2ZW5wYXQsIFB5T2JqZWN0ICpncm91cGluZGV4KQotewotCXJlZ2V4b2JqZWN0ICpyZTsKLQljaGFyICpwYXQ7Ci0JaW50IHNpemU7Ci0KLQlpZiAoIVB5QXJnX1BhcnNlKHBhdHRlcm4sICJ0IyIsICZwYXQsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYgKHRyYW5zbGF0ZSAhPSBOVUxMICYmIFB5U3RyaW5nX1NpemUodHJhbnNsYXRlKSAhPSAyNTYpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFJlZ2V4RXJyb3IsCi0JCQkJInRyYW5zbGF0aW9uIHRhYmxlIG11c3QgYmUgMjU2IGJ5dGVzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZSA9IFB5T2JqZWN0X05ldyhyZWdleG9iamVjdCwgJlJlZ2V4dHlwZSk7Ci0JaWYgKHJlICE9IE5VTEwpIHsKLQkJY2hhciAqZXJyb3I7Ci0JCXJlLT5yZV9wYXRidWYuYnVmZmVyID0gTlVMTDsKLQkJcmUtPnJlX3BhdGJ1Zi5hbGxvY2F0ZWQgPSAwOwotCQlyZS0+cmVfcGF0YnVmLmZhc3RtYXAgPSAodW5zaWduZWQgY2hhciAqKXJlLT5yZV9mYXN0bWFwOwotCQlpZiAodHJhbnNsYXRlKSB7Ci0JCQlyZS0+cmVfcGF0YnVmLnRyYW5zbGF0ZSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcodHJhbnNsYXRlKTsKLQkJCWlmICghcmUtPnJlX3BhdGJ1Zi50cmFuc2xhdGUpCi0JCQkJZ290byBmaW5hbGx5OwotCQkJUHlfSU5DUkVGKHRyYW5zbGF0ZSk7Ci0JCX0KLQkJZWxzZQotCQkJcmUtPnJlX3BhdGJ1Zi50cmFuc2xhdGUgPSBOVUxMOwotCQlyZS0+cmVfdHJhbnNsYXRlID0gdHJhbnNsYXRlOwotCQlyZS0+cmVfbGFzdG9rID0gTlVMTDsKLQkJcmUtPnJlX2dyb3VwaW5kZXggPSBncm91cGluZGV4OwotCQlQeV9JTkNSRUYocGF0dGVybik7Ci0JCXJlLT5yZV9yZWFscGF0ID0gcGF0dGVybjsKLQkJUHlfSU5DUkVGKGdpdmVucGF0KTsKLQkJcmUtPnJlX2dpdmVucGF0ID0gZ2l2ZW5wYXQ7Ci0JCWVycm9yID0gX1B5X3JlX2NvbXBpbGVfcGF0dGVybigodW5zaWduZWQgY2hhciAqKXBhdCwgc2l6ZSwgJnJlLT5yZV9wYXRidWYpOwotCQlpZiAoZXJyb3IgIT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFJlZ2V4RXJyb3IsIGVycm9yKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcmU7Ci0gIGZpbmFsbHk6Ci0JUHlfREVDUkVGKHJlKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ2V4X2NvbXBpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotCVB5T2JqZWN0ICpwYXQgPSBOVUxMOwotCVB5T2JqZWN0ICp0cmFuID0gTlVMTDsKLQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiU3xTOmNvbXBpbGUiLCAmcGF0LCAmdHJhbikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBuZXdyZWdleG9iamVjdChwYXQsIHRyYW4sIHBhdCwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1zeW1jb21wKFB5T2JqZWN0ICpwYXR0ZXJuLCBQeU9iamVjdCAqZ2RpY3QpCi17Ci0JY2hhciAqb3BhdCwgKm9lbmQsICpvLCAqbiwgKmcsICp2OwotCWludCBncm91cF9jb3VudCA9IDA7Ci0JaW50IHN6OwotCWludCBlc2NhcGVkID0gMDsKLQljaGFyIG5hbWVfYnVmWzEyOF07Ci0JUHlPYmplY3QgKm5wYXR0ZXJuOwotCWludCByZXF1aXJlX2VzY2FwZSA9IHJlX3N5bnRheCAmIFJFX05PX0JLX1BBUkVOUyA/IDAgOiAxOwotCi0JaWYgKCEob3BhdCA9IFB5U3RyaW5nX0FzU3RyaW5nKHBhdHRlcm4pKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoKHN6ID0gUHlTdHJpbmdfU2l6ZShwYXR0ZXJuKSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQotCW9lbmQgPSBvcGF0ICsgc3o7Ci0JbyA9IG9wYXQ7Ci0KLQlpZiAob2VuZCA9PSBvcGF0KSB7Ci0JCVB5X0lOQ1JFRihwYXR0ZXJuKTsKLQkJcmV0dXJuIHBhdHRlcm47Ci0JfQotCi0JaWYgKCEobnBhdHRlcm4gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopTlVMTCwgc3opKSB8fAotCSAgICAhKG4gPSBQeVN0cmluZ19Bc1N0cmluZyhucGF0dGVybikpKQotCQlyZXR1cm4gTlVMTDsKLQotCXdoaWxlIChvIDwgb2VuZCkgewotCQlpZiAoKm8gPT0gJygnICYmIGVzY2FwZWQgPT0gcmVxdWlyZV9lc2NhcGUpIHsKLQkJCWNoYXIgKmJhY2t0cmFjazsKLQkJCWVzY2FwZWQgPSAwOwotCQkJKytncm91cF9jb3VudDsKLQkJCSpuKysgPSAqbzsKLQkJCWlmICgrK28gPj0gb2VuZCB8fCAqbyAhPSAnPCcpCi0JCQkJY29udGludWU7Ci0JCQkvKiAqbyA9PSAnPCcgKi8KLQkJCWlmIChvKzEgPCBvZW5kICYmICoobysxKSA9PSAnPicpCi0JCQkJY29udGludWU7Ci0JCQliYWNrdHJhY2sgPSBvOwotCQkJZyA9IG5hbWVfYnVmOwotCQkJZm9yICgrK287IG8gPCBvZW5kOykgewotCQkJCWlmICgqbyA9PSAnPicpIHsKLQkJCQkgICAgUHlPYmplY3QgKmdyb3VwX25hbWUgPSBOVUxMOwotCQkJCSAgICBQeU9iamVjdCAqZ3JvdXBfaW5kZXggPSBOVUxMOwotCQkJCSAgICAqZysrID0gJ1wwJzsKLQkJCQkgICAgZ3JvdXBfbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZV9idWYpOwotCQkJCSAgICBncm91cF9pbmRleCA9IFB5SW50X0Zyb21Mb25nKGdyb3VwX2NvdW50KTsKLQkJCQkgICAgaWYgKGdyb3VwX25hbWUgPT0gTlVMTCB8fAotCQkJCQlncm91cF9pbmRleCA9PSBOVUxMIHx8Ci0JCQkJCVB5RGljdF9TZXRJdGVtKGdkaWN0LCBncm91cF9uYW1lLAotCQkJCQkJICAgICAgIGdyb3VwX2luZGV4KSAhPSAwKQotCQkJCSAgICB7Ci0JCQkJCSAgICBQeV9YREVDUkVGKGdyb3VwX25hbWUpOwotCQkJCQkgICAgUHlfWERFQ1JFRihncm91cF9pbmRleCk7Ci0JCQkJCSAgICBQeV9YREVDUkVGKG5wYXR0ZXJuKTsKLQkJCQkJICAgIHJldHVybiBOVUxMOwotCQkJCSAgICB9Ci0JCQkJICAgIFB5X0RFQ1JFRihncm91cF9uYW1lKTsKLQkJCQkgICAgUHlfREVDUkVGKGdyb3VwX2luZGV4KTsKLQkJCQkgICAgKytvOyAgICAgLyogZWF0IHRoZSAnPicgKi8KLQkJCQkgICAgYnJlYWs7Ci0JCQkJfQotCQkJCWlmICghaXNhbG51bShQeV9DSEFSTUFTSygqbykpICYmICpvICE9ICdfJykgewotCQkJCQlvID0gYmFja3RyYWNrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJKmcrKyA9ICpvKys7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKm8gPT0gJ1snICYmICFlc2NhcGVkKSB7Ci0JCQkqbisrID0gKm87Ci0JCQkrK287CQkgICAgIC8qIGVhdCB0aGUgY2hhciBmb2xsb3dpbmcgJ1snICovCi0JCQkqbisrID0gKm87Ci0JCQl3aGlsZSAobyA8IG9lbmQgJiYgKm8gIT0gJ10nKSB7Ci0JCQkJKytvOwotCQkJCSpuKysgPSAqbzsKLQkJCX0KLQkJCWlmIChvIDwgb2VuZCkKLQkJCQkrK287Ci0JCX0KLQkJZWxzZSBpZiAoKm8gPT0gJ1xcJykgewotCQkJZXNjYXBlZCA9IDE7Ci0JCQkqbisrID0gKm87Ci0JCQkrK287Ci0JCX0KLQkJZWxzZSB7Ci0JCQllc2NhcGVkID0gMDsKLQkJCSpuKysgPSAqbzsKLQkJCSsrbzsKLQkJfQotCX0KLQotCWlmICghKHYgPSBQeVN0cmluZ19Bc1N0cmluZyhucGF0dGVybikpKSB7Ci0JCVB5X0RFQ1JFRihucGF0dGVybik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBfUHlTdHJpbmdfUmVzaXplKCkgZGVjcmVtZW50cyBucGF0dGVybiBvbiBmYWlsdXJlICovCi0JX1B5U3RyaW5nX1Jlc2l6ZSgmbnBhdHRlcm4sIG4gLSB2KTsKLQlyZXR1cm4gbnBhdHRlcm47Ci0KLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ2V4X3N5bWNvbXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotCVB5T2JqZWN0ICpwYXR0ZXJuOwotCVB5T2JqZWN0ICp0cmFuID0gTlVMTDsKLQlQeU9iamVjdCAqZ2RpY3QgPSBOVUxMOwotCVB5T2JqZWN0ICpucGF0dGVybjsKLQlQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKLQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiU3xTOnN5bWNvbXAiLCAmcGF0dGVybiwgJnRyYW4pKQotCQlyZXR1cm4gTlVMTDsKLQotCWdkaWN0ID0gUHlEaWN0X05ldygpOwotCWlmIChnZGljdCA9PSBOVUxMIHx8IChucGF0dGVybiA9IHN5bWNvbXAocGF0dGVybiwgZ2RpY3QpKSA9PSBOVUxMKSB7Ci0JCVB5X1hERUNSRUYoZ2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dmFsID0gbmV3cmVnZXhvYmplY3QobnBhdHRlcm4sIHRyYW4sIHBhdHRlcm4sIGdkaWN0KTsKLQlQeV9ERUNSRUYobnBhdHRlcm4pOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLQotc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9wYXQ7Ci1zdGF0aWMgUHlPYmplY3QgKmNhY2hlX3Byb2c7Ci0KLXN0YXRpYyBpbnQKLXVwZGF0ZV9jYWNoZShQeU9iamVjdCAqcGF0KQotewotCVB5T2JqZWN0ICp0dXBsZSA9IFB5VHVwbGVfUGFjaygxLCBwYXQpOwotCWludCBzdGF0dXMgPSAwOwotCi0JaWYgKCF0dXBsZSkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKHBhdCAhPSBjYWNoZV9wYXQpIHsKLQkJUHlfWERFQ1JFRihjYWNoZV9wYXQpOwotCQljYWNoZV9wYXQgPSBOVUxMOwotCQlQeV9YREVDUkVGKGNhY2hlX3Byb2cpOwotCQljYWNoZV9wcm9nID0gcmVnZXhfY29tcGlsZSgoUHlPYmplY3QgKilOVUxMLCB0dXBsZSk7Ci0JCWlmIChjYWNoZV9wcm9nID09IE5VTEwpIHsKLQkJCXN0YXR1cyA9IC0xOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWNhY2hlX3BhdCA9IHBhdDsKLQkJUHlfSU5DUkVGKGNhY2hlX3BhdCk7Ci0JfQotICBmaW5hbGx5OgotCVB5X0RFQ1JFRih0dXBsZSk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ2V4X21hdGNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLQlQeU9iamVjdCAqcGF0LCAqc3RyaW5nOwotCVB5T2JqZWN0ICp0dXBsZSwgKnY7Ci0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlNTOm1hdGNoIiwgJnBhdCwgJnN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCWlmICh1cGRhdGVfY2FjaGUocGF0KSA8IDApCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKCEodHVwbGUgPSBQeV9CdWlsZFZhbHVlKCIoUykiLCBzdHJpbmcpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdiA9IHJlZ29ial9tYXRjaCgocmVnZXhvYmplY3QgKiljYWNoZV9wcm9nLCB0dXBsZSk7Ci0JUHlfREVDUkVGKHR1cGxlKTsKLQlyZXR1cm4gdjsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ2V4X3NlYXJjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0JUHlPYmplY3QgKnBhdCwgKnN0cmluZzsKLQlQeU9iamVjdCAqdHVwbGUsICp2OwotCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJTUzpzZWFyY2giLCAmcGF0LCAmc3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHVwZGF0ZV9jYWNoZShwYXQpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoISh0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihTKSIsIHN0cmluZykpKQotCQlyZXR1cm4gTlVMTDsKLQl2ID0gcmVnb2JqX3NlYXJjaCgocmVnZXhvYmplY3QgKiljYWNoZV9wcm9nLCB0dXBsZSk7Ci0JUHlfREVDUkVGKHR1cGxlKTsKLQlyZXR1cm4gdjsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ2V4X3NldF9zeW50YXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotCWludCBzeW50YXg7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldF9zeW50YXgiLCAmc3ludGF4KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3ludGF4ID0gcmVfc2V0X3N5bnRheChzeW50YXgpOwotCS8qIHdpcGUgdGhlIGdsb2JhbCBwYXR0ZXJuIGNhY2hlICovCi0JUHlfWERFQ1JFRihjYWNoZV9wYXQpOwotCWNhY2hlX3BhdCA9IE5VTEw7Ci0JUHlfWERFQ1JFRihjYWNoZV9wcm9nKTsKLQljYWNoZV9wcm9nID0gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc3ludGF4KTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ2V4X2dldF9zeW50YXgoUHlPYmplY3QgKnNlbGYpCi17Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXJlX3N5bnRheCk7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiByZWdleF9nbG9iYWxfbWV0aG9kc1tdID0gewotCXsiY29tcGlsZSIsCXJlZ2V4X2NvbXBpbGUsIE1FVEhfVkFSQVJHU30sCi0JeyJzeW1jb21wIiwJcmVnZXhfc3ltY29tcCwgTUVUSF9WQVJBUkdTfSwKLQl7Im1hdGNoIiwJcmVnZXhfbWF0Y2gsIE1FVEhfVkFSQVJHU30sCi0JeyJzZWFyY2giLAlyZWdleF9zZWFyY2gsIE1FVEhfVkFSQVJHU30sCi0JeyJzZXRfc3ludGF4IiwJcmVnZXhfc2V0X3N5bnRheCwgTUVUSF9WQVJBUkdTfSwKLQl7ImdldF9zeW50YXgiLCAgKFB5Q0Z1bmN0aW9uKXJlZ2V4X2dldF9zeW50YXgsIE1FVEhfTk9BUkdTfSwKLQl7TlVMTCwJCU5VTEx9CQkgICAgIC8qIHNlbnRpbmVsICovCi19OwotCi1QeU1PRElOSVRfRlVOQwotaW5pdHJlZ2V4KHZvaWQpCi17Ci0JUHlPYmplY3QgKm0sICpkLCAqdjsKLQlpbnQgaTsKLQljaGFyICpzOwotCQotCS8qIEluaXRpYWxpemUgb2JqZWN0IHR5cGUgKi8KLQlSZWdleHR5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQotCW0gPSBQeV9Jbml0TW9kdWxlKCJyZWdleCIsIHJlZ2V4X2dsb2JhbF9tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0KLQlpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCSAgICAgICAidGhlIHJlZ2V4IG1vZHVsZSBpcyBkZXByZWNhdGVkOyAiCi0JCSAgICAgICAicGxlYXNlIHVzZSB0aGUgcmUgbW9kdWxlIikgPCAwKQotCQlyZXR1cm47Ci0JCi0JLyogSW5pdGlhbGl6ZSByZWdleC5lcnJvciBleGNlcHRpb24gKi8KLQl2ID0gUmVnZXhFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigicmVnZXguZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlpZiAodiA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIHYpICE9IDApCi0JCWdvdG8gZmluYWxseTsKLQkKLQkvKiBJbml0aWFsaXplIHJlZ2V4LmNhc2Vmb2xkIGNvbnN0YW50ICovCi0JaWYgKCEodiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgMjU2KSkpCi0JCWdvdG8gZmluYWxseTsKLQkKLQlpZiAoIShzID0gUHlTdHJpbmdfQXNTdHJpbmcodikpKQotCQlnb3RvIGZpbmFsbHk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJaWYgKGlzdXBwZXIoaSkpCi0JCQlzW2ldID0gdG9sb3dlcihpKTsKLQkJZWxzZQotCQkJc1tpXSA9IGk7Ci0JfQotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiY2FzZWZvbGQiLCB2KSA8IDApCi0JCWdvdG8gZmluYWxseTsKLQlQeV9ERUNSRUYodik7Ci0KLQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybjsKLSAgZmluYWxseToKLQkvKiBOb3RoaW5nICovIDsKLX0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcmVnZXhwci5jIGIvTW9kdWxlcy9yZWdleHByLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YTU0MTcuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9yZWdleHByLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDk0ICswLDAgQEAKLS8qIHJlZ2V4cHIuYwotICoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0BuZ3MuZmk+Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTkxIFRhdHUgWWxvbmVuLCBFc3BvbywgRmlubGFuZAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKLSAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dAotICogZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCi0gKiB3YXJyYW50eS4KLSAqCi0gKiBDcmVhdGVkOiBUaHUgU2VwIDI2IDE3OjE0OjA1IDE5OTEgeWxvCi0gKiBMYXN0IG1vZGlmaWVkOiBNb24gTm92ICA0IDE3OjA2OjQ4IDE5OTEgeWxvCi0gKiBQb3J0ZWQgdG8gVGhpbmsgQzogMTkgSmFuIDE5OTIgZ3VpZG9AY3dpLm5sCi0gKgotICogVGhpcyBjb2RlIGRyYXdzIG1hbnkgaWRlYXMgZnJvbSB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhY2thZ2VzIGJ5Ci0gKiBIZW5yeSBTcGVuY2VyIG9mIHRoZSBVbml2ZXJzaXR5IG9mIFRvcm9udG8gYW5kIFJpY2hhcmQgU3RhbGxtYW4gb2YKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogRW1hY3Mtc3BlY2lmaWMgY29kZSBhbmQgc3ludGF4IHRhYmxlIGNvZGUgaXMgYWxtb3N0IGRpcmVjdGx5IGJvcnJvd2VkCi0gKiBmcm9tIEdOVSByZWdleHAuCi0gKgotICogQnVncyBmaXhlZCBhbmQgbG90cyBvZiByZW9yZ2FuaXphdGlvbiBieSBKZWZmcmV5IEMuIE9sbGllLCBBcHJpbAotICogMTk5NyBUaGFua3MgZm9yIGJ1ZyByZXBvcnRzIGFuZCBpZGVhcyBmcm9tIEFuZHJldyBLdWNobGluZywgVGltCi0gKiBQZXRlcnMsIEd1aWRvIHZhbiBSb3NzdW0sIEthLVBpbmcgWWVlLCBTam9lcmQgTXVsbGVuZGVyLCBhbmQKLSAqIHByb2JhYmx5IG9uZSBvciB0d28gb3RoZXJzIHRoYXQgSSdtIGZvcmdldHRpbmcuCi0gKgotICogJElkJCAqLwotCi0jaW5jbHVkZSAiUHl0aG9uLmgiCi0jaW5jbHVkZSAicmVnZXhwci5oIgotCi0vKiBUaGUgb3JpZ2luYWwgY29kZSBibGl0aGVseSBhc3N1bWVkIHRoYXQgc2l6ZW9mKHNob3J0KSA9PSAyLiAgTm90Ci0gKiBhbHdheXMgdHJ1ZS4gIE9yaWdpbmFsIGluc3RhbmNlcyBvZiAiKHNob3J0KXgiIHdlcmUgcmVwbGFjZWQgYnkKLSAqIFNIT1JUKHgpLCB3aGVyZSBTSE9SVCBpcyAjZGVmaW5lZCBiZWxvdy4gICovCi0KLSNkZWZpbmUgU0hPUlQoeCkgKCh4KSAmIDB4ODAwMCA/ICh4KSAtIDB4MTAwMDAgOiAoeCkpCi0KLS8qIFRoZSBzdGFjayBpbXBsZW1lbnRhdGlvbiBpcyB0YWtlbiBmcm9tIGFuIGlkZWEgYnkgQW5kcmV3IEt1Y2hsaW5nLgotICogSXQncyBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBhcnJheXMuIFRoZSBhZHZhbnRhZ2VzIG9mIHRoaXMgb3ZlciBhCi0gKiBzaW1wbGUgbGlua2VkIGxpc3QgYXJlIHRoYXQgdGhlIG51bWJlciBvZiBtYWxsb2NzIHJlcXVpcmVkIGFyZQotICogcmVkdWNlZC4gSXQgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdGF0aWNhbGx5IGFsbG9jYXRlIGVub3VnaAotICogc3BhY2Ugc28gdGhhdCBzbWFsbCBwYXR0ZXJucyBkb24ndCBldmVyIG5lZWQgdG8gY2FsbCBtYWxsb2MuCi0gKgotICogVGhlIGFkdmFudGFnZXMgb3ZlciBhIHNpbmdsZSBhcnJheSBpcyB0aGF0IGlzIHBlcmlvZGljYWxseQotICogcmVhbGxvY2VkIHdoZW4gbW9yZSBzcGFjZSBpcyBuZWVkZWQgaXMgdGhhdCB3ZSBhdm9pZCBldmVyIGNvcHlpbmcKLSAqIHRoZSBzdGFjay4gKi8KLQotLyogaXRlbV90IGlzIHRoZSBiYXNpYyBzdGFjayBlbGVtZW50LiAgRGVmaW5lZCBhcyBhIHVuaW9uIG9mCi0gKiBzdHJ1Y3R1cmVzIHNvIHRoYXQgYm90aCByZWdpc3RlcnMsIGZhaWx1cmUgcG9pbnRzLCBhbmQgY291bnRlcnMgY2FuCi0gKiBiZSBwdXNoZWQvcG9wcGVkIGZyb20gdGhlIHN0YWNrLiAgVGhlcmUncyBub3RoaW5nIGJ1aWx0IGludG8gdGhlCi0gKiBpdGVtIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBhIGNlcnRhaW4gc3RhY2sgaXRlbSBpcyBhIHJlZ2lzdGVyLCBhCi0gKiBmYWlsdXJlIHBvaW50LCBvciBhIGNvdW50ZXIuICovCi0KLXR5cGVkZWYgdW5pb24gaXRlbV90Ci17Ci0Jc3RydWN0Ci0JewotCQlpbnQgbnVtOwotCQlpbnQgbGV2ZWw7Ci0JCXVuc2lnbmVkIGNoYXIgKnN0YXJ0OwotCQl1bnNpZ25lZCBjaGFyICplbmQ7Ci0JfSByZWc7Ci0Jc3RydWN0Ci0JewotCQlpbnQgY291bnQ7Ci0JCWludCBsZXZlbDsKLQkJaW50IHBoYW50b207Ci0JCXVuc2lnbmVkIGNoYXIgKmNvZGU7Ci0JCXVuc2lnbmVkIGNoYXIgKnRleHQ7Ci0JfSBmYWlsOwotCXN0cnVjdAotCXsKLQkJaW50IG51bTsKLQkJaW50IGxldmVsOwotCQlpbnQgY291bnQ7Ci0JfSBjbnRyOwotfSBpdGVtX3Q7Ci0KLSNkZWZpbmUgU1RBQ0tfUEFHRV9TSVpFIDI1NgotI2RlZmluZSBOVU1fUkVHSVNURVJTIDI1NgotCi0vKiBBICdwYWdlJyBvZiBzdGFjayBpdGVtcy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgaXRlbV9wYWdlX3QKLXsKLQlpdGVtX3QgaXRlbXNbU1RBQ0tfUEFHRV9TSVpFXTsKLQlzdHJ1Y3QgaXRlbV9wYWdlX3QgKnByZXY7Ci0Jc3RydWN0IGl0ZW1fcGFnZV90ICpuZXh0OwotfSBpdGVtX3BhZ2VfdDsKLQotCi10eXBlZGVmIHN0cnVjdCBtYXRjaF9zdGF0ZQotewotCS8qIFRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIHRoYXQgaGF2ZSBiZWVuIHB1c2hlZCBvbnRvIHRoZSBzdGFjawotCSAqIHNpbmNlIHRoZSBsYXN0IGZhaWx1cmUgcG9pbnQuICovCi0KLQlpbnQgY291bnQ7Ci0KLQkvKiBVc2VkIHRvIGNvbnRyb2wgd2hlbiByZWdpc3RlcnMgbmVlZCB0byBiZSBwdXNoZWQgb250byB0aGUKLQkgKiBzdGFjay4gKi8KLQkKLQlpbnQgbGV2ZWw7Ci0JCi0JLyogVGhlIG51bWJlciBvZiBmYWlsdXJlIHBvaW50cyBvbiB0aGUgc3RhY2suICovCi0JCi0JaW50IHBvaW50OwotCQotCS8qIFN0b3JhZ2UgZm9yIHRoZSByZWdpc3RlcnMuICBFYWNoIHJlZ2lzdGVyIGNvbnNpc3RzIG9mIHR3bwotCSAqIHBvaW50ZXJzIHRvIGNoYXJhY3RlcnMuICBTbyByZWdpc3RlciBOIGlzIHJlcHJlc2VudGVkIGFzCi0JICogc3RhcnRbTl0gYW5kIGVuZFtOXS4gIFRoZSBwb2ludGVycyBtdXN0IGJlIGNvbnZlcnRlZCB0bwotCSAqIG9mZnNldHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcgYmVmb3JlIHJldHVybmluZyB0aGUKLQkgKiByZWdpc3RlcnMgdG8gdGhlIGNhbGxpbmcgcHJvZ3JhbS4gKi8KLQkKLQl1bnNpZ25lZCBjaGFyICpzdGFydFtOVU1fUkVHSVNURVJTXTsKLQl1bnNpZ25lZCBjaGFyICplbmRbTlVNX1JFR0lTVEVSU107Ci0JCi0JLyogS2VlcHMgdHJhY2sgb2Ygd2hldGhlciBhIHJlZ2lzdGVyIGhhcyBjaGFuZ2VkIHJlY2VudGx5LiAqLwotCQotCWludCBjaGFuZ2VkW05VTV9SRUdJU1RFUlNdOwotCQotCS8qIFN0cnVjdHVyZSB0byBlbmNhcHN1bGF0ZSB0aGUgc3RhY2suICovCi0Jc3RydWN0Ci0JewotCQkvKiBpbmRleCBpbnRvIHRoZSBjdXJyZW50IHBhZ2UuICBJZiBpbmRleCA9PSAwIGFuZCB5b3UgbmVlZAotCQkgKiB0byBwb3AgYW4gaXRlbSwgbW92ZSB0byB0aGUgcHJldmlvdXMgcGFnZSBhbmQgc2V0IGluZGV4Ci0JCSAqID0gU1RBQ0tfUEFHRV9TSVpFIC0gMS4gIE90aGVyd2lzZSBkZWNyZW1lbnQgaW5kZXggdG8KLQkJICogcHVzaCBhIHBhZ2UuIElmIGluZGV4ID09IFNUQUNLX1BBR0VfU0laRSBhbmQgeW91IG5lZWQKLQkJICogdG8gcHVzaCBhIHBhZ2UgbW92ZSB0byB0aGUgbmV4dCBwYWdlIGFuZCBzZXQgaW5kZXggPQotCQkgKiAwLiBJZiB0aGVyZSBpcyBubyBuZXcgbmV4dCBwYWdlLCBhbGxvY2F0ZSBhIG5ldyBwYWdlCi0JCSAqIGFuZCBsaW5rIGl0IGluLiBPdGhlcndpc2UsIGluY3JlbWVudCBpbmRleCB0byBwdXNoIGEKLQkJICogcGFnZS4gKi8KLQkJCi0JCWludCBpbmRleDsKLQkJaXRlbV9wYWdlX3QgKmN1cnJlbnQ7IC8qIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcGFnZS4gKi8KLQkJaXRlbV9wYWdlX3QgZmlyc3Q7IC8qIEZpcnN0IHBhZ2UgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuICovCi0JfSBzdGFjazsKLX0gbWF0Y2hfc3RhdGU7Ci0KLS8qIEluaXRpYWxpemUgYSBzdGF0ZSBvYmplY3QgKi8KLQotLyogI2RlZmluZSBORVdfU1RBVEUoc3RhdGUpIFwgKi8KLS8qIG1lbXNldCgmc3RhdGUsIDAsICh2b2lkICopKCZzdGF0ZS5zdGFjaykgLSAodm9pZCAqKSgmc3RhdGUpKTsgXCAqLwotLyogc3RhdGUuc3RhY2suY3VycmVudCA9ICZzdGF0ZS5zdGFjay5maXJzdDsgXCAqLwotLyogc3RhdGUuc3RhY2suZmlyc3QucHJldiA9IE5VTEw7IFwgKi8KLS8qIHN0YXRlLnN0YWNrLmZpcnN0Lm5leHQgPSBOVUxMOyBcICovCi0vKiBzdGF0ZS5zdGFjay5pbmRleCA9IDA7IFwgKi8KLS8qIHN0YXRlLmxldmVsID0gMSAqLwotCi0jZGVmaW5lIE5FV19TVEFURShzdGF0ZSwgbnJlZ3MpIFwKLXsgXAotCWludCBpOyBcCi0JZm9yIChpID0gMDsgaSA8IG5yZWdzOyBpKyspIFwKLQl7IFwKLQkJc3RhdGUuc3RhcnRbaV0gPSBOVUxMOyBcCi0JCXN0YXRlLmVuZFtpXSA9IE5VTEw7IFwKLQkJc3RhdGUuY2hhbmdlZFtpXSA9IDA7IFwKLQl9IFwKLQlzdGF0ZS5zdGFjay5jdXJyZW50ID0gJnN0YXRlLnN0YWNrLmZpcnN0OyBcCi0Jc3RhdGUuc3RhY2suZmlyc3QucHJldiA9IE5VTEw7IFwKLQlzdGF0ZS5zdGFjay5maXJzdC5uZXh0ID0gTlVMTDsgXAotCXN0YXRlLnN0YWNrLmluZGV4ID0gMDsgXAotCXN0YXRlLmxldmVsID0gMTsgXAotCXN0YXRlLmNvdW50ID0gMDsgXAotCXN0YXRlLmxldmVsID0gMDsgXAotCXN0YXRlLnBvaW50ID0gMDsgXAotfQotCi0vKiBGcmVlIGFueSBtZW1vcnkgdGhhdCBtaWdodCBoYXZlIGJlZW4gbWFsbG9jJ2QgKi8KLQotI2RlZmluZSBGUkVFX1NUQVRFKHN0YXRlKSBcCi13aGlsZShzdGF0ZS5zdGFjay5maXJzdC5uZXh0ICE9IE5VTEwpIFwKLXsgXAotCXN0YXRlLnN0YWNrLmN1cnJlbnQgPSBzdGF0ZS5zdGFjay5maXJzdC5uZXh0OyBcCi0Jc3RhdGUuc3RhY2suZmlyc3QubmV4dCA9IHN0YXRlLnN0YWNrLmN1cnJlbnQtPm5leHQ7IFwKLQlmcmVlKHN0YXRlLnN0YWNrLmN1cnJlbnQpOyBcCi19Ci0KLS8qIERpc2NhcmQgdGhlIHRvcCAnY291bnQnIHN0YWNrIGl0ZW1zLiAqLwotCi0jZGVmaW5lIFNUQUNLX0RJU0NBUkQoc3RhY2ssIGNvdW50LCBvbl9lcnJvcikgXAotc3RhY2suaW5kZXggLT0gY291bnQ7IFwKLXdoaWxlIChzdGFjay5pbmRleCA8IDApIFwKLXsgXAotCWlmIChzdGFjay5jdXJyZW50LT5wcmV2ID09IE5VTEwpIFwKLQkJb25fZXJyb3I7IFwKLQlzdGFjay5jdXJyZW50ID0gc3RhY2suY3VycmVudC0+cHJldjsgXAotCXN0YWNrLmluZGV4ICs9IFNUQUNLX1BBR0VfU0laRTsgXAotfQotCi0vKiBTdG9yZSBhIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzIGl0ZW0gb24gdGhlIHN0YWNrLiBVc2VkIHRvIHBvcCBhbgotICogaXRlbSBvZmYgb2YgdGhlIHN0YWNrLiAqLwotCi0jZGVmaW5lIFNUQUNLX1BSRVYoc3RhY2ssIHRvcCwgb25fZXJyb3IpIFwKLWlmIChzdGFjay5pbmRleCA9PSAwKSBcCi17IFwKLQlpZiAoc3RhY2suY3VycmVudC0+cHJldiA9PSBOVUxMKSBcCi0JCW9uX2Vycm9yOyBcCi0Jc3RhY2suY3VycmVudCA9IHN0YWNrLmN1cnJlbnQtPnByZXY7IFwKLQlzdGFjay5pbmRleCA9IFNUQUNLX1BBR0VfU0laRSAtIDE7IFwKLX0gXAotZWxzZSBcCi17IFwKLQlzdGFjay5pbmRleC0tOyBcCi19IFwKLXRvcCA9ICYoc3RhY2suY3VycmVudC0+aXRlbXNbc3RhY2suaW5kZXhdKQotCi0vKiBTdG9yZSBhIHBvaW50ZXIgdG8gdGhlIG5leHQgaXRlbSBvbiB0aGUgc3RhY2suIFVzZWQgdG8gcHVzaCBhbiBpdGVtCi0gKiBvbiB0byB0aGUgc3RhY2suICovCi0KLSNkZWZpbmUgU1RBQ0tfTkVYVChzdGFjaywgdG9wLCBvbl9lcnJvcikgXAotaWYgKHN0YWNrLmluZGV4ID09IFNUQUNLX1BBR0VfU0laRSkgXAoteyBcCi0JaWYgKHN0YWNrLmN1cnJlbnQtPm5leHQgPT0gTlVMTCkgXAotCXsgXAotCQlzdGFjay5jdXJyZW50LT5uZXh0ID0gKGl0ZW1fcGFnZV90ICopbWFsbG9jKHNpemVvZihpdGVtX3BhZ2VfdCkpOyBcCi0JCWlmIChzdGFjay5jdXJyZW50LT5uZXh0ID09IE5VTEwpIFwKLQkJCW9uX2Vycm9yOyBcCi0JCXN0YWNrLmN1cnJlbnQtPm5leHQtPnByZXYgPSBzdGFjay5jdXJyZW50OyBcCi0JCXN0YWNrLmN1cnJlbnQtPm5leHQtPm5leHQgPSBOVUxMOyBcCi0JfSBcCi0Jc3RhY2suY3VycmVudCA9IHN0YWNrLmN1cnJlbnQtPm5leHQ7IFwKLQlzdGFjay5pbmRleCA9IDA7IFwKLX0gXAotdG9wID0gJihzdGFjay5jdXJyZW50LT5pdGVtc1tzdGFjay5pbmRleCsrXSkKLQotLyogU3RvcmUgYSBwb2ludGVyIHRvIHRoZSBpdGVtIHRoYXQgaXMgJ2NvdW50JyBpdGVtcyBiYWNrIGluIHRoZQotICogc3RhY2suIFNUQUNLX0JBQ0soc3RhY2ssIHRvcCwgMSwgb25fZXJyb3IpIGlzIGVxdWl2YWxlbnQgdG8KLSAqIFNUQUNLX1RPUChzdGFjaywgdG9wLCBvbl9lcnJvcikuICAqLwotCi0jZGVmaW5lIFNUQUNLX0JBQ0soc3RhY2ssIHRvcCwgY291bnQsIG9uX2Vycm9yKSBcCi17IFwKLQlpbnQgaW5kZXg7IFwKLQlpdGVtX3BhZ2VfdCAqY3VycmVudDsgXAotCWN1cnJlbnQgPSBzdGFjay5jdXJyZW50OyBcCi0JaW5kZXggPSBzdGFjay5pbmRleCAtIChjb3VudCk7IFwKLQl3aGlsZSAoaW5kZXggPCAwKSBcCi0JeyBcCi0JCWlmIChjdXJyZW50LT5wcmV2ID09IE5VTEwpIFwKLQkJCW9uX2Vycm9yOyBcCi0JCWN1cnJlbnQgPSBjdXJyZW50LT5wcmV2OyBcCi0JCWluZGV4ICs9IFNUQUNLX1BBR0VfU0laRTsgXAotCX0gXAotCXRvcCA9ICYoY3VycmVudC0+aXRlbXNbaW5kZXhdKTsgXAotfQotCi0vKiBTdG9yZSBhIHBvaW50ZXIgdG8gdGhlIHRvcCBpdGVtIG9uIHRoZSBzdGFjay4gRXhlY3V0ZSB0aGUKLSAqICdvbl9lcnJvcicgY29kZSBpZiB0aGVyZSBhcmUgbm8gaXRlbXMgb24gdGhlIHN0YWNrLiAqLwotCi0jZGVmaW5lIFNUQUNLX1RPUChzdGFjaywgdG9wLCBvbl9lcnJvcikgXAotaWYgKHN0YWNrLmluZGV4ID09IDApIFwKLXsgXAotCWlmIChzdGFjay5jdXJyZW50LT5wcmV2ID09IE5VTEwpIFwKLQkJb25fZXJyb3I7IFwKLQl0b3AgPSAmKHN0YWNrLmN1cnJlbnQtPnByZXYtPml0ZW1zW1NUQUNLX1BBR0VfU0laRSAtIDFdKTsgXAotfSBcCi1lbHNlIFwKLXsgXAotCXRvcCA9ICYoc3RhY2suY3VycmVudC0+aXRlbXNbc3RhY2suaW5kZXggLSAxXSk7IFwKLX0KLQotLyogVGVzdCB0byBzZWUgaWYgdGhlIHN0YWNrIGlzIGVtcHR5ICovCi0KLSNkZWZpbmUgU1RBQ0tfRU1QVFkoc3RhY2spICgoc3RhY2suaW5kZXggPT0gMCkgJiYgXAotCQkJICAgIChzdGFjay5jdXJyZW50LT5wcmV2ID09IE5VTEwpKQotCi0vKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIHJlZ2lzdGVyICdyZWcnICovCi0KLSNkZWZpbmUgR0VUX1JFR19TVEFSVChzdGF0ZSwgcmVnKSAoc3RhdGUuc3RhcnRbcmVnXSkKLQotLyogUmV0dXJuIHRoZSBlbmQgb2YgcmVnaXN0ZXIgJ3JlZycgKi8KLQotI2RlZmluZSBHRVRfUkVHX0VORChzdGF0ZSwgcmVnKSAoc3RhdGUuZW5kW3JlZ10pCi0KLS8qIFNldCB0aGUgc3RhcnQgb2YgcmVnaXN0ZXIgJ3JlZycuIElmIHRoZSBzdGF0ZSBvZiB0aGUgcmVnaXN0ZXIgbmVlZHMKLSAqIHNhdmluZywgcHVzaCBpdCBvbiB0aGUgc3RhY2suICovCi0KLSNkZWZpbmUgU0VUX1JFR19TVEFSVChzdGF0ZSwgcmVnLCB0ZXh0LCBvbl9lcnJvcikgXAotaWYoc3RhdGUuY2hhbmdlZFtyZWddIDwgc3RhdGUubGV2ZWwpIFwKLXsgXAotCWl0ZW1fdCAqaXRlbTsgXAotCVNUQUNLX05FWFQoc3RhdGUuc3RhY2ssIGl0ZW0sIG9uX2Vycm9yKTsgXAotCWl0ZW0tPnJlZy5udW0gPSByZWc7IFwKLQlpdGVtLT5yZWcuc3RhcnQgPSBzdGF0ZS5zdGFydFtyZWddOyBcCi0JaXRlbS0+cmVnLmVuZCA9IHN0YXRlLmVuZFtyZWddOyBcCi0JaXRlbS0+cmVnLmxldmVsID0gc3RhdGUuY2hhbmdlZFtyZWddOyBcCi0Jc3RhdGUuY2hhbmdlZFtyZWddID0gc3RhdGUubGV2ZWw7IFwKLQlzdGF0ZS5jb3VudCsrOyBcCi19IFwKLXN0YXRlLnN0YXJ0W3JlZ10gPSB0ZXh0Ci0KLS8qIFNldCB0aGUgZW5kIG9mIHJlZ2lzdGVyICdyZWcnLiBJZiB0aGUgc3RhdGUgb2YgdGhlIHJlZ2lzdGVyIG5lZWRzCi0gKiBzYXZpbmcsIHB1c2ggaXQgb24gdGhlIHN0YWNrLiAqLwotCi0jZGVmaW5lIFNFVF9SRUdfRU5EKHN0YXRlLCByZWcsIHRleHQsIG9uX2Vycm9yKSBcCi1pZihzdGF0ZS5jaGFuZ2VkW3JlZ10gPCBzdGF0ZS5sZXZlbCkgXAoteyBcCi0JaXRlbV90ICppdGVtOyBcCi0JU1RBQ0tfTkVYVChzdGF0ZS5zdGFjaywgaXRlbSwgb25fZXJyb3IpOyBcCi0JaXRlbS0+cmVnLm51bSA9IHJlZzsgXAotCWl0ZW0tPnJlZy5zdGFydCA9IHN0YXRlLnN0YXJ0W3JlZ107IFwKLQlpdGVtLT5yZWcuZW5kID0gc3RhdGUuZW5kW3JlZ107IFwKLQlpdGVtLT5yZWcubGV2ZWwgPSBzdGF0ZS5jaGFuZ2VkW3JlZ107IFwKLQlzdGF0ZS5jaGFuZ2VkW3JlZ10gPSBzdGF0ZS5sZXZlbDsgXAotCXN0YXRlLmNvdW50Kys7IFwKLX0gXAotc3RhdGUuZW5kW3JlZ10gPSB0ZXh0Ci0KLSNkZWZpbmUgUFVTSF9GQUlMVVJFKHN0YXRlLCB4Y29kZSwgeHRleHQsIG9uX2Vycm9yKSBcCi17IFwKLQlpdGVtX3QgKml0ZW07IFwKLQlTVEFDS19ORVhUKHN0YXRlLnN0YWNrLCBpdGVtLCBvbl9lcnJvcik7IFwKLQlpdGVtLT5mYWlsLmNvZGUgPSB4Y29kZTsgXAotCWl0ZW0tPmZhaWwudGV4dCA9IHh0ZXh0OyBcCi0JaXRlbS0+ZmFpbC5jb3VudCA9IHN0YXRlLmNvdW50OyBcCi0JaXRlbS0+ZmFpbC5sZXZlbCA9IHN0YXRlLmxldmVsOyBcCi0JaXRlbS0+ZmFpbC5waGFudG9tID0gMDsgXAotCXN0YXRlLmNvdW50ID0gMDsgXAotCXN0YXRlLmxldmVsKys7IFwKLQlzdGF0ZS5wb2ludCsrOyBcCi19Ci0KLS8qIFVwZGF0ZSB0aGUgbGFzdCBmYWlsdXJlIHBvaW50IHdpdGggYSBuZXcgcG9zaXRpb24gaW4gdGhlIHRleHQuICovCi0KLSNkZWZpbmUgVVBEQVRFX0ZBSUxVUkUoc3RhdGUsIHh0ZXh0LCBvbl9lcnJvcikgXAoteyBcCi0JaXRlbV90ICppdGVtOyBcCi0JU1RBQ0tfQkFDSyhzdGF0ZS5zdGFjaywgaXRlbSwgc3RhdGUuY291bnQgKyAxLCBvbl9lcnJvcik7IFwKLQlpZiAoIWl0ZW0tPmZhaWwucGhhbnRvbSkgXAotCXsgXAotCQlpdGVtX3QgKml0ZW0yOyBcCi0JCVNUQUNLX05FWFQoc3RhdGUuc3RhY2ssIGl0ZW0yLCBvbl9lcnJvcik7IFwKLQkJaXRlbTItPmZhaWwuY29kZSA9IGl0ZW0tPmZhaWwuY29kZTsgXAotCQlpdGVtMi0+ZmFpbC50ZXh0ID0geHRleHQ7IFwKLQkJaXRlbTItPmZhaWwuY291bnQgPSBzdGF0ZS5jb3VudDsgXAotCQlpdGVtMi0+ZmFpbC5sZXZlbCA9IHN0YXRlLmxldmVsOyBcCi0JCWl0ZW0yLT5mYWlsLnBoYW50b20gPSAxOyBcCi0JCXN0YXRlLmNvdW50ID0gMDsgXAotCQlzdGF0ZS5sZXZlbCsrOyBcCi0JCXN0YXRlLnBvaW50Kys7IFwKLQl9IFwKLQllbHNlIFwKLQl7IFwKLQkJU1RBQ0tfRElTQ0FSRChzdGF0ZS5zdGFjaywgc3RhdGUuY291bnQsIG9uX2Vycm9yKTsgXAotCQlTVEFDS19UT1Aoc3RhdGUuc3RhY2ssIGl0ZW0sIG9uX2Vycm9yKTsgXAotCQlpdGVtLT5mYWlsLnRleHQgPSB4dGV4dDsgXAotCQlzdGF0ZS5jb3VudCA9IDA7IFwKLQkJc3RhdGUubGV2ZWwrKzsgXAotCX0gXAotfQotCi0jZGVmaW5lIFBPUF9GQUlMVVJFKHN0YXRlLCB4Y29kZSwgeHRleHQsIG9uX2VtcHR5LCBvbl9lcnJvcikgXAoteyBcCi0JaXRlbV90ICppdGVtOyBcCi0JZG8gXAotCXsgXAotCQl3aGlsZShzdGF0ZS5jb3VudCA+IDApIFwKLQkJeyBcCi0JCQlTVEFDS19QUkVWKHN0YXRlLnN0YWNrLCBpdGVtLCBvbl9lcnJvcik7IFwKLQkJCXN0YXRlLnN0YXJ0W2l0ZW0tPnJlZy5udW1dID0gaXRlbS0+cmVnLnN0YXJ0OyBcCi0JCQlzdGF0ZS5lbmRbaXRlbS0+cmVnLm51bV0gPSBpdGVtLT5yZWcuZW5kOyBcCi0JCQlzdGF0ZS5jaGFuZ2VkW2l0ZW0tPnJlZy5udW1dID0gaXRlbS0+cmVnLmxldmVsOyBcCi0JCQlzdGF0ZS5jb3VudC0tOyBcCi0JCX0gXAotCQlTVEFDS19QUkVWKHN0YXRlLnN0YWNrLCBpdGVtLCBvbl9lbXB0eSk7IFwKLQkJeGNvZGUgPSBpdGVtLT5mYWlsLmNvZGU7IFwKLQkJeHRleHQgPSBpdGVtLT5mYWlsLnRleHQ7IFwKLQkJc3RhdGUuY291bnQgPSBpdGVtLT5mYWlsLmNvdW50OyBcCi0JCXN0YXRlLmxldmVsID0gaXRlbS0+ZmFpbC5sZXZlbDsgXAotCQlzdGF0ZS5wb2ludC0tOyBcCi0JfSBcCi0Jd2hpbGUgKGl0ZW0tPmZhaWwudGV4dCA9PSBOVUxMKTsgXAotfQotCi1lbnVtIHJlZ2V4cF9jb21waWxlZF9vcHMgLyogb3Bjb2RlcyBmb3IgY29tcGlsZWQgcmVnZXhwICovCi17Ci0JQ2VuZCwJCSAgICAgIC8qIGVuZCBvZiBwYXR0ZXJuIHJlYWNoZWQgKi8KLQlDYm9sLAkJICAgICAgLyogYmVnaW5uaW5nIG9mIGxpbmUgKi8KLQlDZW9sLAkJICAgICAgLyogZW5kIG9mIGxpbmUgKi8KLQlDc2V0LAkJICAgICAgLyogY2hhcmFjdGVyIHNldC4gIEZvbGxvd2VkIGJ5IDMyIGJ5dGVzIG9mIHNldC4gKi8KLQlDZXhhY3QsCQkgICAgICAvKiBmb2xsb3dlZCBieSBhIGJ5dGUgdG8gbWF0Y2ggKi8KLQlDYW55Y2hhciwJICAgICAgLyogbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBuZXdsaW5lICovCi0JQ3N0YXJ0X21lbW9yeSwJICAgICAgLyogc2V0IHJlZ2lzdGVyIHN0YXJ0IGFkZHIgKGZvbGxvd2VkIGJ5IHJlZyBudW1iZXIpICovCi0JQ2VuZF9tZW1vcnksCSAgICAgIC8qIHNldCByZWdpc3RlciBlbmQgYWRkciAoZm9sbG93ZWQgYnkgcmVnIG51bWJlcikgKi8KLQlDbWF0Y2hfbWVtb3J5LAkgICAgICAvKiBtYXRjaCBhIGR1cGxpY2F0ZSBvZiByZWcgY29udGVudHMgKHJlZ251bSBmb2xsb3dzKSovCi0JQ2p1bXAsCQkgICAgICAvKiBmb2xsb3dlZCBieSB0d28gYnl0ZXMgKGxzYixtc2IpIG9mIGRpc3BsYWNlbWVudC4gKi8KLQlDc3Rhcl9qdW1wLAkgICAgICAvKiB3aWxsIGNoYW5nZSB0byBqdW1wL3VwZGF0ZV9mYWlsdXJlX2p1bXAgYXQgcnVudGltZSAqLwotCUNmYWlsdXJlX2p1bXAsCSAgICAgIC8qIGp1bXAgdG8gYWRkciBvbiBmYWlsdXJlICovCi0JQ3VwZGF0ZV9mYWlsdXJlX2p1bXAsIC8qIHVwZGF0ZSB0b3Btb3N0IGZhaWx1cmUgcG9pbnQgYW5kIGp1bXAgKi8KLQlDZHVtbXlfZmFpbHVyZV9qdW1wLCAgLyogcHVzaCBhIGR1bW15IGZhaWx1cmUgcG9pbnQgYW5kIGp1bXAgKi8KLQlDYmVnYnVmLAkgICAgICAvKiBtYXRjaCBhdCBiZWdpbm5pbmcgb2YgYnVmZmVyICovCi0JQ2VuZGJ1ZiwJICAgICAgLyogbWF0Y2ggYXQgZW5kIG9mIGJ1ZmZlciAqLwotCUN3b3JkYmVnLAkgICAgICAvKiBtYXRjaCBhdCBiZWdpbm5pbmcgb2Ygd29yZCAqLwotCUN3b3JkZW5kLAkgICAgICAvKiBtYXRjaCBhdCBlbmQgb2Ygd29yZCAqLwotCUN3b3JkYm91bmQsCSAgICAgIC8qIG1hdGNoIGlmIGF0IHdvcmQgYm91bmRhcnkgKi8KLQlDbm90d29yZGJvdW5kLCAgICAgICAgLyogbWF0Y2ggaWYgbm90IGF0IHdvcmQgYm91bmRhcnkgKi8KLQlDc3ludGF4c3BlYywJICAgICAgLyogbWF0Y2hlcyBzeW50YXggY29kZSAoMSBieXRlIGZvbGxvd3MpICovCi0JQ25vdHN5bnRheHNwZWMsICAgICAgIC8qIG1hdGNoZXMgaWYgc3ludGF4IGNvZGUgZG9lcyBub3QgbWF0Y2ggKDEgYnl0ZSBmb2xsb3dzKSAqLwotCUNyZXBlYXQxCi19OwotCi1lbnVtIHJlZ2V4cF9zeW50YXhfb3AJLyogc3ludGF4IGNvZGVzIGZvciBwbGFpbiBhbmQgcXVvdGVkIGNoYXJhY3RlcnMgKi8KLXsKLQlSZW5kLAkJICAvKiBzcGVjaWFsIGNvZGUgZm9yIGVuZCBvZiByZWdleHAgKi8KLQlSbm9ybWFsLAkgIC8qIG5vcm1hbCBjaGFyYWN0ZXIgKi8KLQlSYW55Y2hhciwJICAvKiBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBuZXdsaW5lICovCi0JUnF1b3RlLAkJICAvKiB0aGUgcXVvdGUgY2hhcmFjdGVyICovCi0JUmJvbCwJCSAgLyogbWF0Y2ggYmVnaW5uaW5nIG9mIGxpbmUgKi8KLQlSZW9sLAkJICAvKiBtYXRjaCBlbmQgb2YgbGluZSAqLwotCVJvcHRpb25hbCwJICAvKiBtYXRjaCBwcmVjZWRpbmcgZXhwcmVzc2lvbiBvcHRpb25hbGx5ICovCi0JUnN0YXIsCQkgIC8qIG1hdGNoIHByZWNlZGluZyBleHByIHplcm8gb3IgbW9yZSB0aW1lcyAqLwotCVJwbHVzLAkJICAvKiBtYXRjaCBwcmVjZWRpbmcgZXhwciBvbmUgb3IgbW9yZSB0aW1lcyAqLwotCVJvciwJCSAgLyogbWF0Y2ggZWl0aGVyIG9mIGFsdGVybmF0aXZlcyAqLwotCVJvcGVucGFyLAkgIC8qIG9wZW5pbmcgcGFyZW50aGVzaXMgKi8KLQlSY2xvc2VwYXIsCSAgLyogY2xvc2luZyBwYXJlbnRoZXNpcyAqLwotCVJtZW1vcnksCSAgLyogbWF0Y2ggbWVtb3J5IHJlZ2lzdGVyICovCi0JUmV4dGVuZGVkX21lbW9yeSwgLyogXHZubiB0byBtYXRjaCByZWdpc3RlcnMgMTAtOTkgKi8KLQlSb3BlbnNldCwJICAvKiBvcGVuIHNldC4gIEludGVybmFsIHN5bnRheCBoYXJkLWNvZGVkIGJlbG93LiAqLwotCS8qIHRoZSBmb2xsb3dpbmcgYXJlIGdudSBleHRlbnNpb25zIHRvICJub3JtYWwiIHJlZ2V4cCBzeW50YXggKi8KLQlSYmVnYnVmLAkgIC8qIGJlZ2lubmluZyBvZiBidWZmZXIgKi8KLQlSZW5kYnVmLAkgIC8qIGVuZCBvZiBidWZmZXIgKi8KLQlSd29yZGNoYXIsCSAgLyogd29yZCBjaGFyYWN0ZXIgKi8KLQlSbm90d29yZGNoYXIsCSAgLyogbm90IHdvcmQgY2hhcmFjdGVyICovCi0JUndvcmRiZWcsCSAgLyogYmVnaW5uaW5nIG9mIHdvcmQgKi8KLQlSd29yZGVuZCwJICAvKiBlbmQgb2Ygd29yZCAqLwotCVJ3b3JkYm91bmQsCSAgLyogd29yZCBib3VuZCAqLwotCVJub3R3b3JkYm91bmQsCSAgLyogbm90IHdvcmQgYm91bmQgKi8KLQlSbnVtX29wcwotfTsKLQotc3RhdGljIGludCByZV9jb21waWxlX2luaXRpYWxpemVkID0gMDsKLXN0YXRpYyBpbnQgcmVnZXhwX3N5bnRheCA9IDA7Ci1pbnQgcmVfc3ludGF4ID0gMDsgLyogRXhwb3J0ZWQgY29weSBvZiByZWdleHBfc3ludGF4ICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciByZWdleHBfcGxhaW5fb3BzWzI1Nl07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciByZWdleHBfcXVvdGVkX29wc1syNTZdOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVnZXhwX3ByZWNlZGVuY2VzW1JudW1fb3BzXTsKLXN0YXRpYyBpbnQgcmVnZXhwX2NvbnRleHRfaW5kZXBfb3BzOwotc3RhdGljIGludCByZWdleHBfYW5zaV9zZXF1ZW5jZXM7Ci0KLSNkZWZpbmUgTlVNX0xFVkVMUyAgNSAgICAvKiBudW1iZXIgb2YgcHJlY2VkZW5jZSBsZXZlbHMgaW4gdXNlICovCi0jZGVmaW5lIE1BWF9ORVNUSU5HIDEwMCAgLyogbWF4IG5lc3RpbmcgbGV2ZWwgb2Ygb3BlcmF0b3JzICovCi0KLSNkZWZpbmUgU1lOVEFYKGNoKSByZV9zeW50YXhfdGFibGVbKHVuc2lnbmVkIGNoYXIpKGNoKV0KLQotdW5zaWduZWQgY2hhciByZV9zeW50YXhfdGFibGVbMjU2XTsKLQotdm9pZCByZV9jb21waWxlX2luaXRpYWxpemUodm9pZCkKLXsKLQlpbnQgYTsKLSAgCi0Jc3RhdGljIGludCBzeW50YXhfdGFibGVfaW5pdGVkID0gMDsKLQotCWlmICghc3ludGF4X3RhYmxlX2luaXRlZCkKLQl7Ci0JCXN5bnRheF90YWJsZV9pbml0ZWQgPSAxOwotCQltZW1zZXQocmVfc3ludGF4X3RhYmxlLCAwLCAyNTYpOwotCQlmb3IgKGEgPSAnYSc7IGEgPD0gJ3onOyBhKyspCi0JCQlyZV9zeW50YXhfdGFibGVbYV0gPSBTd29yZDsKLQkJZm9yIChhID0gJ0EnOyBhIDw9ICdaJzsgYSsrKQotCQkJcmVfc3ludGF4X3RhYmxlW2FdID0gU3dvcmQ7Ci0JCWZvciAoYSA9ICcwJzsgYSA8PSAnOSc7IGErKykKLQkJCXJlX3N5bnRheF90YWJsZVthXSA9IFN3b3JkIHwgU2RpZ2l0IHwgU2hleGRpZ2l0OwotCQlmb3IgKGEgPSAnMCc7IGEgPD0gJzcnOyBhKyspCi0JCQlyZV9zeW50YXhfdGFibGVbYV0gfD0gU29jdGFsZGlnaXQ7Ci0JCWZvciAoYSA9ICdBJzsgYSA8PSAnRic7IGErKykKLQkJCXJlX3N5bnRheF90YWJsZVthXSB8PSBTaGV4ZGlnaXQ7Ci0JCWZvciAoYSA9ICdhJzsgYSA8PSAnZic7IGErKykKLQkJCXJlX3N5bnRheF90YWJsZVthXSB8PSBTaGV4ZGlnaXQ7Ci0JCXJlX3N5bnRheF90YWJsZVsnXyddID0gU3dvcmQ7Ci0JCWZvciAoYSA9IDk7IGEgPD0gMTM7IGErKykKLQkJCXJlX3N5bnRheF90YWJsZVthXSA9IFN3aGl0ZXNwYWNlOwotCQlyZV9zeW50YXhfdGFibGVbJyAnXSA9IFN3aGl0ZXNwYWNlOwotCX0KLQlyZV9jb21waWxlX2luaXRpYWxpemVkID0gMTsKLQlmb3IgKGEgPSAwOyBhIDwgMjU2OyBhKyspCi0JewotCQlyZWdleHBfcGxhaW5fb3BzW2FdID0gUm5vcm1hbDsKLQkJcmVnZXhwX3F1b3RlZF9vcHNbYV0gPSBSbm9ybWFsOwotCX0KLQlmb3IgKGEgPSAnMCc7IGEgPD0gJzknOyBhKyspCi0JCXJlZ2V4cF9xdW90ZWRfb3BzW2FdID0gUm1lbW9yeTsKLQlyZWdleHBfcGxhaW5fb3BzWydcMTM0J10gPSBScXVvdGU7Ci0JaWYgKHJlZ2V4cF9zeW50YXggJiBSRV9OT19CS19QQVJFTlMpCi0JewotCQlyZWdleHBfcGxhaW5fb3BzWycoJ10gPSBSb3BlbnBhcjsKLQkJcmVnZXhwX3BsYWluX29wc1snKSddID0gUmNsb3NlcGFyOwotCX0KLQllbHNlCi0JewotCQlyZWdleHBfcXVvdGVkX29wc1snKCddID0gUm9wZW5wYXI7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWycpJ10gPSBSY2xvc2VwYXI7Ci0JfQotCWlmIChyZWdleHBfc3ludGF4ICYgUkVfTk9fQktfVkJBUikKLQkJcmVnZXhwX3BsYWluX29wc1snXDE3NCddID0gUm9yOwotCWVsc2UKLQkJcmVnZXhwX3F1b3RlZF9vcHNbJ1wxNzQnXSA9IFJvcjsKLQlyZWdleHBfcGxhaW5fb3BzWycqJ10gPSBSc3RhcjsKLQlpZiAocmVnZXhwX3N5bnRheCAmIFJFX0JLX1BMVVNfUU0pCi0JewotCQlyZWdleHBfcXVvdGVkX29wc1snKyddID0gUnBsdXM7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWyc/J10gPSBSb3B0aW9uYWw7Ci0JfQotCWVsc2UKLQl7Ci0JCXJlZ2V4cF9wbGFpbl9vcHNbJysnXSA9IFJwbHVzOwotCQlyZWdleHBfcGxhaW5fb3BzWyc/J10gPSBSb3B0aW9uYWw7Ci0JfQotCWlmIChyZWdleHBfc3ludGF4ICYgUkVfTkVXTElORV9PUikKLQkJcmVnZXhwX3BsYWluX29wc1snXG4nXSA9IFJvcjsKLQlyZWdleHBfcGxhaW5fb3BzWydcMTMzJ10gPSBSb3BlbnNldDsKLQlyZWdleHBfcGxhaW5fb3BzWydcMTM2J10gPSBSYm9sOwotCXJlZ2V4cF9wbGFpbl9vcHNbJyQnXSA9IFJlb2w7Ci0JcmVnZXhwX3BsYWluX29wc1snLiddID0gUmFueWNoYXI7Ci0JaWYgKCEocmVnZXhwX3N5bnRheCAmIFJFX05PX0dOVV9FWFRFTlNJT05TKSkKLQl7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWyd3J10gPSBSd29yZGNoYXI7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWydXJ10gPSBSbm90d29yZGNoYXI7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWyc8J10gPSBSd29yZGJlZzsKLQkJcmVnZXhwX3F1b3RlZF9vcHNbJz4nXSA9IFJ3b3JkZW5kOwotCQlyZWdleHBfcXVvdGVkX29wc1snYiddID0gUndvcmRib3VuZDsKLQkJcmVnZXhwX3F1b3RlZF9vcHNbJ0InXSA9IFJub3R3b3JkYm91bmQ7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWydgJ10gPSBSYmVnYnVmOwotCQlyZWdleHBfcXVvdGVkX29wc1snXCcnXSA9IFJlbmRidWY7Ci0JfQotCWlmIChyZWdleHBfc3ludGF4ICYgUkVfQU5TSV9IRVgpCi0JCXJlZ2V4cF9xdW90ZWRfb3BzWyd2J10gPSBSZXh0ZW5kZWRfbWVtb3J5OwotCWZvciAoYSA9IDA7IGEgPCBSbnVtX29wczsgYSsrKQotCQlyZWdleHBfcHJlY2VkZW5jZXNbYV0gPSA0OwotCWlmIChyZWdleHBfc3ludGF4ICYgUkVfVElHSFRfVkJBUikKLQl7Ci0JCXJlZ2V4cF9wcmVjZWRlbmNlc1tSb3JdID0gMzsKLQkJcmVnZXhwX3ByZWNlZGVuY2VzW1Jib2xdID0gMjsKLQkJcmVnZXhwX3ByZWNlZGVuY2VzW1Jlb2xdID0gMjsKLQl9Ci0JZWxzZQotCXsKLQkJcmVnZXhwX3ByZWNlZGVuY2VzW1Jvcl0gPSAyOwotCQlyZWdleHBfcHJlY2VkZW5jZXNbUmJvbF0gPSAzOwotCQlyZWdleHBfcHJlY2VkZW5jZXNbUmVvbF0gPSAzOwotCX0KLQlyZWdleHBfcHJlY2VkZW5jZXNbUmNsb3NlcGFyXSA9IDE7Ci0JcmVnZXhwX3ByZWNlZGVuY2VzW1JlbmRdID0gMDsKLQlyZWdleHBfY29udGV4dF9pbmRlcF9vcHMgPSAocmVnZXhwX3N5bnRheCAmIFJFX0NPTlRFWFRfSU5ERVBfT1BTKSAhPSAwOwotCXJlZ2V4cF9hbnNpX3NlcXVlbmNlcyA9IChyZWdleHBfc3ludGF4ICYgUkVfQU5TSV9IRVgpICE9IDA7Ci19Ci0KLWludCByZV9zZXRfc3ludGF4KGludCBzeW50YXgpCi17Ci0JaW50IHJldDsKLQkKLQlyZXQgPSByZWdleHBfc3ludGF4OwotCXJlZ2V4cF9zeW50YXggPSBzeW50YXg7Ci0JcmVfc3ludGF4ID0gc3ludGF4OyAvKiBFeHBvcnRlZCBjb3B5ICovCi0JcmVfY29tcGlsZV9pbml0aWFsaXplKCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBoZXhfY2hhcl90b19kZWNpbWFsKGludCBjaCkKLXsKLQlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKLQkJcmV0dXJuIGNoIC0gJzAnOwotCWlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQotCQlyZXR1cm4gY2ggLSAnYScgKyAxMDsKLQlpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykKLQkJcmV0dXJuIGNoIC0gJ0EnICsgMTA7Ci0JcmV0dXJuIDE2OwotfQotCi1zdGF0aWMgdm9pZCByZV9jb21waWxlX2Zhc3RtYXBfYXV4KHVuc2lnbmVkIGNoYXIgKmNvZGUsIGludCBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnZpc2l0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNhbl9iZV9udWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpmYXN0bWFwKQotewotCWludCBhOwotCWludCBiOwotCWludCBzeW50YXhjb2RlOwotCQotCWlmICh2aXNpdGVkW3Bvc10pCi0JCXJldHVybjsgIC8qIHdlIGhhdmUgYWxyZWFkeSBiZWVuIGhlcmUgKi8KLQl2aXNpdGVkW3Bvc10gPSAxOwotCWZvciAoOzspCi0JCXN3aXRjaCAoY29kZVtwb3MrK10pIHsKLQkJY2FzZSBDZW5kOgotCQkJewotCQkJCSpjYW5fYmVfbnVsbCA9IDE7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQljYXNlIENib2w6Ci0JCWNhc2UgQ2JlZ2J1ZjoKLQkJY2FzZSBDZW5kYnVmOgotCQljYXNlIEN3b3JkYmVnOgotCQljYXNlIEN3b3JkZW5kOgotCQljYXNlIEN3b3JkYm91bmQ6Ci0JCWNhc2UgQ25vdHdvcmRib3VuZDoKLQkJewotCQkJZm9yIChhID0gMDsgYSA8IDI1NjsgYSsrKQotCQkJCWZhc3RtYXBbYV0gPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDc3ludGF4c3BlYzoKLQkJewotCQkJc3ludGF4Y29kZSA9IGNvZGVbcG9zKytdOwotCQkJZm9yIChhID0gMDsgYSA8IDI1NjsgYSsrKQotCQkJCWlmIChTWU5UQVgoYSkgJiBzeW50YXhjb2RlKSAKLQkJCQkJZmFzdG1hcFthXSA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2FzZSBDbm90c3ludGF4c3BlYzoKLQkJewotCQkJc3ludGF4Y29kZSA9IGNvZGVbcG9zKytdOwotCQkJZm9yIChhID0gMDsgYSA8IDI1NjsgYSsrKQotCQkJCWlmICghKFNZTlRBWChhKSAmIHN5bnRheGNvZGUpICkKLQkJCQkJZmFzdG1hcFthXSA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2FzZSBDZW9sOgotCQl7Ci0JCQlmYXN0bWFwWydcbiddID0gMTsKLQkJCWlmICgqY2FuX2JlX251bGwgPT0gMCkKLQkJCQkqY2FuX2JlX251bGwgPSAyOyAvKiBjYW4gbWF0Y2ggbnVsbCwgYnV0IG9ubHkgYXQgZW5kIG9mIGJ1ZmZlciovCi0JCQlyZXR1cm47Ci0JCX0KLQkJY2FzZSBDc2V0OgotCQl7Ci0JCQlmb3IgKGEgPSAwOyBhIDwgMjU2Lzg7IGErKykKLQkJCQlpZiAoY29kZVtwb3MgKyBhXSAhPSAwKQotCQkJCQlmb3IgKGIgPSAwOyBiIDwgODsgYisrKQotCQkJCQkJaWYgKGNvZGVbcG9zICsgYV0gJiAoMSA8PCBiKSkKLQkJCQkJCQlmYXN0bWFwWyhhIDw8IDMpICsgYl0gPSAxOwotCQkJcG9zICs9IDI1Ni84OwotCQkJcmV0dXJuOwotCQl9Ci0JCWNhc2UgQ2V4YWN0OgotCQl7Ci0JCQlmYXN0bWFwWyh1bnNpZ25lZCBjaGFyKWNvZGVbcG9zXV0gPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNhc2UgQ2FueWNoYXI6Ci0JCXsKLQkJCWZvciAoYSA9IDA7IGEgPCAyNTY7IGErKykKLQkJCQlpZiAoYSAhPSAnXG4nKQotCQkJCQlmYXN0bWFwW2FdID0gMTsKLQkJCXJldHVybjsKLQkJfQotCQljYXNlIENzdGFydF9tZW1vcnk6Ci0JCWNhc2UgQ2VuZF9tZW1vcnk6Ci0JCXsKLQkJCXBvcysrOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDbWF0Y2hfbWVtb3J5OgotCQl7Ci0JCQlmb3IgKGEgPSAwOyBhIDwgMjU2OyBhKyspCi0JCQkJZmFzdG1hcFthXSA9IDE7Ci0JCQkqY2FuX2JlX251bGwgPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNhc2UgQ2p1bXA6Ci0JCWNhc2UgQ2R1bW15X2ZhaWx1cmVfanVtcDoKLQkJY2FzZSBDdXBkYXRlX2ZhaWx1cmVfanVtcDoKLQkJY2FzZSBDc3Rhcl9qdW1wOgotCQl7Ci0JCQlhID0gKHVuc2lnbmVkIGNoYXIpY29kZVtwb3MrK107Ci0JCQlhIHw9ICh1bnNpZ25lZCBjaGFyKWNvZGVbcG9zKytdIDw8IDg7Ci0JCQlwb3MgKz0gKGludClTSE9SVChhKTsKLQkJCWlmICh2aXNpdGVkW3Bvc10pCi0JCQl7Ci0JCQkJLyogYXJnaC4uLiB0aGUgcmVnZXhwIGNvbnRhaW5zIGVtcHR5IGxvb3BzLiAgVGhpcyBpcyBub3QKLQkJCQkgICBnb29kLCBhcyB0aGlzIG1heSBjYXVzZSBhIGZhaWx1cmUgc3RhY2sgb3ZlcmZsb3cgd2hlbgotCQkJCSAgIG1hdGNoaW5nLiAgT2ggd2VsbC4gKi8KLQkJCQkvKiB0aGlzIHBhdGggbGVhZHMgbm93aGVyZTsgcHVyc3VlIG90aGVyIHBhdGhzLiAqLwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXZpc2l0ZWRbcG9zXSA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENmYWlsdXJlX2p1bXA6Ci0JCXsKLQkJCWEgPSAodW5zaWduZWQgY2hhciljb2RlW3BvcysrXTsKLQkJCWEgfD0gKHVuc2lnbmVkIGNoYXIpY29kZVtwb3MrK10gPDwgODsKLQkJCWEgPSBwb3MgKyAoaW50KVNIT1JUKGEpOwotCQkJcmVfY29tcGlsZV9mYXN0bWFwX2F1eChjb2RlLCBhLCB2aXNpdGVkLCBjYW5fYmVfbnVsbCwgZmFzdG1hcCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENyZXBlYXQxOgotCQl7Ci0JCQlwb3MgKz0gMjsKLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCXsKLQkJICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJVbmtub3duIHJlZ2V4IG9wY29kZTogbWVtb3J5IGNvcnJ1cHRlZD8iKTsKLQkJICAgICAgICByZXR1cm47Ci0JCQkvKk5PVFJFQUNIRUQqLwotCQl9Ci0JCX0KLX0KLQotc3RhdGljIGludCByZV9kb19jb21waWxlX2Zhc3RtYXAodW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgdXNlZCwgaW50IHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNhbl9iZV9udWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZmFzdG1hcCkKLXsKLQl1bnNpZ25lZCBjaGFyIHNtYWxsX3Zpc2l0ZWRbNTEyXSwgKnZpc2l0ZWQ7Ci0gICAKLQlpZiAodXNlZCA8PSBzaXplb2Yoc21hbGxfdmlzaXRlZCkpCi0JCXZpc2l0ZWQgPSBzbWFsbF92aXNpdGVkOwotCWVsc2UKLQl7Ci0JCXZpc2l0ZWQgPSBtYWxsb2ModXNlZCk7Ci0JCWlmICghdmlzaXRlZCkKLQkJCXJldHVybiAwOwotCX0KLQkqY2FuX2JlX251bGwgPSAwOwotCW1lbXNldChmYXN0bWFwLCAwLCAyNTYpOwotCW1lbXNldCh2aXNpdGVkLCAwLCB1c2VkKTsKLQlyZV9jb21waWxlX2Zhc3RtYXBfYXV4KGJ1ZmZlciwgcG9zLCB2aXNpdGVkLCBjYW5fYmVfbnVsbCwgZmFzdG1hcCk7Ci0JaWYgKHZpc2l0ZWQgIT0gc21hbGxfdmlzaXRlZCkKLQkJZnJlZSh2aXNpdGVkKTsKLQlyZXR1cm4gMTsKLX0KLQotdm9pZCByZV9jb21waWxlX2Zhc3RtYXAocmVnZXhwX3QgYnVmcCkKLXsKLQlpZiAoIWJ1ZnAtPmZhc3RtYXAgfHwgYnVmcC0+ZmFzdG1hcF9hY2N1cmF0ZSkKLQkJcmV0dXJuOwotCWFzc2VydChidWZwLT51c2VkID4gMCk7Ci0JaWYgKCFyZV9kb19jb21waWxlX2Zhc3RtYXAoYnVmcC0+YnVmZmVyLAotCQkJCSAgIGJ1ZnAtPnVzZWQsCi0JCQkJICAgMCwKLQkJCQkgICAmYnVmcC0+Y2FuX2JlX251bGwsCi0JCQkJICAgYnVmcC0+ZmFzdG1hcCkpCi0JCXJldHVybjsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgcmV0dXJuOwotCWlmIChidWZwLT5idWZmZXJbMF0gPT0gQ2JvbCkKLQkJYnVmcC0+YW5jaG9yID0gMTsgICAvKiBiZWdsaW5lICovCi0JZWxzZQotCQlpZiAoYnVmcC0+YnVmZmVyWzBdID09IENiZWdidWYpCi0JCQlidWZwLT5hbmNob3IgPSAyOyAvKiBiZWdidWYgKi8KLQkJZWxzZQotCQkJYnVmcC0+YW5jaG9yID0gMDsgLyogbm9uZSAqLwotCWJ1ZnAtPmZhc3RtYXBfYWNjdXJhdGUgPSAxOwotfQotCi0vKiAKLSAqIHN0YXIgaXMgY29kZWQgYXM6Ci0gKiAxOiBmYWlsdXJlX2p1bXAgMgotICogICAgLi4uIGNvZGUgZm9yIG9wZXJhbmQgb2Ygc3RhcgotICogICAgc3Rhcl9qdW1wIDEKLSAqIDI6IC4uLiBjb2RlIGFmdGVyIHN0YXIKLSAqCi0gKiBXZSBjaGFuZ2UgdGhlIHN0YXJfanVtcCB0byB1cGRhdGVfZmFpbHVyZV9qdW1wIGlmIHdlIGNhbiBkZXRlcm1pbmUKLSAqIHRoYXQgaXQgaXMgc2FmZSB0byBkbyBzbzsgb3RoZXJ3aXNlIHdlIGNoYW5nZSBpdCB0byBhbiBvcmRpbmFyeQotICoganVtcC4KLSAqCi0gKiBwbHVzIGlzIGNvZGVkIGFzCi0gKgotICogICAganVtcCAyCi0gKiAxOiBmYWlsdXJlX2p1bXAgMwotICogMjogLi4uIGNvZGUgZm9yIG9wZXJhbmQgb2YgcGx1cwotICogICAgc3Rhcl9qdW1wIDEKLSAqIDM6IC4uLiBjb2RlIGFmdGVyIHBsdXMKLSAqCi0gKiBGb3Igc3Rhcl9qdW1wIGNvbnNpZGVyYXRpb25zIHRoaXMgaXMgcHJvY2Vzc2VkIGlkZW50aWNhbGx5IHRvIHN0YXIuCi0gKgotICovCi0KLXN0YXRpYyBpbnQgcmVfb3B0aW1pemVfc3Rhcl9qdW1wKHJlZ2V4cF90IGJ1ZnAsIHVuc2lnbmVkIGNoYXIgKmNvZGUpCi17Ci0JdW5zaWduZWQgY2hhciBtYXBbMjU2XTsKLQl1bnNpZ25lZCBjaGFyIGNhbl9iZV9udWxsOwotCXVuc2lnbmVkIGNoYXIgKnAxOwotCXVuc2lnbmVkIGNoYXIgKnAyOwotCXVuc2lnbmVkIGNoYXIgY2g7Ci0JaW50IGE7Ci0JaW50IGI7Ci0JaW50IG51bV9pbnN0cnVjdGlvbnMgPSAwOwotCi0JYSA9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKys7Ci0JYSB8PSAodW5zaWduZWQgY2hhcikqY29kZSsrIDw8IDg7Ci0JYSA9IChpbnQpU0hPUlQoYSk7Ci0JCi0JcDEgPSBjb2RlICsgYSArIDM7IC8qIHNraXAgdGhlIGZhaWx1cmVfanVtcCAqLwotCS8qIENoZWNrIHRoYXQgdGhlIGp1bXAgaXMgd2l0aGluIHRoZSBwYXR0ZXJuICovCi0JaWYgKHAxPGJ1ZnAtPmJ1ZmZlciB8fCBidWZwLT5idWZmZXIrYnVmcC0+dXNlZDxwMSkKLQkgIHsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiUmVnZXggVk0ganVtcCBvdXQgb2YgYm91bmRzIChmYWlsdXJlX2p1bXAgb3B0KSIpOwotCSAgICByZXR1cm4gMDsKLQkgIH0KLQkKLQlhc3NlcnQocDFbLTNdID09IENmYWlsdXJlX2p1bXApOwotCXAyID0gY29kZTsKLQkvKiBwMSBwb2ludHMgaW5zaWRlIGxvb3AsIHAyIHBvaW50cyB0byBhZnRlciBsb29wICovCi0JaWYgKCFyZV9kb19jb21waWxlX2Zhc3RtYXAoYnVmcC0+YnVmZmVyLCBidWZwLT51c2VkLAotCQkJCSAgIChpbnQpKHAyIC0gYnVmcC0+YnVmZmVyKSwKLQkJCQkgICAmY2FuX2JlX251bGwsIG1hcCkpCi0JCWdvdG8gbWFrZV9ub3JtYWxfanVtcDsKLQkKLQkvKiBJZiB3ZSBtaWdodCBpbnRyb2R1Y2UgYSBuZXcgdXBkYXRlIHBvaW50IGluc2lkZSB0aGUKLQkgKiBsb29wLCB3ZSBjYW4ndCBvcHRpbWl6ZSBiZWNhdXNlIHRoZW4gdXBkYXRlX2p1bXAgd291bGQKLQkgKiB1cGRhdGUgYSB3cm9uZyBmYWlsdXJlIHBvaW50LiAgVGh1cyB3ZSBoYXZlIHRvIGJlCi0JICogcXVpdGUgY2FyZWZ1bCBoZXJlLgotCSAqLwotCQotCS8qIGxvb3AgdW50aWwgd2UgZmluZCBzb21ldGhpbmcgdGhhdCBjb25zdW1lcyBhIGNoYXJhY3RlciAqLwotICBsb29wX3AxOgotCW51bV9pbnN0cnVjdGlvbnMrKzsKLQlzd2l0Y2ggKCpwMSsrKQotCXsKLQljYXNlIENib2w6Ci0JY2FzZSBDZW9sOgotCWNhc2UgQ2JlZ2J1ZjoKLQljYXNlIENlbmRidWY6Ci0JY2FzZSBDd29yZGJlZzoKLQljYXNlIEN3b3JkZW5kOgotCWNhc2UgQ3dvcmRib3VuZDoKLQljYXNlIENub3R3b3JkYm91bmQ6Ci0JewotCQlnb3RvIGxvb3BfcDE7Ci0JfQotCWNhc2UgQ3N0YXJ0X21lbW9yeToKLQljYXNlIENlbmRfbWVtb3J5OgotCXsKLQkJcDErKzsKLQkJZ290byBsb29wX3AxOwotCX0KLQljYXNlIENleGFjdDoKLQl7Ci0JCWNoID0gKHVuc2lnbmVkIGNoYXIpKnAxKys7Ci0JCWlmIChtYXBbKGludCljaF0pCi0JCQlnb3RvIG1ha2Vfbm9ybWFsX2p1bXA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIENhbnljaGFyOgotCXsKLQkJZm9yIChiID0gMDsgYiA8IDI1NjsgYisrKQotCQkJaWYgKGIgIT0gJ1xuJyAmJiBtYXBbYl0pCi0JCQkJZ290byBtYWtlX25vcm1hbF9qdW1wOwotCQlicmVhazsKLQl9Ci0JY2FzZSBDc2V0OgotCXsKLQkJZm9yIChiID0gMDsgYiA8IDI1NjsgYisrKQotCQkJaWYgKChwMVtiID4+IDNdICYgKDEgPDwgKGIgJiA3KSkpICYmIG1hcFtiXSkKLQkJCQlnb3RvIG1ha2Vfbm9ybWFsX2p1bXA7Ci0JCXAxICs9IDI1Ni84OwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQl7Ci0JCWdvdG8gbWFrZV9ub3JtYWxfanVtcDsKLQl9Ci0JfQotCS8qIG5vdyB3ZSBrbm93IHRoYXQgd2UgY2FuJ3QgYmFja3RyYWNrLiAqLwotCXdoaWxlIChwMSAhPSBwMiAtIDMpCi0JewotCQludW1faW5zdHJ1Y3Rpb25zKys7Ci0JCXN3aXRjaCAoKnAxKyspCi0JCXsKLQkJY2FzZSBDZW5kOgotCQl7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIENib2w6Ci0JCWNhc2UgQ2VvbDoKLQkJY2FzZSBDYW55Y2hhcjoKLQkJY2FzZSBDYmVnYnVmOgotCQljYXNlIENlbmRidWY6Ci0JCWNhc2UgQ3dvcmRiZWc6Ci0JCWNhc2UgQ3dvcmRlbmQ6Ci0JCWNhc2UgQ3dvcmRib3VuZDoKLQkJY2FzZSBDbm90d29yZGJvdW5kOgotCQl7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENzZXQ6Ci0JCXsKLQkJCXAxICs9IDI1Ni84OwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDZXhhY3Q6Ci0JCWNhc2UgQ3N0YXJ0X21lbW9yeToKLQkJY2FzZSBDZW5kX21lbW9yeToKLQkJY2FzZSBDbWF0Y2hfbWVtb3J5OgotCQljYXNlIENzeW50YXhzcGVjOgotCQljYXNlIENub3RzeW50YXhzcGVjOgotCQl7Ci0JCQlwMSsrOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDanVtcDoKLQkJY2FzZSBDc3Rhcl9qdW1wOgotCQljYXNlIENmYWlsdXJlX2p1bXA6Ci0JCWNhc2UgQ3VwZGF0ZV9mYWlsdXJlX2p1bXA6Ci0JCWNhc2UgQ2R1bW15X2ZhaWx1cmVfanVtcDoKLQkJewotCQkJZ290byBtYWtlX25vcm1hbF9qdW1wOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCXsKLQkJCXJldHVybiAwOwotCQl9Ci0JCX0KLQl9Ci0JCi0JLyogbWFrZV91cGRhdGVfanVtcDogKi8KLQljb2RlIC09IDM7Ci0JYSArPSAzOyAgLyoganVtcCB0byBhZnRlciB0aGUgQ2ZhaWx1cmVfanVtcCAqLwotCWNvZGVbMF0gPSBDdXBkYXRlX2ZhaWx1cmVfanVtcDsKLQljb2RlWzFdID0gYSAmIDB4ZmY7Ci0JY29kZVsyXSA9IGEgPj4gODsKLQlpZiAobnVtX2luc3RydWN0aW9ucyA+IDEpCi0JCXJldHVybiAxOwotCWFzc2VydChudW1faW5zdHJ1Y3Rpb25zID09IDEpOwotCS8qIGlmIHRoZSBvbmx5IGluc3RydWN0aW9uIG1hdGNoZXMgYSBzaW5nbGUgY2hhcmFjdGVyLCB3ZSBjYW4gZG8KLQkgKiBiZXR0ZXIgKi8KLQlwMSA9IGNvZGUgKyAzICsgYTsgICAvKiBzdGFydCBvZiBzb2xlIGluc3RydWN0aW9uICovCi0JaWYgKCpwMSA9PSBDc2V0IHx8ICpwMSA9PSBDZXhhY3QgfHwgKnAxID09IENhbnljaGFyIHx8Ci0JICAgICpwMSA9PSBDc3ludGF4c3BlYyB8fCAqcDEgPT0gQ25vdHN5bnRheHNwZWMpCi0JCWNvZGVbMF0gPSBDcmVwZWF0MTsKLQlyZXR1cm4gMTsKLQkKLSAgbWFrZV9ub3JtYWxfanVtcDoKLQljb2RlIC09IDM7Ci0JKmNvZGUgPSBDanVtcDsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCByZV9vcHRpbWl6ZShyZWdleHBfdCBidWZwKQotewotCXVuc2lnbmVkIGNoYXIgKmNvZGU7Ci0JCi0JY29kZSA9IGJ1ZnAtPmJ1ZmZlcjsKLQkKLQl3aGlsZSgxKQotCXsKLQkJc3dpdGNoICgqY29kZSsrKQotCQl7Ci0JCWNhc2UgQ2VuZDoKLQkJewotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJY2FzZSBDYW55Y2hhcjoKLQkJY2FzZSBDYm9sOgotCQljYXNlIENlb2w6Ci0JCWNhc2UgQ2JlZ2J1ZjoKLQkJY2FzZSBDZW5kYnVmOgotCQljYXNlIEN3b3JkYmVnOgotCQljYXNlIEN3b3JkZW5kOgotCQljYXNlIEN3b3JkYm91bmQ6Ci0JCWNhc2UgQ25vdHdvcmRib3VuZDoKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDc2V0OgotCQl7Ci0JCQljb2RlICs9IDI1Ni84OwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDZXhhY3Q6Ci0JCWNhc2UgQ3N0YXJ0X21lbW9yeToKLQkJY2FzZSBDZW5kX21lbW9yeToKLQkJY2FzZSBDbWF0Y2hfbWVtb3J5OgotCQljYXNlIENzeW50YXhzcGVjOgotCQljYXNlIENub3RzeW50YXhzcGVjOgotCQl7Ci0JCQljb2RlKys7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENzdGFyX2p1bXA6Ci0JCXsKLQkJCWlmICghcmVfb3B0aW1pemVfc3Rhcl9qdW1wKGJ1ZnAsIGNvZGUpKQotCQkJewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJLyogZmFsbCB0aHJvdWdoICovCi0JCX0KLQkJY2FzZSBDdXBkYXRlX2ZhaWx1cmVfanVtcDoKLQkJY2FzZSBDanVtcDoKLQkJY2FzZSBDZHVtbXlfZmFpbHVyZV9qdW1wOgotCQljYXNlIENmYWlsdXJlX2p1bXA6Ci0JCWNhc2UgQ3JlcGVhdDE6Ci0JCXsKLQkJCWNvZGUgKz0gMjsKLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCXsKLQkJCXJldHVybiAwOwotCQl9Ci0JCX0KLQl9Ci19Ci0KLSNkZWZpbmUgTkVYVENIQVIodmFyKSBcCi17IFwKLQlpZiAocG9zID49IHNpemUpIFwKLQkJZ290byBlbmRzX3ByZW1hdHVyZWx5OyBcCi0JKHZhcikgPSByZWdleFtwb3NdOyBcCi0JcG9zKys7IFwKLX0KLQotI2RlZmluZSBBTExPQyhhbW91bnQpIFwKLXsgXAotCSAgaWYgKHBhdHRlcm5fb2Zmc2V0KyhhbW91bnQpID4gYWxsb2MpIFwKLQkgIHsgXAotCQkgIGFsbG9jICs9IDI1NiArIChhbW91bnQpOyBcCi0JCSAgcGF0dGVybiA9IHJlYWxsb2MocGF0dGVybiwgYWxsb2MpOyBcCi0JCSAgaWYgKCFwYXR0ZXJuKSBcCi0JCQkgIGdvdG8gb3V0X29mX21lbW9yeTsgXAotCSAgfSBcCi19Ci0KLSNkZWZpbmUgU1RPUkUoY2gpIHBhdHRlcm5bcGF0dGVybl9vZmZzZXQrK10gPSAoY2gpCi0KLSNkZWZpbmUgQ1VSUkVOVF9MRVZFTF9TVEFSVCAoc3RhcnRzW3N0YXJ0c19iYXNlICsgY3VycmVudF9sZXZlbF0pCi0KLSNkZWZpbmUgU0VUX0xFVkVMX1NUQVJUIHN0YXJ0c1tzdGFydHNfYmFzZSArIGN1cnJlbnRfbGV2ZWxdID0gcGF0dGVybl9vZmZzZXQKLQotI2RlZmluZSBQVVNIX0xFVkVMX1NUQVJUUyBcCi1pZiAoc3RhcnRzX2Jhc2UgPCAoTUFYX05FU1RJTkctMSkqTlVNX0xFVkVMUykgXAotCXN0YXJ0c19iYXNlICs9IE5VTV9MRVZFTFM7IFwKLWVsc2UgXAotCWdvdG8gdG9vX2NvbXBsZXggXAotCi0jZGVmaW5lIFBPUF9MRVZFTF9TVEFSVFMgc3RhcnRzX2Jhc2UgLT0gTlVNX0xFVkVMUwotCi0jZGVmaW5lIFBVVF9BRERSKG9mZnNldCxhZGRyKSBcCi17IFwKLQlpbnQgZGlzcCA9IChhZGRyKSAtIChvZmZzZXQpIC0gMjsgXAotCXBhdHRlcm5bKG9mZnNldCldID0gZGlzcCAmIDB4ZmY7IFwKLQlwYXR0ZXJuWyhvZmZzZXQpKzFdID0gKGRpc3A+PjgpICYgMHhmZjsgXAotfQotCi0jZGVmaW5lIElOU0VSVF9KVU1QKHBvcyx0eXBlLGFkZHIpIFwKLXsgXAotCWludCBhLCBwID0gKHBvcyksIHQgPSAodHlwZSksIGFkID0gKGFkZHIpOyBcCi0JZm9yIChhID0gcGF0dGVybl9vZmZzZXQgLSAxOyBhID49IHA7IGEtLSkgXAotCQlwYXR0ZXJuW2EgKyAzXSA9IHBhdHRlcm5bYV07IFwKLQlwYXR0ZXJuW3BdID0gdDsgXAotCVBVVF9BRERSKHArMSxhZCk7IFwKLQlwYXR0ZXJuX29mZnNldCArPSAzOyBcCi19Ci0KLSNkZWZpbmUgU0VUQklUKGJ1ZixvZmZzZXQsYml0KSAoYnVmKVsob2Zmc2V0KSsoYml0KS84XSB8PSAoMTw8KChiaXQpICYgNykpCi0KLSNkZWZpbmUgU0VUX0ZJRUxEUyBcCi17IFwKLQlidWZwLT5hbGxvY2F0ZWQgPSBhbGxvYzsgXAotCWJ1ZnAtPmJ1ZmZlciA9IHBhdHRlcm47IFwKLQlidWZwLT51c2VkID0gcGF0dGVybl9vZmZzZXQ7IFwKLX0KLSAgICAKLSNkZWZpbmUgR0VUSEVYKHZhcikgXAoteyBcCi0JdW5zaWduZWQgY2hhciBnZXRoZXhfY2gsIGdldGhleF92YWx1ZTsgXAotCU5FWFRDSEFSKGdldGhleF9jaCk7IFwKLQlnZXRoZXhfdmFsdWUgPSBoZXhfY2hhcl90b19kZWNpbWFsKGdldGhleF9jaCk7IFwKLQlpZiAoZ2V0aGV4X3ZhbHVlID09IDE2KSBcCi0JCWdvdG8gaGV4X2Vycm9yOyBcCi0JTkVYVENIQVIoZ2V0aGV4X2NoKTsgXAotCWdldGhleF9jaCA9IGhleF9jaGFyX3RvX2RlY2ltYWwoZ2V0aGV4X2NoKTsgXAotCWlmIChnZXRoZXhfY2ggPT0gMTYpIFwKLQkJZ290byBoZXhfZXJyb3I7IFwKLQkodmFyKSA9IGdldGhleF92YWx1ZSAqIDE2ICsgZ2V0aGV4X2NoOyBcCi19Ci0KLSNkZWZpbmUgQU5TSV9UUkFOU0xBVEUoY2gpIFwKLXsgXAotCXN3aXRjaCAoY2gpIFwKLQl7IFwKLQljYXNlICdhJzogXAotCWNhc2UgJ0EnOiBcCi0JeyBcCi0JCWNoID0gNzsgLyogYXVkaWJsZSBiZWxsICovIFwKLQkJYnJlYWs7IFwKLQl9IFwKLQljYXNlICdiJzogXAotCWNhc2UgJ0InOiBcCi0JeyBcCi0JCWNoID0gODsgLyogYmFja3NwYWNlICovIFwKLQkJYnJlYWs7IFwKLQl9IFwKLQljYXNlICdmJzogXAotCWNhc2UgJ0YnOiBcCi0JeyBcCi0JCWNoID0gMTI7IC8qIGZvcm0gZmVlZCAqLyBcCi0JCWJyZWFrOyBcCi0JfSBcCi0JY2FzZSAnbic6IFwKLQljYXNlICdOJzogXAotCXsgXAotCQljaCA9IDEwOyAvKiBsaW5lIGZlZWQgKi8gXAotCQlicmVhazsgXAotCX0gXAotCWNhc2UgJ3InOiBcCi0JY2FzZSAnUic6IFwKLQl7IFwKLQkJY2ggPSAxMzsgLyogY2FycmlhZ2UgcmV0dXJuICovIFwKLQkJYnJlYWs7IFwKLQl9IFwKLQljYXNlICd0JzogXAotCWNhc2UgJ1QnOiBcCi0JeyBcCi0JICAgICAgY2ggPSA5OyAvKiB0YWIgKi8gXAotCSAgICAgIGJyZWFrOyBcCi0JfSBcCi0JY2FzZSAndic6IFwKLQljYXNlICdWJzogXAotCXsgXAotCQljaCA9IDExOyAvKiB2ZXJ0aWNhbCB0YWIgKi8gXAotCQlicmVhazsgXAotCX0gXAotCWNhc2UgJ3gnOiAvKiBoZXggY29kZSAqLyBcCi0JY2FzZSAnWCc6IFwKLQl7IFwKLQkJR0VUSEVYKGNoKTsgXAotCQlicmVhazsgXAotCX0gXAotCWRlZmF1bHQ6IFwKLQl7IFwKLQkJLyogb3RoZXIgY2hhcmFjdGVycyBwYXNzZWQgdGhyb3VnaCAqLyBcCi0JCWlmICh0cmFuc2xhdGUpIFwKLQkJCWNoID0gdHJhbnNsYXRlWyh1bnNpZ25lZCBjaGFyKWNoXTsgXAotCQlicmVhazsgXAotCX0gXAotCX0gXAotfQotCi1jaGFyICpyZV9jb21waWxlX3BhdHRlcm4odW5zaWduZWQgY2hhciAqcmVnZXgsIGludCBzaXplLCByZWdleHBfdCBidWZwKQotewotCWludCBhOwotCWludCBwb3M7Ci0JaW50IG9wOwotCWludCBjdXJyZW50X2xldmVsOwotCWludCBsZXZlbDsKLQlpbnQgb3Bjb2RlOwotCWludCBwYXR0ZXJuX29mZnNldCA9IDAsIGFsbG9jOwotCWludCBzdGFydHNbTlVNX0xFVkVMUyAqIE1BWF9ORVNUSU5HXTsKLQlpbnQgc3RhcnRzX2Jhc2U7Ci0JaW50IGZ1dHVyZV9qdW1wc1tNQVhfTkVTVElOR107Ci0JaW50IG51bV9qdW1wczsKLQl1bnNpZ25lZCBjaGFyIGNoID0gJ1wwJzsKLQl1bnNpZ25lZCBjaGFyICpwYXR0ZXJuOwotCXVuc2lnbmVkIGNoYXIgKnRyYW5zbGF0ZTsKLQlpbnQgbmV4dF9yZWdpc3RlcjsKLQlpbnQgcGFyZW5fZGVwdGg7Ci0JaW50IG51bV9vcGVuX3JlZ2lzdGVyczsKLQlpbnQgb3Blbl9yZWdpc3RlcnNbUkVfTlJFR1NdOwotCWludCBiZWdpbm5pbmdfY29udGV4dDsKLQkKLQlpZiAoIXJlX2NvbXBpbGVfaW5pdGlhbGl6ZWQpCi0JCXJlX2NvbXBpbGVfaW5pdGlhbGl6ZSgpOwotCWJ1ZnAtPnVzZWQgPSAwOwotCWJ1ZnAtPmZhc3RtYXBfYWNjdXJhdGUgPSAwOwotCWJ1ZnAtPnVzZXNfcmVnaXN0ZXJzID0gMTsKLQlidWZwLT5udW1fcmVnaXN0ZXJzID0gMTsKLQl0cmFuc2xhdGUgPSBidWZwLT50cmFuc2xhdGU7Ci0JcGF0dGVybiA9IGJ1ZnAtPmJ1ZmZlcjsKLQlhbGxvYyA9IGJ1ZnAtPmFsbG9jYXRlZDsKLQlpZiAoYWxsb2MgPT0gMCB8fCBwYXR0ZXJuID09IE5VTEwpCi0JewotCQlhbGxvYyA9IDI1NjsKLQkJcGF0dGVybiA9IG1hbGxvYyhhbGxvYyk7Ci0JCWlmICghcGF0dGVybikKLQkJCWdvdG8gb3V0X29mX21lbW9yeTsKLQl9Ci0JcGF0dGVybl9vZmZzZXQgPSAwOwotCXN0YXJ0c19iYXNlID0gMDsKLQludW1fanVtcHMgPSAwOwotCWN1cnJlbnRfbGV2ZWwgPSAwOwotCVNFVF9MRVZFTF9TVEFSVDsKLQludW1fb3Blbl9yZWdpc3RlcnMgPSAwOwotCW5leHRfcmVnaXN0ZXIgPSAxOwotCXBhcmVuX2RlcHRoID0gMDsKLQliZWdpbm5pbmdfY29udGV4dCA9IDE7Ci0Jb3AgPSAtMTsKLQkvKiB3ZSB1c2UgUmVuZCBkdW1teSB0byBlbnN1cmUgdGhhdCBwZW5kaW5nIGp1bXBzIGFyZSB1cGRhdGVkCi0JICAgKGR1ZSB0byBsb3cgcHJpb3JpdHkgb2YgUmVuZCkgYmVmb3JlIGV4aXRpbmcgdGhlIGxvb3AuICovCi0JcG9zID0gMDsKLQl3aGlsZSAob3AgIT0gUmVuZCkKLQl7Ci0JCWlmIChwb3MgPj0gc2l6ZSkKLQkJCW9wID0gUmVuZDsKLQkJZWxzZQotCQl7Ci0JCQlORVhUQ0hBUihjaCk7Ci0JCQlpZiAodHJhbnNsYXRlKQotCQkJCWNoID0gdHJhbnNsYXRlWyh1bnNpZ25lZCBjaGFyKWNoXTsKLQkJCW9wID0gcmVnZXhwX3BsYWluX29wc1sodW5zaWduZWQgY2hhciljaF07Ci0JCQlpZiAob3AgPT0gUnF1b3RlKQotCQkJewotCQkJCU5FWFRDSEFSKGNoKTsKLQkJCQlvcCA9IHJlZ2V4cF9xdW90ZWRfb3BzWyh1bnNpZ25lZCBjaGFyKWNoXTsKLQkJCQlpZiAob3AgPT0gUm5vcm1hbCAmJiByZWdleHBfYW5zaV9zZXF1ZW5jZXMpCi0JCQkJCUFOU0lfVFJBTlNMQVRFKGNoKTsKLQkJCX0KLQkJfQotCQlsZXZlbCA9IHJlZ2V4cF9wcmVjZWRlbmNlc1tvcF07Ci0JCS8qIHByaW50ZigiY2g9JyVjJyBvcD0lZCBsZXZlbD0lZCBjdXJyZW50X2xldmVsPSVkCi0JCSAgIGN1cmxldnN0YXJ0PSVkXG4iLCBjaCwgb3AsIGxldmVsLCBjdXJyZW50X2xldmVsLAotCQkgICBDVVJSRU5UX0xFVkVMX1NUQVJUKTsgKi8KLQkJaWYgKGxldmVsID4gY3VycmVudF9sZXZlbCkKLQkJewotCQkJZm9yIChjdXJyZW50X2xldmVsKys7IGN1cnJlbnRfbGV2ZWwgPCBsZXZlbDsgY3VycmVudF9sZXZlbCsrKQotCQkJCVNFVF9MRVZFTF9TVEFSVDsKLQkJCVNFVF9MRVZFTF9TVEFSVDsKLQkJfQotCQllbHNlCi0JCQlpZiAobGV2ZWwgPCBjdXJyZW50X2xldmVsKQotCQkJewotCQkJCWN1cnJlbnRfbGV2ZWwgPSBsZXZlbDsKLQkJCQlmb3IgKDtudW1fanVtcHMgPiAwICYmCi0JCQkJCSAgICAgZnV0dXJlX2p1bXBzW251bV9qdW1wcy0xXSA+PSBDVVJSRU5UX0xFVkVMX1NUQVJUOwotCQkJCSAgICAgbnVtX2p1bXBzLS0pCi0JCQkJCVBVVF9BRERSKGZ1dHVyZV9qdW1wc1tudW1fanVtcHMtMV0sIHBhdHRlcm5fb2Zmc2V0KTsKLQkJCX0KLQkJc3dpdGNoIChvcCkKLQkJewotCQljYXNlIFJlbmQ6Ci0JCXsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUm5vcm1hbDoKLQkJewotCQkgIG5vcm1hbF9jaGFyOgotCQkJb3Bjb2RlID0gQ2V4YWN0OwotCQkgIHN0b3JlX29wY29kZV9hbmRfYXJnOiAvKiBvcGNvZGUgJiBjaCBtdXN0IGJlIHNldCAqLwotCQkJU0VUX0xFVkVMX1NUQVJUOwotCQkJQUxMT0MoMik7Ci0JCQlTVE9SRShvcGNvZGUpOwotCQkJU1RPUkUoY2gpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSYW55Y2hhcjoKLQkJewotCQkJb3Bjb2RlID0gQ2FueWNoYXI7Ci0JCSAgc3RvcmVfb3Bjb2RlOgotCQkJU0VUX0xFVkVMX1NUQVJUOwotCQkJQUxMT0MoMSk7Ci0JCQlTVE9SRShvcGNvZGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBScXVvdGU6Ci0JCXsKLQkJCVB5X0ZhdGFsRXJyb3IoIlJxdW90ZSIpOwotCQkJLypOT1RSRUFDSEVEKi8KLQkJfQotCQljYXNlIFJib2w6Ci0JCXsKLQkJCWlmICghYmVnaW5uaW5nX2NvbnRleHQpIHsKLQkJCQlpZiAocmVnZXhwX2NvbnRleHRfaW5kZXBfb3BzKQotCQkJCQlnb3RvIG9wX2Vycm9yOwotCQkJCWVsc2UKLQkJCQkJZ290byBub3JtYWxfY2hhcjsKLQkJCX0KLQkJCW9wY29kZSA9IENib2w7Ci0JCQlnb3RvIHN0b3JlX29wY29kZTsKLQkJfQotCQljYXNlIFJlb2w6Ci0JCXsKLQkJCWlmICghKChwb3MgPj0gc2l6ZSkgfHwKLQkJCSAgICAgICgocmVnZXhwX3N5bnRheCAmIFJFX05PX0JLX1ZCQVIpID8KLQkJCSAgICAgICAocmVnZXhbcG9zXSA9PSAnXDE3NCcpIDoKLQkJCSAgICAgICAocG9zKzEgPCBzaXplICYmIHJlZ2V4W3Bvc10gPT0gJ1wxMzQnICYmCi0JCQkJcmVnZXhbcG9zKzFdID09ICdcMTc0JykpIHx8Ci0JCQkgICAgICAoKHJlZ2V4cF9zeW50YXggJiBSRV9OT19CS19QQVJFTlMpPwotCQkJICAgICAgIChyZWdleFtwb3NdID09ICcpJyk6Ci0JCQkgICAgICAgKHBvcysxIDwgc2l6ZSAmJiByZWdleFtwb3NdID09ICdcMTM0JyAmJgotCQkJCXJlZ2V4W3BvcysxXSA9PSAnKScpKSkpIHsKLQkJCQlpZiAocmVnZXhwX2NvbnRleHRfaW5kZXBfb3BzKQotCQkJCQlnb3RvIG9wX2Vycm9yOwotCQkJCWVsc2UKLQkJCQkJZ290byBub3JtYWxfY2hhcjsKLQkJCX0KLQkJCW9wY29kZSA9IENlb2w7Ci0JCQlnb3RvIHN0b3JlX29wY29kZTsKLQkJCS8qIE5PVFJFQUNIRUQgKi8KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUm9wdGlvbmFsOgotCQl7Ci0JCQlpZiAoYmVnaW5uaW5nX2NvbnRleHQpIHsKLQkJCQlpZiAocmVnZXhwX2NvbnRleHRfaW5kZXBfb3BzKQotCQkJCQlnb3RvIG9wX2Vycm9yOwotCQkJCWVsc2UKLQkJCQkJZ290byBub3JtYWxfY2hhcjsKLQkJCX0KLQkJCWlmIChDVVJSRU5UX0xFVkVMX1NUQVJUID09IHBhdHRlcm5fb2Zmc2V0KQotCQkJCWJyZWFrOyAvKiBpZ25vcmUgZW1wdHkgcGF0dGVybnMgZm9yID8gKi8KLQkJCUFMTE9DKDMpOwotCQkJSU5TRVJUX0pVTVAoQ1VSUkVOVF9MRVZFTF9TVEFSVCwgQ2ZhaWx1cmVfanVtcCwKLQkJCQkgICAgcGF0dGVybl9vZmZzZXQgKyAzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUnN0YXI6Ci0JCWNhc2UgUnBsdXM6Ci0JCXsKLQkJCWlmIChiZWdpbm5pbmdfY29udGV4dCkgewotCQkJCWlmIChyZWdleHBfY29udGV4dF9pbmRlcF9vcHMpCi0JCQkJCWdvdG8gb3BfZXJyb3I7Ci0JCQkJZWxzZQotCQkJCQlnb3RvIG5vcm1hbF9jaGFyOwotCQkJfQotCQkJaWYgKENVUlJFTlRfTEVWRUxfU1RBUlQgPT0gcGF0dGVybl9vZmZzZXQpCi0JCQkJYnJlYWs7IC8qIGlnbm9yZSBlbXB0eSBwYXR0ZXJucyBmb3IgKyBhbmQgKiAqLwotCQkJQUxMT0MoOSk7Ci0JCQlJTlNFUlRfSlVNUChDVVJSRU5UX0xFVkVMX1NUQVJULCBDZmFpbHVyZV9qdW1wLAotCQkJCSAgICBwYXR0ZXJuX29mZnNldCArIDYpOwotCQkJSU5TRVJUX0pVTVAocGF0dGVybl9vZmZzZXQsIENzdGFyX2p1bXAsIENVUlJFTlRfTEVWRUxfU1RBUlQpOwotCQkJaWYgKG9wID09IFJwbHVzKSAgLyoganVtcCBvdmVyIGluaXRpYWwgZmFpbHVyZV9qdW1wICovCi0JCQkJSU5TRVJUX0pVTVAoQ1VSUkVOVF9MRVZFTF9TVEFSVCwgQ2R1bW15X2ZhaWx1cmVfanVtcCwKLQkJCQkJICAgIENVUlJFTlRfTEVWRUxfU1RBUlQgKyA2KTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUm9yOgotCQl7Ci0JCQlBTExPQyg2KTsKLQkJCUlOU0VSVF9KVU1QKENVUlJFTlRfTEVWRUxfU1RBUlQsIENmYWlsdXJlX2p1bXAsCi0JCQkJICAgIHBhdHRlcm5fb2Zmc2V0ICsgNik7Ci0JCQlpZiAobnVtX2p1bXBzID49IE1BWF9ORVNUSU5HKQotCQkJCWdvdG8gdG9vX2NvbXBsZXg7Ci0JCQlTVE9SRShDanVtcCk7Ci0JCQlmdXR1cmVfanVtcHNbbnVtX2p1bXBzKytdID0gcGF0dGVybl9vZmZzZXQ7Ci0JCQlTVE9SRSgwKTsKLQkJCVNUT1JFKDApOwotCQkJU0VUX0xFVkVMX1NUQVJUOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSb3BlbnBhcjoKLQkJewotCQkJU0VUX0xFVkVMX1NUQVJUOwotCQkJaWYgKG5leHRfcmVnaXN0ZXIgPCBSRV9OUkVHUykKLQkJCXsKLQkJCQlidWZwLT51c2VzX3JlZ2lzdGVycyA9IDE7Ci0JCQkJQUxMT0MoMik7Ci0JCQkJU1RPUkUoQ3N0YXJ0X21lbW9yeSk7Ci0JCQkJU1RPUkUobmV4dF9yZWdpc3Rlcik7Ci0JCQkJb3Blbl9yZWdpc3RlcnNbbnVtX29wZW5fcmVnaXN0ZXJzKytdID0gbmV4dF9yZWdpc3RlcjsKLQkJCQlidWZwLT5udW1fcmVnaXN0ZXJzKys7Ci0JCQkJbmV4dF9yZWdpc3RlcisrOwotCQkJfQotCQkJcGFyZW5fZGVwdGgrKzsKLQkJCVBVU0hfTEVWRUxfU1RBUlRTOwotCQkJY3VycmVudF9sZXZlbCA9IDA7Ci0JCQlTRVRfTEVWRUxfU1RBUlQ7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFJjbG9zZXBhcjoKLQkJewotCQkJaWYgKHBhcmVuX2RlcHRoIDw9IDApCi0JCQkJZ290byBwYXJlbnRoZXNpc19lcnJvcjsKLQkJCVBPUF9MRVZFTF9TVEFSVFM7Ci0JCQljdXJyZW50X2xldmVsID0gcmVnZXhwX3ByZWNlZGVuY2VzW1JvcGVucGFyXTsKLQkJCXBhcmVuX2RlcHRoLS07Ci0JCQlpZiAocGFyZW5fZGVwdGggPCBudW1fb3Blbl9yZWdpc3RlcnMpCi0JCQl7Ci0JCQkJYnVmcC0+dXNlc19yZWdpc3RlcnMgPSAxOwotCQkJCUFMTE9DKDIpOwotCQkJCVNUT1JFKENlbmRfbWVtb3J5KTsKLQkJCQludW1fb3Blbl9yZWdpc3RlcnMtLTsKLQkJCQlTVE9SRShvcGVuX3JlZ2lzdGVyc1tudW1fb3Blbl9yZWdpc3RlcnNdKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUm1lbW9yeToKLQkJewotCQkJaWYgKGNoID09ICcwJykKLQkJCQlnb3RvIGJhZF9tYXRjaF9yZWdpc3RlcjsKLQkJCWFzc2VydChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKTsKLQkJCWJ1ZnAtPnVzZXNfcmVnaXN0ZXJzID0gMTsKLQkJCW9wY29kZSA9IENtYXRjaF9tZW1vcnk7Ci0JCQljaCAtPSAnMCc7Ci0JCQlnb3RvIHN0b3JlX29wY29kZV9hbmRfYXJnOwotCQl9Ci0JCWNhc2UgUmV4dGVuZGVkX21lbW9yeToKLQkJewotCQkJTkVYVENIQVIoY2gpOwotCQkJaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQotCQkJCWdvdG8gYmFkX21hdGNoX3JlZ2lzdGVyOwotCQkJTkVYVENIQVIoYSk7Ci0JCQlpZiAoYSA8ICcwJyB8fCBhID4gJzknKQotCQkJCWdvdG8gYmFkX21hdGNoX3JlZ2lzdGVyOwotCQkJY2ggPSAxMCAqIChhIC0gJzAnKSArIGNoIC0gJzAnOwotCQkJaWYgKGNoID09IDAgfHwgY2ggPj0gUkVfTlJFR1MpCi0JCQkJZ290byBiYWRfbWF0Y2hfcmVnaXN0ZXI7Ci0JCQlidWZwLT51c2VzX3JlZ2lzdGVycyA9IDE7Ci0JCQlvcGNvZGUgPSBDbWF0Y2hfbWVtb3J5OwotCQkJZ290byBzdG9yZV9vcGNvZGVfYW5kX2FyZzsKLQkJfQotCQljYXNlIFJvcGVuc2V0OgotCQl7Ci0JCQlpbnQgY29tcGxlbWVudDsKLQkJCWludCBwcmV2OwotCQkJaW50IG9mZnNldDsKLQkJCWludCByYW5nZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdGNoYXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQkJCVNFVF9MRVZFTF9TVEFSVDsKLQkJCUFMTE9DKDErMjU2LzgpOwotCQkJU1RPUkUoQ3NldCk7Ci0JCQlvZmZzZXQgPSBwYXR0ZXJuX29mZnNldDsKLQkJCWZvciAoYSA9IDA7IGEgPCAyNTYvODsgYSsrKQotCQkJCVNUT1JFKDApOwotCQkJTkVYVENIQVIoY2gpOwotCQkJaWYgKHRyYW5zbGF0ZSkKLQkJCQljaCA9IHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhciljaF07Ci0JCQlpZiAoY2ggPT0gJ1wxMzYnKQotCQkJewotCQkJCWNvbXBsZW1lbnQgPSAxOwotCQkJCU5FWFRDSEFSKGNoKTsKLQkJCQlpZiAodHJhbnNsYXRlKQotCQkJCQljaCA9IHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhciljaF07Ci0JCQl9Ci0JCQllbHNlCi0JCQkJY29tcGxlbWVudCA9IDA7Ci0JCQlwcmV2ID0gLTE7Ci0JCQlyYW5nZSA9IDA7Ci0JCQlmaXJzdGNoYXIgPSAxOwotCQkJd2hpbGUgKGNoICE9ICdcMTM1JyB8fCBmaXJzdGNoYXIpCi0JCQl7Ci0JCQkJZmlyc3RjaGFyID0gMDsKLQkJCQlpZiAocmVnZXhwX2Fuc2lfc2VxdWVuY2VzICYmIGNoID09ICdcMTM0JykKLQkJCQl7Ci0JCQkJCU5FWFRDSEFSKGNoKTsKLQkJCQkJQU5TSV9UUkFOU0xBVEUoY2gpOwotCQkJCX0KLQkJCQlpZiAocmFuZ2UpCi0JCQkJewotCQkJCQlmb3IgKGEgPSBwcmV2OyBhIDw9IChpbnQpY2g7IGErKykKLQkJCQkJCVNFVEJJVChwYXR0ZXJuLCBvZmZzZXQsIGEpOwotCQkJCQlwcmV2ID0gLTE7Ci0JCQkJCXJhbmdlID0gMDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlpZiAocHJldiAhPSAtMSAmJiBjaCA9PSAnLScpCi0JCQkJCQlyYW5nZSA9IDE7Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJU0VUQklUKHBhdHRlcm4sIG9mZnNldCwgY2gpOwotCQkJCQkJcHJldiA9IGNoOwotCQkJCQl9Ci0JCQkJTkVYVENIQVIoY2gpOwotCQkJCWlmICh0cmFuc2xhdGUpCi0JCQkJCWNoID0gdHJhbnNsYXRlWyh1bnNpZ25lZCBjaGFyKWNoXTsKLQkJCX0KLQkJCWlmIChyYW5nZSkKLQkJCQlTRVRCSVQocGF0dGVybiwgb2Zmc2V0LCAnLScpOwotCQkJaWYgKGNvbXBsZW1lbnQpCi0JCQl7Ci0JCQkJZm9yIChhID0gMDsgYSA8IDI1Ni84OyBhKyspCi0JCQkJCXBhdHRlcm5bb2Zmc2V0K2FdIF49IDB4ZmY7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFJiZWdidWY6Ci0JCXsKLQkJCW9wY29kZSA9IENiZWdidWY7Ci0JCQlnb3RvIHN0b3JlX29wY29kZTsKLQkJfQotCQljYXNlIFJlbmRidWY6Ci0JCXsKLQkJCW9wY29kZSA9IENlbmRidWY7Ci0JCQlnb3RvIHN0b3JlX29wY29kZTsKLQkJfQotCQljYXNlIFJ3b3JkY2hhcjoKLQkJewotCQkJb3Bjb2RlID0gQ3N5bnRheHNwZWM7Ci0JCQljaCA9IFN3b3JkOwotCQkJZ290byBzdG9yZV9vcGNvZGVfYW5kX2FyZzsKLQkJfQotCQljYXNlIFJub3R3b3JkY2hhcjoKLQkJewotCQkJb3Bjb2RlID0gQ25vdHN5bnRheHNwZWM7Ci0JCQljaCA9IFN3b3JkOwotCQkJZ290byBzdG9yZV9vcGNvZGVfYW5kX2FyZzsKLQkJfQotCQljYXNlIFJ3b3JkYmVnOgotCQl7Ci0JCQlvcGNvZGUgPSBDd29yZGJlZzsKLQkJCWdvdG8gc3RvcmVfb3Bjb2RlOwotCQl9Ci0JCWNhc2UgUndvcmRlbmQ6Ci0JCXsKLQkJCW9wY29kZSA9IEN3b3JkZW5kOwotCQkJZ290byBzdG9yZV9vcGNvZGU7Ci0JCX0KLQkJY2FzZSBSd29yZGJvdW5kOgotCQl7Ci0JCQlvcGNvZGUgPSBDd29yZGJvdW5kOwotCQkJZ290byBzdG9yZV9vcGNvZGU7Ci0JCX0KLQkJY2FzZSBSbm90d29yZGJvdW5kOgotCQl7Ci0JCQlvcGNvZGUgPSBDbm90d29yZGJvdW5kOwotCQkJZ290byBzdG9yZV9vcGNvZGU7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJewotCQkJYWJvcnQoKTsKLQkJfQotCQl9Ci0JCWJlZ2lubmluZ19jb250ZXh0ID0gKG9wID09IFJvcGVucGFyIHx8IG9wID09IFJvcik7Ci0JfQotCWlmIChzdGFydHNfYmFzZSAhPSAwKQotCQlnb3RvIHBhcmVudGhlc2lzX2Vycm9yOwotCWFzc2VydChudW1fanVtcHMgPT0gMCk7Ci0JQUxMT0MoMSk7Ci0JU1RPUkUoQ2VuZCk7Ci0JU0VUX0ZJRUxEUzsKLQlpZighcmVfb3B0aW1pemUoYnVmcCkpCi0JCXJldHVybiAiT3B0aW1pemF0aW9uIGVycm9yIjsKLQlyZXR1cm4gTlVMTDsKLQotICBvcF9lcnJvcjoKLQlTRVRfRklFTERTOwotCXJldHVybiAiQmFkbHkgcGxhY2VkIHNwZWNpYWwgY2hhcmFjdGVyIjsKLQotICBiYWRfbWF0Y2hfcmVnaXN0ZXI6Ci0JU0VUX0ZJRUxEUzsKLQlyZXR1cm4gIkJhZCBtYXRjaCByZWdpc3RlciBudW1iZXIiOwotICAgCi0gIGhleF9lcnJvcjoKLQlTRVRfRklFTERTOwotCXJldHVybiAiQmFkIGhleGFkZWNpbWFsIG51bWJlciI7Ci0gICAKLSAgcGFyZW50aGVzaXNfZXJyb3I6Ci0JU0VUX0ZJRUxEUzsKLQlyZXR1cm4gIkJhZGx5IHBsYWNlZCBwYXJlbnRoZXNpcyI7Ci0gICAKLSAgb3V0X29mX21lbW9yeToKLQlTRVRfRklFTERTOwotCXJldHVybiAiT3V0IG9mIG1lbW9yeSI7Ci0gICAKLSAgZW5kc19wcmVtYXR1cmVseToKLQlTRVRfRklFTERTOwotCXJldHVybiAiUmVndWxhciBleHByZXNzaW9uIGVuZHMgcHJlbWF0dXJlbHkiOwotCi0gIHRvb19jb21wbGV4OgotCVNFVF9GSUVMRFM7Ci0JcmV0dXJuICJSZWd1bGFyIGV4cHJlc3Npb24gdG9vIGNvbXBsZXgiOwotfQotCi0jdW5kZWYgQ0hBUkFUCi0jdW5kZWYgTkVYVENIQVIKLSN1bmRlZiBHRVRIRVgKLSN1bmRlZiBBTExPQwotI3VuZGVmIFNUT1JFCi0jdW5kZWYgQ1VSUkVOVF9MRVZFTF9TVEFSVAotI3VuZGVmIFNFVF9MRVZFTF9TVEFSVAotI3VuZGVmIFBVU0hfTEVWRUxfU1RBUlRTCi0jdW5kZWYgUE9QX0xFVkVMX1NUQVJUUwotI3VuZGVmIFBVVF9BRERSCi0jdW5kZWYgSU5TRVJUX0pVTVAKLSN1bmRlZiBTRVRCSVQKLSN1bmRlZiBTRVRfRklFTERTCi0KLSNkZWZpbmUgUFJFRkVUQ0ggaWYgKHRleHQgPT0gdGV4dGVuZCkgZ290byBmYWlsCi0KLSNkZWZpbmUgTkVYVENIQVIodmFyKSBcCi1QUkVGRVRDSDsgXAotdmFyID0gKHVuc2lnbmVkIGNoYXIpKnRleHQrKzsgXAotaWYgKHRyYW5zbGF0ZSkgXAotCXZhciA9IHRyYW5zbGF0ZVt2YXJdCi0KLWludCByZV9tYXRjaChyZWdleHBfdCBidWZwLCB1bnNpZ25lZCBjaGFyICpzdHJpbmcsIGludCBzaXplLCBpbnQgcG9zLAotICAgICAgICAgICAgIHJlZ2V4cF9yZWdpc3RlcnNfdCBvbGRfcmVncykKLXsKLQl1bnNpZ25lZCBjaGFyICpjb2RlOwotCXVuc2lnbmVkIGNoYXIgKnRyYW5zbGF0ZTsKLQl1bnNpZ25lZCBjaGFyICp0ZXh0OwotCXVuc2lnbmVkIGNoYXIgKnRleHRzdGFydDsKLQl1bnNpZ25lZCBjaGFyICp0ZXh0ZW5kOwotCWludCBhOwotCWludCBiOwotCWludCBjaDsKLQlpbnQgcmVnOwotCWludCBtYXRjaF9lbmQ7Ci0JdW5zaWduZWQgY2hhciAqcmVnc3RhcnQ7Ci0JdW5zaWduZWQgY2hhciAqcmVnZW5kOwotCWludCByZWdzaXplOwotCW1hdGNoX3N0YXRlIHN0YXRlOwotICAKLQlhc3NlcnQocG9zID49IDAgJiYgc2l6ZSA+PSAwKTsKLQlhc3NlcnQocG9zIDw9IHNpemUpOwotICAKLQl0ZXh0ID0gc3RyaW5nICsgcG9zOwotCXRleHRzdGFydCA9IHN0cmluZzsKLQl0ZXh0ZW5kID0gc3RyaW5nICsgc2l6ZTsKLSAgCi0JY29kZSA9IGJ1ZnAtPmJ1ZmZlcjsKLSAgCi0JdHJhbnNsYXRlID0gYnVmcC0+dHJhbnNsYXRlOwotICAKLQlORVdfU1RBVEUoc3RhdGUsIGJ1ZnAtPm51bV9yZWdpc3RlcnMpOwotCi0gIGNvbnRpbnVlX21hdGNoaW5nOgotCXN3aXRjaCAoKmNvZGUrKykKLQl7Ci0JY2FzZSBDZW5kOgotCXsKLQkJbWF0Y2hfZW5kID0gdGV4dCAtIHRleHRzdGFydDsKLQkJaWYgKG9sZF9yZWdzKQotCQl7Ci0JCQlvbGRfcmVncy0+c3RhcnRbMF0gPSBwb3M7Ci0JCQlvbGRfcmVncy0+ZW5kWzBdID0gbWF0Y2hfZW5kOwotCQkJaWYgKCFidWZwLT51c2VzX3JlZ2lzdGVycykKLQkJCXsKLQkJCQlmb3IgKGEgPSAxOyBhIDwgUkVfTlJFR1M7IGErKykKLQkJCQl7Ci0JCQkJCW9sZF9yZWdzLT5zdGFydFthXSA9IC0xOwotCQkJCQlvbGRfcmVncy0+ZW5kW2FdID0gLTE7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZvciAoYSA9IDE7IGEgPCBidWZwLT5udW1fcmVnaXN0ZXJzOyBhKyspCi0JCQkJewotCQkJCQlpZiAoKEdFVF9SRUdfU1RBUlQoc3RhdGUsIGEpID09IE5VTEwpIHx8Ci0JCQkJCSAgICAoR0VUX1JFR19FTkQoc3RhdGUsIGEpID09IE5VTEwpKQotCQkJCQl7Ci0JCQkJCQlvbGRfcmVncy0+c3RhcnRbYV0gPSAtMTsKLQkJCQkJCW9sZF9yZWdzLT5lbmRbYV0gPSAtMTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCW9sZF9yZWdzLT5zdGFydFthXSA9IEdFVF9SRUdfU1RBUlQoc3RhdGUsIGEpIC0gdGV4dHN0YXJ0OwotCQkJCQlvbGRfcmVncy0+ZW5kW2FdID0gR0VUX1JFR19FTkQoc3RhdGUsIGEpIC0gdGV4dHN0YXJ0OwotCQkJCX0KLQkJCQlmb3IgKDsgYSA8IFJFX05SRUdTOyBhKyspCi0JCQkJewotCQkJCQlvbGRfcmVncy0+c3RhcnRbYV0gPSAtMTsKLQkJCQkJb2xkX3JlZ3MtPmVuZFthXSA9IC0xOwotCQkJCX0KLQkJCX0KLQkJfQotCQlGUkVFX1NUQVRFKHN0YXRlKTsKLQkJcmV0dXJuIG1hdGNoX2VuZCAtIHBvczsKLQl9Ci0JY2FzZSBDYm9sOgotCXsKLQkJaWYgKHRleHQgPT0gdGV4dHN0YXJ0IHx8IHRleHRbLTFdID09ICdcbicpCi0JCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCQlnb3RvIGZhaWw7Ci0JfQotCWNhc2UgQ2VvbDoKLQl7Ci0JCWlmICh0ZXh0ID09IHRleHRlbmQgfHwgKnRleHQgPT0gJ1xuJykKLQkJCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JY2FzZSBDc2V0OgotCXsKLQkJTkVYVENIQVIoY2gpOwotCQlpZiAoY29kZVtjaC84XSAmICgxPDwoY2ggJiA3KSkpCi0JCXsKLQkJCWNvZGUgKz0gMjU2Lzg7Ci0JCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCQl9Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JY2FzZSBDZXhhY3Q6Ci0JewotCQlORVhUQ0hBUihjaCk7Ci0JCWlmIChjaCAhPSAodW5zaWduZWQgY2hhcikqY29kZSsrKQotCQkJZ290byBmYWlsOwotCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCX0KLQljYXNlIENhbnljaGFyOgotCXsKLQkJTkVYVENIQVIoY2gpOwotCQlpZiAoY2ggPT0gJ1xuJykKLQkJCWdvdG8gZmFpbDsKLQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQl9Ci0JY2FzZSBDc3RhcnRfbWVtb3J5OgotCXsKLQkJcmVnID0gKmNvZGUrKzsKLQkJU0VUX1JFR19TVEFSVChzdGF0ZSwgcmVnLCB0ZXh0LCBnb3RvIGVycm9yKTsKLQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQl9Ci0JY2FzZSBDZW5kX21lbW9yeToKLQl7Ci0JCXJlZyA9ICpjb2RlKys7Ci0JCVNFVF9SRUdfRU5EKHN0YXRlLCByZWcsIHRleHQsIGdvdG8gZXJyb3IpOwotCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCX0KLQljYXNlIENtYXRjaF9tZW1vcnk6Ci0JewotCQlyZWcgPSAqY29kZSsrOwotCQlyZWdzdGFydCA9IEdFVF9SRUdfU1RBUlQoc3RhdGUsIHJlZyk7Ci0JCXJlZ2VuZCA9IEdFVF9SRUdfRU5EKHN0YXRlLCByZWcpOwotCQlpZiAoKHJlZ3N0YXJ0ID09IE5VTEwpIHx8IChyZWdlbmQgPT0gTlVMTCkpCi0JCQlnb3RvIGZhaWw7ICAvKiBvciBzaG91bGQgd2UganVzdCBtYXRjaCBub3RoaW5nPyAqLwotCQlyZWdzaXplID0gcmVnZW5kIC0gcmVnc3RhcnQ7Ci0KLQkJaWYgKHJlZ3NpemUgPiAodGV4dGVuZCAtIHRleHQpKQotCQkJZ290byBmYWlsOwotCQlpZih0cmFuc2xhdGUpCi0JCXsKLQkJCWZvciAoOyByZWdzdGFydCA8IHJlZ2VuZDsgcmVnc3RhcnQrKywgdGV4dCsrKQotCQkJCWlmICh0cmFuc2xhdGVbKnJlZ3N0YXJ0XSAhPSB0cmFuc2xhdGVbKnRleHRdKQotCQkJCQlnb3RvIGZhaWw7Ci0JCX0KLQkJZWxzZQotCQkJZm9yICg7IHJlZ3N0YXJ0IDwgcmVnZW5kOyByZWdzdGFydCsrLCB0ZXh0KyspCi0JCQkJaWYgKCpyZWdzdGFydCAhPSAqdGV4dCkKLQkJCQkJZ290byBmYWlsOwotCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCX0KLQljYXNlIEN1cGRhdGVfZmFpbHVyZV9qdW1wOgotCXsKLQkJVVBEQVRFX0ZBSUxVUkUoc3RhdGUsIHRleHQsIGdvdG8gZXJyb3IpOwotCQkvKiBmYWxsIHRvIG5leHQgY2FzZSAqLwotCX0KLQkvKiB0cmVhdCBDc3Rhcl9qdW1wIGp1c3QgbGlrZSBDanVtcCBpZiBpdCBoYXNuJ3QgYmVlbiBvcHRpbWl6ZWQgKi8KLQljYXNlIENzdGFyX2p1bXA6Ci0JY2FzZSBDanVtcDoKLQl7Ci0JCWEgPSAodW5zaWduZWQgY2hhcikqY29kZSsrOwotCQlhIHw9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKysgPDwgODsKLQkJY29kZSArPSAoaW50KVNIT1JUKGEpOwotCQlpZiAoY29kZTxidWZwLT5idWZmZXIgfHwgYnVmcC0+YnVmZmVyK2J1ZnAtPnVzZWQ8Y29kZSkgewotCQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIlJlZ2V4IFZNIGp1bXAgb3V0IG9mIGJvdW5kcyAoQ2p1bXApIik7Ci0JCQlGUkVFX1NUQVRFKHN0YXRlKTsKLSAgICAgICAgICAgIAkgICAgICAgIHJldHVybiAtMjsKLSAgICAgICAgIAl9Ci0JCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JfQotCWNhc2UgQ2R1bW15X2ZhaWx1cmVfanVtcDoKLQl7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZmFpbHVyZWRlc3Q7Ci0JICAKLQkJYSA9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKys7Ci0JCWEgfD0gKHVuc2lnbmVkIGNoYXIpKmNvZGUrKyA8PCA4OwotCQlhID0gKGludClTSE9SVChhKTsKLQkJYXNzZXJ0KCpjb2RlID09IENmYWlsdXJlX2p1bXApOwotCQliID0gKHVuc2lnbmVkIGNoYXIpY29kZVsxXTsKLQkJYiB8PSAodW5zaWduZWQgY2hhciljb2RlWzJdIDw8IDg7Ci0gICAgICAgICAgICAgICAgZmFpbHVyZWRlc3QgPSBjb2RlICsgKGludClTSE9SVChiKSArIDM7Ci0JCWlmIChmYWlsdXJlZGVzdDxidWZwLT5idWZmZXIgfHwgYnVmcC0+YnVmZmVyK2J1ZnAtPnVzZWQgPCBmYWlsdXJlZGVzdCkgewotCQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIlJlZ2V4IFZNIGp1bXAgb3V0IG9mIGJvdW5kcyAoQ2R1bW15X2ZhaWx1cmVfanVtcCBmYWlsdXJlZGVzdCkiKTsKLQkJCUZSRUVfU1RBVEUoc3RhdGUpOwotICAgICAgICAgICAgCSAgICAgICAgcmV0dXJuIC0yOwotCQl9Ci0JCVBVU0hfRkFJTFVSRShzdGF0ZSwgZmFpbHVyZWRlc3QsIE5VTEwsIGdvdG8gZXJyb3IpOwotCQljb2RlICs9IGE7Ci0JCWlmIChjb2RlPGJ1ZnAtPmJ1ZmZlciB8fCBidWZwLT5idWZmZXIrYnVmcC0+dXNlZCA8IGNvZGUpIHsKLQkJICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJSZWdleCBWTSBqdW1wIG91dCBvZiBib3VuZHMgKENkdW1teV9mYWlsdXJlX2p1bXAgY29kZSkiKTsKLQkJCUZSRUVfU1RBVEUoc3RhdGUpOwotICAgICAgICAgICAgCSAgICAgICAgcmV0dXJuIC0yOwotICAgICAgICAgCX0KLQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQl9Ci0JY2FzZSBDZmFpbHVyZV9qdW1wOgotCXsKLQkJYSA9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKys7Ci0JCWEgfD0gKHVuc2lnbmVkIGNoYXIpKmNvZGUrKyA8PCA4OwotCQlhID0gKGludClTSE9SVChhKTsKLQkJaWYgKGNvZGUrYTxidWZwLT5idWZmZXIgfHwgYnVmcC0+YnVmZmVyK2J1ZnAtPnVzZWQgPCBjb2RlK2EpIHsKLQkJICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJSZWdleCBWTSBqdW1wIG91dCBvZiBib3VuZHMgKENmYWlsdXJlX2p1bXApIik7Ci0JCQlGUkVFX1NUQVRFKHN0YXRlKTsKLSAgICAgICAgICAgIAkgICAgICAgIHJldHVybiAtMjsKLSAgICAgICAgIAl9Ci0JCVBVU0hfRkFJTFVSRShzdGF0ZSwgY29kZSArIGEsIHRleHQsIGdvdG8gZXJyb3IpOwotCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCX0KLQljYXNlIENyZXBlYXQxOgotCXsKLQkJdW5zaWduZWQgY2hhciAqcGluc3Q7Ci0JCWEgPSAodW5zaWduZWQgY2hhcikqY29kZSsrOwotCQlhIHw9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKysgPDwgODsKLQkJYSA9IChpbnQpU0hPUlQoYSk7Ci0JCXBpbnN0ID0gY29kZSArIGE7Ci0JCWlmIChwaW5zdDxidWZwLT5idWZmZXIgfHwgYnVmcC0+YnVmZmVyK2J1ZnAtPnVzZWQ8cGluc3QpIHsKLQkJICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJSZWdleCBWTSBqdW1wIG91dCBvZiBib3VuZHMgKENyZXBlYXQxKSIpOwotCQkJRlJFRV9TVEFURShzdGF0ZSk7Ci0gICAgICAgICAgICAJICAgICAgICByZXR1cm4gLTI7Ci0gICAgICAgICAJfQotCQkvKiBwaW5zdCBpcyBzb2xlIGluc3RydWN0aW9uIGluIGxvb3AsIGFuZCBpdCBtYXRjaGVzIGEKLQkJICogc2luZ2xlIGNoYXJhY3Rlci4gIFNpbmNlIENyZXBlYXQxIHdhcyBvcmlnaW5hbGx5IGEKLQkJICogQ3VwZGF0ZV9mYWlsdXJlX2p1bXAsIHdlIGFsc28ga25vdyB0aGF0IGJhY2t0cmFja2luZwotCQkgKiBpcyB1c2VsZXNzOiBzbyBsb25nIGFzIHRoZSBzaW5nbGUtY2hhcmFjdGVyCi0JCSAqIGV4cHJlc3Npb24gbWF0Y2hlcywgaXQgbXVzdCBiZSB1c2VkLiAgQWxzbywgaW4gdGhlCi0JCSAqIGNhc2Ugb2YgKywgd2UndmUgYWxyZWFkeSBtYXRjaGVkIG9uZSBjaGFyYWN0ZXIsIHNvICsKLQkJICogY2FuJ3QgZmFpbDogbm90aGluZyBoZXJlIGNhbiBjYXVzZSBhIGZhaWx1cmUuICAqLwotCQlzd2l0Y2ggKCpwaW5zdCsrKQotCQl7Ci0JCWNhc2UgQ3NldDoKLQkJICB7Ci0JCSAgICAgICAgaWYgKHRyYW5zbGF0ZSkKLQkJCXsKLQkJCQl3aGlsZSAodGV4dCA8IHRleHRlbmQpCi0JCQkJewotCQkJCQljaCA9IHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhcikqdGV4dF07Ci0JCQkJCWlmIChwaW5zdFtjaC84XSAmICgxPDwoY2ggJiA3KSkpCi0JCQkJCQl0ZXh0Kys7Ci0JCQkJCWVsc2UKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl3aGlsZSAodGV4dCA8IHRleHRlbmQpCi0JCQkJewotCQkJCQljaCA9ICh1bnNpZ25lZCBjaGFyKSp0ZXh0OwotCQkJCQlpZiAocGluc3RbY2gvOF0gJiAoMTw8KGNoICYgNykpKQotCQkJCQkJdGV4dCsrOwotCQkJCQllbHNlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0JCWNhc2UgQ2V4YWN0OgotCQl7Ci0JCQljaCA9ICh1bnNpZ25lZCBjaGFyKSpwaW5zdDsKLQkJCWlmICh0cmFuc2xhdGUpCi0JCQl7Ci0JCQkJd2hpbGUgKHRleHQgPCB0ZXh0ZW5kICYmCi0JCQkJICAgICAgIHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhcikqdGV4dF0gPT0gY2gpCi0JCQkJCXRleHQrKzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl3aGlsZSAodGV4dCA8IHRleHRlbmQgJiYgKHVuc2lnbmVkIGNoYXIpKnRleHQgPT0gY2gpCi0JCQkJCXRleHQrKzsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQ2FueWNoYXI6Ci0JCXsKLQkJCXdoaWxlICh0ZXh0IDwgdGV4dGVuZCAmJiAodW5zaWduZWQgY2hhcikqdGV4dCAhPSAnXG4nKQotCQkJCXRleHQrKzsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQ3N5bnRheHNwZWM6Ci0JCXsKLQkJCWEgPSAodW5zaWduZWQgY2hhcikqcGluc3Q7Ci0JCQlpZiAodHJhbnNsYXRlKQotCQkJewotCQkJCXdoaWxlICh0ZXh0IDwgdGV4dGVuZCAmJgotCQkJCSAgICAgICAoU1lOVEFYKHRyYW5zbGF0ZVsqdGV4dF0pICYgYSkgKQotCQkJCQl0ZXh0Kys7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJd2hpbGUgKHRleHQgPCB0ZXh0ZW5kICYmIChTWU5UQVgoKnRleHQpICYgYSkgKQotCQkJCQl0ZXh0Kys7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENub3RzeW50YXhzcGVjOgotCQl7Ci0JCQlhID0gKHVuc2lnbmVkIGNoYXIpKnBpbnN0OwotCQkJaWYgKHRyYW5zbGF0ZSkKLQkJCXsKLQkJCQl3aGlsZSAodGV4dCA8IHRleHRlbmQgJiYKLQkJCQkgICAgICAgIShTWU5UQVgodHJhbnNsYXRlWyp0ZXh0XSkgJiBhKSApCi0JCQkJCXRleHQrKzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl3aGlsZSAodGV4dCA8IHRleHRlbmQgJiYgIShTWU5UQVgoKnRleHQpICYgYSkgKQotCQkJCQl0ZXh0Kys7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlkZWZhdWx0OgotCQl7Ci0JCSAgICAgICAgRlJFRV9TVEFURShzdGF0ZSk7Ci0JCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiVW5rbm93biByZWdleCBvcGNvZGU6IG1lbW9yeSBjb3JydXB0ZWQ/Iik7Ci0JCSAgICAgICAgcmV0dXJuIC0yOwotCQkJLypOT1RSRUFDSEVEKi8KLQkJfQotCQl9Ci0JCS8qIGR1ZSB0byB0aGUgZnVua3kgd2F5ICsgYW5kICogYXJlIGNvbXBpbGVkLCB0aGUgdG9wCi0JCSAqIGZhaWx1cmUtIHN0YWNrIGVudHJ5IGF0IHRoaXMgcG9pbnQgaXMgYWN0dWFsbHkgYQotCQkgKiBzdWNjZXNzIGVudHJ5IC0tIHVwZGF0ZSBpdCAmIHBvcCBpdCAqLwotCQlVUERBVEVfRkFJTFVSRShzdGF0ZSwgdGV4dCwgZ290byBlcnJvcik7Ci0JCWdvdG8gZmFpbDsgICAgICAvKiBpLmUuLCBzdWNjZWVkIDx3aW5rL3NpZ2g+ICovCi0JfQotCWNhc2UgQ2JlZ2J1ZjoKLQl7Ci0JCWlmICh0ZXh0ID09IHRleHRzdGFydCkKLQkJCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JY2FzZSBDZW5kYnVmOgotCXsKLQkJaWYgKHRleHQgPT0gdGV4dGVuZCkKLQkJCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JY2FzZSBDd29yZGJlZzoKLQl7Ci0JCWlmICh0ZXh0ID09IHRleHRlbmQpCi0JCQlnb3RvIGZhaWw7Ci0JCWlmICghKFNZTlRBWCgqdGV4dCkgJiBTd29yZCkpIAotCQkJZ290byBmYWlsOwotCQlpZiAodGV4dCA9PSB0ZXh0c3RhcnQpCi0JCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCQlpZiAoIShTWU5UQVgodGV4dFstMV0pICYgU3dvcmQpKQotCQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQkJZ290byBmYWlsOwotCX0KLQljYXNlIEN3b3JkZW5kOgotCXsKLQkJaWYgKHRleHQgPT0gdGV4dHN0YXJ0KQotCQkJZ290byBmYWlsOwotCQlpZiAoIShTWU5UQVgodGV4dFstMV0pICYgU3dvcmQpKQotCQkJZ290byBmYWlsOwotCQlpZiAodGV4dCA9PSB0ZXh0ZW5kKQotCQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQkJaWYgKCEoU1lOVEFYKCp0ZXh0KSAmIFN3b3JkKSkKLQkJICAgICAgICBnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLQl9Ci0JY2FzZSBDd29yZGJvdW5kOgotCXsKLQkJLyogTm90ZTogYXMgaW4gZ251IHJlZ2V4cCwgdGhpcyBhbHNvIG1hdGNoZXMgYXQgdGhlCi0JCSAqIGJlZ2lubmluZyBhbmQgZW5kIG9mIGJ1ZmZlci4gICovCi0KLQkJaWYgKHRleHQgPT0gdGV4dHN0YXJ0IHx8IHRleHQgPT0gdGV4dGVuZCkKLQkJCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JCWlmICgoU1lOVEFYKHRleHRbLTFdKSAmIFN3b3JkKSBeIChTWU5UQVgoKnRleHQpICYgU3dvcmQpKQotCQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQkJZ290byBmYWlsOwotCX0KLQljYXNlIENub3R3b3JkYm91bmQ6Ci0JewotCQkvKiBOb3RlOiBhcyBpbiBnbnUgcmVnZXhwLCB0aGlzIG5ldmVyIG1hdGNoZXMgYXQgdGhlCi0JCSAqIGJlZ2lubmluZyBhbmQgZW5kIG9mIGJ1ZmZlci4gICovCi0JCWlmICh0ZXh0ID09IHRleHRzdGFydCB8fCB0ZXh0ID09IHRleHRlbmQpCi0JCQlnb3RvIGZhaWw7Ci0JCWlmICghKChTWU5UQVgodGV4dFstMV0pICYgU3dvcmQpIF4gKFNZTlRBWCgqdGV4dCkgJiBTd29yZCkpKQotICAgICAgCQkgICAgICAgIGdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JY2FzZSBDc3ludGF4c3BlYzoKLQl7Ci0JCU5FWFRDSEFSKGNoKTsKLQkJaWYgKCEoU1lOVEFYKGNoKSAmICh1bnNpZ25lZCBjaGFyKSpjb2RlKyspKQotCQkJZ290byBmYWlsOwotCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCX0KLQljYXNlIENub3RzeW50YXhzcGVjOgotCXsKLQkJTkVYVENIQVIoY2gpOwotCQlpZiAoU1lOVEFYKGNoKSAmICh1bnNpZ25lZCBjaGFyKSpjb2RlKyspCi0JCQlnb3RvIGZhaWw7Ci0JCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JfQotCWRlZmF1bHQ6Ci0JewotCSAgICAgICAgRlJFRV9TVEFURShzdGF0ZSk7Ci0JICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJVbmtub3duIHJlZ2V4IG9wY29kZTogbWVtb3J5IGNvcnJ1cHRlZD8iKTsKLQkJcmV0dXJuIC0yOwotCQkvKk5PVFJFQUNIRUQqLwotCX0KLQl9Ci0JCi0JCi0KLSNpZiAwIC8qIFRoaXMgbGluZSBpcyBuZXZlciByZWFjaGVkIC0tR3VpZG8gKi8KLQlhYm9ydCgpOwotI2VuZGlmCi0JLyoKLQkgKk5PVFJFQUNIRUQKLQkgKi8KLQotCS8qIFVzaW5nICJicmVhazsiIGluIHRoZSBhYm92ZSBzd2l0Y2ggc3RhdGVtZW50IGlzIGVxdWl2YWxlbnQgdG8gImdvdG8gZmFpbDsiICovCi0gIGZhaWw6Ci0JUE9QX0ZBSUxVUkUoc3RhdGUsIGNvZGUsIHRleHQsIGdvdG8gZG9uZV9tYXRjaGluZywgZ290byBlcnJvcik7Ci0JZ290byBjb250aW51ZV9tYXRjaGluZzsKLSAgCi0gIGRvbmVfbWF0Y2hpbmc6Ci0vKiAgIGlmKHRyYW5zbGF0ZWQgIT0gTlVMTCkgKi8KLS8qICAgICAgZnJlZSh0cmFuc2xhdGVkKTsgKi8KLQlGUkVFX1NUQVRFKHN0YXRlKTsKLQlyZXR1cm4gLTE7Ci0KLSAgZXJyb3I6Ci0vKiAgIGlmICh0cmFuc2xhdGVkICE9IE5VTEwpICovCi0vKiAgICAgIGZyZWUodHJhbnNsYXRlZCk7ICovCi0JRlJFRV9TVEFURShzdGF0ZSk7Ci0JcmV0dXJuIC0yOwotfQotCQotCi0jdW5kZWYgUFJFRkVUQ0gKLSN1bmRlZiBORVhUQ0hBUgotCi1pbnQgcmVfc2VhcmNoKHJlZ2V4cF90IGJ1ZnAsIHVuc2lnbmVkIGNoYXIgKnN0cmluZywgaW50IHNpemUsIGludCBwb3MsCi0gICAgICAgICAgICAgIGludCByYW5nZSwgcmVnZXhwX3JlZ2lzdGVyc190IHJlZ3MpCi17Ci0JdW5zaWduZWQgY2hhciAqZmFzdG1hcDsKLQl1bnNpZ25lZCBjaGFyICp0cmFuc2xhdGU7Ci0JdW5zaWduZWQgY2hhciAqdGV4dDsKLQl1bnNpZ25lZCBjaGFyICpwYXJ0c3RhcnQ7Ci0JdW5zaWduZWQgY2hhciAqcGFydGVuZDsKLQlpbnQgZGlyOwotCWludCByZXQ7Ci0JdW5zaWduZWQgY2hhciBhbmNob3I7Ci0gIAotCWFzc2VydChzaXplID49IDAgJiYgcG9zID49IDApOwotCWFzc2VydChwb3MgKyByYW5nZSA+PSAwICYmIHBvcyArIHJhbmdlIDw9IHNpemUpOyAvKiBCdWdmaXggYnkgeWxvICovCi0gIAotCWZhc3RtYXAgPSBidWZwLT5mYXN0bWFwOwotCXRyYW5zbGF0ZSA9IGJ1ZnAtPnRyYW5zbGF0ZTsKLQlpZiAoZmFzdG1hcCAmJiAhYnVmcC0+ZmFzdG1hcF9hY2N1cmF0ZSkgewotICAgICAgICAgICAgICAgIHJlX2NvbXBpbGVfZmFzdG1hcChidWZwKTsKLQkgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSByZXR1cm4gLTI7Ci0JfQotCQotCWFuY2hvciA9IGJ1ZnAtPmFuY2hvcjsKLQlpZiAoYnVmcC0+Y2FuX2JlX251bGwgPT0gMSkgLyogY2FuX2JlX251bGwgPT0gMjogY2FuIG1hdGNoIG51bGwgYXQgZW9iICovCi0JCWZhc3RtYXAgPSBOVUxMOwotCi0JaWYgKHJhbmdlIDwgMCkKLQl7Ci0JCWRpciA9IC0xOwotCQlyYW5nZSA9IC1yYW5nZTsKLQl9Ci0JZWxzZQotCQlkaXIgPSAxOwotCi0JaWYgKGFuY2hvciA9PSAyKSB7Ci0JCWlmIChwb3MgIT0gMCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZQotCQkJcmFuZ2UgPSAwOwotCX0KLQotCWZvciAoOyByYW5nZSA+PSAwOyByYW5nZS0tLCBwb3MgKz0gZGlyKQotCXsKLQkJaWYgKGZhc3RtYXApCi0JCXsKLQkJCWlmIChkaXIgPT0gMSkKLQkJCXsgLyogc2VhcmNoaW5nIGZvcndhcmRzICovCi0KLQkJCQl0ZXh0ID0gc3RyaW5nICsgcG9zOwotCQkJCXBhcnRlbmQgPSBzdHJpbmcgKyBzaXplOwotCQkJCXBhcnRzdGFydCA9IHRleHQ7Ci0JCQkJaWYgKHRyYW5zbGF0ZSkKLQkJCQkJd2hpbGUgKHRleHQgIT0gcGFydGVuZCAmJgotCQkJCQkgICAgICAgIWZhc3RtYXBbKHVuc2lnbmVkIGNoYXIpIHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhcikqdGV4dF1dKQotCQkJCQkJdGV4dCsrOwotCQkJCWVsc2UKLQkJCQkJd2hpbGUgKHRleHQgIT0gcGFydGVuZCAmJiAhZmFzdG1hcFsodW5zaWduZWQgY2hhcikqdGV4dF0pCi0JCQkJCQl0ZXh0Kys7Ci0JCQkJcG9zICs9IHRleHQgLSBwYXJ0c3RhcnQ7Ci0JCQkJcmFuZ2UgLT0gdGV4dCAtIHBhcnRzdGFydDsKLQkJCQlpZiAocG9zID09IHNpemUgJiYgYnVmcC0+Y2FuX2JlX251bGwgPT0gMCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZQotCQkJeyAvKiBzZWFyY2hpbmcgYmFja3dhcmRzICovCi0JCQkJdGV4dCA9IHN0cmluZyArIHBvczsKLQkJCQlwYXJ0c3RhcnQgPSBzdHJpbmcgKyBwb3MgLSByYW5nZTsKLQkJCQlwYXJ0ZW5kID0gdGV4dDsKLQkJCQlpZiAodHJhbnNsYXRlKQotCQkJCQl3aGlsZSAodGV4dCAhPSBwYXJ0c3RhcnQgJiYKLQkJCQkJICAgICAgICFmYXN0bWFwWyh1bnNpZ25lZCBjaGFyKQotCQkJCQkJICAgICAgIHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhcikqdGV4dF1dKQotCQkJCQkJdGV4dC0tOwotCQkJCWVsc2UKLQkJCQkJd2hpbGUgKHRleHQgIT0gcGFydHN0YXJ0ICYmCi0JCQkJCSAgICAgICAhZmFzdG1hcFsodW5zaWduZWQgY2hhcikqdGV4dF0pCi0JCQkJCQl0ZXh0LS07Ci0JCQkJcG9zIC09IHBhcnRlbmQgLSB0ZXh0OwotCQkJCXJhbmdlIC09IHBhcnRlbmQgLSB0ZXh0OwotCQkJfQotCQl9Ci0JCWlmIChhbmNob3IgPT0gMSkKLQkJeyAvKiBhbmNob3JlZCB0byBiZWdsaW5lICovCi0JCQlpZiAocG9zID4gMCAmJiAoc3RyaW5nW3BvcyAtIDFdICE9ICdcbicpKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0JCWFzc2VydChwb3MgPj0gMCAmJiBwb3MgPD0gc2l6ZSk7Ci0JCXJldCA9IHJlX21hdGNoKGJ1ZnAsIHN0cmluZywgc2l6ZSwgcG9zLCByZWdzKTsKLQkJaWYgKHJldCA+PSAwKQotCQkJcmV0dXJuIHBvczsKLQkJaWYgKHJldCA9PSAtMikKLQkJCXJldHVybiAtMjsKLQl9Ci0JcmV0dXJuIC0xOwotfQotCi0vKgotKiogTG9jYWwgVmFyaWFibGVzOgotKiogbW9kZTogYwotKiogYy1maWxlLXN0eWxlOiAicHl0aG9uIgotKiogRW5kOgotKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvcmVnZXhwci5oIGIvTW9kdWxlcy9yZWdleHByLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZWU2MmQuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9yZWdleHByLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIC0qLSBtb2RlOiBjLW1vZGU7IGMtZmlsZS1zdHlsZTogcHl0aG9uIC0qLQotICovCi0KLSNpZm5kZWYgUHlfUkVHRVhQUl9ICi0jZGVmaW5lIFB5X1JFR0VYUFJfSAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKgotICogcmVnZXhwci5oCi0gKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQG5ncy5maT4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTEgVGF0dSBZbG9uZW4sIEVzcG9vLCBGaW5sYW5kCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQotICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuICBUaGlzCi0gKiBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIENyZWF0ZWQ6IFRodSBTZXAgMjYgMTc6MTU6MzYgMTk5MSB5bG8KLSAqIExhc3QgbW9kaWZpZWQ6IE1vbiBOb3YgIDQgMTU6NDk6NDYgMTk5MSB5bG8KLSAqLwotCi0vKiAkSWQkICovCi0KLSNpZm5kZWYgUkVHRVhQUl9ICi0jZGVmaW5lIFJFR0VYUFJfSAotCi0jZGVmaW5lIFJFX05SRUdTCTEwMCAgLyogbnVtYmVyIG9mIHJlZ2lzdGVycyBhdmFpbGFibGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIKLXsKLQl1bnNpZ25lZCBjaGFyICpidWZmZXI7ICAgICAgICAgIC8qIGNvbXBpbGVkIHBhdHRlcm4gKi8KLQlpbnQgYWxsb2NhdGVkOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzaXplIG9mIGNvbXBpbGVkIHBhdHRlcm4gKi8KLQlpbnQgdXNlZDsgICAgICAgICAgICAgIC8qIGFjdHVhbCBsZW5ndGggb2YgY29tcGlsZWQgcGF0dGVybiAqLwotCXVuc2lnbmVkIGNoYXIgKmZhc3RtYXA7ICAgICAgICAgLyogZmFzdG1hcFtjaF0gaXMgdHJ1ZSBpZiBjaCBjYW4gc3RhcnQgcGF0dGVybiAqLwotCXVuc2lnbmVkIGNoYXIgKnRyYW5zbGF0ZTsgICAgICAgLyogdHJhbnNsYXRpb24gdG8gYXBwbHkgZHVyaW5nIGNvbXBpbGF0aW9uL21hdGNoaW5nICovCi0JdW5zaWduZWQgY2hhciBmYXN0bWFwX2FjY3VyYXRlOyAvKiB0cnVlIGlmIGZhc3RtYXAgaXMgdmFsaWQgKi8KLQl1bnNpZ25lZCBjaGFyIGNhbl9iZV9udWxsOyAgICAgIC8qIHRydWUgaWYgY2FuIG1hdGNoIGVtcHR5IHN0cmluZyAqLwotCXVuc2lnbmVkIGNoYXIgdXNlc19yZWdpc3RlcnM7ICAgLyogcmVnaXN0ZXJzIGFyZSB1c2VkIGFuZCBuZWVkIHRvIGJlIGluaXRpYWxpemVkICovCi0JaW50IG51bV9yZWdpc3RlcnM7ICAgICAvKiBudW1iZXIgb2YgcmVnaXN0ZXJzIHVzZWQgKi8KLQl1bnNpZ25lZCBjaGFyIGFuY2hvcjsgICAgICAgICAgIC8qIGFuY2hvcjogMD1ub25lIDE9YmVnbGluZSAyPWJlZ2J1ZiAqLwotfSAqcmVnZXhwX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHJlX3JlZ2lzdGVycwotewotCWludCBzdGFydFtSRV9OUkVHU107ICAvKiBzdGFydCBvZmZzZXQgb2YgcmVnaW9uICovCi0JaW50IGVuZFtSRV9OUkVHU107ICAgIC8qIGVuZCBvZmZzZXQgb2YgcmVnaW9uICovCi19ICpyZWdleHBfcmVnaXN0ZXJzX3Q7Ci0KLS8qIGJpdCBkZWZpbml0aW9ucyBmb3Igc3ludGF4ICovCi0jZGVmaW5lIFJFX05PX0JLX1BBUkVOUwkJMSAgICAvKiBubyBxdW90aW5nIGZvciBwYXJlbnRoZXNlcyAqLwotI2RlZmluZSBSRV9OT19CS19WQkFSCQkyICAgIC8qIG5vIHF1b3RpbmcgZm9yIHZlcnRpY2FsIGJhciAqLwotI2RlZmluZSBSRV9CS19QTFVTX1FNCQk0ICAgIC8qIHF1b3RpbmcgbmVlZGVkIGZvciArIGFuZCA/ICovCi0jZGVmaW5lIFJFX1RJR0hUX1ZCQVIJCTggICAgLyogfCBiaW5kcyB0aWdodGVyIHRoYW4gXiBhbmQgJCAqLwotI2RlZmluZSBSRV9ORVdMSU5FX09SCQkxNiAgIC8qIHRyZWF0IG5ld2xpbmUgYXMgb3IgKi8KLSNkZWZpbmUgUkVfQ09OVEVYVF9JTkRFUF9PUFMJMzIgICAvKiBeJD8qKyBhcmUgc3BlY2lhbCBpbiBhbGwgY29udGV4dHMgKi8KLSNkZWZpbmUgUkVfQU5TSV9IRVgJCTY0ICAgLyogYW5zaSBzZXF1ZW5jZXMgKFxuIGV0YykgYW5kIFx4aGggKi8KLSNkZWZpbmUgUkVfTk9fR05VX0VYVEVOU0lPTlMgICAxMjggICAvKiBubyBnbnUgZXh0ZW5zaW9ucyAqLwotCi0vKiBkZWZpbml0aW9ucyBmb3Igc29tZSBjb21tb24gcmVnZXhwIHN0eWxlcyAqLwotI2RlZmluZSBSRV9TWU5UQVhfQVdLCShSRV9OT19CS19QQVJFTlN8UkVfTk9fQktfVkJBUnxSRV9DT05URVhUX0lOREVQX09QUykKLSNkZWZpbmUgUkVfU1lOVEFYX0VHUkVQCShSRV9TWU5UQVhfQVdLfFJFX05FV0xJTkVfT1IpCi0jZGVmaW5lIFJFX1NZTlRBWF9HUkVQCShSRV9CS19QTFVTX1FNfFJFX05FV0xJTkVfT1IpCi0jZGVmaW5lIFJFX1NZTlRBWF9FTUFDUwkwCi0KLSNkZWZpbmUgU3dvcmQgICAgICAgMQotI2RlZmluZSBTd2hpdGVzcGFjZSAyCi0jZGVmaW5lIFNkaWdpdCAgICAgIDQKLSNkZWZpbmUgU29jdGFsZGlnaXQgOAotI2RlZmluZSBTaGV4ZGlnaXQgICAxNgotCi0vKiBSZW5hbWUgYWxsIGV4cG9ydGVkIHN5bWJvbHMgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggc2ltaWxhcmx5IG5hbWVkCi0gICBzeW1ib2xzIGluIHNvbWUgc3lzdGVtcycgc3RhbmRhcmQgQyBsaWJyYXJpZXMuLi4gKi8KLQotI2RlZmluZSByZV9zeW50YXggX1B5X3JlX3N5bnRheAotI2RlZmluZSByZV9zeW50YXhfdGFibGUgX1B5X3JlX3N5bnRheF90YWJsZQotI2RlZmluZSByZV9jb21waWxlX2luaXRpYWxpemUgX1B5X3JlX2NvbXBpbGVfaW5pdGlhbGl6ZQotI2RlZmluZSByZV9zZXRfc3ludGF4IF9QeV9yZV9zZXRfc3ludGF4Ci0jZGVmaW5lIHJlX2NvbXBpbGVfcGF0dGVybiBfUHlfcmVfY29tcGlsZV9wYXR0ZXJuCi0jZGVmaW5lIHJlX21hdGNoIF9QeV9yZV9tYXRjaAotI2RlZmluZSByZV9zZWFyY2ggX1B5X3JlX3NlYXJjaAotI2RlZmluZSByZV9jb21waWxlX2Zhc3RtYXAgX1B5X3JlX2NvbXBpbGVfZmFzdG1hcAotI2RlZmluZSByZV9jb21wIF9QeV9yZV9jb21wCi0jZGVmaW5lIHJlX2V4ZWMgX1B5X3JlX2V4ZWMKLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotCi1leHRlcm4gaW50IHJlX3N5bnRheDsKLS8qIFRoaXMgaXMgdGhlIGFjdHVhbCBzeW50YXggbWFzay4gIEl0IHdhcyBhZGRlZCBzbyB0aGF0IFB5dGhvbiBjb3VsZCBkbwotICogc3ludGF4LWRlcGVuZGVudCBtdW5naW5nIG9mIHBhdHRlcm5zIGJlZm9yZSBjb21waWxhdGlvbi4gKi8KLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcmVfc3ludGF4X3RhYmxlWzI1Nl07Ci0KLXZvaWQgcmVfY29tcGlsZV9pbml0aWFsaXplKHZvaWQpOwotCi1pbnQgcmVfc2V0X3N5bnRheChpbnQgc3ludGF4KTsKLS8qIFRoaXMgc2V0cyB0aGUgc3ludGF4IHRvIHVzZSBhbmQgcmV0dXJucyB0aGUgcHJldmlvdXMgc3ludGF4LiAgVGhlCi0gKiBzeW50YXggaXMgc3BlY2lmaWVkIGJ5IGEgYml0IG1hc2sgb2YgdGhlIGFib3ZlIGRlZmluZWQgYml0cy4gKi8KLQotY2hhciAqcmVfY29tcGlsZV9wYXR0ZXJuKHVuc2lnbmVkIGNoYXIgKnJlZ2V4LCBpbnQgcmVnZXhfc2l6ZSwgcmVnZXhwX3QgY29tcGlsZWQpOwotLyogVGhpcyBjb21waWxlcyB0aGUgcmVnZXhwIChnaXZlbiBpbiByZWdleCBhbmQgbGVuZ3RoIGluIHJlZ2V4X3NpemUpLgotICogVGhpcyByZXR1cm5zIE5VTEwgaWYgdGhlIHJlZ2V4cCBjb21waWxlZCBzdWNjZXNzZnVsbHksIGFuZCBhbiBlcnJvcgotICogbWVzc2FnZSBpZiBhbiBlcnJvciB3YXMgZW5jb3VudGVyZWQuICBUaGUgYnVmZmVyIGZpZWxkIG11c3QgYmUKLSAqIGluaXRpYWxpemVkIHRvIGEgbWVtb3J5IGFyZWEgYWxsb2NhdGVkIGJ5IG1hbGxvYyAob3IgdG8gTlVMTCkgYmVmb3JlCi0gKiB1c2UsIGFuZCB0aGUgYWxsb2NhdGVkIGZpZWxkIG11c3QgYmUgc2V0IHRvIGl0cyBsZW5ndGggKG9yIDAgaWYKLSAqIGJ1ZmZlciBpcyBOVUxMKS4gIEFsc28sIHRoZSB0cmFuc2xhdGUgZmllbGQgbXVzdCBiZSBzZXQgdG8gcG9pbnQgdG8gYQotICogdmFsaWQgdHJhbnNsYXRpb24gdGFibGUsIG9yIE5VTEwgaWYgaXQgaXMgbm90IHVzZWQuICovCi0KLWludCByZV9tYXRjaChyZWdleHBfdCBjb21waWxlZCwgdW5zaWduZWQgY2hhciAqc3RyaW5nLCBpbnQgc2l6ZSwgaW50IHBvcywKLQkgICAgIHJlZ2V4cF9yZWdpc3RlcnNfdCBvbGRfcmVncyk7Ci0vKiBUaGlzIHRyaWVzIHRvIG1hdGNoIHRoZSByZWdleHAgYWdhaW5zdCB0aGUgc3RyaW5nLiAgVGhpcyByZXR1cm5zIHRoZQotICogbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHBvcnRpb24sIG9yIC0xIGlmIHRoZSBwYXR0ZXJuIGNvdWxkIG5vdCBiZQotICogbWF0Y2hlZCBhbmQgLTIgaWYgYW4gZXJyb3IgKHN1Y2ggYXMgZmFpbHVyZSBzdGFjayBvdmVyZmxvdykgaXMKLSAqIGVuY291bnRlcmVkLiAqLwotCi1pbnQgcmVfc2VhcmNoKHJlZ2V4cF90IGNvbXBpbGVkLCB1bnNpZ25lZCBjaGFyICpzdHJpbmcsIGludCBzaXplLCBpbnQgc3RhcnRwb3MsCi0JICAgICAgaW50IHJhbmdlLCByZWdleHBfcmVnaXN0ZXJzX3QgcmVncyk7Ci0vKiBUaGlzIHNlYXJjaGVzIGZvciBhIHN1YnN0cmluZyBtYXRjaGluZyB0aGUgcmVnZXhwLiAgVGhpcyByZXR1cm5zIHRoZQotICogZmlyc3QgaW5kZXggYXQgd2hpY2ggYSBtYXRjaCBpcyBmb3VuZC4gIHJhbmdlIHNwZWNpZmllcyBhdCBob3cgbWFueQotICogcG9zaXRpb25zIHRvIHRyeSBtYXRjaGluZzsgcG9zaXRpdmUgdmFsdWVzIGluZGljYXRlIHNlYXJjaGluZwotICogZm9yd2FyZHMsIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgc2VhcmNoaW5nIGJhY2t3YXJkcy4gIG1zdG9wCi0gKiBzcGVjaWZpZXMgdGhlIG9mZnNldCBiZXlvbmQgd2hpY2ggYSBtYXRjaCBtdXN0IG5vdCBnby4gIFRoaXMgcmV0dXJucwotICogLTEgaWYgbm8gbWF0Y2ggaXMgZm91bmQsIGFuZCAtMiBpZiBhbiBlcnJvciAoc3VjaCBhcyBmYWlsdXJlIHN0YWNrCi0gKiBvdmVyZmxvdykgaXMgZW5jb3VudGVyZWQuICovCi0KLXZvaWQgcmVfY29tcGlsZV9mYXN0bWFwKHJlZ2V4cF90IGNvbXBpbGVkKTsKLS8qIFRoaXMgY29tcHV0ZXMgdGhlIGZhc3RtYXAgZm9yIHRoZSByZWdleHAuICBGb3IgdGhpcyB0byBoYXZlIGFueSBlZmZlY3QsCi0gKiB0aGUgY2FsbGluZyBwcm9ncmFtIG11c3QgaGF2ZSBpbml0aWFsaXplZCB0aGUgZmFzdG1hcCBmaWVsZCB0byBwb2ludAotICogdG8gYW4gYXJyYXkgb2YgMjU2IGNoYXJhY3RlcnMuICovCi0KLSNlbHNlIC8qIEhBVkVfUFJPVE9UWVBFUyAqLwotCi1leHRlcm4gaW50IHJlX3N5bnRheDsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIHJlX3N5bnRheF90YWJsZVsyNTZdOwotdm9pZCByZV9jb21waWxlX2luaXRpYWxpemUoKTsKLWludCByZV9zZXRfc3ludGF4KCk7Ci1jaGFyICpyZV9jb21waWxlX3BhdHRlcm4oKTsKLWludCByZV9tYXRjaCgpOwotaW50IHJlX3NlYXJjaCgpOwotdm9pZCByZV9jb21waWxlX2Zhc3RtYXAoKTsKLQotI2VuZGlmIC8qIEhBVkVfUFJPVE9UWVBFUyAqLwotCi0jZW5kaWYgLyogUkVHRVhQUl9IICovCi0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2VuZGlmIC8qICFQeV9SRUdFWFBSX0ggKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvcmVzb3VyY2UuYyBiL01vZHVsZXMvcmVzb3VyY2UuYwppbmRleCA3Y2JkMmM5Li5lNzNjODc4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Jlc291cmNlLmMKKysrIGIvTW9kdWxlcy9yZXNvdXJjZS5jCkBAIC01NSw2ICs1NSw3IEBACiAJMTYJLyogbl9pbl9zZXF1ZW5jZSAqLwogfTsKIAorc3RhdGljIGludCBpbml0aWFsaXplZDsKIHN0YXRpYyBQeVR5cGVPYmplY3QgU3RydWN0UlVzYWdlVHlwZTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTI0NCw3ICsyNDUsMTAgQEAKIAl9CiAJUHlfSU5DUkVGKFJlc291cmNlRXJyb3IpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBSZXNvdXJjZUVycm9yKTsKLSAJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0UlVzYWdlVHlwZSwgJnN0cnVjdF9ydXNhZ2VfZGVzYyk7CisJaWYgKCFpbml0aWFsaXplZCkKKwkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0UlVzYWdlVHlwZSwgCisJCQkJCSAgJnN0cnVjdF9ydXNhZ2VfZGVzYyk7CisJUHlfSU5DUkVGKCZTdHJ1Y3RSVXNhZ2VUeXBlKTsKICAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcnVzYWdlIiwgCiAJCQkgICAoUHlPYmplY3QqKSAmU3RydWN0UlVzYWdlVHlwZSk7CiAKQEAgLTMyMCw0ICszMjQsNSBAQAogCWlmICh2KSB7CiAJCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUkxJTV9JTkZJTklUWSIsIHYpOwogCX0KKwlpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYwppbmRleCBjNTI2ZDc1Li5jOWRkNGEzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKQEAgLTYyLDYgKzYyLDcgQEAKICovCiAKICNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKIAogI3VuZGVmIE1BWAogI2RlZmluZSBNQVgoeCwgeSkgKCh4KSA8ICh5KSA/ICh5KSA6ICh4KSkKQEAgLTk2Nyw3ICs5NjgsMTggQEAKIAljYXNlIEFGX1VOSVg6CiAJewogCQlzdHJ1Y3Qgc29ja2FkZHJfdW4gKmEgPSAoc3RydWN0IHNvY2thZGRyX3VuICopIGFkZHI7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGEtPnN1bl9wYXRoKTsKKyNpZmRlZiBsaW51eAorCQlpZiAoYS0+c3VuX3BhdGhbMF0gPT0gMCkgeyAgLyogTGludXggYWJzdHJhY3QgbmFtZXNwYWNlICovCisJCQlhZGRybGVuIC09IChzaXplb2YoKmEpIC0gc2l6ZW9mKGEtPnN1bl9wYXRoKSk7CisJCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYS0+c3VuX3BhdGgsCisJCQkJCQkJICBhZGRybGVuKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLyogbGludXggKi8KKwkJeworCQkJLyogcmVndWxhciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nICovCisJCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhhLT5zdW5fcGF0aCk7CisJCX0KIAl9CiAjZW5kaWYgLyogQUZfVU5JWCAqLwogCkBAIC0xMDk3LDE0ICsxMTA5LDI4IEBACiAJCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX3VuKikmKHMtPnNvY2tfYWRkcikudW47CiAJCWlmICghUHlBcmdfUGFyc2UoYXJncywgInQjIiwgJnBhdGgsICZsZW4pKQogCQkJcmV0dXJuIDA7Ci0JCWlmIChsZW4gPiBzaXplb2YgYWRkci0+c3VuX3BhdGgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkJCSJBRl9VTklYIHBhdGggdG9vIGxvbmciKTsKLQkJCXJldHVybiAwOworI2lmZGVmIGxpbnV4CisJCWlmIChsZW4gPiAwICYmIHBhdGhbMF0gPT0gMCkgeworCQkJLyogTGludXggYWJzdHJhY3QgbmFtZXNwYWNlIGV4dGVuc2lvbiAqLworCQkJaWYgKGxlbiA+IHNpemVvZiBhZGRyLT5zdW5fcGF0aCkgeworCQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisJCQkJCQkiQUZfVU5JWCBwYXRoIHRvbyBsb25nIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJZWxzZQorI2VuZGlmIC8qIGxpbnV4ICovCisgICAgICAgICAgICAgICAgeworCQkJLyogcmVndWxhciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nICovCisJCQlpZiAobGVuID49IHNpemVvZiBhZGRyLT5zdW5fcGF0aCkgeworCQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisJCQkJCQkiQUZfVU5JWCBwYXRoIHRvbyBsb25nIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlhZGRyLT5zdW5fcGF0aFtsZW5dID0gMDsKIAkJfQogCQlhZGRyLT5zdW5fZmFtaWx5ID0gcy0+c29ja19mYW1pbHk7CiAJCW1lbWNweShhZGRyLT5zdW5fcGF0aCwgcGF0aCwgbGVuKTsKLQkJYWRkci0+c3VuX3BhdGhbbGVuXSA9IDA7CiAJCSphZGRyX3JldCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkcjsKICNpZiBkZWZpbmVkKFBZT1NfT1MyKQogCQkqbGVuX3JldCA9IHNpemVvZigqYWRkcik7CkBAIC0yMjA3LDE4ICsyMjMzLDIwIEBACiAJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogCW1lbXNldCgmYWRkcmJ1ZiwgMCwgYWRkcmxlbik7CiAJdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAwKTsKLQlpZiAoIXRpbWVvdXQpCi0JCW4gPSByZWN2ZnJvbShzLT5zb2NrX2ZkLCBQeVN0cmluZ19BU19TVFJJTkcoYnVmKSwgbGVuLCBmbGFncywKKwlpZiAoIXRpbWVvdXQpIHsKICNpZm5kZWYgTVNfV0lORE9XUwogI2lmIGRlZmluZWQoUFlPU19PUzIpICYmICFkZWZpbmVkKFBZQ0NfR0NDKQotCQkJICAgICAoc3RydWN0IHNvY2thZGRyICopICZhZGRyYnVmLCAmYWRkcmxlbgorCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksIGxlbiwgZmxhZ3MsCisJCQkgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHJidWYsICZhZGRybGVuKTsKICNlbHNlCi0JCQkgICAgICh2b2lkICopICZhZGRyYnVmLCAmYWRkcmxlbgorCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksIGxlbiwgZmxhZ3MsCisJCQkgICAgICh2b2lkICopICZhZGRyYnVmLCAmYWRkcmxlbik7CiAjZW5kaWYKICNlbHNlCi0JCQkgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHJidWYsICZhZGRybGVuCisJCW4gPSByZWN2ZnJvbShzLT5zb2NrX2ZkLCBQeVN0cmluZ19BU19TVFJJTkcoYnVmKSwgbGVuLCBmbGFncywKKwkJCSAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmJ1ZiwgJmFkZHJsZW4pOwogI2VuZGlmCi0JCQkpOworCX0KIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCiAJaWYgKHRpbWVvdXQpIHsKQEAgLTI1MDIsNiArMjUzMCwxNCBAQAogCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLwogfTsKIAorLyogU29ja09iamVjdCBtZW1iZXJzICovCitzdGF0aWMgUHlNZW1iZXJEZWYgc29ja19tZW1iZXJsaXN0W10gPSB7CisgICAgICAgeyJmYW1pbHkiLCBUX0lOVCwgb2Zmc2V0b2YoUHlTb2NrZXRTb2NrT2JqZWN0LCBzb2NrX2ZhbWlseSksIFJFQURPTkxZLCAidGhlIHNvY2tldCBmYW1pbHkifSwKKyAgICAgICB7InR5cGUiLCBUX0lOVCwgb2Zmc2V0b2YoUHlTb2NrZXRTb2NrT2JqZWN0LCBzb2NrX3R5cGUpLCBSRUFET05MWSwgInRoZSBzb2NrZXQgdHlwZSJ9LAorICAgICAgIHsicHJvdG8iLCBUX0lOVCwgb2Zmc2V0b2YoUHlTb2NrZXRTb2NrT2JqZWN0LCBzb2NrX3Byb3RvKSwgUkVBRE9OTFksICJ0aGUgc29ja2V0IHByb3RvY29sIn0sCisgICAgICAgeyJ0aW1lb3V0IiwgVF9ET1VCTEUsIG9mZnNldG9mKFB5U29ja2V0U29ja09iamVjdCwgc29ja190aW1lb3V0KSwgUkVBRE9OTFksICJ0aGUgc29ja2V0IHRpbWVvdXQifSwKKyAgICAgICB7MH0sCit9OwogCiAvKiBEZWFsbG9jYXRlIGEgc29ja2V0IG9iamVjdCBpbiByZXNwb25zZSB0byB0aGUgbGFzdCBQeV9ERUNSRUYoKS4KICAgIEZpcnN0IGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0aW9uLiAqLwpAQCAtMjYyNSw3ICsyNjYxLDcgQEAKIAkwLAkJCQkJLyogdHBfaXRlciAqLwogCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwogCXNvY2tfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCisJc29ja19tZW1iZXJsaXN0LAkJCS8qIHRwX21lbWJlcnMgKi8KIAkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCiAJMCwJCQkJCS8qIHRwX2Jhc2UgKi8KIAkwLAkJCQkJLyogdHBfZGljdCAqLwpAQCAtMzE1OSw3ICszMTk1LDggQEAKIFB5RG9jX1NUUlZBUihmcm9tZmRfZG9jLAogImZyb21mZChmZCwgZmFtaWx5LCB0eXBlWywgcHJvdG9dKSAtPiBzb2NrZXQgb2JqZWN0XG5cCiBcblwKLUNyZWF0ZSBhIHNvY2tldCBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLlxuXAorQ3JlYXRlIGEgc29ja2V0IG9iamVjdCBmcm9tIGEgZHVwbGljYXRlIG9mIHRoZSBnaXZlblxuXAorZmlsZSBkZXNjcmlwdG9yLlxuXAogVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciBzb2NrZXQoKS4iKTsKIAogI2VuZGlmIC8qIE5PX0RVUCAqLwpAQCAtNDAyNiw3ICs0MDYzLDEyIEBACiAJLyogICovCiAJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX05FVExJTksiLCBBRl9ORVRMSU5LKTsKIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19ST1VURSIsIE5FVExJTktfUk9VVEUpOworI2lmZGVmIE5FVExJTktfU0tJUAogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1NLSVAiLCBORVRMSU5LX1NLSVApOworI2VuZGlmCisjaWZkZWYgTkVUTElOS19XMQorCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1cxIiwgTkVUTElOS19XMSk7CisjZW5kaWYKIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19VU0VSU09DSyIsIE5FVExJTktfVVNFUlNPQ0spOwogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX0ZJUkVXQUxMIiwgTkVUTElOS19GSVJFV0FMTCk7CiAjaWZkZWYgTkVUTElOS19UQ1BESUFHCkBAIC00MDM4LDEyICs0MDgwLDE4IEBACiAjaWZkZWYgTkVUTElOS19YRlJNCiAJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfWEZSTSIsIE5FVExJTktfWEZSTSk7CiAjZW5kaWYKKyNpZmRlZiBORVRMSU5LX0FSUEQKIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19BUlBEIiwgTkVUTElOS19BUlBEKTsKKyNlbmRpZgorI2lmZGVmIE5FVExJTktfUk9VVEU2CiAJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfUk9VVEU2IiwgTkVUTElOS19ST1VURTYpOworI2VuZGlmCiAJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfSVA2X0ZXIiwgTkVUTElOS19JUDZfRlcpOwogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX0ROUlRNU0ciLCBORVRMSU5LX0ROUlRNU0cpOworI2lmZGVmIE5FVExJTktfVEFQQkFTRQogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1RBUEJBU0UiLCBORVRMSU5LX1RBUEJBU0UpOwogI2VuZGlmCisjZW5kaWYgLyogQUZfTkVUTElOSyAqLwogI2lmZGVmIEFGX1JPVVRFCiAJLyogQWxpYXMgdG8gZW11bGF0ZSA0LjRCU0QgKi8KIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfUk9VVEUiLCBBRl9ST1VURSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYyBiL01vZHVsZXMvc3B3ZG1vZHVsZS5jCmluZGV4IDdjNjE4ZTcuLmI3YmYyMGUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3B3ZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc3B3ZG1vZHVsZS5jCkBAIC01Miw2ICs1Miw3IEBACiAJOSwKIH07CiAKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CiBzdGF0aWMgUHlUeXBlT2JqZWN0IFN0cnVjdFNwd2RUeXBlOwogCiAKQEAgLTE3Myw3ICsxNzQsMTAgQEAKIAltPVB5X0luaXRNb2R1bGUzKCJzcHdkIiwgc3B3ZF9tZXRob2RzLCBzcHdkX19kb2NfXyk7CiAJaWYgKG0gPT0gTlVMTCkKIAkJcmV0dXJuOwotCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFNwd2RUeXBlLCAmc3RydWN0X3Nwd2RfdHlwZV9kZXNjKTsKKwlpZiAoIWluaXRpYWxpemVkKQorCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RTcHdkVHlwZSwgCisJCQkJCSAgJnN0cnVjdF9zcHdkX3R5cGVfZGVzYyk7CiAJUHlfSU5DUkVGKChQeU9iamVjdCAqKSAmU3RydWN0U3B3ZFR5cGUpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3Nwd2QiLCAoUHlPYmplY3QgKikgJlN0cnVjdFNwd2RUeXBlKTsKKwlpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3N0cm9wbW9kdWxlLmMgYi9Nb2R1bGVzL3N0cm9wbW9kdWxlLmMKaW5kZXggY2ZmZWYzYS4uOGIwMGZlZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zdHJvcG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc3Ryb3Btb2R1bGUuYwpAQCAtMzMzLDcgKzMzMyw3IEBACiB7CiAJY2hhciAqcywgKnN1YjsKIAlQeV9zc2l6ZV90IGxlbiwgbiwgajsKLQlQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gSU5UX01BWDsKKwlQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gUFlfU1NJWkVfVF9NQVg7CiAKIAlXQVJOOwogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0I3xubjpyZmluZCIsICZzLCAmbGVuLCAmc3ViLCAmbiwgJmksICZsYXN0KSkKQEAgLTQ0NiwxNiArNDQ2LDE2IEBACiB7CiAJY2hhciAqcywgKnNfbmV3OwogCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqbmV3OworCVB5T2JqZWN0ICpuZXdzdHI7CiAJaW50IGNoYW5nZWQ7CiAKIAlXQVJOOwogCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZuKSkKIAkJcmV0dXJuIE5VTEw7Ci0JbmV3ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ldyA9PSBOVUxMKQorCW5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOworCWlmIChuZXdzdHIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXcpOworCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3c3RyKTsKIAljaGFuZ2VkID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAJCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CkBAIC00NjcsMTEgKzQ2NywxMSBAQAogCQlzX25ldysrOwogCX0KIAlpZiAoIWNoYW5nZWQpIHsKLQkJUHlfREVDUkVGKG5ldyk7CisJCVB5X0RFQ1JFRihuZXdzdHIpOwogCQlQeV9JTkNSRUYoYXJncyk7CiAJCXJldHVybiBhcmdzOwogCX0KLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdzdHI7CiB9CiAKIApAQCAtNDg1LDE2ICs0ODUsMTYgQEAKIHsKIAljaGFyICpzLCAqc19uZXc7CiAJUHlfc3NpemVfdCBpLCBuOwotCVB5T2JqZWN0ICpuZXc7CisJUHlPYmplY3QgKm5ld3N0cjsKIAlpbnQgY2hhbmdlZDsKIAogCVdBUk47CiAJaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJm4pKQogCQlyZXR1cm4gTlVMTDsKLQluZXcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3ID09IE5VTEwpCisJbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisJaWYgKG5ld3N0ciA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ldyk7CisJc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdzdHIpOwogCWNoYW5nZWQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKIAkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKQEAgLTUwNiwxMSArNTA2LDExIEBACiAJCXNfbmV3Kys7CiAJfQogCWlmICghY2hhbmdlZCkgewotCQlQeV9ERUNSRUYobmV3KTsKKwkJUHlfREVDUkVGKG5ld3N0cik7CiAJCVB5X0lOQ1JFRihhcmdzKTsKIAkJcmV0dXJuIGFyZ3M7CiAJfQotCXJldHVybiBuZXc7CisJcmV0dXJuIG5ld3N0cjsKIH0KIAogCkBAIC01MjUsMTYgKzUyNSwxNiBAQAogewogCWNoYXIgKnMsICpzX25ldzsKIAlQeV9zc2l6ZV90IGksIG47Ci0JUHlPYmplY3QgKm5ldzsKKwlQeU9iamVjdCAqbmV3c3RyOwogCWludCBjaGFuZ2VkOwogCiAJV0FSTjsKIAlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZ3MsICZzLCAmbikpCiAJCXJldHVybiBOVUxMOwotCW5ldyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXcgPT0gTlVMTCkKKwluZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKwlpZiAobmV3c3RyID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3KTsKKwlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld3N0cik7CiAJY2hhbmdlZCA9IDA7CiAJaWYgKDAgPCBuKSB7CiAJCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CkBAIC01NTUsMTEgKzU1NSwxMSBAQAogCQlzX25ldysrOwogCX0KIAlpZiAoIWNoYW5nZWQpIHsKLQkJUHlfREVDUkVGKG5ldyk7CisJCVB5X0RFQ1JFRihuZXdzdHIpOwogCQlQeV9JTkNSRUYoYXJncyk7CiAJCXJldHVybiBhcmdzOwogCX0KLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdzdHI7CiB9CiAKIApAQCAtNjQ3LDcgKzY0Nyw3IEBACiB7CiAJY2hhciAqcywgKnN1YjsKIAlQeV9zc2l6ZV90IGxlbiwgbjsKLQlQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gSU5UX01BWDsKKwlQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gUFlfU1NJWkVfVF9NQVg7CiAJUHlfc3NpemVfdCBtLCByOwogCiAJV0FSTjsKQEAgLTY5MSwxNiArNjkxLDE2IEBACiB7CiAJY2hhciAqcywgKnNfbmV3OwogCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqbmV3OworCVB5T2JqZWN0ICpuZXdzdHI7CiAJaW50IGNoYW5nZWQ7CiAKIAlXQVJOOwogCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZuKSkKIAkJcmV0dXJuIE5VTEw7Ci0JbmV3ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ldyA9PSBOVUxMKQorCW5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOworCWlmIChuZXdzdHIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXcpOworCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3c3RyKTsKIAljaGFuZ2VkID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAJCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CkBAIC03MTcsMTEgKzcxNywxMSBAQAogCQlzX25ldysrOwogCX0KIAlpZiAoIWNoYW5nZWQpIHsKLQkJUHlfREVDUkVGKG5ldyk7CisJCVB5X0RFQ1JFRihuZXdzdHIpOwogCQlQeV9JTkNSRUYoYXJncyk7CiAJCXJldHVybiBhcmdzOwogCX0KLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdzdHI7CiB9CiAKIApAQCAtOTQyLDcgKzk0Miw3IEBACiAJfQogCiAJdGFibGUgPSB0YWJsZTE7Ci0JaW5sZW4gPSBQeVN0cmluZ19TaXplKGlucHV0X29iaik7CisJaW5sZW4gPSBQeVN0cmluZ19HRVRfU0laRShpbnB1dF9vYmopOwogCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgaW5sZW4pOwogCWlmIChyZXN1bHQgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMDc4LDcgKzEwNzgsNyBAQAogCS8qIGZpbmQgbGVuZ3RoIG9mIG91dHB1dCBzdHJpbmcgKi8KIAluZm91bmQgPSBteW1lbWNudChzdHIsIGxlbiwgcGF0LCBwYXRfbGVuKTsKIAlpZiAoY291bnQgPCAwKQotCQljb3VudCA9IElOVF9NQVg7CisJCWNvdW50ID0gUFlfU1NJWkVfVF9NQVg7CiAJZWxzZSBpZiAobmZvdW5kID4gY291bnQpCiAJCW5mb3VuZCA9IGNvdW50OwogCWlmIChuZm91bmQgPT0gMCkKQEAgLTExNDEsNyArMTE0MSw3IEBACiAJY2hhciAqc3RyLCAqcGF0LCpzdWIsKm5ld19zOwogCVB5X3NzaXplX3QgbGVuLHBhdF9sZW4sc3ViX2xlbixvdXRfbGVuOwogCVB5X3NzaXplX3QgY291bnQgPSAtMTsKLQlQeU9iamVjdCAqbmV3OworCVB5T2JqZWN0ICpuZXdzdHI7CiAKIAlXQVJOOwogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0I3QjfG46cmVwbGFjZSIsCkBAIC0xMTY1LDE0ICsxMTY1LDE0IEBACiAJfQogCWlmIChvdXRfbGVuID09IC0xKSB7CiAJCS8qIHdlJ3JlIHJldHVybmluZyBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgaW5wdXQgc3RyaW5nICovCi0JCW5ldyA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKLQkJUHlfWElOQ1JFRihuZXcpOworCQluZXdzdHIgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisJCVB5X1hJTkNSRUYobmV3c3RyKTsKIAl9CiAJZWxzZSB7Ci0JCW5ldyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG5ld19zLCBvdXRfbGVuKTsKKwkJbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUobmV3X3MsIG91dF9sZW4pOwogCQlQeU1lbV9GUkVFKG5ld19zKTsKIAl9Ci0JcmV0dXJuIG5ldzsKKwlyZXR1cm4gbmV3c3RyOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMgYi9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jCmluZGV4IDlhNmM1ZDguLjgzMzEzZGYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMKKysrIGIvTW9kdWxlcy90aHJlYWRtb2R1bGUuYwpAQCAtMjIsMjQgKzIyLDYgQEAKIAlQeVRocmVhZF90eXBlX2xvY2sgbG9ja19sb2NrOwogfSBsb2Nrb2JqZWN0OwogCi1zdGF0aWMgUHlUeXBlT2JqZWN0IExvY2t0eXBlOwotCi1zdGF0aWMgbG9ja29iamVjdCAqCi1uZXdsb2Nrb2JqZWN0KHZvaWQpCi17Ci0JbG9ja29iamVjdCAqc2VsZjsKLQlzZWxmID0gUHlPYmplY3RfTmV3KGxvY2tvYmplY3QsICZMb2NrdHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+bG9ja19sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmIChzZWxmLT5sb2NrX2xvY2sgPT0gTlVMTCkgewotCQlQeU9iamVjdF9EZWwoc2VsZik7Ci0JCXNlbGYgPSBOVUxMOwotCQlQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsICJjYW4ndCBhbGxvY2F0ZSBsb2NrIik7Ci0JfQotCXJldHVybiBzZWxmOwotfQotCiBzdGF0aWMgdm9pZAogbG9ja19kZWFsbG9jKGxvY2tvYmplY3QgKnNlbGYpCiB7CkBAIC0xNjYsNiArMTQ4LDIyIEBACiAJMCwJCQkJLyp0cF9yZXByKi8KIH07CiAKK3N0YXRpYyBsb2Nrb2JqZWN0ICoKK25ld2xvY2tvYmplY3Qodm9pZCkKK3sKKwlsb2Nrb2JqZWN0ICpzZWxmOworCXNlbGYgPSBQeU9iamVjdF9OZXcobG9ja29iamVjdCwgJkxvY2t0eXBlKTsKKwlpZiAoc2VsZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlzZWxmLT5sb2NrX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisJaWYgKHNlbGYtPmxvY2tfbG9jayA9PSBOVUxMKSB7CisJCVB5T2JqZWN0X0RlbChzZWxmKTsKKwkJc2VsZiA9IE5VTEw7CisJCVB5RXJyX1NldFN0cmluZyhUaHJlYWRFcnJvciwgImNhbid0IGFsbG9jYXRlIGxvY2siKTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKIC8qIFRocmVhZC1sb2NhbCBvYmplY3RzICovCiAKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKQEAgLTE3OCw4ICsxNzYsNiBAQAogCVB5T2JqZWN0ICpkaWN0OwogfSBsb2NhbG9iamVjdDsKIAotc3RhdGljIFB5VHlwZU9iamVjdCBsb2NhbHR5cGU7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBsb2NhbF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewpAQCAtMzE1LDI5ICszMTEsNiBAQAogCXJldHVybiBsZGljdDsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICoKLWxvY2FsX2dldGF0dHJvKGxvY2Fsb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbmFtZSkKLXsKLQlQeU9iamVjdCAqbGRpY3QsICp2YWx1ZTsKLQotCWxkaWN0ID0gX2xkaWN0KHNlbGYpOwotCWlmIChsZGljdCA9PSBOVUxMKSAKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoc2VsZi0+b2JfdHlwZSAhPSAmbG9jYWx0eXBlKQotCQkvKiB1c2UgZ2VuZXJpYyBsb29rdXAgZm9yIHN1YnR5cGVzICovCi0JCXJldHVybiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cigoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKLQotCS8qIE9wdGltaXphdGlvbjoganVzdCBsb29rIGluIGRpY3Qgb3Vyc2VsdmVzICovCi0JdmFsdWUgPSBQeURpY3RfR2V0SXRlbShsZGljdCwgbmFtZSk7Ci0JaWYgKHZhbHVlID09IE5VTEwpIAotCQkvKiBGYWxsIGJhY2sgb24gZ2VuZXJpYyB0byBnZXQgX19jbGFzc19fIGFuZCBfX2RpY3RfXyAqLwotCQlyZXR1cm4gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7Ci0KLQlQeV9JTkNSRUYodmFsdWUpOwotCXJldHVybiB2YWx1ZTsKLX0KLQogc3RhdGljIGludAogbG9jYWxfc2V0YXR0cm8obG9jYWxvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqdikKIHsKQEAgLTM2OCw2ICszNDEsOCBAQAogCXtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKK3N0YXRpYyBQeU9iamVjdCAqbG9jYWxfZ2V0YXR0cm8obG9jYWxvYmplY3QgKiwgUHlPYmplY3QgKik7CisKIHN0YXRpYyBQeVR5cGVPYmplY3QgbG9jYWx0eXBlID0gewogCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQogCS8qIG9iX3NpemUgICAgICAgICAgICovIDAsCkBAIC0zNzUsMTcgKzM1MCwxNyBAQAogCS8qIHRwX2Jhc2ljc2l6ZSAgICAgICovIHNpemVvZihsb2NhbG9iamVjdCksCiAJLyogdHBfaXRlbXNpemUgICAgICAgKi8gMCwKIAkvKiB0cF9kZWFsbG9jICAgICAgICAqLyAoZGVzdHJ1Y3Rvcilsb2NhbF9kZWFsbG9jLAotCS8qIHRwX3ByaW50ICAgICAgICAgICovIChwcmludGZ1bmMpMCwKLQkvKiB0cF9nZXRhdHRyICAgICAgICAqLyAoZ2V0YXR0cmZ1bmMpMCwKLQkvKiB0cF9zZXRhdHRyICAgICAgICAqLyAoc2V0YXR0cmZ1bmMpMCwKLQkvKiB0cF9jb21wYXJlICAgICAgICAqLyAoY21wZnVuYykwLAotCS8qIHRwX3JlcHIgICAgICAgICAgICovIChyZXByZnVuYykwLAorCS8qIHRwX3ByaW50ICAgICAgICAgICovIDAsCisJLyogdHBfZ2V0YXR0ciAgICAgICAgKi8gMCwKKwkvKiB0cF9zZXRhdHRyICAgICAgICAqLyAwLAorCS8qIHRwX2NvbXBhcmUgICAgICAgICovIDAsCisJLyogdHBfcmVwciAgICAgICAgICAgKi8gMCwKIAkvKiB0cF9hc19udW1iZXIgICAgICAqLyAwLAogCS8qIHRwX2FzX3NlcXVlbmNlICAgICovIDAsCiAJLyogdHBfYXNfbWFwcGluZyAgICAgKi8gMCwKLQkvKiB0cF9oYXNoICAgICAgICAgICAqLyAoaGFzaGZ1bmMpMCwKLQkvKiB0cF9jYWxsICAgICAgICAgICAqLyAodGVybmFyeWZ1bmMpMCwKLQkvKiB0cF9zdHIgICAgICAgICAgICAqLyAocmVwcmZ1bmMpMCwKKwkvKiB0cF9oYXNoICAgICAgICAgICAqLyAwLAorCS8qIHRwX2NhbGwgICAgICAgICAgICovIDAsCisJLyogdHBfc3RyICAgICAgICAgICAgKi8gMCwKIAkvKiB0cF9nZXRhdHRybyAgICAgICAqLyAoZ2V0YXR0cm9mdW5jKWxvY2FsX2dldGF0dHJvLAogCS8qIHRwX3NldGF0dHJvICAgICAgICovIChzZXRhdHRyb2Z1bmMpbG9jYWxfc2V0YXR0cm8sCiAJLyogdHBfYXNfYnVmZmVyICAgICAgKi8gMCwKQEAgLTM5MywyNSArMzY4LDQ3IEBACiAJLyogdHBfZG9jICAgICAgICAgICAgKi8gIlRocmVhZC1sb2NhbCBkYXRhIiwKIAkvKiB0cF90cmF2ZXJzZSAgICAgICAqLyAodHJhdmVyc2Vwcm9jKWxvY2FsX3RyYXZlcnNlLAogCS8qIHRwX2NsZWFyICAgICAgICAgICovIChpbnF1aXJ5KWxvY2FsX2NsZWFyLAotCS8qIHRwX3JpY2hjb21wYXJlICAgICovIChyaWNoY21wZnVuYykwLAotCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovIChsb25nKTAsCi0JLyogdHBfaXRlciAgICAgICAgICAgKi8gKGdldGl0ZXJmdW5jKTAsCi0JLyogdHBfaXRlcm5leHQgICAgICAgKi8gKGl0ZXJuZXh0ZnVuYykwLAorCS8qIHRwX3JpY2hjb21wYXJlICAgICovIDAsCisJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8gMCwKKwkvKiB0cF9pdGVyICAgICAgICAgICAqLyAwLAorCS8qIHRwX2l0ZXJuZXh0ICAgICAgICovIDAsCiAJLyogdHBfbWV0aG9kcyAgICAgICAgKi8gMCwKIAkvKiB0cF9tZW1iZXJzICAgICAgICAqLyAwLAogCS8qIHRwX2dldHNldCAgICAgICAgICovIGxvY2FsX2dldHNldCwKIAkvKiB0cF9iYXNlICAgICAgICAgICAqLyAwLAogCS8qIHRwX2RpY3QgICAgICAgICAgICovIDAsIC8qIGludGVybmFsIHVzZSAqLwotCS8qIHRwX2Rlc2NyX2dldCAgICAgICovIChkZXNjcmdldGZ1bmMpMCwKLQkvKiB0cF9kZXNjcl9zZXQgICAgICAqLyAoZGVzY3JzZXRmdW5jKTAsCisJLyogdHBfZGVzY3JfZ2V0ICAgICAgKi8gMCwKKwkvKiB0cF9kZXNjcl9zZXQgICAgICAqLyAwLAogCS8qIHRwX2RpY3RvZmZzZXQgICAgICovIG9mZnNldG9mKGxvY2Fsb2JqZWN0LCBkaWN0KSwKLQkvKiB0cF9pbml0ICAgICAgICAgICAqLyAoaW5pdHByb2MpMCwKLQkvKiB0cF9hbGxvYyAgICAgICAgICAqLyAoYWxsb2NmdW5jKTAsCi0JLyogdHBfbmV3ICAgICAgICAgICAgKi8gKG5ld2Z1bmMpbG9jYWxfbmV3LAorCS8qIHRwX2luaXQgICAgICAgICAgICovIDAsCisJLyogdHBfYWxsb2MgICAgICAgICAgKi8gMCwKKwkvKiB0cF9uZXcgICAgICAgICAgICAqLyBsb2NhbF9uZXcsCiAJLyogdHBfZnJlZSAgICAgICAgICAgKi8gMCwgLyogTG93LWxldmVsIGZyZWUtbWVtIHJvdXRpbmUgKi8KLQkvKiB0cF9pc19nYyAgICAgICAgICAqLyAoaW5xdWlyeSkwLCAvKiBGb3IgUHlPYmplY3RfSVNfR0MgKi8KKwkvKiB0cF9pc19nYyAgICAgICAgICAqLyAwLCAvKiBGb3IgUHlPYmplY3RfSVNfR0MgKi8KIH07CiAKK3N0YXRpYyBQeU9iamVjdCAqCitsb2NhbF9nZXRhdHRybyhsb2NhbG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5hbWUpCit7CisJUHlPYmplY3QgKmxkaWN0LCAqdmFsdWU7CisKKwlsZGljdCA9IF9sZGljdChzZWxmKTsKKwlpZiAobGRpY3QgPT0gTlVMTCkgCisJCXJldHVybiBOVUxMOworCisJaWYgKHNlbGYtPm9iX3R5cGUgIT0gJmxvY2FsdHlwZSkKKwkJLyogdXNlIGdlbmVyaWMgbG9va3VwIGZvciBzdWJ0eXBlcyAqLworCQlyZXR1cm4gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisKKwkvKiBPcHRpbWl6YXRpb246IGp1c3QgbG9vayBpbiBkaWN0IG91cnNlbHZlcyAqLworCXZhbHVlID0gUHlEaWN0X0dldEl0ZW0obGRpY3QsIG5hbWUpOworCWlmICh2YWx1ZSA9PSBOVUxMKSAKKwkJLyogRmFsbCBiYWNrIG9uIGdlbmVyaWMgdG8gZ2V0IF9fY2xhc3NfXyBhbmQgX19kaWN0X18gKi8KKwkJcmV0dXJuIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworCisJUHlfSU5DUkVGKHZhbHVlKTsKKwlyZXR1cm4gdmFsdWU7Cit9CiAKIC8qIE1vZHVsZSBmdW5jdGlvbnMgKi8KIApAQCAtNTYwLDYgKzU1Nyw4IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGxvY2tvYmplY3QgKm5ld2xvY2tvYmplY3Qodm9pZCk7CisKIHN0YXRpYyBQeU9iamVjdCAqCiB0aHJlYWRfUHlUaHJlYWRfYWxsb2NhdGVfbG9jayhQeU9iamVjdCAqc2VsZikKIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvdGltZW1vZHVsZS5jIGIvTW9kdWxlcy90aW1lbW9kdWxlLmMKaW5kZXggYmE5Mzk1Ny4uMDhkMjhhMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy90aW1lbW9kdWxlLmMKKysrIGIvTW9kdWxlcy90aW1lbW9kdWxlLmMKQEAgLTIyOCw2ICsyMjgsNyBAQAogCTksCiB9OwogCitzdGF0aWMgaW50IGluaXRpYWxpemVkOwogc3RhdGljIFB5VHlwZU9iamVjdCBTdHJ1Y3RUaW1lVHlwZTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTQ0Myw3ICs0NDQsNyBAQAogCSAqIHdpbGwgYmUgYWhlYWQgb2YgdGltZS4uLgogCSAqLwogCWZvciAoaSA9IDEwMjQ7IDsgaSArPSBpKSB7Ci0JCW91dGJ1ZiA9IG1hbGxvYyhpKTsKKwkJb3V0YnVmID0gKGNoYXIgKiltYWxsb2MoaSk7CiAJCWlmIChvdXRidWYgPT0gTlVMTCkgewogCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAJCX0KQEAgLTgwNyw5ICs4MDgsMTMgQEAKIAloSW50ZXJydXB0RXZlbnQgPSBDcmVhdGVFdmVudChOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7CiAJU2V0Q29uc29sZUN0cmxIYW5kbGVyKCBQeUN0cmxIYW5kbGVyLCBUUlVFKTsKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCi0gICAgICAgIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFRpbWVUeXBlLCAmc3RydWN0X3RpbWVfdHlwZV9kZXNjKTsKKwlpZiAoIWluaXRpYWxpemVkKSB7CisJCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFRpbWVUeXBlLCAKKwkJCQkJICAmc3RydWN0X3RpbWVfdHlwZV9kZXNjKTsKKwl9CiAJUHlfSU5DUkVGKCZTdHJ1Y3RUaW1lVHlwZSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfdGltZSIsIChQeU9iamVjdCopICZTdHJ1Y3RUaW1lVHlwZSk7CisJaW5pdGlhbGl6ZWQgPSAxOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvdW5pY29kZWRhdGEuYyBiL01vZHVsZXMvdW5pY29kZWRhdGEuYwppbmRleCA5ZWRhNjUzLi4yOTc2MTFjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKKysrIGIvTW9kdWxlcy91bmljb2RlZGF0YS5jCkBAIC00NDYsNyArNDQ2LDcgQEAKICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkZWNvbXApOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogZ2V0X2RlY29tcF9yZWNvcmQoUHlPYmplY3QgKnNlbGYsIFB5X1VDUzQgY29kZSwgaW50ICppbmRleCwgaW50ICpwcmVmaXgsIGludCAqY291bnQpCiB7CiAgICAgaWYgKGNvZGUgPj0gMHgxMTAwMDApIHsKQEAgLTQ4Niw4ICs0ODYsOCBAQAogICAgIFB5X1VOSUNPREUgKmksICplbmQsICpvOwogICAgIC8qIExvbmdlc3QgZGVjb21wb3NpdGlvbiBpbiBVbmljb2RlIDMuMjogVStGREZBICovCiAgICAgUHlfVU5JQ09ERSBzdGFja1syMF07IAotICAgIGludCBzcGFjZSwgc3RhY2twdHIsIGlzaXplOwotICAgIGludCBpbmRleCwgcHJlZml4LCBjb3VudDsKKyAgICBQeV9zc2l6ZV90IHNwYWNlLCBpc2l6ZTsKKyAgICBpbnQgaW5kZXgsIHByZWZpeCwgY291bnQsIHN0YWNrcHRyOwogICAgIHVuc2lnbmVkIGNoYXIgcHJldiwgY3VyOwogCQogICAgIHN0YWNrcHRyID0gMDsKQEAgLTUwOCw3ICs1MDgsNyBAQAogICAgICAgICAgICAgLyogSGFuZ3VsIERlY29tcG9zaXRpb24gYWRkcyB0aHJlZSBjaGFyYWN0ZXJzIGluCiAgICAgICAgICAgICAgICBhIHNpbmdsZSBzdGVwLCBzbyB3ZSBuZWVkIGF0bGVhc3QgdGhhdCBtdWNoIHJvb20uICovCiAgICAgICAgICAgICBpZiAoc3BhY2UgPCAzKSB7Ci0gICAgICAgICAgICAgICAgaW50IG5ld3NpemUgPSBQeVN0cmluZ19HRVRfU0laRShyZXN1bHQpICsgMTA7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuZXdzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUocmVzdWx0KSArIDEwOwogICAgICAgICAgICAgICAgIHNwYWNlICs9IDEwOwogICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUmVzaXplKCZyZXN1bHQsIG5ld3NpemUpID09IC0xKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTc1OSw3ICs3NTksNyBAQAogICAgIHVuc2lnbmVkIGxvbmcgaCA9IDA7CiAgICAgdW5zaWduZWQgbG9uZyBpeDsKICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgaCA9IChoICogc2NhbGUpICsgKHVuc2lnbmVkIGNoYXIpIHRvdXBwZXIoc1tpXSk7CisgICAgICAgIGggPSAoaCAqIHNjYWxlKSArICh1bnNpZ25lZCBjaGFyKSB0b3VwcGVyKFB5X0NIQVJNQVNLKHNbaV0pKTsKICAgICAgICAgaXggPSBoICYgMHhmZjAwMDAwMDsKICAgICAgICAgaWYgKGl4KQogICAgICAgICAgICAgaCA9IChoIF4gKChpeD4+MjQpICYgMHhmZikpICYgMHgwMGZmZmZmZjsKQEAgLTkwNiw3ICs5MDYsNyBAQAogICAgIGlmICghX2dldHVjbmFtZShzZWxmLCBjb2RlLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgZm9yIChpID0gMDsgaSA8IG5hbWVsZW47IGkrKykgewotICAgICAgICBpZiAodG91cHBlcihuYW1lW2ldKSAhPSBidWZmZXJbaV0pCisgICAgICAgIGlmICh0b3VwcGVyKFB5X0NIQVJNQVNLKG5hbWVbaV0pKSAhPSBidWZmZXJbaV0pCiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dXJuIGJ1ZmZlcltuYW1lbGVuXSA9PSAnXDAnOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy94eHN1YnR5cGUuYyBiL01vZHVsZXMveHhzdWJ0eXBlLmMKaW5kZXggZmZiYzcyYi4uODhjZTZjNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy94eHN1YnR5cGUuYworKysgYi9Nb2R1bGVzL3h4c3VidHlwZS5jCkBAIC03OSw4ICs3OSw2IEBACiAJe05VTEwsCU5VTEx9LAogfTsKIAotc3RhdGljIFB5VHlwZU9iamVjdCBzcGFtbGlzdF90eXBlOwotCiBzdGF0aWMgaW50CiBzcGFtbGlzdF9pbml0KHNwYW1saXN0b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CkBAIC0xNzksOCArMTc3LDYgQEAKIAl7TlVMTCwJTlVMTH0sCiB9OwogCi1zdGF0aWMgUHlUeXBlT2JqZWN0IHNwYW1kaWN0X3R5cGU7Ci0KIHN0YXRpYyBpbnQKIHNwYW1kaWN0X2luaXQoc3BhbWRpY3RvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvemlwaW1wb3J0LmMgYi9Nb2R1bGVzL3ppcGltcG9ydC5jCmluZGV4IDYzN2RjNDguLmQ1OWViZDggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemlwaW1wb3J0LmMKKysrIGIvTW9kdWxlcy96aXBpbXBvcnQuYwpAQCAtNDAsNyArNDAsNiBAQAogCVB5T2JqZWN0ICpmaWxlczsgICAgLyogZGljdCB3aXRoIGZpbGUgaW5mbyB7cGF0aDogdG9jX2VudHJ5fSAqLwogfTsKIAotc3RhdGljIFB5VHlwZU9iamVjdCBaaXBJbXBvcnRlcl9UeXBlOwogc3RhdGljIFB5T2JqZWN0ICpaaXBJbXBvcnRFcnJvcjsKIHN0YXRpYyBQeU9iamVjdCAqemlwX2RpcmVjdG9yeV9jYWNoZSA9IE5VTEw7CiAKQEAgLTE3MSwxMyArMTcwLDcgQEAKIHppcGltcG9ydGVyX3RyYXZlcnNlKFB5T2JqZWN0ICpvYmosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewogCVppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOwotCWludCBlcnI7Ci0KLQlpZiAoc2VsZi0+ZmlsZXMgIT0gTlVMTCkgewotCQllcnIgPSB2aXNpdChzZWxmLT5maWxlcywgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQorCVB5X1ZJU0lUKHNlbGYtPmZpbGVzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTU4LDcgKzk1MSw3IEBACiAJUHlPYmplY3QgKmZpeGVkX3NvdXJjZTsKIAogCS8qIG9uZSBjaGFyIGV4dHJhIGZvciB0cmFpbGluZyBcbiBhbmQgb25lIGZvciB0ZXJtaW5hdGluZyBcMCAqLwotCWJ1ZiA9IFB5TWVtX01hbGxvYyhQeVN0cmluZ19TaXplKHNvdXJjZSkgKyAyKTsKKwlidWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhQeVN0cmluZ19TaXplKHNvdXJjZSkgKyAyKTsKIAlpZiAoYnVmID09IE5VTEwpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAogCQkJCSJ6aXBpbXBvcnQ6IG5vIG1lbW9yeSB0byBhbGxvY2F0ZSAiCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWJtb2R1bGUuYyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCmluZGV4IDcyNTc1NWQuLjM1YjhjMzIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYm1vZHVsZS5jCisrKyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCkBAIC02NTQsNyArNjU0LDkgQEAKIH0KIAogUHlEb2NfU1RSVkFSKGRlY29tcF9mbHVzaF9fZG9jX18sCi0iZmx1c2goKSAtLSBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbnkgcmVtYWluaW5nIGRlY29tcHJlc3NlZCBkYXRhLlxuIgorImZsdXNoKCBbbGVuZ3RoXSApIC0tIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFueSByZW1haW5pbmdcbiIKKyJkZWNvbXByZXNzZWQgZGF0YS4gbGVuZ3RoLCBpZiBnaXZlbiwgaXMgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGVcbiIKKyJvdXRwdXQgYnVmZmVyLlxuIgogIlxuIgogIlRoZSBkZWNvbXByZXNzb3Igb2JqZWN0IGNhbiBubyBsb25nZXIgYmUgdXNlZCBhZnRlciB0aGlzIGNhbGwuIik7CiAK