ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGRmM2YyMzQuLmIxMGU5MTkgMTAwNzU1Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMywxMCArMyw4IEBACiAjIHN1YmRpcmVjdG9yaWVzIGhlcmUuIEFkZCB0aGVtIGluIHRoZSAiLmdpdGlnbm9yZSIgZmlsZQogIyBpbiB0aGF0IHN1YmRpcmVjdG9yeSBpbnN0ZWFkLgogIwotIyBOb3JtYWwgcnVsZXMKKyMgCU5vcm1hbCBydWxlcwogIwotb21yaS5wbAotY29tcmkucGwKIC5naXRpZ25vcmUKICoucmVqCiAqLm9yaWcKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggNGQ0MTJkNy4uMDdkZWJjNCAxMDA3NTUKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTE3OCw3ICsxNzgsNyBAQAogCiAjIGxvYWQgQVJDSCwgQk9BUkQsIGFuZCBDUFUgY29uZmlndXJhdGlvbgogaW5jbHVkZSAkKG9iailpbmNsdWRlL2NvbmZpZy5tawotZXhwb3J0CUFSQ0ggQ1BVIEJPQVJEIFZFTkRPUiBTT0MgRERSM0xJQiBERFJUWVBFCitleHBvcnQJQVJDSCBDUFUgQk9BUkQgVkVORE9SIFNPQyBERFIzTElCIEREUlRZUEUgRERSNFNVQkxJQgogCiAjIHNldCBkZWZhdWx0IHRvIG5vdGhpbmcgZm9yIG5hdGl2ZSBidWlsZHMKIGlmZXEgKCQoSE9TVEFSQ0gpLCQoQVJDSCkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvYm9vdG0uYyBiL2FyY2gvYXJtL2xpYi9ib290bS5jCmluZGV4IDVmZjc3MTkuLmMwYTgxZTMgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL2xpYi9ib290bS5jCisrKyBiL2FyY2gvYXJtL2xpYi9ib290bS5jCkBAIC05MSwxMyArOTEsMTQgQEAKIH0KIAogI2lmIGRlZmluZWQgKENPTkZJR19PRl9MSUJGRFQpIHx8IGRlZmluZWQgKE1WX0REUl9MMl9BTElHTk1FTlQpCi11NjQgbDJfYmFzZSA9IChfNEcgLSBfMUcpOwkvKiB1c2VkIGZvciBtZW1vcnkgbm9kZSB1cGRhdGUgaW4gRGV2aWNlIHRyZWUgb3IgZm9yIG1lbW9yeSB0YWdzICovCit1NjQgbDJfYmFzZSA9IChfNEcgLSBfMUcpOwkvKiB1c2VkIGZvciBtZW1vcnkgbm9kZSB1cGRhdGUgaW4gRGV2aWNlIHRyZWUsIG9yIGZvciBtZW1vcnkgdGFncyAqLwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfT0ZfTElCRkRUCiBleHRlcm4gdm9pZCBtdkNwdUlmTWJ1c1dpbmRvd1NldCh1MzIgYmFzZSwgdTMyIHNpemUpOwogaW50IGZpeHVwX21lbW9yeV9ub2RlKHZvaWQgKmJsb2IpCiB7CisJY2hhciAqZW52OwogI2lmbmRlZiBDT05GSUdfTUFSVkVMTAogCWJkX3QJKmJkID0gZ2QtPmJkOwogI2VuZGlmCkBAIC0xMDUsMjMgKzEwNiwzMCBAQAogCXU2NCBzdGFydFtDT05GSUdfTlJfRFJBTV9CQU5LU107CiAJdTY0IHNpemVbQ09ORklHX05SX0RSQU1fQkFOS1NdOwogCisJLyogLSBCaW5hcnkgaGVhZGVyIHByaW9yaXRpemUgSU8gbWVtb3J5IHNwYWNlIHZpYSBMMiBmaWx0ZXJpbmcgYXQgMy4wR0IsIGluIG9yZGVyCisJICogICB0byBlbnN1cmUgJ2hpdCcgb24gaW50ZXJuYWwgcmVnaXN0ZXJzIElPIGFjY2VzcyAobG9jYXRlZCBhdCAweGQwMDAwMDAwIGJ5IGRlZmF1bHQpCisJICogLSBBbHRob3VnaCBVLUJvb3QgdXBkYXRlcyBpbnRlcm5hbCByZWdpc3RlciBiYXNlIHRvIDB4ZjEwMDAwMDAgKDMuNzVHQiksIEFkZHJlc3MKKwkgKiAgIGRlY29kaW5nIHN1cHBvcnRzIG9ubHkgd2luZG93cyBzaXplIGFsaWduZWQgdG8gcG93ZXIgb2YgMi4KKwkgKi8KKwllbnYgPSBnZXRlbnYoImxpbWl0X2RyYW1fc2l6ZSIpOworCWlmIChlbnYgJiYgKChzdHJjbXAoZW52LCAieWVzIikgPT0gMCkgfHwgIChzdHJjbXAoZW52LCAiWWVzIikgPT0gMCkpKQorCXsKKwkJcHJpbnRmKCJcbkxpbWl0IEREUiBzaXplIGF0IDNHQiBkdWUgdG8gcG93ZXIgb2YgMiByZXF1aXJlbWVudCBvZiBBZGRyZXNzIGRlY29kaW5nXG4iKTsKKwkJbDJfYmFzZSA9IChfNEcgLSBfMUcpOworCX0gZWxzZQorCQlsMl9iYXNlID0gKF80RyAtIF8yNTZNKTsKIAogI2lmZGVmIENPTkZJR19NQVJWRUxMCiAJZm9yIChiYW5rID0gMDsgYmFuayA8IENPTkZJR19OUl9EUkFNX0JBTktTOyBiYW5rKyspIHsKIAkJc3RhcnRbYmFua10gPSBnZC0+ZHJhbV9od19pbmZvW2JhbmtdLnN0YXJ0OwogCQlzaXplW2JhbmtdID0gZ2QtPmRyYW1faHdfaW5mb1tiYW5rXS5zaXplOwogCi0JCS8qIC0gQmluYXJ5IGhlYWRlciBwcmVzZXJ2ZXMgSU8gbWVtb3J5IHNwYWNlIHZpYSBMMiBmaWx0ZXJpbmcgYXQgMy4yNUdCLCBpbiBvcmRlcgotCQkgKiAgIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggaW50ZXJuYWwgcmVnaXN0ZXJzIElPIGxvY2F0ZWQgMHhkMDAwMDAwMC4KLQkJICogLSBVLUJvb3QgdXBkYXRlcyBpbnRlcm5hbCByZWdpc3RlciBiYXNlIHRvIDB4ZjEwMDAwMDAgKDMuNzVHQikKLQkJICogLSBpZiBEUkFNIENTIHNpemUgcmVhY2hlcyA0RyAtLT4gYWxzbyBsaW1pdCBDUyBtZW1vcnkgbm9kZSB0byAzLjc1R0IgKi8KLQotCQkvKiBkdWUgdG8gTFNQIGlzc3VlIHdpdGggdW5hbGlnbmVkIHdpbmRvdyBzaXplcyB0byBwb3dlciBvZiAyICgzLjc1R0IpLAotCQkgKiBMMiBpcyB0ZW1wb3Jhcnkgc2V0IHRvIDNHQjogdXBkYXRlIERUIG1lbW9yeSBub2RlIGFjY29yZGluZ2x5ICovCisJCSAvKiAtIElmIG1lbW9yeSBzaXplIHJlYWNoZWQgNEdCLCBsaW1pdCBsYXN0IENTIHNpemUgYWNjb3JkaW5nIHRvIGhpZ2hlc3QgcG93ZXIgb2YgMi4KKwkJICogICAod2hlbiB1c2luZyAyeDJHQiwgbGFzdCBDUyB3aWxsIGJlIGxpbWl0ZWQgdG8gMUdCKSAqLwogCQlpZiAoKHN0YXJ0W2JhbmtdICsgc2l6ZVtiYW5rXSkgPT0gXzRHKSB7CiAJCQlzaXplW2JhbmtdID0gKGwyX2Jhc2UgLSBzdGFydFtiYW5rXSk7Ci0JCQkvKiBMU1AgaXMgdGVtcG9yYXJpbHkgd3JvbmdseSBkZXJpdmluZyBEUkFNIHdpbmRvd3MgbGltaXRhdGlvbiBmcm9tIE1CdXMuCi0JCQkgKiBhcyBhIHRlbXAgV0EsIGFsaWduIE1idXMgYnJpZGdlIHdpdGggTDIgYmFzZSAqLworCQkJLyogc2V0IElPIGFyZWEgdG8gaGlnaGVyIHByaW9yaXR5IHRoYW4gRFJBTSB3aW5kb3csIGJ5IGFsaWduaW5nIE1CVVMgYnJpZGdlIHdpdGggTDIgYmFzZS4KKwkJCSAqIChMaW51eCBtYWlubGluZSBNQlVTIGRyaXZlciB1c2VzIE1CVVMgY29uZmlndXJhdGlvbiB0byBkZXJpdmUgTDIgZmlsdGVyaW5nKSAqLwogCQkJbXZDcHVJZk1idXNXaW5kb3dTZXQobDJfYmFzZSwgXzRHIC0gbDJfYmFzZSk7CiAJCX0KIAl9CkBAIC0yMjEsMTUgKzIyOSwxNSBAQAogCQkJaWYgKChzdGFydCAtIDEgKyBzaXplKSA9PSAweEZGRkZGRkZGKSB7CiAJCQkJcGFyYW1zLT51Lm1lbS5zdGFydCA9IHN0YXJ0OwogI2lmZGVmIE1WX0REUl9MMl9BTElHTk1FTlQKLS8qIC0gQmluYXJ5IGhlYWRlciBwcmVzZXJ2ZXMgSU8gbWVtb3J5IHNwYWNlIHZpYSBMMiBmaWx0ZXJpbmcgYXQgMy4yNUdCLCBpbiBvcmRlcgotICogICB0byBhdm9pZCBjb25mbGljdCB3aXRoIGludGVybmFsIHJlZ2lzdGVycyBJTyBsb2NhdGVkIDB4ZDAwMDAwMDAuCi0gKiAtIFUtQm9vdCB1cGRhdGVzIGludGVybmFsIHJlZ2lzdGVyIGJhc2UgdG8gMHhmMTAwMDAwMCAoMy43NUdCKQotICogLSBpZiBEUkFNIENTIHNpemUgcmVhY2hlcyA0RyAtLT4gYWxzbyBsaW1pdCBtZW1vcnkgdGFncyB0byAzLjc1R0IgKi8KLQotLyogVGVtcG9yYXJ5OiBkdWUgdG8gTFNQICgzLjEwKSBpc3N1ZSB3aXRoIHVuYWxpZ25lZCB3aW5kb3cgc2l6ZXMgdG8gcG93ZXIgb2YgMiAoMy43NUdCKSwKLSAqIEwyIGlzIHNldCB0byAzR0I6IHVwZGF0ZSBtZW1vcnkgdGFncyBhY2NvcmRpbmdseSAqLworCQkJLyogLSBCaW5hcnkgaGVhZGVyIHByaW9yaXRpemUgSU8gbWVtb3J5IHNwYWNlIHZpYSBMMiBmaWx0ZXJpbmcgYXQgMy4wR0IsIGluIG9yZGVyCisJCQkgKiAgIHRvIGVuc3VyZSAnaGl0JyBvbiBpbnRlcm5hbCByZWdpc3RlcnMgSU8gYWNjZXNzIChsb2NhdGVkIGF0IDB4ZDAwMDAwMDAgYnkgZGVmYXVsdCkKKwkJCSAqIC0gQWx0aG91Z2ggVS1Cb290IHVwZGF0ZXMgaW50ZXJuYWwgcmVnaXN0ZXIgYmFzZSB0byAweGYxMDAwMDAwICgzLjc1R0IpLCBBZGRyZXNzCisJCQkgKiAgIGRlY29kaW5nIHN1cHBvcnRzIG9ubHkgd2luZG93cyBzaXplIGFsaWduZWQgdG8gcG93ZXIgb2YgMi4KKwkJCSAqIC0gSWYgbWVtb3J5IHNpemUgcmVhY2hlZCA0R0IsIGxpbWl0IGxhc3QgQ1Mgc2l6ZSBhY2NvcmRpbmcgdG8gaGlnaGVzdCBwb3dlciBvZiAyLgorCQkJICogICAod2hlbiB1c2luZyAyeDJHQiwgbGFzdCBDUyB3aWxsIGJlIGxpbWl0ZWQgdG8gMUdCKSAqLwogCQkJCXBhcmFtcy0+dS5tZW0uc2l6ZSA9IChsMl9iYXNlIC0gc3RhcnQpOwotLyogYWxpZ24gTWJ1cyBicmlkZ2Ugd2l0aCBMMiBiYXNlICovCisKKwkJCQkvKiBzZXQgSU8gYXJlYSB0byBoaWdoZXIgcHJpb3JpdHkgdGhhbiBEUkFNIHdpbmRvdywgYnkgYWxpZ25pbmcgTUJVUyBicmlkZ2Ugd2l0aCBMMiBiYXNlKi8KIAkJCQltdkNwdUlmTWJ1c1dpbmRvd1NldChsMl9iYXNlLCBfNEcgLSBsMl9iYXNlKTsKICNlbHNlCiAJCQkJcGFyYW1zLT51Lm1lbS5zaXplID0gKDB4RjAwMDAwMDAgLSBzdGFydCk7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmMgYi9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmMKaW5kZXggYzcwOGUwMy4uODI4MjM3NSAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzNzUvYXJtYWRhXzM3NV9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5jCisrKyBiL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuYwpAQCAtMTQ4Nyw2ICsxNDg3LDI4IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZAorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyByb3V0aW5lIHJldHVybnMgcG9ydCdzIGNvbm5lY3Rpb24gc3RhdHVzLCB0aGlzIHJvdXRlIHByb3ZpZGUgYSB1bmlmaWVkIGluZXJmYWNlCisqICAgICAgIGZvciBvdGhlciBtb2R1bGVzIHRvIGNhbGwgd2l0aG91dCBjYXJlIG9mIHRoZSBzd2l0Y2ggY29ubnRlY3Rpb24gbW9kZSAtIGV4dGVybmFsIG9yIGludGVybmFsCisqICAgICAgIGlmIHRoZSBzd2l0Y2ggaXMgY29ubmVjdGVkCisqIElOUFVUOgorKiAgICAgICBldGhQb3J0TnVtIC0gRXRoZXJuZXQgcG9ydCBudW1iZXIuCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICAxIC0gaWYgZXRoUG9ydE51bSBpcyBjb25uZWN0ZWQgdG8gc3dpdGNoLCAwIG90aGVyd2lzZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQodm9pZCkKK3sKKwlyZXR1cm4gbXZCb2FyZElzSW50ZXJuYWxTd2l0Y2hDb25uZWN0ZWQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZCb2FyZEZyZXFNb2Rlc051bUdldAogKgogKiBERVNDUklQVElPTjoKQEAgLTMwNTAsNyArMzA3Miw4IEBACiBNVl9CT09MIG12Qm9hcmRJc1VzYlBvcnRDb25uZWN0ZWQoTVZfVU5JVF9JRCB1c2JUeXBlSUQsIE1WX1U4IHVzYlBvcnROdW1iZXIpCiB7CiAJTVZfVTMyIGk7Ci0KKwlpZiAodXNiUG9ydE51bWJlciA+PSBtdkN0cmxVc2JNYXhHZXQoKSkKKwkJcmV0dXJuIE1WX0ZBTFNFOwogCS8qIEdvIG92ZXIgZXhpc3RpbmcgVVNCIHBvcnRzIGluIGJvYXJkIHN0cnVjdHVyZXM6IHRlc3QgZXhpc3RlbmNlIG9mIHJlcXVlc3RlZCBVU0IgVHlwZS9wb3J0ICovCiAJZm9yIChpID0gMDsgaSA8IGJvYXJkLT5udW1Cb2FyZFVzYkluZm87IGkrKykKIAkJaWYgKGJvYXJkLT5wQm9hcmRVc2JJbmZvW2ldLmlzQWN0aXZlICYmIGJvYXJkLT5wQm9hcmRVc2JJbmZvW2ldLnVzYlR5cGUgPT0gdXNiVHlwZUlEICYmCkBAIC0zMDg1LDMgKzMxMDgsNDAgQEAKIAogCXJldHVybiBib2FyZC0+bnVtUGljR3Bpb0luZm87CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkSXNUZG1Db25uZWN0ZWQKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgcm91dGluZSByZXR1cm5zIE1WX1RSVUUgaWYgVERNIG1vZHVsZSBpcyBjb25uZWN0ZWQKKyoKKyogSU5QVVQ6CisqCU5vbmUuCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICBNVl9UUlVFIC0gVERNIGlzIGNvbm5lY3RlZAorKiAgICAgICBNVl9GQUxTRSAtIG90aGVyd2lzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRJc1RkbUNvbm5lY3RlZCgpCit7CisJLyogVERNIGlzIG5vdCBzdXBwb3J0ZWQgb24gYTM3NSAqLworCXJldHVybiBNVl9GQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZElzVXNiM1BvcnREZXZpY2UKKyogREVTQ1JJUFRJT046IHJldHVybiB0cnVlIFVTQjMgcG9ydCBpcyBpbiBkZXZpY2UgbW9kZQorKgorKiBJTlBVVDogIHBvcnQJCS0gcG9ydCBudW1iZXIKKyogT1VUUFVUOiBOb25lLgorKiBSRVRVUk46IE1WX1RSVUU6IGlmIHBvcnQgaXMgc2V0IHRvIGRldmljZSBtb2RlCisqICAgICAgICAgTVZfRkFMU0U6IG90aGVyd2lzZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0JPT0wgbXZCb2FyZElzVXNiM1BvcnREZXZpY2UoTVZfVTMyIHBvcnQpCit7CisJLyogU2luY2UgdXNiMyBkZXZpY2UgaXMgbm90IHN1cHBvcnRlZCBvbiBjdXJyZW50IGJvYXJkIHJldHVybiBmYWxzZSAqLworCXJldHVybiBNVl9GQUxTRTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuaCBiL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuaAppbmRleCAxZjIwZThhLi5lMTczOWRlIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmgKKysrIGIvYm9hcmQvbXZfZWJ1L2EzNzUvYXJtYWRhXzM3NV9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5oCkBAIC00OTMsNiArNDkzLDcgQEAKIE1WX1NUQVRVUyBtdkJvYXJkSXNJbnRlcm5hbFN3aXRjaENvbm5lY3RlZFRvUG9ydChNVl9VMzIgZXRoUG9ydE51bSk7CiBNVl9TVEFUVVMgbXZCb2FyZElzSW50ZXJuYWxTd2l0Y2hDb25uZWN0ZWQodm9pZCk7CiBNVl9VMzIgbXZCb2FyZFN3aXRjaFBvcnRGb3JjZUxpbmtHZXQoTVZfVTMyIHN3aXRjaElkeCk7CitNVl9TVEFUVVMgbXZCb2FyZElzU3dpdGNoQ29ubmVjdGVkKHZvaWQpOwogTVZfQk9PTCBtdkJvYXJkSXNMdmRzTW9kdWxlQ29ubmVjdGVkKHZvaWQpOwogTVZfQk9PTCBtdkJvYXJkSXNMY2REdmlNb2R1bGVDb25uZWN0ZWQodm9pZCk7CiBNVl9TVEFUVVMgbXZCb2FyZFR3c2lNdXhDaGFubmVsU2V0KE1WX1U4IG11eENoTnVtKTsKQEAgLTUyMCw2ICs1MjEsOCBAQAogTVZfTkFORF9JRl9NT0RFIG12Qm9hcmROYW5kSWZHZXQodm9pZCk7CiBNVl9CT09MIG12Qm9hcmRJc1VzYlBvcnRDb25uZWN0ZWQoTVZfVU5JVF9JRCB1c2JUeXBlSUQsIE1WX1U4IHVzYlBvcnROdW1iZXIpOwogTVZfVTggbXZCb2FyZFBJQ0dwaW9HZXQoTVZfVTMyICpwaWNHcGlvTXBwSW5mbyk7CitNVl9CT09MIG12Qm9hcmRJc1RkbUNvbm5lY3RlZCh2b2lkKTsKK01WX0JPT0wgbXZCb2FyZElzVXNiM1BvcnREZXZpY2UoTVZfVTMyIHBvcnQpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjLmggYi9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYy5oCmluZGV4IGIwMWI5NzMuLjk0OTQxNzEgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjLmgKKysrIGIvYm9hcmQvbXZfZWJ1L2EzNzUvYXJtYWRhXzM3NV9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMuaApAQCAtMTQ4LDcgKzE0OCw3IEBACiAjZGVmaW5lIERCXzg4RjY3MjBfR1BQX1BPTF9NSUQJCTB4MAogI2RlZmluZSBEQl84OEY2NzIwX0dQUF9QT0xfSElHSAkJMHgwCiAKLQorI2RlZmluZSBNVl9URE1fT0ZGU0VUCQkJCSgweEIwMDAwKQogI2VuZGlmICAvKiBNVl9BU01MQU5HVUFHRSAqLwogCiAjZW5kaWYgIC8qIF9fSU5DbXZCb2FyZEVudlNwZWNoICovCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jIGIvYm9hcmQvbXZfZWJ1L2EzNzUvYXJtYWRhXzM3NV9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuYwppbmRleCAwY2ExY2VhLi4zNDg0MjM2IDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jCisrKyBiL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmMKQEAgLTIyOCw3ICsyMjgsMzAgQEAKIAogCWJvYXJkUGV4SW5mby0+Ym9hcmRQZXhJZk51bSA9IHBleElmTnVtOwogfQotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Q3RybElzVXNiU2VyRGVzQ29ubmVjdGVkCisqCisqIERFU0NSSVBUSU9OOmRldGVjdCB1c2IzIHBvcnQgaWYgY29ubmVjdGVkIHRvIHNlcmRlcy4KKyogICAgICAgY2hlY2sgaWYgU2VyRGVzIGxhbmUgaXMgY29ubmVjdGVkIHRvIFVTQjMgaG9zdAorKgorKgorKiBJTlBVVDogTm9uZQorKgorKiBPVVRQVVQ6IE5vbmUKKyoKKyogUkVUVVJOOnJldHVybiB0cnVlIGlmIHVzYiBwaHlzaWNhbCBwb3J0IGlzIGNvbm5lY3RlZCAsIGZhbHNlIG90aGVyd2lzZS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Q3RybElzVXNiU2VyRGVzQ29ubmVjdGVkKE1WX1UzMiB1c2JQb3J0KQoreworICAgICAgICBpbnQgdXNiM0hvc3ROdW0gPSBtdkN0cmxVc2IzSG9zdE1heEdldCgpOworICAgICAgICBpbnQgbWF4U2VyRGVzTGFuZXMgPSBtdkN0cmxVc2IzTWF4R2V0KCk7CisgICAgICAgIGlmICh1c2JQb3J0ID49IG1heFNlckRlc0xhbmVzICYmIHVzYjNIb3N0TnVtID4gbWF4U2VyRGVzTGFuZXMpeworICAgICAgICAgICAgICAgIHJldHVybiBNVl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTVZfVFJVRTsKK30KIAogTVZfVU5JVF9JRCBtdkN0cmxTb2NVbml0TnVtc1tNQVhfVU5JVFNfSURdW01WXzY3eHhfSU5ERVhfTUFYXSA9IHsKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICA2NzIwICovCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oIGIvYm9hcmQvbXZfZWJ1L2EzNzUvYXJtYWRhXzM3NV9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuaAppbmRleCA1YWQxMDkwLi4xMjgyZGMwIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oCisrKyBiL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmgKQEAgLTI4Miw2ICsyODIsNyBAQAogTVZfVk9JRCBtdkN0cmxTeXNDb25maWdJbml0KE1WX1ZPSUQpOwogTVZfVTMyIG12Q3RybFN5c0NvbmZpZ0dldChNVl9DT05GSUdfVFlQRV9JRCBjb25maWdGaWVsZCk7CiBNVl9VMzIgbXZDdHJsR2V0Q3B1TnVtKE1WX1ZPSUQpOworTVZfQk9PTCBtdkN0cmxJc1VzYlNlckRlc0Nvbm5lY3RlZChNVl9VMzIgdXNiUG9ydCk7CiBNVl9VMzIgbXZDdHJsR2V0UXVhZE51bShNVl9WT0lEKTsKIE1WX1NUQVRVUyBtdkN0cmxVcGRhdGVQZXhJZChNVl9WT0lEKTsKIE1WX0JPT0wgbXZDdHJsSXNWYWxpZFNhdFIoTVZfVk9JRCk7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9jdHJsRW52L212Q3RybEVudlNwZWMuaCBiL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52U3BlYy5oCmluZGV4IDVmYmQzMWEuLjQyMGRlZGEgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52U3BlYy5oCisrKyBiL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52U3BlYy5oCkBAIC0xMzAsNiArMTMwLDggQEAKICNkZWZpbmUgTVZfVVNCM19QSFlTX09GRlNFVChkZXYpICAgICAgICAgICAgICAgICgweDU4MDAwKQogI2RlZmluZSBNVl9VU0IyX1VTQjNfUkVHU19PRkZTRVQodW5pdFR5cGUsIGRldikgKHVuaXRUeXBlID09IFVTQl9VTklUX0lEID8gXAogCQkJCQkJCU1WX1VTQl9SRUdTX09GRlNFVChkZXYpIDogTVZfVVNCM19QSFlTX09GRlNFVChkZXYpKQorI2RlZmluZSBNVl9VU0IzX0RFVklDRV9SRUdTX09GRlNFVAkJTVZfVVNCX1JFR1NfT0ZGU0VUKDApCisjZGVmaW5lIE1WX1VTQjNfREVWSUNFX1VTQjJfUkVHU19PRkZTRVQJCSgweDU0MTAwKQogI2RlZmluZSBNVl9YT1JfUkVHU19PRkZTRVQodW5pdCkgICAgICAgICAgICAgICAgKDB4NjA4MDApCiAjZGVmaW5lIE1WX0NFU0FfVERNQV9SRUdTX09GRlNFVChjaGFuTnVtKSAgICAgICAoMHg5MDAwMCArIChjaGFuTnVtICogMHgyMDAwKSkKICNkZWZpbmUgTVZfQ0VTQV9SRUdTX09GRlNFVChjaGFuTnVtKSAgICAgICAgICAgICgweDlEMDAwICsgKGNoYW5OdW0gKiAweDIwMDApKQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2EzNzUvbXZfbWFpbl9hMzc1LmMgYi9ib2FyZC9tdl9lYnUvYTM3NS9tdl9tYWluX2EzNzUuYwppbmRleCBiNWYyYTNlLi4zODQwMTEzIDEwMDc1NQotLS0gYS9ib2FyZC9tdl9lYnUvYTM3NS9tdl9tYWluX2EzNzUuYworKysgYi9ib2FyZC9tdl9lYnUvYTM3NS9tdl9tYWluX2EzNzUuYwpAQCAtMjk0LDcgKzI5NCw2IEBACiAJCQkqKHVuc2lnbmVkIGludCopKENPTkZJR19TWVNfVEVYVF9CQVNFICsgaSk7CiAKIAltdkJvYXJkRGVidWdMZWQoNCk7Ci0JbXZfcHJpbnRfbWFwKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMxMSw3ICszMTAsNyBAQAogCWVudiA9IGdldGVudigibXRkaWRzIik7CiAJaWYgKCFlbnYpIHsKICNpZiBkZWZpbmVkKE1WX05BTkQpICYmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCi0JCXNldGVudigibXRkaWRzIiwgIm5hbmQwPWFybWFkYS1uYW5kO3NwaTA9c3BpX2ZsYXNoIik7CisJCXNldGVudigibXRkaWRzIiwgIm5hbmQwPWFybWFkYS1uYW5kLHNwaTA9c3BpX2ZsYXNoIik7CiAjZWxpZiBkZWZpbmVkKE1WX05BTkQpCiAJCXNldGVudigibXRkaWRzIiwgIm5hbmQwPWFybWFkYS1uYW5kIik7CiAjZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQpAQCAtNDkyLDYgKzQ5MSwxMiBAQAogCWlmICghZW52KQogCQlzZXRlbnYoImluaXRyZF9uYW1lIiwgInVJbml0cmQiKTsKIAorI2lmZGVmIENPTkZJR19DTURfU09VUkNFCisJZW52ID0gZ2V0ZW52KCJydW5fc2NyaXB0Iik7CisJaWYgKCFlbnYpCisJCXNldGVudigicnVuX3NjcmlwdCIsICJubyIpOworI2VuZGlmCisKIAkvKiBuZXRic2QgYm9vdCBhcmd1bWVudHMgKi8KIAllbnYgPSBnZXRlbnYoIm5ldGJzZF9lbiIpOwogCWlmICggIWVudiB8fCAoICgoc3RyY21wKGVudiwgIm5vIikgPT0gMCkgfHwgKHN0cmNtcChlbnYsICJObyIpID09IDApICkpKQpAQCAtMTAyNCw2ICsxMDI5LDcgQEAKICNlbmRpZgogCS8qIGluaXQgdGhlIHVuaXRzIGRlY29kZSB3aW5kb3dzICovCiAJbWlzY19pbml0X3JfZGVjX3dpbigpOworCW12X3ByaW50X21hcCgpOwogCW1lbXNldCgodm9pZCopQ09ORklHX1NZU19MT0FEX0FERFIsIDAsIENPTkZJR19TWVNfTUlOX0hEUl9ERUxfU0laRSk7CiAJbXZCb2FyZERlYnVnTGVkKDYpOwogCkBAIC0xMDQ0LDcgKzEwNTAsMTIgQEAKICNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfVU5NX0VUSCkgfHwgZGVmaW5lZChNVl9JTkNMVURFX0dJR19FVEgpCiAJbXZCb2FyZEVnaWdhUGh5SW5pdCgpOwogI2VuZGlmCi0KKyNpZmRlZiBDT05GSUdfQ01EX1NPVVJDRQorCS8qIHJ1biBzYXZlZCBzY3JpcHQgKi8KKwllbnYgPSBnZXRlbnYoInJ1bl9zY3JpcHQiKTsKKwlpZiAoZW52ICYmIHN0cmNtcChlbnYsICJ5ZXMiKSA9PSAwKQorCQlydW5fY29tbWFuZCgibXZzb3VyY2UgcnVuIiwgMCk7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5jIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5jCmluZGV4IGRkYjM1NmUuLjc2NmVjNGQgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuYworKysgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmMKQEAgLTIxNCw2ICsyMTQsMTAgQEAKIAlNVl9SRUdfQklUX1NFVChHUFBfREFUQV9PVVRfUkVHKDEpLCBCSVQwKTsJLy8gODh4MjAxMV9SU1RfbgogCU1WX1JFR19CSVRfU0VUKEdQUF9EQVRBX09VVF9SRUcoMSksIEJJVDE1KTsJLy8gU0RfUlNUX24KICNlbmRpZgorCisJLyogQ2FsbCBjYWxsYmFjayBmdW5jdGlvbiBmb3IgYm9hcmQgc3BlY2lmaWMgcG9zdCBHUFAgY29uZmlndXJhdGlvbiAqLworCWlmIChib2FyZC0+Z3BwUG9zdENvbmZpZ0NhbGxCYWNrKQorCQlib2FyZC0+Z3BwUG9zdENvbmZpZ0NhbGxCYWNrKGJvYXJkKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU3MCw3ICs1NzQsMTAgQEAKIAl0Y2xrID0gKCh0Y2xrICYgKDEgPDwgMTUpKSA+PiAxNSk7CiAJc3dpdGNoICh0Y2xrKSB7CiAJY2FzZSAwOgotCQlyZXR1cm4gTVZfQk9BUkRfVENMS18yNTBNSFo7CisJCWlmIChtdkN0cmxNb2RlbEdldCgpID09IE1WXzY4MTFfREVWX0lEKQorCQkJcmV0dXJuIE1WX0JPQVJEX1RDTEtfMTY2TUhaOwkvKiBkZXZpY2UgMzgxLzIgKDY4MTEvMjEpIHVzZSAxNjZNSHogaW5zdGVhZCBvZiAyNTBNSHogKi8KKwkJZWxzZQorCQkJcmV0dXJuIE1WX0JPQVJEX1RDTEtfMjUwTUhaOwogCWNhc2UgMToKIAkJcmV0dXJuIE1WX0JPQVJEX1RDTEtfMjAwTUhaOwogCWRlZmF1bHQ6CkBAIC02NjQsNyArNjcxLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBib2FyZC0+bnVtQm9hcmRHcHBJbmZvOyBpKyspIHsKIAkJaWYgKGJvYXJkLT5wQm9hcmRHcHBJbmZvW2ldLmRldkNsYXNzID09IGdwcENsYXNzKSB7Ci0JCQlpZiAoaW5kZXhGb3VuZCA9PSBpbmRleCkKKwkJCWlmIChpbmRleEZvdW5kID09IGluZGV4ICYmIChNVl9VMzIpYm9hcmQtPnBCb2FyZEdwcEluZm9baV0uZ3BwUGluTnVtICE9IC0xKQogCQkJCXJldHVybiAoTVZfVTMyKWJvYXJkLT5wQm9hcmRHcHBJbmZvW2ldLmdwcFBpbk51bTsKIAkJCWVsc2UKIAkJCQlpbmRleEZvdW5kKys7CkBAIC03MjUsNiArNzMyLDExMCBAQAogCXJldHVybiBtdkJvYXJHcGlvUGluTnVtR2V0KEJPQVJEX0dQUF9SRVNFVCwgMCk7CiB9CiAKKyNpZmRlZiBNVl9VU0JfVkJVU19DWUNMRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZElvRXhwYW5kZXJUeXBlR2V0CisqCisqIERFU0NSSVBUSU9OOgorKglSZXR1cm4gdGhlIENvbmZpZyB0eXBlIGZpZWxkcyBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBDb25maWcgdHlwZSBjbGFzcy4KKyoKKyogSU5QVVQ6CisqCWNvbmZpZ0NsYXNzIC0gVGhlIENvbmZpZyB0eXBlIGZpZWxkIHRvIHJldHVybiB0aGUgaW5mb3JtYXRpb24gZm9yLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyoJTVZfQk9BUkRfQ09ORklHX1RZUEVfSU5GTyBzdHJ1Y3Qgd2l0aCBtYXNrLCBvZmZzZXQgYW5kIHJlZ2lzdGVyIG51bWJlci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgbXZCb2FyZElvRXhwYW5kZXJUeXBlR2V0KE1WX0lPX0VYUEFOREVSX1RZUEVfSUQgaW9DbGFzcywKKwkJTVZfQk9BUkRfSU9fRVhQQU5ERVJfVFlQRV9JTkZPICppb0luZm8pCit7CisJTVZfVTMyIGk7CisKKwkvKiB2ZXJpZnkgZXhpc3RlbmNlIG9mIHJlcXVlc3RlZCBjb25maWcgdHlwZSwgcHVsbCBpdHMgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCBib2FyZC0+bnVtQm9hcmRJb0V4cFBpbkluZm87IGkrKykKKwkJaWYgKGJvYXJkLT5wQm9hcmRJb0V4cFBpbkluZm9baV0uaW9GaWVsZGlkID09IGlvQ2xhc3MpIHsKKwkJCSppb0luZm8gPSBib2FyZC0+cEJvYXJkSW9FeHBQaW5JbmZvW2ldOworCQkJcmV0dXJuIE1WX09LOworCQl9CisKKwlEQihtdk9zUHJpbnRmKCIlczogRXJyb3I6IHJlcXVlc3RlZCBJTyBleHBhbmRlciBJRCB3YXMgbm90IGZvdW5kICglZClcbiIsCisJCQlfX2Z1bmNfXywgaW9DbGFzcykpOworCXJldHVybiBNVl9FUlJPUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZElvRXhwVmFsU2V0IC0gd3JpdGUgYSBzcGVjaWZpZWQgdmFsdWUgdG8gSU8gRXhwYW5kZXJzCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBzcGVjaWZpZWQgdmFsdWUgdG8gSU8gRXhwYW5kZXJzCisqCisqIElOUFVUOgorKiAgICAgICBpb0luZm8gIC0gcmVsZXZhbnQgSU8gRXhwYW5kZXIgaW5mb3JtYXRpb24KKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk46CisqICAgICAgIE1WX1U4ICA6cmV0dXJuIHJlcXVlc3RlZCB2YWx1ZSAsIGlmIFRXU0kgcmVhZCB3YXMgc3VjY2VzZnVsbCwgZWxzZSAweEZGLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBtdkJvYXJkSW9FeHBWYWxTZXQoTVZfQk9BUkRfSU9fRVhQQU5ERVJfVFlQRV9JTkZPICppb0luZm8sIE1WX1U4IHZhbHVlLCBNVl9CT09MIGlzT3V0cHV0KQoreworCU1WX1U4IHJlYWRWYWwsIGNvbmZpZ1ZhbDsKKworCWlmIChpb0luZm8gPT0gTlVMTCkgeworCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IFdyaXRlIHRvIElPIEV4cGFuZGVyIGZhaWxlZCAoaW52YWxpZCBFeHBhbmRlciBpbmZvKVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTVZfRVJST1I7CisJfQorCisJLyogUmVhZCBkaXJlY3Rpb24gKG91dHB1dC9pbnB1dCkgVmFsdWUgKi8KKwlpZiAobXZCb2FyZFR3c2lHZXQoQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwgaW9JbmZvLT5leHBhbmRlck51bSwKKwkJCQkJaW9JbmZvLT5yZWdOdW0gKyA0LCAmY29uZmlnVmFsLCAxKSAhPSBNVl9PSykgeworCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IFJlYWQgQ29uZmlndXJhdGlvbiBmcm9tIElPIEV4cGFuZGVyIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTVZfRVJST1I7CisJfQorCisJLyogTW9kaWZ5IGRpcmVjdGlvbiAob3V0cHV0L2lucHV0KSB2YWx1ZSBvZiByZXF1ZXN0ZWQgcGluICovCisJaWYgKGlzT3V0cHV0KQorCQljb25maWdWYWwgJj0gfigxIDw8IGlvSW5mby0+b2Zmc2V0KTsJLyogb3V0cHV0IG1hcmtlZCBhcyAwOiBjbGVhbiBiaXQgb2Ygb2xkIHZhbHVlICAqLworCWVsc2UKKwkJY29uZmlnVmFsIHw9ICgxIDw8IGlvSW5mby0+b2Zmc2V0KTsJLyogaW5wdXQgbWFya2VkIGFzIDE6IHNldCBiaXQgb2Ygb2xkIHZhbHVlICAqLworCWlmIChtdkJvYXJkVHdzaVNldChCT0FSRF9UV1NJX0lPX0VYUEFOREVSLCBpb0luZm8tPmV4cGFuZGVyTnVtLAorCQkJCQlpb0luZm8tPnJlZ051bSArIDQsICZjb25maWdWYWwsIDEpICE9IE1WX09LKSB7CisJCW12T3NQcmludGYoIiVzOiBFcnJvcjogRW5hYmxlIFdyaXRlIHRvIElPIEV4cGFuZGVyIGF0IDB4JXggZmFpbGVkXG4iLCBfX2Z1bmNfXworCQkJICAgLCBtdkJvYXJkVHdzaUFkZHJHZXQoQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwgaW9JbmZvLT5leHBhbmRlck51bSkpOworCQlyZXR1cm4gTVZfRVJST1I7CisJfQorCisJLyogY29uZmlndXJlIG91dHB1dCB2YWx1ZSwgb25seSBmb3Igb3V0cHV0IGRpcmVjdGVkIElPICovCisJaWYgKCFpc091dHB1dCkKKwkJcmV0dXJuIE1WX09LOworCisJLyogUmVhZCBPdXRwdXQgVmFsdWUgKi8KKwlpZiAobXZCb2FyZFR3c2lHZXQoQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwgaW9JbmZvLT5leHBhbmRlck51bSwKKwkJCQkJaW9JbmZvLT5yZWdOdW0sICZyZWFkVmFsLCAxKSAhPSBNVl9PSykgeworCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IFJlYWQgT3V0cHV0IHZhbHVlIGZyb20gSU8gRXhwYW5kZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBNVl9FUlJPUjsKKwl9CisKKwkvKiBNb2RpZnkgKi8KKwlyZWFkVmFsICY9IH4oMSA8PCBpb0luZm8tPm9mZnNldCk7CS8qIGNsZWFuIGJpdCBvZiBvbGQgdmFsdWUgICovCisJcmVhZFZhbCB8PSAodmFsdWUgPDwgaW9JbmZvLT5vZmZzZXQpOworCisJLyogV3JpdGUgb3V0cHV0IHZhbHVlKi8KKwlpZiAobXZCb2FyZFR3c2lTZXQoQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwgaW9JbmZvLT5leHBhbmRlck51bSwKKwkJCQkJaW9JbmZvLT5yZWdOdW0sICZyZWFkVmFsLCAxKSAhPSBNVl9PSykgeworCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IFdyaXRlIHRvIElPIEV4cGFuZGVyIGF0IDB4JXggZmFpbGVkXG4iLCBfX2Z1bmNfXworCQkJICAgLCBtdkJvYXJkVHdzaUFkZHJHZXQoQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwgaW9JbmZvLT5leHBhbmRlck51bSkpOworCQlyZXR1cm4gTVZfRVJST1I7CisJfQorCisJcmV0dXJuIE1WX09LOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkVVNCVmJ1c0dwaW9QaW5HZXQgLSByZXR1cm4gVmJ1cyBpbnB1dCBHUFAKICoKQEAgLTc0NiwyNiArODU3LDY4IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIG12Qm9hcmRVU0JWYnVzRW5HcGlvUGluR2V0IC0gcmV0dXJuIFZidXMgRW5hYmxlIG91dHB1dCBHUFAKKyogbXZVc2JWYnVzR3BwU2V0IC0gU0VUIFVTQiBWQlVTIHNpZ25hbCB2aWEgR1BJTwogKgogKiBERVNDUklQVElPTjoKLSoKLSogSU5QVVQ6Ci0qCQlpbnQgIGRldk5vLgotKgotKiBPVVRQVVQ6Ci0qCQlOb25lLgotKgotKiBSRVRVUk46Ci0qICAgICAgIEdQSU8gcGluIG51bWJlci4gVGhlIGZ1bmN0aW9uIHJldHVybiAtMSBmb3IgYmFkIHBhcmFtZXRlcnMuCi0qCisqKiBJTlBVVDoJZ3BwTm8gLSBncHAgcGluIE51bWJlci4KKyoqIE9VVFBVVDoJTm9uZS4KKyoqIFJFVFVSTjoJTm9uZS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NVl8zMiBtdkJvYXJkVVNCVmJ1c0VuR3Bpb1BpbkdldChNVl8zMiBkZXZJZCkKK01WX1ZPSUQgbXZVc2JWYnVzR3BwU2V0KGludCBncHBObykKIHsKLQlyZXR1cm4gbXZCb2FyR3Bpb1Bpbk51bUdldChCT0FSRF9HUFBfVVNCX1ZCVVNfRU4sIGRldklkKTsKKwlNVl9VMzIgcmVnVmFsOworCisJLyogTVBQIENvbnRyb2wgUmVnaXN0ZXIgLSBzZXQgbXBwIGFzIEdQUCAodmFsdWUgPSAwKSovCisJcmVnVmFsID0gTVZfUkVHX1JFQUQobXZDdHJsTXBwUmVnR2V0KCh1bnNpZ25lZCBpbnQpKGdwcE5vIC8gOCkpKTsKKwlyZWdWYWwgJj0gfigweGYgPDwgKChncHBObyAlIDgpICogNCkpOworCU1WX1JFR19XUklURShtdkN0cmxNcHBSZWdHZXQoKHVuc2lnbmVkIGludCkoZ3BwTm8gLyA4KSksIHJlZ1ZhbCk7CisKKwlpZiAoZ3BwTm8gPCAzMikgeworCQkvKiBHUElPIERhdGEgT3V0IEVuYWJsZSBDb250cm9sIFJlZ2lzdGVyIC0gc2V0IHRvIG91dHB1dCAqLworCQltdkdwcFR5cGVTZXQoMCwgKDEgPDwgZ3BwTm8pLCBNVl9HUFBfT1VUICYgKDEgPDwgZ3BwTm8pKTsKKwkJLyogR1BJTyBvdXRwdXQgRGF0YSBWYWx1ZSBSZWdpc3RlciAtIHNldCBhcyBoaWdoICovCisJCW12R3BwVmFsdWVTZXQoMCwgKDEgPDwgZ3BwTm8pLCAoMSA8PCBncHBObykpOworCX0gZWxzZSB7CisJCS8qIEdQSU8gRGF0YSBPdXQgRW5hYmxlIENvbnRyb2wgUmVnaXN0ZXIgLSBzZXQgdG8gb3V0cHV0ICovCisJCW12R3BwVHlwZVNldCgxLCAoMSA8PCAoZ3BwTm8gLSAzMikpLCBNVl9HUFBfT1VUICYgKDEgPDwgKGdwcE5vIC0gMzIpKSk7CisJCS8qIEdQSU8gb3V0cHV0IERhdGEgVmFsdWUgUmVnaXN0ZXIgLSBzZXQgYXMgaGlnaCAqLworCQltdkdwcFZhbHVlU2V0KDEsICgxIDw8IChncHBObyAtIDMyKSksICgxIDw8IChncHBObyAtIDMyKSkpOworCX0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZFVzYlZidXNTZXQgLSBTZXQgVVNCIFZCVVMgc2lnbmFsIGJlZm9yZSBkZXRlY3Rpb24KKyoKKyogREVTQ1JJUFRJT046CisqIHRoaXMgcm91dGluZSBzZXRzIFZCVVMgc2lnbmFsIHZpYSBHUElPIG9yIHZpYSBJMkMgSU8gZXhwYW5kZXIKKyoKKyoqIElOUFVUOglpbnQgIGRldiAtIFVTQiBIb3N0IG51bWJlcgorKiogT1VUUFVUOglOb25lLgorKiogUkVUVVJOOglOb25lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1ZPSUQgbXZCb2FyZFVzYlZidXNTZXQoaW50IGRldikKK3sKKwlNVl8zMiBncHBObyA9IG12Qm9hcmRVU0JWYnVzR3Bpb1BpbkdldChkZXYpOworCisJLyogU29tZSBvZiBNYXJ2ZWxsIGJvYXJkcyBjb250cm9sIFZCVVMgc2lnbmFsIHZpYSBJMkMgSU8gZXhwYW5kZXIgdW5pdCAqLworI2lmbmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVAorCU1WX0JPQVJEX0lPX0VYUEFOREVSX1RZUEVfSU5GTyBpb0luZm87CisKKwkvKiBpZiBWQlVTIHNpZ25hbCBpcyBDb250cm9sbGVkIHZpYSBJMkMgSU8gRXhwYW5kZXIgb24gYm9hcmQqLworCWlmIChtdkJvYXJkSW9FeHBhbmRlclR5cGVHZXQoTVZfSU9fRVhQQU5ERVJfVVNCX1ZCVVMsICZpb0luZm8pICE9IE1WX0VSUk9SKSB7CisJCW12Qm9hcmRJb0V4cFZhbFNldCgmaW9JbmZvLCAxLCBNVl9UUlVFKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJLyogZWxzZSBpZiBWQlVTIHNpZ25hbCBpcyBDb250cm9sbGVkIHZpYSBHUElPIG9uIGJvYXJkKi8KKwlpZiAoZ3BwTm8gIT0gTVZfRVJST1IpCisJCW12VXNiVmJ1c0dwcFNldChncHBObyk7CisKK30KKyNlbmRpZiAvKiBNVl9VU0JfVkJVU19DWUNMRSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkR3Bpb0ludE1hc2tHZXQgLSBHZXQgR1BJTyBtYXNrIGZvciBpbnRlcnJ1cHQgcGlucwogKgogKiBERVNDUklQVElPTjoKQEAgLTkzMSw4ICsxMDg0LDE0IEBACiAJYm9vdFNyYyA9IG12Qm9hcmRCb290RGV2aWNlR3JvdXBTZXQoKTsKIAlpZiAoTVNBUl8wX0JPT1RfTkFORF9ORVcgPT0gYm9vdFNyYykKIAkJbXZCb2FyZE1vZHVsZUNvbmZpZ1NldChNVl9NT0RVTEVfTkFORF9PTl9CT0FSRCk7Ci0JZWxzZSBpZiAoTVNBUl8wX0JPT1RfU0RJTyA9PSBib290U3JjKQorCWVsc2UgaWYgKE1TQVJfMF9CT09UX1NESU8gPT0gYm9vdFNyYykgewogCQltdkJvYXJkTW9kdWxlQ29uZmlnU2V0KE1WX01PRFVMRV9EQjM4MV9NTUNfOEJJVF9PTl9CT0FSRCk7CisJCS8qIEVuYWJsZSBOQU5EIGFjY2VzcyBpZiB0aGUgU0RJTyBpcyBub3QgdXNpbmcgTkFORCBNUFBzLgorCQkgICBUaGUgU0RJTyBNUFBzIG92ZXJsYXAgTkFORCBvbmVzIGluIFNESU8tOGJpdCBhY2Nlc3MgbW9kZSwKKwkJICAgd2hlbiBib290IGF0dHIyID09IDQwICovCisJCWlmIChtdkJvYXJkQm9vdEF0dHJHZXQobXZCb2FyZEJvb3REZXZpY2VHZXQoKSwgMikgIT0gNDApCisJCQltdkJvYXJkTW9kdWxlQ29uZmlnU2V0KE1WX01PRFVMRV9OQU5EX09OX0JPQVJEKTsKKwl9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDA5LDggKzExNjgsNyBAQAogCXN0cnVjdCBfbXZCb2FyZE1wcE1vZHVsZSBuYW5kTW9kdWxlWzZdID0gTVBQX05BTkRfTU9EVUxFOwogCXN0cnVjdCBfbXZCb2FyZE1wcE1vZHVsZSBzZGlvTW9kdWxlWzRdID0gTVBQX1NESU9fTU9EVUxFOwogCXN0cnVjdCBfbXZCb2FyZE1wcE1vZHVsZSB0ZG1Nb2R1bGVbMl0gPSBNUFBfVERNX01PRFVMRTsKLQlzdHJ1Y3QgX212Qm9hcmRNcHBNb2R1bGUgaTJzTW9kdWxlID0gTVBQX0kyU19NT0RVTEU7Ci0Jc3RydWN0IF9tdkJvYXJkTXBwTW9kdWxlIHNwZGlmTW9kdWxlID0gTVBQX1NQRElGX01PRFVMRTsKKwlzdHJ1Y3QgX212Qm9hcmRNcHBNb2R1bGUgYXVkaW9Nb2R1bGUgPSBNUFBfQVVESU9fTU9EVUxFOwogCXN0cnVjdCBfbXZCb2FyZE1wcE1vZHVsZSBuYW5kT25Cb2FyZFs0XSA9IE1QUF9OQU5EX09OX0JPQVJEOwogCXN0cnVjdCBfbXZCb2FyZE1wcE1vZHVsZSBtaW5pX3BjaWUwX09uQm9hcmQgPSBNUFBfR1BfTUlOSV9QQ0lFMDsKIAlzdHJ1Y3QgX212Qm9hcmRNcHBNb2R1bGUgbWluaV9wY2llMV9PbkJvYXJkID0gTVBQX0dQX01JTklfUENJRTE7CkBAIC0xMDM4LDE3ICsxMTk2LDIwIEBACiAJCWlmIChtdkJvYXJkSXNNb2R1bGVDb25uZWN0ZWQoTVZfTU9EVUxFX1NESU8pKQogCQkJbXZNb2R1bGVNcHBVcGRhdGUoNCwgc2Rpb01vZHVsZSk7CiAKKwkJLyogTWljcm9zZW1pIExFODgyNjZETEMgKFZFODgwIHNlcmllcykgKi8KIAkJaWYgKG12Qm9hcmRJc01vZHVsZUNvbm5lY3RlZChNVl9NT0RVTEVfU0xJQ19URE1fREVWSUNFKSkKIAkJCW12TW9kdWxlTXBwVXBkYXRlKDIsIHRkbU1vZHVsZSk7CiAKLQkJaWYgKG12Qm9hcmRJc01vZHVsZUNvbm5lY3RlZChNVl9NT0RVTEVfSTJTX0RFVklDRSkpCi0JCQltdk1vZHVsZU1wcFVwZGF0ZSgxLCAmaTJzTW9kdWxlKTsKLQotCQlpZiAobXZCb2FyZElzTW9kdWxlQ29ubmVjdGVkKE1WX01PRFVMRV9TUERJRl9ERVZJQ0UpKQotCQkJbXZNb2R1bGVNcHBVcGRhdGUoMSwgJnNwZGlmTW9kdWxlKTsKKwkJaWYgKG12Qm9hcmRJc01vZHVsZUNvbm5lY3RlZChNVl9NT0RVTEVfSTJTX0RFVklDRSkgfHwKKwkJCQltdkJvYXJkSXNNb2R1bGVDb25uZWN0ZWQoTVZfTU9EVUxFX1NQRElGX0RFVklDRSkpCisJCQltdk1vZHVsZU1wcFVwZGF0ZSgxLCAmYXVkaW9Nb2R1bGUpOwogCiAJCWlmIChtdkJvYXJkSXNNb2R1bGVDb25uZWN0ZWQoTVZfTU9EVUxFX05BTkRfT05fQk9BUkQpKQogCQkJbXZNb2R1bGVNcHBVcGRhdGUoNCwgbmFuZE9uQm9hcmQpOworCisJCS8qIFNpbGxhYiBTSTMyMjYxLUYgKi8KKwkJaWYgKG12Qm9hcmRJc1RkbUNvbm5lY3RlZCgpID09IE1WX1RSVUUpCisJCQltdk1vZHVsZU1wcFVwZGF0ZSgyLCB0ZG1Nb2R1bGUpOwogCQlicmVhazsKIAljYXNlIERCX0dQXzY4WFhfSUQ6CiAJCW1pbmlQY2llMF9zYXRhMF9zZWxlY3RvciA9IG12Qm9hcmRTYXRSUmVhZChNVl9TQVRSX0dQX1NFUkRFUzFfQ0ZHKTsgLyogMCA9IFNBVEEwICwgMSA9IFBDSWUwICovCkBAIC0xMjgxLDcgKzE0NDIsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdkJvYXJkSXNJbnRlcm5hbFN3aXRjaENvbm5lY3RlZAorKiBtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQKICoKICogREVTQ1JJUFRJT046CiAqICAgICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHBvcnQncyBjb25uZWN0aW9uIHN0YXR1cwpAQCAtMTI5Niw5ICsxNDU3LDEyIEBACiAqICAgICAgIDEgLSBpZiBldGhQb3J0TnVtIGlzIGNvbm5lY3RlZCB0byBzd2l0Y2gsIDAgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG12Qm9hcmRJc0ludGVybmFsU3dpdGNoQ29ubmVjdGVkKHZvaWQpCitNVl9TVEFUVVMgbXZCb2FyZElzU3dpdGNoQ29ubmVjdGVkKHZvaWQpCiB7Ci0JcmV0dXJuIE1WX0ZBTFNFOworCWlmICgoYm9hcmQgPT0gKChNVl9CT0FSRF9JTkZPICopLTEpKSB8fCAoYm9hcmQtPnN3aXRjaEluZm9OdW0gPT0gMCkgfHwgKGJvYXJkLT5wU3dpdGNoSW5mbyA9PSBOVUxMKSkKKwkJcmV0dXJuIE1WX0ZBTFNFOworCisJcmV0dXJuIGJvYXJkLT5wU3dpdGNoSW5mb1swXS5pc0VuYWJsZWQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDAyLDEwICsxNTY2LDExIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfQk9PTCBtdkJvYXJkSXNHYkVQb3J0Q29ubmVjdGVkKE1WX1UzMiBldGhQb3J0TnVtKQogewotCS8qIHBvcnQgaXMgY29ubmVjdGVkLCBpZiBpdCdzIGlkZW50aWZpZWQgYXMgUi9TR01JSSwgYW5kIGhhcyBhIHZhbGlkIGNvcnJlc3BvbmRpbmcgTUFDIGluZm8gZW50cnkgKi8KKwkvKiBwb3J0IGlzIGNvbm5lY3RlZCwgaWYgaXQncyBlbmFibGVkLCBpZGVudGlmaWVkIGFzIFIvU0dNSUksIGFuZCBoYXMgYSB2YWxpZCBjb3JyZXNwb25kaW5nIE1BQyBpbmZvIGVudHJ5ICovCiAKIAogCWlmICgoZXRoUG9ydE51bSA8PSBib2FyZC0+bnVtQm9hcmRNYWNJbmZvKSAmJgorCQkoYm9hcmQtPnBCb2FyZE1hY0luZm9bZXRoUG9ydE51bV0uYm9hcmRNYWNFbmFibGVkID09IE1WX1RSVUUpICYmCiAJCSgobXZDdHJsUG9ydElzU2VyZGVzU2dtaWkoZXRoUG9ydE51bSkgfHwKIAkJKG12Q3RybFBvcnRJc1JnbWlpKGV0aFBvcnROdW0pICYmIG12Qm9hcmRQaHlBZGRyR2V0KGV0aFBvcnROdW0pICE9IC0xKSkgfHwKIAkJKG12Q3RybFBvcnRJc1NlcmRlc1J4YXVpKGV0aFBvcnROdW0pICYmIG12Qm9hcmRQaHlBZGRyR2V0KGV0aFBvcnROdW0pICE9IC0xKSkpCkBAIC0yMDc1LDYgKzIyNDAsOCBAQAogCQlnQm9hcmRJZCA9IENVU1RPTUVSX0JPQVJEX0lEMDsKIAkjZWxpZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMQogCQlnQm9hcmRJZCA9IENVU1RPTUVSX0JPQVJEX0lEMTsKKwkjZWxpZiBDT05GSUdfQ0xFQVJGT0dfQk9BUkQKKwkJZ0JvYXJkSWQgPSBBMzhYX0NMRUFSRk9HX0JPQVJEX0lEOwogCSNlbGlmIENPTkZJR19HRkNIMTAwCiAJCWdCb2FyZElkID0gR0ZDSDEwMF9JRDsKIAkjZW5kaWYKQEAgLTIzMjUsNyArMjQ5MiwxMCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WXzMyIG12Qm9hcmRTbWlTY2FuTW9kZUdldChNVl9VMzIgc3dpdGNoSWR4KQogewotCXJldHVybiBCT0FSRF9FVEhfU1dJVENIX1NNSV9TQ0FOX01PREU7CisJaWYgKCFtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQoKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIGJvYXJkLT5wU3dpdGNoSW5mb1tzd2l0Y2hJZHhdLnNtaVNjYW5Nb2RlOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjM0Niw3ICsyNTE2LDExOSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1UzMiBtdkJvYXJkU3dpdGNoQ3B1UG9ydEdldChNVl9VMzIgc3dpdGNoSWR4KQogewotCXJldHVybiAtMTsKKwlpZiAoIW12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZCgpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gYm9hcmQtPnBTd2l0Y2hJbmZvW3N3aXRjaElkeF0uY3B1UG9ydDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZFN3aXRjaElzUmdtaWkgLSBDaGVjayBpZiB0aGUgU3dpdGNoIGNvbm5lY3RlZCB0byBSR01JSSBwb3J0CisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyBpZiB0aGUgc3dpdGNoIGNvbm5lY3RlZCB0byBSR01JSSBwb3J0CisqCisqIElOUFVUOgorKiAgICAgICBzd2l0Y2hJZHggLSBpbmRleCBvZiB0aGUgc3dpdGNoLiBPbmx5IDAgaXMgc3VwcG9ydGVkLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyogICAgICAgU3RhdHVzIG9mIHN3aXRjaCB0eXBlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBtdkJvYXJkU3dpdGNoQ3B1UG9ydElzUmdtaWkoTVZfVTMyIHN3aXRjaElkeCkKK3sKKwlpZiAoIW12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZCgpKQorCQlyZXR1cm4gTVZfRkFMU0U7CisKKwlyZXR1cm4gYm9hcmQtPnBTd2l0Y2hJbmZvW3N3aXRjaElkeF0uaXNDcHVQb3J0UmdtaWk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRTd2l0Y2hQaHlBZGRyR2V0IC0gR2V0IHRoZSB0aGUgRXRoZXJuZXQgU3dpdGNoIFBIWSBhZGRyZXNzCisqCisqIERFU0NSSVBUSU9OOgorKglUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgU3dpdGNoIFBIWSBhZGRyZXNzLCAtMSBlbHNlLgorKgorKiBJTlBVVDoKKyoJc3dpdGNoSWR4IC0gaW5kZXggb2YgdGhlIHN3aXRjaC4gT25seSAwIGlzIHN1cHBvcnRlZC4KKyoKKyogT1VUUFVUOgorKglOb25lLgorKgorKiBSRVRVUk46CisqCXRoZSBTd2l0Y2ggUEhZIGFkZHJlc3MsIC0xIGlmIHRoZSBzd2l0Y2ggaXMgbm90IGNvbm5lY3RlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl8zMiBtdkJvYXJkU3dpdGNoUGh5QWRkckdldChNVl9VMzIgc3dpdGNoSWR4KQoreworCWlmICghbXZCb2FyZElzU3dpdGNoQ29ubmVjdGVkKCkpCisJCXJldHVybiAtMTsKKworCXJldHVybiBib2FyZC0+cFN3aXRjaEluZm9bc3dpdGNoSWR4XS5xdWFkUGh5QWRkcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZFN3aXRjaENvbm5lY3RlZFBvcnRHZXQgLQorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIHN3aXRjaCBwb3J0IGNvbm5lY3RlZCB0byB0aGUgZXRoUG9ydAorKgorKiBJTlBVVDoKKyogICAgICAgZXRoUG9ydE51bSAtIEV0aGVybmV0IHBvcnQgbnVtYmVyLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl8zMiBtdkJvYXJkU3dpdGNoQ29ubmVjdGVkUG9ydEdldChNVl9VMzIgZXRoUG9ydCkKK3sKKwlpZiAoIW12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZCgpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gYm9hcmQtPnBTd2l0Y2hJbmZvWzBdLmNvbm5lY3RlZFBvcnRbZXRoUG9ydF07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRNb2R1bGVTd2l0Y2hJbmZvVXBkYXRlIC0gVXBkYXRlIEJvYXJkIGluZm9ybWF0aW9uIHN3aXRjaCBtb2R1bGUgc3RydWN0dXJlcworKgorKiBERVNDUklQVElPTjoKKyoJVXBkYXRlIGJvYXJkIGluZm9ybWF0aW9uIHN3aXRjaCBtb2R1bGUgc3RydWN0dXJlcyBhY2NvcmRpbmcgdG8gc3dpdGNoIGRldGVjdGlvbgorKgorKiBJTlBVVDoKKyoJc3dpdGNoRGV0ZWN0ZWQgLSBzd2l0Y2ggbW9kdWxlIGlzIGRldGVjdGVkIG9yIG5vdAorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyoJTm9uZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9WT0lEIG12Qm9hcmRNb2R1bGVTd2l0Y2hJbmZvVXBkYXRlKE1WX0JPT0wgc3dpdGNoRGV0ZWN0ZWQpCit7CisJaW50IGkgPSAwOworCisJaWYgKChib2FyZCA9PSAoKE1WX0JPQVJEX0lORk8gKiktMSkpKSB7CisJCW12T3NQcmludGYoIiVzICVkOkJvYXJkIHVua25vd24uXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKHN3aXRjaERldGVjdGVkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBib2FyZC0+c3dpdGNoSW5mb051bTsgaSsrKQorCQkJaWYgKGJvYXJkLT5wU3dpdGNoSW5mbyAhPSBOVUxMKQorCQkJCWJvYXJkLT5wU3dpdGNoSW5mb1tpXS5pc0VuYWJsZWQgPSBNVl9UUlVFOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBib2FyZC0+c3dpdGNoSW5mb051bTsgaSsrKQorCQkJaWYgKGJvYXJkLT5wU3dpdGNoSW5mbyAhPSBOVUxMKQorCQkJCWJvYXJkLT5wU3dpdGNoSW5mb1tpXS5pc0VuYWJsZWQgPSBNVl9GQUxTRTsKKworCQlib2FyZC0+c3dpdGNoSW5mb051bSA9IDA7CisJfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzM4NCw4ICszNjY2LDQ5IEBACiAJCXJldHVybiBib2FyZC0+bmFuZElmTW9kZTsKIAl9CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkSXNUZG1Db25uZWN0ZWQKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgcm91dGluZSByZXR1cm5zIE1WX1RSVUUgaWYgVERNIG1vZHVsZSBpcyBjb25uZWN0ZWQKKyoKKyogSU5QVVQ6CisqCU5vbmUuCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICBNVl9UUlVFIC0gVERNIGlzIGNvbm5lY3RlZAorKiAgICAgICBNVl9GQUxTRSAtIG90aGVyd2lzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRJc1RkbUNvbm5lY3RlZCgpCit7CisJcmV0dXJuIGJvYXJkLT5pc1RkbUNvbm5lY3RlZDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZFRkbUNvbm5lY3Rpb25TZXQKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgcm91dGluZSBzZXRzIGlmIFRETSBtb2R1bGUgaXMgY29ubmVjdGVkIG9yIG5vdC4KKyoKKyogSU5QVVQ6CisqCWlzQ29ubmVjdGVkIC0gaW5kaWNhdGVkIGlmIFRETSBtb2R1bGUgaXMgY29ubmVjdGVkLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyogICAgICAgTm9uZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG12Qm9hcmRUZG1Db25uZWN0aW9uU2V0KE1WX0JPT0wgaXNDb25uZWN0ZWQpCit7CisJYm9hcmQtPmlzVGRtQ29ubmVjdGVkID0gaXNDb25uZWN0ZWQ7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkaXNTZGlvQ29ubmVjdGVkCiAqIERFU0NSSVBUSU9OOiByZXR1cm4gdHJ1ZSBpZiBTRElPIGNvbm5lY3RlZCBvbiBib2FyZAogKgpAQCAtMzQ1MiwzICszNzc1LDQ1IEBACiAKIAlyZXR1cm4gTVZfRkFMU0U7CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkQXVkaW9Db25uZWN0aW9uR2V0CisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyBNVl9UUlVFIGlmIFNQRElGL0kyUyBpcyBjb25uZWN0ZWQKKyoKKyogSU5QVVQ6CisqCU5vbmUuCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICBNVl9UUlVFIC0gU1BESUYvSTJTIGlzIGNvbm5lY3RlZAorKiAgICAgICBNVl9GQUxTRSAtIG90aGVyd2lzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRJc0F1ZGlvQ29ubmVjdGVkKCkKK3sKKwlyZXR1cm4gYm9hcmQtPmlzQXVkaW9Db25uZWN0ZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRBdWRpb0Nvbm5lY3Rpb25TZXQKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgcm91dGluZSBzZXRzIGlmIFNQRElGL0kyUyBtb2R1bGUgaXMgY29ubmVjdGVkIG9yIG5vdC4KKyoKKyogSU5QVVQ6CisqCWlzQ29ubmVjdGVkIC0gaW5kaWNhdGVkIGlmIFNQRElGL0kyUyBpcyBjb25uZWN0ZWQuCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICBOb25lLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbXZCb2FyZEF1ZGlvQ29ubmVjdGlvblNldChNVl9CT09MIGlzQ29ubmVjdGVkKQoreworCWJvYXJkLT5pc0F1ZGlvQ29ubmVjdGVkID0gaXNDb25uZWN0ZWQ7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmggYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmgKaW5kZXggNjhlZDMyMi4uOTIyNWYzMyAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuaApAQCAtMTc1LDEwICsxNzUsMTEgQEAKIAlNVl9NT0RVTEVfU0RJTwkJCQk9IEJJVDYsCS8qIFNESU8gYm9hcmQgU0xNIDEzNjEJKi8KIAlNVl9NT0RVTEVfU0dNSUkJCQkJPSBCSVQ3LAkvKiBTR01JSSBib2FyZCBTTE0gMTM2NAkqLwogCU1WX01PRFVMRV9EQjM4MV9TR01JSQkJCT0gQklUOCwJLyogREItMzgxIFNHTUlJIFNMTSAxNDI2ICovCi0JTVZfTU9EVUxFX05BTkRfT05fQk9BUkQJCQk9IEJJVDksCS8qIE9OIGJvYXJkIG5hbmQgLSBkZXRlY3RlZCB2aWEgU0BSIGJvb3RzcmMgKi8KLQlNVl9NT0RVTEVfREIzODFfTU1DXzhCSVRfT05fQk9BUkQJPSBCSVQxMCwvKiBPTiBib2FyZCBNTUMgOGJpdCAtIGRldGVjdGVkIHZpYSBTQFIgYm9vdHNyYyAqLwotCU1WX01PRFVMRV9UWVBFX01BWF9NT0RVTEUJCT0gOSwKLQlNVl9NT0RVTEVfVFlQRV9NQVhfT1BUSU9OCQk9IDEwCisJTVZfTU9EVUxFX1NXSVRDSAkJCT0gQklUOSwvKiBTV0lUQ0ggYm9hcmQgU0xNIDEzNzUJKi8KKwlNVl9NT0RVTEVfTkFORF9PTl9CT0FSRAkJCT0gQklUMTAsCS8qIE9OIGJvYXJkIG5hbmQgLSBkZXRlY3RlZCB2aWEgU0BSIGJvb3RzcmMgKi8KKwlNVl9NT0RVTEVfREIzODFfTU1DXzhCSVRfT05fQk9BUkQJPSBCSVQxMSwvKiBPTiBib2FyZCBNTUMgOGJpdCAtIGRldGVjdGVkIHZpYSBTQFIgYm9vdHNyYyAqLworCU1WX01PRFVMRV9UWVBFX01BWF9NT0RVTEUJCT0gMTAsCisJTVZfTU9EVUxFX1RZUEVfTUFYX09QVElPTgkJPSAxMQogfSBNVl9NT0RVTEVfVFlQRV9JRDsKIAogdHlwZWRlZiBzdHJ1Y3QgX2RldkNzSW5mbyB7CkBAIC0xOTEsNiArMTkyLDE4IEBACiAJTVZfQk9PTCBhY3RpdmU7CiB9IE1WX0RFVl9DU19JTkZPOwogCitzdHJ1Y3QgTVZfQk9BUkRfU1dJVENIX0lORk8geworCU1WX0JPT0wgaXNFbmFibGVkOworCU1WX0JPT0wgaXNDcHVQb3J0UmdtaWk7CisJTVZfMzIgc3dpdGNoSXJxOworCU1WXzMyIHN3aXRjaFBvcnRbQk9BUkRfRVRIX1NXSVRDSF9QT1JUX05VTV07CisJTVZfMzIgY3B1UG9ydDsKKwlNVl8zMiBjb25uZWN0ZWRQb3J0W01WX0VUSF9NQVhfUE9SVFNdOworCU1WXzMyIHNtaVNjYW5Nb2RlOworCU1WXzMyIHF1YWRQaHlBZGRyOworCU1WX1UzMiBmb3JjZUxpbmtNYXNrOyAvKiBCaXRtYXNrIG9mIHN3aXRjaCBwb3J0cyB0byBoYXZlIGZvcmNlIGxpbmsgKDFHYnBzKSAqLworfTsKKwogdHlwZWRlZiBlbnVtIF9TYXRSc3RhdHVzIHsKIAlTQVRSX1JFQURfT05MWSA9IDB4MDEsCiAJU0FUUl9TV0FQX0JJVCAgPSAweDAyLApAQCAtMjA3LDYgKzIyMCwxOCBAQAogCU1WX1U4IGdwcFBpbk51bTsKIH0gTVZfQk9BUkRfR1BQX0lORk87CiAKK3R5cGVkZWYgZW51bSBfbXZJb0V4cGFuZGVyVHlwZUlEIHsKKwlNVl9JT19FWFBBTkRFUl9VU0JfVkJVUywKKwlNVl9JT19FWFBBTkRFUl9NQVhfT1BUSU9OCit9IE1WX0lPX0VYUEFOREVSX1RZUEVfSUQ7CisKK3R5cGVkZWYgc3RydWN0IF9ib2FyZElvRXhhcG5kZXJUeXBlc0luZm8geworCU1WX0lPX0VYUEFOREVSX1RZUEVfSUQgaW9GaWVsZGlkOworCU1WX1UzMiBvZmZzZXQ7CisJTVZfVTMyIGV4cGFuZGVyTnVtOworCU1WX1UzMiByZWdOdW07Cit9IE1WX0JPQVJEX0lPX0VYUEFOREVSX1RZUEVfSU5GTzsKKwogdHlwZWRlZiBzdHJ1Y3QgX2JvYXJkVHdzaUluZm8gewogCU1WX0JPQVJEX1RXU0lfQ0xBU1MgZGV2Q2xhc3M7CiAJTVZfVTggZGV2Q2xhc3NJZDsKQEAgLTMyNCw2ICszNDksOSBAQAogCU1WX0JPQVJEX01BQ19JTkZPICpwQm9hcmRNYWNJbmZvOwogCU1WX1U4IG51bUJvYXJkR3BwSW5mbzsKIAlNVl9CT0FSRF9HUFBfSU5GTyAqcEJvYXJkR3BwSW5mbzsKKwlNVl9VOCBudW1Cb2FyZElvRXhwUGluSW5mbzsKKwlNVl9CT0FSRF9JT19FWFBBTkRFUl9UWVBFX0lORk8gKnBCb2FyZElvRXhwUGluSW5mbzsKKwogCU1WX1U4IGFjdGl2ZUxlZHNOdW1iZXI7CiAJTVZfVTggKnBMZWRHcHBQaW47CiAJTVZfVTggbGVkc1BvbGFyaXR5OyAgICAgLyogJzAnIG9yICcxJyB0byB0dXJuIG9uIGxlZCAqLwpAQCAtMzQwLDYgKzM2OCw3IEBACiAJTVZfVTMyIGdwcFBvbGFyaXR5VmFsTG93OwogCU1WX1UzMiBncHBQb2xhcml0eVZhbE1pZDsKIAlNVl9VMzIgZ3BwUG9sYXJpdHlWYWxIaWdoOworCU1WX1ZPSUQgKCpncHBQb3N0Q29uZmlnQ2FsbEJhY2spIChzdHJ1Y3QgX2JvYXJkSW5mbyAqKTsKIAogCU1WX0JPQVJEX1VTQl9JTkZPICpwQm9hcmRVc2JJbmZvOwkvKiB1c2IyLjAgYW5kIHVzYjMuMCBwaHlzaWNhbCBwb3J0IG1hcHBpbmcgb24gYm9hcmQgKi8KIAlNVl9VOCBudW1Cb2FyZFVzYkluZm87CkBAIC0zODYsNiArNDE1LDEyIEBACiAJTVZfVTMyCW51bUlvRXhwOwogCXN0cnVjdCBNVl9CT0FSRF9JT19FWFBBTkRFUiAqcElvRXhwOwogCU1WX1UzMiAgYm9hcmRPcHRpb25zTW9kdWxlOworCU1WX0JPT0wgaXNBbWM7CQkJLyogQU1DIGFjdGl2ZTogdXNlZCBmb3IgRFQgdXBkYXRlICYgc3dpdGNoaW5nIHNlcnZpY2VzICovCisJTVZfQk9PTCBpc0F1ZGlvQ29ubmVjdGVkOwkvKiBpbmRpY2F0ZXMgaWYgU1BESUYvSTJTIGlzIGNvbm5lY3RlZCAqLworCU1WX0JPT0wgaXNUZG1Db25uZWN0ZWQ7CQkvKiBpbmRpY2F0ZXMgaWYgVERNIG1vZHVsZSBpcyBjb25uZWN0ZWQgKi8KKwkvKiBFeHRlcm5hbCBTd2l0Y2ggQ29uZmlndXJhdGlvbiAqLworCXN0cnVjdCBNVl9CT0FSRF9TV0lUQ0hfSU5GTyAqcFN3aXRjaEluZm87CisJTVZfVTMyIHN3aXRjaEluZm9OdW07CiB9IE1WX0JPQVJEX0lORk87CiAKIHN0cnVjdCBfbXZCb2FyZE1wcE1vZHVsZSB7CkBAIC0zOTUsOSArNDMwLDggQEAKIAogCiAjZGVmaW5lIE1QUF9NSUlfTU9EVUxFCQl7IHswLCAweDEwMTExMTExfSwgezEsIDB4MTExMTExMTF9LCB7MiwgMHgxMTIxMTExMX0gfQotI2RlZmluZSBNUFBfVERNX01PRFVMRQkJeyB7NiwgMHg0NTMzMzMzM30sIHs3LCAweDAwMDA0NDQ0fSB9Ci0jZGVmaW5lIE1QUF9JMlNfTU9EVUxFCQl7NiwgMHg1NTU0NDU1NH0KLSNkZWZpbmUgTVBQX1NQRElGX01PRFVMRQl7NiwgMHg1NTQ0NDQ0NH0KKyNkZWZpbmUgTVBQX1RETV9NT0RVTEUJCXsgezYsIDB4NTUzMzMzMzN9LCB7NywgMHgwMDAwNDQ0NH0gfQorI2RlZmluZSBNUFBfQVVESU9fTU9EVUxFCXs2LCAweDU1NDQ0NDQ0fQogI2RlZmluZSBNUFBfTk9SX01PRFVMRQkJeyB7MCwgMHg1NTExMTExMX0sIHsxLCAweDE1NTU1NTU1fSwgezIsIDB4NTU1NjYwMTF9LCBcCiAJCQkJICB7MywgMHg1NTU1NTA1NX0sIHs0LCAweDU1NTU1NTU1fSwgezUsIDB4NDAwNDU1MjUgfSB9CiAjZGVmaW5lIE1QUF9OQU5EX01PRFVMRQkJeyB7MCwgMHg1NTExMTExMX0sIHsxLCAweDE1NTU1NTU1fSwgezIsIDB4NTUyNjYwMTF9LCBcCkBAIC00MzYsNiArNDcwLDExIEBACiAjZGVmaW5lIE1TQVJfMF9TUEkwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIE1TQVJfMF9TUEkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAKKy8qIGRlZmluaXRpb24gZm9yIHN3aXRjaCBkZXZpY2Ugc2NhbiBtb2RlICovCisjZGVmaW5lIE1WX1NXSVRDSF9TTUlfQVVUT19TQ0FOX01PREUgICAgICAgICAwICAgIC8qIFNjYW4gMCBvciAweDEwIGJhc2UgYWRkcmVzcyB0byBmaW5kIHRoZSBRRCAqLworI2RlZmluZSBNVl9TV0lUQ0hfU01JX01BTlVBTF9NT0RFICAgICAgICAgICAgMSAgICAvKiBVc2UgUUQgbG9jYXRlZCBhdCBtYW51YWxseSBkZWZpbmVkIGJhc2UgYWRkciAqLworI2RlZmluZSBNVl9TV0lUQ0hfU01JX01VTFRJX0FERFJfTU9ERSAgICAgICAgMiAgICAvKiBVc2UgUUQgYXQgYmFzZSBhZGRyIGFuZCB1c2UgaW5kaXJlY3QgYWNjZXNzICovCisKIE1WX1ZPSUQgbXZCb2FyZEVudkluaXQoTVZfVk9JRCk7CiBNVl9VMTYgbXZCb2FyZE1vZGVsR2V0KE1WX1ZPSUQpOwogTVZfVTMyIG12Qm9hcmRSZXZHZXQoTVZfVk9JRCk7CkBAIC00NjYsOCArNTA1LDExIEBACiBNVl9WT0lEIG12Qm9hcmRSZXNldChNVl9WT0lEKTsKIE1WX0JPQVJEX1BFWF9JTkZPICptdkJvYXJkUGV4SW5mb0dldCh2b2lkKTsKIE1WXzMyIG12Qm9hcmRSZXNldEdwaW9QaW5HZXQoTVZfVk9JRCk7CisjaWZkZWYgTVZfVVNCX1ZCVVNfQ1lDTEUKIE1WXzMyIG12Qm9hcmRVU0JWYnVzR3Bpb1BpbkdldChNVl8zMiBkZXZJZCk7Ci1NVl8zMiBtdkJvYXJkVVNCVmJ1c0VuR3Bpb1BpbkdldChNVl8zMiBkZXZJZCk7CitNVl9TVEFUVVMgbXZCb2FyZElvRXhwYW5kZXJUeXBlR2V0KE1WX0lPX0VYUEFOREVSX1RZUEVfSUQgaW9DbGFzcywgTVZfQk9BUkRfSU9fRVhQQU5ERVJfVFlQRV9JTkZPICppb0luZm8pOworTVZfVk9JRCBtdkJvYXJkVXNiVmJ1c1NldChpbnQgZGV2KTsKKyNlbmRpZgogTVZfQk9PTCBtdkJvYXJkSXNPdXJQY2lTbG90KE1WX1UzMiBidXNOdW0sIE1WX1UzMiBzbG90TnVtKTsKIE1WX1UzMiBtdkJvYXJkR3Bpb0ludE1hc2tHZXQoTVZfVTMyIGdwcEdycCk7CiBNVl9VMzIgbXZCb2FyZFNsaWNVbml0VHlwZUdldChNVl9WT0lEKTsKQEAgLTUwOSw3ICs1NTEsNyBAQAogTVZfU1RBVFVTIG12Qm9hcmRUd3NpU2V0KE1WX0JPQVJEX1RXU0lfQ0xBU1MgdHdzaUNsYXNzLCBNVl9VOCBkZXZOdW0sIE1WX1U4IHJlZ051bSwgTVZfVTggKnJlZ1ZhbCwgTVZfVTMyIGxlbik7CiBNVl9VOCBtdkJvYXJkQ3B1RnJlcUdldChNVl9WT0lEKTsKIE1WX1NUQVRVUyBtdkJvYXJkQ3B1RnJlcVNldChNVl9VOCBmcmVxVmFsKTsKLU1WX1NUQVRVUyBtdkJvYXJkSXNJbnRlcm5hbFN3aXRjaENvbm5lY3RlZCh2b2lkKTsKK01WX1NUQVRVUyBtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQodm9pZCk7CiBNVl9VMzIgbXZCb2FyZFN3aXRjaFBvcnRGb3JjZUxpbmtHZXQoTVZfVTMyIHN3aXRjaElkeCk7CiBNVl9VMzIgbXZCb2FyZEZyZXFNb2Rlc051bUdldCh2b2lkKTsKIE1WXzMyIG12Qm9hcmRTbWlTY2FuTW9kZUdldChNVl9VMzIgc3dpdGNoSWR4KTsKQEAgLTUxNyw2ICs1NTksMTAgQEAKIE1WX1ZPSUQgbXZCb2FyZE1hY1NwZWVkU2V0KE1WX1UzMiBldGhQb3J0TnVtLCBNVl9CT0FSRF9NQUNfU1BFRUQgc3BlZWQpOwogTVZfVk9JRCBtdkJvYXJkTWFjU3BlZWRTZXQoTVZfVTMyIGV0aFBvcnROdW0sIE1WX0JPQVJEX01BQ19TUEVFRCBtYWNTcGVlZCk7CiBNVl9VMzIgbXZCb2FyZFN3aXRjaENwdVBvcnRHZXQoTVZfVTMyIHN3aXRjaElkeCk7CitNVl8zMiBtdkJvYXJkU3dpdGNoUGh5QWRkckdldChNVl9VMzIgc3dpdGNoSWR4KTsKK01WXzMyIG12Qm9hcmRTd2l0Y2hDb25uZWN0ZWRQb3J0R2V0KE1WX1UzMiBldGhQb3J0KTsKK01WX0JPT0wgbXZCb2FyZFN3aXRjaENwdVBvcnRJc1JnbWlpKE1WX1UzMiBzd2l0Y2hJZHgpOworTVZfVk9JRCBtdkJvYXJkTW9kdWxlU3dpdGNoSW5mb1VwZGF0ZShNVl9CT09MIHN3aXRjaERldGVjdGVkKTsKIE1WX1UzMiBtdkJvYXJkTWFjQ3B1UG9ydEdldChNVl9WT0lEKTsKIE1WX0JPT0wgbXZCb2FyZElzRXRoQ29ubmVjdGVkKE1WX1UzMiBldGhOdW0pOwogTVZfQk9PTCBtdkJvYXJkSXNFdGhBY3RpdmUoTVZfVTMyIGV0aE51bSk7CkBAIC01NjksMTEgKzYxNSwyMCBAQAogTVZfU1RBVFVTIG12Qm9hcmRTeXNDb25maWdTZXQoTVZfQ09ORklHX1RZUEVfSUQgY29uZmlnRmllbGQsIE1WX1U4IHZhbHVlKTsKIHZvaWQgbXZCb2FyZEVlcHJvbVZhbGlkU2V0KHZvaWQpOwogI2VuZGlmIC8qIENPTkZJR19DTURfQk9BUkRDRkcgKi8KK01WX0JPT0wgbXZCb2FyZElzVGRtQ29ubmVjdGVkKHZvaWQpOwordm9pZCBtdkJvYXJkVGRtQ29ubmVjdGlvblNldChNVl9CT09MIGlzQ29ubmVjdGVkKTsKIE1WX05BTkRfSUZfTU9ERSBtdkJvYXJkTmFuZElmR2V0KHZvaWQpOwogTVZfQk9PTCBtdkJvYXJkaXNTZGlvQ29ubmVjdGVkKHZvaWQpOwogTVZfVk9JRCBtdkJvYXJkU2Rpb0Nvbm5lY3Rpb25TZXQoTVZfQk9PTCBzdGF0dXMpOwogTVZfQk9PTCBtdkJvYXJkSXNVc2JQb3J0Q29ubmVjdGVkKE1WX1VOSVRfSUQgdXNiVHlwZUlELCBNVl9VOCB1c2JQb3J0TnVtYmVyKTsKIE1WX0JPQVJEX0lORk8gKm12Qm9hcmRJbmZvU3RydWN0dXJlR2V0KE1WX1ZPSUQpOworTVZfQk9PTCBtdkJvYXJkSXNBdWRpb0Nvbm5lY3RlZCh2b2lkKTsKK3ZvaWQgbXZCb2FyZEF1ZGlvQ29ubmVjdGlvblNldChNVl9CT09MIGlzQ29ubmVjdGVkKTsKK01WX0JPT0wgbXZCb2FyZElzVXNiM1BvcnREZXZpY2UoTVZfVTMyIHBvcnQpOworCisjaWZkZWYgQ09ORklHX1NXSVRDSElOR19TRVJWSUNFUworTVZfQk9PTCBtdkJvYXJkaXNBbWModm9pZCk7CisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzh4LmMgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzh4LmMKaW5kZXggZmIyNzc1MS4uNGMyZWQ5NCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYjM4eC5jCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIzOHguYwpAQCAtOTksNiArOTksNTYgQEAKIAlyZXR1cm4gTVZfUE9SVF9UWVBFX1VOS05PV047CiB9CiAKKyNpZmRlZiBDT05GSUdfU1dJVENISU5HX1NFUlZJQ0VTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkaXNBbWMKKyogREVTQ1JJUFRJT046IHJldHVybiB0cnVlIGlmIGJvYXJkIGlzIEFNQworKgorKiBJTlBVVDogIE5vbmUKKyogT1VUUFVUOiBOb25lLgorKiBSRVRVUk46IE1WX1RSVUU6IGlmIGJvYXJkIGlzIEFNQworKiAgICAgICAgIE1WX0ZBTFNFOiBlbHNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBtdkJvYXJkaXNBbWModm9pZCkKK3sKKwlNVl9CT0FSRF9JTkZPICpib2FyZCA9IG12Qm9hcmRJbmZvU3RydWN0dXJlR2V0KCk7CisJaWYgKGJvYXJkKQorCQlyZXR1cm4gYm9hcmQtPmlzQW1jOworCisJREIobXZPc1ByaW50ZigiJXM6IEVycm9yOiBib2FyZCBzdHJ1Y3R1cmUgbm90IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXykpOworCXJldHVybiBNVl9GQUxTRTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkSXNVc2IzUG9ydERldmljZQorKiBERVNDUklQVElPTjogcmV0dXJuIHRydWUgVVNCMyBwb3J0IGlzIGluIGRldmljZSBtb2RlCisqCisqIElOUFVUOiAgcG9ydAkJLSBwb3J0IG51bWJlcgorKiBPVVRQVVQ6IE5vbmUuCisqIFJFVFVSTjogTVZfVFJVRTogaWYgcG9ydCBpcyBzZXQgdG8gZGV2aWNlIG1vZGUKKyogICAgICAgICBNVl9GQUxTRTogb3RoZXJ3aXNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBtdkJvYXJkSXNVc2IzUG9ydERldmljZShNVl9VMzIgcG9ydCkKK3sKKwlNVl9VMzIgYm9hcmRJZCwgc2F0clJlYWRSZXN1bHQ7CisKKwlpZiAocG9ydCA8IDAgfHwgcG9ydCA+PSBNVl9VU0IzX01BWF9IT1NUX1BPUlRTKQorCQlyZXR1cm4gTVZfRkFMU0U7CisKKwlib2FyZElkID0gbXZCb2FyZElkR2V0KCk7CisJLyogc2luY2UgJ3VzYjNwb3J0MCcgYW5kICd1c2IzcG9ydDEnIGFyZSBvbmx5IHN1cHBvcnRlZCBvbgorCSAqIERCLUJQIGFuZCBEQi02ODIxLUJQLCByZXR1cm4gTVZfRkFMU0UgaWYgd2UgYXJlIG5vdCBvbiB0aGVzZSBib2FyZHMgKi8KKwlpZiAoIShib2FyZElkID09IERCXzY4WFhfSUQgfHwgYm9hcmRJZCA9PSBEQl9CUF82ODIxX0lEKSkKKwkJcmV0dXJuIE1WX0ZBTFNFOworCisJc2F0clJlYWRSZXN1bHQgPSBtdkJvYXJkU2F0UlJlYWQoKE1WX1UzMilNVl9TQVRSX0RCX1VTQjNfUE9SVDAgKyBwb3J0KTsKKwlpZiAoc2F0clJlYWRSZXN1bHQgIT0gTVZfRVJST1IgJiYgc2F0clJlYWRSZXN1bHQpCisJCXJldHVybiBNVl9UUlVFOworCisJcmV0dXJuIE1WX0ZBTFNFOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkSXNQb3J0SW5TZ21paSAtCiAqCkBAIC0zMjgsOCArMzc4LDYgQEAKIAogCQlpZiAoKG12Qm9hcmRJc01vZHVsZUNvbm5lY3RlZChNVl9NT0RVTEVfREIzODFfTU1DXzhCSVRfT05fQk9BUkQpKSkKIAkJCW12Qm9hcmRTZGlvQ29ubmVjdGlvblNldChNVl9UUlVFKTsKLQkJZWxzZQotCQkJbXZCb2FyZFNkaW9Db25uZWN0aW9uU2V0KE1WX0ZBTFNFKTsKIAogCQltdkJvYXJkSW9FeHBhbmRlclVwZGF0ZSgpOwogCQltdkJvYXJkUGNpZU1vZHVsZXNJbmZvVXBkYXRlKCk7CS8qIGlmIFBDSWUgbW9kdWxlcyBhcmUgY29uZmlndXJlZCAodmlhICdTYXRSJykgKi8KQEAgLTM1Myw2ICs0MDEsMjUgQEAKIAkJaWYgKChtdkJvYXJkSXNNb2R1bGVDb25uZWN0ZWQoTVZfTU9EVUxFX01JSSkpKQkvKiBNSUkgTW9kdWxlIHVzZXMgZGlmZmVyZW50IFBIWSBhZGRyZXNzICovCiAJCQltdkJvYXJkUGh5QWRkclNldCgwLCA4KTsJLypzZXQgU01JIGFkZHJlc3MgOCBmb3IgcG9ydCAwKi8KIAorCQlpZiAobXZCb2FyZElzTW9kdWxlQ29ubmVjdGVkKE1WX01PRFVMRV9TUERJRl9ERVZJQ0UpIHx8CisJCQkJbXZCb2FyZElzTW9kdWxlQ29ubmVjdGVkKE1WX01PRFVMRV9JMlNfREVWSUNFKSkgeworCQkJLyogVERNLCBBdWRpbyBhbmQgU2RpbyBoYXZlIG1wcCdzIGNvbmZsaWN0CisJCQkgKiAtLT4gZGlzYWJsZSBTZGlvIGFuZCBURE0gd2hlbiBTUERJRiBpcyBjb25uZWN0ZWQgKi8KKwkJCW12Qm9hcmRBdWRpb0Nvbm5lY3Rpb25TZXQoTVZfVFJVRSk7CisJCQltdkJvYXJkU2Rpb0Nvbm5lY3Rpb25TZXQoTVZfRkFMU0UpOworCQkJbXZCb2FyZFRkbUNvbm5lY3Rpb25TZXQoTVZfRkFMU0UpOworCQl9IGVsc2UgaWYgKG12Qm9hcmRTYXRSUmVhZChNVl9TQVRSX1RETV9DT05ORUNURUQpID09IDApIHsKKwkJCS8qIGlmIEF1ZGlvIG1vZHVsZXMgZGV0ZWN0ZWQsIHNraXAgcmVhZGluZyBURE0gZnJvbSBTYXRSICovCisKKwkJCS8qIFRETSwgQXVkaW8gYW5kIFNkaW8gaGF2ZSBtcHAncyBjb25mbGljdAorCQkJICogLS0+IGRpc2FibGUgQXVkaW8gYW5kIFNkaW8gd2hlbiBURE0gaXMgY29ubmVjdGVkICovCisJCQltdkJvYXJkVGRtQ29ubmVjdGlvblNldChNVl9UUlVFKTsKKwkJCW12Qm9hcmRBdWRpb0Nvbm5lY3Rpb25TZXQoTVZfRkFMU0UpOworCQkJbXZCb2FyZFNkaW9Db25uZWN0aW9uU2V0KE1WX0ZBTFNFKTsKKwkJCS8qIHVwZGF0ZSBEVDogdXNlZCBmb3IgTGludXggb25seSAqLworCQkJbXZCb2FyZFNldERldlN0YXRlKDEsIEJPQVJEX0RFVl9TUElfRkxBU0gsIE1WX1RSVUUpOworCQl9CisKIAkJLyogVXBkYXRlIE1QUCBncm91cCB0eXBlcyBhbmQgdmFsdWVzIGFjY29yZGluZyB0byBib2FyZCBjb25maWd1cmF0aW9uICovCiAJCW12Qm9hcmRNcHBJZFVwZGF0ZSgpOwogCQkvKiBib2FyZCBvbiB0ZXN0IG1vZGUgICovCkBAIC0zNjYsNiArNDMzLDggQEAKIAogCQltdkJvYXJkUGNpZU1vZHVsZXNJbmZvVXBkYXRlKCk7CS8qIGlmIFBDSWUgbW9kdWxlcyBhcmUgY29uZmlndXJlZCAodmlhICdTYXRSJykgKi8KIAkJbXZCb2FyZEZsYXNoRGV2aWNlVXBkYXRlKCk7CisJCW12Qm9hcmRNb2R1bGVTd2l0Y2hJbmZvVXBkYXRlKG12Qm9hcmRJc01vZHVsZUNvbm5lY3RlZChNVl9NT0RVTEVfU1dJVENIKSk7CisJCW12Qm9hcmRJb0V4cGFuZGVyVXBkYXRlKCk7CiAJCWJyZWFrOwogCWNhc2UgREJfQU1DXzY4MjBfSUQ6CiAJCS8qIG5vdGhpbmcgdG8gYmUgdXBkYXRlZCBhdCBydW4tdGltZSBmb3IgQU1DIGJvYXJkICovCkBAIC00MjUsMTIgKzQ5NCwxMyBAQAogCQkiU0RJTyA0Yml0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCSJTR01JSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQkiREItMzgxIFNMTS0xNDI2IChTR01JSS0yKSIsICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkiU1dJVENIIiwJCQlcCiAJfTsKIAltdk9zT3V0cHV0KCJCb2FyZCBjb25maWd1cmF0aW9uIGRldGVjdGVkOlxuIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTVZfTU9EVUxFX1RZUEVfTUFYX01PRFVMRTsgaSsrKSB7CiAJCWlmIChtdkJvYXJkSXNNb2R1bGVDb25uZWN0ZWQoMSA8PCBpKSkKIAkJCW12T3NPdXRwdXQoIiAgICAgICAlcyBtb2R1bGUuXG4iLCBtb2R1bGVTdHJbaV0pOwotCiAJfQogfQorCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzh4LmggYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzh4LmgKaW5kZXggZjIyMDY3Yi4uYWI4YjQyMCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYjM4eC5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIzOHguaApAQCAtNzksNiArNzksNyBAQAogCU1WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkOwogCU1WXzMyIGJvYXJkRXRoU21pQWRkcjsKIAlNVl8zMiBib2FyZEV0aFNtaUFkZHIwOworCU1WX0JPT0wgYm9hcmRNYWNFbmFibGVkOwogfSBNVl9CT0FSRF9NQUNfSU5GTzsKIAogZW51bSB7CkBAIC05OSw2ICsxMDAsNyBAQAogeyBNVl9NT0RVTEVfU0RJTywJCTB4NCwJMCwJIDB4MiwJeyAwLCAxLCAwLCAwLCAwLCAwLCAwfSB9LCBcCiB7IE1WX01PRFVMRV9TR01JSSwJCTB4MiwJMCwJIDB4RiwJeyAwLCAxLCAwLCAwLCAwLCAwLCAwfSB9LCBcCiB7IE1WX01PRFVMRV9EQjM4MV9TR01JSSwJMHgwLAkwLAkgMHgyLAl7IDAsIDAsIDAsIDAsIDAsIDEsIDB9IH0sIFwKK3sgTVZfTU9EVUxFX1NXSVRDSCwJCTB4NSwJMCwJIDB4RSwJeyAwLCAxLCAwLCAwLCAwLCAwLCAwfSB9LCBcCiB9OwogCiB0eXBlZGVmIGVudW0gX212U2F0UlR5cGVJRCB7CkBAIC0xMjgsNiArMTMwLDExIEBACiAJTVZfU0FUUl9ERVZJQ0VfSUQyLAogCU1WX1NBVFJfR1BfU0VSREVTMV9DRkcsCiAJTVZfU0FUUl9HUF9TRVJERVMyX0NGRywKKwlNVl9TQVRSX0ZVTExfRkxBVk9SLAorCU1WX1NBVFJfVERNX0NPTk5FQ1RFRCwKKwlNVl9TQVRSX1RETV9QTEFDRV9IT0xERVIsCisJTVZfU0FUUl9CT0FSRF9TUEVFRCwKKwlNVl9TQVRSX0FWU19TS0lQLAogCU1WX1NBVFJfTUFYX09QVElPTiwKIH0gTVZfU0FUUl9UWVBFX0lEOwogCkBAIC0xNDIsNyArMTQ5LDcgQEAKIHsiZGRyYnVzd2lkdGgiLAlNVl9TQVRSX0REUl9CVVNfV0lEVEgsCQkweDA4LAkzLAkwLAkwLAl7MSwgMSwgMSwgMSwgMSwgMCwgMX0sIDB9LFwKIHsiZGRyZWNjZW5hYmxlIiwJTVZfU0FUUl9ERFJfRUNDX0VOQUJMRSwJMHgxMCwJNCwJMCwJMCwJezEsIDEsIDEsIDEsIDEsIDEsIDF9LCAwfSxcCiB7ImRkcmVjY3B1cHNlbGVjdCIsCU1WX1NBVFJfRERSX0VDQ19QVVBfU0VMLCAweDIwLAk1LAkwLAkwLAl7MCwgMSwgMCwgMCwgMCwgMCwgMX0sIDB9LFwKLXsic2dtaWlzcGVlZCIsIE1WX1NBVFJfU0dNSUlfU1BFRUQsCQkweDQwLAk2LAkwLAkwLAl7MSwgMSwgMSwgMSwgMSwgMSwgMX0sIDB9LFwKK3sic2dtaWlzcGVlZCIsIE1WX1NBVFJfU0dNSUlfU1BFRUQsCQkweDQwLAk2LAkwLAkwLAl7MSwgMSwgMSwgMSwgMSwgMSwgMH0sIDB9LFwKIHsiYm9vdHNyYyIsCU1WX1NBVFJfQk9PVF9ERVZJQ0UsCQkweDMsCTAsCTMsCTAsCXswLCAxLCAwLCAwLCAwLCAxLCAwfSwgU0FUUl9TV0FQX0JJVH0sXAogeyJib2Fyc3JjMiIsCU1WX1NBVFJfQk9PVDJfREVWSUNFLAkJMHgxRSwJMSwJMiwJMCwJezAsIDEsIDAsIDAsIDAsIDEsIDB9LCBTQVRSX1NXQVBfQklUfSxcCiB7ImJvYXJkaWQiLAlNVl9TQVRSX0JPQVJEX0lELAkJMHg3LAkwLAkwLAkwLAl7MSwgMSwgMSwgMSwgMSwgMSwgMX0sIDB9LFwKQEAgLTE1OCw4ICsxNjUsMTYgQEAKIHsic2dtaWltb2RlIiwJTVZfU0FUUl9TR01JSV9NT0RFLAkJMHg0MCwJNiwJMCwJMSwJezAsIDEsIDAsIDAsIDEsIDEsIDF9LCAwfSxcCiB7ImRldmlkIiwJTVZfU0FUUl9ERVZJQ0VfSUQsCQkweDEsCTAsCTIsCTAsCXswLCAxLCAwLCAwLCAwLCAwLCAwfSwgMH0sXAogeyJkZXZpZDIiLAlNVl9TQVRSX0RFVklDRV9JRDIsCQkweDEwLAk0LAkzLAkwLAl7MCwgMSwgMCwgMCwgMCwgMCwgMH0sIDB9LFwKK3siZmxhdm9yIiwJTVZfU0FUUl9GVUxMX0ZMQVZPUiwJCTB4MTAsCTQsCTAsCTIsCXswLCAxLCAwLCAxLCAxLCAxLCAwfSwgMH0sXAoreyJ0ZG0iLAkJTVZfU0FUUl9URE1fQ09OTkVDVEVELAkJMHgyMCwJNSwJMCwJMiwJezAsIDEsIDAsIDAsIDAsIDAsIDB9LCAwfSxcCit7InRkbXBsYWNlaG9sZGVyIiwJTVZfU0FUUl9URE1fUExBQ0VfSE9MREVSLAkweDQwLAk2LAkwLAkyLAl7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIDB9LFwKK3siYXZzc2tpcCIsCU1WX1NBVFJfQVZTX1NLSVAsCQkweDgwLAk3LAkwLAkyLAl7MCwgMSwgMCwgMSwgMSwgMSwgMX0sIDB9LFwKK3siYm9hcmRzcGVlZCIsCU1WX1NBVFJfQk9BUkRfU1BFRUQsCQkweDMsCTAsCTAsCTMsCXswLCAxLCAwLCAxLCAxLCAwLCAxfSwgU0FUUl9SRUFEX09OTFl9LFwKIHsibWF4X29wdGlvbiIsCU1WX1NBVFJfTUFYX09QVElPTiwJCTB4MCwJMCwJMCwJMCwJezAsIDAsIDAsIDAsIDAsIDAsIDB9LCAwfSxcCiB9OworLyogdGRtIHBsYWNlIGhvbGRlciBpcyB1c2VkIGZvciBmdXR1cmUgc3VwcG9ydCBmb3IgbXVsdGlwbGUgdGRtIGRldmljZXMgKi8KKy8qIGF2c3NraXAgaXMgdXNlZCB0byBza2lwIHNlbGVjdGluZyBBVlMgZnJvbSBFRlVTRToKKyAqCS0gdXNlZCBpbiBiaW5hcnkgaGVhZGVyIGJ5IE1hcnZlbGwgYm9hcmRzIG9ubHkqLwogCiAvKiBleHRyYSBTQVIgdGFibGUsIGZvciBkaWZmZXJlbnQgYm9hcmQgaW1wbGVtZW50YXRpb25zOgogICogaW4gY2FzZSBhIGZpZWxkIGlzIHVzZWQgb24gMiBib2FyZHMgd2l0aCBkaWZmZXJlbnQgaTJjIG1hcHBpbmcgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIzOXguYyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIzOXguYwppbmRleCAxOTI4ZWRmLi43ZGUxYWMxIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzl4LmMKKysrIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYjM5eC5jCkBAIC02MjUsMyArNjI1LDE4IEBACiAJCQltdk9zT3V0cHV0KCJ8ICAgICBJbi1CYW5kICB8XG4iKTsKIAl9CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRJc1VzYjNQb3J0RGV2aWNlCisqIERFU0NSSVBUSU9OOiByZXR1cm4gdHJ1ZSBVU0IzIHBvcnQgaXMgaW4gZGV2aWNlIG1vZGUKKyoKKyogSU5QVVQ6ICBwb3J0CQktIHBvcnQgbnVtYmVyCisqIE9VVFBVVDogTm9uZS4KKyogUkVUVVJOOiBNVl9UUlVFOiBpZiBwb3J0IGlzIHNldCB0byBkZXZpY2UgbW9kZQorKiAgICAgICAgIE1WX0ZBTFNFOiBvdGhlcndpc2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRJc1VzYjNQb3J0RGV2aWNlKE1WX1UzMiBwb3J0KQoreworCS8qIFNpbmNlIHVzYjMgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQgb24gY3VycmVudCBib2FyZCByZXR1cm4gZmFsc2UgKi8KKwlyZXR1cm4gTVZfRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzl4LmggYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzl4LmgKaW5kZXggMTJkNDNlZi4uYTVhMmI5MCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYjM5eC5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIzOXguaApAQCAtODgsNiArODgsNyBAQAogCU1WXzMyIGJvYXJkRXRoU21pQWRkcjsKIAlNVl8zMiBib2FyZEV0aFNtaUFkZHIwOwogCU1WX1BIWV9ORUdPVElBVElPTl9QT1JUX1RZUEUgbmVnVHlwZTsKKwlNVl9CT09MIGJvYXJkTWFjRW5hYmxlZDsKIH0gTVZfQk9BUkRfTUFDX0lORk87CiAKIHR5cGVkZWYgZW51bSB7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYy5oIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMuaAppbmRleCA0NWRlOWI0Li5hNjkyMGE1IDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYy5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjLmgKQEAgLTgzLDggKzgzLDkgQEAKICNkZWZpbmUgQTM4WF9DVVRPTUVSX0JPQVJEX0lEX0JBU0UJCTB4MAogI2RlZmluZSBBMzhYX0NVU1RPTUVSX0JPQVJEX0lEMAkJCShBMzhYX0NVVE9NRVJfQk9BUkRfSURfQkFTRSArIDApCiAjZGVmaW5lIEEzOFhfQ1VTVE9NRVJfQk9BUkRfSUQxCQkJKEEzOFhfQ1VUT01FUl9CT0FSRF9JRF9CQVNFICsgMSkKLSNkZWZpbmUgQTM4WF9HRkNIMTAwX0lECQkJCShBMzhYX0NVVE9NRVJfQk9BUkRfSURfQkFTRSArIDIpCi0jZGVmaW5lIEEzOFhfTVZfTUFYX0NVU1RPTUVSX0JPQVJEX0lECQkoQTM4WF9DVVRPTUVSX0JPQVJEX0lEX0JBU0UgKyAzKQorI2RlZmluZSBBMzhYX0NMRUFSRk9HX0JPQVJEX0lECQkJKEEzOFhfQ1VUT01FUl9CT0FSRF9JRF9CQVNFICsgMikKKyNkZWZpbmUgQTM4WF9HRkNIMTAwX0lECQkJCShBMzhYX0NVVE9NRVJfQk9BUkRfSURfQkFTRSArIDMpCisjZGVmaW5lIEEzOFhfTVZfTUFYX0NVU1RPTUVSX0JPQVJEX0lECQkoQTM4WF9DVVRPTUVSX0JPQVJEX0lEX0JBU0UgKyA0KQogI2RlZmluZSBBMzhYX01WX0NVU1RPTUVSX0JPQVJEX05VTQkJKEEzOFhfTVZfTUFYX0NVU1RPTUVSX0JPQVJEX0lEIC0gQTM4WF9DVVRPTUVSX0JPQVJEX0lEX0JBU0UpCiAKIC8qIEFybWFkYS0zOHggTWFydmVsbCBib2FyZHMgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjMzh4LmMgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYzM4eC5jCmluZGV4IGZjNTM0ZjcuLmE1ZTFlNGQgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjMzh4LmMKKysrIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMzOHguYwpAQCAtNjYsNiArNjYsNyBAQAogI2luY2x1ZGUgImJvYXJkRW52L212Qm9hcmRFbnZTcGVjLmgiCiAjaW5jbHVkZSAidHdzaS9tdlR3c2kuaCIKICNpbmNsdWRlICJwZXgvbXZQZXhSZWdzLmgiCisjaW5jbHVkZSAiZ3BwL212R3BwUmVncy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ3VzdG9tZXIgQm9hcmRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgxLDE1ICs4MiwxNyBAQAogCiBNVl9CT0FSRF9UV1NJX0lORk8gYXJtYWRhXzM4eF9jdXN0b21lcl8wX0JvYXJkVHdzaURldltdID0gewogCS8qIHt7TVZfQk9BUkRfREVWX0NMQVNTIGRldkNsYXNzLCBNVl9VOCBkZXZDbGFzc0lkLCAgTVZfVTggdHdzaURldkFkZHIsIE1WX1U4IHR3c2lEZXZBZGRyVHlwZX19ICovCi0JeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkwLAkweDU3LCBBRERSN19CSVQsIE1WX1RSVUV9LCAgLyogcmVhZCBvbmx5IGZvciBIVyBjb25maWd1cmF0aW9uICovCi0JeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkxLAkweDRDLCBBRERSN19CSVQsIE1WX0ZBTFNFfSwKLQl7IEJPQVJEX1RXU0lfSU9fRVhQQU5ERVIsCTAsCTB4MjAsIEFERFI3X0JJVCwgTVZfRkFMU0V9LAotCXsgQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwJMSwJMHgyMSwgQUREUjdfQklULCBNVl9GQUxTRX0sCisJeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkJMCwJMHg1NywJQUREUjdfQklULCBNVl9UUlVFfSwgIC8qIHJlYWQgb25seSBmb3IgSFcgY29uZmlndXJhdGlvbiAqLworCXsgQk9BUkRfREVWX1RXU0lfU0FUUiwJCTEsCTB4NEMsCUFERFI3X0JJVCwgTVZfRkFMU0V9LAorCXsgQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwJMCwJMHgyMSwJQUREUjdfQklULCBNVl9GQUxTRX0sCiB9OworCiBNVl9CT0FSRF9NQUNfSU5GTyBhcm1hZGFfMzh4X2N1c3RvbWVyXzBfQm9hcmRNYWNJbmZvW10gPSB7Ci0JLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLwotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MX0sCisJLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwKKwkgICBNVl8zMiBib2FyZEV0aFNtaUFkZHIwICwgTVZfQk9PTCBib2FyZE1hY0VuYWJsZWQ7fX0gKi8KKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgxLCAweDEsIE1WX1RSVUV9LAorCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9GQUxTRX0sCiB9OwogCiBNVl9ERVZfQ1NfSU5GTyBhcm1hZGFfMzh4X2N1c3RvbWVyXzBfQm9hcmREZUNzSW5mb1tdID0gewpAQCAtMTIzLDE2ICsxMjYsMzIgQEAKIH07CiAKIHN0cnVjdCBNVl9CT0FSRF9JT19FWFBBTkRFUiBhcm1hZGFfMzh4X2N1c3RvbWVyXzBfSW9FeHBhbmRlckluZm9bXSA9IHsKLQl7MCwgNiwgMHhGNH0sIC8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzOiBCaXQgb24gLS0+IElucHV0IGJpdHMgICovCi0JezAsIDcsIDB4QzN9LCAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyczogQml0IG9uIC0tPiBJbnB1dCBiaXRzICAqLwotCXswLCAyLCAweDBCfSwgLyogT3V0cHV0IERhdGEsIHJlZ2lzdGVyIzAgKi8KLQl7MCwgMywgMHgxOH0sIC8qIE91dHB1dCBEYXRhLCByZWdpc3RlciMxICovCi0JezEsIDYsIDB4RTd9LCAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyczogQml0IG9uIC0tPiBJbnB1dCBiaXRzICAqLwotCXsxLCA3LCAweEY5fSwgLyogQ29uZmlndXJhdGlvbiByZWdpc3RlcnM6IEJpdCBvbiAtLT4gSW5wdXQgYml0cyAgKi8KLQl7MSwgMiwgMHgwOH0sIC8qIE91dHB1dCBEYXRhLCByZWdpc3RlciMwICovCi0JezEsIDMsIDB4MDB9ICAvKiBPdXRwdXQgRGF0YSwgcmVnaXN0ZXIjMSAqLworCXswLCA2LCAweEZGfSwgLyogQ29uZmlnIHJlZyMwOiBhbGwgYml0cyBhcyBpbnB1dCAoQklUIG9uID0gSW5wdXQpICovCisJezAsIDcsIDB4RkN9LCAvKiBDb25maWcgcmVnIzE6IEJJVDAoVVNCMy4wIGN1cnJlbnQgbGltaXQpLCBCSVQxKFVTQjMuMSBjdXJyZW50IGxpbWl0KSovCisJezAsIDIsIDB4RkZ9LCAvKiBPdXRwdXQgRGF0YSwgcmVnIzAgIC0gbm8gb3V0cHV0IGJpdHMqLworCXswLCAzLCAweEZGfSwgLyogT3V0cHV0IERhdGEsIHJlZyMxOiAgQklUMCxVU0IzLjBfQ1VSUkVOVD0xLCBCSVQxLFVTQjMuMV9DVVJSRU5UPTEgKi8KIH07CiAKK01WX0JPQVJEX0dQUF9JTkZPIGFybWFkYV8zOHhfY3VzdG9tZXJfMF9HcHBJbmZvW10gPSB7CisJLyoge3tNVl9CT0FSRF9HUFBfQ0xBU1MJZGV2Q2xhc3MsIE1WX1U4CWdwcFBpbk51bX19ICovCisvKiBVU0JfSG9zdDAgKi8gLyoge0JPQVJEX0dQUF9VU0JfVkJVUywgICAgNDR9LCAqLyAvKiBmcm9tIE1QUCBtYXAgKi8KK307CisKK01WX0JPQVJEX1VTQl9JTkZPIGFybWFkYV8zOHhfY3VzdG9tZXJfMF9JbmZvQm9hcmRVc2JJbmZvW10gPSB7CisvKiB7TVZfVU5JVF9JRCB1c2JUeXBlLCBNVl9VOCB1c2JQb3J0TnVtLCBNVl9CT09MRUFOIGlzQWN0aXZlfSAqLworCXsgVVNCM19VTklUX0lELCAwLCBNVl9UUlVFfSwKKwl7IFVTQjNfVU5JVF9JRCwgMSwgTVZfVFJVRX0sCisJeyBVU0JfVU5JVF9JRCwgMCwgTVZfVFJVRX0sCit9OworCisvKiBncHBfY2FsbGJhY2sgaXMgYSBnZW5lcmljIHBsYWNlIGhvbGRlciByb3V0aW5lIGZvciBzcGVjaWFsIEdQSU8gcHVsbC11cC9zb3duIHNlcXVlbmNlCisgKiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFzIHRoZSBmaW5hbCBzdGVwIG9mIG12Qm9hcmRFbnZJbml0IGZsb3cKKyAqIGZvciBleGFtcGxlIHNlZSBpbXBsZW1lbnRhdGlvbiBmb3IgU29saWRSdW4ncyBjbGVhckZvZyBib2FyZDogQTM4eF9DTEVBUkZPR19CT0FSRF9ncHBfY2FsbGJhY2sqLwordm9pZCBBMzh4X0NVU1RPTUVSX0JPQVJEXzBfZ3BwX2NhbGxiYWNrKE1WX0JPQVJEX0lORk8gKmJvYXJkKSB7CisKKwkvKiBpbXBsZW1lbnQgc3BlY2lhbCBHUElPL01QUCBwb3N0IGNvbmZpZ3VyYXRpb24gaGVyZSAqLworfQorCiBNVl9CT0FSRF9JTkZPIGFybWFkYV8zOHhfY3VzdG9tZXJfYm9hcmRfMF9pbmZvID0gewogCS5ib2FyZE5hbWUJCQk9ICJBMzh4LUN1c3RvbWVyLUJvYXJkLTAiLAogCS5udW1Cb2FyZE5ldENvbXBsZXhWYWx1ZQkJPSAwLApAQCAtMTQ3LDggKzE2NiwxMCBAQAogCS5wQm9hcmRUd3NpRGV2CQkJPSBhcm1hZGFfMzh4X2N1c3RvbWVyXzBfQm9hcmRUd3NpRGV2LAogCS5udW1Cb2FyZE1hY0luZm8JCT0gQVJSU1ooYXJtYWRhXzM4eF9jdXN0b21lcl8wX0JvYXJkTWFjSW5mbyksCiAJLnBCb2FyZE1hY0luZm8JCQk9IGFybWFkYV8zOHhfY3VzdG9tZXJfMF9Cb2FyZE1hY0luZm8sCi0JLm51bUJvYXJkR3BwSW5mbwkJPSAwLAotCS5wQm9hcmRHcHBJbmZvCQkJPSAwLAorCS5udW1Cb2FyZEdwcEluZm8JCT0gQVJSU1ooYXJtYWRhXzM4eF9jdXN0b21lcl8wX0dwcEluZm8pLAorCS5wQm9hcmRHcHBJbmZvCQkJPSBhcm1hZGFfMzh4X2N1c3RvbWVyXzBfR3BwSW5mbywKKwkubnVtQm9hcmRJb0V4cFBpbkluZm8JCT0gMCwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCQk9IDAsCiAJLmFjdGl2ZUxlZHNOdW1iZXIJCT0gMCwKIAkucExlZEdwcFBpbgkJCT0gTlVMTCwKIAkubGVkc1BvbGFyaXR5CQkJPSAwLApAQCAtMTY0LDEyICsxODUsMTYgQEAKIAkuZ3BwT3V0VmFsTWlkCQkJPSBBMzh4X0NVU1RPTUVSX0JPQVJEXzBfR1BQX09VVF9WQUxfTUlELAogCS5ncHBQb2xhcml0eVZhbExvdwkJPSBBMzh4X0NVU1RPTUVSX0JPQVJEXzBfR1BQX1BPTF9MT1csCiAJLmdwcFBvbGFyaXR5VmFsTWlkCQk9IEEzOHhfQ1VTVE9NRVJfQk9BUkRfMF9HUFBfUE9MX01JRCwKKwkuZ3BwUG9zdENvbmZpZ0NhbGxCYWNrCQk9IEEzOHhfQ1VTVE9NRVJfQk9BUkRfMF9ncHBfY2FsbGJhY2ssCiAKIAkvKiBURE0gKi8KIAkubnVtQm9hcmRUZG1JbmZvCQk9IHt9LAogCS5wQm9hcmRUZG1JbnQyQ3NJbmZvCQk9IHt9LAogCS5ib2FyZFRkbUluZm9JbmRleAkJPSAtMSwKIAorCS5wQm9hcmRVc2JJbmZvICAgICAgICAgICAgICAgICAgPSBhcm1hZGFfMzh4X2N1c3RvbWVyXzBfSW5mb0JvYXJkVXNiSW5mbywKKwkubnVtQm9hcmRVc2JJbmZvICAgICAgICAgICAgICAgID0gQVJSU1ooYXJtYWRhXzM4eF9jdXN0b21lcl8wX0luZm9Cb2FyZFVzYkluZm8pLAorCiAJLnBCb2FyZFNwZWNJbml0CQkJPSBOVUxMLAogCiAJLyogTkFORCBpbml0IHBhcmFtcyAqLwpAQCAtMTg3LDcgKzIxMiwxMCBAQAogCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX0ZBTFNFLAogCS5udW1Jb0V4cAkJCT0gQVJSU1ooYXJtYWRhXzM4eF9jdXN0b21lcl8wX0lvRXhwYW5kZXJJbmZvKSwKIAkucElvRXhwCQkJCT0gYXJtYWRhXzM4eF9jdXN0b21lcl8wX0lvRXhwYW5kZXJJbmZvLAotCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRSwKKwkuaXNBbWMJCQkJPSBNVl9GQUxTRSwKKwkucFN3aXRjaEluZm8JCQk9IE5VTEwsCisJLnN3aXRjaEluZm9OdW0JCQk9IDAKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMDIsMTAgKzIzMCwxMSBAQAogCXsgQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwJMSwJMHgyMSwgQUREUjdfQklULCBNVl9GQUxTRX0sCiB9OwogTVZfQk9BUkRfTUFDX0lORk8gYXJtYWRhXzM4eF9jdXN0b21lcl8xX0JvYXJkTWFjSW5mb1tdID0gewotCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsIE1WXzMyIGJvYXJkRXRoU21pQWRkcjA7fX0gKi8KLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MX0sCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDB9LAotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sICAtMSwgIC0xfQorCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsCisJICAgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMCAsIE1WX0JPT0wgYm9hcmRNYWNFbmFibGVkO319ICovCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgxLCAweDEsIE1WX1RSVUV9LAorCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAgLTEsICAtMSwgTVZfVFJVRX0KIH07CiAKIE1WX0RFVl9DU19JTkZPIGFybWFkYV8zOHhfY3VzdG9tZXJfMV9Cb2FyZERlQ3NJbmZvW10gPSB7CkBAIC0yNDksNiArMjc4LDI0IEBACiAJezEsIDMsIDB4QzB9ICAvKiBPdXRwdXQgRGF0YSwgcmVnaXN0ZXIjMSAqLwogfTsKIAorCitNVl9CT0FSRF9HUFBfSU5GTyBhcm1hZGFfMzh4X2N1c3RvbWVyXzFfR3BwSW5mb1tdID0geworCS8qIHt7TVZfQk9BUkRfR1BQX0NMQVNTCWRldkNsYXNzLCBNVl9VOAlncHBQaW5OdW19fSAqLworLyogVVNCX0hvc3QwICovLyogLy97Qk9BUkRfR1BQX1VTQl9WQlVTLCAgICA0NH0sKi8gLyogZnJvbSBNUFAgbWFwICovCit9OworCitNVl9CT0FSRF9VU0JfSU5GTyBhcm1hZGFfMzh4X2N1c3RvbWVyXzFfSW5mb0JvYXJkVXNiSW5mb1tdID0geworLyoge01WX1VOSVRfSUQgdXNiVHlwZSwgTVZfVTggdXNiUG9ydE51bSwgTVZfQk9PTCBpc0FjdGl2ZX0gKi8KKwl7IFVTQjNfVU5JVF9JRCwgMCwgTVZfVFJVRX0sCisJeyBVU0IzX1VOSVRfSUQsIDEsIE1WX1RSVUV9LCAgICAvKiB4SENJIHBvcnQjMSBjb25uZWN0ZWQgb25seSB2aWEgVVNCMi4wIFVUTUkgKG5vdCB2aWEgVVNCMy4wIFNlckRlcyBsYW5lKSAqLworCXsgVVNCX1VOSVRfSUQsICAwLCBNVl9UUlVFfSwKK307CisKK01WX0JPQVJEX0lPX0VYUEFOREVSX1RZUEVfSU5GTyBhcm1hZGFfMzh4X2N1c3RvbWVyXzFfaW9FeHBQaW5JbmZvW10gPSB7CisvKgl7IElPIFR5cGUgZW51bSwJCQliaXQgb2Zmc2V0LCBJby5leHAgbnVtLAkJcmVnIE51bSAqLworCXsgTVZfSU9fRVhQQU5ERVJfVVNCX1ZCVVMsCTcsCQkxLAkJM30gLyogVkJVU19FTjogSU8uZXhwIzEgKDB4MjEpLCByZWcgIzMsIGJpdCA3ICovCit9OworCiBNVl9CT0FSRF9JTkZPIGFybWFkYV8zOHhfY3VzdG9tZXJfYm9hcmRfMV9pbmZvID0gewogCS5ib2FyZE5hbWUJCQk9ICJBMzh4LUN1c3RvbWVyLUJvYXJkLTEiLAogCS5udW1Cb2FyZE5ldENvbXBsZXhWYWx1ZQk9IDAsCkBAIC0yNjMsOCArMzEwLDEwIEBACiAJLnBCb2FyZFR3c2lEZXYJCQk9IGFybWFkYV8zOHhfY3VzdG9tZXJfMV9Cb2FyZFR3c2lEZXYsCiAJLm51bUJvYXJkTWFjSW5mbwkJPSBBUlJTWihhcm1hZGFfMzh4X2N1c3RvbWVyXzFfQm9hcmRNYWNJbmZvKSwKIAkucEJvYXJkTWFjSW5mbwkJCT0gYXJtYWRhXzM4eF9jdXN0b21lcl8xX0JvYXJkTWFjSW5mbywKLQkubnVtQm9hcmRHcHBJbmZvCQk9IDAsCi0JLnBCb2FyZEdwcEluZm8JCQk9IDAsCisJLm51bUJvYXJkR3BwSW5mbwkJPSBBUlJTWihhcm1hZGFfMzh4X2N1c3RvbWVyXzFfR3BwSW5mbyksCisJLnBCb2FyZEdwcEluZm8JCQk9IGFybWFkYV8zOHhfY3VzdG9tZXJfMV9HcHBJbmZvLAorCS5udW1Cb2FyZElvRXhwUGluSW5mbwkJPSBBUlJTWihhcm1hZGFfMzh4X2N1c3RvbWVyXzFfaW9FeHBQaW5JbmZvKSwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCQk9IGFybWFkYV8zOHhfY3VzdG9tZXJfMV9pb0V4cFBpbkluZm8sCiAJLmFjdGl2ZUxlZHNOdW1iZXIJCT0gMCwKIAkucExlZEdwcFBpbgkJCT0gTlVMTCwKIAkubGVkc1BvbGFyaXR5CQkJPSAwLApAQCAtMjg4LDYgKzMzNyw5IEBACiAKIAkucEJvYXJkU3BlY0luaXQJCQk9IE5VTEwsCiAKKwkucEJvYXJkVXNiSW5mbwkJCT0gYXJtYWRhXzM4eF9jdXN0b21lcl8xX0luZm9Cb2FyZFVzYkluZm8sCisJLm51bUJvYXJkVXNiSW5mbwkJPSBBUlJTWihhcm1hZGFfMzh4X2N1c3RvbWVyXzFfSW5mb0JvYXJkVXNiSW5mbyksCisKIAkvKiBOQU5EIGluaXQgcGFyYW1zICovCiAJLm5hbmRGbGFzaFJlYWRQYXJhbXMJCT0gQTM4eF9DVVNUT01FUl9CT0FSRF8wX05BTkRfUkVBRF9QQVJBTVMsCiAJLm5hbmRGbGFzaFdyaXRlUGFyYW1zCQk9IEEzOHhfQ1VTVE9NRVJfQk9BUkRfMF9OQU5EX1dSSVRFX1BBUkFNUywKQEAgLTMwMyw3ICszNTUsMTcyIEBACiAJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfRkFMU0UsCiAJLm51bUlvRXhwCQkJPSBBUlJTWihhcm1hZGFfMzh4X2N1c3RvbWVyXzFfSW9FeHBhbmRlckluZm8pLAogCS5wSW9FeHAJCQkJPSBhcm1hZGFfMzh4X2N1c3RvbWVyXzFfSW9FeHBhbmRlckluZm8sCi0JLmJvYXJkT3B0aW9uc01vZHVsZQkJPSBNVl9NT0RVTEVfTk9fTU9EVUxFCisJLmJvYXJkT3B0aW9uc01vZHVsZQkJPSBNVl9NT0RVTEVfTk9fTU9EVUxFLAorCS5pc0FtYwkJCQk9IE1WX0ZBTFNFLAorCS5wU3dpdGNoSW5mbwkJCT0gTlVMTCwKKwkuc3dpdGNoSW5mb051bQkJCT0gMAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEEzOHggU29saWRSdW4gQ2xlYXJGb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9BUkRfVFdTSV9JTkZPIGFybWFkYV8zOHhfY2xlYXJmb2dfQm9hcmRUd3NpRGV2W10gPSB7CisJLyoge3tNVl9CT0FSRF9ERVZfQ0xBU1MgZGV2Q2xhc3MsIE1WX1U4IGRldkNsYXNzSWQsICBNVl9VOCB0d3NpRGV2QWRkciwgTVZfVTggdHdzaURldkFkZHJUeXBlfX0gKi8KKwl7IEJPQVJEX1RXU0lfSU9fRVhQQU5ERVIsCTAsCTB4MjAsIEFERFI3X0JJVCwgTVZfRkFMU0V9LAorfTsKK01WX0JPQVJEX01BQ19JTkZPIGFybWFkYV8zOHhfY2xlYXJmb2dfQm9hcmRNYWNJbmZvW10gPSB7CisJLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwKKwkgICBNVl8zMiBib2FyZEV0aFNtaUFkZHIwICwgTVZfQk9PTCBib2FyZE1hY0VuYWJsZWQ7fX0gKi8KKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCisJeyBCT0FSRF9NQUNfU1BFRURfMTAwME0sIC0xLCAtMSwgTVZfVFJVRX0sCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgIC0xLCAgLTEsIE1WX1RSVUV9Cit9OworCitNVl9ERVZfQ1NfSU5GTyBhcm1hZGFfMzh4X2NsZWFyZm9nX0JvYXJkRGVDc0luZm9bXSA9IHsKKwkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aCwgYnVzV2lkdGgsIGJ1c051bSwgYWN0aXZlIH0qLworCXsgREVWSUNFX0NTMCwJTl9BLCBCT0FSRF9ERVZfTkFORF9GTEFTSCwJOCwJOCwJMCwJTVZfRkFMU0UgfSwJLyogTkFORCBERVYgKi8KKwl7IERFVklDRV9DUzEsCU5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsCTgsCTgsCTAsCU1WX0ZBTFNFIH0sCS8qIE5BTkQgREVWICovCisJeyBERVZJQ0VfQ1MyLAlOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBOQU5EIERFViAqLworCXsgREVWSUNFX0NTMywJTl9BLCBCT0FSRF9ERVZfTkFORF9GTEFTSCwJOCwJOCwJMCwJTVZfRkFMU0UgfSwJLyogTkFORCBERVYgKi8KKwl7IERFVl9CT09DUywJTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILAkxNiwJMTYsCTAsCU1WX0ZBTFNFIH0sCS8qIE5PUiBERVYgKi8KKwl7IFNQSTBfQ1MwLAkJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBTUEkwIERFViAqLworCXsgU1BJMF9DUzEsCQlOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsCTgsCTgsCTAsCU1WX0ZBTFNFIH0sCS8qIFNQSTAgREVWICovCisJeyBTUEkwX0NTMiwJCU5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwJOCwJOCwJMCwJTVZfRkFMU0UgfSwJLyogU1BJMCBERVYgKi8KKwl7IFNQSTBfQ1MzLAkJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBTUEkwIERFViAqLworCXsgU1BJMV9DUzAsCQlOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsCTgsCTgsCTEsCU1WX1RSVUUgfSwJLyogU1BJMSBERVYgKi8KKwl7IFNQSTFfQ1MxLAkJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkxLAlNVl9GQUxTRSB9LAkvKiBTUEkxIERFViAqLworCXsgU1BJMV9DUzIsCQlOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsCTgsCTgsCTEsCU1WX0ZBTFNFIH0sCS8qIFNQSTEgREVWICovCisJeyBTUEkxX0NTMywJCU5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwJOCwJOCwJMSwJTVZfRkFMU0UgfQkvKiBTUEkxIERFViAqLworfTsKKworTVZfQk9BUkRfTVBQX0lORk8gYXJtYWRhXzM4eF9jbGVhcmZvZ19Cb2FyZE1wcENvbmZpZ1ZhbHVlW10gPSB7CisJeyB7CisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQMF83LAorCQlBMzh4X0NMRUFSRk9HX0JPQVJEX01QUDhfMTUsCisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQMTZfMjMsCisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQMjRfMzEsCisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQMzJfMzksCisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQNDBfNDcsCisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQNDhfNTUsCisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQNTZfNjMsCisJfSB9Cit9OworCitzdHJ1Y3QgTVZfQk9BUkRfSU9fRVhQQU5ERVIgYXJtYWRhXzM4eF9jbGVhcmZvZ19Jb0V4cGFuZGVySW5mb1tdID0geworCXswLCAyLCAweDQwfSwgLyogRGVhc3NlcnQgYm90aCBtaW5pIHBjaWUgcmVzZXQgc2lnbmFscyAqLworCXswLCA2LCAweGY5fSwKKwl7MCwgMiwgMHg0Nn0sIC8qIEFzc2VydCByZXNldCBzaWduYWxzIGFuZCBlbmFibGUgVVNCMyBjdXJyZW50IGxpbWl0ZXIgKi8KKwl7MCwgNiwgMHhiOX0sCisJezAsIDMsIDB4MH0sIC8qIFNldCBTRlBfVFhfRElTIHRvIHplcm8gKi8KKwl7MCwgNywgMHhiZn0sIC8qIERyaXZlIFNGUF9UWF9ESVMgdG8gemVybyAqLworfTsKKworTVZfQk9BUkRfVVNCX0lORk8gYXJtYWRhXzM4eF9jbGVhcmZvZ19JbmZvQm9hcmRVc2JJbmZvW10gPSB7CisvKiB7TVZfVU5JVF9JRCB1c2JUeXBlLCBNVl9VOCB1c2JQb3J0TnVtLCBNVl9CT09MIGlzQWN0aXZlfSAqLworCXsgVVNCM19VTklUX0lELCAwLCBNVl9UUlVFfSwKKwl7IFVTQjNfVU5JVF9JRCwgMSwgTVZfVFJVRX0sICAgIC8qIHhIQ0kgcG9ydCMxIGNvbm5lY3RlZCBvbmx5IHZpYSBVU0IyLjAgVVRNSSAobm90IHZpYSBVU0IzLjAgU2VyRGVzIGxhbmUpICovCisJeyBVU0JfVU5JVF9JRCwgIDAsIE1WX1RSVUV9LAorfTsKKworc3RydWN0IE1WX0JPQVJEX1NXSVRDSF9JTkZPIGFybWFkYV8zOHhfY2xlYXJmb2dfSW5mb1N3aXRjaEluZm9bXSA9IHsKKwl7CisJCS5pc0VuYWJsZWQgPSBNVl9UUlVFLAorCQkuaXNDcHVQb3J0UmdtaWkgPSBNVl9GQUxTRSwKKwkJLnN3aXRjaElycSA9IC0xLAkvKiBzZXQgdG8gLTEgZm9yIHVzaW5nIFBQVSovCisJCS5zd2l0Y2hQb3J0ID0gezAsIDEsIDIsIDMsIDQsIDUsIDZ9LAorCQkuY3B1UG9ydCA9IDUsCisJCS5jb25uZWN0ZWRQb3J0ID0gey0xLCA1LCAtMX0sCisJCS5zbWlTY2FuTW9kZSA9IE1WX1NXSVRDSF9TTUlfTVVMVElfQUREUl9NT0RFLAorCQkucXVhZFBoeUFkZHIgPSA0LAorCQkuZm9yY2VMaW5rTWFzayA9IDB4NjAKKwl9Cit9OworCitNVl9CT0FSRF9JT19FWFBBTkRFUl9UWVBFX0lORk8gYXJtYWRhXzM4eF9jbGVhcmZvZ19pb0V4cFBpbkluZm9bXSA9IHsKKy8qCXsgSU8gVHlwZSBlbnVtLAkJCWJpdCBvZmZzZXQsIElvLmV4cCBudW0sCQlyZWcgTnVtICovCisJeyBNVl9JT19FWFBBTkRFUl9VU0JfVkJVUywJNiwJCTAsCQkyfSAvKiBWQlVTX0VOOiBJTy5leHAjMSAoMHgyMSksIHJlZyAjMywgYml0IDcgKi8KK307CisKK3ZvaWQgQTM4eF9DTEVBUkZPR19CT0FSRF9ncHBfY2FsbGJhY2soTVZfQk9BUkRfSU5GTyAqYm9hcmQpIHsKKwkvKiBUb2dnbGUgR1BJTzQxIHRvIHJlc2V0IG9uLWJvYXJkIHN3aXRjaCBhbmQgcGh5ICovCisJLyogU2V0IEdQSU80MSBhcyBvdXRwdXQgZW5hYmxlZCAqLworCU1WX1JFR19CSVRfUkVTRVQgKEdQUF9EQVRBX09VVF9SRUcoMSksIEJJVDkpOworCS8qIHJlc2V0IG91dHB1dCB2YWx1ZSAqLworCU1WX1JFR19CSVRfUkVTRVQgKEdQUF9EQVRBX09VVF9FTl9SRUcoMSksIEJJVDkpOworCS8qIHNldCBvdXRwdXQgdmFsdWUgKi8KKwltdk9zRGVsYXkoMSk7CisJTVZfUkVHX0JJVF9TRVQgKEdQUF9EQVRBX09VVF9FTl9SRUcoMSksIEJJVDkpOworCW12T3NEZWxheSgxMCk7CisKKwkvKiB1cGRhdGUgb24tQm9hcmQgSU8gZXhwYW5kZXIgd2l0aCBwcmUtZGVmaW5lZCB2YWx1ZXM6CisJICogVVNCMyBjdXJyZW50IGxpbWl0ZXIsIGFuZCBTRlBfVFhfRElTLCBEZWFzc2VydCBhbmQgYXNzZXJ0IDIqbWluaSBQQ0llIHJlc2V0IHNpZ25hbHMsICovCisJbXZCb2FyZElvRXhwYW5kZXJVcGRhdGUoKTsKK30KKworTVZfQk9BUkRfSU5GTyBhcm1hZGFfMzh4X2NsZWFyZm9nX2JvYXJkX2luZm8gPSB7CisJLmJvYXJkTmFtZQkJCQk9ICJTb2xpZFJ1biBDbGVhckZvZy1BMSBSRVYyLjAiLAorCS5udW1Cb2FyZE5ldENvbXBsZXhWYWx1ZQkJPSAwLAorCS5wQm9hcmROZXRDb21wbGV4SW5mbwkJCT0gTlVMTCwKKwkucEJvYXJkTXBwQ29uZmlnVmFsdWUJCQk9IGFybWFkYV8zOHhfY2xlYXJmb2dfQm9hcmRNcHBDb25maWdWYWx1ZSwKKwkuaW50c0dwcE1hc2tMb3cJCQkJPSAwLAorCS5pbnRzR3BwTWFza01pZAkJCQk9IDAsCisJLmludHNHcHBNYXNrSGlnaAkJCT0gMCwKKwkubnVtQm9hcmREZXZpY2VJZgkJCT0gQVJSU1ooYXJtYWRhXzM4eF9jbGVhcmZvZ19Cb2FyZERlQ3NJbmZvKSwKKwkucERldkNzSW5mbwkJCQkJPSBhcm1hZGFfMzh4X2NsZWFyZm9nX0JvYXJkRGVDc0luZm8sCisJLm51bUJvYXJkVHdzaURldgkJCT0gQVJSU1ooYXJtYWRhXzM4eF9jbGVhcmZvZ19Cb2FyZFR3c2lEZXYpLAorCS5wQm9hcmRUd3NpRGV2CQkJCT0gYXJtYWRhXzM4eF9jbGVhcmZvZ19Cb2FyZFR3c2lEZXYsCisJLm51bUJvYXJkTWFjSW5mbwkJCT0gQVJSU1ooYXJtYWRhXzM4eF9jbGVhcmZvZ19Cb2FyZE1hY0luZm8pLAorCS5wQm9hcmRNYWNJbmZvCQkJCT0gYXJtYWRhXzM4eF9jbGVhcmZvZ19Cb2FyZE1hY0luZm8sCisJLm51bUJvYXJkR3BwSW5mbwkJCT0gMCwKKwkucEJvYXJkR3BwSW5mbwkJCQk9IDAsCisJLm51bUJvYXJkSW9FeHBQaW5JbmZvCQkJPSBBUlJTWihhcm1hZGFfMzh4X2NsZWFyZm9nX2lvRXhwUGluSW5mbyksCisJLnBCb2FyZElvRXhwUGluSW5mbwkJCT0gYXJtYWRhXzM4eF9jbGVhcmZvZ19pb0V4cFBpbkluZm8sCisJLmFjdGl2ZUxlZHNOdW1iZXIJCQk9IDAsCisJLnBMZWRHcHBQaW4JCQkJPSBOVUxMLAorCS5sZWRzUG9sYXJpdHkJCQkJPSAwLAorCisJLyogUE1VIFBvd2VyICovCisJLnBtdVB3clVwUG9sYXJpdHkJCQk9IDAsCisJLnBtdVB3clVwRGVsYXkJCQkJPSA4MDAwMCwKKworCS8qIEdQUCB2YWx1ZXMgKi8KKwkuZ3BwT3V0RW5WYWxMb3cJCQkJPSBBMzh4X0NMRUFSRk9HX0JPQVJEX0dQUF9PVVRfRU5BX0xPVywKKwkuZ3BwT3V0RW5WYWxNaWQJCQkJPSBBMzh4X0NMRUFSRk9HX0JPQVJEX0dQUF9PVVRfRU5BX01JRCwKKwkuZ3BwT3V0VmFsTG93CQkJCT0gQTM4eF9DTEVBUkZPR19CT0FSRF9HUFBfT1VUX1ZBTF9MT1csCisJLmdwcE91dFZhbE1pZAkJCQk9IEEzOHhfQ0xFQVJGT0dfQk9BUkRfR1BQX09VVF9WQUxfTUlELAorCS5ncHBQb2xhcml0eVZhbExvdwkJCT0gQTM4eF9DTEVBUkZPR19CT0FSRF9HUFBfUE9MX0xPVywKKwkuZ3BwUG9sYXJpdHlWYWxNaWQJCQk9IEEzOHhfQ0xFQVJGT0dfQk9BUkRfR1BQX1BPTF9NSUQsCisJLmdwcFBvc3RDb25maWdDYWxsQmFjawkJCT0gQTM4eF9DTEVBUkZPR19CT0FSRF9ncHBfY2FsbGJhY2ssCisKKwkvKiBURE0gKi8KKwkubnVtQm9hcmRUZG1JbmZvCQkJPSB7fSwKKwkucEJvYXJkVGRtSW50MkNzSW5mbwkJCT0ge30sCisJLmJvYXJkVGRtSW5mb0luZGV4CQkJPSAtMSwKKworCS5wQm9hcmRTcGVjSW5pdAkJCQk9IE5VTEwsCisKKwkucEJvYXJkVXNiSW5mbwkJCQk9IGFybWFkYV8zOHhfY2xlYXJmb2dfSW5mb0JvYXJkVXNiSW5mbywKKwkubnVtQm9hcmRVc2JJbmZvCQkJPSBBUlJTWihhcm1hZGFfMzh4X2NsZWFyZm9nX0luZm9Cb2FyZFVzYkluZm8pLAorCisJLyogTkFORCBpbml0IHBhcmFtcyAqLworCS5uYW5kRmxhc2hSZWFkUGFyYW1zCQkJPSAwLAorCS5uYW5kRmxhc2hXcml0ZVBhcmFtcwkJCT0gMCwKKwkubmFuZEZsYXNoQ29udHJvbAkJCT0gMCwKKwkubmFuZElmTW9kZQkJCQkJPSBOQU5EX0lGX05GQywKKworCS5pc1NkTW1jQ29ubmVjdGVkCQkJPSBNVl9UUlVFLAorCisJLyogTk9SIGluaXQgcGFyYW1zICovCisJLm5vckZsYXNoUmVhZFBhcmFtcwkJCT0gMCwKKwkubm9yRmxhc2hXcml0ZVBhcmFtcwkJCT0gMCwKKwkvKiBFbmFibGUgbW9kdWxlcyBhdXRvLWRldGVjdGlvbi4gKi8KKwkuY29uZmlnQXV0b0RldGVjdAkJCT0gTVZfRkFMU0UsCisJLm51bUlvRXhwCQkJCT0gQVJSU1ooYXJtYWRhXzM4eF9jbGVhcmZvZ19Jb0V4cGFuZGVySW5mbyksCisJLnBJb0V4cAkJCQkJPSBhcm1hZGFfMzh4X2NsZWFyZm9nX0lvRXhwYW5kZXJJbmZvLAorCS5ib2FyZE9wdGlvbnNNb2R1bGUJCQk9IE1WX01PRFVMRV9OT19NT0RVTEUsCisJLmlzQW1jCQkJCQk9IE1WX0ZBTFNFLAorCS5wU3dpdGNoSW5mbwkJCQk9IGFybWFkYV8zOHhfY2xlYXJmb2dfSW5mb1N3aXRjaEluZm8sCisJLnN3aXRjaEluZm9OdW0JCQkJPSBBUlJTWihhcm1hZGFfMzh4X2NsZWFyZm9nX0luZm9Td2l0Y2hJbmZvKQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMxOCw5ICs1MzUsMTAgQEAKICNkZWZpbmUgQTM4eF9HRkNIMTAwX05PUl9XUklURV9QQVJBTVMJCTB4MDAwRjBGMEYKIAogTVZfQk9BUkRfTUFDX0lORk8gYXJtYWRhXzM4eF9nZmNoMTAwX0JvYXJkTWFjSW5mb1tdID0gewotCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsIE1WXzMyIGJvYXJkRXRoU21pQWRkcjA7fX0gKi8KLQl7IEJPQVJEX01BQ19TUEVFRF8xMDAwTSwgMHhmZiwgMHgwfSwJLyogc3dpdGNoLCBubyBwaHksIG5vIGFkZHIgKi8KLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDMsIDB4MH0sCS8qIGNyYWZ0LCBwaHkgcG9ydCAzLCBubyBhZGRyICovCisJLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwKKwkgICBNVl8zMiBib2FyZEV0aFNtaUFkZHIwICwgTVZfQk9PTCBib2FyZE1hY0VuYWJsZWQ7fX0gKi8KKwl7IEJPQVJEX01BQ19TUEVFRF8xMDAwTSwgLTEsIC0xLCBNVl9UUlVFfSwJLyogc3dpdGNoLCBubyBwaHksIG5vIGFkZHIgKi8KKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDMsIDB4MCwgTVZfVFJVRX0sCS8qIGNyYWZ0LCBwaHkgcG9ydCAzLCBubyBhZGRyICovCiB9OwogCiBNVl9ERVZfQ1NfSU5GTyBhcm1hZGFfMzh4X2dmY2gxMDBfQm9hcmREZUNzSW5mb1tdID0gewpAQCAtMzk3LDYgKzYxNSwxMCBAQAogCiAJLnBCb2FyZFNwZWNJbml0CQkJPSBOVUxMLAogCisJLyogVVNCICovCisJLm51bUJvYXJkVXNiSW5mbwkJPSBBUlJTWihhcm1hZGFfMzh4X2dmY2gxMDBfVXNiSW5mbyksCisJLnBCb2FyZFVzYkluZm8JCQk9IGFybWFkYV8zOHhfZ2ZjaDEwMF9Vc2JJbmZvLAorCiAJLyogTkFORCBpbml0IHBhcmFtcyAqLwogCS5uYW5kRmxhc2hSZWFkUGFyYW1zCQk9IEEzOHhfR0ZDSDEwMF9OQU5EX1JFQURfUEFSQU1TLAogCS5uYW5kRmxhc2hXcml0ZVBhcmFtcwkJPSBBMzh4X0dGQ0gxMDBfTkFORF9XUklURV9QQVJBTVMsCkBAIC00MTMsMTAgKzYzNSw2IEBACiAJLm51bUlvRXhwCQkJPSBBUlJTWihhcm1hZGFfMzh4X2dmY2gxMDBfSW9FeHBhbmRlckluZm8pLAogCS5wSW9FeHAJCQkJPSBhcm1hZGFfMzh4X2dmY2gxMDBfSW9FeHBhbmRlckluZm8sCiAJLmJvYXJkT3B0aW9uc01vZHVsZQkJPSBNVl9NT0RVTEVfTk9fTU9EVUxFLAotCi0JLyogVVNCICovCi0JLm51bUJvYXJkVXNiSW5mbwkJPSBBUlJTWihhcm1hZGFfMzh4X2dmY2gxMDBfVXNiSW5mbyksCi0JLnBCb2FyZFVzYkluZm8JCQk9IGFybWFkYV8zOHhfZ2ZjaDEwMF9Vc2JJbmZvLAogfTsKIAogLyoKQEAgLTQyNSw2ICs2NDMsNyBAQAogTVZfQk9BUkRfSU5GTyAqY3VzdG9tZXJCb2FyZEluZm9UYmxbXSA9IHsKIAkmYXJtYWRhXzM4eF9jdXN0b21lcl9ib2FyZF8wX2luZm8sCiAJJmFybWFkYV8zOHhfY3VzdG9tZXJfYm9hcmRfMV9pbmZvLAorCSZhcm1hZGFfMzh4X2NsZWFyZm9nX2JvYXJkX2luZm8sCiAJJmFybWFkYV8zOHhfZ2ZjaDEwMF9pbmZvLAogfTsKIApAQCAtNDYwLDcgKzY3OSw3IEBACiAJeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkJMSwJMHg0YywJICAgQUREUjdfQklULCBNVl9GQUxTRX0sCiAJeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkJMiwJMHg0ZCwJICAgQUREUjdfQklULCBNVl9GQUxTRX0sCiAJeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkJMywJMHg0ZSwJICAgQUREUjdfQklULCBNVl9GQUxTRX0sCi0JeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkJNCwJMHgyMSwJICAgQUREUjdfQklULCBNVl9GQUxTRX0sCisJeyBCT0FSRF9UV1NJX0lPX0VYUEFOREVSLAkwLAkweDIxLAkgICBBRERSN19CSVQsIE1WX0ZBTFNFfSwKIAl7IEJPQVJEX1RXU0lfTU9EVUxFX0RFVEVDVCwJMCwJMHgyMCwJICAgQUREUjdfQklULCBNVl9GQUxTRX0sICAgLyogbW9kdWxlcyAqLwogCXsgQk9BUkRfVFdTSV9NT0RVTEVfREVURUNULAkxLAkweDIzLAkgICBBRERSN19CSVQsIE1WX0ZBTFNFfSwKIAl7IEJPQVJEX1RXU0lfTU9EVUxFX0RFVEVDVCwJMiwJMHgyNCwJICAgQUREUjdfQklULCBNVl9GQUxTRX0sCkBAIC00NjksMTAgKzY4OCwxMSBAQAogCXsgQk9BUkRfVFdTSV9NT0RVTEVfREVURUNULAk1LAkweDI3LAkgICBBRERSN19CSVQsIE1WX0ZBTFNFfSwKIH07CiBNVl9CT0FSRF9NQUNfSU5GTyBkYjg4ZjY4eHhJbmZvQm9hcmRNYWNJbmZvW10gPSB7Ci0JLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLwotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MX0sCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDB9LAorCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsCisJICAgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMCwgTVZfQk9PTCBib2FyZE1hY0VuYWJsZWQ7fX0gKi8KKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgxLCAweDEsIE1WX1RSVUV9LAorCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9UUlVFfSwKIH07CiAKIE1WX0JPQVJEX1VTQl9JTkZPIGRiODhmNjh4eEluZm9Cb2FyZFVzYkluZm9bXSA9IHsKQEAgLTQ4NywxMyArNzA3LDM0IEBACiAJeyBERVZJQ0VfQ1MwLAlOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBOQU5EIERFViAqLwogCXsgREVWX0JPT0NTLAlOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsCTE2LAkxNiwJMCwJTVZfRkFMU0UgfSwJLyogTk9SIERFViAqLwogCXsgU1BJMF9DUzAsCQlOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsCTgsCTgsCTAsCU1WX1RSVUUgfSwJLyogU1BJMCBERVYgKi8KLQl7IFNQSTBfQ1MxLAkJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9CS8qIFNQSTAgREVWICovCisJeyBTUEkxX0NTMCwJCU5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwJOCwJOCwJMSwJTVZfRkFMU0UgfQkvKiBTUEkxIERFViAqLwogfTsKIAogTVZfQk9BUkRfVERNX0lORk8gZGI4OGY2OHh4VGRtODgwW10gPSB7IHswfSB9OwogCiBNVl9CT0FSRF9URE1fU1BJX0lORk8gZGI4OGY2OHh4VGRtU3BpSW5mb1tdID0geyB7MX0gfTsKIAorc3RydWN0IE1WX0JPQVJEX1NXSVRDSF9JTkZPIGRiODhmNjh4eFN3aXRjaEluZm9bXSA9IHsKKwl7CisJCS5pc0VuYWJsZWQgPSBNVl9GQUxTRSwKKwkJLmlzQ3B1UG9ydFJnbWlpID0gTVZfVFJVRSwKKwkJLnN3aXRjaElycSA9IC0xLAkvKiBzZXQgdG8gLTEgZm9yIHVzaW5nIFBQVSovCisJCS5zd2l0Y2hQb3J0ID0gezAsIDEsIDIsIDMsIDQsIDUsIDZ9LAorCQkuY3B1UG9ydCA9IDYsCisJCS5jb25uZWN0ZWRQb3J0ID0gezUsIDYsIC0xfSwKKwkJLnNtaVNjYW5Nb2RlID0gTVZfU1dJVENIX1NNSV9NVUxUSV9BRERSX01PREUsCisJCS5xdWFkUGh5QWRkciA9IDIsCisJCS5mb3JjZUxpbmtNYXNrID0gMHg2MAorCX0KK307CisKK3N0cnVjdCBNVl9CT0FSRF9JT19FWFBBTkRFUiBkYjg4ZjY4eHhJbmZvQm9hcmRpb0V4cFZhbHVlW10gPSB7CisJezAsIDYsIDB4RkZ9LCAvKiBDb25maWcgcmVnIzA6IGFsbCBiaXRzIGFzIGlucHV0IChCSVQgb24gPSBJbnB1dCkgKi8KKwl7MCwgNywgMHhGQ30sIC8qIENvbmZpZyByZWcjMTogQklUMChVU0IzLjAgY3VycmVudCBsaW1pdCksIEJJVDEoVVNCMy4xIGN1cnJlbnQgbGltaXQpKi8KKwl7MCwgMiwgMHhGRn0sIC8qIE91dHB1dCBEYXRhLCByZWcjMCAgLSBubyBvdXRwdXQgYml0cyovCisJezAsIDMsIDB4RkZ9LCAvKiBPdXRwdXQgRGF0YSwgcmVnIzE6ICBCSVQwLFVTQjMuMF9DVVJSRU5UPTEsIEJJVDEsVVNCMy4xX0NVUlJFTlQ9MSAqLworfTsKKwogTVZfQk9BUkRfSU5GTyBkYjg4ZjY4eHhfYm9hcmRfaW5mbyA9IHsKIAkuYm9hcmROYW1lCQk9ICJEQi04OEY2ODIwLUJQIiwKIAkuY29tcGF0aWJsZURUTmFtZQk9ICJhMzg1LWRiIiwKQEAgLTUxMSw2ICs3NTIsOCBAQAogCS5wQm9hcmRNYWNJbmZvCQk9IGRiODhmNjh4eEluZm9Cb2FyZE1hY0luZm8sCiAJLm51bUJvYXJkR3BwSW5mbwk9IDAsCiAJLnBCb2FyZEdwcEluZm8JCT0gMCwKKwkubnVtQm9hcmRJb0V4cFBpbkluZm8JPSAwLAorCS5wQm9hcmRJb0V4cFBpbkluZm8JPSAwLAogCS5hY3RpdmVMZWRzTnVtYmVyCT0gMCwKIAkucExlZEdwcFBpbgkJPSBOVUxMLAogCS5sZWRzUG9sYXJpdHkJCT0gMCwKQEAgLTU1Nyw5ICs4MDAsMTQgQEAKIAogCS8qIEVuYWJsZSBtb2R1bGVzIGF1dG8tZGV0ZWN0aW9uLiAqLwogCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCi0JLm51bUlvRXhwCQkJPSAwLAotCS5wSW9FeHAJCQkJPSBOVUxMLAotCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5udW1Jb0V4cAkJCT0gQVJSU1ooZGI4OGY2OHh4SW5mb0JvYXJkaW9FeHBWYWx1ZSksCisJLnBJb0V4cAkJCQk9IGRiODhmNjh4eEluZm9Cb2FyZGlvRXhwVmFsdWUsCisJLmJvYXJkT3B0aW9uc01vZHVsZQkJPSBNVl9NT0RVTEVfTk9fTU9EVUxFLAorCS5pc0FtYwkJCQk9IE1WX0ZBTFNFLAorCS5pc0F1ZGlvQ29ubmVjdGVkCQk9IE1WX0ZBTFNFLAorCS5pc1RkbUNvbm5lY3RlZAkJCT0gTVZfRkFMU0UsCisJLnBTd2l0Y2hJbmZvCQkJPSBkYjg4ZjY4eHhTd2l0Y2hJbmZvLAorCS5zd2l0Y2hJbmZvTnVtCQkJPSBBUlJTWihkYjg4ZjY4eHhTd2l0Y2hJbmZvKQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU3Myw5ICs4MjEsMTAgQEAKIAl7IEJPQVJEX1RXU0lfSU9fRVhQQU5ERVIsCTEsCTB4MjEsIEFERFI3X0JJVCwgTVZfRkFMU0V9LAogfTsKIE1WX0JPQVJEX01BQ19JTkZPIHJkODhGNjhYWEluZm9Cb2FyZE1hY0luZm9bXSA9IHsKLQkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIwO319ICovCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgxLCAweDF9LAotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwfQorCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsCisJICAgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMCwgTVZfQk9PTCBib2FyZE1hY0VuYWJsZWQ7fX0gKi8KKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MSwgTVZfVFJVRX0sCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDAsIE1WX1RSVUV9CiB9OwogCiBNVl9ERVZfQ1NfSU5GTyByZDg4RjY4WFhJbmZvQm9hcmREZUNzSW5mb1tdID0gewpAQCAtNjIzLDYgKzg3Miw4IEBACiAJLnBCb2FyZE1hY0luZm8JCQk9IHJkODhGNjhYWEluZm9Cb2FyZE1hY0luZm8sCiAJLm51bUJvYXJkR3BwSW5mbwkJPSAwLAogCS5wQm9hcmRHcHBJbmZvCQkJPSAwLAorCS5udW1Cb2FyZElvRXhwUGluSW5mbwk9IDAsCisJLnBCb2FyZElvRXhwUGluSW5mbwk9IDAsCiAJLmFjdGl2ZUxlZHNOdW1iZXIJCT0gMCwKIAkucExlZEdwcFBpbgkJCT0gTlVMTCwKIAkubGVkc1BvbGFyaXR5CQkJPSAwLApAQCAtNjYyLDcgKzkxMywxMiBAQAogCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCiAJLm51bUlvRXhwCQkJPSBBUlJTWihpb0V4cE5hcyksCiAJLnBJb0V4cAkJCQk9IGlvRXhwTmFzLAotCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRSwKKwkuaXNBbWMJCQkJPSBNVl9GQUxTRSwKKwkuaXNBdWRpb0Nvbm5lY3RlZAkJPSBNVl9GQUxTRSwKKwkuaXNUZG1Db25uZWN0ZWQJCQk9IE1WX0ZBTFNFLAorCS5wU3dpdGNoSW5mbwkJCT0gTlVMTCwKKwkuc3dpdGNoSW5mb051bQkJCT0gMAogfTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBBMzgwIFJELVdBUC04OEY2OFhYIGJvYXJkICovCkBAIC03MDYsNiArOTYyLDggQEAKIAkucEJvYXJkTWFjSW5mbwkJCT0gcmQ4OEY2OFhYSW5mb0JvYXJkTWFjSW5mbywKIAkubnVtQm9hcmRHcHBJbmZvCQk9IDAsCiAJLnBCb2FyZEdwcEluZm8JCQk9IDAsCisJLm51bUJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKIAkuYWN0aXZlTGVkc051bWJlcgkJPSAwLAogCS5wTGVkR3BwUGluCQkJPSBOVUxMLAogCS5sZWRzUG9sYXJpdHkJCQk9IDAsCkBAIC03NDUsNyArMTAwMywxMiBAQAogCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCiAJLm51bUlvRXhwCQkJPSBBUlJTWihpb0V4cFdhcCksCiAJLnBJb0V4cAkJCQk9IGlvRXhwV2FwLAotCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRSwKKwkuaXNBbWMJCQkJPSBNVl9GQUxTRSwKKwkuaXNBdWRpb0Nvbm5lY3RlZAkJPSBNVl9GQUxTRSwKKwkuaXNUZG1Db25uZWN0ZWQJCQk9IE1WX0ZBTFNFLAorCS5wU3dpdGNoSW5mbwkJCT0gTlVMTCwKKwkuc3dpdGNoSW5mb051bQkJCT0gMAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTc4NSwxMCArMTA0OCwxMSBAQAogfTsKIAogTVZfQk9BUkRfTUFDX0lORk8gZGJBUDg4ZjY4eHhJbmZvQm9hcmRNYWNJbmZvW10gPSB7Ci0JLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLwotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MSwgMHgxfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDYsIDB4NH0sCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHg0LCAweDR9LAorCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsCisJICAgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMCAsIE1WX0JPT0wgYm9hcmRNYWNFbmFibGVkO319ICovCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgxLCAweDEsIE1WX1RSVUV9LAorCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4NiwgMHg0LCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDQsIDB4NCwgTVZfVFJVRX0sCiB9OwogCiBNVl9CT0FSRF9VU0JfSU5GTyBkYkFQODhmNjh4eEluZm9Cb2FyZFVzYkluZm9bXSA9IHsKQEAgLTgwMCw5ICsxMDY0LDEyIEBACiBNVl9ERVZfQ1NfSU5GTyBkYkFQODhmNjh4eEluZm9Cb2FyZERlQ3NJbmZvW10gPSB7CiAJLyp7ZGV2aWNlQ1MsIHBhcmFtcywgZGV2VHlwZSwgZGV2V2lkdGgsIGJ1c1dpZHRoLCBidXNOdW0sIGFjdGl2ZSB9Ki8KIAl7IERFVklDRV9DUzAsCU5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsCTgsCTgsCTAsCU1WX1RSVUUgfSwJLyogTkFORCBERVYgKi8KLQl7IERFVl9CT09DUywJTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILAkxNiwJMTYsCTAsCU1WX0ZBTFNFIH0sCS8qIE5PUiBERVYgKi8KLQl7IFNQSTBfQ1MwLAkJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBTUEkwIERFViAqLwotCXsgU1BJMF9DUzEsCQlOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsCTgsCTgsCTAsCU1WX0ZBTFNFIH0JLyogU1BJMCBERVYgKi8KKwl7IERFVl9CT09DUywJTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILAkxNiwJMTYsCTAsCU1WX0ZBTFNFIH0JLyogTk9SIERFViAqLworfTsKKworTVZfQk9BUkRfR1BQX0lORk8gZGJBUDg4ZjY4eHhJbmZvQm9hcmRHcHBJbmZvW10gPSB7CisJLyoge3tNVl9CT0FSRF9HUFBfQ0xBU1MJZGV2Q2xhc3MsIE1WX1U4CWdwcFBpbk51bX19ICovCisvKiBVU0JfSG9zdDAgKi8Je0JPQVJEX0dQUF9VU0JfVkJVUywgICAgNDR9LCAvKiBmcm9tIE1QUCBtYXAgKi8KIH07CiAKIE1WX0JPQVJEX1RETV9JTkZPIGRiQVA4OGY2OHh4VGRtODgwW10gPSB7IHswfSB9OwpAQCAtODI2LDggKzEwOTMsMTAgQEAKIAkucEJvYXJkVHdzaURldiAgICAgICAgICA9IGRiQVA4OGY2OHh4SW5mb0JvYXJkVHdzaURldiwKIAkubnVtQm9hcmRNYWNJbmZvICAgICAgICA9IEFSUlNaKGRiQVA4OGY2OHh4SW5mb0JvYXJkTWFjSW5mbyksCiAJLnBCb2FyZE1hY0luZm8gICAgICAgICAgPSBkYkFQODhmNjh4eEluZm9Cb2FyZE1hY0luZm8sCi0JLm51bUJvYXJkR3BwSW5mbyAgICAgICAgPSAwLAotCS5wQm9hcmRHcHBJbmZvICAgICAgICAgID0gMCwKKwkubnVtQm9hcmRHcHBJbmZvCT0gQVJSU1ooZGJBUDg4ZjY4eHhJbmZvQm9hcmRHcHBJbmZvKSwKKwkucEJvYXJkR3BwSW5mbwkJPSBkYkFQODhmNjh4eEluZm9Cb2FyZEdwcEluZm8sCisJLm51bUJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKIAkuYWN0aXZlTGVkc051bWJlciAgICAgICA9IDAsCiAJLnBMZWRHcHBQaW4gICAgICAgICAgICAgPSBOVUxMLAogCS5sZWRzUG9sYXJpdHkgICAgICAgICAgID0gMCwJLyogUE1VIFBvd2VyICovCkBAIC04NjMsNyArMTEzMiwxMiBAQAogCS5jb25maWdBdXRvRGV0ZWN0ICAgICAgICAgICAgICAgPSBNVl9GQUxTRSwKIAkubnVtSW9FeHAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKIAkucElvRXhwICAgICAgICAgICAgICAgICAgICAgICAgID0gTlVMTCwKLQkuYm9hcmRPcHRpb25zTW9kdWxlICAgICAgICAgICAgID0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5ib2FyZE9wdGlvbnNNb2R1bGUgICAgICAgICAgICAgPSBNVl9NT0RVTEVfTk9fTU9EVUxFLAorCS5pc0FtYwkJCQk9IE1WX0ZBTFNFLAorCS5pc0F1ZGlvQ29ubmVjdGVkCQk9IE1WX0ZBTFNFLAorCS5pc1RkbUNvbm5lY3RlZAkJCT0gTVZfRkFMU0UsCisJLnBTd2l0Y2hJbmZvCQkJPSBOVUxMLAorCS5zd2l0Y2hJbmZvTnVtCQkJPSAwCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODc4LDEwICsxMTUyLDExIEBACiAJeyBCT0FSRF9UV1NJX0lPX0VYUEFOREVSLAkxLAkweDIxLCBBRERSN19CSVQsIE1WX0ZBTFNFfSwKIH07CiBNVl9CT0FSRF9NQUNfSU5GTyBkYkdQODhGNjhYWEluZm9Cb2FyZE1hY0luZm9bXSA9IHsKLQkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIwO319ICovCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgxLCAweDF9LAotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAgLTEsICAtMX0KKwkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLAorCSAgIE1WXzMyIGJvYXJkRXRoU21pQWRkcjAgLCBNVl9CT09MIGJvYXJkTWFjRW5hYmxlZDt9fSAqLworCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MSwgMHgxLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgIC0xLCAgLTEsIE1WX1RSVUV9CiB9OwogCiBNVl9CT0FSRF9VU0JfSU5GTyBkYkdQODhmNjh4eEluZm9Cb2FyZFVzYkluZm9bXSA9IHsKQEAgLTkxNyw3ICsxMTkyLDEyIEBACiAJezEsIDYsIDB4QzN9LCAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyczogQml0IG9uIC0tPiBJbnB1dCBiaXRzICAqLwogCXsxLCA3LCAweDMxfSwgLyogQ29uZmlndXJhdGlvbiByZWdpc3RlcnM6IEJpdCBvbiAtLT4gSW5wdXQgYml0cyAgKi8KIAl7MSwgMiwgMHgwOH0sIC8qIE91dHB1dCBEYXRhLCByZWdpc3RlciMwICovCi0JezEsIDMsIDB4QzB9ICAvKiBPdXRwdXQgRGF0YSwgcmVnaXN0ZXIjMSAqLworCXsxLCAzLCAweDQwfSAgLyogT3V0cHV0IERhdGEsIHJlZ2lzdGVyIzEgKi8KK307CisKK01WX0JPQVJEX0lPX0VYUEFOREVSX1RZUEVfSU5GTyBkYkdQODhmNjhYWEluZm9Cb2FyZGlvRXhwUGluSW5mb1tdID0geworLyoJeyBJTyBUeXBlIGVudW0sCQkJYml0IG9mZnNldCwgSW8uZXhwIG51bSwJCXJlZyBOdW0gKi8KKwl7IE1WX0lPX0VYUEFOREVSX1VTQl9WQlVTLAk3LAkJMSwJCTN9IC8qIFZCVVNfRU46IElPLmV4cCMxICgweDIxKSwgcmVnICMzLCBiaXQgNyAqLwogfTsKIAogTVZfVTggZGJHUDg4ZjY4WFhJbmZvQm9hcmRQaWNHcGlvW10gPSB7MzMsIDM0LCAzNX07CkBAIC05MzksNiArMTIxOSw4IEBACiAJLnBCb2FyZE1hY0luZm8JCQk9IGRiR1A4OEY2OFhYSW5mb0JvYXJkTWFjSW5mbywKIAkubnVtQm9hcmRHcHBJbmZvCQk9IDAsCiAJLnBCb2FyZEdwcEluZm8JCQk9IDAsCisJLm51bUJvYXJkSW9FeHBQaW5JbmZvCQk9IEFSUlNaKGRiR1A4OGY2OFhYSW5mb0JvYXJkaW9FeHBQaW5JbmZvKSwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCQk9IGRiR1A4OGY2OFhYSW5mb0JvYXJkaW9FeHBQaW5JbmZvLAogCS5hY3RpdmVMZWRzTnVtYmVyCQk9IDAsCiAJLnBMZWRHcHBQaW4JCQk9IE5VTEwsCiAJLmxlZHNQb2xhcml0eQkJCT0gMCwKQEAgLTk4NCw3ICsxMjY2LDEyIEBACiAJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfVFJVRSwKIAkubnVtSW9FeHAJCQk9IEFSUlNaKGRiR1A4OGY2OFhYSW5mb0JvYXJkaW9FeHBWYWx1ZSksCiAJLnBJb0V4cAkJCQk9IGRiR1A4OGY2OFhYSW5mb0JvYXJkaW9FeHBWYWx1ZSwKLQkuYm9hcmRPcHRpb25zTW9kdWxlCQk9IE1WX01PRFVMRV9OT19NT0RVTEUKKwkuYm9hcmRPcHRpb25zTW9kdWxlCQk9IE1WX01PRFVMRV9OT19NT0RVTEUsCisJLmlzQW1jCQkJCT0gTVZfRkFMU0UsCisJLmlzQXVkaW9Db25uZWN0ZWQJCT0gTVZfRkFMU0UsCisJLmlzVGRtQ29ubmVjdGVkCQkJPSBNVl9GQUxTRSwKKwkucFN3aXRjaEluZm8JCQk9IE5VTEwsCisJLnN3aXRjaEluZm9OdW0JCQk9IDAKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDExLDEwICsxMjk4LDExIEBACiAJeyBCT0FSRF9UV1NJX01PRFVMRV9ERVRFQ1QsCTAsCTB4NTYsCUFERFI3X0JJVCwgTVZfVFJVRX0sICAgLyogU0xNIDE0MjYvMTQyNyBtb2R1bGUgKi8KIH07CiBNVl9CT0FSRF9NQUNfSU5GTyBkYjg4ZjY4MjFJbmZvQm9hcmRNYWNJbmZvW10gPSB7Ci0JLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLwotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MX0sCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDB9LAorCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsCisJICAgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMCAsIE1WX0JPT0wgYm9hcmRNYWNFbmFibGVkO319ICovCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDAsIE1WX1RSVUV9LAorCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MSwgMHgxLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCiB9OwogCiBNVl9CT0FSRF9VU0JfSU5GTyBkYjg4ZjY4MjFJbmZvQm9hcmRVc2JJbmZvW10gPSB7CkBAIC0xMDI2LDggKzEzMTQsNyBAQAogCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNXaWR0aCwgYnVzTnVtLCBhY3RpdmUgfSovCiAJeyBERVZJQ0VfQ1MwLAlOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBOQU5EIERFViAqLwogCXsgREVWX0JPT0NTLAlOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsCTE2LAkxNiwJMCwJTVZfRkFMU0UgfSwJLyogTk9SIERFViAqLwotCXsgU1BJMF9DUzAsCQlOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsCTgsCTgsCTAsCU1WX1RSVUUgfSwJLyogU1BJMCBERVYgKi8KLQl7IFNQSTBfQ1MxLAkJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9CS8qIFNQSTAgREVWICovCisJeyBTUEkwX0NTMCwJCU5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwJOCwJOCwJMCwJTVZfVFJVRSB9CS8qIFNQSTAgREVWICovCiB9OwogCiBzdHJ1Y3QgTVZfQk9BUkRfSU9fRVhQQU5ERVIgZGI4OGY2ODIxSW5mb0JvYXJkaW9FeHBWYWx1ZVtdID0gewpAQCAtMTA1NCw2ICsxMzQxLDggQEAKIAkucEJvYXJkTWFjSW5mbwkJPSBkYjg4ZjY4MjFJbmZvQm9hcmRNYWNJbmZvLAogCS5udW1Cb2FyZEdwcEluZm8JPSAwLAogCS5wQm9hcmRHcHBJbmZvCQk9IDAsCisJLm51bUJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKIAkuYWN0aXZlTGVkc051bWJlcgk9IDAsCiAJLnBMZWRHcHBQaW4JCT0gTlVMTCwKIAkubGVkc1BvbGFyaXR5CQk9IDAsCkBAIC0xMDgxLDcgKzEzNzAsNyBAQAogCS5uYW5kRmxhc2hDb250cm9sCT0gREJfODhGNjhYWF9CT0FSRF9OQU5EX0NPTlRST0wsCiAJLm5hbmRJZk1vZGUJCT0gTkFORF9JRl9ORkMsCiAKLQkuaXNTZE1tY0Nvbm5lY3RlZAk9IE1WX0ZBTFNFLAorCS5pc1NkTW1jQ29ubmVjdGVkCT0gTVZfVFJVRSwKIAkuaXNTZE1tY18xXzh2X0Nvbm5lY3RlZAk9IE1WX0ZBTFNFLAogCiAJLyogTk9SIGluaXQgcGFyYW1zICovCkBAIC0xMDkyLDcgKzEzODEsMTIgQEAKIAkuY29uZmlnQXV0b0RldGVjdAk9IE1WX1RSVUUsCiAJLm51bUlvRXhwCQk9IEFSUlNaKGRiODhmNjgyMUluZm9Cb2FyZGlvRXhwVmFsdWUpLAogCS5wSW9FeHAJCQk9IGRiODhmNjgyMUluZm9Cb2FyZGlvRXhwVmFsdWUsCi0JLmJvYXJkT3B0aW9uc01vZHVsZQk9IE1WX01PRFVMRV9OT19NT0RVTEUKKwkuYm9hcmRPcHRpb25zTW9kdWxlCT0gTVZfTU9EVUxFX05PX01PRFVMRSwKKwkuaXNBbWMJCQk9IE1WX0ZBTFNFLAorCS5pc0F1ZGlvQ29ubmVjdGVkCT0gTVZfRkFMU0UsCisJLmlzVGRtQ29ubmVjdGVkCQk9IE1WX0ZBTFNFLAorCS5wU3dpdGNoSW5mbwkJPSBOVUxMLAorCS5zd2l0Y2hJbmZvTnVtCQk9IDAKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTE3LDI4ICsxNDExLDI4IEBACiAJeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkJMSwJMHg0YywJQUREUjdfQklULCBNVl9GQUxTRX0sCiB9OwogTVZfQk9BUkRfTUFDX0lORk8gZGJBbWM4OGY2OHh4SW5mb0JvYXJkTWFjSW5mb1tdID0gewotCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsIE1WXzMyIGJvYXJkRXRoU21pQWRkcjA7fX0gKi8KLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MX0sCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDB9LAotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwfSwKKwkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLAorCSAgIE1WXzMyIGJvYXJkRXRoU21pQWRkcjAgLCBNVl9CT09MIGJvYXJkTWFjRW5hYmxlZDt9fSAqLworCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MSwgMHgxLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfRkFMU0V9LAorCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9UUlVFfSwKIH07CiAKIE1WX0JPQVJEX1VTQl9JTkZPIGRiQW1jODhmNjh4eEluZm9Cb2FyZFVzYkluZm9bXSA9IHsKIC8qIHtNVl9VTklUX0lEIHVzYlR5cGUsIE1WX1U4IHVzYlBvcnROdW0sIE1WX0JPT0wgaXNBY3RpdmV9ICovCi0JeyBVU0JfVU5JVF9JRCwgMSwgTVZfVFJVRX0sCisJeyBVU0JfVU5JVF9JRCwgMCwgTVZfVFJVRX0sCiB9OwogCiBNVl9ERVZfQ1NfSU5GTyBkYkFtYzg4ZjY4eHhJbmZvQm9hcmREZUNzSW5mb1tdID0gewogCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNXaWR0aCwgYnVzTnVtLCBhY3RpdmUgfSovCiAJeyBERVZJQ0VfQ1MwLAlOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILAk4LAk4LAkwLAlNVl9UUlVFIH0sCS8qIE5BTkQgREVWICovCiAJeyBERVZfQk9PQ1MsCU5fQSwgQk9BUkRfREVWX05PUl9GTEFTSCwJMTYsCTE2LAkwLAlNVl9GQUxTRSB9LAkvKiBOT1IgREVWICovCi0JeyBTUEkwX0NTMCwJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBTUEkwIERFViAqLwotCXsgU1BJMF9DUzEsCU5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwJOCwJOCwJMCwJTVZfVFJVRSB9CS8qIFNQSTAgREVWICovCisJeyBTUEkxX0NTMCwJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkxLAlNVl9UUlVFIH0JLyogU1BJMCBERVYgKi8KIH07CiAKIE1WX0JPQVJEX0lORk8gZGJBbWM4OGY2OHh4X2JvYXJkX2luZm8gPSB7CiAJLmJvYXJkTmFtZQkJPSAiREItODhGNjgyMC1BTUMiLAotCS5jb21wYXRpYmxlRFROYW1lCT0gImEzODUtYW1jIiwKKwkuY29tcGF0aWJsZURUTmFtZQk9ICJhMzg1LWRiLWFtYyIsCiAJLm51bUJvYXJkTmV0Q29tcGxleFZhbHVlID0gMCwKIAkucEJvYXJkTmV0Q29tcGxleEluZm8JPSBOVUxMLAogCS5wQm9hcmRNcHBDb25maWdWYWx1ZQk9IGRiQW1jODhmNjh4eEluZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlLApAQCAtMTE1Myw2ICsxNDQ3LDggQEAKIAkucEJvYXJkTWFjSW5mbwkJPSBkYkFtYzg4ZjY4eHhJbmZvQm9hcmRNYWNJbmZvLAogCS5udW1Cb2FyZEdwcEluZm8JPSAwLAogCS5wQm9hcmRHcHBJbmZvCQk9IDAsCisJLm51bUJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKIAkuYWN0aXZlTGVkc051bWJlcgk9IDAsCiAJLnBMZWRHcHBQaW4JCT0gTlVMTCwKIAkubGVkc1BvbGFyaXR5CQk9IDAsCkBAIC0xMTkxLDcgKzE0ODcsMTIgQEAKIAkuY29uZmlnQXV0b0RldGVjdAk9IE1WX1RSVUUsCiAJLm51bUlvRXhwCQk9IDAsCiAJLnBJb0V4cAkJCT0gTlVMTCwKLQkuYm9hcmRPcHRpb25zTW9kdWxlCT0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5ib2FyZE9wdGlvbnNNb2R1bGUJPSBNVl9NT0RVTEVfTk9fTU9EVUxFLAorCS5pc0FtYwkJCT0gTVZfVFJVRSwJLyogZm9yIERUIHVwZGF0ZSBhbmQgc3dpdGNoaW5nIHNlcnZpY2VzICovCisJLmlzQXVkaW9Db25uZWN0ZWQJPSBNVl9GQUxTRSwKKwkuaXNUZG1Db25uZWN0ZWQJCT0gTVZfRkFMU0UsCisJLnBTd2l0Y2hJbmZvCQk9IE5VTEwsCisJLnN3aXRjaEluZm9OdW0JCT0gMAogfTsKIAogTVZfQk9BUkRfSU5GTyAqbWFydmVsbEJvYXJkSW5mb1RibFtdID0gewpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMzOHguaCBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjMzh4LmgKaW5kZXggMWE0ZmI5My4uZWViNTg2OCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMzOHguaAorKysgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYzM4eC5oCkBAIC0xMjAsNiArMTIwLDI4IEBACiAjZGVmaW5lIEEzOHhfQ1VTVE9NRVJfQk9BUkRfMV9HUFBfUE9MX0xPVwkJMHgwCiAjZGVmaW5lIEEzOHhfQ1VTVE9NRVJfQk9BUkRfMV9HUFBfUE9MX01JRAkJMHgwCiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU29saWRSdW4gQm9hcmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb2xpZFJ1biBDbGVhckZvZy1BMSBSRVYyLjAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQMF83CQkJMHgxMTExMTExMQorI2RlZmluZSBBMzh4X0NMRUFSRk9HX0JPQVJEX01QUDhfMTUJCQkweDExMTExMTExCisjZGVmaW5lIEEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQMTZfMjMJCTB4MTA0NjAwMTEKKyNkZWZpbmUgQTM4eF9DTEVBUkZPR19CT0FSRF9NUFAyNF8zMQkJMHgyMjA0MzMzMworI2RlZmluZSBBMzh4X0NMRUFSRk9HX0JPQVJEX01QUDMyXzM5CQkweDQ0NDAwMDAyCisjZGVmaW5lIEEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQNDBfNDcJCTB4NDExNDQwMDQKKyNkZWZpbmUgQTM4eF9DTEVBUkZPR19CT0FSRF9NUFA0OF81NQkJMHg0NTMzMzMzMworI2RlZmluZSBBMzh4X0NMRUFSRk9HX0JPQVJEX01QUDU2XzYzCQkweDAwMDA0NDQ0CisKKyNkZWZpbmUgQTM4eF9DTEVBUkZPR19CT0FSRF9HUFBfT1VUX0VOQV9MT1cJMHhGRkZGRkZGRgorI2RlZmluZSBBMzh4X0NMRUFSRk9HX0JPQVJEX0dQUF9PVVRfRU5BX01JRAkweEZGRkZGRkZGCisKKyNkZWZpbmUgQTM4eF9DTEVBUkZPR19CT0FSRF9HUFBfT1VUX1ZBTF9MT1cJMHgwCisjZGVmaW5lIEEzOHhfQ0xFQVJGT0dfQk9BUkRfR1BQX09VVF9WQUxfTUlECTB4MAorI2RlZmluZSBBMzh4X0NMRUFSRk9HX0JPQVJEX0dQUF9QT0xfTE9XCQkweDAKKyNkZWZpbmUgQTM4eF9DTEVBUkZPR19CT0FSRF9HUFBfUE9MX01JRAkJMHgwCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBBMzh4IEdGQ0gxMDAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjUyLDE3ICsyNzQsMTggQEAKICNkZWZpbmUgREJfQVBfODhGNjhYWF9NUFAwXzcgICAgICAgICAgICAweDExMTExMTExCiAjZGVmaW5lIERCX0FQXzg4RjY4WFhfTVBQOF8xNSAgICAgICAgICAgMHgxMTExMTExMQogI2RlZmluZSBEQl9BUF84OEY2OFhYX01QUDE2XzIzICAgICAgICAgIDB4NTUwNjYwMTEKLSNkZWZpbmUgREJfQVBfODhGNjhYWF9NUFAyNF8zMSAgICAgICAgICAweDA1MDUwMDUwCisjZGVmaW5lIERCX0FQXzg4RjY4WFhfTVBQMjRfMzEgICAgICAgICAgMHgwNTA1MDA1MCAvKiAzNzogVVNCM19DZmdDdXJyZW50TGltKG91dDEpICovCiAjZGVmaW5lIERCX0FQXzg4RjY4WFhfTVBQMzJfMzkgICAgICAgICAgMHgwNTA1NTU1NQotI2RlZmluZSBEQl9BUF84OEY2OFhYX01QUDQwXzQ3ICAgICAgICAgIDB4MDExMDA1NjUKKyNkZWZpbmUgREJfQVBfODhGNjhYWF9NUFA0MF80NyAgICAgICAgICAweDAxMTAwNTY1IC8qIDQzOiBVU0IzX09DU24oaW4pLCA0NDogVVNCM19WQlVTX0VOKG91dDEpICovCiAjZGVmaW5lIERCX0FQXzg4RjY4WFhfTVBQNDhfNTUgICAgICAgICAgMHgwMDAwMDAwMAogI2RlZmluZSBEQl9BUF84OEY2OFhYX01QUDU2XzYzICAgICAgICAgIDB4MDAwMDQ0NDQKIAogI2RlZmluZSBEQl9BUF84OEY2OFhYX0dQUF9PVVRfRU5BX0xPVwkofihCSVQyMSkpIC8qIFBJQyAoU1RSKSBHUElPID0gMjEsIDQ3ICovCi0jZGVmaW5lIERCX0FQXzg4RjY4WFhfR1BQX09VVF9FTkFfTUlECSh+KEJJVDEgfCBCSVQyIHwgQklUMyB8IEJJVDE1KSkKKyNkZWZpbmUgREJfQVBfODhGNjhYWF9HUFBfT1VUX0VOQV9NSUQJKH4oQklUMSB8IEJJVDIgfCBCSVQzIHwgQklUNSB8IEJJVDE1KSkKKwkgICAgICAgLypHUFBfT1VUX0VOQV9NSUQ6IEJJVDUoMzcpOlVTQjNfQ2ZnID0gSGlnaCwgQklUMTIoNDQpOlVTQjNfVkJVU19FTiA9IExvdyAqLwogI2RlZmluZSBEQl9BUF84OEY2OFhYX0dQUF9PVVRfRU5BX0hJR0gJKH4oQklUMSkpCiAjZGVmaW5lIERCX0FQXzg4RjY4WFhfR1BQX09VVF9WQUxfTE9XCTB4MAotI2RlZmluZSBEQl9BUF84OEY2OFhYX0dQUF9PVVRfVkFMX01JRAkweDAKKyNkZWZpbmUgREJfQVBfODhGNjhYWF9HUFBfT1VUX1ZBTF9NSUQJKEJJVDUpCiAjZGVmaW5lIERCX0FQXzg4RjY4WFhfR1BQX09VVF9WQUxfSElHSAkweDAKICNkZWZpbmUgREJfQVBfODhGNjhYWF9HUFBfUE9MX0xPVwkweDAKICNkZWZpbmUgREJfQVBfODhGNjhYWF9HUFBfUE9MX01JRAkweDAKQEAgLTMyNCw3ICszNDcsNyBAQAogI2RlZmluZSBEQl9BTUNfODhGNjhYWF9HUFBfT1VUX0VOQV9NSUQJKH4oQklUMTIgfCBCSVQxNyB8IEJJVDE4IHwgQklUMjAgfCBCSVQyMSkpIC8qIDQ0OkkyQ19FWFRfRU4sIDQ5LDUwLDUyLDUzOkxlZHMqLwogI2RlZmluZSBEQl9BTUNfODhGNjhYWF9HUFBfT1VUX0VOQV9ISUdICTB4RkZGRkZGRkYKICNkZWZpbmUgREJfQU1DXzg4RjY4WFhfR1BQX09VVF9WQUxfTE9XCShCSVQyOSkgLyogR1BJTzI5OiBRU19TTUlfRU5BID0gT1VUIFZBTCBIaWdoICovCi0jZGVmaW5lIERCX0FNQ184OEY2OFhYX0dQUF9PVVRfVkFMX01JRAkoQklUMTIpIC8qIEdQSU80NDogSTJDX0VYVF9FTiA9IE9VVCBWQUwgSGlnaCAqLworI2RlZmluZSBEQl9BTUNfODhGNjhYWF9HUFBfT1VUX1ZBTF9NSUQJKEJJVDEyKSAvKiAod2FzIEJJVDEyKTogR1BJTzQ0IEkyQ19FWFRfRU4gPSBGQUxTRSAoRmFsc2UgPSBPVVQgVkFMIEhpZ2gpICovCiAjZGVmaW5lIERCX0FNQ184OEY2OFhYX0dQUF9PVVRfVkFMX0hJR0gJMHgwCiAjZGVmaW5lIERCX0FNQ184OEY2OFhYX0dQUF9QT0xfTE9XCTB4MAogI2RlZmluZSBEQl9BTUNfODhGNjhYWF9HUFBfUE9MX01JRAkweDAKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjMzl4LmMgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYzM5eC5jCmluZGV4IGI5MGJhNjMuLmIxODZiZmUgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjMzl4LmMKKysrIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMzOXguYwpAQCAtODgsMTEgKzg4LDExIEBACiAKIE1WX0JPQVJEX01BQ19JTkZPIGFybWFkYV8zOXhfY3VzdG9tZXJfMF9Cb2FyZE1hY0luZm9bXSA9IHsKIAkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl84IGJvYXJkRXRoU21pQWRkciwgTVZfOAotCSAqIGJvYXJkRXRoU21pQWRkcjAsIE1WX1BIWV9QT1JUX1RZUEUgcG9ydFR5cGV9fSAqLwotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBYU01JfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDUsIDB4NSwgU01JfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDQsIDB4NCwgU01JfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgWFNNSX0KKwkgKiBib2FyZEV0aFNtaUFkZHIwLCBNVl9QSFlfUE9SVF9UWVBFIHBvcnRUeXBlLCBNVl9CT09MIGJvYXJkTWFjRW5hYmxlZDt9fSAqLworCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBYU01JLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDUsIDB4NSwgU01JLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDQsIDB4NCwgU01JLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgWFNNSSwgTVZfVFJVRX0KIH07CiAKIE1WX0JPQVJEX05FVF9DT01QTEVYX0lORk8gYXJtYWRhXzM5eF9jdXN0b21lcl8wX0luZm9Cb2FyZE5ldENvbXBsZXhJbmZvW10gPSB7CkBAIC0xMjAsNiArMTIwLDE0IEBACiAJeyBTUEkxX0NTMywJCU5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwJOCwJOCwJMSwJTVZfRkFMU0UgfQkvKiBTUEkxIERFViAqLwogfTsKIAorTVZfQk9BUkRfVVNCX0lORk8gYXJtYWRhXzM5eF9jdXN0b21lcl8wX0JvYXJkVXNiSW5mb1tdID0geworLyoge01WX1VOSVRfSUQgdXNiVHlwZSwgTVZfVTggdXNiUG9ydE51bSwgTVZfQk9PTCBpc0FjdGl2ZX0gKi8KKwl7IFVTQjNfVU5JVF9JRCwgMCwgTVZfRkFMU0V9LAorCXsgVVNCM19VTklUX0lELCAxLCBNVl9UUlVFfSwKKwl7IFVTQl9VTklUX0lELCAgMCwgTVZfRkFMU0V9LAorfTsKKworCiBNVl9CT0FSRF9NUFBfSU5GTyBhcm1hZGFfMzl4X2N1c3RvbWVyXzBfQm9hcmRNcHBDb25maWdWYWx1ZVtdID0gewogCXsgewogCQlBMzlYX0NVU1RPTUVSX0JPQVJEXzBfTVBQMF83LApAQCAtMTMzLDYgKzE0MSwxNCBAQAogCX0gfQogfTsKIAorLyogZ3BwX2NhbGxiYWNrIGlzIGEgZ2VuZXJpYyBwbGFjZSBob2xkZXIgcm91dGluZSBmb3Igc3BlY2lhbCBHUElPIHB1bGwtdXAvc293biBzZXF1ZW5jZQorICogdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhcyB0aGUgZmluYWwgc3RlcCBvZiBtdkJvYXJkRW52SW5pdCBmbG93CisgKiBmb3IgZXhhbXBsZSBzZWUgaW1wbGVtZW50YXRpb24gZm9yIFNvbGlkUnVuJ3MgY2xlYXJGb2cgYm9hcmQ6IEEzOHhfQ0xFQVJGT0dfQk9BUkRfZ3BwX2NhbGxiYWNrKi8KK3ZvaWQgQTM5eF9DVVNUT01FUl9CT0FSRF8wX2dwcF9jYWxsYmFjayhNVl9CT0FSRF9JTkZPICpib2FyZCkgeworCisJLyogaW1wbGVtZW50IHNwZWNpYWwgR1BJTy9NUFAgcG9zdCBjb25maWd1cmF0aW9uIGhlcmUgKi8KK30KKwogTVZfQk9BUkRfSU5GTyBhcm1hZGFfMzl4X2N1c3RvbWVyX2JvYXJkXzBfaW5mbyA9IHsKIAkuYm9hcmROYW1lCQkJPSAiQTM5eC1DdXN0b21lci1Cb2FyZC0wIiwKIAkubnVtQm9hcmROZXRDb21wbGV4VmFsdWUJPSBBUlJTWihhcm1hZGFfMzl4X2N1c3RvbWVyXzBfSW5mb0JvYXJkTmV0Q29tcGxleEluZm8pLApAQCAtMTY0LDcgKzE4MCwxMCBAQAogCS5ncHBPdXRWYWxNaWQJCQk9IEEzOVhfQ1VTVE9NRVJfQk9BUkRfMF9HUFBfT1VUX1ZBTF9NSUQsCiAJLmdwcFBvbGFyaXR5VmFsTG93CQk9IEEzOVhfQ1VTVE9NRVJfQk9BUkRfMF9HUFBfUE9MX0xPVywKIAkuZ3BwUG9sYXJpdHlWYWxNaWQJCT0gQTM5WF9DVVNUT01FUl9CT0FSRF8wX0dQUF9QT0xfTUlELAorCS5ncHBQb3N0Q29uZmlnQ2FsbEJhY2sJCT0gQTM5eF9DVVNUT01FUl9CT0FSRF8wX2dwcF9jYWxsYmFjaywKIAorCS5wQm9hcmRVc2JJbmZvCQk9IGFybWFkYV8zOXhfY3VzdG9tZXJfMF9Cb2FyZFVzYkluZm8sCisJLm51bUJvYXJkVXNiSW5mbwk9IEFSUlNaKGFybWFkYV8zOXhfY3VzdG9tZXJfMF9Cb2FyZFVzYkluZm8pLAogCS8qIFRETSAqLwogCS5udW1Cb2FyZFRkbUluZm8JCT0ge30sCiAJLnBCb2FyZFRkbUludDJDc0luZm8JCT0ge30sCkBAIC0xODQsNyArMjAzLDkgQEAKIAkuY29uZmlnQXV0b0RldGVjdAkJPSBNVl9GQUxTRSwKIAkubnVtSW9FeHAJCQk9IDAsCiAJLnBJb0V4cAkJCQk9IE5VTEwsCi0JLmJvYXJkT3B0aW9uc01vZHVsZQkJPSBNVl9NT0RVTEVfTk9fTU9EVUxFCisJLmJvYXJkT3B0aW9uc01vZHVsZQkJPSBNVl9NT0RVTEVfTk9fTU9EVUxFLAorCS5wU3dpdGNoSW5mbwkJCT0gTlVMTCwKKwkuc3dpdGNoSW5mb051bQkJCT0gMAogfTsKIAogLyoKQEAgLTIzOSwxMSArMjYwLDExIEBACiAKIE1WX0JPQVJEX01BQ19JTkZPIGRiODhmNjl4eEluZm9Cb2FyZE1hY0luZm9bXSA9IHsKIAkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl84IGJvYXJkRXRoU21pQWRkciwgTVZfOAotCSAqIGJvYXJkRXRoU21pQWRkcjAsIE1WX1BIWV9QT1JUX1RZUEUgcG9ydFR5cGV9fSAqLwotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBYU01JfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDUsIDB4NSwgU01JfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDQsIDB4NCwgU01JfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgWFNNSX0KKwkgKiBib2FyZEV0aFNtaUFkZHIwLCBNVl9QSFlfUE9SVF9UWVBFIHBvcnRUeXBlLCBNVl9CT09MIGJvYXJkTWFjRW5hYmxlZDt9fSAqLworCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBYU01JLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDUsIDB4NSwgU01JLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDQsIDB4NCwgU01JLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgWFNNSSwgTVZfVFJVRX0KIH07CiAKIE1WX0JPQVJEX05FVF9DT01QTEVYX0lORk8gZGI4OGY2OXh4SW5mb0JvYXJOZXRDb21wbGV4SW5mb1tdID0gewpAQCAtMzMxLDcgKzM1MiwxMiBAQAogCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCiAJLm51bUlvRXhwCQkJPSAwLAogCS5wSW9FeHAJCQkJPSBOVUxMLAotCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRSwKKwkvKiBBdWRpbyAqLworCS5pc0F1ZGlvQ29ubmVjdGVkCQk9IE1WX0ZBTFNFLAorCS5pc1RkbUNvbm5lY3RlZAkJCT0gTVZfRkFMU0UsCisJLnBTd2l0Y2hJbmZvCQkJPSBOVUxMLAorCS5zd2l0Y2hJbmZvTnVtCQkJPSAwCiB9OwogCiBNVl9CT0FSRF9JTkZPICptYXJ2ZWxsQm9hcmRJbmZvVGJsW10gPSB7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuYwppbmRleCBjOTRiMjg3Li42ZTc3ZDQxIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmMKQEAgLTExNywzOCArMTE3LDQ1IEBACiAjZGVmaW5lIE1WXzY4MTBfSU5ERVgJCTEKICNkZWZpbmUgTVZfNjgxMV9JTkRFWAkJMgogI2RlZmluZSBNVl82ODI4X0lOREVYCQkzCisjZGVmaW5lIE1WXzZXMjJfSU5ERVgJCTQgLyogNlcyMj1BMzgzICovCisjZGVmaW5lIE1WXzZXMjNfSU5ERVgJCTUgLyogNlcyMz1BMzg0ICovCiAKICNkZWZpbmUgTVZfNjkyMF9JTkRFWAkJMAogI2RlZmluZSBNVl82OTI4X0lOREVYCQkxCiAKLSNkZWZpbmUgTUFYX0RFVl9JRF9OVU0JCTQKKyNkZWZpbmUgTUFYX0RFVl9JRF9OVU0JCTYKIAogI2lmZGVmIENPTkZJR19BUk1BREFfMzhYCiBNVl9VTklUX0lEIG12Q3RybFNvY1VuaXROdW1zW01BWF9VTklUU19JRF1bTUFYX0RFVl9JRF9OVU1dID0gewotLyoJCQkJNjgyMAk2ODEwCTY4MTEJNjgyOAkqLwotLyogRFJBTV9VTklUX0lEICAgICAqLwkJeyAxLAkxLAkxLAkxfSwKLS8qIFBFWF9VTklUX0lEICAgICAgKi8JCXsgNCwJMywJMywJNH0sCi0vKiBFVEhfR0lHX1VOSVRfSUQgICovCQl7IDMsCTIsCTIsCTN9LAkvKiB0b3RhbCBTb0MgTUFDIHVuaXQgY291bnQgKE5vdCB1cGRhdGVkKSAqLwotLyogRVRIX0dJR19BQ1RJVkVfVU5JVF9JRCAqLwl7IDMsCTIsCTIsCTN9LAkvKiBhY3RpdmUgTUFDIHVuaXQgY291bnQgKHVwZGF0ZWQgYnkgZXRoQ29tUGh5KSAqLwotLyogVVNCX1VOSVRfSUQgICAgICAqLwkJeyAxLAkxLAkwLAkxfSwKLS8qIFVTQjNfVU5JVF9JRCAgICAgKi8JCXsgMiwJMiwJMiwJMn0sCi0vKiBJRE1BX1VOSVRfSUQgICAgICovCQl7IDAsCTAsCTAsCTB9LAotLyogWE9SX1VOSVRfSUQgICAgICAqLwkJeyAyLAkyLAkyLAkyfSwKLS8qIFNBVEFfVU5JVF9JRCAgICAgKi8JCXsgMiwJMiwJMiwJNH0sCi0vKiBURE1fMzJDSF9VTklUX0lEICovCQl7IDEsCTEsCTAsCTF9LAotLyogVUFSVF9VTklUX0lEICAgICAqLwkJeyA0LAk0LAk0LAk0fSwKLS8qIENFU0FfVU5JVF9JRCAgICAgKi8JCXsgMiwJMiwJMiwJMn0sCi0vKiBTUElfVU5JVF9JRCAgICAgICovCQl7IDIsCTIsCTIsCTJ9LAotLyogQVVESU9fVU5JVF9JRCAgICAqLwkJeyAxLAkxLAkwLAkxfSwKLS8qIFNESU9fVU5JVF9JRCAgICAgKi8JCXsgMSwJMSwJMSwJMX0sCi0vKiBUU19VTklUX0lEICAgICAgICovCQl7IDAsCTAsCTAsCTB9LAotLyogWFBPTl9VTklUX0lEICAgICAqLwkJeyAwLAkwLAkwLAkwfSwKLS8qIEJNX1VOSVRfSUQgICAgICAgKi8JCXsgMCwJMCwJMCwJMH0sCi0vKiBQTkNfVU5JVF9JRCAgICAgICovCQl7IDAsCTAsCTAsCTB9LAotLyogSTJDX1VOSVRfSUQgICAgICAqLwkJeyAyLAkyLAkyLAkyfSwKLS8qIFFTR01JSV9VTklUX0lEICAgKi8JCXsgMSwJMCwJMCwJMX0sCi0vKiBYQVVJX1VOSVRfSUQgICAgICovCQl7IDAsCTAsCTAsCTB9LAotLyogVVNCM19IT1NUX1VOSVRfSUQqLwkJeyAyLAkyLAkyLAkyfSwKKy8qCQkJCTY4MjAJNjgxMAk2ODExCTY4MjgJNlcyMgk2VzIzICovCisvKgkJCQlBMzg1CUEzODAJQTM4MS8yCUEzODgJQTM4MwlBMzg0ICovCisvKgkJCQl8PT09PT09PSBIVyBGbGF2b3JzID09PT09PT18CXw9PVZpcnR1YWw9PXwqLworLyogRFJBTV9VTklUX0lEICAgICAqLwkJeyAxLAkxLAkxLAkxLAkxLAkxfSwKKy8qIFBFWF9VTklUX0lEICAgICAgKi8JCXsgNCwJMywJMywJNCwJMiwJMn0sCisvKiBFVEhfR0lHX1VOSVRfSUQgICovCQl7IDMsCTIsCTIsCTMsCTIsCTJ9LAorLyoJRVRIX0dJR19VTklUX0lEIC0+IHRvdGFsIFNvQyBNQUMgdW5pdCBjb3VudCAoTm90IHVwZGF0ZWQpICovCisvKiBFVEhfR0lHX0FDVElWRV9VTklUX0lEICovCXsgMywJMiwJMiwJMywJMiwJMn0sCisvKglFVEhfR0lHX0FDVElWRV9VTklUX0lEIC0+IGFjdGl2ZSBNQUMgdW5pdCBjb3VudCAodXBkYXRlZCBieSBldGhDb21QaHkpICovCisvKiBVU0JfVU5JVF9JRCAgICAgICovCQl7IDEsCTEsCTAsCTEsCTEsCTF9LAorLyogVVNCM19VTklUX0lEICAgICAqLwkJeyAyLAkyLAkyLAkyLAkxLAkxfSwKKy8qIElETUFfVU5JVF9JRCAgICAgKi8JCXsgMCwJMCwJMCwJMCwJMCwJMH0sCisvKiBYT1JfVU5JVF9JRCAgICAgICovCQl7IDIsCTIsCTIsCTIsCTIsCTJ9LAorLyogU0FUQV9VTklUX0lEICAgICAqLwkJeyAyLAkyLAkyLAk0LAkxLAkxfSwKKy8qIFRETV8zMkNIX1VOSVRfSUQgKi8JCXsgMSwJMSwJMCwJMSwJMCwJMX0sCisvKiBVQVJUX1VOSVRfSUQgICAgICovCQl7IDQsCTQsCTQsCTQsCTEsCTF9LAorLyogQ0VTQV9VTklUX0lEICAgICAqLwkJeyAyLAkyLAkyLAkyLAkyLAkyfSwKKy8qIFNQSV9VTklUX0lEICAgICAgKi8JCXsgMiwJMiwJMiwJMiwJMiwJMn0sCisvKiBBVURJT19VTklUX0lEICAgICovCQl7IDEsCTEsCTAsCTEsCTAsCTF9LAorLyogU0RJT19VTklUX0lEICAgICAqLwkJeyAxLAkxLAkxLAkxLAkxLAkxfSwKKy8qIFRTX1VOSVRfSUQgICAgICAgKi8JCXsgMCwJMCwJMCwJMCwJMCwJMH0sCisvKiBYUE9OX1VOSVRfSUQgICAgICovCQl7IDAsCTAsCTAsCTAsCTAsCTB9LAorLyogQk1fVU5JVF9JRCAgICAgICAqLwkJeyAwLAkwLAkwLAkwLAkwLAkwfSwKKy8qIFBOQ19VTklUX0lEICAgICAgKi8JCXsgMCwJMCwJMCwJMCwJMCwJMH0sCisvKiBJMkNfVU5JVF9JRCAgICAgICovCQl7IDIsCTIsCTIsCTIsCTEsCTF9LAorLyogUVNHTUlJX1VOSVRfSUQgICAqLwkJeyAxLAkwLAkwLAkxLAkwLAkwfSwKKy8qIFhBVUlfVU5JVF9JRCAgICAgKi8JCXsgMCwJMCwJMCwJMCwJMCwJMH0sCisvKiBVU0IzX0hPU1RfVU5JVF9JRCovCQl7IDIsCTIsCTIsCTIsCTEsCTF9LAorLyogU0VSREVTX1VOSVRfSUQgICAqLwkJeyA2LAk1LAk0LAk2LAk0LAk0fSwKIH07CiAjZWxzZSAgLyogaWYgKENPTkZJR19BUk1BREFfMzlYKSAqLwogTVZfVU5JVF9JRCBtdkN0cmxTb2NVbml0TnVtc1tNQVhfVU5JVFNfSURdW01BWF9ERVZfSURfTlVNXSA9IHsKQEAgLTE3Niw2ICsxODMsNyBAQAogLyogUVNHTUlJX1VOSVRfSUQJCSovIHsgMCwJMX0sCiAvKiBYQVVJX1VOSVRfSUQJCQkqLyB7IDEsCTF9LAogLyogVVNCM19IT1NUX1VOSVRfSUQJCSovIHsgMSwJMn0sCisvKiBTRVJERVNfVU5JVF9JRAkJKi8geyA3LAk3fSwKIH07CiAjZW5kaWYKIApAQCAtMTg5LDYgKzE5NywxMCBAQAogI2RlZmluZSBTRVJERVNfUlhBVUkoeCkJCSgweDEwMCA8PCB4KQkvKiBiaXRzIDggICAgICAgOiBSWEFVSSBwb3J0IDAgaW5kaWNhdGlvbiAqLwogc3RhdGljIE1WX1UzMiBldGhDb21QaHk7CiAKKy8qIHVzYkNvbVBoeTogYml0IGRlc2NyaXB0aW9uIGZvciBVU0IgcG9ydCBwZXIgU2VyRGVzIExhbmUsCisgICBpZiBTZXJEZXMgbGFuZSBjb25uZWN0ZWQgdG8gVVNCIGhvc3QgI1gsIGVuYWJsZSBiaXQgI1ggdXNiQ29tUGh5ICovCitzdGF0aWMgTVZfVTMyIHVzYkNvbVBoeTsKKwogLyogT25seSB0aGUgZmlyc3QgdW5pdCwgb25seSB0aGUgc2Vjb25kIHVuaXQgb3IgYm90aCBjYW4gYmUgYWN0aXZlIG9uIHRoZSBzcGVjaWZpYyBib2FyZCAqLwogc3RhdGljIE1WX0JPT0wgc2F0YVVuaXRBY3RpdmVbTVZfU0FUQV9NQVhfVU5JVF0gPSB7TVZfRkFMU0UsIE1WX0ZBTFNFfTsKIApAQCAtMzAwLDYgKzMxMiw3IEBACiBNVl9VMzIgbXZDdHJsRGV2SWRJbmRleEdldChNVl9VMzIgY3RybE1vZGVsKQogewogCXN3aXRjaCAoY3RybE1vZGVsKSB7CisJLyogSFcgZmxhdm9ycyAqLwogCWNhc2UgTVZfNjgyMF9ERVZfSUQ6CiAJCXJldHVybiBNVl82ODIwX0lOREVYOwogCWNhc2UgTVZfNjgxMF9ERVZfSUQ6CkBAIC0zMTIsNiArMzI1LDExIEBACiAJCXJldHVybiBNVl82OTIwX0lOREVYOwogCWNhc2UgTVZfNjkyOF9ERVZfSUQ6CiAJCXJldHVybiBNVl82OTI4X0lOREVYOworCS8qIFZpcnR1YWwgZmxhdm9ycyAqLworCWNhc2UgTVZfNlcyMl9ERVZfSUQ6IC8qIDZXMjI9QTM4MyAqLworCQlyZXR1cm4gTVZfNlcyMl9JTkRFWDsKKwljYXNlIE1WXzZXMjNfREVWX0lEOiAvKiA2VzIzPUEzODQgKi8KKwkJcmV0dXJuIE1WXzZXMjNfSU5ERVg7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIE1WXzY4MjBfSU5ERVg7CiAJfQpAQCAtNDEyLDcgKzQzMCwyNiBAQAogCX0gZWxzZQogCQlyZXR1cm4gc2VyZGVzTnVtOwogfQotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Q3RybElzVXNiU2VyRGVzQ29ubmVjdGVkCisqCisqIERFU0NSSVBUSU9OOiBjaGVjayBpZiBTZXJEZXMgbGFuZSBpcyBjb25uZWN0ZWQgdG8gVVNCMyBob3N0LgorKgorKgorKiBJTlBVVDogTm9uZQorKgorKiBPVVRQVVQ6IE5vbmUKKyoKKyogUkVUVVJOOnJldHVybiB0cnVlIGlmIFNlckRlcyBsYW5lIGlzIGNvbm5lY3RlZCB0byBVU0IzIGhvc3QsIGZhbHNlIG90aGVyd2lzZS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Q3RybElzVXNiU2VyRGVzQ29ubmVjdGVkKE1WX1UzMiB1c2JQb3J0KQoreworCWlmICgoKHVzYkNvbVBoeSA+PiB1c2JQb3J0KSAmIDBYMSkgPT0gMSkKKwkJcmV0dXJuIE1WX1RSVUU7CisJcmV0dXJuIE1WX0ZBTFNFOworfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZDdHJsU2VyZGVzQ29uZmlnRGV0ZWN0CiAqCkBAIC00NDAsMTAgKzQ3Nyw4IEBACiAKIAlNVl9CT0FSRF9QRVhfSU5GTyAqYm9hcmRQZXhJbmZvID0gbXZCb2FyZFBleEluZm9HZXQoKTsKIAotCW1heFNlcmRlc0xhbmUgPSBNVl9TRVJERVNfTUFYX0xBTkVTOwotCWlmIChNVl82ODEwX0RFVl9JRCA9PSBtdkN0cmxNb2RlbEdldCgpKQotCQltYXhTZXJkZXNMYW5lID0gTVZfU0VSREVTX01BWF9MQU5FU182ODEwOwotCisJbWF4U2VyZGVzTGFuZSA9IG12Q3RybFNvY1VuaXRJbmZvTnVtR2V0KFNFUkRFU19VTklUX0lEKTsKKwl1c2JDb21QaHkgPSAwOwogCW1lbXNldChib2FyZFBleEluZm8sIDAsIHNpemVvZihNVl9CT0FSRF9QRVhfSU5GTykpOwogCWNvbW1QaHlDZmdSZWcgPSBNVl9SRUdfUkVBRChDT01NX1BIWV9TRUxFQ1RPUl9SRUcpOwogCURCKHByaW50ZigibXZDdHJsU2VyZGVzQ29uZmlnOiBjb21tUGh5Q2ZnUmVnPTB4JXhcbiIsIGNvbW1QaHlDZmdSZWcpKTsKQEAgLTQ1NiwxMiArNDkxLDE3IEBACiAJCWlmTm8gPSBjb21QaHlDZmcgJiAweDBmOwogCQlzd2l0Y2ggKGNvbVBoeUNmZyAmIDB4RjApIHsKIAkJY2FzZSBTRVJERVNfVU5JVF9QRVg6Ci0JCQlpZiAoKGlmTm8gPT0gUEVYMF9JRikgJiYgKGNvbW1QaHlDZmdSZWcgJiBQQ0lFMF9YNF9FTl9NQVNLKSkKLQkJCQlib2FyZFBleEluZm8tPnBleFVuaXRDZmdbaWZOb10gPSBQRVhfQlVTX01PREVfWDQ7Ci0JCQllbHNlCisJCQlpZiAoKGlmTm8gPT0gUEVYMF9JRikgJiYgKGNvbW1QaHlDZmdSZWcgJiBQQ0lFMF9YNF9FTl9NQVNLKSkgeworCQkJCWlmIChzZXJkZXNOdW0gPT0gMCkgeworCQkJCQlib2FyZFBleEluZm8tPnBleFVuaXRDZmdbaWZOb10gPSBQRVhfQlVTX01PREVfWDQ7CisJCQkJCWJvYXJkUGV4SW5mby0+cGV4TWFwcGluZ1tib2FyZFBleEluZm8tPmJvYXJkUGV4SWZOdW1dID0gaWZObzsKKwkJCQkJYm9hcmRQZXhJbmZvLT5ib2FyZFBleElmTnVtKys7CisJCQkJfQorCQkJfSBlbHNlIHsKIAkJCQlib2FyZFBleEluZm8tPnBleFVuaXRDZmdbaWZOb10gPSBQRVhfQlVTX01PREVfWDE7Ci0JCQlib2FyZFBleEluZm8tPnBleE1hcHBpbmdbYm9hcmRQZXhJbmZvLT5ib2FyZFBleElmTnVtXSA9IGlmTm87Ci0JCQlib2FyZFBleEluZm8tPmJvYXJkUGV4SWZOdW0rKzsKKwkJCQlib2FyZFBleEluZm8tPnBleE1hcHBpbmdbYm9hcmRQZXhJbmZvLT5ib2FyZFBleElmTnVtXSA9IGlmTm87CisJCQkJYm9hcmRQZXhJbmZvLT5ib2FyZFBleElmTnVtKys7CisJCQl9CiAJCQlEQihwcmludGYoIlBFWCwgaWY9JWRcbiIsIGlmTm8pKTsKIAkJCWJyZWFrOwogCQljYXNlIFNFUkRFU19VTklUX1NBVEE6CkBAIC00OTQsNiArNTM0LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIFNFUkRFU19VTklUX1VTQl9IOgogCQkJREIocHJpbnRmKCJVU0JfSCwgaWY9JWRcbiIsIGlmTm8pKTsKKwkJCXVzYkNvbVBoeSB8PSAwWDEgPDwgaWZObzsKIAkJCXVzYkhJZkNvdW50Kys7CiAJCQlicmVhazsKIAkJY2FzZSBTRVJERVNfVU5JVF9VU0I6CkBAIC01OTQsOCArNjM1LDEwIEBACiAJaWYgKCEobXZCb2FyZElzTW9kdWxlQ29ubmVjdGVkKE1WX01PRFVMRV9OT1IpIHx8CiAJICAgIG12Qm9hcmRJc01vZHVsZUNvbm5lY3RlZChNVl9NT0RVTEVfTkFORCkgfHwKIAkJbXZCb2FyZElzTW9kdWxlQ29ubmVjdGVkKE1WX01PRFVMRV9OQU5EX09OX0JPQVJEKSB8fAotCQltdkN0cmxNb2RlbEdldCgpID09IE1WXzY4MTFfREVWX0lEKSkKLQkJZXRoQ29tUGh5IHw9IE9OX0JPQVJEX1JHTUlJKDEpOyAvKiBOT1IvTkFORCBtb2R1bGVzIG92ZXJpZGVzIFJHTUlJLTEgTVBQJ3MgKi8KKwkJbXZDdHJsTW9kZWxHZXQoKSA9PSBNVl82ODExX0RFVl9JRCB8fAorCQkobXZDdHJsTW9kZWxHZXQoKSA9PSBNVl82VzIyX0RFVl9JRCAmJiBtdkJvYXJkSWRHZXQoKSA9PSBEQl9CUF82ODIxX0lEKSkpIHsKKwkJCWV0aENvbVBoeSB8PSBPTl9CT0FSRF9SR01JSSgxKTsgLyogTk9SL05BTkQgbW9kdWxlcyBvdmVyaWRlcyBSR01JSS0xIE1QUCdzICovCisJCX0KIAogCW12Q3RybFNlcmRlc0NvbmZpZ0RldGVjdCgpOwogCkBAIC02NDAsOSArNjgzLDE0IEBACiAJLypTRElPIFBVUCBFbmFibGUgKEJJVDYpICovCiAJTVZfUkVHX0JJVF9TRVQoUFVQX0VOX1JFRywgQklUNik7CiAKKwkvKlNESU8gQ2xrIFBVUCBFbmFibGUgKEJJVDcpICovCisJTVZfUkVHX0JJVF9TRVQoUFVQX0VOX1JFRywgQklUNyk7CisKIAkvKiBTZGlvX2p0YWdfY2VsbF9vZV9zbXBfZW4gKi8KIAlNVl9SRUdfQklUX1NFVChQVVBfRU5fUkVHLCBCSVQxNCk7CiAKKwkvKiBTZGlvIENsayBqdGFnIGNlbGwgb2Ugc21wIGVuICovCisJTVZfUkVHX0JJVF9TRVQoUFVQX0VOX1JFRywgQklUMTUpOwogCiAJLyogWFhYOiBGb2xsb3dpbmcgc2V0dGluZyBzaG91bGQgYmUgY29uZmlndXJlZCBieSB1LWJvb3QgKi8KIAlNVl9SRUdfQklUX1NFVChTT0NfREVWX01VWF9SRUcsIEJJVDApOyAvKiBDb25maWd1cmUgTkFORCBmbHVzaCBlbmFibGVkICovCkBAIC03MDcsMTEgKzc1NSwyMyBAQAogTVZfVTMyIG12Q3RybGJvb3RTcmNHZXQodm9pZCkKIHsKIAlNVl9VMzIgc2F0clZhbCwgYm9vdFNyYzsKKwlNVl9VMzIgc2VjQm9vdEN0cmwgPSBNVl9SRUdfUkVBRChTRUNVUkVfQk9PVF9SRUcpOwogCi0Jc2F0clZhbCA9IE1WX1JFR19SRUFEKE1QUF9TQU1QTEVfQVRfUkVTRVQpOwotCWJvb3RTcmMgPSAoc2F0clZhbCAmIFNBVFJfQk9PVF9TUkNfTUFTSykgPj4gU0FUUl9CT09UX1NSQ19PRkZTOworCWlmICgoc2VjQm9vdEN0cmwgJiBTRUNVUkVfQk9PVF9FTkFfTUFTSykgIT0gMCkgeworCQkvKiBTZWN1cmUgbW9kZQorCQkgT25jZSB0aGUgc2VjdXJlIG1vZGUgYWN0aXZhdGVkIGJ5IGVmdXNlLCB0aGUgYWN0dWFsCisJCSBib290IGRldmljZSBpcyBhbHdheXMgdGFrZW4gZnJvbSB0aGUgZWZ1c2UgYnkgdGhlIEhXCisJCSBhbmQgYW55IG90aGVyIGJvb3QgZGV2aWNlIGNvbmZpZ3VyZWQgYnkgU2F0UiBpcyBpZ25vcmVkLgorCQkqLworCQlib290U3JjID0gKHNlY0Jvb3RDdHJsICYgU0VDVVJFX0JPT1RfREVWSUNFX01BU0spID4+IFNFQ1VSRV9CT09UX0RFVklDRV9PRkZTOworCX0gZWxzZSB7CiAKLQlEQihtdk9zUHJpbnRmKCIlczogUmVhZCBmcm9tIFNAUiBCT09UU1JDID0gMHglWFxuIiwgX19mdW5jX18sIGJvb3RTcmMpKTsKKwkJc2F0clZhbCA9IE1WX1JFR19SRUFEKE1QUF9TQU1QTEVfQVRfUkVTRVQpOworCQlib290U3JjID0gKHNhdHJWYWwgJiBTQVRSX0JPT1RfU1JDX01BU0spID4+IFNBVFJfQk9PVF9TUkNfT0ZGUzsKKworCQlEQihtdk9zUHJpbnRmKCIlczogUmVhZCBmcm9tIFNAUiBCT09UU1JDID0gMHglWFxuIiwgX19mdW5jX18sIGJvb3RTcmMpKTsKKwl9CisKIAlyZXR1cm4gYm9vdFNyYzsKIH0KIApAQCAtMTI5NiwxMiArMTM1NiwxNiBAQAogCU1WX1UzMiBkZWZhdWx0Q3RybElkLCBjdHJsSWQgPSAoTVZfUkVHX1JFQUQoREVWX0lEX1JFRykgJiAoREVWSUNFX0lEX01BU0spKSA+PiBERVZJQ0VfSURfT0ZGUzsKIAogCXN3aXRjaCAoY3RybElkKSB7CisJLyogSFcgZmxhdm9ycyAqLwogCWNhc2UgTVZfNjgyMF9ERVZfSUQ6CiAJY2FzZSBNVl82ODEwX0RFVl9JRDoKIAljYXNlIE1WXzY4MTFfREVWX0lEOgogCWNhc2UgTVZfNjgyOF9ERVZfSUQ6CiAJY2FzZSBNVl82OTIwX0RFVl9JRDoKIAljYXNlIE1WXzY5MjhfREVWX0lEOgorCS8qIFZpcnR1YWwgZmxhdm9ycyAqLworCWNhc2UgTVZfNlcyMl9ERVZfSUQ6IC8qIDZXMjI9QTM4MyAqLworCWNhc2UgTVZfNlcyM19ERVZfSUQ6IC8qIDZXMjM9QTM4NCAqLwogCQlyZXR1cm4gY3RybElkOwogCWRlZmF1bHQ6CiAJCS8qRGV2aWNlIElEIERlZmF1bHQgZm9yIEEzOHg6IDY4MjAgLCBmb3IgQTM5eDogNjkyMCAqLwpAQCAtMTMzMiw2ICsxMzk2LDcgQEAKIE1WX1UxNiBtdkN0cmxEZXZpY2VJZEdldChNVl9WT0lEKQogewogCXN3aXRjaCAobXZDdHJsTW9kZWxHZXQoKSkgeworCS8qIEhXIGZsYXZvcnMgKi8KIAljYXNlIE1WXzY4MTBfREVWX0lEOgogCQlyZXR1cm4gMHgzODA7CiAJY2FzZSBNVl82ODExX0RFVl9JRDoKQEAgLTEzNDAsNiArMTQwNSwxMSBAQAogCQlyZXR1cm4gMHgzODU7CiAJY2FzZSBNVl82ODI4X0RFVl9JRDoKIAkJcmV0dXJuIDB4Mzg4OworCS8qIFZpcnR1YWwgZmxhdm9ycyAqLworCWNhc2UgTVZfNlcyMl9ERVZfSUQ6IC8qIDZXMjI9QTM4MyAqLworCQlyZXR1cm4gMHgzODM7CisJY2FzZSBNVl82VzIzX0RFVl9JRDogLyogNlcyMz1BMzg0ICovCisJCXJldHVybiAweDM4NDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMHgzODA7CS8qIHVzZSBsb3dlciBkZXZpY2UgYXMgZGVmYXVsdCBpbiBjYXNlIG9mIGVycm9yICovCiAJfQpAQCAtMTM4OCw3ICsxNDU4LDE2IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfU1RBVFVTIG12Q3RybE5hbWVHZXQoY2hhciAqcE5hbWVCdWZmKQogewotCW12T3NTUHJpbnRmKHBOYW1lQnVmZiwgIiVzJXgiLCBTT0NfTkFNRV9QUkVGSVgsIG12Q3RybE1vZGVsR2V0KCkpOworCU1WX1UxNiBjdHJsTW9kZWwgPSBtdkN0cmxNb2RlbEdldCgpOworCS8qIFZpcnR1YWwgRmxhdm9ycyBoYXMgZGlmZmVyZW50IGN0cmxNb2RlbCB2YWx1ZXMgdGhhbgorCSAqIGl0J3MgQ29udHJvbGxlciBuYW1lczogNlcyMjogMHg2ODIzIHwgNlcyMzogMHg2ODI0ICovCisJaWYgKGN0cmxNb2RlbCA9PSBNVl82VzIyX0RFVl9JRCkKKwkJbXZPc1NQcmludGYocE5hbWVCdWZmLCAiJXMlcyIsIFNPQ19OQU1FX1BSRUZJWCwgTVZfNlcyMl9ERVZfTkFNRSk7CisJZWxzZSBpZiAoY3RybE1vZGVsID09IE1WXzZXMjNfREVWX0lEKQorCQltdk9zU1ByaW50ZihwTmFtZUJ1ZmYsICIlcyVzIiwgU09DX05BTUVfUFJFRklYLCBNVl82VzIzX0RFVl9OQU1FKTsKKwllbHNlCisJCW12T3NTUHJpbnRmKHBOYW1lQnVmZiwgIiVzJXgiLCBTT0NfTkFNRV9QUkVGSVgsIGN0cmxNb2RlbCk7CisKIAlyZXR1cm4gTVZfT0s7CiB9CiAKQEAgLTIxNDYsOCArMjIyNSwxNCBAQAogCU1WXzMyIHJlZyA9IDA7CiAKIAkvKiBJbml0aWF0ZXMgVFNFTiBoYXJkd2FyZSByZXNldCBvbmNlICovCi0JaWYgKChNVl9SRUdfUkVBRChUU0VOX0NPTkZfUkVHKSAmIFRTRU5fQ09ORl9SU1RfTUFTSykgPT0gMCkKLQkJTVZfUkVHX0JJVF9TRVQoVFNFTl9DT05GX1JFRywgVFNFTl9DT05GX1JTVF9NQVNLKTsKKwlpZiAoKE1WX1JFR19SRUFEKFRTRU5fQ09OVFJPTF9NU0JfUkVHKSAmIFRTRU5fQ09OVFJPTF9NU0JfUlNUX01BU0spID09IDApIHsKKwkJTVZfUkVHX0JJVF9TRVQoVFNFTl9DT05UUk9MX01TQl9SRUcsIFRTRU5fQ09OVFJPTF9NU0JfUlNUX01BU0spOworCQkvKiBzZXQgVHNlbiBUYyBUcmltIHRvIGNvcnJlY3QgZGVmYXVsdCB2YWx1ZSAoZXJyYXRhICMxMzI2OTgpICovCisJCXJlZyA9IE1WX1JFR19SRUFEKFRTRU5fQ09OVFJPTF9MU0JfUkVHKTsKKwkJcmVnICY9IH5UU0VOX0NPTlRST0xfTFNCX1RDX1RSSU1fTUFTSzsKKwkJcmVnIHw9IDB4MyA8PCBUU0VOX0NPTlRST0xfTFNCX1RDX1RSSU1fT0ZGU0VUOworCQlNVl9SRUdfV1JJVEUoVFNFTl9DT05UUk9MX0xTQl9SRUcsIHJlZyk7CisJfQogCW12T3NEZWxheSgxMCk7CiAKIAkvKiBDaGVjayBpZiB0aGUgcmVhZG91dCBmaWVsZCBpcyB2YWxpZCAqLwpAQCAtMjE1OCw4ICsyMjQzLDkgQEAKIAlyZWcgPSBNVl9SRUdfUkVBRChUU0VOX1NUQVRVU19SRUcpOwogCXJlZyA9IChyZWcgJiBUU0VOX1NUQVRVU19URU1QX09VVF9NQVNLKSA+PiBUU0VOX1NUQVRVU19URU1QX09VVF9PRkZTRVQ7CiAKLQlyZXR1cm4gKCgoKDEwMDAwICogcmVnKSAvIDIxNDQ1KSAqIDEwMDApIC0gMjcyNjc0KSAvIDEwMDA7CisJcmV0dXJuICgoNDc2MSAqIHJlZykgLSAyNzkxMDAwKSAvIDEwMDAwOwogfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkN0cmxOYW5kQ2xrU2V0CiAqCkBAIC0yMjE4LDY2ICsyMzA0LDIxIEBACiAqIG12Q3RybFVzYk1hcEdldAogKgogKiBERVNDUklQVElPTjoKLSogICAgICAgR2V0IHRoZSBtYXAgb2YgVVNCIHBvcnRzIGlmIGV4aXN0cworKglDb250cm9sbGVyIFVTQiBtYXBwaW5nIGlzIG5vdCB2YWxpZCBmb3IgQTM4eC9hMzl4IFBvcnQgYXJlIG1hcHBlZCBwZXIgYm9hcmQgdmlhIG12Qm9hcmRJc1VzYlBvcnRDb25uZWN0ZWQuCiAqCiAqIElOUFVUOgogKgl0aGUgY3VycmVudCBVU0IgdW5pdChVU0IzLjAgb3IgVVNCMi4wKQogKgl0aGUgY3VycmVudCB1c2JBY3RpdmUobm90IHVzZWQsIHJlbGV2YW50IGZvciBvdGhlciBTb0MpCiAqCiAqIE9VVFBVVDoKLSogICAgICAgTWFwcGVkIHVzYkFjdGl2ZS4KKyoJTWFwcGVkIHVzYkFjdGl2ZS4KICoKICogUkVUVVJOOgogKiAgICAgICBOb25lCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfVTMyIG12Q3RybFVzYk1hcEdldChNVl9VMzIgdXNiVW5pdElkLCBNVl9VMzIgdXNiQWN0aXZlKQogewotCU1WX1UzMiBsYW5lNUNmZywgbGFuZTNDZmcsIHBoeVNlbGVjdG9yOwotCi0JLyogT24gQTM5eCBhbmQgQTM4eCBBMCByZXZpc2lvbiwgdGhlcmUgYXJlIDIgVVNCMy4wIE1BQ3MsIGFuZCB0aGUgY29ubmVjdGl2aXR5IG9mIHRoZQotCSAgIFVTQjMuMCBkZXBlbmRzIG9uIHRoZSBTZXJEZXMgY29uZmlndXJhdGlvbjoKLQkJMiBTZXJEZXMgbGFuZXMgZm9yIFVTQjMuMDoKLQkJfCB1c2JBY3RpdmUJfCAgVVNCIHBvcnQJCXwKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJfAkwCXwgVVNCMy4wIEhvc3QgUG9ydCAjMAl8Ci0JCXwJMQl8IFVTQjMuMCBIb3N0IFBvcnQgIzEJfAotCi0JCXNpbmdsZSBTZXJEZXMgbGFuZSM1IE9yIHNpbmdsZSBTZXJEZXMgbGFuZSMzIGZvciBVU0IzLjAKLQkJfCB1c2JBY3RpdmUJfCAgVVNCIHBvcnQJCQkJfAotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJfAkwCXwgVVNCMy4wIEhvc3QgUG9ydCAjMQkJCXwKLQkJfAkxCXwgVVNCMi4wIHZpYSBVU0IzLjAgIEhvc3QgUG9ydCAjMAl8Ci0KLQkJV2hlbiBvbmx5IHNpbmdsZSBVU0IzLjAgSG9zdCBwb3J0ICMxIGlzIGNvbm5lY3RlZCB2aWEgU2VyRGVzIExhbmUgMyBvciA1LAotCQltYXAgdGhlIFVTQiBwb3J0ICMxIHRvIGJlIHVzYkFjdGl2ZT0wCi0JCSovCi0KLQkvKiBpZiBhMzh4IFowIHJldiwgcmV0dXJuIG9yaWdpbmFsIG1hcHBpbmcgKi8KLQlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfODhGNjhYWCAmJiBtdkN0cmxSZXZHZXQoKSA9PSBNVl84OEY2OFhYX1oxX0lEKQotCQlyZXR1cm4gdXNiQWN0aXZlOwotCi0JLyogaWYgb25seSBzaW5nbGUgVVNCMy4wIFNlckRlcywgdmlhIExhbmU1IG9yIHZpYSBsYW5lMyAqLwotCWlmICh1c2JVbml0SWQgPT0gVVNCM19VTklUX0lEICYmIG12Q3RybFVzYjNNYXhHZXQoKSA9PSAxKSB7Ci0JCXBoeVNlbGVjdG9yID0gTVZfUkVHX1JFQUQoQ09NTV9QSFlfU0VMRUNUT1JfUkVHKTsKLQkJbGFuZTVDZmcgPSAocGh5U2VsZWN0b3IgJiBDT01QSFlfU0VMRUNUX01BU0soNSkpID4+IENPTVBIWV9TRUxFQ1RfT0ZGUyg1KTsKLQkJbGFuZTNDZmcgPSAocGh5U2VsZWN0b3IgJiBDT01QSFlfU0VMRUNUX01BU0soMykpID4+IENPTVBIWV9TRUxFQ1RfT0ZGUygzKTsKLQkJaWYgKGxhbmU1Q2ZnID09IENPTVBIWV9TRUxFQ1RfTEFORTVfVVNCM19WQUwgfHwKLQkJCWxhbmUzQ2ZnID09IENPTVBIWV9TRUxFQ1RfTEFORTNfVVNCM19WQUwpCi0JCQlyZXR1cm4gMSAtIHVzYkFjdGl2ZTsKLQl9Ci0jaWZkZWYgQ09ORklHX0FSTUFEQV8zOVgKLQkvKiB0ZW1wb3JlcnkgZml4IGZvciBBMzl4OgotCSAgIEluIG9yZGVyIHRvIGtlZXAgdGhlIHNhbWUgVVNCIG1hcHBpbmcgZm9yIHhIQ0kgdXNhZ2UsCi0JICAgbmV2ZXJtaW5kIGlmIHBvcnQgaXMgY29ubmVjdGVkIHdpdGggU2VyRGVzIGxhbmUsIG9yIHdpdGhvdXQsCi0JICAgcmV0dXJuIHRoZSBzYW1lIG1hcHBpbmcgZm9yIGFsbCB4SENJL1VTQjMuMCB1c2FnZS4KLQlUT0RPOiByZW1vdmUgVVNCIG1hcHBpbmcgYW5kIHVzZSBVU0IgYm9hcmQgc3RydWN0cmUgaW5mb3JtYXRpb24gKi8KLQlpZiAodXNiVW5pdElkID09IFVTQjNfVU5JVF9JRCkKLQkJcmV0dXJuIDEgLSB1c2JBY3RpdmU7Ci0jZW5kaWYKLQkvKiBJZiBBMzl4IG9yIEEzOHggQTAgcmV2LCBidXQgdGhlIG5vIG1hcHBpbmcgbmVlZGVkOgotCSAqIC0gc2luZ2xlIFVTQiMwIGluIHVzZQotCSAqIC0gYm90aCBVU0IgdW5pdHMgYXJlIGluIHVzZSAqLwotCisJLypObyBjb250cm9sbGVyIHBvcnQgbWFwcGluZyBmb3IgYTM4eC9hMzl4Ki8KIAlyZXR1cm4gdXNiQWN0aXZlOwogfQogCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuaAppbmRleCBmMjJhOWJlLi4xNDBiMjRjIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmgKQEAgLTEyNiwxMyArMTI2LDEzIEBACiAvKiBMYW5lIDAgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwgU0VSREVTX1VOSVRfU0FUQSB8IDAsCVNFUkRFU19VTklUX0dCRSAgfCAwLFwKIAkgICAgICBTRVJERVNfVU5JVF9HQkUsCQlTRVJERVNfVU5JVF9OQSwJCSAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsXAogCSAgICAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsCQkgICBTRVJERVNfVU5JVF9OQX0sICAgICBcCi0vKiBMYW5lIDEgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwgU0VSREVTX1VOSVRfUEVYIHwgUEVYMV9JRiwJU0VSREVTX1VOSVRfU0FUQSB8IDAsXAorLyogTGFuZSAxICovIHtTRVJERVNfVU5JVF9OQSwJCVNFUkRFU19VTklUX1BFWCB8IFBFWDBfSUYsIFNFUkRFU19VTklUX1BFWCB8IFBFWDBfSUYsCVNFUkRFU19VTklUX1NBVEEgfCAwLFwKIAkgICAgICBTRVJERVNfVU5JVF9HQkUgfCAwLAlTRVJERVNfVU5JVF9HQkUgfCAxLAkgICBTRVJERVNfVU5JVF9VU0JfSCB8IDAsCVNFUkRFU19VTklUX1FTR01JSSB8IDAsXAogCSAgICAgIFNFUkRFU19VTklUX0dCRSB8IDAsCVNFUkRFU19VTklUX0dCRSB8IDAsCSAgIFNFUkRFU19VTklUX05BfSwgICAgIFwKLS8qIExhbmUgMiAqLyB7U0VSREVTX1VOSVRfTkEsCQlTRVJERVNfVU5JVF9QRVggfCBQRVgxX0lGLCBTRVJERVNfVU5JVF9QRVggfCBQRVgyX0lGLAlTRVJERVNfVU5JVF9TQVRBIHwgMSxcCisvKiBMYW5lIDIgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMV9JRiwgU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwJU0VSREVTX1VOSVRfU0FUQSB8IDEsXAogCSAgICAgIFNFUkRFU19VTklUX0dCRSB8IDEsCVNFUkRFU19VTklUX0dCRSB8IDEsCSAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsXAogCSAgICAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsICAgICAgICAgICAgU0VSREVTX1VOSVRfTkF9LCAgICAgXAotLyogTGFuZSAzICovIHtTRVJERVNfVU5JVF9OQSwJCVNFUkRFU19VTklUX1BFWCB8IFBFWDNfSUYsIFNFUkRFU19VTklUX1BFWCB8IFBFWDNfSUYsICBTRVJERVNfVU5JVF9TQVRBIHwgMyxcCisvKiBMYW5lIDMgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYM19JRiwgU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwgIFNFUkRFU19VTklUX1NBVEEgfCAzLFwKIAkgICAgICBTRVJERVNfVU5JVF9HQkUgfCAyLAlTRVJERVNfVU5JVF9VU0JfSCB8IDEsICAgICBTRVJERVNfVU5JVF9VU0IsICAgICAgICAgICAgU0VSREVTX1VOSVRfR0JFIHwgMixcCiAJICAgICAgU0VSREVTX1VOSVRfTkEsCQlTRVJERVNfVU5JVF9OQSwgICAgICAgICAgICBTRVJERVNfVU5JVF9OQX0sICAgICBcCiAvKiBMYW5lIDQgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMV9JRiwgU0VSREVTX1VOSVRfTkEsICAgICAgICAgICAgIFNFUkRFU19VTklUX0dCRSAgfCAxLFwKQEAgLTE0NywxMyArMTQ3LDEzIEBACiAvKiBMYW5lIDAgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwgU0VSREVTX1VOSVRfU0FUQSB8IDAsCVNFUkRFU19VTklUX0dCRSAgfCAwLFwKIAkgICAgICBTRVJERVNfVU5JVF9HQkUsCQlTRVJERVNfVU5JVF9OQSwJCSAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsXAogCSAgICAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsCQkgICBTRVJERVNfVU5JVF9OQX0sICAgICBcCi0vKiBMYW5lIDEgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwgU0VSREVTX1VOSVRfUEVYIHwgUEVYMV9JRiwJU0VSREVTX1VOSVRfU0FUQSB8IDAsXAorLyogTGFuZSAxICovIHtTRVJERVNfVU5JVF9OQSwJCVNFUkRFU19VTklUX1BFWCB8IFBFWDBfSUYsIFNFUkRFU19VTklUX1BFWCB8IFBFWDBfSUYsCVNFUkRFU19VTklUX1NBVEEgfCAwLFwKIAkgICAgICBTRVJERVNfVU5JVF9HQkUgfCAwLAlTRVJERVNfVU5JVF9HQkUgfCAxLAkgICBTRVJERVNfVU5JVF9VU0JfSCB8IDAsCVNFUkRFU19VTklUX1FTR01JSSB8IDAsXAogCSAgICAgIFNFUkRFU19VTklUX0dCRSB8IDAsCVNFUkRFU19VTklUX0dCRSB8IDAsCSAgIFNFUkRFU19VTklUX05BfSwgICAgIFwKLS8qIExhbmUgMiAqLyB7U0VSREVTX1VOSVRfTkEsCQlTRVJERVNfVU5JVF9QRVggfCBQRVgxX0lGLCBTRVJERVNfVU5JVF9QRVggfCBQRVgyX0lGLAlTRVJERVNfVU5JVF9TQVRBIHwgMSxcCisvKiBMYW5lIDIgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMV9JRiwgU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwJU0VSREVTX1VOSVRfU0FUQSB8IDEsXAogCSAgICAgIFNFUkRFU19VTklUX0dCRSB8IDEsCVNFUkRFU19VTklUX0dCRSB8IDEsCSAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsXAogCSAgICAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsICAgICAgICAgICAgU0VSREVTX1VOSVRfTkF9LCAgICAgXAotLyogTGFuZSAzICovIHtTRVJERVNfVU5JVF9OQSwJCVNFUkRFU19VTklUX1BFWCB8IFBFWDNfSUYsIFNFUkRFU19VTklUX1BFWCB8IFBFWDNfSUYsICBTRVJERVNfVU5JVF9TQVRBIHwgMyxcCisvKiBMYW5lIDMgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYM19JRiwgU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwgIFNFUkRFU19VTklUX1NBVEEgfCAzLFwKIAkgICAgICBTRVJERVNfVU5JVF9HQkUgfCAyLAlTRVJERVNfVU5JVF9VU0JfSCB8IDEsICAgICBTRVJERVNfVU5JVF9VU0IsICAgICAgICAgICAgU0VSREVTX1VOSVRfR0JFIHwgMixcCiAJICAgICAgU0VSREVTX1VOSVRfWEFVSSB8IDMsCVNFUkRFU19VTklUX05BLCAgICAgICAgICAgIFNFUkRFU19VTklUX05BfSwgICAgIFwKIC8qIExhbmUgNCAqLyB7U0VSREVTX1VOSVRfTkEsCQlTRVJERVNfVU5JVF9QRVggfCBQRVgxX0lGLCBTRVJERVNfVU5JVF9OQSwgICAgICAgICAgICAgU0VSREVTX1VOSVRfR0JFICB8IDEsXApAQCAtMTcwLDEzICsxNzAsMTMgQEAKIAogCiAvKiBUZXJtYWwgU2Vuc29yIFJlZ2lzdGVycyAqLwotI2RlZmluZSBUU0VOX1NUQVRFX1JFRwkJCQkJCTB4RTQwNzAKLSNkZWZpbmUgVFNFTl9TVEFURV9PRkZTRVQJCQkJCTMxCi0jZGVmaW5lIFRTRU5fU1RBVEVfTUFTSwkJCQkJCSgweDEgPDwgVFNFTl9TVEFURV9PRkZTRVQpCisjZGVmaW5lIFRTRU5fQ09OVFJPTF9MU0JfUkVHCQkJCQkweEU0MDcwCisjZGVmaW5lIFRTRU5fQ09OVFJPTF9MU0JfVENfVFJJTV9PRkZTRVQJCQkJMAorI2RlZmluZSBUU0VOX0NPTlRST0xfTFNCX1RDX1RSSU1fTUFTSwkJCQkoMHg3IDw8IFRTRU5fQ09OVFJPTF9MU0JfVENfVFJJTV9PRkZTRVQpCiAKLSNkZWZpbmUgVFNFTl9DT05GX1JFRwkJCQkJCTB4RTQwNzQKLSNkZWZpbmUgVFNFTl9DT05GX1JTVF9PRkZTRVQJCQkJCTgKLSNkZWZpbmUgVFNFTl9DT05GX1JTVF9NQVNLCQkJCQkoMHgxIDw8IFRTRU5fQ09ORl9SU1RfT0ZGU0VUKQorI2RlZmluZSBUU0VOX0NPTlRST0xfTVNCX1JFRwkJCQkJMHhFNDA3NAorI2RlZmluZSBUU0VOX0NPTlRST0xfTVNCX1JTVF9PRkZTRVQJCQkJOAorI2RlZmluZSBUU0VOX0NPTlRST0xfTVNCX1JTVF9NQVNLCQkJCSgweDEgPDwgVFNFTl9DT05UUk9MX01TQl9SU1RfT0ZGU0VUKQogCiAjZGVmaW5lIFRTRU5fU1RBVFVTX1JFRwkJCQkJCTB4RTQwNzgKICNkZWZpbmUgVFNFTl9TVEFUVVNfUkVBRE9VVF9WQUxJRF9PRkZTRVQJCQkxMApAQCAtMjA5LDYgKzIwOSw3IEBACiBNVl9CT09MIG12Q3RybFNTQ0dJbml0KHZvaWQpOwogTVZfQk9PTCBtdkN0cmxQb3J0SXNTZXJkZXNTZ21paShNVl9VMzIgZXRoUG9ydCk7CiBNVl9CT09MIG12Q3RybFBvcnRJc1NlcmRlc1J4YXVpKE1WX1UzMiBldGhQb3J0KTsKK01WX0JPT0wgbXZDdHJsSXNVc2JTZXJEZXNDb25uZWN0ZWQoTVZfVTMyIHVzYlBvcnQpOwogTVZfQk9PTCBtdkN0cmxQb3J0SXNSZ21paShNVl9VMzIgZXRoUG9ydCk7CiBNVl9VMzIgbXZDdHJsR2V0Q3B1TnVtKE1WX1ZPSUQpOwogTVZfVTMyIG12Q3RybERldklkSW5kZXhHZXQoTVZfVTMyIGN0cmxNb2RlbCk7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudlJlZ3MuaCBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52UmVncy5oCmluZGV4IGEzMGViM2MuLjJiNGM5NGEgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52UmVncy5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52UmVncy5oCkBAIC0yMjgsNiArMjI4LDE1IEBACiAjZGVmaW5lIEdFTkVSQUxfUFVSUE9TRV9SRVNFUlZFRDFfUkVHCQkweDE4MkU0CiAjZGVmaW5lIEdFTkVSQUxfUFVSUE9TRV9SRVNFUlZFRDFfREVGQVVMVF9WQUxVRQkofkJJVDE3KQogCisvKioqKioqKioqKioqKioqKiovCisvKiBTZWN1cmUgYm9vdCAqLworLyoqKioqKioqKioqKioqKioqLworI2RlZmluZSBTRUNVUkVfQk9PVF9SRUcJCQkJMHgxODI4MAorI2RlZmluZSBTRUNVUkVfQk9PVF9FTkFfT0ZGUwkJCTAKKyNkZWZpbmUgU0VDVVJFX0JPT1RfRU5BX01BU0sJCQkoMSA8PCBTRUNVUkVfQk9PVF9FTkFfT0ZGUykKKyNkZWZpbmUgU0VDVVJFX0JPT1RfREVWSUNFX09GRlMJCQk4CisjZGVmaW5lIFNFQ1VSRV9CT09UX0RFVklDRV9NQVNLCQkJKDB4RkYgPDwgU0VDVVJFX0JPT1RfREVWSUNFX09GRlMpCisKIC8qIFVTQjMgcmVnaXN0ZXJzICovCiAjZGVmaW5lIE1WX1VTQjNfV0lOX0JBU0UoZGV2KQkJKE1WX1VTQjNfUkVHU19CQVNFKGRldikgKyAweDQwMDApCiAKQEAgLTM2OSw2ICszNzgsNyBAQAogCU1WX1UzMiBkZHJGcmVxOwogCU1WX1UzMiBsMkZyZXE7CiAJTVZfQk9PTAlpc0Rpc3BsYXk7CisJTVZfQk9PTCBpc0xpbWl0ZWQ7CiB9IE1WX0ZSRVFfTU9ERTsKIAogLyogRW5kIG9mIFRhYmxlIGluZGljYXRvciAtIFNob3VsZCBiZSBpbiB0aGUgbGFzdCBsaW5lIG9mIHRoZSBTQVIgVGFibGUgKi8KQEAgLTM3OSwzMSArMzg5LDM3IEBACiAKICNpZmRlZiBDT05GSUdfRERSNAogI2RlZmluZSBNVl9TQVJfRlJFUV9NT0RFUyB7IFwKLQkJeyAweDYsICAgMTIwMCwgNjAwLCA2MDAsIE1WX1RSVUUgIH0sIFwKLQkJeyAweDgsICAgMTMzMiwgNjY2LCA2NjYsIE1WX1RSVUUgIH0sIFwKLQkJeyAweEMsICAgMTYwMCwgODAwLCA4MDAsIE1WX1RSVUUgIH0sIFwKLQkJeyAweDEyLCAgMTgwMCwgOTAwLCA5MDAsIE1WX1RSVUUgIH0sIFwKLQkJeyBNVl9TQVJfRlJFUV9NT0RFU19FT1QsICAwLCAgICAwLCAgIDAsIE1WX0ZBTFNFIH0gXAorCQkvKklELAkgQ1BVLCAgRERSLCAgTEAsICBpc0Rpc2FwbHk/LCBpc0xpbWl0ZWQ/ICovXAorCQl7IDB4NiwgICAxMjAwLCA2MDAsICA2MDAsICBNVl9UUlVFICAsIE1WX0ZBTFNFfSwgXAorCQl7IDB4OCwgICAxMzMyLCA2NjYsICA2NjYsICBNVl9UUlVFICAsIE1WX0ZBTFNFfSwgXAorCQl7IDB4QywgICAxNjAwLCA4MDAsICA4MDAsICBNVl9UUlVFICAsIE1WX0ZBTFNFfSwgXAorCQl7IDB4MTAsICAxODY2LCA5MzMsICA5MzMsICBNVl9UUlVFICAsIE1WX1RSVUV9LCBcCisJCXsgMHgxMywgIDIwMDAsIDkzMywgIDEwMDAsICBNVl9UUlVFICAsIE1WX1RSVUV9LCBcCisJCXsgTVZfU0FSX0ZSRVFfTU9ERVNfRU9ULCAgMCwgICAgMCwgICAwLCBNVl9GQUxTRSwgTVZfRkFMU0UgfSBcCiB9OwogCiAjZWxzZQogI2lmZGVmIENPTkZJR19BUk1BREFfMzhYCiAjZGVmaW5lIE1WX1NBUl9GUkVRX01PREVTIHsgXAotCQl7IDB4MCwgICA2NjYsICAzMzMsIDMzMywgTVZfVFJVRSAgfSwgXAotCQl7IDB4MiwgICA4MDAsICA0MDAsIDQwMCwgTVZfVFJVRSAgfSwgXAotCQl7IDB4NCwgICAxMDY2LCA1MzMsIDUzMywgTVZfVFJVRSAgfSwgXAotCQl7IDB4NiwgICAxMjAwLCA2MDAsIDYwMCwgTVZfVFJVRSAgfSwgXAotCQl7IDB4OCwgICAxMzMyLCA2NjYsIDY2NiwgTVZfVFJVRSAgfSwgXAotCQl7IDB4QywgICAxNjAwLCA4MDAsIDgwMCwgTVZfVFJVRSAgfSwgXAotCQl7IE1WX1NBUl9GUkVRX01PREVTX0VPVCwgIDAsICAgIDAsICAgMCwgTVZfRkFMU0UgfSBcCisJCS8qSUQsCSBDUFUsICBERFIsICBMMiwgIGlzRGlzYXBseT8sIGlzTGltaXRlZD8gKi9cCisJCXsgMHgwLCAgIDY2NiwgIDMzMywgIDMzMywgIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHgyLCAgIDgwMCwgIDQwMCwgIDQwMCwgIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHg0LCAgIDEwNjYsIDUzMywgIDUzMywgIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHg2LCAgIDEyMDAsIDYwMCwgIDYwMCwgIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHg4LCAgIDEzMzIsIDY2NiwgIDY2NiwgIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHhDLCAgIDE2MDAsIDgwMCwgIDgwMCwgIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHgxMCwgIDE4NjYsIDkzMywgIDkzMywgIE1WX1RSVUUgICwgTVZfVFJVRX0sIFwKKwkJeyAweDEzLCAgMjAwMCwgOTMzLCAgMTAwMCwgIE1WX1RSVUUgICwgTVZfVFJVRX0sIFwKKwkJeyBNVl9TQVJfRlJFUV9NT0RFU19FT1QsICAwLCAgICAwLCAgIDAsIE1WX0ZBTFNFLCBNVl9GQUxTRSB9IFwKIH07CiAjZWxzZQogI2RlZmluZSBNVl9TQVJfRlJFUV9NT0RFUyB7IFwKLQkJeyAweDQsICAgMTA2NiwgNTMzLCA1MzMsIE1WX1RSVUUgIH0sIFwKLQkJeyAweDYsICAgMTIwMCwgNjAwLCA2MDAsIE1WX1RSVUUgIH0sIFwKLQkJeyAweDgsICAgMTMzMiwgNjY2LCA2NjYsIE1WX1RSVUUgIH0sIFwKLQkJeyAweEMsICAgMTYwMCwgODAwLCA4MDAsIE1WX1RSVUUgIH0sIFwKLQkJeyBNVl9TQVJfRlJFUV9NT0RFU19FT1QsICAwLCAgICAwLCAgIDAsIE1WX0ZBTFNFIH0gXAorCQkvKklELAkgQ1BVLCAgRERSLCAgTEAsIGlzRGlzYXBseT8saXNMaW1pdGVkPyAqL1wKKwkJeyAweDQsICAgMTA2NiwgNTMzLCA1MzMsIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHg2LCAgIDEyMDAsIDYwMCwgNjAwLCBNVl9UUlVFICAsIE1WX0ZBTFNFfSwgXAorCQl7IDB4OCwgICAxMzMyLCA2NjYsIDY2NiwgTVZfVFJVRSAgLCBNVl9GQUxTRX0sIFwKKwkJeyAweEMsICAgMTYwMCwgODAwLCA4MDAsIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgTVZfU0FSX0ZSRVFfTU9ERVNfRU9ULCAgMCwgICAgMCwgICAwLCBNVl9GQUxTRSwgTVZfRkFMU0V9IFwKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZTcGVjLmggYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudlNwZWMuaAppbmRleCA0MWU3NWI3Li5lMWYwZDRjIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudlNwZWMuaAorKysgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudlNwZWMuaApAQCAtMTE4LDExICsxMTgsMTQgQEAKIAkJCQkJCShNVl9FVEhfQkFTRV9BRERSX1BPUlQxXzIgKyAoKChwKSAtIDEpICogMHg0MDAwKSkpCiAjZGVmaW5lIE1WX0VUSF9TR01JSV9QSFlfUkVHU19PRkZTRVQocCkJCShNVl9FVEhfUkVHU19PRkZTRVQocCkrMHgyMDAwKQogCisjZGVmaW5lIE1WX1RETV9PRkZTRVQJCQkJKDB4QjAwMDApCiAjZGVmaW5lIE1WX1BFWF9JRl9SRUdTX09GRlNFVChwZXhJZikgICAgICAgICAgICAoKChwZXhJZikgPT0gMCkgPyAweDgwMDAwIDogKDB4NDAwMDAgKyAoKHBleElmLTEpICogMHg0MDAwKSkpCiAjZGVmaW5lIE1WX1VTQl9SRUdTX09GRlNFVChkZXYpICAgICAgICAgICAgICAgICAoMHg1ODAwMCkKICNkZWZpbmUgTVZfVVNCM19SRUdTX09GRlNFVChkZXYpICAgICAgICAgICAgICAgICgweEYwMDAwICsgKGRldiAqIDB4ODAwMCkpCiAjZGVmaW5lIE1WX1VTQjJfVVNCM19SRUdTX09GRlNFVCh1bml0VHlwZSwgZGV2KSAodW5pdFR5cGUgPT0gVVNCX1VOSVRfSUQgPyBcCiAJCQkJCQkJTVZfVVNCX1JFR1NfT0ZGU0VUKGRldikgOiBNVl9VU0IzX1JFR1NfT0ZGU0VUKGRldikpCisjZGVmaW5lIE1WX1VTQjNfREVWSUNFX1JFR1NfT0ZGU0VUCQkoMHg1MDAwMCkKKyNkZWZpbmUgTVZfVVNCM19ERVZJQ0VfVVNCMl9SRUdTX09GRlNFVAkJKDB4NTQxMDApCiAjZGVmaW5lIE1WX1hPUl9SRUdTX09GRlNFVCh1bml0KSAgICAgICAgICAgICAgICAoMHg2MDgwMCArICh1bml0KSoweDEwMCkKICNkZWZpbmUgTVZfQ0VTQV9URE1BX1JFR1NfT0ZGU0VUKGNoYW5OdW0pICAgICAgICgweDkwMDAwICsgKGNoYW5OdW0gKiAweDIwMDApKQogI2RlZmluZSBNVl9DRVNBX1JFR1NfT0ZGU0VUKGNoYW5OdW0pICAgICAgICAgICAgKDB4OUQwMDAgKyAoY2hhbk51bSAqIDB4MjAwMCkpCkBAIC0xMzMsNiArMTM2LDcgQEAKICNkZWZpbmUgTVZfTkZDX1JFR1NfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICgweEQwMDAwKQogI2RlZmluZSBNVl9TRE1NQ19SRUdTX09GRlNFVAkJCSgweEQ4MDAwKQogI2RlZmluZSBNVl9TRE1NQ19XSU5ET1dTX1JFR1NfT0ZGU0VUCQkoMHhEQzAwMCkKKyNkZWZpbmUgTVZfQVVESU9fT0ZGU0VUCQkJCSgweEU4MDAwKQogCiAjZGVmaW5lIFNBVEEzX05VTV9PRl9QT1JUUwkJCTIKICNkZWZpbmUgU0FUQTNfTUFYX1BPUlRTX1BFUl9VTklUCQkyCkBAIC0yMzksNiArMjQzLDcgQEAKICNkZWZpbmUgTVZfRVRIX01BWF9SWFEJCQkJOAogI2RlZmluZSBNVl9FVEhfTUFYX1RYUQkJCQk4CiAjZGVmaW5lIE1WX0VUSF9UWF9DU1VNX01BWF9TSVpFCQkJOTgwMAorI2RlZmluZSBNVl9FVEhfVFhfQ1NVTV9NSU5fU0laRQkJCTIwNDgKICNkZWZpbmUgTVZfRVRIX1RYX0NTVU1fTUFYX1NJWkVfU01BTEwJCTIwNDgKICNkZWZpbmUgTVZfUE5DX1RDQU1fTElORVMJCQkxMDI0CS8qIFRDQU0gbnVtIG9mIGVudHJpZXMgKi8KIApAQCAtMzA2LDYgKzMxMSw3IEBACiAJUVNHTUlJX1VOSVRfSUQsCiAJWEFVSV9VTklUX0lELAogCVVTQjNfSE9TVF9VTklUX0lELAkvKiBVU0IzLjAgSE9TVCBwb3J0cyAqLworCVNFUkRFU19VTklUX0lELAogCU1BWF9VTklUU19JRAogfSBNVl9VTklUX0lEOwogCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L3N5cy9tdkFoYlRvTWJ1c1JlZ3MuaCBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvc3lzL212QWhiVG9NYnVzUmVncy5oCmluZGV4IDQ2NjBjNTAuLjM1YjM3MTAgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvc3lzL212QWhiVG9NYnVzUmVncy5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvc3lzL212QWhiVG9NYnVzUmVncy5oCkBAIC0xMzEsNyArMTMxLDcgQEAKICNkZWZpbmUgU1JBTVdDUl9TSVpFX01BU0sJCQkoMHg3IDw8IFNSQU1XQ1JfU0laRV9PRkZTKQogI2RlZmluZSBTUkFNV0NSX0JBU0VfT0ZGUwkJCTE2CiAjZGVmaW5lIFNSQU1XQ1JfQkFTRV9NQVNLCQkJKDB4RkZGRiA8PCBTUkFNV0NSX0JBU0VfT0ZGUykKLQorI2RlZmluZSBMMl9GSUxURVJfQkFTRV9SRUcJCQkweDhjMDQKIC8qKioqKioqKioqKioqKioqKioqKioqLwogLyogTUJVUyBCUklER0UgV0lORE9XICovCiAvKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE0MSw0ICsxNDEsNiBAQAogI2RlZmluZSBCUklER1dDUl9TSVpFX01BU0sJCQkoMHhGRkZGIDw8IEJSSURHV0NSX1NJWkVfT0ZGUykKICNkZWZpbmUgTUJVU19CUklER0VfV0lOX0JBU0VfUkVHCQkoTVZfTUJVU19SRUdTX09GRlNFVCArIDB4MjU0KQogCisKKwogI2VuZGlmIC8qIF9fSU5DbXZBaGJUb01idXNSZWdzaCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvY3RybEVudi9zeXMvbXZDcHVJZi5jIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvY3RybEVudi9zeXMvbXZDcHVJZi5jCmluZGV4IGY1ZWJiMmQuLjczZThmOTAgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvc3lzL212Q3B1SWYuYworKysgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L3N5cy9tdkNwdUlmLmMKQEAgLTk1Nyw2ICs5NTcsMzMgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZDcHVJZkwyRmlsdGVyU2V0CisqCisqIERFU0NSSVBUSU9OOgorKglTZXQgTDIgRmlsdGVyIGJhc2UgLSBJTyBwcmlvcml0aXphdGlvbiBmaWx0ZXIKKyoKKyogSU5QVVQ6CisqCUwyIGJhc2UgdmFsdWUKKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk46CisqICAgICAgIE5vbmUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVk9JRCBtdkNwdUlmTDJGaWx0ZXJTZXQoTVZfVTMyIGJhc2UpCit7CisJLyogMC4yNUdCIHJlc2VydmVkIGZvciBJTyAtIHZlcmlmeSBubyBjb2xsaXNpb24gd2l0aCBJTyBAIDMuNzVHQiAoMHhmMDAwMDAwKSAqLworCWlmIChiYXNlID4gMHhmMDAwMDAwMCkgeworCQltdk9zUHJpbnRmKCJFcnJvcjogUmVxdWVzdGVkIEwyIGJhc2UgKCV4KSBvdmVybGFwcyB3aXRoIElPIGF0IDMuNzVHQlxuIiwgYmFzZSk7CisJCXJldHVybjsKKwl9CisKKwlNVl9SRUdfV1JJVEUoTDJfRklMVEVSX0JBU0VfUkVHLCBiYXNlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZDcHVJZk1idXNXaW5kb3dTZXQKICoKICogREVTQ1JJUFRJT046CkBAIC05NzYsNiArMTAwMyw5IEBACiB7CiAJTVZfVTMyIHJlZzsKIAorCS8qIEFsaWduIEwyIChJTykgZmlsdGVyIHdpdGggTUJVUyBiYXNlICovCisJbXZDcHVJZkwyRmlsdGVyU2V0KGJhc2UpOworCiAJTVZfUkVHX1dSSVRFKE1CVVNfQlJJREdFX1dJTl9CQVNFX1JFRywgYmFzZSk7CiAJLyogQWxpZ24gd2luZG93IHNpemUgdG8gNjRLQiAqLwogCXNpemUgPSAoKHNpemUgLyBfNjRLKSAtIDEpIDw8IEJSSURHV0NSX1NJWkVfT0ZGUzsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzh4L2NtZF9lZnVzZS5jIGIvYm9hcmQvbXZfZWJ1L2EzOHgvY21kX2VmdXNlLmMKaW5kZXggYjcwZmI3ZC4uZmFmZWVjMCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvY21kX2VmdXNlLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2EzOHgvY21kX2VmdXNlLmMKQEAgLTI1MSwxMyArMjUxLDE5IEBACiAJCQkJdmFsWzJdID0gTVZfRUZVU0VfUkVHX1JFQUQoRUZVU0VfQklUXzY0X0FERFIobGluZSkpOwogCQkJCURCUFIoIlJlYWQgZnJvbSAlMDhYOiBbJTA4WF1cbiIsIEVGVVNFX0JJVF82NF9BRERSKGxpbmUpLCB2YWxbMl0pOwogCi0JCQkJTVZfRUZVU0VfUkVHX1dSSVRFKEVGVVNFX0JJVF8zMV8wX0FERFIobGluZSksIHZhbFswXSk7Ci0JCQkJREJQUigiV3JpdGUgdG8gICUwOFg6IFslMDhYXVxuIiwgRUZVU0VfQklUXzMxXzBfQUREUihsaW5lKSwgdmFsWzBdKTsKLQkJCQlNVl9FRlVTRV9SRUdfV1JJVEUoRUZVU0VfQklUXzYzXzMyX0FERFIobGluZSksIHZhbFsxXSk7Ci0JCQkJREJQUigiV3JpdGUgdG8gICUwOFg6IFslMDhYXVxuIiwgRUZVU0VfQklUXzYzXzMyX0FERFIobGluZSksIHZhbFsxXSk7Ci0JCQkJTVZfRUZVU0VfUkVHX0JJVF9TRVQoRUZVU0VfQklUXzY0X0FERFIobGluZSksIDB4MSk7Ci0JCQkJREJQUigiV3JpdGUgdG8gICUwOFg6IFslMDhYXVxuIiwgRUZVU0VfQklUXzY0X0FERFIobGluZSksIDB4MSk7Ci0JCQkJbXZPc0RlbGF5KDUpOworCQkJCWlmICh2YWxbMl0gPT0gMCkgeyAvKiBJZiB0aGUgZUZ1c2Ugbm90IHlldCBidXJuZWQgYnkgdGVzdGVyICovCisJCQkJCS8qIGludmFsaWRhdGUgZUZ1c2UgZGF0YSBiZWZvcmUgdmFsaWRhdGluZyB0aGUgcm93ICovCisJCQkJCXZhbFswXSA9IDB4RkZGRkZGRkY7CisJCQkJCXZhbFsxXSA9IDB4MDBGRkZGRkY7CisKKwkJCQkJTVZfRUZVU0VfUkVHX1dSSVRFKEVGVVNFX0JJVF8zMV8wX0FERFIobGluZSksIHZhbFswXSk7CisJCQkJCURCUFIoIldyaXRlIHRvICAlMDhYOiBbJTA4WF1cbiIsIEVGVVNFX0JJVF8zMV8wX0FERFIobGluZSksIHZhbFswXSk7CisJCQkJCU1WX0VGVVNFX1JFR19XUklURShFRlVTRV9CSVRfNjNfMzJfQUREUihsaW5lKSwgdmFsWzFdKTsKKwkJCQkJREJQUigiV3JpdGUgdG8gICUwOFg6IFslMDhYXVxuIiwgRUZVU0VfQklUXzYzXzMyX0FERFIobGluZSksIHZhbFsxXSk7CisJCQkJCU1WX0VGVVNFX1JFR19CSVRfU0VUKEVGVVNFX0JJVF82NF9BRERSKGxpbmUpLCAweDEpOworCQkJCQlEQlBSKCJXcml0ZSB0byAgJTA4WDogWyUwOFhdXG4iLCBFRlVTRV9CSVRfNjRfQUREUihsaW5lKSwgMHgxKTsKKwkJCQkJbXZPc0RlbGF5KDUpOworCQkJCX0KIAkJCX0KIAkJfQogCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9jbWRfc2FyMzh4LmMgYi9ib2FyZC9tdl9lYnUvYTM4eC9jbWRfc2FyMzh4LmMKaW5kZXggZWY1MTRmOS4uZmYzNjA2NiAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvY21kX3NhcjM4eC5jCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2NtZF9zYXIzOHguYwpAQCAtMjMsMTIgKzIzLDEzIEBACiAjaW5jbHVkZSAiY3RybEVudi9tdkN0cmxFbnZSZWdzLmgiCiAjaW5jbHVkZSAiY3RybEVudi9tdkN0cmxFbnZMaWIuaCIKICNpbmNsdWRlICJib2FyZEVudi9tdkJvYXJkRW52TGliLmgiCisjaW5jbHVkZSAic3dpdGNoaW5nU2VydmljZXMvc3dpdGNoaW5nU2VydmljZXMuaCIKIAogZW51bSB7CiAJQ01EX0RVTVAgPSBNVl9TQVRSX01BWF9PUFRJT04rMSwKIAlDTURfREVGQVVMVCwKIAlDTURfVU5LTk9XTiwKLQlDTURfTk9UX0FDVElWRQkvLyBDb21tYW5kIHRoYXQgcmVxdWVzdHMgdmFsaWQgYnV0IG5vdCBhY3RpdmUgZmllbGQgb24gY3VycmVudCBib2FyZCAKKwlDTURfTk9UX0FDVElWRQkvLyBDb21tYW5kIHRoYXQgcmVxdWVzdHMgdmFsaWQgYnV0IG5vdCBhY3RpdmUgZmllbGQgb24gY3VycmVudCBib2FyZAogfTsKIAogTVZfRlJFUV9NT0RFIGNwdURkckNsa1RibFtdID0gTVZfU0FSX0ZSRVFfTU9ERVM7CkBAIC00Niw3ICs0Nyw3IEBACiAJTVZfU0FUUl9UWVBFX0lEIHNhdHJJZDsKIAlNVl9VMzIgZGVmYXVsZVZhbHVlRm9yQm9hcmRbTVZfTUFSVkVMTF9CT0FSRF9OVU1dOwogfSBNVl9CT0FSRF9TQVRSX0RFRkFVTFQ7Ci0jZGVmaW5lIE1BWF9ERUZBVUxUX0VOVFJZCTE2CisjZGVmaW5lIE1BWF9ERUZBVUxUX0VOVFJZCTIzCiBNVl9CT0FSRF9TQVRSX0RFRkFVTFQgYm9hcmRTYXRyRGVmYXVsdFtNQVhfREVGQVVMVF9FTlRSWV0gPSB7CiAvKiAJZGVmYXVsZVZhbHVlRm9yQm9hcmRbXSA9IFJEX05BU182OHh4LAlEQl9CUF82OHh4LAlSRF9XQVBfNjh4eCwJREJfQVBfNjh4eCAsIERCX0dQXzY4eHgsICBEQl9CUF82ODIxLAlEQi1BTUMgKi8KIHsgTVZfU0FUUl9DUFVfRERSX0wyX0ZSRVEsCXsweDBjLAkJMHgwYywJCTB4MGMsCQkweDBjLAkJMHgwYywJICAweDQsCQkweDBjfX0sCkBAIC02NSw2ICs2NiwxMyBAQAogeyBNVl9TQVRSX0RCX1VTQjNfUE9SVDEsCXswLAkJMCwJCTAsCQkwLAkJMCwJICAwLAkJMH19LAogeyBNVl9TQVRSX0REUl9FQ0NfRU5BQkxFLAl7MCwJCTAsCQkwLAkJMCwJCTAsCSAgMCwJCTF9fSwKIHsgTVZfU0FUUl9ERFJfRUNDX1BVUF9TRUwsCXswLAkJMCwJCTAsCQkwLAkJMCwJICAwLAkJMX19LAoreyBNVl9TQVRSX0ZVTExfRkxBVk9SLAkJezAsCQkxLAkJMCwJCTEsCQkxLAkgIDEsCQkwfSB9LAoreyBNVl9TQVRSX1RETV9DT05ORUNURUQsCXswLAkJMSwJCTAsCQkwLAkJMCwJICAwLAkJMH0gfSwKK3sgTVZfU0FUUl9URE1fUExBQ0VfSE9MREVSLAl7MCwJCTEsCQkwLAkJMCwJCTAsCSAgMCwJCTB9IH0sCit7IE1WX1NBVFJfQk9BUkRfU1BFRUQsCQl7MCwJCTB4MSwJCTAsCQkweDEsCQkweDEsCSAgMCwJCTB4MX0gfSwKK3sgTVZfU0FUUl9BVlNfU0tJUCwJCXswLAkJMHgxLAkJMCwJCTB4MSwJCTB4MSwJICAweDEsCQkweDF9IH0sCit7TVZfU0FUUl9CT09UX0RFVklDRSwgICAgICAgICAgIHswLCAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgMCwJCTAsCQkwLAkgIDAsCQkwfSB9LC8qIER1bW15IGVudHJ5OiBkZWZhdWx0IHZhbHVlIHRha2VuIGZyb20gU0BSIHJlZ2lzdGVyICovCit7TVZfU0FUUl9CT09UMl9ERVZJQ0UsICAgICAgICAgIHswLCAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgMCwJCTAsCQkwLAkgIDAsCQkwfSB9LC8qIER1bW15IGVudHJ5OiBkZWZhdWx0IHZhbHVlIHRha2VuIGZyb20gU0BSIHJlZ2lzdGVyICovCiB9OwogCiBjaGFyICpsYW5lMUFycls3XSA9IHsJIlVuY29ubmVjdGVkIiAsCkBAIC04MywxNyArOTEsNDkgQEAKIGNoYXIgKmRldklkQXJyWzRdID0gewogCQkJIjY4MTAgKEEzODApIiwKIAkJCSI2ODIwIChBMzg1KSIsCi0JCQkiNjgxMSAoQTM4MS8yKSIsCisJCQkiTi9BIiwKIAkJCSI2ODI4IChBMzg4KSIgfTsKIAotTVZfQk9PTCBtdlZlcmlmeVJlcXVlc3Qodm9pZCkKK3N0YXRpYyBNVl9VMzIgZ2V0Qm9hcmRTcGVlZChNVl9VMzIgYm9hcmRzcGVlZCkKIHsKLQlyZWFkbGluZSgiICIpOwotCWlmKHN0cmxlbihjb25zb2xlX2J1ZmZlcikgPT0gMCB8fCAvKiBpZiBwcmVzc2VkIEVudGVyICovCi0JCXN0cmNtcChjb25zb2xlX2J1ZmZlciwibiIpID09IDAgfHwKLQkJc3RyY21wKGNvbnNvbGVfYnVmZmVyLCJOIikgPT0gMCApIHsKLQkJcHJpbnRmKCJcbiIpOwotCQlyZXR1cm4gTVZfRkFMU0U7CisJc3dpdGNoIChib2FyZHNwZWVkKSB7CisJY2FzZSAxOgorCQlyZXR1cm4gMjAwMDsKKwljYXNlIDI6CisJCXJldHVybiAxODY2OworCWNhc2UgMzoKKwkJcmV0dXJuIDE2MDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorLyoKKyAqIHdoZW4gZWFjaCBDUFUgaXMgY2hlY2tlZCwgbWF4IENQVSBzcGVlZCBpcyBkZXRlcm1pbmVkIGZvciBlYWNoIGJvYXJkCisgKiBUbyBlbmFibGUgdGhlIHNwZWVkIGxpbWl0YXRpb24gZm9yIGVhY2ggYm9hcmQsIHRoZSBhY2NvcmRpbmcgdmFsdWUgaXMgd3JpdHRlbgorICogaW4gU2F0UiBmaWVsZCAnYm9hcmRzcGVlZCc6CisgKiAtMHgxIGZvciBtYXggdmFsdWUgMjAwME1oegorICogLTB4MiBmb3IgbWF4IHZhbHVlIDE4NjZNSHoKKyAqIC0weDMgZm9yIG1heCB2YWx1ZSAxNjAwTUh6CisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfVFJVRSBpZiB0aGUgY3B1TW9kZSBpcyBub3QgbGltaXRlZCBvbiB0aGlzIGJvYXJkCisgKiBieSBjaGVja2luZyB0aGUgJ2JvYXJkc3BlZWQnIGZpZWxkLCBvdGhlcndpc2UgcmV0dXJucyBNVl9GQUxTRQorICovCitzdGF0aWMgTVZfQk9PTCBpc0NwdU1vZGVTdXBwb3J0ZWRGb3JCb2FyZChpbnQgaW5kZXgsIE1WX0JPT0wgcHJpbnRFcnJvcikKK3sKKwlNVl9VMzIgdG1wOworCisJaWYgKGNwdURkckNsa1RibFtpbmRleF0uaXNMaW1pdGVkID09IE1WX1RSVUUpIHsKKwkJdG1wID0gbXZCb2FyZFNhdFJSZWFkKE1WX1NBVFJfQk9BUkRfU1BFRUQpOworCQlpZiAodG1wID09IE1WX0VSUk9SKSB7CisJCQltdk9zUHJpbnRmKCJGYWlsZWQgcmVhZGluZyAnYm9hcmRzcGVlZCcgU2F0UiBmaWVsZFxuIik7CisJCQlyZXR1cm4gTVZfRkFMU0U7CisJCX0KKworCQlpZiAoY3B1RGRyQ2xrVGJsW2luZGV4XS5jcHVGcmVxID4gZ2V0Qm9hcmRTcGVlZCh0bXApKSB7CisJCQlpZiAocHJpbnRFcnJvciA9PSBNVl9UUlVFKQorCQkJCW12T3NQcmludGYoIk1heGltdW0gc3VwcG9ydGVkIENQVSBzcGVlZCBpcyAldU1IelxuIiwgZ2V0Qm9hcmRTcGVlZCh0bXApKTsKKwkJCXJldHVybiBNVl9GQUxTRTsKKwkJfQogCX0KIAlyZXR1cm4gTVZfVFJVRTsKIH0KQEAgLTEwMywxMSArMTQzLDE3IEBACiAJTVZfVTMyIGksIHJjLCBkZWZhdWx0VmFsdWUsIGJvYXJkSWQgPSBtdkJvYXJkSWRJbmRleEdldChtdkJvYXJkSWRHZXQoKSk7CiAJTVZfU0FUUl9UWVBFX0lEIHNhdHJDbGFzc0lkOwogCU1WX0JPQVJEX1NBVFJfSU5GTyBzYXRySW5mbzsKLQorCU1WX1UzMiBzYXRyQm9vdERldmljZVZhbHVlID0gbXZDdHJsYm9vdFNyY0dldCgpLCB0bXA7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9ERUZBVUxUX0VOVFJZOyBpKyspIHsKIAkJc2F0ckNsYXNzSWQgPSBib2FyZFNhdHJEZWZhdWx0W2ldLnNhdHJJZDsKIAkJaWYgKG12Qm9hcmRTYXRySW5mb0NvbmZpZyhzYXRyQ2xhc3NJZCwgJnNhdHJJbmZvKSAhPSBNVl9PSykKIAkJCWNvbnRpbnVlOworCQlpZiAoc2F0ckNsYXNzSWQgPT0gTVZfU0FUUl9CT09UX0RFVklDRSkKKwkJCWJvYXJkU2F0ckRlZmF1bHRbaV0uZGVmYXVsZVZhbHVlRm9yQm9hcmRbYm9hcmRJZF0gPSBzYXRyQm9vdERldmljZVZhbHVlICYgc2F0ckluZm8ubWFzazsKKwkJaWYgKHNhdHJDbGFzc0lkID09IE1WX1NBVFJfQk9PVDJfREVWSUNFKSB7CisJCQl0bXAgPSBzYXRyQm9vdERldmljZVZhbHVlID4+IE1WX1NBVFJfQk9PVDJfVkFMVUVfT0ZGU0VUOworCQkJYm9hcmRTYXRyRGVmYXVsdFtpXS5kZWZhdWxlVmFsdWVGb3JCb2FyZFtib2FyZElkXSA9IHRtcCAmIE1WX1NBVFJfQk9PVDJfVkFMVUVfTUFTSzsKKwkJfQogCQlkZWZhdWx0VmFsdWUgPSBib2FyZFNhdHJEZWZhdWx0W2ldLmRlZmF1bGVWYWx1ZUZvckJvYXJkW2JvYXJkSWRdOwogCQlyYyA9IG12Qm9hcmRTYXRSV3JpdGUoc2F0ckNsYXNzSWQsIGRlZmF1bHRWYWx1ZSk7CiAJCWlmIChyYyA9PSBNVl9FUlJPUikgewpAQCAtMTE2LDExICsxNjIsMTYgQEAKIAl9CiAKIAkvKiBzZXQgZGVmYXVsdCBEZXZpY2UgSUQgLSBpZiBNVl9TQVRSX0RFVklDRV9JRCBmaWVsZCBpcyByZWxldmFudCBvbiBib2FyZCAqLwotCWlmIChtdkJvYXJkU2F0ckluZm9Db25maWcoTVZfU0FUUl9ERVZJQ0VfSUQsICZzYXRySW5mbykgPT0gTVZfT0spIHsKLQkJaWYgKG12Qm9hcmRTYXRSV3JpdGUoTVZfU0FUUl9ERVZJQ0VfSUQsIG12Q3RybERldklkSW5kZXhHZXQobXZDdHJsTW9kZWxHZXQoKSkpID09IE1WX0VSUk9SKQotCQkJbXZPc1ByaW50ZigiRXJyb3Igd3JpdGluZyBkZWZhdWx0IERldmljZSBJRCAoJ2RldmlkJykgPSVkXG4iLCBpKTsKLQl9CisJLyogQTM4My9BMzg0IGFyZSB2aXJ0dWFsIGRldmljZSBJRCdzIC0gbm90IHJlcHJlc2VudGVkIGFzIEhXIGRldmljZSBJRCB2YWx1ZXMgaW4gU0BSQDB4MTg2MDAuCisJQTM4My9BMzg0IGFyZSBjb25maWd1cmVkIGluIFNXIEVFUFJPTSB3aXRoIEZVTExfRkxBVk9SIGZpZWxkOiBpZiBmYWxzZSBvdmVycmlkZSBkZXZpY2UgSUQgKi8KIAorCWlmICghKG12Q3RybE1vZGVsR2V0KCkgPT0gTVZfNlcyMl9ERVZfSUQKKwkJCXx8IG12Q3RybE1vZGVsR2V0KCkgPT0gIE1WXzZXMjNfREVWX0lEKSkgeyAvKiA2VzIyPUEzODMsIDZXMjM9QTM4NCAqLworCQlpZiAobXZCb2FyZFNhdHJJbmZvQ29uZmlnKE1WX1NBVFJfREVWSUNFX0lELCAmc2F0ckluZm8pID09IE1WX09LKSB7CisJCQlpZiAobXZCb2FyZFNhdFJXcml0ZShNVl9TQVRSX0RFVklDRV9JRCwgbXZDdHJsRGV2SWRJbmRleEdldChtdkN0cmxNb2RlbEdldCgpKSkgPT0gTVZfRVJST1IpCisJCQkJbXZPc1ByaW50ZigiRXJyb3Igd3JpdGluZyBkZWZhdWx0IERldmljZSBJRCAoJ2RldmlkJykgPSVkXG4iLCBpKTsKKwkJfQorCX0KIAlwcmludGYoIlxuU2FtcGxlIGF0IFJlc2V0IHZhbHVlcyB3ZXJlIHJlc3RvcmVkIHRvIGRlZmF1bHQuXG4iKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1NiwyMyArMjA3LDI2IEBACiAJc3dpdGNoIChzYXRySW5mby0+c2F0cklkKSB7CiAJY2FzZSBNVl9TQVRSX0NQVV9ERFJfTDJfRlJFUToKIAkJbXZPc1ByaW50ZigiY3B1ZnJlcSBvcHRpb25zIC0gRGV0ZXJtaW5lcyB0aGUgZnJlcXVlbmN5IG9mIENQVS9ERFIvTDI6XG5cbiIpOwotCQltdk9zUHJpbnRmKCJ8IElEIHwgQ1BVIEZyZXEgKE1IeikgfCBMMiBGcmVxIChNSHopICAgfCBTRFJBTSBGcmVxIChNSHopICB8XG4iKTsKLQkJbXZPc1ByaW50ZigifC0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfFxuIik7CisJCW12T3NQcmludGYoInwgSUQgfCBDUFUgRnJlcSAoTUh6KSB8IEREUiBGcmVxIChNSHopICAgfCAgTDIgZnJlcShNSHopICB8XG4iKTsKKwkJbXZPc1ByaW50ZigifC0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXxcbiIpOwogCQlmb3IgKGk9MDsgaSA8PSBNVl9TQVJfRlJFUV9NT0RFU19FT1Q7IGkrKykgewogCQkJaWYgKGNwdURkckNsa1RibFtpXS5pZCA9PSBNVl9TQVJfRlJFUV9NT0RFU19FT1QpCiAJCQkJYnJlYWs7Ci0JCQlpZiAoY3B1RGRyQ2xrVGJsW2ldLmlzRGlzcGxheSkKLQkJCQltdk9zUHJpbnRmKCJ8ICUyZCB8ICAgICAgJTRkICAgICAgfCAgICAgICU0ZCAgICAgICB8ICAgICAgJTRkICAgICAgICAgfCBcbiIsCisJCQlpZiAoY3B1RGRyQ2xrVGJsW2ldLmlzRGlzcGxheSAmJiBpc0NwdU1vZGVTdXBwb3J0ZWRGb3JCb2FyZChpLCBNVl9GQUxTRSkgPT0gTVZfVFJVRSkKKwkJCQltdk9zUHJpbnRmKCJ8ICUyZCB8ICAgICAgJTRkICAgICAgfCAgICAgICU0ZCAgICAgICAgfCAgICAgICU0ZCAgICAgIHwgXG4iLAogCQkJCQkgICBjcHVEZHJDbGtUYmxbaV0uaWQsCiAJCQkJCSAgIGNwdURkckNsa1RibFtpXS5jcHVGcmVxLAogCQkJCQkgICBjcHVEZHJDbGtUYmxbaV0uZGRyRnJlcSwKIAkJCQkJICAgY3B1RGRyQ2xrVGJsW2ldLmwyRnJlcSk7CiAJCX0KLQkJbXZPc1ByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCW12T3NQcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBNVl9TQVRSX0NPUkVfQ0xLX1NFTEVDVDoKIAkJbXZPc1ByaW50ZigiRGV0ZXJtaW5lcyB0aGUgQ29yZSBjbG9jayBmcmVxdWVuY3k6XG4iKTsKLQkJbXZPc1ByaW50ZigiXHQwID0gMjUwTUh6XG4iKTsKKwkJaWYgKG12Q3RybE1vZGVsR2V0KCkgPT0gTVZfNjgxMV9ERVZfSUQpCisJCQltdk9zUHJpbnRmKCJcdDAgPSAxNjZNSHpcbiIpOwkvKiBkZXZpY2UgMzgxLzIgKDY4MTEvMjEpIHVzZSAxNjZNSHogaW5zdGVhZCBvZiAyNTBNSHogKi8KKwkJZWxzZQorCQkJbXZPc1ByaW50ZigiXHQwID0gMjUwTUh6XG4iKTsKIAkJbXZPc1ByaW50ZigiXHQxID0gMjAwTUh6XG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBNVl9TQVRSX0NQVTFfRU5BQkxFOgpAQCAtMjgwLDYgKzMzNCwyNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXZJZEFycik7IGkrKykKIAkJCW12T3NQcmludGYoIlx0ICVkID0gJXNcbiIsIGksIGRldklkQXJyW2ldKTsKIAkJYnJlYWs7CisJY2FzZSBNVl9TQVRSX0ZVTExfRkxBVk9SOgorCQltdk9zUHJpbnRmKCJEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIGZ1bGwgZmxhdm9yIGNhcGFiaWxpdGVzOlxuIik7CisJCW12T3NQcmludGYoIlx0MCA9IFJlZHVjZWQgRmxhdm9yXG4iKTsKKwkJbXZPc1ByaW50ZigiXHQxID0gRnVsbCBGbGF2b3JcbiAiKTsKKwkJYnJlYWs7CisJY2FzZSBNVl9TQVRSX1RETV9DT05ORUNURUQ6CisJCW12T3NQcmludGYoIkluZGljYXRlcyB3aGV0aGVyIFRETSBtb2R1bGUgaXMgY29ubmVjdGVkIG9yIG5vdDpcbiIpOworCQltdk9zUHJpbnRmKCJcdDAgPSBDb25uZWN0ZWRcbiIpOworCQltdk9zUHJpbnRmKCJcdDEgPSBOb3QgY29ubmVjdGVkXG4gIik7CisJCWJyZWFrOworCWNhc2UgTVZfU0FUUl9BVlNfU0tJUDoKKwkJbXZPc1ByaW50ZigiSW5kaWNhdGVzIHdoZXRoZXIgdG8gc2tpcCBBVlMgdXBkYXRlIGZyb20gRUZVU0Ugb3Igbm90OlxuIik7CisJCW12T3NQcmludGYoIlx0MCA9IERvIG5vdCBza2lwIEFWUyB1cGRhdGUgZnJvbSBFRlVTRVxuIik7CisJCW12T3NQcmludGYoIlx0MSA9IFNraXAgQVZTIHVwZGF0ZSBmcm9tIEVGVVNFXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBNVl9TQVRSX0JPQVJEX1NQRUVEOgorCQltdk9zUHJpbnRmKCJEZXRlcm1pbmVzIHRoZSBtYXggc3VwcG9ydGVkIENQVSBzcGVlZDpcbiIpOworCQltdk9zUHJpbnRmKCJcdDEgPSAldU1IelxuIiwgZ2V0Qm9hcmRTcGVlZCgxKSk7CisJCW12T3NQcmludGYoIlx0MiA9ICV1TUh6XG4iLCBnZXRCb2FyZFNwZWVkKDIpKTsKKwkJbXZPc1ByaW50ZigiXHQzID0gJXVNSHpcbiIsIGdldEJvYXJkU3BlZWQoMykpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQltdk9zUHJpbnRmKCJVc2FnZTogc2FyIGxpc3QgW29wdGlvbnNdIChzZWUgaGVscClcbiIpOwogCQlyZXR1cm4gMTsKQEAgLTI5MCw2ICszNjUsNyBAQAogaW50IGRvX3Nhcl9yZWFkKE1WX1UzMiBtb2RlLCBNVl9CT0FSRF9TQVRSX0lORk8gKnNhdHJJbmZvKQogewogCU1WX1UzMiBpLCB0bXA7CisJY2hhciBjb3JlX2Nsa192YWx1ZTBbNF07CiAKIAlpZiAobW9kZSAhPSBDTURfRFVNUCkgewogCSAgICB0bXAgPSBtdkJvYXJkU2F0UlJlYWQoc2F0ckluZm8tPnNhdHJJZCk7CkBAIC0zMDUsMjAgKzM4MSwyMiBAQAogCQkJCWJyZWFrOwogCQkJaWYgKGNwdURkckNsa1RibFtpXS5pZCA9PSB0bXApIHsKIAkJCQltdk9zUHJpbnRmKCJcbkN1cnJlbnQgZnJlcSBjb25maWd1cmF0aW9uOlxuIik7Ci0JCQkJbXZPc1ByaW50ZigifCBJRCB8IENQVSBGcmVxIChNSHopIHwgTDIgRnJlcSAoTUh6KSAgIHwgU0RSQU0gRnJlcSAoTUh6KSAgfFxuIik7Ci0JCQkJbXZPc1ByaW50ZigifC0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfFxuIik7Ci0JCQkJbXZPc1ByaW50ZigifCAlMmQgfCAgICAgICU0ZCAgICAgIHwgICAgICAlNGQgICAgICAgfCAgICAgICU0ZCAgICAgICAgIHxcbiIsCisJCQkJbXZPc1ByaW50ZigifCBJRCB8IENQVSBGcmVxIChNSHopIHwgRERSIEZyZXEgKE1IeikgICB8ICBMMiBmcmVxKE1IeikgIHxcbiIpOworCQkJCW12T3NQcmludGYoInwtLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18XG4iKTsKKwkJCQltdk9zUHJpbnRmKCJ8ICUyZCB8ICAgICAgJTRkICAgICAgfCAgICAgICU0ZCAgICAgICAgfCAgICAgICU0ZCAgICAgIHxcbiIsCiAJCQkJCSAgIGNwdURkckNsa1RibFtpXS5pZCwKIAkJCQkJICAgY3B1RGRyQ2xrVGJsW2ldLmNwdUZyZXEsCiAJCQkJCSAgIGNwdURkckNsa1RibFtpXS5kZHJGcmVxLAogCQkJCQkgICBjcHVEZHJDbGtUYmxbaV0ubDJGcmVxKTsKLQkJCQltdk9zUHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJCQltdk9zUHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBNVl9TQVRSX0NPUkVfQ0xLX1NFTEVDVDoKLQkJbXZPc1ByaW50ZigiXG5jb3JlY2xvY2tcdD0gJWQgID09PiAlc01oelxuIiwgdG1wLCAodG1wID09IDB4MCkgPyAiMjUwIiA6ICIyMDAiKTsKKwkJLyogZGV2aWNlIDM4MS8yICg2ODExLzIxKSB1c2UgMTY2TUh6IGluc3RlYWQgb2YgMjUwTUh6ICovCisJCXNwcmludGYoY29yZV9jbGtfdmFsdWUwLCBtdkN0cmxNb2RlbEdldCgpID09IE1WXzY4MTFfREVWX0lEID8gIjE2NiIgOiAiMjUwIik7CisJCW12T3NQcmludGYoIlxuY29yZWNsb2NrXHQ9ICVkICA9PT4gJXNNaHpcbiIsIHRtcCwgKHRtcCA9PSAweDApID8gY29yZV9jbGtfdmFsdWUwIDogIjIwMCIpOwogCQlicmVhazsKIAljYXNlIE1WX1NBVFJfQ1BVMV9FTkFCTEU6CiAJCW12T3NQcmludGYoImNwdXNudW1cdFx0PSAlZCAgPT0+ICVzIENQVVxuIiwgdG1wLCAodG1wID09IDApID8gIlNpbmdsZSIgOiAiRHVhbCIpOwpAQCAtMzgwLDYgKzQ1OCwyNSBAQAogCWNhc2UgTVZfU0FUUl9ERVZJQ0VfSUQ6CiAJCW12T3NQcmludGYoImRldmlkXHRcdD0gJWQgID09PiBEZXZpY2UgSUQ6ICVzXG4iLCB0bXAsIGRldklkQXJyW3RtcF0pOwogCQlicmVhazsKKwljYXNlIE1WX1NBVFJfRlVMTF9GTEFWT1I6CisJCW12T3NQcmludGYoImZsYXZvclx0XHQ9ICVkICA9PT4gJXMgRmxhdm9yIiwgdG1wLCAodG1wID09IDApID8gIlJlZHVjZWQiIDogIkZ1bGwiKTsKKwkJaWYgKCF0bXApIHsKKwkJCWlmIChtdkJvYXJkSWRHZXQoKSA9PSBEQl9HUF82OFhYX0lEKQorCQkJCW12T3NQcmludGYoIiAoQTM4NCBvbiBEQi1HUCkiKTsKKwkJCWVsc2UgaWYgKG12Qm9hcmRJZEdldCgpID09IERCX0JQXzY4MjFfSUQpCisJCQkJbXZPc1ByaW50ZigiIChBMzgzIG9uIERCLTg4RjY4MjEtQlApIik7CisJCX0KKwkJbXZPc1ByaW50ZigiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBNVl9TQVRSX1RETV9DT05ORUNURUQ6CisJCW12T3NQcmludGYoInRkbVx0XHQ9ICVkICA9PT4gVERNIG1vZHVsZSBpcyAlc1xuIiwgdG1wLCAodG1wID09IDApID8gImNvbm5lY3RlZCIgOiAibm90IGNvbm5lY3RlZCIpOworCQlicmVhazsKKwljYXNlIE1WX1NBVFJfQVZTX1NLSVA6CisJCW12T3NQcmludGYoImF2c3NraXBcdFx0PSAlZCAgPT0+ICVzc2tpcCBBVlMgdXBkYXRlIGZyb20gRUZVU0VcbiIsIHRtcCwgKHRtcCA9PSAwKSA/ICJEbyBub3QgIiA6ICIiKTsKKwkJYnJlYWs7CisJY2FzZSBNVl9TQVRSX0JPQVJEX1NQRUVEOgorCQltdk9zUHJpbnRmKCJib2FyZHNwZWVkXHRcdD0gJWQgID09PiBNYXggQ1BVIHNwZWVkIGlzICV1TUh6XG4iLCB0bXAsIGdldEJvYXJkU3BlZWQodG1wKSk7CisJCWJyZWFrOwogCWNhc2UgQ01EX0RVTVA6CiAJCXsKIAkJCU1WX0JPQVJEX1NBVFJfSU5GTyBzYXRySW5mbzsKQEAgLTQyNyw2ICs1MjQsMTEgQEAKIAl9CiAKIAlpZiAoc2F0ckluZm8tPnNhdHJJZCA9PSBNVl9TQVRSX0NQVV9ERFJfTDJfRlJFUSkgeworCQkvKiBEQi02ODIxLUJQIG1heGltdW0gQ1BVL0REUiBmcmVxdWVuY3kgbW9kZSBpcyA4IDogMTMzMi82NjYgTUh6ICovCisJCWlmIChib2FyZElkID09IERCX0JQXzY4MjFfSUQgJiYgdmFsdWUgPiAweDgpIHsKKwkJCW12T3NQcmludGYoIk1heGltdW0gc3VwcG9ydGVkIENQVS9ERFIgbW9kZSBmb3IgREItNjgyMS1CUCBpcyAweDhcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KIAkJZnJlcVZhbHVlSW52YWxpZCA9IDE7CiAJCWZvciAoaT0wOyBpIDw9IE1WX1NBUl9GUkVRX01PREVTX0VPVDsgaSsrKSB7CiAJCQlpZiAoY3B1RGRyQ2xrVGJsW2ldLmlkID09IE1WX1NBUl9GUkVRX01PREVTX0VPVCkKQEAgLTQ0MSwxMiArNTQzLDE0IEBACiAJCQltdk9zUHJpbnRmKCJXcml0ZSBTQFIgZmFpbGVkIVxuIik7CiAJCQlyZXR1cm4gMTsKIAkJfQorCQlpZiAoaXNDcHVNb2RlU3VwcG9ydGVkRm9yQm9hcmQoaSwgTVZfVFJVRSkgPT0gTVZfRkFMU0UpCisJCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiB2ZXJpZnkgcmVxdWVzdGVkIGVudHJ5IGlzIHZhbGlkIGFuZCBtYXAgaXQncyBJRCB2YWx1ZSAqLwogCWlmIChzYXRySW5mby0+c2F0cklkID09IE1WX1NBVFJfREVWSUNFX0lEKSB7Ci0JCWlmICh2YWx1ZSA+IEFSUkFZX1NJWkUoZGV2SWRBcnIpKSB7Ci0JCQlwcmludGYoIiVzOiBFcnJvcjogcmVxdWVzdGVkIGludmFsaWQgREVWSUNFX0lEIHZhbHVlICgleClcbiIsIF9fZnVuY19fLCB2YWx1ZSk7CisJCWlmICh2YWx1ZSA+IEFSUkFZX1NJWkUoZGV2SWRBcnIpIHx8IHZhbHVlID09IDIpIHsgLyogZGV2aWQgPSAyICg2ODExLzIxKSA6IG5vdCBzdXBwb3J0ZWQgdmlhIFNhdFIgKi8KKwkJCXByaW50ZigiJXM6IEVycm9yOiByZXF1ZXN0ZWQgaW52YWxpZCBEZXZpY2UgSUQgdmFsdWUgKCV4KVxuIiwgX19mdW5jX18sIHZhbHVlKTsKIAkJCXJldHVybiAxOwogCQl9CiAJfQpAQCAtNDYwLDcgKzU2NCwxMCBAQAogCWlmIChNVl9TQVRSX0JPQVJEX0lEID09IHNhdHJJbmZvLT5zYXRySWQpIHsKIAkJbXZPc1ByaW50ZigiXG5Cb2FyZCBJRCB1cGRhdGUgcmVxdWlyZXMgbmV3IGRlZmF1bHQgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuIik7CiAJCW12T3NQcmludGYoIiBSZXNldCBlbnZpcm9ubWVudCBmb3IgJXMgPyBbeS9OXSIgLG1hcnZlbGxCb2FyZEluZm9UYmxbdmFsdWVdLT5ib2FyZE5hbWUpOwotCQlpZiAobXZWZXJpZnlSZXF1ZXN0KCkgPT0gTVZfVFJVRSkKKwkJcmVhZGxpbmUoIiAiKTsKKwkJaWYoc3RybGVuKGNvbnNvbGVfYnVmZmVyKSAhPSAwICYmIC8qIGlmIHByZXNzZWQgRW50ZXIgKi8KKwkJCXN0cmNtcChjb25zb2xlX2J1ZmZlciwibiIpICE9IDAgJiYKKwkJCXN0cmNtcChjb25zb2xlX2J1ZmZlciwiTiIpICE9IDAgKQogCQkJcnVuX2NvbW1hbmQoInJlc2V0ZW52IiwgMCk7CiAJfQogCXJldHVybiAwOwpAQCAtNDgxLDYgKzU4OCwxNiBAQAogCQlyZXR1cm4gMTsKIAl9CiAKKwkvKiBDaGVjayBpZiBzd2l0Y2ggaXMgY29ubmVjdGVkIHRvIEFNQyBib2FyZCAqLworCWlmIChib2FyZElkID09IERCX0FNQ182ODIwX0lEKSB7CisJCXN0YXRpYyBTSUxJQ09OX1RZUEUgc2lsdCA9IFNJTFRfTk9UX0RFVEVDVDsKKworCQlpZiAoc2lsdCA9PSBTSUxUX05PVF9ERVRFQ1QpCisJCQlzaWx0ID0gZ2V0X2F0dGFjaGVkX3NpbGljb25fdHlwZSgpOworCQlpZiAoc2lsdCA9PSBTSUxUX0JDMikKKwkJCXJldHVybiBkb19zYXJfYmMyKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKwl9CisKIAkvKiBpcyByZXF1ZXN0ZWQgJ1NhdFIgcmVhZCcgLS0+IER1bXAgYWxsICovCiAJaWYgKGFyZ2MgPiAxICYmIGFyZ2MgPCAzICYmIHN0cmNtcChjbWQsICJyZWFkIikgPT0gMCkKIAkJbW9kZSA9IENNRF9EVU1QOwpAQCAtNTUyLDYgKzY2OSw4IEBACiAiZGRyNHNlbGVjdAkJICAgLSBEQi04OEY2ODIwLUJQOiBERFIzLzQJCShyZWFkIG9ubHkpXG4iCiAiZWNvdmVyc2lvbgkJICAgLSBEQi04OEY2ODIwLUJQOiBFQ08gdmVyc2lvbgkocmVhZCBvbmx5KVxuIgogImJvYXJkaWQJCQkgICAtIGJvYXJkIElECQkocmVhZCBvbmx5KVxuIgorImJvYXJkc3BlZWQJCQkgICAtIE1BWCB2YWxpZGF0ZWQgQ1BVIG1vZGUgZm9yIGN1cnJlbnQgY2hpcAkJKHJlYWQgb25seSlcbiIKKyJhdnNza2lwCQkJICAgLSBTa2lwIEFWUyBmcm9tIEVGVVNFIHVwZGF0ZVxuIgogCiAiXG5cdCBCb2FyZCBTcGVjaWZpYyBTVyBmaWVsZHNcbiIKICJcdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgpAQCAtNTYxLDcgKzY4MCwxMCBAQAogImRic2VyZGVzMQkJICAgLSBEQi1HUCwgREItODhGNjgyMS1CUDoJU2VyRGVzIGxhbmUgIzFcbiIKICJkYnNlcmRlczIJCSAgIC0gREItR1AsIERCLTg4RjY4MjEtQlA6CVNlckRlcyBsYW5lICMyXG4iCiAidXNiM3BvcnQwCQkgICAtIERCLUdQLCBEQi04OEY2ODIxLUJQOglVU0IzLVBvcnQwIG1vZGVcbiIKLSJ1c2IzcG9ydDEJCSAgIC0gREItR1AsIERCLTg4RjY4MjEtQlA6CVVTQjMtUG9ydDEgbW9kZVxuXG4iCisidXNiM3BvcnQxCQkgICAtIERCLUdQLCBEQi04OEY2ODIxLUJQOglVU0IzLVBvcnQxIG1vZGVcbiIKKyJmbGF2b3IJCQkgICAtIERCLUdQLCBEQi04OEY2ODIxLUJQOiBJcyBmdWxsIGZsYXZvciAoZm9yIEEzODMvNCBzaW11bGF0aW9uKVxuIgorInRkbQkJCSAgIC0gREItQlA6CQkJaXMgVERNIG1vZHVsZSBjb25uZWN0ZWRcblxuIgorCiAKICk7CiAjZW5kaWYgLypkZWZpbmVkKENPTkZJR19DTURfU0FSKSovCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9jbWRfc2FyMzl4LmMgYi9ib2FyZC9tdl9lYnUvYTM4eC9jbWRfc2FyMzl4LmMKaW5kZXggMjcxMDI4NC4uYTcxODVlMiAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvY21kX3NhcjM5eC5jCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2NtZF9zYXIzOXguYwpAQCAtNDUsMTIgKzQ1LDE0IEBACiAJTVZfU0FUUl9UWVBFX0lEIHNhdHJJZDsKIAlNVl9VMzIgZGVmYXVsZVZhbHVlRm9yQm9hcmRbTVZfTUFSVkVMTF9CT0FSRF9OVU1dOwogfSBNVl9CT0FSRF9TQVRSX0RFRkFVTFQ7Ci0jZGVmaW5lIE1BWF9ERUZBVUxUX0VOVFJZCTIKKyNkZWZpbmUgTUFYX0RFRkFVTFRfRU5UUlkJNAogCiBNVl9CT0FSRF9TQVRSX0RFRkFVTFQgYm9hcmRTYXRyRGVmYXVsdFtNQVhfREVGQVVMVF9FTlRSWV0gPSB7CiAvKiAJZGVmYXVsZVZhbHVlRm9yQm9hcmRbXSA9IFJEXzY5eHgsCURCXzY4eHggKi8KLXsgTVZfU0FUUl9DUFVfRERSX0wyX0ZSRVEsCXsweDBjLAkJMHgwYywJCX0gfSwKLXsgTVZfU0FUUl9DT1JFX0NMS19TRUxFQ1QsCXswLAkJMCwJCX0gfSwKK3tNVl9TQVRSX0NQVV9ERFJfTDJfRlJFUSwJezB4MGMsCQkweDBjLAkJfSB9LAore01WX1NBVFJfQ09SRV9DTEtfU0VMRUNULAl7MCwJCTAsCQl9IH0sCit7TVZfU0FUUl9CT09UX0RFVklDRSwJCXswLAkJMCwJCX0gfSwvKiBEdW1teSBlbnRyeTogZGVmYXVsdCB2YWx1ZSB0YWtlbiBmcm9tIFNAUiByZWdpc3RlciAqLwore01WX1NBVFJfQk9PVDJfREVWSUNFLAkJezAsCQkwLAkJfSB9LC8qIER1bW15IGVudHJ5OiBkZWZhdWx0IHZhbHVlIHRha2VuIGZyb20gU0BSIHJlZ2lzdGVyICovCiB9OwogCiB0eXBlZGVmIHN0cnVjdCBfZGV2aWNlSWRFbnRyeSB7CkBAIC02NSwyOCArNjcsMjIgQEAKIHsgIjY5MjggKEEzOTgpIiwJMHg2OTI4LAkJMHg2IH0sCiB9OwogCi1NVl9CT09MIG12VmVyaWZ5UmVxdWVzdCh2b2lkKQotewotCXJlYWRsaW5lKCIgIik7Ci0JaWYoc3RybGVuKGNvbnNvbGVfYnVmZmVyKSA9PSAwIHx8IC8qIGlmIHByZXNzZWQgRW50ZXIgKi8KLQkJc3RyY21wKGNvbnNvbGVfYnVmZmVyLCJuIikgPT0gMCB8fAotCQlzdHJjbXAoY29uc29sZV9idWZmZXIsIk4iKSA9PSAwICkgewotCQlwcmludGYoIlxuIik7Ci0JCXJldHVybiBNVl9GQUxTRTsKLQl9Ci0JcmV0dXJuIE1WX1RSVUU7Ci19Ci0KIGludCBkb19zYXJfZGVmYXVsdCh2b2lkKQogewogCU1WX1UzMiBpLCByYywgZGVmYXVsdFZhbHVlLCBib2FyZElkID0gbXZCb2FyZElkSW5kZXhHZXQobXZCb2FyZElkR2V0KCkpOwogCU1WX1NBVFJfVFlQRV9JRCBzYXRyQ2xhc3NJZDsKIAlNVl9CT0FSRF9TQVRSX0lORk8gc2F0ckluZm87Ci0KKwlNVl9VMzIgc2F0ckJvb3REZXZpY2VWYWx1ZSA9IG12Q3RybGJvb3RTcmNHZXQoKSwgdG1wOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfREVGQVVMVF9FTlRSWTsgaSsrKSB7CiAJCXNhdHJDbGFzc0lkID0gYm9hcmRTYXRyRGVmYXVsdFtpXS5zYXRySWQ7CiAJCWlmIChtdkJvYXJkU2F0ckluZm9Db25maWcoc2F0ckNsYXNzSWQsICZzYXRySW5mbykgIT0gTVZfT0spCiAJCQljb250aW51ZTsKKwkJaWYgKHNhdHJDbGFzc0lkID09IE1WX1NBVFJfQk9PVF9ERVZJQ0UpCisJCQlib2FyZFNhdHJEZWZhdWx0W2ldLmRlZmF1bGVWYWx1ZUZvckJvYXJkW2JvYXJkSWRdID0gc2F0ckJvb3REZXZpY2VWYWx1ZSAmIHNhdHJJbmZvLm1hc2s7CisJCWlmIChzYXRyQ2xhc3NJZCA9PSBNVl9TQVRSX0JPT1QyX0RFVklDRSkgeworCQkJdG1wID0gc2F0ckJvb3REZXZpY2VWYWx1ZSA+PiBNVl9TQVRSX0JPT1QyX1ZBTFVFX09GRlNFVDsKKwkJCWJvYXJkU2F0ckRlZmF1bHRbaV0uZGVmYXVsZVZhbHVlRm9yQm9hcmRbYm9hcmRJZF0gPSB0bXAgJiBNVl9TQVRSX0JPT1QyX1ZBTFVFX01BU0s7CisJCX0KIAkJZGVmYXVsdFZhbHVlID0gYm9hcmRTYXRyRGVmYXVsdFtpXS5kZWZhdWxlVmFsdWVGb3JCb2FyZFtib2FyZElkXTsKIAkJcmMgPSBtdkJvYXJkU2F0UldyaXRlKHNhdHJDbGFzc0lkLCBkZWZhdWx0VmFsdWUpOwogCQlpZiAocmMgPT0gTVZfRVJST1IpIHsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzh4L212U3lzSHdDb25maWcuaCBiL2JvYXJkL212X2VidS9hMzh4L212U3lzSHdDb25maWcuaAppbmRleCBlNmY3MDRjLi45Y2RjNzEzIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9tdlN5c0h3Q29uZmlnLmgKKysrIGIvYm9hcmQvbXZfZWJ1L2EzOHgvbXZTeXNId0NvbmZpZy5oCkBAIC0zMyw2ICszMyw3IEBACiAjZGVmaW5lIE1WX0lOQ0xVREVfVFdTSQogI2RlZmluZSBNVl9JTkNMVURFX1VBUlQKICNkZWZpbmUgTVZfSU5DTFVERV9URE0KKyNkZWZpbmUgTVZfSU5DTFVERV9BVURJTwogI2RlZmluZSBNVl9JTkNMVURFX1hPUgogI2RlZmluZSBDT05GSUdfU0FUQV9BSENJX01WIC8qIHNoYXJlZCBmb3IgdS1ib290IGFuZCBsaW51eCovCiAjZGVmaW5lIE1WX0lOQ0xVREVfU0FUQSAvKiBvbmx5IG9uIHUtYm9vdCAqLwpAQCAtNDAsNiArNDEsNyBAQAogI2RlZmluZSBNVl9JTkNMVURFX1JUQwogCiAjZGVmaW5lIE1WX0lOQ0xVREVfQ0xLX1BXUl9DTlRSTAorI2RlZmluZSBNVl9JTkNMVURFX1NXSVRDSAogCiAvKgogICogQm9hcmQgZGV2aWNlcwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2EzOHgvbXZfbWFpbl9hMzh4LmMgYi9ib2FyZC9tdl9lYnUvYTM4eC9tdl9tYWluX2EzOHguYwppbmRleCBlYWVmMTQ3Li5kMjMyNzBkIDEwMDc1NQotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9tdl9tYWluX2EzOHguYworKysgYi9ib2FyZC9tdl9lYnUvYTM4eC9tdl9tYWluX2EzOHguYwpAQCAtMTAzLDYgKzEwMywxMSBAQAogI2luY2x1ZGUgPHNkaGNpLmg+CiBpbnQgbXZfc2RoX2luaXQodTMyIHJlZ2Jhc2UsIHUzMiBtYXhfY2xrLCB1MzIgbWluX2NsaywgdTMyIHF1aXJrcyk7CiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19TV0lUQ0hJTkdfU0VSVklDRVMKKyNpbmNsdWRlICJzd2l0Y2hpbmdTZXJ2aWNlcy9zd2l0Y2hpbmdTZXJ2aWNlcy5oIgorI2VuZGlmCisKIC8qICNkZWZpbmUgTVZfREVCVUcgKi8KICNpZmRlZiBNVl9ERUJVRwogI2RlZmluZSBEQih4KSB4CkBAIC0zMDYsNyArMzExLDYgQEAKIAkJCSoodW5zaWduZWQgaW50KikoQ09ORklHX1NZU19URVhUX0JBU0UgKyBpKTsKIAogCW12Qm9hcmREZWJ1Z0xlZCg0KTsKLQltdl9wcmludF9tYXAoKTsKICNpZiBkZWZpbmVkKENPTkZJR19DTURfQk9BUkRDRkcpCiAJbXZCb2FyZEVlcHJvbVZhbGlkU2V0KCk7CiAjZW5kaWYKQEAgLTMxOSw2ICszMjMsMTAgQEAKIAljaGFyIHRtcF9idWZbMTBdOwogCXVuc2lnbmVkIGludCBtYWxsb2NfbGVuOwogCisJZW52ID0gZ2V0ZW52KCJsaW1pdF9kcmFtX3NpemUiKTsKKwlpZiAoIWVudikKKwkJc2V0ZW52KCJsaW1pdF9kcmFtX3NpemUiLCAieWVzIik7CisKIAllbnYgPSBnZXRlbnYoImNvbnNvbGUiKTsKIAlpZiAoIWVudikKIAkJc2V0ZW52KCJjb25zb2xlIiwgImNvbnNvbGU9dHR5UzAsMTE1MjAwIik7CkBAIC0zMjYsNyArMzM0LDcgQEAKIAllbnYgPSBnZXRlbnYoIm10ZGlkcyIpOwogCWlmICghZW52KSB7CiAjaWYgZGVmaW5lZChNVl9OQU5EKSAmJiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQotCQlzZXRlbnYoIm10ZGlkcyIsICJuYW5kMD1hcm1hZGEtbmFuZDtzcGkwPXNwaV9mbGFzaCIpOworCQlzZXRlbnYoIm10ZGlkcyIsICJuYW5kMD1hcm1hZGEtbmFuZCxzcGkwPXNwaV9mbGFzaCIpOwogI2VsaWYgZGVmaW5lZChNVl9OQU5EKQogCQlzZXRlbnYoIm10ZGlkcyIsICJuYW5kMD1hcm1hZGEtbmFuZCIpOwogI2VsaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKQEAgLTMzNiwxNSArMzQ0LDIzIEBACiAJZW52ID0gZ2V0ZW52KCJtdGRwYXJ0cyIpOwogCWlmICghZW52KSB7CiAjaWYgZGVmaW5lZChNVl9OQU5EKSAmJiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQotCQlzZXRlbnYoIm10ZHBhcnRzIiwgIidtdGRwYXJ0cz1hcm1hZGEtbmFuZDo4bShib290KXJvLDhtQDhtKGtlcm5lbCksLShyb290ZnMpO210ZHBhcnRzPXNwaV9mbGFzaDo0bShib290KSwtKHNwaS1yb290ZnMpJyIpOworCQkvKiBTaW5jZSBvbmx5IEFNQyBib2FyZCBzdXBwb3J0cyBib3RoIE5BTkQgYW5kIFNQSSwgYW5kIGl0IHVzZXMgU1BJMQorCQkgKiAic3BpMS4wIiBpcyB1c2VkIGluIG10ZHBhcnRzIGluc3RlYWQgb2YgInNwaTAuMCIgKi8KKwkJc2V0ZW52KCJtdGRwYXJ0cyIsICInbXRkcGFydHM9YXJtYWRhLW5hbmQ6OG0oYm9vdClybyw4bUA4bShrZXJuZWwpLC0ocm9vdGZzKTtzcGkxLjA6NG0oYm9vdCksLShzcGktcm9vdGZzKTsiCisJCQkJInB4YTN4eF9uYW5kLTA6OG0oYm9vdClybyw4bUA4bShrZXJuZWwpLC0ocm9vdGZzKSciKTsKKwkJc2V0ZW52KCJtdGRwYXJ0c19sZ2N5IiwgIidtdGRwYXJ0cz1hcm1hZGEtbmFuZDo4bShib290KXJvLDhtQDhtKGtlcm5lbCksLShyb290ZnMpO3NwaV9mbGFzaDo0bShib290KSwtKHNwaS1yb290ZnMpOyIKKwkJCQkicHhhM3h4X25hbmQtMDo4bShib290KXJvLDhtQDhtKGtlcm5lbCksLShyb290ZnMpJyIpOwogI2VsaWYgZGVmaW5lZChNVl9OQU5EKQotCQlzZXRlbnYoIm10ZHBhcnRzIiwgIm10ZHBhcnRzPWFybWFkYS1uYW5kOjhtKGJvb3Qpcm8sOG1AOG0oa2VybmVsKSwtKHJvb3RmcykiKTsKKwkJc2V0ZW52KCJtdGRwYXJ0cyIsICJtdGRwYXJ0cz1hcm1hZGEtbmFuZDo4bShib290KXJvLDhtQDhtKGtlcm5lbCksLShyb290ZnMpOyIKKwkJCQkicHhhM3h4X25hbmQtMDo4bShib290KXJvLDhtQDhtKGtlcm5lbCksLShyb290ZnMpIik7CisJCXNldGVudigibXRkcGFydHNfbGdjeSIsIGdldGVudigibXRkcGFydHMiKSk7CiAjZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQogI2lmZGVmIENPTkZJR19HRkNIMTAwCiAJCXNldGVudigibXRkcGFydHMiLCAibXRkcGFydHM9c3BpX2ZsYXNoOjFtKGJvb3QpLDY0a0AxbShlbnYpLC0ocmVzZXJ2ZWQpIik7CiAjZWxzZQotCQlzZXRlbnYoIm10ZHBhcnRzIiwgIm10ZHBhcnRzPXNwaV9mbGFzaDo0bShib290KSwtKHNwaS1yb290ZnMpIik7CisJCXNldGVudigibXRkcGFydHMiLCAibXRkcGFydHM9c3BpMC4wOjRtKGJvb3QpLC0oc3BpLXJvb3RmcykiKTsKICNlbmRpZgorCQlzZXRlbnYoIm10ZHBhcnRzX2xnY3kiLCAibXRkcGFydHM9c3BpX2ZsYXNoOjRtKGJvb3QpLC0oc3BpLXJvb3RmcykiKTsKICNlbmRpZgogCX0KIApAQCAtNDkyLDExICs1MDgsMTEgQEAKIAllbnYgPSBnZXRlbnYoImJvb3RhcmdzX2RmbHQiKTsKIAlpZiAoIWVudikKICNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzlYKQotCQlzZXRlbnYoImJvb3RhcmdzX2RmbHQiLCAiJGNvbnNvbGUgJG5hbmRFY2MgJG10ZHBhcnRzICRib290YXJnc19yb290IG5mc3Jvb3Q9JHNlcnZlcmlwOiRyb290cGF0aCAiCisJCXNldGVudigiYm9vdGFyZ3NfZGZsdCIsICIkY29uc29sZSAkbmFuZEVjYyAkbXRkcGFydHNfbGdjeSAkYm9vdGFyZ3Nfcm9vdCBuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIgogCQkJICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwJGJvb3RhcmdzX2VuZCAkbXZOZXRDb25maWcgdmlkZW89ZG92ZWZiOmxjZDA6JGxjZDBfcGFyYW1zICIKIAkJCSAgICJjbGNkLmxjZDBfZW5hYmxlPSRsY2QwX2VuYWJsZSBjbGNkLmxjZF9wYW5lbD0kbGNkX3BhbmVsICRuc3NfZW1hY19tYXAiKTsKICNlbHNlCi0JCXNldGVudigiYm9vdGFyZ3NfZGZsdCIsICIkY29uc29sZSAkbmFuZEVjYyAkbXRkcGFydHMgJGJvb3RhcmdzX3Jvb3QgbmZzcm9vdD0kc2VydmVyaXA6JHJvb3RwYXRoICIKKwkJc2V0ZW52KCJib290YXJnc19kZmx0IiwgIiRjb25zb2xlICRuYW5kRWNjICRtdGRwYXJ0c19sZ2N5ICRib290YXJnc19yb290IG5mc3Jvb3Q9JHNlcnZlcmlwOiRyb290cGF0aCAiCiAJCQkgICAiaXA9JGlwYWRkcjokc2VydmVyaXAkYm9vdGFyZ3NfZW5kICRtdk5ldENvbmZpZyB2aWRlbz1kb3ZlZmI6bGNkMDokbGNkMF9wYXJhbXMgIgogCQkJICAgImNsY2QubGNkMF9lbmFibGU9JGxjZDBfZW5hYmxlIGNsY2QubGNkX3BhbmVsPSRsY2RfcGFuZWwiKTsKICNlbmRpZgpAQCAtNTA1LDcgKzUyMSwxMSBAQAogCQlzZXRlbnYoImJvb3RjbWRfYXV0byIsICJzdGFnZV9ib290ICRib290X29yZGVyIik7CiAJZW52ID0gZ2V0ZW52KCJib290Y21kX2xnY3kiKTsKIAlpZiAoIWVudikKLQkJc2V0ZW52KCJib290Y21kX2xnY3kiLCAidGZ0cGJvb3QgMHgyMDAwMDAwICRpbWFnZV9uYW1lOyBzZXRlbnYgYm9vdGFyZ3MgJGJvb3RhcmdzX2RmbHQ7IGJvb3RtIDB4MjAwMDAwMDsgIik7CisJCXNldGVudigiYm9vdGNtZF9sZ2N5IiwgInRmdHBib290IDB4MjAwMDAwMCAkaW1hZ2VfbmFtZTsiCisJCQkgICAic2V0ZW52IGJvb3RhcmdzICRjb25zb2xlICRuYW5kRWNjICRtdGRwYXJ0c19sZ2N5IgorCQkJICAgIiAkYm9vdGFyZ3Nfcm9vdCBuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIgorCQkJICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwJGJvb3RhcmdzX2VuZCAgdmlkZW89ZG92ZWZiOmxjZDA6JGxjZDBfcGFyYW1zICIKKwkJCSAgICJjbGNkLmxjZDBfZW5hYmxlPSRsY2QwX2VuYWJsZSBjbGNkLmxjZF9wYW5lbD0kbGNkX3BhbmVsOyAgYm9vdG0gJGxvYWRhZGRyOyAiKTsKICNlbmRpZgogCWVudiA9IGdldGVudigicHhlX2ZpbGVzX2xvYWQiKTsKIAlpZiAoIWVudikKQEAgLTUzMCw2ICs1NTAsMjIgQEAKIAkJc2V0ZW52KCJib290YXJnc19kZWJ1ZyIsICJkZWJ1Zz0xIGxvZ2luPTEgZWFybHlwcmludGsiKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0NNRF9TT1VSQ0UKKwllbnYgPSBnZXRlbnYoInJ1bl9zY3JpcHQiKTsKKwlpZiAoIWVudikKKwkJc2V0ZW52KCJydW5fc2NyaXB0IiwgIm5vIik7CisjZW5kaWYKKwllbnYgPSBnZXRlbnYoInNkX2RldGVjdGlvbl9kYXQzIik7CisJaWYgKCFlbnYpIHsKKwkJLyogYnkgZGVmYXVsdCBEQi1HUCBpcyB0aGUgb25seSBtYXJ2ZWxsIGJvYXJkIHdpdGggREFUMyBkZXRlY3Rpb24gbWV0aG9kIHN1cHBvcnQuCisJCQlUaGlzIHN1cHBvcnQgd2FzIGFkZGVkIGluIEVDTyAxLjUgYW5kIGFib3ZlLCBzbyBhZGRlZCBlbnYuCisJCQl2YXJpYWJsZSB0byBjb250cm9sIGRldGVjdGlvbiBtZXRob2QgYWNjb3JkaW5nIHRvIEVDTyB2ZXIuICovCisJCWlmIChtdkJvYXJkSWRHZXQoKSA9PSBEQl9HUF82OFhYX0lEKQorCQkJc2V0ZW52KCJzZF9kZXRlY3Rpb25fZGF0MyIsICJ5ZXMiKTsKKwkJZWxzZQorCQkJc2V0ZW52KCJzZF9kZXRlY3Rpb25fZGF0MyIsICJubyIpOworCX0KKwogCS8qIG5ldGJzZCBib290IGFyZ3VtZW50cyAqLwogCWVudiA9IGdldGVudigibmV0YnNkX2VuIik7CiAJaWYgKCAhZW52IHx8ICggKChzdHJjbXAoZW52LCAibm8iKSA9PSAwKSB8fCAoc3RyY21wKGVudiwgIk5vIikgPT0gMCkgKSkpCkBAIC02MjQsMTEgKzY2MCw3IEBACiAJfSBlbHNlIHsKIAkJZW52ID0gZ2V0ZW52KCJib290YXJnc19lbmQiKTsKIAkJaWYgKCFlbnYpCi0jaWYgZGVmaW5lZChNVl9JTkNfQk9BUkRfUURfU1dJVENIKQotCQkJc2V0ZW52KCJib290YXJnc19lbmQiLCBNVl9CT09UQVJHU19FTkRfU1dJVENIKTsKLSNlbHNlCiAJCQlzZXRlbnYoImJvb3RhcmdzX2VuZCIsIE1WX0JPT1RBUkdTX0VORCk7Ci0jZW5kaWYKIAl9CiAKIAllbnYgPSBnZXRlbnYoImltYWdlX25hbWUiKTsKQEAgLTcxMCw5ICs3NDIsNyBAQAogI2lmIChDT05GSUdfQk9PVERFTEFZID49IDApCiAJZW52ID0gZ2V0ZW52KCJib290Y21kIik7CiAJaWYgKCFlbnYpCi0jaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKSAmJiBkZWZpbmVkIChDT05GSUdfT0ZfTElCRkRUX0lTX0RFRkFVTFQpCi0JCXNldGVudigiYm9vdGNtZCIsYm9vdGNtZF9mZHQpOwotI2VsaWYgZGVmaW5lZChDT05GSUdfR0ZDSDEwMCkKKyNpZiBkZWZpbmVkKENPTkZJR19HRkNIMTAwKQogCQlzZXRlbnYoImdmcGFyYW1zIiwKIAkJCSJpZiB0ZXN0ICRITlZfQUNUSVZBVEVEX0tFUk5FTF9OQU1FID0ga2VybmVsMTsgIgogCQkJInRoZW4gZ2ZrZXJuZWw9MHg5MDQ4IGdmcm9vdD1yb290PXJvb3RmczE7ICIKQEAgLTcyNCw0MiArNzU0LDE4IEBACiAJCQkic2V0ZW52IGJvb3RhcmdzICRjb25zb2xlICRtdGRwYXJ0cyAkZ2Zyb290ICRnZmxvZ3MgJGJvb3RhcmdzX2V4dHJhOyAiCiAJCQkiYm9vdG0gJGxvYWRhZGRyOyAiCiAJCSk7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DTURfU1RBR0VfQk9PVCkKLS8vCQlzZXRlbnYoImJvb3RjbWQiLCJzdGFnZV9ib290ICRib290X29yZGVyIik7Ci0vLyBUZW1wb3Jhcnkgd29ya2Fyb3VuZCB0aWxsIHN0YWdlX2Jvb3QgZ2V0cyBzdGFibGUuCi0JCXNldGVudigiYm9vdGNtZCIsICJ0ZnRwYm9vdCAweDIwMDAwMDAgJGltYWdlX25hbWU7IgotCQkJICAgInNldGVudiBib290YXJncyAkY29uc29sZSAkbmFuZEVjYyAkbXRkcGFydHMgJGJvb3RhcmdzX3Jvb3QgbmZzcm9vdD0kc2VydmVyaXA6JHJvb3RwYXRoICIKLQkJCSAgICJpcD0kaXBhZGRyOiRzZXJ2ZXJpcCRib290YXJnc19lbmQgIHZpZGVvPWRvdmVmYjpsY2QwOiRsY2QwX3BhcmFtcyAiCi0JCQkgICAiY2xjZC5sY2QwX2VuYWJsZT0kbGNkMF9lbmFibGUgY2xjZC5sY2RfcGFuZWw9JGxjZF9wYW5lbDsgIGJvb3RtICRsb2FkYWRkcjsgIik7Ci0KLSNlbGlmIGRlZmluZWQoTVZfSU5DTFVERV9URE0pIHx8IGRlZmluZWQoTVZfSU5DX0JPQVJEX1FEX1NXSVRDSCkKLQkJc2V0ZW52KCJib290Y21kIiwgInRmdHBib290IDB4MjAwMDAwMCAkaW1hZ2VfbmFtZTsiCi0JCQkgICAic2V0ZW52IGJvb3RhcmdzICRjb25zb2xlICRuYW5kRWNjICRtdGRwYXJ0cyAkYm9vdGFyZ3Nfcm9vdCBuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIgotCQkJICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwJGJvb3RhcmdzX2VuZCAkbXZOZXRDb25maWcgdmlkZW89ZG92ZWZiOmxjZDA6JGxjZDBfcGFyYW1zICIKLQkJCSAgICJjbGNkLmxjZDBfZW5hYmxlPSQobGNkMF9lbmFibGUpIGNsY2QubGNkX3BhbmVsPSRsY2RfcGFuZWw7ICBib290bSAkbG9hZGFkZHI7ICIpOwogI2Vsc2UKLQkJc2V0ZW52KCJib290Y21kIiwgInRmdHBib290IDB4MjAwMDAwMCAkaW1hZ2VfbmFtZTsiCi0JCQkgICAic2V0ZW52IGJvb3RhcmdzICRjb25zb2xlICRuYW5kRWNjICRtdGRwYXJ0cyAkYm9vdGFyZ3Nfcm9vdCBuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIgotCQkJICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwJGJvb3RhcmdzX2VuZCAgdmlkZW89ZG92ZWZiOmxjZDA6JGxjZDBfcGFyYW1zICIKLQkJCSAgICJjbGNkLmxjZDBfZW5hYmxlPSRsY2QwX2VuYWJsZSBjbGNkLmxjZF9wYW5lbD0kbGNkX3BhbmVsOyAgYm9vdG0gJGxvYWRhZGRyOyAiKTsKKwkJc2V0ZW52KCJib290Y21kIiwgInRmdHBib290IDB4MjAwMDAwMCAkaW1hZ2VfbmFtZTt0ZnRwYm9vdCAkZmR0YWRkciAkZmR0ZmlsZTsiCisJCSJzZXRlbnYgYm9vdGFyZ3MgJGNvbnNvbGUgJG5hbmRFY2MgJG10ZHBhcnRzICRib290YXJnc19yb290IG5mc3Jvb3Q9JHNlcnZlcmlwOiRyb290cGF0aCAiCisJCSJpcD0kaXBhZGRyOiRzZXJ2ZXJpcCRib290YXJnc19lbmQgJG12TmV0Q29uZmlnIHZpZGVvPWRvdmVmYjpsY2QwOiRsY2QwX3BhcmFtcyAiCisJCSJjbGNkLmxjZDBfZW5hYmxlPSRsY2QwX2VuYWJsZSBjbGNkLmxjZF9wYW5lbD0kbGNkX3BhbmVsOyBib290eiAweDIwMDAwMDAgLSAkZmR0YWRkcjsiKTsKICNlbmRpZgogI2VuZGlmICAvKiAoQ09ORklHX0JPT1RERUxBWSA+PSAwKSAqLwogCiAJZW52ID0gZ2V0ZW52KCJzdGFuZGFsb25lIik7CiAJaWYgKCFlbnYpCi0jaWYgZGVmaW5lZChNVl9JTkNMVURFX1RETSkgJiYgZGVmaW5lZChNVl9JTkNfQk9BUkRfUURfU1dJVENIKQotCQlzZXRlbnYoInN0YW5kYWxvbmUiLCAiZnNsb2FkIDB4MjAwMDAwMCAkaW1hZ2VfbmFtZTtzZXRlbnYgYm9vdGFyZ3MgJGNvbnNvbGUgJG5hbmRFY2MgJG10ZHBhcnRzICIKLQkJCSAgICJyb290PS9kZXYvbXRkYmxvY2swIHJ3IGlwPSRpcGFkZHI6JHNlcnZlcmlwJGJvb3RhcmdzX2VuZCAkbXZOZXRDb25maWc7IGJvb3RtIDB4MjAwMDAwMDsiKTsKLSNlbGlmIGRlZmluZWQoTVZfSU5DX0JPQVJEX1FEX1NXSVRDSCkKLQkJc2V0ZW52KCJzdGFuZGFsb25lIiwgImZzbG9hZCAweDIwMDAwMDAgJGltYWdlX25hbWU7c2V0ZW52IGJvb3RhcmdzICRjb25zb2xlICRuYW5kRWNjICRtdGRwYXJ0cyAiCi0JCQkgICAicm9vdD0vZGV2L210ZGJsb2NrMCBydyBpcD0kaXBhZGRyOiRzZXJ2ZXJpcCRib290YXJnc19lbmQgJG12TmV0Q29uZmlnOyBib290bSAweDIwMDAwMDA7Iik7Ci0jZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfVERNKQotCQlzZXRlbnYoInN0YW5kYWxvbmUiLCAiZnNsb2FkIDB4MjAwMDAwMCAkaW1hZ2VfbmFtZTtzZXRlbnYgYm9vdGFyZ3MgJGNvbnNvbGUgJG5hbmRFY2MgJG10ZHBhcnRzICIKKwkJc2V0ZW52KCJzdGFuZGFsb25lIiwgImZzbG9hZCAweDIwMDAwMDAgJGltYWdlX25hbWU7c2V0ZW52IGJvb3RhcmdzICRjb25zb2xlICRuYW5kRWNjICRtdGRwYXJ0c19sZ2N5ICIKIAkJCSAgICJyb290PS9kZXYvbXRkYmxvY2swIHJ3IGlwPSRpcGFkZHI6JHNlcnZlcmlwJGJvb3RhcmdzX2VuZDsgYm9vdG0gMHgyMDAwMDAwOyIpOwotI2Vsc2UKLQkJc2V0ZW52KCJzdGFuZGFsb25lIiwgImZzbG9hZCAweDIwMDAwMDAgJGltYWdlX25hbWU7c2V0ZW52IGJvb3RhcmdzICRjb25zb2xlICRuYW5kRWNjICRtdGRwYXJ0cyAiCi0JCQkgICAicm9vdD0vZGV2L210ZGJsb2NrMCBydyBpcD0kaXBhZGRyOiRzZXJ2ZXJpcCRib290YXJnc19lbmQ7IGJvb3RtIDB4MjAwMDAwMDsiKTsKLSNlbmRpZgogCiAJLyogU2V0IGJvb2RlbGF5IHRvIDMgc2VjLCBpZiBNb25pdG9yIGV4dGVuc2lvbiBhcmUgZGlzYWJsZWQgKi8KIAlpZiAoIWVuYU1vbkV4dCgpKQpAQCAtOTkyLDYgKzk5OCwxMSBAQAogCQlraWNrX25leHQoKTsKIAogCW12Qm9hcmREZWJ1Z0xlZCgwKTsKKyNpZmRlZiBDT05GSUdfU1dJVENISU5HX1NFUlZJQ0VTCisJLyogU29tZSBhZGRpdGlvbmFsIHRhc2tzIG1heWJlIHJlcXVpcmVkIGZvciBzbGF2ZSBCQzIgZGV2aWNlLCBsaWtlIFFTR01JSSBzZWxlY3QgKi8KKwlpZiAobXZCb2FyZGlzQW1jKCkgJiYgKGdldF9hdHRhY2hlZF9zaWxpY29uX3R5cGUoKSA9PSBTSUxUX0JDMikpCisJCWh3U2VydmljZXNMYXRlSW5pdCgpOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwNjYsNiArMTA3Nyw3IEBACiBpbnQgbGF0ZV9wcmludF9jcHVpbmZvKHZvaWQpCiB7CiAJY2hhciBuYW1lWzUwXTsKKwlpbnQgZGRyVHlwZSA9IDQ7CiAKIAltdkN0cmxVcGRhdGVQZXhJZCgpOwogCkBAIC0xMDg2LDkgKzEwOTgsMTIgQEAKIAlwcmludGYoIiAgICAgICBDUFUgICAgQCAlZCBbTUh6XVxuIiwgbXZDcHVQY2xrR2V0KCkvMTAwMDAwMCk7CiAJcHJpbnRmKCIgICAgICAgTDIgICAgIEAgJWQgW01Iel1cbiIsIG12Q3B1TDJDbGtHZXQoKS8xMDAwMDAwKTsKIAlwcmludGYoIiAgICAgICBUQ2xvY2sgQCAlZCBbTUh6XVxuIiwgbXZUY2xrR2V0KCkvMTAwMDAwMCk7Ci0JcHJpbnRmKCIgICAgICAgRERSICAgIEAgJWQgW01Iel1cbiIsIENPTkZJR19TWVNfQlVTX0NMSy8xMDAwMDAwKTsKLQlwcmludGYoIiAgICAgICBERFIgJWQgQml0IFdpZHRoLCAlcyBNZW1vcnkgQWNjZXNzLCBETEIgJXMsIEVDQyAlcyIsCi0JCQltdkN0cmxERFJCdWRXaWR0aCgpLAorI2lmZGVmIENPTkZJR19ERFIzLypERFIzKi8KKwlkZHJUeXBlID0gMzsKKyNlbmRpZgorCXByaW50ZigiICAgICAgIEREUiVkICAgIEAgJWQgW01Iel1cbiIsIGRkclR5cGUsIENPTkZJR19TWVNfQlVTX0NMSy8xMDAwMDAwKTsKKwlwcmludGYoIiAgICAgICBERFIlZCAlZCBCaXQgV2lkdGgsJXMgTWVtb3J5IEFjY2VzcywgRExCICVzLCBFQ0MgJXMiLAorCQkJZGRyVHlwZSwgbXZDdHJsRERSQnVkV2lkdGgoKSwKIAkJCW12Q3RybEREUlRocnVYYmFyKCkgPyAiWEJBUiIgOiAiRmFzdFBhdGgiLAogCQkJbXZDdHJsSXNETEJFbmFibGVkKCkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiLAogCQkJbXZDdHJsRERSRUNDKCkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKQEAgLTExMzAsNiArMTE0NSw3IEBACiAjZW5kaWYKIAkvKiBpbml0IHRoZSB1bml0cyBkZWNvZGUgd2luZG93cyAqLwogCW1pc2NfaW5pdF9yX2RlY193aW4oKTsKKwltdl9wcmludF9tYXAoKTsKIAltZW1zZXQoKHZvaWQqKUNPTkZJR19TWVNfTE9BRF9BRERSLCAwLCBDT05GSUdfU1lTX01JTl9IRFJfREVMX1NJWkUpOwogCW12Qm9hcmREZWJ1Z0xlZCg2KTsKIApAQCAtMTE0OSwxMyArMTE2NSwyMCBAQAogCiAJc2V0ZW52KCJwY2llVHVuZSIsICJubyIpOwogCisKKwogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9VTk1fRVRIKSB8fCBkZWZpbmVkKE1WX0lOQ0xVREVfR0lHX0VUSCkKIAltdkJvYXJkRWdpZ2FQaHlJbml0KCk7CiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAlydGNfaW5pdCgpOyAvKiBFbnN1cmUgdGhlIGJ1cyBicmlkZ2UgcGFyYW1ldGVycyBhcmUgcmVhZHkgZm9yIFJUQyBhY2Nlc3MgKi8KICNlbmRpZgotCisjaWZkZWYgQ09ORklHX0NNRF9TT1VSQ0UKKwkvKiBydW4gc2F2ZWQgc2NyaXB0ICovCisJZW52ID0gZ2V0ZW52KCJydW5fc2NyaXB0Iik7CisJaWYgKGVudiAmJiBzdHJjbXAoZW52LCAieWVzIikgPT0gMCkKKwkJcnVuX2NvbW1hbmQoIm12c291cmNlIHJ1biIsIDApOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hbHAvYXZhbnRhX2xwX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmMgYi9ib2FyZC9tdl9lYnUvYWxwL2F2YW50YV9scF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5jCmluZGV4IDgyN2RiN2MuLmE0ZDAzMDcgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hbHAvYXZhbnRhX2xwX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2FscC9hdmFudGFfbHBfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuYwpAQCAtMTAzLDYgKzEwMywzMiBAQAogTVZfVTMyIGJvYXJkT3B0aW9uc0NvbmZpZ1tNVl9DT05GSUdfVFlQRV9NQVhfT1BUSU9OXTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZGlzVXNiUG9ydENvbm5lY3RlZAorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgcmV0dXJuIFRydWUgaWYgcmVxdWVzdGVkIFVTQiB0eXBlIGFuZCBwb3J0IG51bSBleGlzdHMgb24gY3VycmVudCBib2FyZAorKgorKiBJTlBVVDoKKyogICAgICAgdXNiVHlwZUlEICAgICAgIC0gcmVxdWVzdGVkIFVTQiB0eXBlIDogVVNCM19VTklUX0lEIC8gVVNCX1VOSVRfSUQKKyogICAgICAgdXNiUG9ydE51bWJkZXIgIC0gcmVxdWVzdGVkIFVTQiBwb3J0IG51bWJlciAoYWNjb3JkaW5nIHRvIHhIQ0kgTUFDIHBvcnQgbnVtKQorKgorKiBPVVRQVVQ6IE5vbmUKKyoKKyogUkVUVVJOOiBNVl9UUlVFIGlmIHJlcXVlc3RlZCBwb3J0L3R5cGUgZXhpc3Qgb24gYm9hcmQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0JPT0wgbXZCb2FyZElzVXNiUG9ydENvbm5lY3RlZChNVl9VTklUX0lEIHVzYlR5cGVJRCwgTVZfVTggdXNiUG9ydE51bWJlcikKK3sKKwkvKiBVU0IgUG9ydCBib2FyZCBtYXBwaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgQXZhbnRhLUxQCisJICBDb250cm9sbGVyIG1hcHBpbmcgaXMgZG9uZSB2aWEgbXZDdHJsVXNiTWFwR2V0LiovCisJaWYgKHVzYlBvcnROdW1iZXIgPj0gbXZDdHJsVXNiTWF4R2V0KCkpCisJCXJldHVybiBNVl9GQUxTRTsKKwlyZXR1cm4gTVZfVFJVRTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12Qm9hcmRJZEluZGV4R2V0CiAqCiAqIERFU0NSSVBUSU9OOgpAQCAtMTcwMiw2ICsxNzI4LDQxIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZAorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyByb3V0aW5lIHJldHVybnMgcG9ydCdzIGNvbm5lY3Rpb24gc3RhdHVzLCB0aGlzIHJvdXRlIHByb3ZpZGUgYSB1bmlmaWVkIGluZXJmYWNlCisqICAgICAgIGZvciBvdGhlciBtb2R1bGVzIHRvIGNhbGwgd2l0aG91dCBjYXJlIG9mIHRoZSBzd2l0Y2ggY29ubnRlY3Rpb24gbW9kZSAtIGV4dGVybmFsIG9yIGludGVybmFsCisqICAgICAgIGlmIHRoZSBzd2l0Y2ggaXMgY29ubmVjdGVkCisqCisqIElOUFVUOgorKiAgICAgICBldGhQb3J0TnVtIC0gRXRoZXJuZXQgcG9ydCBudW1iZXIuCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICAxIC0gaWYgZXRoUG9ydE51bSBpcyBjb25uZWN0ZWQgdG8gc3dpdGNoLCAwIG90aGVyd2lzZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQodm9pZCkKK3sKKwlyZXR1cm4gbXZCb2FyZElzSW50ZXJuYWxTd2l0Y2hDb25uZWN0ZWQoKTsKKworfQorCisvKiB0aGlzIHRlbXBvcmFyeSBmdW5jdGlvbnMgdG8gY29tcGlsZSBzd2l0Y2ggY29kZS4KKyAgIG12RXRoRTYxNzFTd2l0Y2hCYXNpY0luaXQgaXMgbm90IHVzZWQgYnkgYWxwIGNvZGUgKi8KK01WX0JPT0wgbXZCb2FyZFN3aXRjaENwdVBvcnRJc1JnbWlpKE1WX1UzMiBzd2l0Y2hJZHgpCit7CisJcmV0dXJuIE1WX0ZBTFNFOworfQorTVZfMzIgbXZCb2FyZFN3aXRjaFBoeUFkZHJHZXQoTVZfVTMyIHN3aXRjaElkeCkKK3sKKwlyZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12Qm9hcmRGcmVxTW9kZXNOdW1HZXQKICoKICogREVTQ1JJUFRJT046IFJldHVybiB0aGUgbnVtYmVyIG9mIHN1cHBvcnRlZCBmcmVxdWVuY3kgbW9kZXMgZm9yIHRoaXMgU29DCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYWxwL2F2YW50YV9scF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5oIGIvYm9hcmQvbXZfZWJ1L2FscC9hdmFudGFfbHBfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuaAppbmRleCBmMjE1NDczLi5mNjdjYTNkIDEwMDc1NQotLS0gYS9ib2FyZC9tdl9lYnUvYWxwL2F2YW50YV9scF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5oCisrKyBiL2JvYXJkL212X2VidS9hbHAvYXZhbnRhX2xwX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmgKQEAgLTYxMyw3ICs2MTMsMTAgQEAKIE1WX1U4IG12Qm9hcmRDcHVGcmVxR2V0KE1WX1ZPSUQpOwogTVZfU1RBVFVTIG12Qm9hcmRDcHVGcmVxU2V0KE1WX1U4IGZyZXFWYWwpOwogTVZfU1RBVFVTIG12Qm9hcmRJc0ludGVybmFsU3dpdGNoQ29ubmVjdGVkKHZvaWQpOworTVZfQk9PTCBtdkJvYXJkU3dpdGNoQ3B1UG9ydElzUmdtaWkoTVZfVTMyIHN3aXRjaElkeCk7CitNVl8zMiBtdkJvYXJkU3dpdGNoUGh5QWRkckdldChNVl9VMzIgc3dpdGNoSWR4KTsKIE1WX1UzMiBtdkJvYXJkU3dpdGNoUG9ydEZvcmNlTGlua0dldChNVl9VMzIgc3dpdGNoSWR4KTsKK01WX1NUQVRVUyBtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQodm9pZCk7CiBNVl9VMzIgbXZCb2FyZEZyZXFNb2Rlc051bUdldCh2b2lkKTsKIE1WXzMyIG12Qm9hcmRTbWlTY2FuTW9kZUdldChNVl9VMzIgc3dpdGNoSWR4KTsKIE1WX0JPQVJEX01BQ19TUEVFRCBtdkJvYXJkTWFjU3BlZWRHZXQoTVZfVTMyIGV0aFBvcnROdW0pOwpAQCAtNjM4LDYgKzY0MSw3IEBACiBNVl9ORkNfRUNDX01PREUgbXZCb2FyZE5hbmRFQ0NNb2RlR2V0KHZvaWQpOwogTVZfU1RBVFVTIG12Qm9hcmRFZXByb21Xcml0ZURlZmF1bHRDZmcodm9pZCk7CiBNVl9OQU5EX0lGX01PREUgbXZCb2FyZE5hbmRJZkdldCh2b2lkKTsKK01WX0JPT0wgbXZCb2FyZElzVXNiUG9ydENvbm5lY3RlZChNVl9VTklUX0lEIHVzYlR5cGVJRCwgTVZfVTggdXNiUG9ydE51bWJlcik7CiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hbHAvYXZhbnRhX2xwX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jIGIvYm9hcmQvbXZfZWJ1L2FscC9hdmFudGFfbHBfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmMKaW5kZXggZjBhOWYxYy4uNTgxZGEzOCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2FscC9hdmFudGFfbHBfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2FscC9hdmFudGFfbHBfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmMKQEAgLTIxNyw2ICsyMTcsMjggQEAKIAogCXJldHVybiBNVl9FUlJPUjsKIH0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZDdHJsSXNVc2JTZXJEZXNDb25uZWN0ZWQKKyoKKyogREVTQ1JJUFRJT046Y2hlY2sgaWYgU2VyRGVzIGxhbmUgaXMgY29ubmVjdGVkIHRvIFVTQjMgaG9zdC4KKyoKKyoKKyogSU5QVVQ6IE5vbmUKKyoKKyogT1VUUFVUOiBOb25lCisqCisqIFJFVFVSTjpyZXR1cm4gdHJ1ZSBpZiBTZXJEZXMgbGFuZSBpcyBjb25uZWN0ZWQgdG8gVVNCMyBob3N0LCBmYWxzZSBvdGhlcndpc2UuCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBtdkN0cmxJc1VzYlNlckRlc0Nvbm5lY3RlZChNVl9VMzIgdXNiUG9ydCkKK3sKKwlpbnQgdXNiM0hvc3ROdW0gPSBtdkN0cmxVc2IzSG9zdE1heEdldCgpOworCWludCBtYXhTZXJEZXNMYW5lcyA9IG12Q3RybFVzYjNNYXhHZXQoKTsKKwlpZiAodXNiUG9ydCA+PSBtYXhTZXJEZXNMYW5lcyAmJiB1c2IzSG9zdE51bSA+IG1heFNlckRlc0xhbmVzKQorCQlyZXR1cm4gTVZfRkFMU0U7CisJcmV0dXJuIE1WX1RSVUU7Cit9CiAKICNpZmRlZiBNVl9JTkNMVURFX1BFWAogTVZfU1RBVFVTIG12Q3RybFVwZGF0ZVBleElkKE1WX1ZPSUQpCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYWxwL2F2YW50YV9scF9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuaCBiL2JvYXJkL212X2VidS9hbHAvYXZhbnRhX2xwX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oCmluZGV4IDEwNzg0Y2QuLmEyZDUxZjEgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hbHAvYXZhbnRhX2xwX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oCisrKyBiL2JvYXJkL212X2VidS9hbHAvYXZhbnRhX2xwX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oCkBAIC0yNjUsNiArMjY1LDcgQEAKIE1WX1NUQVRVUyBtdkN0cmxTYXRSV3JpdGUoTVZfU0FUUl9UWVBFX0lEIHNhdHJSZWFkRmllbGQsIE1WX1U4IHZhbCwgTVZfQk9PTCByZXN0b3JlRGVmYXVsdCk7CiBNVl9TVEFUVVMgbXZDdHJsU2F0UlJlYWQoTVZfU0FUUl9UWVBFX0lEIHNhdHJGaWVsZCwgTVZfVTMyICp2YWx1ZSk7CiBNVl9TVEFUVVMgbXZDdHJsQ3B1RGRyTDJGcmVxR2V0KE1WX0ZSRVFfTU9ERSAqZnJlcU1vZGUpOworTVZfQk9PTCBtdkN0cmxJc1VzYlNlckRlc0Nvbm5lY3RlZChNVl9VMzIgdXNiUG9ydCk7CiBNVl9WT0lEIG12Q3RybFNhdHJJbml0KE1WX1ZPSUQpOwogTVZfVTMyIG12Q3RybEdldENwdU51bShNVl9WT0lEKTsKIE1WX0JPT0wgbXZDdHJsSXNTc2NnRW5hYmxlZChNVl9WT0lEKTsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hbHAvbXZfbWFpbl9hbHAuYyBiL2JvYXJkL212X2VidS9hbHAvbXZfbWFpbl9hbHAuYwppbmRleCA3ZTg2MzIwLi4zMjA5NjlhIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYWxwL212X21haW5fYWxwLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2FscC9tdl9tYWluX2FscC5jCkBAIC0zMDIsNyArMzAyLDYgQEAKIAkJCSoodW5zaWduZWQgaW50KikoQ09ORklHX1NZU19URVhUX0JBU0UgKyBpKTsKIAogCW12Qm9hcmREZWJ1Z0xlZCg0KTsKLQltdl9wcmludF9tYXAoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzE5LDcgKzMxOCw3IEBACiAJZW52ID0gZ2V0ZW52KCJtdGRpZHMiKTsKIAlpZiAoIWVudikgewogI2lmIGRlZmluZWQoTVZfTkFORCkgJiYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKLQkJc2V0ZW52KCJtdGRpZHMiLCAibmFuZDA9YXJtYWRhLW5hbmQ7c3BpMD1zcGlfZmxhc2giKTsKKwkJc2V0ZW52KCJtdGRpZHMiLCAibmFuZDA9YXJtYWRhLW5hbmQsc3BpMD1zcGlfZmxhc2giKTsKICNlbGlmIGRlZmluZWQoTVZfTkFORCkKIAkJc2V0ZW52KCJtdGRpZHMiLCAibmFuZDA9YXJtYWRhLW5hbmQiKTsKICNlbGlmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCkBAIC00OTUsNiArNDk0LDEyIEBACiAJaWYgKCFlbnYpCiAJCXNldGVudigiaW5pdHJkX25hbWUiLCAidUluaXRyZCIpOwogCisjaWZkZWYgQ09ORklHX0NNRF9TT1VSQ0UKKwllbnYgPSBnZXRlbnYoInJ1bl9zY3JpcHQiKTsKKwlpZiAoIWVudikKKwkJc2V0ZW52KCJydW5fc2NyaXB0IiwgIm5vIik7CisjZW5kaWYKKwogCS8qIG5ldGJzZCBib290IGFyZ3VtZW50cyAqLwogCWVudiA9IGdldGVudigibmV0YnNkX2VuIik7CiAJaWYgKCAhZW52IHx8ICggKChzdHJjbXAoZW52LCAibm8iKSA9PSAwKSB8fCAoc3RyY21wKGVudiwgIk5vIikgPT0gMCkgKSkpCkBAIC0xMDQ1LDYgKzEwNTAsNyBAQAogI2lmICFkZWZpbmVkKENPTkZJR19NQUNIX0FWQU5UQV9MUF9GUEdBKQogCS8qIGluaXQgdGhlIHVuaXRzIGRlY29kZSB3aW5kb3dzICovCiAJbWlzY19pbml0X3JfZGVjX3dpbigpOworCW12X3ByaW50X21hcCgpOwogCW1lbXNldCgodm9pZCopQ09ORklHX1NZU19MT0FEX0FERFIsIDAsIENPTkZJR19TWVNfTUlOX0hEUl9ERUxfU0laRSk7CiAJbXZCb2FyZERlYnVnTGVkKDYpOwogCkBAIC0xMDY5LDcgKzEwNzUsMTIgQEAKIAltdkJvYXJkRWdpZ2FQaHlJbml0KCk7CiAjZW5kaWYKICNlbmRpZgotCisjaWZkZWYgQ09ORklHX0NNRF9TT1VSQ0UKKwkvKiBydW4gc2F2ZWQgc2NyaXB0ICovCisJZW52ID0gZ2V0ZW52KCJydW5fc2NyaXB0Iik7CisJaWYgKGVudiAmJiBzdHJjbXAoZW52LCAieWVzIikgPT0gMCkKKwkJcnVuX2NvbW1hbmQoIm12c291cmNlIHJ1biIsIDApOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vTWFrZWZpbGUgYi9ib2FyZC9tdl9lYnUvY29tbW9uL01ha2VmaWxlCmluZGV4IDljNDZiZjAuLjRmNjg5NjkgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vTWFrZWZpbGUKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9NYWtlZmlsZQpAQCAtMTcsNiArMTcsNyBAQAogTUFLRV9QUFYyID0geWVzCiBNQUtFX0dFTkVSQUxfVV9CT09UX1RPT0xTID0geWVzCiBNQUtFX1NQSV9OQU5EID0geWVzCitNQUtFX1NXSVRDSCA9IHllcwogZW5kaWYKIAogaWZlcSAoJChCT0FSRCksYTM3NSkKQEAgLTMzLDYgKzM0LDEwIEBACiBNQUtFX0dFTkVSQUxfVV9CT09UX1RPT0xTID0geWVzCiBNQUtFX1NQSV9OQU5EID0geWVzCiBNQUtFX1JUQzIgPSB5ZXMKK2lmZGVmIENPTkZJR19BUk1BREFfMzhYCitNQUtFX1NXSVRDSF9TRVJWSUNFUyA9IHllcworZW5kaWYKK01BS0VfU1dJVENIID0geWVzCiBlbmRpZgogCiBpZmVxICgkKEJPQVJEKSxtc3lzKQpAQCAtOTksNiArMTA0LDcgQEAKIAkJJChVU1BfRElSKS9tdl9jbWQubwkJXAogCQkkKFVTUF9ESVIpL212X2RyYW0ubwkJXAogCQkkKFVTUF9ESVIpL2NtZF9idWJ0Lm8JCVwKKwkJJChVU1BfRElSKS9jbWRfbXZzb3VyY2UubwlcCiAJCSQoVVNQX0RJUikvY21kX3Jlc2V0ZW52Lm8JXAogCQkkKFVTUF9ESVIpL212RHJhbVNjcnViYmluZy5vCVwKIAkJJChVU1BfRElSKS9jbWRfZGRyLm8JCVwKQEAgLTExOSwxMiArMTI1LDEzIEBACiAJCSQoSEFMX1BQMl9DTFNfRElSKS9tdlBwMkNsYXNzaWZpZXIubwlcCiAJCSQoSEFMX1BQMl9DT01NT05fRElSKS9tdlBwMkNvbW1vbi5vCVwKIAkJJChVU1BfRElSKS9tdl9lZ2lnYV9wcDIubwotCi1VU1BfT0JKUyArPQkkKFVTUF9FVEhfU1dJVENIX0RJUikvbXZTd2l0Y2gubwogZW5kaWYKIAogaWZkZWYgTUFLRV9TV0lUQ0hfU0VSVklDRVMKLVVTUF9PQkpTICs9ICAgICAkKFVTUF9ESVIpL3N3aXRjaGluZ1NlcnZpY2VzL3N3aXRjaGluZ1NlcnZpY2VzLm8KK1VTUF9PQkpTICs9CSQoVVNQX0RJUikvc3dpdGNoaW5nU2VydmljZXMvc3dpdGNoaW5nU2VydmljZXMubworaWZlcSAoJChCT0FSRCksYTM4eCkKK1VTUF9PQkpTICs9CSQoVVNQX0RJUikvc3dpdGNoaW5nU2VydmljZXMvc2FyX2JjMi5vCitlbmRpZgogZW5kaWYKIAogaWZkZWYgTUFLRV9ORVRBCkBAIC0xMzUsNiArMTQyLDkgQEAKIAkJJChVU1BfRElSKS9tdl9lZ2lnYV9uZXRhLm8KIGVuZGlmCiAKK2lmZGVmIE1BS0VfU1dJVENICitVU1BfT0JKUyArPQkkKFVTUF9FVEhfU1dJVENIX0RJUikvbXZTd2l0Y2gubworZW5kaWYKIAogaWZkZWYgTUFLRV9VU0IKIEhBTF9JRl9PQkpTICs9IAkkKEhBTF9JRl9ESVIpL212U3lzVXNiLm8KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL2NtZF9idWJ0LmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9jbWRfYnVidC5jCmluZGV4IDYzODUyYWQuLjZmNzZiZjEgMTAwNzU1Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL2NtZF9idWJ0LmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvY21kX2J1YnQuYwpAQCAtMzEsNiArMzEsOCBAQAogCiAjaW5jbHVkZSA8ZnMuaD4KIAorI2RlZmluZQlERVNUSU5BVElPTl9TVFJJTkcJMTAKKwogI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2luY2x1ZGUgPG5hbmQuaD4KIGV4dGVybiBuYW5kX2luZm9fdCBuYW5kX2luZm9bXTsgICAgICAgLyogaW5mbyBmb3IgTkFORCBjaGlwcyAqLwpAQCAtMTMxLDExICsxMzMsMTMgQEAKIC8qCiAgKiBFeHRyYWN0IGFyZ3VtZW50cyBmcm9tIGJ1YnQgY29tbWFuZCBsaW5lCiAgKiBhcmdjLCBhcmd2IGFyZSB0aGUgaW5wdXQgYXJndW1lbnRzIG9mIGJ1YnQgY29tbWFuZCBsaW5lCi0gKiBsb2FkZnJvbSBpcyBwb2ludGVyIHRvIHRoZSBleHRyYWN0ZWQgYXJndW1lbnQ6IGZyb20gd2hlcmUgdG8gbG9hZCB0aGUgdS1ib290IGJpbiBmaWxlCisgKiBsb2FkZnJvbSBpcyBhIHBvaW50ZXIgdG8gdGhlIGV4dHJhY3RlZCBhcmd1bWVudDogZnJvbSB3aGVyZSB0byBsb2FkIHRoZSB1LWJvb3QgYmluIGZpbGUKKyAqIGRlc3RpbmF0aW9uX2J1cm4gaXMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIHdoaWNoIGRlbm90ZXMgdGhlIGJ1YnQgaW50ZXJmYWNlIAogICovCi1NVl9TVEFUVVMgZmV0Y2hfYnVidF9jbWRfYXJncyhpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSwgTVZfVTMyICpsb2FkZnJvbSkKK01WX1NUQVRVUyBmZXRjaF9idWJ0X2NtZF9hcmdzKGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdLCBpbnQgKmxvYWRmcm9tLCBjaGFyICpkZXN0aW5hdGlvbl9idXJuKQogewogCSpsb2FkZnJvbSA9IDA7CisJc3RyY3B5KGRlc3RpbmF0aW9uX2J1cm4sImRlZmF1bHQiKTsKIAkvKiBidWJ0ICovCiAJaWYgKGFyZ2MgPCAyKSB7CiAJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCAidS1ib290LmJpbiIsIHNpemVvZihCb290RmlsZSkpOwpAQCAtMTQ2LDYgKzE1MCw3IEBACiAJCWlmICgoMCA9PSBzdHJjbXAoYXJndlsxXSwgInNwaSIpKSB8fCAoMCA9PSBzdHJjbXAoYXJndlsxXSwgIm5hbmQiKSkKIAkJCQl8fCAoMCA9PSBzdHJjbXAoYXJndlsxXSwgIm5vciIpKSkKIAkJeworCQkJc3RyY3B5KGRlc3RpbmF0aW9uX2J1cm4sIGFyZ3ZbMV0pOwogCQkJY29weV9maWxlbmFtZSAoQm9vdEZpbGUsICJ1LWJvb3QuYmluIiwgc2l6ZW9mKEJvb3RGaWxlKSk7CiAJCQlwcmludGYoIlVzaW5nIGRlZmF1bHQgZmlsZW5hbWUgXCJ1LWJvb3QuYmluXCIgXG4iKTsKIAkJfQpAQCAtMTU5LDYgKzE2NCw3IEBACiAJCWlmICgoMCA9PSBzdHJjbXAoYXJndlsxXSwgInNwaSIpKSB8fCAoMCA9PSBzdHJjbXAoYXJndlsxXSwgIm5hbmQiKSkKIAkJCQl8fCAoMCA9PSBzdHJjbXAoYXJndlsxXSwgIm5vciIpKSkKIAkJeworCQkJc3RyY3B5KGRlc3RpbmF0aW9uX2J1cm4sIGFyZ3ZbMV0pOwogCQkJY29weV9maWxlbmFtZSAoQm9vdEZpbGUsICJ1LWJvb3QuYmluIiwgc2l6ZW9mKEJvb3RGaWxlKSk7CiAJCQlwcmludGYoIlVzaW5nIGRlZmF1bHQgZmlsZW5hbWUgXCJ1LWJvb3QuYmluXCIgXG4iKTsKIApAQCAtMTc0LDEyICsxODAsMTYgQEAKIAkJfQogCQllbHNlCiAJCXsKKwkJCXN0cmNweShkZXN0aW5hdGlvbl9idXJuLCBhcmd2WzJdKTsKKwogCQkJY29weV9maWxlbmFtZSAoQm9vdEZpbGUsIGFyZ3ZbMV0sIHNpemVvZihCb290RmlsZSkpOwogCQl9CiAJfQogCS8qICJidWJ0IGZpbGVuYW1lIGRlc3RpbmF0aW9uIHNvdXJjZSIgKi8KIAllbHNlCiAJeworCQlzdHJjcHkoZGVzdGluYXRpb25fYnVybiwgYXJndlsyXSk7CisKIAkJY29weV9maWxlbmFtZSAoQm9vdEZpbGUsIGFyZ3ZbMV0sIHNpemVvZihCb290RmlsZSkpOwogCiAJCWlmICgwID09IHN0cmNtcCgidXNiIiwgYXJndlszXSkpIHsKQEAgLTIzMCwyMCArMjQwLDE5IEBACiAJcmV0dXJuIGZpbGVzaXplOwogfQogCi0jaWYgZGVmaW5lZChNVl9OQU5EX0JPT1QpCisjaWYgZGVmaW5lZChNVl9OQU5EX0JPT1QpIHx8IGRlZmluZWQoTVZfTkFORCkKIC8qIEJvb3QgZnJvbSBOQU5EIGZsYXNoICovCiAvKiBXcml0ZSB1LWJvb3QgaW1hZ2UgaW50byB0aGUgbmFuZCBmbGFzaCAqLwotaW50IG5hbmRfYnVybl91Ym9vdF9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoraW50IG5hbmRfYnVybl91Ym9vdF9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBsb2FkZnJvbSwgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCiB7CiAJaW50IGZpbGVzaXplID0gMDsKIAlNVl9VMzIgcmV0ID0gMDsKIAlleHRlcm4gY2hhciBjb25zb2xlX2J1ZmZlcltdOwogCW5hbmRfaW5mb190ICpuYW5kID0gJm5hbmRfaW5mb1swXTsKIAlzaXplX3QgYmxvY2tzaXplID0gbmFuZF9pbmZvWzBdLmVyYXNlc2l6ZTsKLQlzaXplX3QgZW52X29mZnNldCA9IENPTkZJR19FTlZfT0ZGU0VUOworCXNpemVfdCBlbnZfb2Zmc2V0ID0gQ09ORklHX0VOVl9PRkZTRVRfTkFORDsKIAlzaXplX3Qgc2l6ZSA9IENPTkZJR19VQk9PVF9TSVpFOwogCXNpemVfdCBvZmZzZXQgPSAwOwotCU1WX1UzMiBsb2FkZnJvbSA9IDA7IC8qIDAgLSBmcm9tIHRmdHAsIDEgLSBmcm9tIFVTQiAqLwogCiAJLyogQWxpZ24gVS1Cb290IHNpemUgdG8gY3VycmVudGx5IHVzZWQgYmxvY2tzaXplICovCiAJc2l6ZSA9ICgoc2l6ZSArIChibG9ja3NpemUgLSAxKSkgJiAofihibG9ja3NpemUtMSkpKTsKQEAgLTI2Nyw5ICsyNzYsNiBAQAogI2VuZGlmCiAKIAkvKiB2ZXJpZnkgcmVxdWVzdGVkIHNvdXJjZSBpcyB2YWxpZCAqLwotCWlmIChmZXRjaF9idWJ0X2NtZF9hcmdzKGFyZ2MsIGFyZ3YsICZsb2FkZnJvbSkgIT0gTVZfT0spCi0JCXJldHVybiAwOwotCiAJaWYgKChmaWxlc2l6ZSA9IGZldGNoX3Vib290X2ZpbGUgKGxvYWRmcm9tKSkgPD0gMCkKIAkJcmV0dXJuIDA7CiAKQEAgLTI4NCw4ICsyOTAsOCBAQAogCSAgICBzdHJjbXAoY29uc29sZV9idWZmZXIsInllcyIpID09IDAgfHwKIAkgICAgc3RyY21wKGNvbnNvbGVfYnVmZmVyLCJ5IikgPT0gMCApIHsKIAotCQlwcmludGYoIkVyYXNpbmcgMHgleCAtIDB4JXg6IixlbnZfb2Zmc2V0LCBlbnZfb2Zmc2V0ICsgQ09ORklHX0VOVl9SQU5HRSk7Ci0JCW5hbmRfZXJhc2UobmFuZCwgZW52X29mZnNldCwgQ09ORklHX0VOVl9SQU5HRSk7CisJCXByaW50ZigiRXJhc2luZyAweCV4IC0gMHgleDoiLGVudl9vZmZzZXQsIGVudl9vZmZzZXQgKyBDT05GSUdfRU5WX1JBTkdFX05BTkQpOworCQluYW5kX2VyYXNlKG5hbmQsIGVudl9vZmZzZXQsIENPTkZJR19FTlZfUkFOR0VfTkFORCk7CiAJCXByaW50ZigiXHRbRG9uZV1cbiIpOwogCX0KIApAQCAtMzAzLDI3ICszMDksMTggQEAKIAlyZXR1cm4gMTsKIH0KIAotVV9CT09UX0NNRCgKLQkJYnVidCwgICAgICA0LCAgICAgMSwgICAgICBuYW5kX2J1cm5fdWJvb3RfY21kLAotCQkiYnVidAktIEJ1cm4gYW4gaW1hZ2Ugb24gdGhlIEJvb3QgTmFuZCBGbGFzaC5cbiIsCi0JCSJbZmlsZS1uYW1lXSBbZGVzdGluYXRpb24gW3NvdXJjZV1dIFxuIgotCQkiXHRCdXJuIGEgYmluYXJ5IGltYWdlIG9uIHRoZSBCb290IEZsYXNoLCBkZWZhdWx0IGZpbGUtbmFtZSBpcyB1LWJvb3QuYmluIC5cbiIKLQkJIlx0ZGVzdGluYXRpb24gaXMgbmFuZCwgc3BpIG9yIG5vci5cbiIKLQkJIlx0c291cmNlIGNhbiBiZSB0ZnRwIG9yIHVzYiwgZGVmYXVsdCBpcyB0ZnRwLlxuIgotKTsKICNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19OQU5EX0JPT1QpICovCiAKLSNpZiBkZWZpbmVkKE1WX1NQSV9CT09UKQorI2lmIGRlZmluZWQoTVZfU1BJX0JPT1QpIHx8IGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCiAKIC8qIEJvb3QgZnJvbSBTUEkgZmxhc2ggKi8KIC8qIFdyaXRlIHUtYm9vdCBpbWFnZSBpbnRvIHRoZSBTUEkgZmxhc2ggKi8KLWludCBzcGlfYnVybl91Ym9vdF9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoraW50IHNwaV9idXJuX3Vib290X2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGxvYWRmcm9tLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKIHsKIAlpbnQgZmlsZXNpemUgPSAwOwogCU1WX1UzMiByZXQgPSAwOwogCWV4dGVybiBjaGFyIGNvbnNvbGVfYnVmZmVyW107CiAJbG9hZF9hZGRyID0gQ09ORklHX1NZU19MT0FEX0FERFI7Ci0JTVZfVTMyIGxvYWRmcm9tID0gMDsgLyogMCAtIGZyb20gdGZ0cCwgMSAtIGZyb20gVVNCICovCiAKIAlpZighZmxhc2gpIHsKIAkJZmxhc2ggPSBzcGlfZmxhc2hfcHJvYmUoQ09ORklHX0VOVl9TUElfQlVTLCBDT05GSUdfRU5WX1NQSV9DUywKQEAgLTMzNiw5ICszMzMsNiBAQAogCX0KIAogCS8qIHZlcmlmeSByZXF1ZXN0ZWQgc291cmNlIGlzIHZhbGlkICovCi0JaWYgKGZldGNoX2J1YnRfY21kX2FyZ3MoYXJnYywgYXJndiwgJmxvYWRmcm9tKSAhPSBNVl9PSykKLQkJcmV0dXJuIDA7Ci0KIAlpZiAoKGZpbGVzaXplID0gZmV0Y2hfdWJvb3RfZmlsZSAobG9hZGZyb20pKSA8PSAwKQogCQlyZXR1cm4gMDsKIApAQCAtMzU1LDE3ICszNDksMTcgQEAKIAkgICAgc3RyY21wKGNvbnNvbGVfYnVmZmVyLCJ5ZXMiKSA9PSAwIHx8CiAJICAgIHN0cmNtcChjb25zb2xlX2J1ZmZlciwieSIpID09IDAgKSB7CiAKLQkJcHJpbnRmKCJFcmFzaW5nIDB4JXggLSAweCV4OiIsQ09ORklHX0VOVl9PRkZTRVQsIENPTkZJR19FTlZfT0ZGU0VUICsgQ09ORklHX0VOVl9TSVpFKTsKLQkJc3BpX2ZsYXNoX2VyYXNlKGZsYXNoLCBDT05GSUdfRU5WX09GRlNFVCwgQ09ORklHX0VOVl9TSVpFKTsKKwkJcHJpbnRmKCJFcmFzaW5nIDB4JXggLSAweCV4OiIsQ09ORklHX0VOVl9PRkZTRVRfU1BJLCBDT05GSUdfRU5WX09GRlNFVF9TUEkgKyBDT05GSUdfRU5WX1NJWkVfU1BJKTsKKwkJc3BpX2ZsYXNoX2VyYXNlKGZsYXNoLCBDT05GSUdfRU5WX09GRlNFVF9TUEksIENPTkZJR19FTlZfU0laRV9TUEkpOwogCQlwcmludGYoIlx0W0RvbmVdXG4iKTsKIAl9Ci0JaWYgKGZpbGVzaXplID4gQ09ORklHX0VOVl9PRkZTRVQpCisJaWYgKGZpbGVzaXplID4gQ09ORklHX0VOVl9PRkZTRVRfU1BJKQogCXsKIAkJcHJpbnRmKCJFcnJvcjogSW1hZ2Ugc2l6ZSAoJXgpIGV4Y2VlZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9mZnNldCAoJXgpLiAiLGZpbGVzaXplLENPTkZJR19FTlZfT0ZGU0VUKTsKIAkJcmV0dXJuIDA7CiAJfQotCXByaW50ZigiRXJhc2luZyAweCV4IC0gMHgleDogIiwwLCAwICsgQ09ORklHX0VOVl9PRkZTRVQpOwotCXNwaV9mbGFzaF9lcmFzZShmbGFzaCwgMCwgQ09ORklHX0VOVl9PRkZTRVQpOworCXByaW50ZigiRXJhc2luZyAweCV4IC0gMHgleDogIiwwLCAwICsgQ09ORklHX0VOVl9PRkZTRVRfU1BJKTsKKwlzcGlfZmxhc2hfZXJhc2UoZmxhc2gsIDAsIENPTkZJR19FTlZfT0ZGU0VUX1NQSSk7CiAJcHJpbnRmKCJcdFx0W0RvbmVdXG4iKTsKIAogCXByaW50ZigiV3JpdGluZyBpbWFnZSB0byBmbGFzaDoiKTsKQEAgLTM4NCwyMiArMzc4LDEzIEBACiAJcmV0dXJuIDE7CiB9CiAKLVVfQk9PVF9DTUQoCi0JCWJ1YnQsICAgICAgNCwgICAgIDEsICAgICAgc3BpX2J1cm5fdWJvb3RfY21kLAotCQkiYnVidAktIEJ1cm4gYW4gaW1hZ2Ugb24gdGhlIEJvb3QgU1BJIEZsYXNoLlxuIiwKLQkJIiBmaWxlLW5hbWUgXG4iCi0JCSJbZmlsZS1uYW1lXSBbZGVzdGluYXRpb24gW3NvdXJjZV1dIFxuIgotCQkiXHRCdXJuIGEgYmluYXJ5IGltYWdlIG9uIHRoZSBCb290IEZsYXNoLCBkZWZhdWx0IGZpbGUtbmFtZSBpcyB1LWJvb3QuYmluIC5cbiIKLQkJIlx0ZGVzdGluYXRpb24gaXMgbmFuZCwgc3BpIG9yIG5vci5cbiIKLQkJIlx0c291cmNlIGNhbiBiZSB0ZnRwIG9yIHVzYiwgZGVmYXVsdCBpcyB0ZnRwLlxuIgotKTsKICNlbmRpZgogCiAKLSNpZiBkZWZpbmVkKE1WX05PUl9CT09UKQorI2lmIGRlZmluZWQoTVZfTk9SX0JPT1QpIHx8IChNVl9JTkNMVURFX05PUikKIAogLyogQm9vdCBmcm9tIE5vciBmbGFzaCAqLwotaW50IG5vcl9idXJuX3Vib290X2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCitpbnQgbm9yX2J1cm5fdWJvb3RfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgbG9hZGZyb20sIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQogewogCWludCBmaWxlc2l6ZSA9IDA7CiAJTVZfVTMyIHJldCA9IDA7CkBAIC00MTQsMTIgKzM5OSw4IEBACiAvLwlzX2VuZCA9IGZsYXNoX2luX3doaWNoX3NlYygmZmxhc2hfaW5mb1swXSwgQ09ORklHX1NZU19NT05JVE9SX0JBU0UgKyBDT05GSUdfU1lTX01PTklUT1JfTEVOIC0xKTsKIC8vCWVudl9zZWMgPSBmbGFzaF9pbl93aGljaF9zZWMoJmZsYXNoX2luZm9bMF0sIENPTkZJR19FTlZfQUREUik7CiAKLQlNVl9VMzIgbG9hZGZyb20gPSAwOyAvKiAwIC0gZnJvbSB0ZnRwLCAxIC0gZnJvbSBVU0IgKi8KIAogCS8qIHZlcmlmeSByZXF1ZXN0ZWQgc291cmNlIGlzIHZhbGlkICovCi0JaWYgKGZldGNoX2J1YnRfY21kX2FyZ3MoYXJnYywgYXJndiwgJmxvYWRmcm9tKSAhPSBNVl9PSykKLQkJcmV0dXJuIDA7Ci0KIAlpZiAoKGZpbGVzaXplID0gZmV0Y2hfdWJvb3RfZmlsZSAobG9hZGZyb20pKSA8PSAwKQogCQlyZXR1cm4gMDsKIApAQCAtNDYzLDI3ICs0NDQsMTcgQEAKIAlyZXR1cm4gMTsKIH0KIAotVV9CT09UX0NNRCgKLQkJYnVidCwgICAgICA0LCAgICAgMSwgICAgICBub3JfYnVybl91Ym9vdF9jbWQsCi0JCSJidWJ0CS0gQnVybiBhbiBpbWFnZSBvbiB0aGUgQm9vdCBGbGFzaC5cbiIsCi0JCSIgZmlsZS1uYW1lIFxuIgotCQkiW2ZpbGUtbmFtZV0gW2Rlc3RpbmF0aW9uIFtzb3VyY2VdXSBcbiIKLQkJIlx0QnVybiBhIGJpbmFyeSBpbWFnZSBvbiB0aGUgQm9vdCBGbGFzaCwgZGVmYXVsdCBmaWxlLW5hbWUgaXMgdS1ib290LmJpbiAuXG4iCi0JCSJcdGRlc3RpbmF0aW9uIGlzIG5hbmQsIHNwaSBvciBub3IuXG4iCi0JCSJcdHNvdXJjZSBjYW4gYmUgdGZ0cCBvciB1c2IsIGRlZmF1bHQgaXMgdGZ0cC5cbiIKLSk7CiAjZW5kaWYgLyogTVZfTk9SX0JPT1QgKi8KIAogI2lmIGRlZmluZWQoTVZfTU1DX0JPT1QpCiAKIC8qIEJvb3QgZnJvbSBTRC9NTUMvZU1NQyAqLwogLyogV3JpdGUgdS1ib290IGltYWdlIGludG8gU0QvTU1DL2VNTUMgZGV2aWNlICovCi1pbnQgbW1jX2J1cm5fdWJvb3RfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK2ludCBtbWNfYnVybl91Ym9vdF9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBsb2FkZnJvbSwgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCiB7CiAJaW50IGZpbGVzaXplID0gMDsKIAlleHRlcm4gY2hhciBjb25zb2xlX2J1ZmZlcltdOwogCWxvYWRfYWRkciA9IENPTkZJR19TWVNfTE9BRF9BRERSOwotCU1WX1UzMiBsb2FkZnJvbSA9IDA7IC8qIDAgLSBmcm9tIHRmdHAsIDEgLSBmcm9tIFVTQiAqLwogCWxiYWludF90CXN0YXJ0X2xiYTsKIAlsYmFpbnRfdAlibGtfY291bnQ7CiAJdWxvbmcJCWJsa193cml0dGVuOwpAQCAtNTE0LDkgKzQ4NSw2IEBACiAjZW5kaWYKIAogCS8qIHZlcmlmeSByZXF1ZXN0ZWQgc291cmNlIGlzIHZhbGlkICovCi0JaWYgKGZldGNoX2J1YnRfY21kX2FyZ3MoYXJnYywgYXJndiwgJmxvYWRmcm9tKSAhPSBNVl9PSykKLQkJcmV0dXJuIDA7Ci0KIAlpZiAoKGZpbGVzaXplID0gZmV0Y2hfdWJvb3RfZmlsZSAobG9hZGZyb20pKSA8PSAwKQogCQlyZXR1cm4gMDsKIApAQCAtNTY1LDEyICs1MzMsNzYgQEAKIAlyZXR1cm4gMTsKIH0KIAorI2VuZGlmCisKK2ludCBidXJuX3Vib290X2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCit7CisJY2hhcglkZXN0aW5hdGlvbl9idXJuW0RFU1RJTkFUSU9OX1NUUklOR107CisJaW50CWxvYWRmcm9tID0gMDsgLyogMCAtIGZyb20gdGZ0cCwgMSAtIGZyb20gVVNCICovCisKKwltZW1zZXQoZGVzdGluYXRpb25fYnVybiwgJ1wwJywgc2l6ZW9mKGRlc3RpbmF0aW9uX2J1cm4pKTsKKworCWlmKGZldGNoX2J1YnRfY21kX2FyZ3MoYXJnYywgYXJndiwgJmxvYWRmcm9tLGRlc3RpbmF0aW9uX2J1cm4pICE9IE1WX09LKQorCQlyZXR1cm4gMDsKKworI2lmIGRlZmluZWQoTVZfQ1JPU1NfRkxBU0hfQk9PVCkKKwlpZiAoMCA9PSBzdHJjbXAoZGVzdGluYXRpb25fYnVybiwgIm5hbmQiKSkgeworI2lmIGRlZmluZWQoTVZfTkFORCkgfHwgZGVmaW5lZChNVl9OQU5EX0JPT1QpCisJCXJldHVybiBuYW5kX2J1cm5fdWJvb3RfY21kKGNtZHRwLCBmbGFnLCBsb2FkZnJvbSwgYXJnYywgYXJndik7CisjZW5kaWYKKwkJcHJpbnRmKCJcdFtGQUlMXSAtIHUtYm9vdCBkb2VzIG5vdCBzdXBwb3J0IGEgd3JpdGUgdG8gJXMgaW50ZXJmYWNlLlxuIixkZXN0aW5hdGlvbl9idXJuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKDAgPT0gc3RyY21wKGRlc3RpbmF0aW9uX2J1cm4sICJzcGkiKSkgeworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpIHx8IGRlZmluZWQgKE1WX1NQSV9CT09UKQorCQlyZXR1cm4gc3BpX2J1cm5fdWJvb3RfY21kKGNtZHRwLCBmbGFnLCBsb2FkZnJvbSwgYXJnYywgYXJndik7CisjZW5kaWYKKwkJcHJpbnRmKCJcdFtGQUlMXSAtIHUtYm9vdCBkb2VzIG5vdCBzdXBwb3J0IGEgd3JpdGUgdG8gJXMgaW50ZXJmYWNlLlxuIixkZXN0aW5hdGlvbl9idXJuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKDAgPT0gc3RyY21wKGRlc3RpbmF0aW9uX2J1cm4sICJub3IiKSkgeworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpIHx8IGRlZmluZWQgKE1WX05PUl9CT09UKQorCQlyZXR1cm4gbm9yX2J1cm5fdWJvb3RfY21kKGNtZHRwLCBmbGFnLCBsb2FkZnJvbSwgYXJnYywgYXJndik7CisjZW5kaWYKKwkJcHJpbnRmKCJcdFtGQUlMXSAtIHUtYm9vdCBkb2VzIG5vdCBzdXBwb3J0IGEgd3JpdGUgdG8gJXMgaW50ZXJmYWNlLlxuIixkZXN0aW5hdGlvbl9idXJuKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1WX05BTkRfQk9PVCkKKwkJcmV0dXJuIG5hbmRfYnVybl91Ym9vdF9jbWQoY21kdHAsIGZsYWcsIGxvYWRmcm9tLCBhcmdjLCBhcmd2KTsKKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfU1BJX0JPT1QpCisJCXJldHVybiBzcGlfYnVybl91Ym9vdF9jbWQoY21kdHAsIGZsYWcsIGxvYWRmcm9tLCBhcmdjLCBhcmd2KTsKKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfTk9SX0JPT1QpCisJCXJldHVybiBub3JfYnVybl91Ym9vdF9jbWQoY21kdHAsIGZsYWcsIGxvYWRmcm9tLCBhcmdjLCBhcmd2KTsKKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfTU1DX0JPT1QpCisJCXJldHVybiBtbWNfYnVybl91Ym9vdF9jbWQoY21kdHAsIGZsYWcsIGxvYWRmcm9tLCBhcmdjLCBhcmd2KTsKKyNlbmRpZgorCisJCXJldHVybiAxOworfQorCisjaWYgZGVmaW5lZChNVl9NTUNfQk9PVCkKIFVfQk9PVF9DTUQoCi0JCWJ1YnQsICAgICAgMywgICAgIDEsICAgICAgbW1jX2J1cm5fdWJvb3RfY21kLAotCQkiYnVidAktIEJ1cm4gYW4gaW1hZ2Ugb24gdGhlIEJvb3QgU0QvTU1DL2VNTUMgZGV2aWNlLlxuIiwKKwkJYnVidCwgICAgICAzLCAgICAgMCwgICAgICBidXJuX3Vib290X2NtZCwKKwkJImJ1YnQJLSBCdXJuIGFuIGltYWdlIG9uIHRoZSBCb290IGRldmljZS5cbiIsCiAJCSIgZmlsZS1uYW1lIFxuIgogCQkiW2ZpbGUtbmFtZV0gW3NvdXJjZV0gXG4iCiAJCSJcdEJ1cm4gYSBiaW5hcnkgaW1hZ2Ugb24gdGhlIEJvb3QgRGV2aWNlLCBkZWZhdWx0IGZpbGUtbmFtZSBpcyB1LWJvb3QuYmluIC5cbiIKIAkJIlx0c291cmNlIGNhbiBiZSB0ZnRwIG9yIHVzYiwgZGVmYXVsdCBpcyB0ZnRwLlxuIgogKTsKKyNlbHNlCitVX0JPT1RfQ01EKAorCQlidWJ0LCAgICAgIDQsICAgICAwLCAgICAgIGJ1cm5fdWJvb3RfY21kLAorCQkiYnVidAktIEJ1cm4gYW4gaW1hZ2Ugb24gdGhlIEJvb3QgZmxhc2ggZGV2aWNlLlxuIiwKKwkJIltmaWxlLW5hbWVdIFtkZXN0aW5hdGlvbiBbc291cmNlXV0gXG4iCisJCSJcdEJ1cm4gYSBiaW5hcnkgaW1hZ2Ugb24gdGhlIEJvb3QgRGV2aWNlLCBkZWZhdWx0IGZpbGUtbmFtZSBpcyB1LWJvb3QuYmluIC5cbiIKKwkJIlx0c291cmNlIGNhbiBiZSB0ZnRwIG9yIHVzYiwgZGVmYXVsdCBpcyB0ZnRwLlxuIgorCQkiXHRleGFtcGxlOiBidWJ0IHUtYm9vdC5iaW4gbmFuZCB0ZnRwXG4iCisJCSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL2NtZF9tdnNvdXJjZS5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvY21kX212c291cmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1MDJiMAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL2NtZF9tdnNvdXJjZS5jCkBAIC0wLDAgKzEsNTM4IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSAibXZDb21tb24uaCIKKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8ZW52aXJvbm1lbnQuaD4KKworI2lmZGVmIENPTkZJR19DTURfU09VUkNFCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1VTQikKKyNpbmNsdWRlIDx1c2IuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZnMuaD4KKworI2RlZmluZQlERVNUSU5BVElPTl9TVFJJTkcJMTAKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQorI2luY2x1ZGUgPG5hbmQuaD4KK2V4dGVybiBuYW5kX2luZm9fdCBuYW5kX2luZm9bXTsgICAgICAgLyogaW5mbyBmb3IgTkFORCBjaGlwcyAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ01EX1NGCisjaW5jbHVkZSA8c3BpX2ZsYXNoLmg+CitleHRlcm4gc3RydWN0IHNwaV9mbGFzaCAqZmxhc2g7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DTURfRkxBU0gKKyNpbmNsdWRlIDxmbGFzaC5oPgorZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW107ICAgICAgIC8qIGluZm8gZm9yIEZMQVNIIGNoaXBzICovCisjZW5kaWYKKworI2luY2x1ZGUgPGltYWdlLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKK2ludCBkZXN0X2ZsYXNoOyAvKiBkZXN0aW5hdGlvbiBmbGFzaCB0byBidXJuIHRoZSBzY3JpcHQgKDAgPSBTUEksIDEgPSBOQU5EKSAqLworCisjaWZkZWYgTVZfSU5DTFVERV9VU0IKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGxvYWRfZnJvbV91c2IKKyoKKyogREVTQ1JJUFRJT046CisqIExvYWQgc2NyaXB0IGZpbGUgZnJvbSB1c2IgZGV2aWNlCisqCisqIElOUFVUOgorKglmaWxlX25hbWUJLSBpbWcgZmlsZSBuYW1lLgorKgorKiBPVVRQVVQ6CisqCU5vbmUuCisqCisqIFJFVFVSTjoKKyoJLSBmaWxlIHNpemUgb24gc3VjY2VzcworKgktIDAsIG90aGVyd2lzZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgbG9hZF9mcm9tX3VzYihjb25zdCBjaGFyICpmaWxlX25hbWUpCit7CisJY29uc3QgY2hhciAqYWRkcl9zdHI7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCWludCBmaWxlc2l6ZSA9IDA7CisKKwl1c2Jfc3RvcCgpOworCXByaW50ZigiKFJlKXN0YXJ0IFVTQi4uLlxuIik7CisKKwlpZiAodXNiX2luaXQoKSA8IDApIHsKKwkJcHJpbnRmKCJ1c2JfaW5pdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0cnkgdG8gcmVjb2duaXplIHN0b3JhZ2UgZGV2aWNlcyBpbW1lZGlhdGVseSAqLworCS8qIHRoZSBwYXJhbWV0ZXIgJzEnLCB0ZWxscyB0aGUgZnVuY3Rpb24gdG8gcmVwb3J0cyB0byB0aGUKKwkgKiB1c2VyIHdoaWxlIHNjYW5uaW5nIGZvciBkZXZpY2UgKi8KKwlpZiAoLTEgPT0gdXNiX3N0b3Jfc2NhbigxKSkgeworCQlwcmludGYoIlVTQiBzdG9yYWdlIGRldmljZSBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBhbHdheXMgbG9hZCBmcm9tIHVzYiAwICovCisJaWYgKGZzX3NldF9ibGtfZGV2KCJ1c2IiLCAiMCIsIEZTX1RZUEVfQU5ZKSkgeworCQlwcmludGYoIlVTQiAwIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiAwOworCX0KKworCWFkZHJfc3RyID0gZ2V0ZW52KCJsb2FkYWRkciIpOworCWlmIChhZGRyX3N0ciAhPSBOVUxMKQorCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYWRkcl9zdHIsIE5VTEwsIDE2KTsKKwllbHNlCisJCWFkZHIgPSBDT05GSUdfU1lTX0xPQURfQUREUjsKKworCWZpbGVzaXplID0gZnNfcmVhZChmaWxlX25hbWUsIGFkZHIsIDAsIDApOworCXJldHVybiBmaWxlc2l6ZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBmZXRjaF9zY3JpcHRfZmlsZQorKgorKiBERVNDUklQVElPTjoKKyogTG9hZCBzY3JpcHQgZmlsZSBpbnRvIHJhbSBmcm9tIGV4dGVybmFsIGRldmljZTogdGZ0cCwgdXNiCisqCisqIElOUFVUOgorKglsb2FkZnJvbQktIHNwZWNpZmllcyB0aGUgc291cmNlIGRldmljZToKKyoJCQkgIDAgLSBURlRQLCAxIC0gVVNCCisqCisqIE9VVFBVVDoKKyoJTm9uZS4KKyoKKyogUkVUVVJOOgorKgktIGZpbGUgc2l6ZSBvbiBzdWNjZXNzCisqCS0gMCwgb3RoZXJ3aXNlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBmZXRjaF9zY3JpcHRfZmlsZShpbnQgbG9hZGZyb20pCit7CisJaW50IGZpbGVzaXplID0gMDsKKwlzd2l0Y2ggKGxvYWRmcm9tKSB7CisjaWZkZWYgTVZfSU5DTFVERV9VU0IKKwljYXNlIDE6CisJCWZpbGVzaXplID0gbG9hZF9mcm9tX3VzYihCb290RmlsZSk7CisJCWlmIChmaWxlc2l6ZSA8PSAwKSB7CisJCQlwcmludGYoIkZhaWxlZCB0byByZWFkIGZpbGUgJXNcbiIsIEJvb3RGaWxlKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSAwOgorCQlmaWxlc2l6ZSA9IE5ldExvb3AoVEZUUEdFVCk7CisJCXByaW50ZigiQ2hlY2tpbmcgZmlsZSBzaXplOiIpOworCQlpZiAoZmlsZXNpemUgPT0gLTEpIHsKKwkJCXByaW50ZigiXHRbRmFpbF1cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGZpbGVzaXplOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBmZXRjaF9tdnNvdXJjZV9jbWRfYXJncworKgorKiBERVNDUklQVElPTjoKKyogZmV0Y2ggY29tbWFuZCBhcmd1bWVudHMgZnJvbSBhcmd2IGFuZCByZXR1cm4gdGhlbSBpbiB2YXJpYWJsZXMKKyoKKyogSU5QVVQ6CisqCWFyZ2MJCS0gY29tbWFuZCBhcmd1bWVudHMnIG51bWJlcgorKglhcmd2CQktIGNvbW1hbmQgYXJndW1lbnRzJyB2YWx1ZXMKKyoKKyogT1VUUFVUOgorKgljb21tYW5kCQktIGNvbW1hbmQgdG8gcnVuICgwID0gYnVybiwgMSA9IHJ1bikKKyoJb2Zmc2V0CQktIG9mZnNldCBpbiBmbGFzaCB0byBidXJuIHRoZSBzY3JpcHQKKyoJbG9hZGZyb20JLSBzb3VyY2UgaW50ZXJmYWNlICgwID0gVEZUUCwgMSA9IFVTQikKKyoJZGVzdAkJLSBkZXN0aW5hdGlvbiBmbGFzaCBpZiBtdWx0aXBsZSBmbGFzaGVzIHN1cHBvcnRlZAorKgkJCSAgKDAgPSBTUEksIDEgPSBOQU5EKQorKgorKiBSRVRVUk46CisqCS0gTVZfT0sgb24gc3VjY2VzcworKgktIE1WX0ZBSUwsIG90aGVyd2lzZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBNVl9TVEFUVVMgZmV0Y2hfbXZzb3VyY2VfY21kX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10sCisJCWludCAqY29tbWFuZCwgTVZfVTMyICpvZmZzZXQsIGludCAqbG9hZGZyb20sIGludCAqZGVzdCkgeworCWludCBpOworCWNvbnN0IGNoYXIgKmRlZmF1bHRfbmFtZSA9ICJzY3JpcHQuaW1nIjsKKworCSpjb21tYW5kID0gLTE7CQkvKiAwID0gYnVybjsgMSA9IHJ1bjsgLTEgPSBpbnZhbGlkIGNvbW1hbmQgKi8KKwkqb2Zmc2V0ID0gMHgzMDAwMDA7CisJKmxvYWRmcm9tID0gMDsJCS8qIDAgPSBURlRQOyAxID0gVVNCICovCisJKmRlc3QgPSAwOwkJLyogMCA9IFNQSTsgMSA9IE5BTkQgKi8KKworCS8qIGZldGNoIGRlc3RpbmF0aW9uIGludGVyZmFjZSAoaWYgZXhpc3RzKSwgZWxzZSB1c2UgU1BJIGFzIGRlZmF1bHQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgKytpKSB7CisJCWlmIChzdHJjbXAoYXJndltpXSwgInNwaSIpID09IDApIHsKKwkJCSpkZXN0ID0gMDsKKwkJCWFyZ2MtLTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAibmFuZCIpID09IDApIHsKKwkJCSpkZXN0ID0gMTsKKwkJCWFyZ2MtLTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGFyZ2MgPCAyKSB7IC8qIGVtcHR5IGNvbW1hbmQgaXMgdW5hY2NlcHRhYmxlICovCisJCXByaW50ZigiRXJyb3I6IHRvbyBmZXcgYXJndW1lbnRzXG4iKTsKKwkJcmV0dXJuIE1WX0ZBSUw7CisJfQorCisJLyogc2tpcCBtYWluIGNvbW1hbmQgbmFtZSAqLworCWFyZ2MtLTsKKwlhcmd2Kys7CisJaWYgKHN0cmNtcChhcmd2WzBdLCAiYnVybiIpID09IDApIHsKKwkJKmNvbW1hbmQgPSAwOworCQkvKiBvbmx5IGJ1cm4gY29tbWFuZCBoYXZlIGZpbGVuYW1lIGFzIDFzdCBwYXJhbWV0ZXIgKi8KKwkJaWYgKGFyZ2MgPiAxKSB7CisJCQlzdHJuY3B5KEJvb3RGaWxlLCBhcmd2WzFdLCBzdHJsZW4oYXJndlsxXSkpOworCQkJYXJnYy0tOworCQkJYXJndisrOworCQl9IGVsc2UgeworCQkJc3RybmNweShCb290RmlsZSwgZGVmYXVsdF9uYW1lLCBzdHJsZW4oZGVmYXVsdF9uYW1lKSk7CisJCQlwcmludGYoInVzaW5nIGRlZmF1bHQgZmlsZW5hbWUgXCIlc1wiXG4iLCBkZWZhdWx0X25hbWUpOworCQl9CisJfSBlbHNlIGlmIChzdHJjbXAoYXJndlswXSwgInJ1biIpID09IDApCisJCSpjb21tYW5kID0gMTsKKwllbHNlIHsKKwkJcHJpbnRmKCJFcnJvcjogdW5rbm93biBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIE1WX0ZBSUw7CisJfQorCisJLyogc2tpcCBpbnRlcm5hbCBjb21tYW5kIG5hbWUgKCdidXJuJyBvciAncnVuJykgKi8KKwlhcmdjLS07CisJYXJndisrOworCXN3aXRjaCAoYXJnYykgeworCWNhc2UgMjoKKwkJaWYgKHN0cmNtcChhcmd2WzFdLCAidGZ0cCIpID09IDApCisJCQkqbG9hZGZyb20gPSAwOworCQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgInVzYiIpID09IDApCisJCQkqbG9hZGZyb20gPSAxOworCQllbHNlCisJCQlyZXR1cm4gTVZfRkFJTDsKKwljYXNlIDE6CisJCSpvZmZzZXQgPSBzaW1wbGVfc3RydG91bChhcmd2WzBdLCBOVUxMLCAxNik7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBNVl9PSzsKK30KKworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBpbml0X3NwaQorKgorKiBERVNDUklQVElPTjoKKyogaW5pdCBzcGkgZmxhc2ggaWYgbm90IGluaXRpYXRlZAorKgorKiBJTlBVVDoKKyoJTm9uZS4KKyoKKyogT1VUUFVUOgorKglOb25lLgorKgorKiBSRVRVUk46CisqCTAJb24gc3VjY2VzcworKgktMQlvdGhlcndpc2UKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGluaXRfc3BpKHZvaWQpeworCWlmICghZmxhc2gpIHsKKwkJZmxhc2ggPSBzcGlfZmxhc2hfcHJvYmUoQ09ORklHX0VOVl9TUElfQlVTLCBDT05GSUdfRU5WX1NQSV9DUywKKwkJCQkJCQkJQ09ORklHX1NGX0RFRkFVTFRfU1BFRUQsIENPTkZJR19TRl9ERUZBVUxUX01PREUpOworCQlpZiAoIWZsYXNoKSB7CisJCQlwcmludGYoIkZhaWxlZCB0byBwcm9iZSBTUEkgRmxhc2hcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBzcGlfYnVybl9zY3JpcHQKKyoKKyogREVTQ1JJUFRJT046CisqIGJ1cm4gc2NyaXB0IGltYWdlIHRvIHRoZSBTUEkgZmxhc2gKKyoKKyogSU5QVVQ6CisqCW9mZnNldAkJLSBvZmZzZXQgaW4gZmxhc2ggdG8gYnVybiB0aGUgc2NyaXB0CisqCWxvYWRmcm9tCS0gc291cmNlIGludGVyZmFjZSB0byBmZXRjaCB0aGUgZmlsZSAoMCA9IFRGVFAsIDEgPSBVU0IpCisqCisqIE9VVFBVVDoKKyoJTm9uZS4KKyoKKyogUkVUVVJOOgorKglOb25lLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHNwaV9idXJuX3NjcmlwdChNVl9VMzIgb2Zmc2V0LCBpbnQgbG9hZGZyb20pCit7CisJaW50IGZpbGVzaXplID0gMDsKKwlNVl9VMzIgcmV0ID0gMDsKKwlsb2FkX2FkZHIgPSBDT05GSUdfU1lTX0xPQURfQUREUjsKKwl1MzIgc2VjdG9yX3NpemUsIGFsaWduZWRfc2l6ZTsKKworCWlmIChpbml0X3NwaSgpKQorCQlyZXR1cm47CisKKwlzZWN0b3Jfc2l6ZSA9ICBmbGFzaC0+c2VjdG9yX3NpemU7CisKKwkvKiB2ZXJpZnkgcmVxdWVzdGVkIHNvdXJjZSBpcyB2YWxpZCAqLworCWZpbGVzaXplID0gZmV0Y2hfc2NyaXB0X2ZpbGUobG9hZGZyb20pOworCWlmIChmaWxlc2l6ZSA8PSAwKQorCQlyZXR1cm47CisKKwlhbGlnbmVkX3NpemUgPSAoKGZpbGVzaXplICsgKHNlY3Rvcl9zaXplIC0gMSkpICYgKH4oc2VjdG9yX3NpemUgLSAxKSkpOworCXByaW50ZigiRXJhc2luZyAweCV4IC0gMHgleDogIiwgb2Zmc2V0LCBvZmZzZXQgKyBhbGlnbmVkX3NpemUpOworCXNwaV9mbGFzaF9lcmFzZShmbGFzaCwgb2Zmc2V0LCBhbGlnbmVkX3NpemUpOworCXByaW50ZigiXHRcdFtEb25lXVxuIik7CisKKwlwcmludGYoIldyaXRpbmcgaW1hZ2UgdG8gZmxhc2g6Iik7CisJcmV0ID0gc3BpX2ZsYXNoX3dyaXRlKGZsYXNoLCBvZmZzZXQsIGZpbGVzaXplLCAoY29uc3Qgdm9pZCAqKWxvYWRfYWRkcik7CisKKwlpZiAocmV0KQorCQlwcmludGYoIlx0XHRbRXJyIV1cbiIpOworCWVsc2UKKwkJcHJpbnRmKCJcdFx0W0RvbmVdXG4iKTsKK30KKyNlbmRpZiAvKiBNVl9JTkNMVURFX1NQSSAqLworCisjaWYgZGVmaW5lZChNVl9OQU5EKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc3BpX2J1cm5fc2NyaXB0CisqCisqIERFU0NSSVBUSU9OOgorKiBidXJuIHNjcmlwdCBpbWFnZSB0byB0aGUgTkFORCBmbGFzaAorKgorKiBJTlBVVDoKKyoJb2Zmc2V0CQktIG9mZnNldCBpbiBmbGFzaCB0byBidXJuIHRoZSBzY3JpcHQKKyoJbG9hZGZyb20JLSBzb3VyY2UgaW50ZXJmYWNlIHRvIGZldGNoIHRoZSBmaWxlICgwID0gVEZUUCwgMSA9IFVTQikKKyoKKyogT1VUUFVUOgorKglOb25lLgorKgorKiBSRVRVUk46CisqCU5vbmUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbmFuZF9idXJuX3NjcmlwdChNVl9VMzIgb2Zmc2V0LCBpbnQgbG9hZGZyb20pCit7CisJaW50IGZpbGVzaXplID0gMDsKKwlNVl9VMzIgcmV0ID0gMCwgYWxpZ25lZF9zaXplOworCW5hbmRfaW5mb190ICpuYW5kID0gJm5hbmRfaW5mb1swXTsKKwlzaXplX3QgZXJhc2VzaXplID0gbmFuZF9pbmZvWzBdLmVyYXNlc2l6ZTsKKworCWlmIChuYW5kX2Jsb2NrX2lzYmFkKCZuYW5kX2luZm9bMF0sIG9mZnNldCkpIHsKKwkJcHJpbnRmKCJGYWlsZWQgdG8gYnVybjogQmFkIGJsb2NrIGF0IG9mZnNldCAlWFxuIiwgb2Zmc2V0KTsKKwkJcmV0dXJuOworCX0KKworCS8qIHZlcmlmeSByZXF1ZXN0ZWQgc291cmNlIGlzIHZhbGlkICovCisJZmlsZXNpemUgPSBmZXRjaF9zY3JpcHRfZmlsZShsb2FkZnJvbSk7CisJaWYgKGZpbGVzaXplIDw9IDApCisJCXJldHVybjsKKworCWFsaWduZWRfc2l6ZSA9ICgoZmlsZXNpemUgKyAoZXJhc2VzaXplIC0gMSkpICYgKH4oZXJhc2VzaXplIC0gMSkpKTsKKwlwcmludGYoIlx0W0RvbmVdXG4iKTsKKwlwcmludGYoIkVyYXNpbmcgMHgleCAtIDB4JXg6ICIsIG9mZnNldCwgb2Zmc2V0ICsgYWxpZ25lZF9zaXplKTsKKwluYW5kX2VyYXNlKG5hbmQsIG9mZnNldCwgYWxpZ25lZF9zaXplKTsKKwlwcmludGYoIlx0W0RvbmVdXG4iKTsKKworCXByaW50ZigiV3JpdGluZyBpbWFnZSB0byBOQU5EOiIpOworCXJldCA9IG5hbmRfd3JpdGUobmFuZCwgb2Zmc2V0LCAoc2l6ZV90ICopJmZpbGVzaXplLCAodV9jaGFyICopbG9hZF9hZGRyKTsKKwlpZiAocmV0KQorCQlwcmludGYoIlx0W0ZhaWxdXG4iKTsKKwllbHNlCisJCXByaW50ZigiXHRbRG9uZV1cbiIpOworfQorI2VuZGlmIC8qIGRlZmluZWQoTVZfTkFORCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogaXNfbWFnaWNfdmFsaWQKKyoKKyogREVTQ1JJUFRJT046CisqIGNoZWNrcyBpZiB0aGUgbWFnaWMgdmFsdWUgaW4gc2NyaXB0IGhlYWRlciBpcyB2YWxpZAorKgorKiBJTlBVVDoKKyoJaGVhZGVyCQktIHNjcmlwdCBoZWFkZXIKKyoKKyogUkVUVVJOOgorKglNVl9UUlVFIGlmIG1hZ2ljIHZhbHVlIGluIGhlYWRlciBpcyB2YWxpZAorKglNVl9GQUxTRSBvdGhlcndpc2UKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIGlzX21hZ2ljX3ZhbGlkKGltYWdlX2hlYWRlcl90ICpoZWFkZXIpCit7CisJLyogY2hlY2sgaWYgaW1hZ2UgdHlwZSBpcyBJTUFHRV9GT1JNQVRfTEVHQUNZICovCisJaWYgKGJlMzJfdG9fY3B1KGhlYWRlci0+aWhfbWFnaWMpICE9IElIX01BR0lDKQorCQlyZXR1cm4gTVZfRkFMU0U7CisKKwlyZXR1cm4gTVZfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZ2V0X2ltYWdlX3NpemUKKyoKKyogREVTQ1JJUFRJT046CisqIGZldGNoIHNjcmlwdCBzaXplIChpbiBieXRlcykgZnJvbSBzY3JpcHQgaGVhZGVyCisqCisqIElOUFVUOgorKglvZmZzZXQJCS0gc2NyaXB0IG9mZnNldCBpbiBmbGFzaAorKgorKiBPVVRQVVQ6CisqCXNpemUJCS0gc2NyaXB0IHNpemUgKGluIGJ5dGVzKQorKgorKiBSRVRVUk46CisqCU1WX09LIG9uIHN1Y2Nlc3MgZmV0Y2hpbmcgdGhlIHNpemUKKyoJTVZfRkFJTCBvdGhlcndpc2UKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgZ2V0X2ltYWdlX3NpemUoTVZfVTMyIG9mZnNldCwgTVZfVTMyICpzaXplKQoreworCXNpemVfdCBidWZmX3NpemUgPSBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpOworCWltYWdlX2hlYWRlcl90IGhlYWRlcjsKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQorCWlmIChpbml0X3NwaSgpKQorCQlyZXR1cm4gTVZfRkFJTDsKKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpICYmIGRlZmluZWQoTVZfTkFORCkKKwkJaWYgKGRlc3RfZmxhc2ggPT0gMCkKKwkJCXNwaV9mbGFzaF9yZWFkKGZsYXNoLCBvZmZzZXQsIGJ1ZmZfc2l6ZSAsICZoZWFkZXIpOworCQllbHNlIGlmIChkZXN0X2ZsYXNoID09IDEpCisJCQluYW5kX3JlYWQoJm5hbmRfaW5mb1swXSwgb2Zmc2V0LCAmYnVmZl9zaXplLCAodV9jaGFyICopJmhlYWRlcik7CisjZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQorCXNwaV9mbGFzaF9yZWFkKGZsYXNoLCBvZmZzZXQsIGJ1ZmZfc2l6ZSAsICZoZWFkZXIpOworI2VsaWYgZGVmaW5lZChNVl9OQU5EKQorCW5hbmRfcmVhZCgmbmFuZF9pbmZvWzBdLCBvZmZzZXQsICZidWZmX3NpemUsICh1X2NoYXIgKikmaGVhZGVyKTsKKyNlbHNlCisJcmV0dXJuIE1WX0ZBSUw7CisjZW5kaWYKKwlpZiAoaXNfbWFnaWNfdmFsaWQoJmhlYWRlcikgPT0gTVZfRkFMU0UpCisJCXJldHVybiBNVl9GQUlMOworCisJKnNpemUgPSBiZTMyX3RvX2NwdShoZWFkZXIuaWhfc2l6ZSkgKyBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpOworCXJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZ2V0X2Jsb2NrX3NpemUKKyoKKyogREVTQ1JJUFRJT046CisqIGdldCBibG9jayBzaXplIG9mIGZsYXNoCisqCisqIElOUFVUOgorKglOb25lLgorKgorKiBPVVRQVVQ6CisqCU5vbmUuCisqCisqIFJFVFVSTjoKKyoJYmxvY2sgc2l6ZSwgb24gc3VjY2VzcworKgkwLCBvdGhlcndpc2UKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9VMzIgZ2V0X2Jsb2NrX3NpemUodm9pZCkKK3sKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKSAmJiBkZWZpbmVkKE1WX05BTkQpCisJCWlmIChkZXN0X2ZsYXNoID09IDApCisJCQlyZXR1cm4gZmxhc2gtPnNlY3Rvcl9zaXplOworCQllbHNlIGlmIChkZXN0X2ZsYXNoID09IDEpCisJCQlyZXR1cm4gbmFuZF9pbmZvWzBdLmVyYXNlc2l6ZTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisjZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQorCXJldHVybiBmbGFzaC0+c2VjdG9yX3NpemU7CisKKyNlbGlmIGRlZmluZWQoTVZfTkFORCkKKwlyZXR1cm4gbmFuZF9pbmZvWzBdLmVyYXNlc2l6ZTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworaW50IG12c291cmNlX2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCit7CisJaW50IGNvbW1hbmQsIGxvYWRmcm9tOworCU1WX1UzMiBvZmZzZXQ7CisJY2hhciAqYnVmZmVyOworCWNoYXIgYnVmZmVyX2FkZHJlc3Nfc3RyWzMwXTsJLyogdG8gcGFzcyB0byAnc291cmNlJyBhcmd1bWVudCAqLworCU1WX1UzMiBzaXplOworCWNoYXIgKnNvdXJjZV9hcmd2WzJdOworCisJaWYgKGZldGNoX212c291cmNlX2NtZF9hcmdzKGFyZ2MsIGFyZ3YsICZjb21tYW5kLAorCQkJCSZvZmZzZXQsICZsb2FkZnJvbSwgJmRlc3RfZmxhc2gpICE9IE1WX09LKQorCQlyZXR1cm4gMTsKKworCisJaWYgKGNvbW1hbmQgPT0gMCkgeyAvKiAwID0gYnVybiAqLworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpICYmIGRlZmluZWQoTVZfTkFORCkKKwkJaWYgKGRlc3RfZmxhc2ggPT0gMCkKKwkJCXNwaV9idXJuX3NjcmlwdChvZmZzZXQsIGxvYWRmcm9tKTsKKwkJZWxzZSBpZiAoZGVzdF9mbGFzaCA9PSAxKQorCQkJbmFuZF9idXJuX3NjcmlwdChvZmZzZXQsIGxvYWRmcm9tKTsKKyNlbGlmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCisJCXNwaV9idXJuX3NjcmlwdChvZmZzZXQsIGxvYWRmcm9tKTsKKyNlbGlmIGRlZmluZWQoTVZfTkFORCkKKwkJbmFuZF9idXJuX3NjcmlwdChvZmZzZXQsIGxvYWRmcm9tKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoY29tbWFuZCA9PSAxKSB7IC8qIDEgPSBydW4gKi8KKwkJaWYgKGdldF9pbWFnZV9zaXplKG9mZnNldCwgJnNpemUpICE9IE1WX09LKSB7CisJCQlwcmludGYoIkVycm9yOiBGYWlsZWQgdG8gZmV0Y2ggc2NyaXB0IHNpemVcbiIpOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCQlidWZmZXIgPSAoY2hhciAqKW1hbGxvYyhzaXplKTsKKwkJCWlmICghYnVmZmVyKSB7CisJCQkJcHJpbnRmKCJFcnJvcjogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKSAmJiBkZWZpbmVkKE1WX05BTkQpCisJCWlmIChkZXN0X2ZsYXNoID09IDApCisJCQlzcGlfZmxhc2hfcmVhZChmbGFzaCwgb2Zmc2V0LCBzaXplICwgYnVmZmVyKTsKKwkJZWxzZSBpZiAoZGVzdF9mbGFzaCA9PSAxKQorCQkJbmFuZF9yZWFkKCZuYW5kX2luZm9bMF0sIG9mZnNldCwgJnNpemUsICh1X2NoYXIgKilidWZmZXIpOworI2VsaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKKwkJc3BpX2ZsYXNoX3JlYWQoZmxhc2gsIG9mZnNldCwgc2l6ZSAsIGJ1ZmZlcik7CisjZWxpZiBkZWZpbmVkKE1WX05BTkQpCisJCW5hbmRfcmVhZCgmbmFuZF9pbmZvWzBdLCBvZmZzZXQsICZzaXplLCAodV9jaGFyICopYnVmZmVyKTsKKyNlbHNlCisJCXJldHVybiAxOworI2VuZGlmCisJCXNwcmludGYoYnVmZmVyX2FkZHJlc3Nfc3RyLCAiJWx4IiwgKHVuc2lnbmVkIGxvbmcpYnVmZmVyKTsKKwkJc291cmNlX2FyZ3ZbMF0gPSAic291cmNlIjsKKwkJc291cmNlX2FyZ3ZbMV0gPSBidWZmZXJfYWRkcmVzc19zdHI7CisJCWRvX3NvdXJjZShjbWR0cCwgMCwgMiwgc291cmNlX2FyZ3YpOworCQlmcmVlKGJ1ZmZlcik7CisJfQorCXJldHVybiAwOworfQorCitVX0JPT1RfQ01EKAorCQltdnNvdXJjZSwgICAgICA1LCAgICAgMSwgICAgICBtdnNvdXJjZV9jbWQsCisJCSJtdnNvdXJjZQktIEJ1cm4gYSBzY3JpcHQgaW1hZ2Ugb24gZmxhc2ggZGV2aWNlLlxuIiwKKwkJImJ1cm4gW2ZpbGUtbmFtZSBbb2Zmc2V0IFtzcmNfaW50ZXJmYWNlXV1dIFtkc3RfZmxhc2hdIgorCQkiXG5cdEJ1cm4gc2NyaXB0IDxmaWxlLW5hbWU+IHRvIGZsYXNoIGF0IDxvZmZzZXQ+IGZyb20gPHNyY19pbnRlcmZhY2U+IFxuIgorCQkibXZzb3VyY2UgcnVuIFtvZmZzZXRdIgorCQkiXG5cdFJ1biBzY3JpcHQgZnJvbSBmbGFzaCBhdCA8b2Zmc2V0PlxuIgorCQkiXG5Bcmd1bWVudHMgKG9wdGlvbmFsKTpcbiIKKwkJIlx0LSBmaWxlLW5hbWU6IHNjcmlwdCBmaWxlIG5hbWVcdFx0XHQoZGVmYXVsdCA9IHNjcmlwdC5iaW4pXG4iCisJCSJcdC0gb2Zmc2V0OiBzY3JpcHQgYWRkcmVzcyBpbiBmbGFzaFx0XHQoZGVmYXVsdCA9IDMwMDAwMClcbiIKKwkJIlx0LSBzcmNfaW50ZXJmYWNlOiBzY3JpcHQgc291cmNlOiB0ZnRwL3VzYlx0KGRlZmF1bHQgPSB0ZnRwKVxuIgorCQkiXHQtIGRzdF9mbGFzaDogZmxhc2ggZGVzdGluYXRpb246IHNwaS9uYW5kXHQoZGVmYXVsdCA9IHNwaSlcbiIKKwkJIkV4YW1wbGVzOlxuIgorCQkiXHRtdnNvdXJjZSBidXJuIHNjcmlwdC5pbWcgMzAwMDAwIHRmdHAgc3BpXG4iCisJCSJcdG12c291cmNlIGJ1cm5cbiIKKwkJIlx0bXZzb3VyY2UgcnVuIDMwMDAwMFxuIgorCQkiXHRtdnNvdXJjZSBydW5cbiIKKwkJKTsKKworI2VuZGlmIC8qIENPTkZJR19DTURfU09VUkNFICovCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9ldGhTd2l0Y2gvbXZTd2l0Y2guYyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL2V0aFN3aXRjaC9tdlN3aXRjaC5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNzdhZjJlYS4uMWI4NDc3YQotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9ldGhTd2l0Y2gvbXZTd2l0Y2guYworKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9ldGhTd2l0Y2gvbXZTd2l0Y2guYwpAQCAtNjksMTIgKzY5LDEzIEBACiAjaW5jbHVkZSAibXZDdHJsRW52TGliLmgiCiAjaW5jbHVkZSAibXZCb2FyZEVudkxpYi5oIgogCi0KIHN0YXRpYyB2b2lkIHN3aXRjaFZsYW5Jbml0KE1WX1UzMiBldGhQb3J0TnVtLAogCQkJCQkJICAgTVZfVTMyIHN3aXRjaENwdVBvcnQsCiAJCQkJCSAgIE1WX1UzMiBzd2l0Y2hNYXhQb3J0c051bSwKIAkJCQkJICAgTVZfVTMyIHN3aXRjaFBvcnRzT2Zmc2V0LAogCQkJCQkgICBNVl9VMzIgc3dpdGNoRW5hYmxlZFBvcnRzTWFzayk7CitzdGF0aWMgTVZfVTE2IG12RXRoU3dpdGNoR2V0RGV2aWNlSURJbk11bHRpb3JNYW51YWxNb2RlKHZvaWQpOworc3RhdGljIE1WX1UxNiBtdkV0aFN3aXRjaEdldERldmljZUlESW5BdXRvU2Nhbk1vZGUoTVZfQk9PTCAqaGlnaFNtaURldkFkZHIpOwogCiB2b2lkIG12RXRoU3dpdGNoUmVnV3JpdGUoTVZfVTMyIGV0aFBvcnROdW0sIE1WX1UzMiBwaHlBZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZfVTMyIHJlZ09mZnMsIE1WX1UxNiBkYXRhKTsKQEAgLTg0LDYgKzg1LDI1NCBAQAogCiBpbnQgc3dpdGNoTXVsdGlDaGlwTW9kZSA9IDB4ZGVhZGJlZWY7CiAKK3N0YXRpYyBNVl8zMiBzd2l0Y2hEZXZpY2VJRCA9IC0xOwkvKi0xIDogaW5pdGlhbGl6ZWQsIDAgOiBubyBzd2l0Y2gsIG90aGVyIHZhbHVlcyBhcmUgc3dpdGNoIGRldmljZSBJRCovCitzdGF0aWMgTVZfVTMyIHN3aXRjaEFjY2Vzc01vZGUgPSBTTUlfTUFOVUFMX01PREU7CisjaWZkZWYgTVZfU1dJVENIX1NNSV9BQ0NFU1MKK3N0YXRpYyBNVl8zMiBzd2l0Y2hQaHlBZGRyID0gLTE7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZFdGhTd2l0Y2hHZXREZXZpY2VJREluTXVsdGlBZGRNb2RlIC0KKyoKKyogREVTQ1JJUFRJT046CisqCWdldCBzd2l0Y2ggZGV2aWNlIElEIGlmIHN3aXRjaCBpcyBpbiBTTUkgbXV0aSBhZGRyZXNzIGFjY2VzcyBtb2RlCisqCisqIElOUFVUOgorKglOb25lCisqCisqIE9VVFBVVDoKKyoJTm9uZQorKgorKiBSRVRVUk46ICAgc3dpdGNoIGRldmljZSBJRAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBNVl9VMTYgbXZFdGhTd2l0Y2hHZXREZXZpY2VJREluTXVsdGlvck1hbnVhbE1vZGUodm9pZCkKK3sKKwlNVl9VMTYgZGF0YTsKKworCS8qcmVhZCBzd2l0Y2ggZGV2aWNlIElELCBmaXJzdCB0cnkgdGhlIGNhc2UgdGhhdCBwb3J0IHJlZ2lzdGVyIG9mZnNldCBpcyA4Ki8KKwlkYXRhID0gMDsKKwltdkV0aFN3aXRjaFJlZ1JlYWQoMCwgUE9SVF9SRUdTX1NUQVJUX0FERFIsIFFEX1JFR19TV0lUQ0hfSUQsICZkYXRhKTsKKworCXN3aXRjaCAoZGF0YSAmIDB4RkYwMCkgeworCWNhc2UgMHgwMjAwOgorCWNhc2UgMHgwMzAwOgorCWNhc2UgMHgwNTAwOgorCWNhc2UgMHgwNjAwOgorCWNhc2UgMHgxNTAwOgorCWNhc2UgMHhGNTAwOgorCWNhc2UgMHhGOTAwOgorCWNhc2UgMHgwNzAwOgkgICAgLyogU3Bpbm5ha2VyICovCisJY2FzZSAweDIyMDA6CSAgICAvKiBTcGlubmFrZXIgKi8KKwljYXNlIDB4MjUwMDoJICAgIC8qIFNwaW5uYWtlciAqLworCQlyZXR1cm4gZGF0YTsKKwljYXNlIDB4QzAwMDoJICAgIC8qIE1lbG9keSwgTm93IGl0IGNvdWxkIGJlIDB4YzAwIC0gMHhjMDcgKi8KKwkJcmV0dXJuIGRhdGEmMHhGRjBGOworCWRlZmF1bHQ6CisJICAgIGJyZWFrOworCX0KKworCS8qcmVhZCBzd2l0Y2ggZGV2aWNlIElELCBzZWNvbmQgdHJ5IHRoZSBjYXNlIHRoYXQgcG9ydCByZWdpc3RlciBvZmZzZXQgaXMgMHgxMCovCisJZGF0YSA9IDA7CisJbXZFdGhTd2l0Y2hSZWdSZWFkKDAsIFBPUlRfUkVHU19TVEFSVF9BRERSXzhQT1JULCBRRF9SRUdfU1dJVENIX0lELCAmZGF0YSk7CisKKwlzd2l0Y2ggKGRhdGEgJiAweEZGMDApIHsKKwljYXNlIDB4MDgwMDoKKwljYXNlIDB4MUEwMDoKKwljYXNlIDB4MTAwMDoKKwljYXNlIDB4MDkwMDoKKwljYXNlIDB4MDQwMDoKKwljYXNlIDB4MTIwMDoKKwljYXNlIDB4MTQwMDoKKwljYXNlIDB4MTYwMDoKKwljYXNlIDB4MzIwMDoKKwljYXNlIDB4MTcwMDoKKwljYXNlIDB4MzcwMDoKKwljYXNlIDB4MjQwMDoJLyogQWdhdGUgKi8KKwljYXNlIDB4MzUwMDoJLyogQWdhdGUgKi8KKwljYXNlIDB4MTEwMDoJLyogUGVhcmwgKi8KKwljYXNlIDB4MzEwMDoJLyogUGVhcmwgKi8KKwljYXNlIDB4YzEwMDoJLyogQUxQIEZpeCAqLworCQlyZXR1cm4gZGF0YTsKKwlkZWZhdWx0OgorCSAgICBicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZFdGhTd2l0Y2hHZXREZXZJREJ5UG9ydFJlZ1N0YXJ0SW5BdXRvIC0KKyoKKyogREVTQ1JJUFRJT046CisqCWdldCBzd2l0Y2ggZGV2aWNlIElEIGJ5IHRoZSBzd2l0Y2ggcG9ydCByZWdpc3RlciBzdGFydCBhZGRyZXNzIGlmIHN3aXRjaCBpcyBpbiBTTUkgYXV0byBzY2FuIGFjY2VzcyBtb2RlCisqCisqIElOUFVUOgorKglwb3J0UmVnc1N0YXJ0QWRkciAtIHN3aXRjaCBwb3J0IHJlZ2lzdGVyIHN0YXJ0IGFkZHJlc3MKKyoKKyogT1VUUFVUOgorKglOb25lCisqCisqIFJFVFVSTjogICBzd2l0Y2ggZGV2aWNlIElECisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIE1WX1UxNiBtdkV0aFN3aXRjaEdldERldklEQnlQb3J0UmVnU3RhcnRJbkF1dG8oTVZfVTMyIHBvcnRSZWdzU3RhcnRBZGRyKQoreworCU1WX1UxNiBkYXRhLCBkYXRhMTsKKworCS8qcmVhZCBzd2l0Y2ggZGV2aWNlIElEIGZyb20gc3dpdGNoIHBvcnQgMCBhbmQgMSwgaWYgdGhlIDIgdmFsdWVzIGFyZSBlcXVhbCBhbmQgbWVhbmluZ2Z1bCwgdGhlbiBpdCdzIHZhbGlkKi8KKwlkYXRhID0gMDsKKwltdkV0aFN3aXRjaFJlZ1JlYWQoMCwgcG9ydFJlZ3NTdGFydEFkZHIsIFFEX1JFR19TV0lUQ0hfSUQsICZkYXRhKTsKKwlkYXRhMSA9IDA7CisJbXZFdGhTd2l0Y2hSZWdSZWFkKDAsIHBvcnRSZWdzU3RhcnRBZGRyICsgMSwgUURfUkVHX1NXSVRDSF9JRCwgJmRhdGExKTsKKworCXN3aXRjaCAoZGF0YSAmIDB4RkYwMCkgeworCWNhc2UgMHgwMjAwOgorCWNhc2UgMHgwMzAwOgorCWNhc2UgMHgwNTAwOgorCWNhc2UgMHgwNjAwOgorCWNhc2UgMHgxNTAwOgorCWNhc2UgMHhDMDAwOgkJLyogTWVsb2R5ICovCisJY2FzZSAweDA3MDA6CQkvKiBTcGlubmFrZXIgKi8KKwljYXNlIDB4MjIwMDoJCS8qIFNwaW5uYWtlciAqLworCWNhc2UgMHgyNTAwOgkJLyogU3Bpbm5ha2VyICovCisJY2FzZSAweEY1MDA6CisJY2FzZSAweEY5MDA6CisJCWlmIChkYXRhID09IGRhdGExKQorCQkJcmV0dXJuIGRhdGE7CisJZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJfQorCisJcmV0dXJuIDA7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZFdGhTd2l0Y2hHZXREZXZpY2VJREluQXV0b1NjYW5Nb2RlIC0KKyoKKyogREVTQ1JJUFRJT046CisqCWdldCBzd2l0Y2ggZGV2aWNlIElEIGlmIHN3aXRjaCBpcyBpbiBTTUkgYXV0byBzY2FuIGFjY2VzcyBtb2RlCisqCisqIElOUFVUOgorKglOb25lCisqCisqIE9VVFBVVDoKKyoJaGlnaFNtaURldkFkZHIgLSB3aGV0aGVyIGhpZ2ggU01JIGRldmljZSBhZGRyZXNzIGlzIHVzZWQKKyoKKyogUkVUVVJOOiAgIHN3aXRjaCBkZXZpY2UgSUQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgTVZfVTE2IG12RXRoU3dpdGNoR2V0RGV2aWNlSURJbkF1dG9TY2FuTW9kZShNVl9CT09MICpoaWdoU21pRGV2QWRkcikKK3sKKwlNVl9VMTYgZGF0YSwgZGF0YTE7CisKKwkvKnJlYWQgc3dpdGNoIGRldmljZSBJRCwgZmlyc3QgdHJ5IHRoZSBjYXNlIHRoYXQgcG9ydCByZWdpc3RlciBvZmZzZXQgaXMgOCovCisJZGF0YSA9IG12RXRoU3dpdGNoR2V0RGV2SURCeVBvcnRSZWdTdGFydEluQXV0byhQT1JUX1JFR1NfU1RBUlRfQUREUik7CisJaWYgKGRhdGEgIT0gMCkgeworCQkqaGlnaFNtaURldkFkZHIgPSBNVl9GQUxTRTsKKwkJcmV0dXJuIGRhdGE7CisJfQorCisJLypyZWFkIHN3aXRjaCBkZXZpY2UgSUQsIHNlY29uZCB0cnkgdGhlIGNhc2UgdGhhdCBwb3J0IHJlZ2lzdGVyIG9mZnNldCBpcyAweDE4Ki8KKwlkYXRhID0gbXZFdGhTd2l0Y2hHZXREZXZJREJ5UG9ydFJlZ1N0YXJ0SW5BdXRvKFBPUlRfUkVHU19TVEFSVF9BRERSICsgMHgxMCk7CisJaWYgKGRhdGEgIT0gMCkgeworCQkqaGlnaFNtaURldkFkZHIgPSBNVl9UUlVFOworCQlyZXR1cm4gZGF0YTsKKwl9CisKKwkvKnJlYWQgc3dpdGNoIGRldmljZSBJRCwgZmluYWxseSB0cnkgdGhlIGNhc2UgdGhhdCBwb3J0IHJlZ2lzdGVyIG9mZnNldCBpcyAweDEwKi8KKwlkYXRhID0gMDsKKwltdkV0aFN3aXRjaFJlZ1JlYWQoMCwgUE9SVF9SRUdTX1NUQVJUX0FERFJfOFBPUlQsIFFEX1JFR19TV0lUQ0hfSUQsICZkYXRhKTsKKwlkYXRhMSA9IDA7CisJbXZFdGhTd2l0Y2hSZWdSZWFkKDAsIFBPUlRfUkVHU19TVEFSVF9BRERSXzhQT1JUICsgMSwgUURfUkVHX1NXSVRDSF9JRCwgJmRhdGExKTsKKworCXN3aXRjaCAoZGF0YSAmIDB4RkYwMCkgeworCWNhc2UgMHgwODAwOgorCWNhc2UgMHgxQTAwOgorCWNhc2UgMHgxMDAwOgorCWNhc2UgMHgwOTAwOgorCWNhc2UgMHgwNDAwOgorCWNhc2UgMHgxMjAwOgorCWNhc2UgMHgxNDAwOgorCWNhc2UgMHgxNjAwOgorCWNhc2UgMHgxNzAwOgorCWNhc2UgMHgzMjAwOgorCWNhc2UgMHgzNzAwOgorCWNhc2UgMHgyNDAwOiAgICAvKiBBZ2F0ZSAqLworCWNhc2UgMHgzNTAwOiAgICAvKiBBZ2F0ZSAqLworCWNhc2UgMHgxMTAwOiAgICAvKiBQZWFybCAqLworCWNhc2UgMHgzMTAwOiAgICAvKiBQZWFybCAqLworCQlpZiAoZGF0YSA9PSBkYXRhMSkgeworCQkJKmhpZ2hTbWlEZXZBZGRyID0gTVZfRkFMU0U7CisJCQlyZXR1cm4gZGF0YTsKKwkJfQorCWRlZmF1bHQ6CisJICAgIGJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12RXRoU3dpdGNoR2V0RGV2aWNlSUQgLQorKgorKiBERVNDUklQVElPTjoKKyoJSWYgc3dpdGNoIGRldmljZSBJRCBpcyBub3QgaW5pdGlhbGl6ZWQsIHRoZW4gZGV0ZWN0IHN3aXRjaCBkZXZpY2UsIGZpbmQgb3V0IHN3aXRjaCBkZXZpY2UgSUQsCisqCWFjY2VzcyBtb2RlIGFuZCBQSFkgYWRkcmVzcywgb3RoZXJ3aXNlIHJldHVybiBzd2l0Y2ggZGV2aWNlIElEIGRpcmVjdGx5CisqCisqIElOUFVUOgorKglOb25lCisqCisqIE9VVFBVVDoKKyoJaGlnaFNtaURldkFkZHIgLSBJbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgdGhlIGhpZ2ggZGV2aWNlIHJlZ2lzdGVyCisqCQlhZGRyZXNzZXMgd2hlbiBhY2Nlc3Npbmcgc3dpdGNoJ3MgcmVnaXN0ZXJzIChvZiBhbGwga2luZHMpCisqCQlpLmUsIHRoZSBkZXZpY2VzIHJlZ2lzdGVycyByYW5nZSBpcyAweDEwIHRvIDB4MUYsIG9yIHRvCisqCQl1c2UgdGhlIGxvdyBkZXZpY2UgcmVnaXN0ZXIgYWRkcmVzc2VzIChyYW5nZSAweDAgdG8gMHhGKS4KKyoJCUdUX1RSVUUgICAgIC0gdXNlIGhpZ2ggYWRkcmVzc2VzICgweDEwIHRvIDB4MUYpLgorKgkJR1RfRkFMU0UgICAgLSB1c2UgbG93IGFkZHJlc3NlcyAoMHgwIHRvIDB4RikuCisqCisqIFJFVFVSTjogICBzd2l0Y2ggZGV2aWNlIElELCAwIG1lYW5zIG5vIHN3aXRjaCBkZXRlY3RlZAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1UxNiBtdkV0aFN3aXRjaEdldERldmljZUlEKHZvaWQpCit7CisJTVZfQk9PTAkJaGlnaFNtaURldkFkZHI7CisKKwkvKmlmIHN3aXRjaERldmljZUlEIGhhcyBiZWVuIGluaXRpYWxpemVkLCB0aGVuIHJldHVybiBpdCBkaXJlY3RseSovCisJaWYgKHN3aXRjaERldmljZUlEID49IDApCisJCXJldHVybiAoTVZfVTE2KXN3aXRjaERldmljZUlEOworCisJLyppZiBzd2l0Y2ggbW9kdWxlIGlzIG5vdCBkZXRlY3RlZCwgdGhlbiByZXVybiAwIC0gbm8gc3dpdGNoIGRldGVjdGVkKi8KKwlpZiAobXZCb2FyZElzU3dpdGNoQ29ubmVjdGVkKCkgPT0gTVZfRkFMU0UpIHsKKwkJc3dpdGNoRGV2aWNlSUQgPSAwOworCQlyZXR1cm4gKE1WX1UxNilzd2l0Y2hEZXZpY2VJRDsKKwl9CisKKwlzd2l0Y2hBY2Nlc3NNb2RlID0gbXZCb2FyZFNtaVNjYW5Nb2RlR2V0KDApOworI2lmZGVmIE1WX1NXSVRDSF9TTUlfQUNDRVNTCisJc3dpdGNoUGh5QWRkciA9IG12Qm9hcmRTd2l0Y2hQaHlBZGRyR2V0KDApOworCWlmICgoc3dpdGNoUGh5QWRkciA9PSAtMSkgJiYgKHN3aXRjaEFjY2Vzc01vZGUgPT0gU01JX01BTlVBTF9NT0RFKSkgeworCQltdk9zUHJpbnRmKCJzd2l0Y2hQaHlBZGRyIHZhbHVlICVkIGlzIGVycm9yIVxuIiwgc3dpdGNoUGh5QWRkcik7CisJCXN3aXRjaERldmljZUlEID0gMDsKKwkJcmV0dXJuIHN3aXRjaERldmljZUlEOworCX0KKyNlbmRpZgorCisJaWYgKHN3aXRjaEFjY2Vzc01vZGUgPT0gU01JX01VTFRJX0FERFJfTU9ERSB8fCBzd2l0Y2hBY2Nlc3NNb2RlID09IFNNSV9NQU5VQUxfTU9ERSkgeworCQlzd2l0Y2hEZXZpY2VJRCA9IG12RXRoU3dpdGNoR2V0RGV2aWNlSURJbk11bHRpb3JNYW51YWxNb2RlKCk7CisJCXJldHVybiAoTVZfVTE2KXN3aXRjaERldmljZUlEOworCX0gZWxzZSBpZiAoc3dpdGNoQWNjZXNzTW9kZSA9PSBTTUlfQVVUT19TQ0FOX01PREUpIHsKKwkJc3dpdGNoRGV2aWNlSUQgPSBtdkV0aFN3aXRjaEdldERldmljZUlESW5BdXRvU2Nhbk1vZGUoJmhpZ2hTbWlEZXZBZGRyKTsKKwkJcmV0dXJuIChNVl9VMTYpc3dpdGNoRGV2aWNlSUQ7CisJfSBlbHNlIHsKKwkJc3dpdGNoRGV2aWNlSUQgPSAwOworCQlyZXR1cm4gKE1WX1UxNilzd2l0Y2hEZXZpY2VJRDsKKwl9Cit9CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZFdGhFNjA2NV82MVBoeUJhc2ljSW5pdCAtCiAqCkBAIC0yOTgsMzEgKzU0Nyw0MyBAQAogfQogI2VuZGlmIC8qIE1WODhGNjZYWCAqLwogCisvKiBUaGlzIGluaXRpYWwgZnVuY3Rpb24gaXMgdmFsaWQgZm9yIEU2MTc2IHN3aXRjaCAqLwogTVZfVk9JRAltdkV0aEU2MTcxU3dpdGNoQmFzaWNJbml0KE1WX1UzMiBldGhQb3J0TnVtKQogewogCiAJTVZfVTMyIHBydDsKIAlNVl9VMTYgcmVnOwogCXZvbGF0aWxlIE1WX1UzMiB0aW1lb3V0OwotCU1WXzMyIGNwdVBvcnQgPSAgbXZCb2FyZFN3aXRjaENwdVBvcnRHZXQoMCk7CisJTVZfVTMyIGNwdVBvcnQgPSAgbXZCb2FyZFN3aXRjaENwdVBvcnRHZXQoMCk7CisJTVZfVTMyIHN3aWN0aFBoeUFkZHIgPSBtdkJvYXJkU3dpdGNoUGh5QWRkckdldCgwKTsKIAkvKiBUaGUgNjE3MSBuZWVkcyBhIGRlbGF5ICovCiAJbXZPc0RlbGF5KDEwMDApOwogCiAJLyogSW5pdCB2bGFuIG9mIHN3aXRjaCAxIGFuZCBlbmFibGUgYWxsIHBvcnRzICovCi0Jc3dpdGNoVmxhbkluaXQoZXRoUG9ydE51bSwgTVZfRTYxNzFfQ1BVX1BPUlQsIE1WX0U2MTcxX01BWF9QT1JUU19OVU0sIE1WX0U2MTcxX1BPUlRTX09GRlNFVCwKLQkJCQkgICBNVl9FNjE3MV9FTkFCTEVEX1BPUlRTKTsKKwlzd2l0Y2hWbGFuSW5pdChldGhQb3J0TnVtLCBjcHVQb3J0LCBNVl9FNjE3MV9NQVhfUE9SVFNfTlVNLCBzd2ljdGhQaHlBZGRyLCBNVl9FNjE3MV9FTkFCTEVEX1BPUlRTKTsKIAotCS8qIEVuYWJsZSBSR01JSSBkZWxheSBvbiBUeCBhbmQgUnggZm9yIHBvcnQgNSBzd2l0Y2ggMSAqLwotCW12RXRoU3dpdGNoUmVnUmVhZChldGhQb3J0TnVtLCBNVl9FNjE3MV9QT1JUU19PRkZTRVQgKyBjcHVQb3J0LCBNVl9FNjE3MV9TV0lUQ0hfUEhJWVNJQ0FMX0NUUkxfUkVHLCAmcmVnKTsKLQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTcxX1BPUlRTX09GRlNFVCArIGNwdVBvcnQsIE1WX0U2MTcxX1NXSVRDSF9QSElZU0lDQUxfQ1RSTF9SRUcsCi0JCQkJCQkgKHJlZ3wweEMwMDApKTsKKwlpZiAobXZCb2FyZFN3aXRjaENwdVBvcnRJc1JnbWlpKDApKSB7CisJCS8qIEVuYWJsZSBSR01JSSBkZWxheSBvbiBUeCBhbmQgUnggZm9yIHBvcnQgNSBzd2l0Y2ggMSAqLworCQltdkV0aFN3aXRjaFJlZ1JlYWQoZXRoUG9ydE51bSwgc3dpY3RoUGh5QWRkciArIGNwdVBvcnQsIE1WX0U2MTcxX1NXSVRDSF9QSElZU0lDQUxfQ1RSTF9SRUcsICZyZWcpOworCQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIHN3aWN0aFBoeUFkZHIgKyBjcHVQb3J0LCBNVl9FNjE3MV9TV0lUQ0hfUEhJWVNJQ0FMX0NUUkxfUkVHLAorCQkJCShyZWd8MHhDMDAwKSk7CisJfSBlbHNlIHsKKwkJLyogSWYgdGhlIENQVSBwb3J0IGlzIG5vdCBjb25uZWN0ZWQgdG8gUkdNSUksIHNvIGl0IGNvbm5lY3RlZAorCQkgICB0byBTR01JSSB2aWEgU2VyRGVzIGxhbmUsIHRoaXMgY29kZSBwb3dlci11cCB0aGUgU2VyRGVzIGluIHN3aXRjaCAqLworCQkvKiBDaGFuZ2UgdG8gcGFnZSAjMSB0byBhY2Nlc3MgU2VyRGVzIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJbXZFdGhTd2l0Y2hQaHlSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE3MV9TRVJERVNfUkVHLCBNVl9FNjE3MV9QQUdFX1JFRywgQklUMCk7CisJCS8qIFJlYWQgU2VyRGVzIHBvd2VyIGRvd24gc3RhdHVzIG9mIHRoZSBzd2l0Y2ggKi8KKwkJbXZFdGhTd2l0Y2hQaHlSZWdSZWFkKGV0aFBvcnROdW0sIE1WX0U2MTcxX1NFUkRFU19SRUcsIE1WX0U2MTcxX1NFUkRFU19DT05UUk9MX1JFRywgJnJlZyk7CisJCS8qIENsZWFyIEJpdCAxMSB0byBwb3dlciB1cCB0aGUgc3dpdGNoIFNlckRlcyAqLworCQlyZWcgJj0gfkJJVDExOworCQltdkV0aFN3aXRjaFBoeVJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTcxX1NFUkRFU19SRUcsIE1WX0U2MTcxX1NFUkRFU19DT05UUk9MX1JFRywgcmVnKTsKKwl9CiAKIAkvKiBQb3dlciB1cCBQSFlzICovCi0JZm9yKHBydD0wOyBwcnQgPCBNVl9FNjE3MV9NQVhfUE9SVFNfTlVNIC0gMjsgcHJ0KyspCXsKLQkJaWYgKHBydCAhPSBNVl9FNjE3MV9DUFVfUE9SVCkgeworCWZvciAocHJ0ID0gMDsgcHJ0IDwgTVZfRTYxNzFfTUFYX1BPUlRTX05VTSAtIDI7IHBydCsrKQl7CisJCWlmIChwcnQgIT0gY3B1UG9ydCkgewogCQkJLypFbmFibGUgUGh5IHBvd2VyIHVwIGZvciBzd2l0Y2ggMSovCi0JCQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTcxX0dMT0JBTF8yX1JFR19ERVZfQUREUiwKLQkJCQkJCQkJIE1WX0U2MTcxX1NNSV9QSFlfREFUQSwgMHgzMzYwKTsKKwkJCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgTVZfRTYxNzFfR0xPQkFMXzJfUkVHX0RFVl9BRERSLCBNVl9FNjE3MV9TTUlfUEhZX0RBVEEsIDB4MzM2MCk7CiAJCQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTcxX0dMT0JBTF8yX1JFR19ERVZfQUREUiwgTVZfRTYxNzFfU01JX1BIWV9DT01NQU5ELAogCQkJCQkJCQkoMHg5NDEwIHwgKHBydCA8PCA1KSkpOwogCQkJLypNYWtlIHN1cmUgU01JQnVzeSBiaXQgY2xlYXJlZCBiZWZvcmUgYW5vdGhlciBTTUkgb3BlcmF0aW9uIGNhbiB0YWtlIHBsYWNlKi8KQEAgLTMzMCwyNCArNTkxLDIzIEBACiAKIAkJCWRvIHsKIAkJCQltdkV0aFN3aXRjaFJlZ1JlYWQoZXRoUG9ydE51bSwgTVZfRTYxNzFfR0xPQkFMXzJfUkVHX0RFVl9BRERSLCBNVl9FNjE3MV9TTUlfUEhZX0NPTU1BTkQsJnJlZyk7Ci0JCQkJaWYodGltZW91dC0tID09IDApIHsKKwkJCQlpZiAodGltZW91dC0tID09IDApIHsKIAkJCQkJbXZPc1ByaW50ZigibXZFdGhQaHlSZWdSZWFkOiBTTUkgYnVzeSB0aW1lb3V0XG4iKTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KLQkJCX0gd2hpbGUgKHJlZyAmIEU2MTcxX1BIWV9TTUlfQlVTWV9NQVNLKTsgCisJCQl9IHdoaWxlIChyZWcgJiBFNjE3MV9QSFlfU01JX0JVU1lfTUFTSyk7CiAgCiAJCQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTcxX0dMT0JBTF8yX1JFR19ERVZfQUREUiwgTVZfRTYxNzFfU01JX1BIWV9EQVRBLDB4OTE0MCk7CiAJCQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTcxX0dMT0JBTF8yX1JFR19ERVZfQUREUiwKIAkJCQkJCQkJTVZfRTYxNzFfU01JX1BIWV9DT01NQU5ELCgweDk0MDAgfCAocHJ0IDw8IDUpKSk7CiAKLQogCQkJLypNYWtlIHN1cmUgU01JQnVzeSBiaXQgY2xlYXJlZCBiZWZvcmUgYW5vdGhlciBTTUkgb3BlcmF0aW9uIGNhbiB0YWtlIHBsYWNlKi8KIAkJCXRpbWVvdXQgPSBFNjE3MV9QSFlfVElNRU9VVDsKIAogCQkJZG8gewogCQkJCW12RXRoU3dpdGNoUmVnUmVhZChldGhQb3J0TnVtLCBNVl9FNjE3MV9HTE9CQUxfMl9SRUdfREVWX0FERFIsCiAJCQkJCQkJCSAgIE1WX0U2MTcxX1NNSV9QSFlfQ09NTUFORCwmcmVnKTsKLQkJCQlpZih0aW1lb3V0LS0gPT0gMCkgeworCQkJCWlmICh0aW1lb3V0LS0gPT0gMCkgewogCQkJCQltdk9zUHJpbnRmKCJtdkV0aFBoeVJlZ1JlYWQ6IFNNSSBidXN5IHRpbWVvdXRcbiIpOwogCQkJCQlyZXR1cm47CiAJCQkJfQpAQCAtMzU1LDMxICs2MTUsMTAzIEBACiAJCX0KIAl9CiAKLQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTYxX1BPUlRTX09GRlNFVCArIGNwdVBvcnQsIDB4NCwgMHg3Zik7Ci0JCisJbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBzd2ljdGhQaHlBZGRyICsgY3B1UG9ydCwgMHg0LCAweDdmKTsKKwogCS8qIEluaXQgTEVEcyBvbiBSRC02MjgyICovCiAJLyogTW92ZSBhbGwgTEVEcyB0byBzcGVjaWFsICovCi0JbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE2MV9QT1JUU19PRkZTRVQsIDB4MTYsIChCSVQxNXwweDY3KSk7Ci0JbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE2MV9QT1JUU19PRkZTRVQsIDB4MTYsIChCSVQxNXxCSVQxMnwweDMyKSk7CisJbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBzd2ljdGhQaHlBZGRyLCBNVl9FNjE3MV9MRURfQ09OVFJPTCwgKEJJVDE1fDB4NjcpKTsKKwltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIHN3aWN0aFBoeUFkZHIsIE1WX0U2MTcxX0xFRF9DT05UUk9MLCAoQklUMTV8QklUMTJ8MHgzMikpOwogCiAJLyogUG9ydCAwIExFRCBzcGVjaWFsIGFjdGl2aXR5IGxpbmsgKi8KLQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTYxX1BPUlRTX09GRlNFVCwgMHgxNiwgKEJJVDE1fEJJVDE0fEJJVDEzfEJJVDEyfEJJVDApKTsKKwltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIHN3aWN0aFBoeUFkZHIsIE1WX0U2MTcxX0xFRF9DT05UUk9MLCAoQklUMTV8QklUMTR8QklUMTN8QklUMTJ8QklUMCkpOwogCiAJLyogUG9ydCAxIExFRCBzcGVjaWFsIGFjdGl2aXR5IGxpbmsgKi8KLQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTYxX1BPUlRTX09GRlNFVCsxLCAweDE2LCAoQklUMTV8QklUMTR8QklUMTN8QklUMTJ8QklUMSkpOworCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgc3dpY3RoUGh5QWRkciArIDEsIE1WX0U2MTcxX0xFRF9DT05UUk9MLCAoQklUMTV8QklUMTR8QklUMTN8QklUMTJ8QklUMSkpOwogCiAJLyogUG9ydCAyIExFRCBzcGVjaWFsIGFjdGl2aXR5IGxpbmsgKi8KLQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTYxX1BPUlRTX09GRlNFVCsyLCAweDE2LCAoQklUMTV8QklUMTR8QklUMTN8QklUMTJ8QklUMikpOworCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgc3dpY3RoUGh5QWRkciArIDIsIE1WX0U2MTcxX0xFRF9DT05UUk9MLCAoQklUMTV8QklUMTR8QklUMTN8QklUMTJ8QklUMikpOwogCiAJLyogUG9ydCAzIExFRCBzcGVjaWFsIGFjdGl2aXR5IGxpbmsgKi8KLQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTYxX1BPUlRTX09GRlNFVCszLCAweDE2LCAoQklUMTV8QklUMTR8QklUMTN8QklUMTJ8QklUMykpOworCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgc3dpY3RoUGh5QWRkciArIDMsIE1WX0U2MTcxX0xFRF9DT05UUk9MLCAoQklUMTV8QklUMTR8QklUMTN8QklUMTJ8QklUMykpOwogCiAjaWZkZWYgUkRfODhGNjcxMAotCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgTVZfRTYxNjFfUE9SVFNfT0ZGU0VULCAweDE2LCAweGYwMGYpOworCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgc3dpY3RoUGh5QWRkciwgTVZfRTYxNzFfTEVEX0NPTlRST0wsIDB4ZjAwZik7CiAjZW5kaWYKIAogfQogCitNVl9WT0lECW12RXRoRTYxNzJTd2l0Y2hCYXNpY0luaXQoTVZfVTMyIGV0aFBvcnROdW0pCit7CisKKwlNVl9VMzIgcHJ0OworCU1WX1UxNiByZWc7CisJTVZfVTMyIHRpbWVvdXQ7CisJTVZfMzIgY3B1UG9ydCA9ICBNVl9FNjE3Ml9DUFVfUE9SVDsvKm12Qm9hcmRTd2l0Y2hDcHVQb3J0R2V0KDApOyovCisJTVZfVTE2IHNtaVJlZywgZGF0YTsKKworCS8qIFRoZSA2MTcyIG5lZWRzIGEgZGVsYXkgKi8KKwltdk9zRGVsYXkoMTAwMCk7CisKKwkvKiBJbml0IHZsYW4gb2Ygc3dpdGNoIDEgYW5kIGVuYWJsZSBhbGwgcG9ydHMgKi8KKwlzd2l0Y2hWbGFuSW5pdChldGhQb3J0TnVtLCBNVl9FNjE3Ml9DUFVfUE9SVCwgTVZfRTYxNzJfTUFYX1BPUlRTX05VTSwgTVZfRTYxNzJfUE9SVFNfT0ZGU0VULAorCQkJCSAgIE1WX0U2MTcyX0VOQUJMRURfUE9SVFMpOworCisJLyogRW5hYmxlIFJHTUlJIGRlbGF5IG9uIFR4IGFuZCBSeCBmb3IgY3B1IHBvcnQsIGZvcmNlIGR1cGxleCwgbGluayB1cCwgIGZsb3cgY29udHJvbCwgYW5kIHNwZWVkIHRvIDFHcHMqLworCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgTVZfRTYxNzJfUE9SVFNfT0ZGU0VUICsgY3B1UG9ydCwgTVZfRTYxNzJfU1dJVENIX1BISVlTSUNBTF9DVFJMX1JFRywKKwlRRF9QQ1NfUkdNSUlfUlhfVElNSU5HX01BU0sgfCBRRF9QQ1NfUkdNSUlfVFhfVElNSU5HX01BU0sgfCBRRF9QQ1NfRkxPV19DT05UUk9MX1ZBTFVFX01BU0sKKwl8IFFEX1BDU19GT1JDRURfRkxPV19DT05UUk9MX01BU0sgfCBRRF9QQ1NfTElOS19WQUxVRV9NQVNLIHwgUURfUENTX0ZPUkNFRF9MSU5LX01BU0sKKwl8IFFEX1BDU19EVVBMRVhfVkFMVUVfTUFTSyB8IFFEX1BDU19GT1JDRURfRFVQTEVYX01BU0sgfCBRRF9QQ1NfRk9SQ0VfU1BFRURfMUcpOworCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgTVZfRTYxNzJfUE9SVFNfT0ZGU0VUICsgY3B1UG9ydCwgTVZfRTYxNzJfU1dJVENIX1BPUlRfQ1RSTF9SRUcsCisJUURfUENfVkxBTl9UVU5ORUxfQllfUEFTUyB8IFFEX1BDX0lOSVRJQUxfUFJJX0lQIHwgUURfUENfRUdSRVNTX0ZMT09EU19BTEwgfCBRRF9QQ19QT1JUX1NUQVRFX0ZPUldBUkRJTkcpOworCisJLyogUG93ZXIgdXAgUEhZcyAqLworCWZvciAocHJ0ID0gMDsgcHJ0IDwgTVZfRTYxNzJfTUFYX1BPUlRTX05VTSAtIDI7IHBydCsrKQl7CisJCWlmIChwcnQgIT0gTVZfRTYxNzJfQ1BVX1BPUlQpIHsKKwkJCS8qRW5hYmxlIFBoeSBwb3dlciB1cCBmb3Igc3dpdGNoIDEqLworCQkJZGF0YSA9IFFEX1BIWV9NRElfQ1JPU1NfQVVUTyB8IFFEX1BIWV9FTkVSR1lfREVURUNUX1NFTlNFX1BFUklPRElDX1RYX05MUCB8CisJCQlRRF9QSFlfRE9XTlNISUZUX0NPVU5URVI7CisJCQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTcyX0dMT0JBTF8yX1JFR19ERVZfQUREUiwKKwkJCQkJCQkJTVZfRTYxNzJfU01JX1BIWV9EQVRBLCBkYXRhKTsKKwkJCXNtaVJlZyA9IChRRF9TTUlfQlVTWSB8IChwcnQgPDwgUURfU01JX0RFVl9BRERSX0JJVCkgfCAoUURfU01JX1dSSVRFIDw8IFFEX1NNSV9PUF9CSVQpIHwKKwkJCShRRF9QSFlfU1BFQ19DT05UUk9MX1JFRyA8PCBRRF9TTUlfUkVHX0FERFJfQklUKSB8IChRRF9TTUlfQ0xBVVNFMjIgPDwgUURfU01JX01PREVfQklUKSk7CisJCQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTcyX0dMT0JBTF8yX1JFR19ERVZfQUREUiwKKwkJCQkJCQkJTVZfRTYxNzJfU01JX1BIWV9DT01NQU5ELCBzbWlSZWcpOworCQkJLypNYWtlIHN1cmUgU01JQnVzeSBiaXQgY2xlYXJlZCBiZWZvcmUgYW5vdGhlciBTTUkgb3BlcmF0aW9uIGNhbiB0YWtlIHBsYWNlKi8KKwkJCXRpbWVvdXQgPSBFNjE3Ml9QSFlfVElNRU9VVDsKKworCQkJZG8geworCQkJCW12RXRoU3dpdGNoUmVnUmVhZChldGhQb3J0TnVtLCBNVl9FNjE3Ml9HTE9CQUxfMl9SRUdfREVWX0FERFIsCisJCQkJCU1WX0U2MTcyX1NNSV9QSFlfQ09NTUFORCwgJnJlZyk7CisJCQkJaWYgKHRpbWVvdXQtLSA9PSAwKSB7CisJCQkJCW12T3NQcmludGYoIm12RXRoUGh5UmVnUmVhZDogU01JIGJ1c3kgdGltZW91dFxuIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9IHdoaWxlIChyZWcgJiBFNjE3Ml9QSFlfU01JX0JVU1lfTUFTSyk7CisKKwkJCWRhdGEgPSBRRF9QSFlfUkVTRVQgfCBRRF9QSFlfQVVUT05FR08gfCBRRF9QSFlfRFVQTEVYIHwgUURfUEhZX1NQRUVEX01TQjsKKwkJCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgTVZfRTYxNzJfR0xPQkFMXzJfUkVHX0RFVl9BRERSLCBNVl9FNjE3Ml9TTUlfUEhZX0RBVEEsCisJCQkJZGF0YSk7CisJCQlzbWlSZWcgPSAoUURfU01JX0JVU1kgfCAocHJ0IDw8IFFEX1NNSV9ERVZfQUREUl9CSVQpIHwgKFFEX1NNSV9XUklURSA8PCBRRF9TTUlfT1BfQklUKSB8CisJCQkoUURfUEhZX0NPTlRST0xfUkVHIDw8IFFEX1NNSV9SRUdfQUREUl9CSVQpIHwgKFFEX1NNSV9DTEFVU0UyMiA8PCBRRF9TTUlfTU9ERV9CSVQpKTsKKwkJCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgTVZfRTYxNzJfR0xPQkFMXzJfUkVHX0RFVl9BRERSLAorCQkJCQkJCQlNVl9FNjE3Ml9TTUlfUEhZX0NPTU1BTkQsIHNtaVJlZyk7CisKKwkJCS8qTWFrZSBzdXJlIFNNSUJ1c3kgYml0IGNsZWFyZWQgYmVmb3JlIGFub3RoZXIgU01JIG9wZXJhdGlvbiBjYW4gdGFrZSBwbGFjZSovCisJCQl0aW1lb3V0ID0gRTYxNzJfUEhZX1RJTUVPVVQ7CisKKwkJCWRvIHsKKwkJCQltdkV0aFN3aXRjaFJlZ1JlYWQoZXRoUG9ydE51bSwgTVZfRTYxNzJfR0xPQkFMXzJfUkVHX0RFVl9BRERSLAorCQkJCQlNVl9FNjE3Ml9TTUlfUEhZX0NPTU1BTkQsICZyZWcpOworCQkJCWlmICh0aW1lb3V0LS0gPT0gMCkgeworCQkJCQltdk9zUHJpbnRmKCJtdkV0aFBoeVJlZ1JlYWQ6IFNNSSBidXN5IHRpbWVvdXRcbiIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfSB3aGlsZSAocmVnICYgRTYxNzJfUEhZX1NNSV9CVVNZX01BU0spOworCQl9CisJfQorCit9CisKIHN0YXRpYyB2b2lkIHN3aXRjaFZsYW5Jbml0KE1WX1UzMiBldGhQb3J0TnVtLCBNVl9VMzIgc3dpdGNoQ3B1UG9ydCwgTVZfVTMyIHN3aXRjaE1heFBvcnRzTnVtLAogCQkJICAgTVZfVTMyIHN3aXRjaFBvcnRzT2Zmc2V0LCBNVl9VMzIgc3dpdGNoRW5hYmxlZFBvcnRzTWFzaykKIHsKQEAgLTQwNSwxMiArNzM3LDEzIEBACiAJfQogfQogCisjaWZkZWYgTVZfU1dJVENIX0RJUkVDVF9BQ0NFU1MKIHZvaWQgbXZFdGhTd2l0Y2hSZWdXcml0ZShNVl9VMzIgZXRoUG9ydE51bSwgTVZfVTMyIHN3aXRjaFBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVl9VMzIgc3dpdGNoUmVnLCBNVl9VMTYgZGF0YSkKKwkJCQlNVl9VMzIgc3dpdGNoUmVnLCBNVl9VMTYgZGF0YSkKIHsKIAlNVl9VMzIgb2Zmc2V0ID0gMDsKIAotCWlmIChtdkJvYXJkSXNJbnRlcm5hbFN3aXRjaENvbm5lY3RlZCgpID09IE1WX0ZBTFNFKSB7CisJaWYgKG12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZCgpID09IE1WX0ZBTFNFKSB7CiAJCW12T3NQcmludGYoIk5vIFN3aXRjaC5cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtNDIzLDExICs3NTYsMTEgQEAKIH0KIAogdm9pZCBtdkV0aFN3aXRjaFJlZ1JlYWQoTVZfVTMyIGV0aFBvcnROdW0sIE1WX1UzMiBzd2l0Y2hQb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVl9VMzIgc3dpdGNoUmVnLCBNVl9VMTYgKmRhdGEpCisJCQkJTVZfVTMyIHN3aXRjaFJlZywgTVZfVTE2ICpkYXRhKQogewogCU1WX1UzMiByZXN1bHQsIHJlZyA9IDA7CiAKLQlpZiAobXZCb2FyZElzSW50ZXJuYWxTd2l0Y2hDb25uZWN0ZWQoKSA9PSBNVl9GQUxTRSkgeworCWlmIChtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQoKSA9PSBNVl9GQUxTRSkgewogCQltdk9zUHJpbnRmKCJObyBTd2l0Y2guXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTQ0MCw2ICs3NzMsMTE4IEBACiAJKmRhdGEgPSByZXN1bHQ7CiB9CiAKKyNlbHNlCS8qZGVmaW5lZChNVl9TV0lUQ0hfU01JX0FDQ0VTUykqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZFdGhTd2l0Y2hXYWl0U01JQ29tbWFuZFJlZ0ZyZWUgLQorKgorKiBERVNDUklQVElPTjoKKyoJd2FpdCBTTUkgY29tbWFuZCByZWdpc3RlciB0byBiZSBmcmVlCisqCisqIElOUFVUOgorKgl0aW1lT3V0IC0gdGhlIHdhaXQgdGltZSwgaW4gMTAwTVMgdW5pdHMKKyoKKyogT1VUUFVUOgorKglOb25lCisqCisqIFJFVFVSTjogICB0cnVlIC0gU01JIGNvbW1hbmQgcmVnaXN0ZXIgaXMgZnJlZSwgZmFsc2UgLSBTTUkgY29tbWFuZCByZWdpc3RlciBpcyBub3QgZnJlZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBNVl9CT09MIG12RXRoU3dpdGNoV2FpdFNNSUNvbW1hbmRSZWdGcmVlKE1WX1UzMiB0aW1lT3V0KQoreworCU1WX1UxNiBzbWlSZWc7CisJaW50IGk7CisKKwkvKiBmaXJzdCBjaGVjayB0aGF0IGl0IGlzIG5vdCBidXN5ICovCisJaWYgKG12RXRoUGh5UmVnUmVhZChzd2l0Y2hQaHlBZGRyLCAoTVZfVTMyKVFEX1JFR19TTUlfQ09NTUFORCwgJnNtaVJlZykgIT0gTVZfT0spCisJCXJldHVybiBNVl9GQUxTRTsKKworCXRpbWVPdXQgPSBRRF9TTUlfQUNDRVNTX0xPT1A7IC8qIGluaXRpYWxpemUgdGhlIGxvb3AgY291bnQgKi8KKworCWlmIChzbWlSZWcgJiBRRF9TTUlfQlVTWSkgeworCQlmb3IgKGkgPSAwOyBpIDwgUURfU01JX1RJTUVPVVQ7IGkrKykKKwkJCTsKKwkJZG8geworCQkJaWYgKHRpbWVPdXQtLSA8IDEpCisJCQkJcmV0dXJuIE1WX0ZBTFNFOworCQkJaWYgKG12RXRoUGh5UmVnUmVhZChzd2l0Y2hQaHlBZGRyLCAoTVZfVTMyKVFEX1JFR19TTUlfQ09NTUFORCwgJnNtaVJlZykgIT0gTVZfT0spCisJCQkJcmV0dXJuIE1WX0ZBTFNFOworCQl9IHdoaWxlIChzbWlSZWcgJiBRRF9TTUlfQlVTWSk7CisJfQorCisJcmV0dXJuIE1WX1RSVUU7Cit9CisKK3ZvaWQgbXZFdGhTd2l0Y2hSZWdXcml0ZShNVl9VMzIgZXRoUG9ydE51bSwgTVZfVTMyIHN3aXRjaFBvcnQsCisJCQkJTVZfVTMyIHN3aXRjaFJlZywgTVZfVTE2IGRhdGEpCit7CisJTVZfVTE2IHNtaVJlZzsKKworCWlmIChtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQoKSA9PSBNVl9GQUxTRSkgeworCQltdk9zUHJpbnRmKCJObyBTd2l0Y2guXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzd2l0Y2hBY2Nlc3NNb2RlICE9IFNNSV9NVUxUSV9BRERSX01PREUpIHsKKwkJbXZFdGhQaHlSZWdXcml0ZShzd2l0Y2hQb3J0LCBzd2l0Y2hSZWcsIGRhdGEpOworCQlyZXR1cm47CisJfQorCisJLyogd2FpdCBTTUkgY29tbWFuZCByZWdpc3RlciB0byBiZSBmcmVlICovCisJaWYgKG12RXRoU3dpdGNoV2FpdFNNSUNvbW1hbmRSZWdGcmVlKFFEX1NNSV9BQ0NFU1NfTE9PUCkgPT0gTVZfRkFMU0UpCisJCXJldHVybjsKKworCWlmIChtdkV0aFBoeVJlZ1dyaXRlKHN3aXRjaFBoeUFkZHIsIChNVl9VMzIpUURfUkVHX1NNSV9EQVRBLCBkYXRhKSAhPSBNVl9PSykKKwkJcmV0dXJuOworCisJc21pUmVnID0gUURfU01JX0JVU1kgfCAoc3dpdGNoUG9ydCA8PCBRRF9TTUlfREVWX0FERFJfQklUKSB8IChRRF9TTUlfV1JJVEUgPDwgUURfU01JX09QX0JJVCkgfAorCQkoc3dpdGNoUmVnIDw8IFFEX1NNSV9SRUdfQUREUl9CSVQpIHwgKFFEX1NNSV9DTEFVU0UyMiA8PCBRRF9TTUlfTU9ERV9CSVQpOworCisJaWYgKG12RXRoUGh5UmVnV3JpdGUoc3dpdGNoUGh5QWRkciwgKE1WX1UzMilRRF9SRUdfU01JX0NPTU1BTkQsIHNtaVJlZykgIT0gTVZfT0spCisJCXJldHVybjsKKworCXJldHVybjsKK30KKworCit2b2lkIG12RXRoU3dpdGNoUmVnUmVhZChNVl9VMzIgZXRoUG9ydE51bSwgTVZfVTMyIHN3aXRjaFBvcnQsCisJCQkJTVZfVTMyIHN3aXRjaFJlZywgTVZfVTE2ICpkYXRhKQoreworCU1WX1UxNiBzbWlSZWc7CisKKwlpZiAobXZCb2FyZElzU3dpdGNoQ29ubmVjdGVkKCkgPT0gTVZfRkFMU0UpIHsKKwkJbXZPc1ByaW50ZigiTm8gU3dpdGNoLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3dpdGNoQWNjZXNzTW9kZSAhPSBTTUlfTVVMVElfQUREUl9NT0RFKSB7CisJCW12RXRoUGh5UmVnUmVhZChzd2l0Y2hQb3J0LCBzd2l0Y2hSZWcsICZzbWlSZWcpOworCQkqZGF0YSA9IHNtaVJlZzsKKwkJcmV0dXJuOworCX0KKworCS8qIHdhaXQgU01JIGNvbW1hbmQgcmVnaXN0ZXIgdG8gYmUgZnJlZSAqLworCWlmIChtdkV0aFN3aXRjaFdhaXRTTUlDb21tYW5kUmVnRnJlZShRRF9TTUlfQUNDRVNTX0xPT1ApID09IE1WX0ZBTFNFKQorCQlyZXR1cm47CisKKwlzbWlSZWcgPSAgUURfU01JX0JVU1kgfCAoc3dpdGNoUG9ydCA8PCBRRF9TTUlfREVWX0FERFJfQklUKSB8IChRRF9TTUlfUkVBRCA8PCBRRF9TTUlfT1BfQklUKSB8CisJCShzd2l0Y2hSZWcgPDwgUURfU01JX1JFR19BRERSX0JJVCkgfCAoUURfU01JX0NMQVVTRTIyIDw8IFFEX1NNSV9NT0RFX0JJVCk7CisKKwlpZiAobXZFdGhQaHlSZWdXcml0ZShzd2l0Y2hQaHlBZGRyLCAoTVZfVTMyKVFEX1JFR19TTUlfQ09NTUFORCwgc21pUmVnKSAhPSBNVl9PSykKKwkJcmV0dXJuOworCisJLyogd2FpdCBTTUkgY29tbWFuZCByZWdpc3RlciB0byBiZSBmcmVlICovCisJaWYgKG12RXRoU3dpdGNoV2FpdFNNSUNvbW1hbmRSZWdGcmVlKFFEX1NNSV9BQ0NFU1NfTE9PUCkgPT0gTVZfRkFMU0UpCisJCXJldHVybjsKKworCWlmIChtdkV0aFBoeVJlZ1JlYWQoc3dpdGNoUGh5QWRkciwgKE1WX1UzMilRRF9SRUdfU01JX0RBVEEsICZzbWlSZWcpICE9IE1WX09LKQorCQlyZXR1cm47CisKKwkqZGF0YSA9IHNtaVJlZzsKKworCXJldHVybjsKK30KKyNlbmRpZgorCiB2b2lkIG12RXRoU3dpdGNoUGh5UmVnV3JpdGUoTVZfVTMyIGV0aFBvcnROdW0sIE1WX1UxNiBwcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVl9VMTYgcmVnT2ZmcywgTVZfVTE2IGRhdGEpCiB7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9ldGhTd2l0Y2gvbXZTd2l0Y2guaCBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL2V0aFN3aXRjaC9tdlN3aXRjaC5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNDdlY2ZkOS4uNjIxYTg0MwotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9ldGhTd2l0Y2gvbXZTd2l0Y2guaAorKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9ldGhTd2l0Y2gvbXZTd2l0Y2guaApAQCAtNjcsNiArNjcsMTEgQEAKIAogI2luY2x1ZGUgIm12VHlwZXMuaCIKIAorLyogZGVmaW5pdGlvbiBmb3IgZGV2aWNlIHNjYW4gbW9kZSAqLworI2RlZmluZSBTTUlfQVVUT19TQ0FOX01PREUgICAgICAgIDAgICAgLyogU2NhbiAwIG9yIDB4MTAgYmFzZSBhZGRyZXNzIHRvIGZpbmQgdGhlIFFEICovCisjZGVmaW5lIFNNSV9NQU5VQUxfTU9ERSAgICAgICAgICAgIDEgICAgLyogVXNlIFFEIGxvY2F0ZWQgYXQgbWFudWFsbHkgZGVmaW5lZCBiYXNlIGFkZHIgKi8KKyNkZWZpbmUgU01JX01VTFRJX0FERFJfTU9ERSAgICAgICAgMiAgICAvKiBVc2UgUUQgYXQgYmFzZSBhZGRyIGFuZCB1c2UgaW5kaXJlY3QgYWNjZXNzICovCisKIE1WX1ZPSUQJbXZFdGhFNjA2M1N3aXRjaEJhc2ljSW5pdChNVl9VMzIgZXRoUG9ydE51bSk7CiBNVl9WT0lECW12RXRoRTYwNjVfNjFTd2l0Y2hCYXNpY0luaXQoTVZfVTMyIGV0aFBvcnROdW0pOwogTVZfVk9JRAltdkV0aEU2MTMxU3dpdGNoQmFzaWNJbml0KE1WX1UzMiBldGhQb3J0TnVtKTsKQEAgLTc2LDkgKzgxLDEwIEBACiB2b2lkIG12RXRoU3dpdGNoUmVnV3JpdGUoTVZfVTMyIGV0aFBvcnROdW0sIE1WX1UzMiBwaHlBZGRyLCBNVl9VMzIgcmVnT2ZmcywgTVZfVTE2IGRhdGEpOwogdm9pZCBtdkV0aFN3aXRjaFBoeVJlZ1JlYWQoTVZfVTMyIGV0aFBvcnROdW0sIE1WX1UxNiBwcnQsIE1WX1UxNiByZWdPZmZzLCBNVl9VMTYgKmRhdGEpOwogdm9pZCBtdkV0aFN3aXRjaFBoeVJlZ1dyaXRlKE1WX1UzMiBldGhQb3J0TnVtLCBNVl9VMTYgcHJ0LCBNVl9VMTYgcmVnT2ZmcywgTVZfVTE2IGRhdGEpOwotCitNVl9VMTYgbXZFdGhTd2l0Y2hHZXREZXZpY2VJRCh2b2lkKTsKICNpZmRlZiBNVjg4RjY2WFgKIE1WX1ZPSUQgbXZBbHBCb2FyZFN3aXRjaEJhc2ljSW5pdChNVl9VMzIgZW5hYmxlZFBvcnRzKTsKICNlbmRpZgorTVZfVk9JRAltdkV0aEU2MTcyU3dpdGNoQmFzaWNJbml0KE1WX1UzMiBldGhQb3J0TnVtKTsKIAogI2VuZGlmIC8qIF9fSU5DRVRIU1dJVENISCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvZXRoU3dpdGNoL212U3dpdGNoUmVncy5oIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvZXRoU3dpdGNoL212U3dpdGNoUmVncy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNzUyOWYyYi4uYzc0ZmI0OAotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9ldGhTd2l0Y2gvbXZTd2l0Y2hSZWdzLmgKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvZXRoU3dpdGNoL212U3dpdGNoUmVncy5oCkBAIC0xMTAsMTggKzExMCwzOSBAQAogI2RlZmluZSBFNjE2MV9QSFlfU01JX0JVU1lfTUFTSwkJCQkJKDEgPDwgRVRIX1BIWV9TTUlfQlVTWV9CSVQpCiAKIC8qIEU2MTcxIHJlbGF0ZWQgKi8KLSNkZWZpbmUgTVZfRTYxNzFfQ1BVX1BPUlQJCQkJCQkweDYKLSNkZWZpbmUgTVZfRTYxNzFfUE9SVFNfT0ZGU0VUCQkJCQkweDEwCi0jZGVmaW5lIE1WX0U2MTcxX1NXSVRDSF9QSElZU0lDQUxfQ1RSTF9SRUcJCTB4MQotI2RlZmluZSBNVl9FNjE3MV9TV0lUQ0hfUE9SVF9DVFJMX1JFRwkJICAgIDB4NAorI2RlZmluZSBNVl9FNjE3MV9QUk9EVUNUX05VTQkJCQkJMHgxNzEKKyNkZWZpbmUgTVZfRTYxNzZfUFJPRFVDVF9OVU0JCQkJCTB4MTc2CisjZGVmaW5lIE1WX0U2MTcxX01BWF9QT1JUU19OVU0JCQkJCTcKKy8qIFBIWSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVZfRTYxNzFfU0VSREVTX1JFRwkJCQkJMHhmCisjZGVmaW5lIE1WX0U2MTcxX1NFUkRFU19DT05UUk9MX1JFRwkJCQkweDAKKyNkZWZpbmUgTVZfRTYxNzFfUEFHRV9SRUcJCQkJCTB4MTYKKyNkZWZpbmUgTVZfRTYxNzFfU1dJVENIX1BISVlTSUNBTF9DVFJMX1JFRwkJCTB4MQorLyogUG9ydCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVZfRTYxNzFfTEVEX0NPTlRST0wJCQkJCTB4MTYKKyNkZWZpbmUgTVZfRTYxNzFfR0xPQkFMXzJfUkVHX0RFVl9BRERSCQkJCTB4MUMKKy8qIFNNSSByZWdpc3RlcnMgKi8KICNkZWZpbmUgTVZfRTYxNzFfU01JX1BIWV9DT01NQU5ECQkJCTB4MTgKICNkZWZpbmUgTVZfRTYxNzFfU01JX1BIWV9EQVRBCQkJCQkweDE5Ci0jZGVmaW5lIE1WX0U2MTcxX0dMT0JBTF8yX1JFR19ERVZfQUREUgkJCTB4MUMKLSNkZWZpbmUgTVZfRTYxNzFfTUFYX1BPUlRTX05VTQkJCQkJNwotI2RlZmluZSBNVl9FNjE3MV9FTkFCTEVEX1BPUlRTCQkJCQkoKDEgPDwgMCl8KDEgPDwgMSl8KDEgPDwgMil8KDEgPDwgMyl8KDEgPDwgNCl8KDEgPDwgNikpCi0jZGVmaW5lIEU2MTcxX1BIWV9USU1FT1VUCQkJCQkgICAgMTAwMDAKLSNkZWZpbmUgRTYxNzFfUEhZX1NNSV9CVVNZX0JJVAkJICAgIAkJMTUgIC8qIEJ1c3kgKi8KLSNkZWZpbmUgRTYxNzFfUEhZX1NNSV9CVVNZX01BU0sJCSAgICAJCSgxIDw8IEVUSF9QSFlfU01JX0JVU1lfQklUKQorI2RlZmluZSBFNjE3MV9QSFlfU01JX0JVU1lfQklUCQkgICAgCQkJMTUgIC8qIEJ1c3kgKi8KKyNkZWZpbmUgRTYxNzFfUEhZX1NNSV9CVVNZX01BU0sJCQkJCSgxIDw8IEU2MTcxX1BIWV9TTUlfQlVTWV9CSVQpCisjZGVmaW5lIEU2MTcxX1BIWV9USU1FT1VUCQkJCQkxMDAwMAorI2RlZmluZSBNVl9FNjE3MV9FTkFCTEVEX1BPUlRTCQkJCQkoKDEgPDwgMCl8KDEgPDwgMSl8KDEgPDwgMil8KDEgPDwgMyl8KDEgPDwgNCl8KDEgPDwgNSl8KDEgPDwgNikpCisKKy8qIEU2MTcyIHJlbGF0ZWQgKi8KKyNkZWZpbmUgTVZfRTYxNzJfUFJPRFVDVF9OVU0JCQkJCTB4MTcyCisjZGVmaW5lIE1WX0U2MTcyX0NQVV9QT1JUCQkJCQkweDYKKyNkZWZpbmUgTVZfRTYxNzJfUE9SVFNfT0ZGU0VUCQkJCQkweDEwCisjZGVmaW5lIE1WX0U2MTcyX1NXSVRDSF9QSElZU0lDQUxfQ1RSTF9SRUcJCQkweDEKKyNkZWZpbmUgTVZfRTYxNzJfU1dJVENIX1BPUlRfQ1RSTF9SRUcJCQkJMHg0CisjZGVmaW5lIE1WX0U2MTcyX1NNSV9QSFlfQ09NTUFORAkJCQkweDE4CisjZGVmaW5lIE1WX0U2MTcyX1NNSV9QSFlfREFUQQkJCQkJMHgxOQorI2RlZmluZSBNVl9FNjE3Ml9HTE9CQUxfMl9SRUdfREVWX0FERFIJCQkJMHgxQworI2RlZmluZSBNVl9FNjE3Ml9NQVhfUE9SVFNfTlVNCQkJCQk3CisjZGVmaW5lIE1WX0U2MTcyX0VOQUJMRURfUE9SVFMJCQkJCSgoMSA8PCAwKXwoMSA8PCAxKXwoMSA8PCAyKXwoMSA8PCAzKXwoMSA8PCA0KXwoMSA8PCA2KSkKKyNkZWZpbmUgRTYxNzJfUEhZX1RJTUVPVVQJCQkJCTEwMDAwCisjZGVmaW5lIEU2MTcyX1BIWV9TTUlfQlVTWV9CSVQJCQkJCTE1ICAvKiBCdXN5ICovCisjZGVmaW5lIEU2MTcyX1BIWV9TTUlfQlVTWV9NQVNLCQkJCQkoMSA8PCBFNjE3Ml9QSFlfU01JX0JVU1lfQklUKQogCiAvKiBBcm1hZGEgMzcwIGludGVybmFsIHJlbGF0ZWQgKi8KICNkZWZpbmUgTVZfU1dfQ1BVX1BPUlQJCQkJCQkJMHg2CkBAIC0xNTUsNCArMTc2LDkxIEBACiAjZGVmaW5lIE1WX0FMUF9TV19QT1JUU19PRkZTRVQJCQkJCTB4MTAKICNkZWZpbmUgTVZfQUxQX1NXX01BWF9QT1JUU19OVU0JCQkJCTcKIAorLyogU3RhcnQgYWRkcmVzcyBvZiBwb3J0cyByZWxhdGVkIHJlZ2lzdGVyLiAgICAgICAgICAgICAqLworI2RlZmluZSBQT1JUX1JFR1NfU1RBUlRfQUREUiAgICAgICAgMHg4CisjZGVmaW5lIFBPUlRfUkVHU19TVEFSVF9BRERSXzhQT1JUICAgIDB4MTAKKworI2RlZmluZSBRRF9TTUlfQUNDRVNTX0xPT1AgICAgICAgIDEwMDAKKyNkZWZpbmUgUURfU01JX1RJTUVPVVQgICAgICAgICAgICAyCisKKy8qIERlZmluaXRpb24gZm9yIE11bHRpIEFkZHJlc3MgTW9kZSAqLworI2RlZmluZSBRRF9SRUdfU01JX0NPTU1BTkQgICAgICAgIDB4MAorI2RlZmluZSBRRF9SRUdfU01JX0RBVEEgICAgICAgICAgICAweDEKKworI2RlZmluZSBRRF9SRUdfU1dJVENIX0lECQkJMHgzCisjZGVmaW5lIFFEX1JFR19TV0lUQ0hfSURfUFJPRFVDVF9OVU1fT0ZGU0VUCTQKKworI2RlZmluZSBRRF9QSFlfQ09OVFJPTF9SRUcJCTAKKyNkZWZpbmUgUURfUEhZX1NQRUNfQ09OVFJPTF9SRUcJCTE2CisKKy8qIEJpdCBEZWZpbml0aW9uIGZvciBRRF9QSFlfQ09OVFJPTF9SRUcgKi8KKyNkZWZpbmUgUURfUEhZX1JFU0VUICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFFEX1BIWV9MT09QQkFDSyAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBRRF9QSFlfU1BFRUQgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgUURfUEhZX0FVVE9ORUdPICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFFEX1BIWV9QT1dFUiAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lIFFEX1BIWV9JU09MQVRFICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgUURfUEhZX1JFU1RBUlRfQVVUT05FR08gICAgICAgIDB4MjAwCisjZGVmaW5lIFFEX1BIWV9EVVBMRVggICAgICAgICAgICAweDEwMAorI2RlZmluZSBRRF9QSFlfU1BFRURfTVNCICAgICAgICAweDQwCisKKy8qIEJpdCBEZWZpbml0aW9uIGZvciBRRF9QSFlfU1BFQ19DT05UUk9MX1JFRyAqLworI2RlZmluZSBRRF9QSFlfTURJX0NST1NTX0FVVE8JCQkJMHg2MAorI2RlZmluZSBRRF9QSFlfRU5FUkdZX0RFVEVDVF9TRU5TRV9QRVJJT0RJQ19UWF9OTFAJMHgzMDAKKyNkZWZpbmUgUURfUEhZX0RPV05TSElGVF9DT1VOVEVSCQkJMHgzMDAwCisKKy8qIEJpdCBEZWZpbml0aW9uIGZvciBNVl9TV0lUQ0hfUEhZU19DT05UUk9MX1JFRyhzd2l0Y2ggcG9ydCAxKSAqLworI2RlZmluZSBRRF9QQ1NfUkdNSUlfUlhfVElNSU5HX09GRlNFVAkJCTE1CisjZGVmaW5lIFFEX1BDU19SR01JSV9UWF9USU1JTkdfT0ZGU0VUCQkJMTQKKyNkZWZpbmUgUURfUENTX0ZMT1dfQ09OVFJPTF9WQUxVRV9PRkZTRVQJCTcKKyNkZWZpbmUgUURfUENTX0ZPUkNFRF9GTE9XX0NPTlRST0xfT0ZGU0VUCQk2CisjZGVmaW5lIFFEX1BDU19MSU5LX1ZBTFVFX09GRlNFVAkJCTUKKyNkZWZpbmUgUURfUENTX0ZPUkNFRF9MSU5LX09GRlNFVAkJCTQKKyNkZWZpbmUgUURfUENTX0RVUExFWF9WQUxVRV9PRkZTRVQJCQkzCisjZGVmaW5lIFFEX1BDU19GT1JDRURfRFVQTEVYX09GRlNFVAkJCTIKKyNkZWZpbmUgUURfUENTX0ZPUkNFX1NQRUVEX09GRlNFVAkJCTAKKworI2RlZmluZSBRRF9QQ1NfUkdNSUlfUlhfVElNSU5HX01BU0sJCQkoMSA8PCBRRF9QQ1NfUkdNSUlfUlhfVElNSU5HX09GRlNFVCkKKyNkZWZpbmUgUURfUENTX1JHTUlJX1RYX1RJTUlOR19NQVNLCQkJKDEgPDwgUURfUENTX1JHTUlJX1RYX1RJTUlOR19PRkZTRVQpCisjZGVmaW5lIFFEX1BDU19GTE9XX0NPTlRST0xfVkFMVUVfTUFTSwkJCSgxIDw8IFFEX1BDU19GTE9XX0NPTlRST0xfVkFMVUVfT0ZGU0VUKQorI2RlZmluZSBRRF9QQ1NfRk9SQ0VEX0ZMT1dfQ09OVFJPTF9NQVNLCQkJKDEgPDwgUURfUENTX0ZPUkNFRF9GTE9XX0NPTlRST0xfT0ZGU0VUKQorI2RlZmluZSBRRF9QQ1NfTElOS19WQUxVRV9NQVNLCQkJCSgxIDw8IFFEX1BDU19MSU5LX1ZBTFVFX09GRlNFVCkKKyNkZWZpbmUgUURfUENTX0ZPUkNFRF9MSU5LX01BU0sJCQkJKDEgPDwgUURfUENTX0ZPUkNFRF9MSU5LX09GRlNFVCkKKyNkZWZpbmUgUURfUENTX0RVUExFWF9WQUxVRV9NQVNLCQkJKDEgPDwgUURfUENTX0RVUExFWF9WQUxVRV9PRkZTRVQpCisjZGVmaW5lIFFEX1BDU19GT1JDRURfRFVQTEVYX01BU0sJCQkoMSA8PCBRRF9QQ1NfRk9SQ0VEX0RVUExFWF9PRkZTRVQpCisKKyNkZWZpbmUgUURfUENTX0ZPUkNFX1NQRUVEXzFHCQkJCSgyIDw8IFFEX1BDU19GT1JDRV9TUEVFRF9PRkZTRVQpCisjZGVmaW5lIFFEX1BDU19GT1JDRV9TUEVFRF9OT1RfRk9SQ0VECQkJKDMgPDwgUURfUENTX0ZPUkNFX1NQRUVEX09GRlNFVCkKKworLyogQml0IERlZmluaXRpb24gZm9yIE1WX1NXSVRDSF9QT1JUX0NPTlRST0xfUkVHKHN3aXRjaCBwb3J0IDQpICovCisjZGVmaW5lIFFEX1BDX1BPUlRfU1RBVEVfT0ZGU0VUCQkJCTAKKyNkZWZpbmUgUURfUENfRUdSRVNTX0ZMT09EU19PRkZTRVQJCQkyCisjZGVmaW5lIFFEX1BDX0lOSVRJQUxfUFJJX09GRlNFVAkJCTQKKyNkZWZpbmUgUURfUENfVkxBTl9UVU5ORUxfT0ZGU0VUCQkJNworCisjZGVmaW5lIFFEX1BDX1BPUlRfU1RBVEVfRk9SV0FSRElORwkJCSgzIDw8IFFEX1BDX1BPUlRfU1RBVEVfT0ZGU0VUKQorI2RlZmluZSBRRF9QQ19FR1JFU1NfRkxPT0RTX0FMTAkJCQkoMyA8PCBRRF9QQ19FR1JFU1NfRkxPT0RTX09GRlNFVCkKKyNkZWZpbmUgUURfUENfSU5JVElBTF9QUklfSVAJCQkJKDIgPDwgUURfUENfSU5JVElBTF9QUklfT0ZGU0VUKQorI2RlZmluZSBRRF9QQ19WTEFOX1RVTk5FTF9CWV9QQVNTCQkJKDEgPDwgUURfUENfVkxBTl9UVU5ORUxfT0ZGU0VUKQorCisKKworCisvKiBCaXQgZGVmaW5pdGlvbiBmb3IgUURfUkVHX1NNSV9DT01NQU5EICovCisjZGVmaW5lIFFEX1NNSV9CVVNZICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBRRF9TTUlfTU9ERSAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgUURfU01JX01PREVfQklUICAgICAgICAgICAgMTIKKyNkZWZpbmUgUURfU01JX09QX0JJVCAgICAgICAgICAgIDEwCisjZGVmaW5lIFFEX1NNSV9PUF9TSVpFICAgICAgICAgICAgMgorI2RlZmluZSBRRF9TTUlfREVWX0FERFJfQklUICAgICAgICA1CisjZGVmaW5lIFFEX1NNSV9ERVZfQUREUl9TSVpFICAgIDUKKyNkZWZpbmUgUURfU01JX1JFR19BRERSX0JJVCAgICAgICAgMAorI2RlZmluZSBRRF9TTUlfUkVHX0FERFJfU0laRSAgICA1CisKKyNkZWZpbmUgUURfU01JX0NMQVVTRTQ1ICAgICAgICAgICAgMAorI2RlZmluZSBRRF9TTUlfQ0xBVVNFMjIgICAgICAgICAgICAxCisKKyNkZWZpbmUgUURfU01JX1dSSVRFICAgICAgICAgICAgMHgwMQorI2RlZmluZSBRRF9TTUlfUkVBRCAgICAgICAgICAgICAgICAweDAyCisKICNlbmRpZiAvKiBfX0lOQ2V0aHN3aXRjaHJlZ3NoICovCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9jbWQuYyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X2NtZC5jCmluZGV4IGZjOTAwM2EuLjk2NjEwZDEgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X2NtZC5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X2NtZC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAiY3RybEVudi9tdkN0cmxFbnZMaWIuaCIKICNpbmNsdWRlICJib2FyZEVudi9tdkJvYXJkRW52TGliLmgiCiAjaW5jbHVkZSAiY3B1L212Q3B1LmgiCisjaW5jbHVkZSAiY3RybEVudi9zeXMvbXZBaGJUb01idXNSZWdzLmgiCiAKICNpZiBkZWZpbmVkKE1WX0lOQ19CT0FSRF9OT1JfRkxBU0gpCiAjaW5jbHVkZSAibm9yZmxhc2gvbXZGbGFzaC5oIgpAQCAtOTkyLDcgKzk5Myw2IEBACiAKIAlyZXR1cm4gMTsKIH0KLQogVV9CT09UX0NNRCgKIAlwaHlXcml0ZSwgICAgICA0LCAgICAgNCwgICAgICBwaHlfd3JpdGVfY21kLAogCSJwaHlXcml0ZQktIFdyaXRlIFBoeSByZWdpc3RlclxuIiwKQEAgLTEwMDIsNyArMTAwMiw2IEBACiAKICNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1dJVENIKQogI2luY2x1ZGUgImV0aFN3aXRjaC9tdlN3aXRjaC5oIgotCiBpbnQgc3dpdGNoX3JlYWRfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKIHsKIAlNVl9VMTYgcGh5UmVnOwpAQCAtMTAzOSw2ICsxMDM4LDcgQEAKIAkiXHRXcml0ZSB0byB0aGUgc3dpdGNoIHJlZ2lzdGVyLlxuIgogKTsKIAorCiBpbnQgc3dpdGNoX3BoeV9yZWFkX2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCiB7CiAJTVZfVTE2IHBoeVJlZzsKQEAgLTExMTUsNyArMTExNSwxNDQgQEAKIAkiIE1BQ19Qb3J0LiBcbiIKIAkiXHRSZWFkIHRoZSBzd2l0Y2ggcG9ydHMgY291bnRlcnMuIFxuIgogKTsKLSNlbmRpZgorI2VsaWYgZGVmaW5lZChNVl9TV0lUQ0hfQUREUkVTU19DT01QTEVUSU9OKSAvKiBNVl9JTkNMVURFX1NXSVRDSCAqLworCisjZGVmaW5lIFNXSVRDSF9SRUdTX0JBU0VfQUREUl9NQVNLCQkweEZDMDAwMDAwCisjZGVmaW5lIFNXSVRDSF9BRERSX0NPTVBMX01TQl9WQUwoYWRkcikJKChhZGRyID4+IDI0KSAmIDB4RkYpCisjZGVmaW5lIFNXSVRDSF9BRERSX0NPTVBMX1NISUZUKGFkZHIpCSgoKGFkZHIgPj4gMjQpICYgMHgzKSA8PCAzKQorI2RlZmluZSBTV0lUQ0hfQlVTX0FERFIoYWRkcikJCQkoKH5TV0lUQ0hfUkVHU19CQVNFX0FERFJfTUFTSyAmIGFkZHIpIHxcCisJCQkJCQkJKFNXSVRDSF9XSU5fQkFTRV9BRERSX0dFVCgpICYgU1dJVENIX1JFR1NfQkFTRV9BRERSX01BU0spKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTV0lUQ0hfV0lOX0JBU0VfQUREUl9HRVQKKyoKKyogREVTQ1JJUFRJT046CisqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYmFzZSBhZGRyZXNzIG9mIHN3aXRjaCByZWdpc3RlcnMgd2luZG93CisqCisqCisqIFJFVFVSTjoKKyoJYmFzZSBhZGRyZXNzIG9mIHN3aXRjaCByZWdpc3RlcnMgd2luZG93CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIF9faW5saW5lIE1WX1UzMiBTV0lUQ0hfV0lOX0JBU0VfQUREUl9HRVQoTVZfVk9JRCkKK3sKKwlzdGF0aWMgTVZfVTMyCWJhc2VBZGRyOworCWJhc2VBZGRyID0gTVZfUkVHX1JFQUQoQUhCX1RPX01CVVNfV0lOX0JBU0VfUkVHKFNXSVRDSF9XSU5fSUQpKTsKKwlyZXR1cm4gYmFzZUFkZHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNXSVRDSF9BRERSX0NPTVBMX1NFVAorKgorKiBERVNDUklQVElPTjoKKyogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIGFkZHJlc3MgY29tcGxldGlvbiByZWdpc3RlcgorKgorKiBJTlBVVDoKKyoJYWRkcgktIHRoZSBhZGRyZXNzIHRvIGFjY2VzcyBpbmRpcmVjdGx5CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIF9faW5saW5lIE1WX1NUQVRVUyBTV0lUQ0hfQUREUl9DT01QTF9TRVQoTVZfVTMyIGFkZHIpCit7CisJTVZfVTMyCXJWYWw7CisJLyogQ29uZmlndXJlIGFkZHJlc3MgY29tcGxldGlvbiByZWdpb24gUkVHIHVzaW5nIFNFUkRFUyBtZW1vcnkgd2luZG93ICovCisJclZhbCAgPSBNVl9NRU1JTzMyX1JFQUQoU1dJVENIX1dJTl9CQVNFX0FERFJfR0VUKCkpOworCXJWYWwgJj0gfigweEZGIDw8IFNXSVRDSF9BRERSX0NPTVBMX1NISUZUKGFkZHIpKTsKKwlyVmFsIHw9IFNXSVRDSF9BRERSX0NPTVBMX01TQl9WQUwoYWRkcikgPDwgU1dJVENIX0FERFJfQ09NUExfU0hJRlQoYWRkcik7CisJTVZfTUVNSU8zMl9XUklURShTV0lUQ0hfV0lOX0JBU0VfQUREUl9HRVQoKSwgclZhbCk7CisJcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdlN3aXRjaFJlZ2lzdGVyR2V0CisqCisqIERFU0NSSVBUSU9OOgorKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHN3aXRjaCByZWdpc3RlciB3aXRoIGFkZHJlc3MgY29tcGxldGlvbgorKgorKiBJTlBVVDoKKyoJYWRkcmVzcwkJLSB0aGUgYWRkcmVzcyB0byByZWFkIGluZGlyZWN0bHkKKyoJbWFzawkJLSBtYXNrIG9mIHRoZSByZWFkIGRhdGEKKyoKKyogT1VUUFVUOgorKglkYXRhCQktIHRoZSByZWdpc3RlcidzIGRhdGEgdmFsdWUKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG12U3dpdGNoUmVnaXN0ZXJHZXQoTVZfVTMyIGFkZHJlc3MsIE1WX1UzMiAqZGF0YSwgTVZfVTMyIG1hc2spCit7CisJU1dJVENIX0FERFJfQ09NUExfU0VUKGFkZHJlc3MpOyAvKiBPbmx5IE1TQiBpcyBpbXBvcnRhbnQsIHNlcmRlcyBudW1iZXIgb2Zmc2V0IGRvZXMgbm90IG1hdHRlciAqLworCSpkYXRhICA9IE1WX01FTUlPMzJfUkVBRChTV0lUQ0hfQlVTX0FERFIoYWRkcmVzcykpICYgbWFzazsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc3dpdGNoUmVnUmVhZAorKgorKiBERVNDUklQVElPTjoKKyogVGhpcyBjb21tYW5kIHJlYWRzIHN3aXRjaCByZWdpc3RlciB3aXRoIGFkZHJlc3MgY29tcGxldGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBzd2l0Y2hfcmVhZF9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoreworCU1WX1UzMiByZWdWYWw7CisKKwltdlN3aXRjaFJlZ2lzdGVyR2V0KHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KSwgJnJlZ1ZhbCwgMHhGRkZGKTsKKwlwcmludGYgKCIweCV4XG4iLCByZWdWYWwpOworCisJcmV0dXJuIDE7Cit9CitVX0JPT1RfQ01EKAorCXN3aXRjaFJlZ1JlYWQsICAgICAgMiwgICAgIDIsICAgICAgc3dpdGNoX3JlYWRfY21kLAorInN3aXRjaFJlZ1JlYWQJLSBSZWFkIHN3aXRjaCByZWdpc3RlciwgdXNpbmcgQWRkcmVzcyBjb21wbGV0aW9uXG4iLAorIiBSZWdfb2Zmc2V0LiBcbiIKKyJcdFJlYWQgdGhlIHN3aXRjaCByZWdpc3RlciwgdXNpbmcgQWRkcmVzcyBjb21wbGV0aW9uLiBcbiIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12U3dpdGNoUmVnaXN0ZXJTZXQKKyoKKyogREVTQ1JJUFRJT046CisqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRvIHN3aXRjaCByZWdpc3RlciB3aXRoIGFkZHJlc3MgY29tcGxldGlvbgorKgorKglhZGRyZXNzCQktIHRoZSBhZGRyZXNzIHRvIHdyaXRlIHRvIGluZGlyZWN0bHkKKyoJZGF0YQkJLSB0aGUgZGF0YSB0byB3cml0ZQorKgltYXNrCQktIG1hc2sgb2YgdGhlIHdyaXRlIGRhdGEKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG12U3dpdGNoUmVnaXN0ZXJTZXQoTVZfVTMyIGFkZHJlc3MsIE1WX1UzMiBkYXRhLCBNVl9VMzIgbWFzaykKK3sKKwlNVl9VMzIgcmVnRGF0YTsKKworCWlmICgobWFzayAmIDB4RkZGRikgIT0gMHhGRkZGKSB7IC8qIHNpbmNlIHN3aXRjaCByZWdpc3RlcnMgYXJlIDE2IGJpdHMgLSBjaGVjayBvbmx5IHRoZSByZWxldmFudCBiaXRzICovCisJCW12U3dpdGNoUmVnaXN0ZXJHZXQoYWRkcmVzcywgJnJlZ0RhdGEsIH5tYXNrKTsKKwkJcmVnRGF0YSB8PSAoZGF0YSAmIG1hc2spOworCX0gZWxzZQorCQlyZWdEYXRhID0gZGF0YTsKKworCVNXSVRDSF9BRERSX0NPTVBMX1NFVChhZGRyZXNzKTsgLyogT25seSBNU0IgaXMgaW1wb3J0YW50LCBzZXJkZXMgbnVtYmVyIG9mZnNldCBkb2VzIG5vdCBtYXR0ZXIgKi8KKworCU1WX01FTUlPMzJfV1JJVEUoU1dJVENIX0JVU19BRERSKGFkZHJlc3MpLCByZWdEYXRhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc3dpdGNoUmVnV3JpdGUKKyoKKyogREVTQ1JJUFRJT046CisqIFRoaXMgY29tbWFuZCB3cml0ZXMgdG8gc3dpdGNoIHJlZ2lzdGVyIHdpdGggYWRkcmVzcyBjb21wbGV0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHN3aXRjaF93cml0ZV9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoreworCW12U3dpdGNoUmVnaXN0ZXJTZXQoc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpLCBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNiksIDB4RkZGRik7CisKKwlyZXR1cm4gMTsKK30KKworVV9CT09UX0NNRCgKKwlzd2l0Y2hSZWdXcml0ZSwgICAgICAzLCAgICAgMywgICAgICBzd2l0Y2hfd3JpdGVfY21kLAorInN3aXRjaFJlZ1dyaXRlCS0gV3JpdGUgdG8gc3dpdGNoIHJlZ2lzdGVyLCB1c2luZyBBZGRyZXNzIGNvbXBsZXRpb25cbiIsCisiIFJlZ19vZmZzZXQgUmVnX2RhdGEuIFxuIgorIlx0V3JpdGUgdG8gdGhlIHN3aXRjaCByZWdpc3RlciwgdXNpbmcgQWRkcmVzcyBjb21wbGV0aW9uLiBcbiIKKyk7CisjZW5kaWYgLyogTVZfU1dJVENIX0FERFJFU1NfQ09NUExFVElPTiAqLwogI2VuZGlmIC8qICNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfR0lHX0VUSCkgKi8KIAogI2RlZmluZSBSRUdfU0RSQU1fQ09ORklHX0FERFIJCQkJCTB4MTQwMApAQCAtMTEyMyw2ICsxMjYwLDggQEAKICNkZWZpbmUgUkVHX1JFQURfREFUQV9TQU1QTEVfREVMQVlTX0FERFIJCTB4MTUzOAogI2RlZmluZSBSRUdfUkVBRF9EQVRBX1JFQURZX0RFTEFZU19BRERSCQkJMHgxNTNDCiAjZGVmaW5lIFJFR19QSFlfUkVHSVNUUllfRklMRV9BQ0NFU1NfQUREUgkJMHgxNkEwCisjZGVmaW5lIFJFR19QSFlfREFUQQkJMAorI2RlZmluZSBSRUdfUEhZX0NUUkwJCTEKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDYXRlZ29yeSAgICAgLSBERFIzIFRyYWluaW5nCkBAIC0xMTMwLDEzICsxMjY5LDEzIEBACiAqIE5lZWQgbW9kaWZpY2F0aW9ucyAoWWVzL05vKSAtIG5vCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBNVl9ERFJfVFJBSU5JTkdfQ01EX05FV19USVAKLXVuc2lnbmVkIGludCB0cmFpbmluZ1JlYWRQaHlSZWcoaW50IHVpUmVnQWRkciwgaW50IHVpUHVwKQordW5zaWduZWQgaW50IHRyYWluaW5nUmVhZFBoeVJlZyhpbnQgdWlSZWdBZGRyLCBpbnQgdWlQdXAsIGludCB0eXBlKQogewogCXVuc2lnbmVkIGludCB1aVJlZzsKICAgICB1bnNpZ25lZCBpbnQgYWRkckxvdyA9IDB4M0YgJiB1aVJlZ0FkZHI7CiAgICAgdW5zaWduZWQgaW50IGFkZHJIaSA9ICgoMHhDMCAmIHVpUmVnQWRkcikgPj4gNik7CiAKLQl1aVJlZyA9ICgxIDw8IDMxKSArICh1aVB1cCA8PCAyMikgKyAoYWRkckhpIDw8IDI4KSArIChhZGRyTG93IDw8IDE2KTsKKwl1aVJlZyA9ICgxIDw8IDMxKSArICh1aVB1cCA8PCAyMikgKyAodHlwZSA8PCAyNikgKyAoYWRkckhpIDw8IDI4KSArIChhZGRyTG93IDw8IDE2KTsKIAlNVl9SRUdfV1JJVEUoUkVHX1BIWV9SRUdJU1RSWV9GSUxFX0FDQ0VTU19BRERSLHVpUmVnJjB4N0ZGRkZGRkYpOwogCU1WX1JFR19XUklURShSRUdfUEhZX1JFR0lTVFJZX0ZJTEVfQUNDRVNTX0FERFIsdWlSZWcpOwogCkBAIC0xMTY2LDcgKzEzMDUsNyBAQAogCQkJcHJpbnRmKCJDUzogJWQgXG4iLCB1aUNzKTsKIAkJCWZvcih1aVB1cCA9IDA7IHVpUHVwIDwgdWlQdXBOdW07IHVpUHVwKyspIHsKIAotCQkJCXVpUmVnID0gdHJhaW5pbmdSZWFkUGh5UmVnKDAgKyB1aUNzKjQsdWlQdXApOworCQkJCXVpUmVnID0gdHJhaW5pbmdSZWFkUGh5UmVnKDAgKyB1aUNzKjQsdWlQdXAsIFJFR19QSFlfREFUQSk7CiAJCQkJdWlQaGFzZSA9ICh1aVJlZyA+PiA2KSAmIDB4NzsKIAkJCQl1aURlbGF5ID0gdWlSZWcgJiAweDFGOwogCQkJCXByaW50ZigiV3JpdGUgTGV2ZWxpbmc6IFBVUDogJWQsIFBoYXNlOiAlZCwgRGVsYXk6ICVkXG4iLHVpUHVwLHVpUGhhc2UsdWlEZWxheSk7CkBAIC0xMTc0LDcgKzEzMTMsNyBAQAogCiAJCQlmb3IgKHVpUHVwID0gMDsgdWlQdXAgPCB1aVB1cE51bTsgdWlQdXArKykgewogCi0JCQkJdWlSZWcgPSB0cmFpbmluZ1JlYWRQaHlSZWcoMiArIHVpQ3MqNCx1aVB1cCk7CisJCQkJdWlSZWcgPSB0cmFpbmluZ1JlYWRQaHlSZWcoMiArIHVpQ3MqNCx1aVB1cCwgUkVHX1BIWV9EQVRBKTsKIAkJCQl1aVBoYXNlID0gKHVpUmVnID4+IDYpICYgMHg3OwogCQkJCXVpRGVsYXkgPSB1aVJlZyAmIDB4MUY7CiAJCQkJcHJpbnRmKCJSZWFkIExldmVsaW5nOiBQVVA6ICVkLCBQaGFzZTogJWQsIERlbGF5OiAlZFxuIix1aVB1cCwgdWlQaGFzZSwgdWlEZWxheSk7CkBAIC0xMTkyLDcgKzEzMzEsNyBAQAogCQkJCQkJaWYgKHVpRHEgPT0gOSkKIAkJCQkJCQl1aURxKys7CiAKLQkJCQkJCXVpUmVnID0gdHJhaW5pbmdSZWFkUGh5UmVnKDB4MTArdWlEcSt1aUNzKjB4MTIsdWlQdXApOworCQkJCQkJdWlSZWcgPSB0cmFpbmluZ1JlYWRQaHlSZWcoMHgxMCt1aURxK3VpQ3MqMHgxMix1aVB1cCwgUkVHX1BIWV9EQVRBKTsKIAkJCQkJCXVpRGVsYXkgPSB1aVJlZyAmIDB4MUY7CiAKIAkJCQkJCWlmICh1aURxID09IDApCkBAIC0xMjAzLDcgKzEzNDIsNyBAQAogCQkJCX0KIAkJCQlmb3IodWlQdXA9MDsgdWlQdXAgPCB1aVB1cE51bTsgdWlQdXArKykgewogCQkJCQlmb3IodWlEcSA9IDA7IHVpRHEgPCA5OyB1aURxKyspIHsKLQkJCQkJCXVpUmVnID0gdHJhaW5pbmdSZWFkUGh5UmVnKDB4NTArdWlEcSt1aUNzKjB4MTIsdWlQdXApOworCQkJCQkJdWlSZWcgPSB0cmFpbmluZ1JlYWRQaHlSZWcoMHg1MCt1aURxK3VpQ3MqMHgxMix1aVB1cCwgUkVHX1BIWV9EQVRBKTsKIAkJCQkJCXVpRGVsYXkgPSB1aVJlZyAmIDB4MUY7CiAKIAkJCQkJCWlmICh1aURxID09IDApCkBAIC0xMjE3LDcgKzEzNTYsNyBAQAogCQkJLypSZWFkIENlbnRyYWxpemF0aW9uIHdpbmRvd3Mgc2l6ZXMgZm9yIFNjcmF0Y2ggUEhZIHJlZ2lzdGVycyovCiAJCQlmb3IodWlQdXAgPSAwOyB1aVB1cCA8IHVpUHVwTnVtOyB1aVB1cCsrKQogCQkJewotCQkJCXVpUmVnID0gdHJhaW5pbmdSZWFkUGh5UmVnKDB4QzArdWlDcyx1aVB1cCk7CisJCQkJdWlSZWcgPSB0cmFpbmluZ1JlYWRQaHlSZWcoMHhDMCt1aUNzLHVpUHVwLCBSRUdfUEhZX0RBVEEpOwogCQkJCXVpQ2VudHJhbFJ4UmVzID0gdWlSZWcgPj4gNTsKIAkJCQl1aUNlbnRyYWxUeFJlcyA9IHVpUmVnICYgMHgxRjsKIAkJCQlwcmludGYoIkNlbnRyYWwgd2luZG93IHNpemUgZm9yIFBVUCAlZCBpcyAlZChSWCkgYW5kICVkKFRYKVxuIiwgdWlQdXAsIHVpQ2VudHJhbFJ4UmVzLCB1aUNlbnRyYWxUeFJlcyk7CkBAIC0xMzc4LDExICsxNTE3LDMxIEBACiAqIEZ1bmN0aW9uYWxpdHktIFRoZSBjb21tYW5kcyBwcmludHMgdGhlIHJvdyBkYXRhIG9mIHN0YWJpbGl0eSByZXN1bHRzIGZvciBERFIzIFRyYWluaW5nCiAqIE5lZWQgbW9kaWZpY2F0aW9ucyAoWWVzL05vKSAtIG5vCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1UzMiBkbWluUGh5UmVnVGFibGVbMjBdWzJdID0geworCQkJCQl7MAksMHhDMH0sCisJCQkJCXswCSwweEMxfSwKKwkJCQkJezAJLDB4QzJ9LAorCQkJCQl7MAksMHhDM30sCisJCQkJCXswCSwweEM0fSwKKwkJCQkJezEJLDB4QzB9LAorCQkJCQl7MQksMHhDMX0sCisJCQkJCXsxCSwweEMyfSwKKwkJCQkJezEJLDB4QzN9LAorCQkJCQl7MQksMHhDNH0sCisJCQkJCXsyCSwweEMwfSwKKwkJCQkJezIJLDB4QzF9LAorCQkJCQl7MgksMHhDMn0sCisJCQkJCXsyCSwweEMzfSwKKwkJCQkJezIJLDB4QzR9LAorCQkJCQl7MAksMHhDNX0sCisJCQkJCXsxCSwweEM1fSwKKwkJCQkJezIJLDB4QzV9LAorCQkJCQl7MAksMHhDNn0sCisJCQkJCXsxCSwweEM2fX07CiBpbnQgdHJhaW5pbmdTdGFiaWxpdHlfY21kKCBjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10gKQogewotCU1WX1UzMiB1aUNzRW5hLCBpbnRlcmZhY2VJZD0wLGNzaW5kZXggPSAwLGJ1c0lkPTAscGFkSW5kZXg9MDsKLQlNVl9VMzIgcmVnRGF0YTsKLQlNVl9VMzIgcmVhZERhdGE7CisJTVZfVTMyIHVpQ3NFbmEsIGludGVyZmFjZUlkPTAsIGNzaW5kZXggPSAwLGJ1c0lkPTAsIHBhZEluZGV4PTA7CisJTVZfVTMyIHJlZ0RhdGEsIHJlZ0RhdGExOwogCiAJdWlDc0VuYSA9IE1WX1JFR19SRUFEKFJFR19ERFIzX1JBTktfQ1RSTF9BRERSKSAmIDB4RjsKIApAQCAtMTQyNSwxMiArMTU4NCwxMiBAQAogCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDwgMTsgaW50ZXJmYWNlSWQrKykKIAl7CiAJCXByaW50ZigiRGF0YTogJWQsJWQsIixpbnRlcmZhY2VJZCxtdkN0cmxHZXRKdW5jVGVtcCgpKTsvL2FkZCBKdW5jdGlvbiBUZW1wZXJhdHVyZQotCQlyZWFkRGF0YSA9IE1WX1JFR19SRUFEKDB4MTRDOCk7Ci0JCXByaW50ZigiJWQsJWQsIiwoKHJlYWREYXRhJjB4M0YwKT4+NCksKChyZWFkRGF0YSYweEZDMDApPj4xMCkpOwotCQlyZWFkRGF0YSA9IE1WX1JFR19SRUFEKDB4MTdDOCk7Ci0JCXByaW50ZigiJWQsJWQsIiwoKHJlYWREYXRhJjB4M0YwKT4+NCksKChyZWFkRGF0YSYweEZDMDApPj4xMCkpOwotCQlyZWFkRGF0YSA9IE1WX1JFR19SRUFEKDB4MURDOCk7Ci0JCXByaW50ZigiJWQsJWQsIiwoKHJlYWREYXRhJjB4M0YwMDAwKT4+MTYpLCgocmVhZERhdGEmMHhGQzAwMDAwKT4+MjIpKTsKKwkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKDB4MTRDOCk7CisJCXByaW50ZigiJWQsJWQsIiwoKHJlZ0RhdGEmMHgzRjApPj40KSwoKHJlZ0RhdGEmMHhGQzAwKT4+MTApKTsKKwkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKDB4MTdDOCk7CisJCXByaW50ZigiJWQsJWQsIiwoKHJlZ0RhdGEmMHgzRjApPj40KSwoKHJlZ0RhdGEmMHhGQzAwKT4+MTApKTsKKwkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKDB4MURDOCk7CisJCXByaW50ZigiJWQsJWQsIiwoKHJlZ0RhdGEmMHgzRjAwMDApPj4xNiksKChyZWdEYXRhJjB4RkMwMDAwMCk+PjIyKSk7CiAJCWZvcihjc2luZGV4ID0gMDsgY3NpbmRleCA8IDQ7IGNzaW5kZXgrKykKIAkJewogCQkJaWYgKCEodWlDc0VuYSAmICgxIDw8IGNzaW5kZXgpKSkgY29udGludWU7CkBAIC0xNDM4LDQ4ICsxNTk3LDUyIEBACiAJCQlmb3IoYnVzSWQgPSAwOyBidXNJZCA8NTsgYnVzSWQrKykKIAkJCXsKIAkJCQkjaWZkZWYgQ09ORklHX0REUjMvKkREUjMqLwotCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoUkVTVUxUX0RCX1BIWV9SRUdfQUREUitjc2luZGV4LGJ1c0lkKTsKKwkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFJFU1VMVF9EQl9QSFlfUkVHX0FERFIrY3NpbmRleCxidXNJZCwgUkVHX1BIWV9EQVRBKTsKIAkJCQlwcmludGYoIiVkLCVkLCIsKHJlZ0RhdGEmMHgxRiksKChyZWdEYXRhJjB4M0UwKT4+NSkpOwogCQkJCSNlbHNlLypERFI0Ki8KLQkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFJFU1VMVF9EQl9QSFlfUkVHX0FERFIrY3NpbmRleCxidXNJZCk7Ci0JCQkJcHJpbnRmKCIlZCwlZCwiLChyZWdEYXRhJjB4MUYpKjQsMiooKHJlZ0RhdGEmMHhGRkUwKT4+NSkpOwotCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoUkVTVUxUX0RCX1BIWV9SRUdfQUREUitjc2luZGV4ICsgNCxidXNJZCk7Ci0JCQkJcHJpbnRmKCIlZCwlZCwiLChyZWdEYXRhJjB4MUYpKjQsMiooKHJlZ0RhdGEmMHhGRkUwKT4+NSkpOworCQkJCS8qRG1pblR4LCBhcmVhVFgqLworCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoUkVTVUxUX0RCX1BIWV9SRUdfQUREUitjc2luZGV4LGJ1c0lkLCBSRUdfUEhZX0RBVEEpOworCQkJCXJlZ0RhdGExID0gdHJhaW5pbmdSZWFkUGh5UmVnKGRtaW5QaHlSZWdUYWJsZVtjc2luZGV4KjUrYnVzSWRdWzFdLGRtaW5QaHlSZWdUYWJsZVtjc2luZGV4KjUrYnVzSWRdWzBdLCBSRUdfUEhZX0NUUkwpOworCQkJCXByaW50ZigiJWQsJWQsIiwyKihyZWdEYXRhMSYweEZGKSxyZWdEYXRhKTsKKwkJCQkvKkRtaW5SeCwgYXJlYVJYKi8KKwkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFJFU1VMVF9EQl9QSFlfUkVHX0FERFIrY3NpbmRleCs0LGJ1c0lkLCBSRUdfUEhZX0RBVEEpOworCQkJCXJlZ0RhdGExID0gdHJhaW5pbmdSZWFkUGh5UmVnKGRtaW5QaHlSZWdUYWJsZVtjc2luZGV4KjUrYnVzSWRdWzFdLGRtaW5QaHlSZWdUYWJsZVtjc2luZGV4KjUrYnVzSWRdWzBdLCBSRUdfUEhZX0NUUkwpOworCQkJCXByaW50ZigiJWQsJWQsIiwyKihyZWdEYXRhMT4+OCkscmVnRGF0YSk7CiAJCQkJI2VuZGlmCiAJCQkJLypXTCovCi0JCQkJcmVnRGF0YSA9IHRyYWluaW5nUmVhZFBoeVJlZyhXTF9QSFlfUkVHK2NzaW5kZXgqNCxidXNJZCk7CisJCQkJcmVnRGF0YSA9IHRyYWluaW5nUmVhZFBoeVJlZyhXTF9QSFlfUkVHK2NzaW5kZXgqNCxidXNJZCwgUkVHX1BIWV9EQVRBKTsKIAkJCQlwcmludGYoIiVkLCVkLCVkLCIsKHJlZ0RhdGEmMHgxRikrKChyZWdEYXRhJjB4MUMwKT4+NikqMzIsKHJlZ0RhdGEmMHgxRiksKHJlZ0RhdGEmMHgxQzApPj42KTsKIAkJCQkvKlJMKi8KLQkJCQlyZWFkRGF0YSA9IE1WX1JFR19SRUFEKFJFR19SRUFEX0RBVEFfU0FNUExFX0RFTEFZU19BRERSKTsKLQkJCQlyZWFkRGF0YSA9IChyZWFkRGF0YSYoMHhGPDwoNCpjc2luZGV4KSkpID4+ICg0KmNzaW5kZXgpOwotCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoUkxfUEhZX1JFRytjc2luZGV4KjQsYnVzSWQpOwotCQkJCXByaW50ZigiJWQsJWQsJWQsJWQsIiwocmVnRGF0YSYweDFGKSsoKHJlZ0RhdGEmMHgxQzApPj42KSozMiArIHJlYWREYXRhKjY0LChyZWdEYXRhJjB4MUYpLCgocmVnRGF0YSYweDFDMCk+PjYpLHJlYWREYXRhKTsKKwkJCQlyZWdEYXRhMSA9IE1WX1JFR19SRUFEKFJFR19SRUFEX0RBVEFfU0FNUExFX0RFTEFZU19BRERSKTsKKwkJCQlyZWdEYXRhMSA9IChyZWdEYXRhMSYoMHhGPDwoNCpjc2luZGV4KSkpID4+ICg0KmNzaW5kZXgpOworCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoUkxfUEhZX1JFRytjc2luZGV4KjQsYnVzSWQsIFJFR19QSFlfREFUQSk7CisJCQkJcHJpbnRmKCIlZCwlZCwlZCwlZCwiLChyZWdEYXRhJjB4MUYpKygocmVnRGF0YSYweDFDMCk+PjYpKjMyICsgcmVnRGF0YTEqNjQsKHJlZ0RhdGEmMHgxRiksKChyZWdEYXRhJjB4MUMwKT4+NikscmVnRGF0YTEpOwogCQkJCS8qQ2VudHJhbGl6YXRpb24qLwotCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoV1JJVEVfQ0VOVFJBTElaQVRJT05fUEhZX1JFRytjc2luZGV4KjQsYnVzSWQpOworCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoV1JJVEVfQ0VOVFJBTElaQVRJT05fUEhZX1JFRytjc2luZGV4KjQsYnVzSWQsIFJFR19QSFlfREFUQSk7CiAJCQkJcHJpbnRmKCIlZCwiLChyZWdEYXRhJjB4M0YpKTsKLQkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFJFQURfQ0VOVFJBTElaQVRJT05fUEhZX1JFRytjc2luZGV4KjQsYnVzSWQpOworCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoUkVBRF9DRU5UUkFMSVpBVElPTl9QSFlfUkVHK2NzaW5kZXgqNCxidXNJZCwgUkVHX1BIWV9EQVRBKTsKIAkJCQlwcmludGYoIiVkLCIsKHJlZ0RhdGEmMHgxRikpOwogCQkJCS8qVnJlZiAqLwotCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoUEFEX0NPTkZJR19QSFlfUkVHK2NzaW5kZXgsYnVzSWQpOworCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoUEFEX0NPTkZJR19QSFlfUkVHK2NzaW5kZXgsYnVzSWQsIFJFR19QSFlfREFUQSk7CiAJCQkJcHJpbnRmKCIlZCwiLChyZWdEYXRhJjB4NykpOwogCQkJCS8qRFFWcmVmKi8KIAkJCQkvKiBOZWVkIHRvIGFkZCB0aGUgUmVhZCBGdW5jdGlvbiBmcm9tIGRldmljZSovCiAJCQkJcHJpbnRmKCIlZCwiLDApOwogCQkJCSNpZm5kZWYgQ09ORklHX0REUjMKLQkJCQlmb3IocGFkSW5kZXggPSAwOyBwYWRJbmRleCA8IDEwOyBwYWRJbmRleCsrKQorCQkJCWZvcihwYWRJbmRleCA9IDA7IHBhZEluZGV4IDwgMTE7IHBhZEluZGV4KyspCiAJCQkJewotCQkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKDB4RDArMTIqY3NpbmRleCtwYWRJbmRleCxidXNJZCk7CisJCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoMHhEMCsxMipjc2luZGV4K3BhZEluZGV4LGJ1c0lkLCBSRUdfUEhZX0RBVEEpOwogCQkJCQlwcmludGYoIiVkLCIsKHJlZ0RhdGEmMHgzRikpOwogCQkJCX0KIAkJCQkjZW5kaWYKLQkJCQlmb3IocGFkSW5kZXggPSAwOyBwYWRJbmRleCA8IDEwOyBwYWRJbmRleCsrKQorCQkJCWZvcihwYWRJbmRleCA9IDA7IHBhZEluZGV4IDwgMTE7IHBhZEluZGV4KyspCiAJCQkJewotCQkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKDB4MTArMTYqY3NpbmRleCtwYWRJbmRleCxidXNJZCk7CisJCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoMHgxMCsxNipjc2luZGV4K3BhZEluZGV4LGJ1c0lkLCBSRUdfUEhZX0RBVEEpOwogCQkJCQlwcmludGYoIiVkLCIsKHJlZ0RhdGEmMHgzRikpOwogCQkJCX0KLQkJCQlmb3IocGFkSW5kZXggPSAwOyBwYWRJbmRleCA8IDEwOyBwYWRJbmRleCsrKQorCQkJCWZvcihwYWRJbmRleCA9IDA7IHBhZEluZGV4IDwgMTE7IHBhZEluZGV4KyspCiAJCQkJewotCQkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKDB4NTArMTYqY3NpbmRleCtwYWRJbmRleCxidXNJZCk7CisJCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoMHg1MCsxNipjc2luZGV4K3BhZEluZGV4LGJ1c0lkLCBSRUdfUEhZX0RBVEEpOwogCQkJCQlwcmludGYoIiVkLCIsKHJlZ0RhdGEmMHgzRikpOwogCQkJCX0KIAkJCX0KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X2VnaWdhX2xlZ2FjeS5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfZWdpZ2FfbGVnYWN5LmMKaW5kZXggMzgyN2IxMi4uMDQwMWExOSAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfZWdpZ2FfbGVnYWN5LmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfZWdpZ2FfbGVnYWN5LmMKQEAgLTE1Myw2ICsxNTMsNyBAQAogCWRldi0+aGFsdCA9ICh2b2lkKiltdkVnaWdhSGFsdDsKIAlkZXYtPnNlbmQgPSAodm9pZCopbXZFZ2lnYVR4OwogCWRldi0+cmVjdiA9ICh2b2lkKiltdkVnaWdhUng7CisJZGV2LT5pbmRleCA9IHBvcnQ7CiAJZGV2LT5wcml2ID0gcHJpdjsKIAlkZXYtPmlvYmFzZSA9IDA7CiAJZGV2LT5wb3J0ID0gcG9ydDsKQEAgLTUxOCw0ICs1MTksNCBAQAogfQogCiAjZW5kaWYgIC8qIGxlZ2FjeSAqLwotI2VuZGlmICAvKiAjaWYgZGVmaW5lZCAoTVZfSU5DTFVERV9HSUdfRVRIKSAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZiAgLyogI2lmIGRlZmluZWQgKE1WX0lOQ0xVREVfR0lHX0VUSCkgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X2VnaWdhX25ldGEuYyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X2VnaWdhX25ldGEuYwppbmRleCA1NTIxNWU1Li4yZWE1MDNkIDEwMDc1NQotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9lZ2lnYV9uZXRhLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfZWdpZ2FfbmV0YS5jCkBAIC0xNjIsNiArMTYyLDcgQEAKIAlkZXYtPnByaXYgPSBwcml2OwogCWRldi0+aW9iYXNlID0gMDsKIAlkZXYtPndyaXRlX2h3YWRkciA9IDA7CisJZGV2LT5pbmRleCA9IHBvcnQ7CiAJcHJpdi0+cG9ydCA9IHBvcnQ7CiAJcHJpdi0+ZGV2SW5pdCA9IE1WX0ZBTFNFOwogCXByaXYtPmRldkVuYWJsZSA9IE1WX0ZBTFNFOwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfZWdpZ2FfcHAyLmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9lZ2lnYV9wcDIuYwppbmRleCBhNzQxOTMwLi4wYTlmOTAzIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9lZ2lnYV9wcDIuYworKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9lZ2lnYV9wcDIuYwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJZWdpZ2FQcml2ICpwcml2ID0gTlVMTDsKIAogCS8qIEZpcnN0IGRpc2FibGUgR01BQyAqLwotCW12R21hY1BvcnREaXNhYmxlKHByaXYtPnBvcnQpOworCW12R21hY1BvcnREaXNhYmxlKHBvcnQpOwogCiAJZGV2ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXRoX2RldmljZSkpOwogCWlmICghZGV2KSB7CkBAIC0yNTksNiArMjU5LDcgQEAKIAlkZXYtPnByaXYgPSBwcml2OwogCWRldi0+aW9iYXNlID0gMDsKIAlkZXYtPndyaXRlX2h3YWRkciA9IDA7CisJZGV2LT5pbmRleCA9IHBvcnQ7CiAJcHJpdi0+cG9ydCA9IHBvcnQ7CiAJcHJpdi0+ZGV2SW5pdCA9IE1WX0ZBTFNFOwogCXByaXYtPmRldkVuYWJsZSA9IE1WX0ZBTFNFOwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfZmR0LmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9mZHQuYwppbmRleCA3YmQwMzUxLi5hZDU3MTQzIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9mZHQuYworKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9mZHQuYwpAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgImxpYmZkdC5oIgogI2luY2x1ZGUgImZkdF9zdXBwb3J0LmgiCiAjaW5jbHVkZSAibXZCb2FyZEVudkxpYi5oIgorI2luY2x1ZGUgImV0aFN3aXRjaC9tdlN3aXRjaFJlZ3MuaCIKKyNpbmNsdWRlICJldGhTd2l0Y2gvbXZTd2l0Y2guaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZmR0X2Vudl9zZXR1cApAQCAtODMsNiArODUsMTIgQEAKIAlpZiAoIWVudikKIAkJc2V0ZW52KCJib290Y21kX2ZkdCIsYm9vdGNtZF9mZHQpOwogCisjaWYgZGVmaW5lZCAoQ09ORklHX09GX0xJQkZEVF9JU19ERUZBVUxUKQorCWVudiA9IGdldGVudigiYm9vdGNtZCIpOworCWlmICghZW52KQorCQlzZXRlbnYoImJvb3RjbWQiLCBib290Y21kX2ZkdCk7CisjZW5kaWYgLyogKENPTkZJR19PRl9MSUJGRFRfSVNfREVGQVVMVCkgKi8KKwogI2lmZGVmIENPTkZJR19HRkNIMTAwCiAJZW52ID0gZ2V0ZW52KCJmZHRjb250aW51ZW9uZXJyb3IiKTsKIAlpZiAoIWVudikKQEAgLTEwMywxMSArMTExLDE5IEBACiBzdGF0aWMgaW50IG12X2ZkdF9maW5kX25vZGUodm9pZCAqZmR0LCBjb25zdCBjaGFyICpuYW1lKTsKIHN0YXRpYyBpbnQgbXZfZmR0X2JvYXJkX2NvbXBhdGlibGVfbmFtZV91cGRhdGUodm9pZCAqZmR0KTsKIHN0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV9zZXJpYWwodm9pZCAqZmR0KTsKKyNpZmRlZiBDT05GSUdfUElDX0dQSU8KIHN0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV9waWNfZ3Bpbyh2b2lkICpmZHQpOworI2VuZGlmCiBzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfY3B1cyh2b2lkICpmZHQpOwogc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3BleCh2b2lkICpmZHQpOworI2lmZGVmIE1WX0lOQ0xVREVfU0FUQQogc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3NhdGEodm9pZCAqZmR0KTsKKyNlbmRpZgorI2lmZGVmIE1WX0lOQ0xVREVfVVNCCiBzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfdXNiKHZvaWQgKmZkdCwgTVZfVU5JVF9JRCB1bml0VHlwZSk7CitzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfdXNiMih2b2lkICpmZHQpOworc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3VzYjModm9pZCAqZmR0KTsKKyNlbmRpZgogc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX2V0aG51bSh2b2lkICpmZHQpOwogc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX2ZsYXNoKHZvaWQgKmZkdCk7CiBzdGF0aWMgaW50IG12X2ZkdF9zZXRfbm9kZV9wcm9wKHZvaWQgKmZkdCwgY29uc3QgY2hhciAqbm9kZSwgY29uc3QgY2hhciAqcHJvcCwgY29uc3QgY2hhciAqcHJvcF92YWwpOwpAQCAtMTE1LDE2ICsxMzEsNzggQEAKIHN0YXRpYyBpbnQgbXZfZmR0X3NjYW5fYW5kX3NldF9hbGlhcyh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFsaWFzKTsKIHN0YXRpYyBpbnQgbXZfZmR0X25hbmRfbW9kZV9maXh1cCh2b2lkICpmZHQpOwogc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3BpbmN0cmwodm9pZCAqZmR0KTsKKyNpZmRlZiBNVl9JTkNMVURFX0FVRElPCitzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfYXVkaW8odm9pZCAqZmR0KTsKKyNlbmRpZgorI2lmZGVmIE1WX0lOQ0xVREVfU1dJVENICitzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfc3dpdGNoKHZvaWQgKmZkdCk7CisjZW5kaWYKIHN0YXRpYyBpbnQgbXZfZmR0X2RlYnVnOwogI2lmZGVmIENPTkZJR19NVl9TREhDSQogc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3NkaGNpKHZvaWQgKmZkdCk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1dJVENISU5HX1NFUlZJQ0VTCitzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfcHJlc3RlcmEodm9pZCAqZmR0KTsKKyNlbmRpZgorI2lmZGVmIE1WX0lOQ0xVREVfVERNCitzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfdGRtKHZvaWQgKmZkdCk7CisjZW5kaWYKKyNpZmRlZiBNVl9VU0JfVkJVU19DWUNMRQorc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3VzYl92YnVzKHZvaWQgKmZkdCk7CisjZW5kaWYKKyNpZmRlZiBNVl9JTkNMVURFX1VTQl9ERVZJQ0UKK3N0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV91c2JfZGV2aWNlKHZvaWQgKmZkdCk7CisjZW5kaWYKIAogI2lmIDAgLyogbm90IGNvbXBpbGVkLCBzaW5jZSB0aGlzIHJvdXRpbmUgaXMgY3VycmVudGx5IG5vdCBpbiB1c2UgICovCiBzdGF0aWMgaW50IG12X2ZkdF9yZW1vdmVfcHJvcCh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKnBhdGgsCiAJCQkJY29uc3QgY2hhciAqbmFtZSwgaW50IG5vZGVvZmYpOwogI2VuZGlmCiAKK3R5cGVkZWYgaW50ICh1cGRhdGVfZm5jX3QpKHZvaWQgKik7Cit1cGRhdGVfZm5jX3QgKnVwZGF0ZV9zZXF1ZW5jZVtdID0geworCW12X2ZkdF91cGRhdGVfY3B1cywJCQkvKiBHZXQgbnVtYmVyIG9mIENQVXMgYW5kIHVwZGF0ZSBkdCAqLworCW12X2ZkdF91cGRhdGVfcGV4LAkJCS8qIEdldCBudW1iZXIgb2YgYWN0aXZlIFBFWCBwb3J0IGFuZCB1cGRhdGUgRFQgKi8KKyNpZmRlZiBNVl9JTkNMVURFX1NBVEEKKwltdl9mZHRfdXBkYXRlX3NhdGEsCQkJLyogR2V0IG51bWJlciBvZiBhY3RpdmUgU0FUQSB1bml0cyBhbmQgdXBkYXRlIERUICovCisjZW5kaWYKKyNpZmRlZiBNVl9JTkNMVURFX1VTQgorCW12X2ZkdF91cGRhdGVfdXNiMiwJCQkvKiBHZXQgbnVtYmVyIG9mIGFjdGl2ZSBVU0IyLjAgdW5pdHMgYW5kIHVwZGF0ZSBEVCAqLworCW12X2ZkdF91cGRhdGVfdXNiMywJCQkvKiBHZXQgbnVtYmVyIG9mIGFjdGl2ZSBVU0IzLjAgdW5pdHMgYW5kIHVwZGF0ZSBEVCAqLworI2VuZGlmCisJbXZfZmR0X3VwZGF0ZV9ldGhudW0sCQkJLyogR2V0IG51bWJlciBvZiBhY3RpdmUgRVRIIHBvcnQgYW5kIHVwZGF0ZSBEVCAqLworI2lmZGVmIENPTkZJR19NVl9TREhDSQorCW12X2ZkdF91cGRhdGVfc2RoY2ksCQkJLyogVXBkYXRlIFNESENJIGRyaXZlciBzZXR0aW5ncyBpbiBEVCAqLworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NXSVRDSElOR19TRVJWSUNFUworCW12X2ZkdF91cGRhdGVfcHJlc3RlcmEsCQkJLyogVXBkYXRlIHByZXN0ZXJhIGRyaXZlciBEVCBzZXR0aW5ncyAtIGZvciBBTUMgYm9hcmQgKi8KKyNlbmRpZgorI2lmZGVmIE1WX0lOQ0xVREVfVERNCisJbXZfZmR0X3VwZGF0ZV90ZG0sCQkJLyogVXBkYXRlIHRkbSBub2RlIGluIERUICovCisjZW5kaWYKKyNpZmRlZiBNVl9VU0JfVkJVU19DWUNMRQorCW12X2ZkdF91cGRhdGVfdXNiX3ZidXMsCisjZW5kaWYKKwltdl9mZHRfdXBkYXRlX2ZsYXNoLAkJCS8qIEdldCBudW1iZXIgb2YgYWN0aXZlIGZsYXNoIGRldmljZXMgYW5kIHVwZGF0ZSBEVCAqLworCW12X2ZkdF9uYW5kX21vZGVfZml4dXAsCQkJLyogVXBkYXRlIE5BTkQgY29udHJvbGxlciBFQ0Mgc2V0dGluZ3MgaW4gRFQgKi8KKwltdl9mZHRfdXBkYXRlX3BpbmN0cmwsCQkJLyogVXBkYXRlIHBpbmN0cmwgZHJpdmVyIHNldHRpbmdzIGluIERUICovCisJbXZfZmR0X2JvYXJkX2NvbXBhdGlibGVfbmFtZV91cGRhdGUsCS8qIFVwZGF0ZSBjb21wYXRpYmxlIChib2FyZCBuYW1lKSBpbiBEVCAqLworCW12X2ZkdF91cGRhdGVfc2VyaWFsLAkJCS8qIFVwZGF0ZSBzZXJpYWwvVUFSVCBub2RlcyBpbiBEVCAqLworI2lmZGVmIENPTkZJR19QSUNfR1BJTworCW12X2ZkdF91cGRhdGVfcGljX2dwaW8sCisjZW5kaWYKKyNpZmRlZiBNVl9JTkNMVURFX0FVRElPCisJbXZfZmR0X3VwZGF0ZV9hdWRpbywJCQkvKiBVcGRhdGUgYXVkaW8tY29udHJvbGxlcitzb3VuZCBub2RlcyBpbiBEVCAqLworI2VuZGlmCisjaWZkZWYgTVZfSU5DTFVERV9TV0lUQ0gKKwltdl9mZHRfdXBkYXRlX3N3aXRjaCwKKyNlbmRpZgorI2lmZGVmIE1WX0lOQ0xVREVfVVNCX0RFVklDRQorCW12X2ZkdF91cGRhdGVfdXNiX2RldmljZSwKKyNlbmRpZgorCU5VTEwsCit9OworCiBlbnVtIG5mY19kcml2ZXJfdHlwZSB7CiAJTVZfRkRUX05GQ19QWEEzWFgsCS8qIG1haW5saW5lIHB4YTN4eC1uYW5kICovCiAJTVZfRkRUX05GQ19IQUwsCQkvKiBtdmVidSBIQUwtYmFzZWQgTkZDICovCkBAIC0xNzUsNiArMjUzLDcgQEAKIHsKIAlpbnQgZXJyOwkJLyogZXJyb3IgbnVtYmVyICovCiAJY2hhciAqZW52OwkJLyogZW52IHZhbHVlICovCisJdXBkYXRlX2ZuY190ICoqdXBkYXRlX2ZuY19wdHI7CiAJaW50IGNvdW50ZXIgPSAwOwkvKiBlcnJvciBjb3VudGVyICovCiAJaW50IGZvcmNlID0gMDsJCS8qIGNvbnRpbnVlIG9uIGVycm9yIGlmIHNldCAqLwogCkBAIC0yMTAsNzUgKzI4OSwxNCBAQAogCWZpeHVwX21lbW9yeV9ub2RlKGJsb2IpOwogCW12X2ZkdF9kcHJpbnRmKCJNZW1vcnkgbm9kZSB1cGRhdGVkXG4iKTsKIAotCS8qIEdldCBudW1iZXIgb2YgQ1BVcyBhbmQgdXBkYXRlIGR0ICovCi0JZXJyID0gbXZfZmR0X3VwZGF0ZV9jcHVzKGJsb2IpOwotCWlmIChlcnIgPCAwKQotCQlyZXBvcnRfZXJyb3IoJmNvdW50ZXIsIGZvcmNlLCAiVXBkYXRpbmcgY3B1cyBmYWlsZWRcbiIpOwotCi0JLyogR2V0IG51bWJlciBvZiBhY3RpdmUgUEVYIHBvcnQgYW5kIHVwZGF0ZSBEVCAqLwotCWVyciA9IG12X2ZkdF91cGRhdGVfcGV4KGJsb2IpOwotCWlmIChlcnIgPCAwKQotCQlyZXBvcnRfZXJyb3IoJmNvdW50ZXIsIGZvcmNlLCAiVXBkYXRpbmcgcGV4IGZhaWxlZFxuIik7Ci0KLQkvKiBHZXQgbnVtYmVyIG9mIGFjdGl2ZSBTQVRBIHVuaXRzIGFuZCB1cGRhdGUgRFQgKi8KLQllcnIgPSBtdl9mZHRfdXBkYXRlX3NhdGEoYmxvYik7Ci0JaWYgKGVyciA8IDApCi0JCXJlcG9ydF9lcnJvcigmY291bnRlciwgZm9yY2UsICJVcGRhdGluZyBwZXggZmFpbGVkXG4iKTsKLQotCS8qIEdldCBudW1iZXIgb2YgYWN0aXZlIFVTQjIuMCB1bml0cyBhbmQgdXBkYXRlIERUICovCi0JZXJyID0gbXZfZmR0X3VwZGF0ZV91c2IoYmxvYiwgVVNCX1VOSVRfSUQpOwotCWlmIChlcnIgPCAwKQotCQlyZXBvcnRfZXJyb3IoJmNvdW50ZXIsIGZvcmNlLCAiVXBkYXRpbmcgdXNiIDIuMCBmYWlsZWRcbiIpOwotCi0JLyogR2V0IG51bWJlciBvZiBhY3RpdmUgVVNCMy4wIHVuaXRzIGFuZCB1cGRhdGUgRFQgKi8KLQllcnIgPSBtdl9mZHRfdXBkYXRlX3VzYihibG9iLCBVU0IzX1VOSVRfSUQpOwotCWlmIChlcnIgPCAwKQotCQlyZXBvcnRfZXJyb3IoJmNvdW50ZXIsIGZvcmNlLCAiVXBkYXRpbmcgdXNiIDMuMCBmYWlsZWRcbiIpOwotCi0JLyogR2V0IG51bWJlciBvZiBhY3RpdmUgRVRIIHBvcnQgYW5kIHVwZGF0ZSBEVCAqLwotCWVyciA9IG12X2ZkdF91cGRhdGVfZXRobnVtKGJsb2IpOwotCWlmIChlcnIgPCAwKQotCQlyZXBvcnRfZXJyb3IoJmNvdW50ZXIsIGZvcmNlLCAiVXBkYXRpbmcgZXRobnVtIGZhaWxlZFxuIik7Ci0KLSNpZmRlZiBDT05GSUdfTVZfU0RIQ0kKLQkvKiBVcGRhdGUgU0RIQ0kgZHJpdmVyIHNldHRpbmdzIGluIERUICovCi0JZXJyID0gbXZfZmR0X3VwZGF0ZV9zZGhjaShibG9iKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmVwb3J0X2Vycm9yKCZjb3VudGVyLCBmb3JjZSwgIlVwZGF0aW5nIHNkaGNpIGZhaWxlZFxuIik7Ci0jZW5kaWYKLQotCS8qIEdldCBudW1iZXIgb2YgYWN0aXZlIGZsYXNoIGRldmljZXMgYW5kIHVwZGF0ZSBEVCAqLwotCWVyciA9IG12X2ZkdF91cGRhdGVfZmxhc2goYmxvYik7Ci0JaWYgKGVyciA8IDApCi0JCXJlcG9ydF9lcnJvcigmY291bnRlciwgZm9yY2UsICJVcGRhdGluZyBmbGFzaCBmYWlsZWRcbiIpOwotCi0JLyogVXBkYXRlIE5BTkQgY29udHJvbGxlciBFQ0Mgc2V0dGluZ3MgaW4gRFQgKi8KLQllcnIgPSBtdl9mZHRfbmFuZF9tb2RlX2ZpeHVwKGJsb2IpOwotCWlmIChlcnIgPCAwKQotCQlyZXBvcnRfZXJyb3IoJmNvdW50ZXIsIGZvcmNlLCAiVXBkYXRpbmcgbmFuZCBtb2RlIGZhaWxlZFxuIik7Ci0KLQkvKiBVcGRhdGUgcGluY3RybCBkcml2ZXIgc2V0dGluZ3MgaW4gRFQgKi8KLQllcnIgPSBtdl9mZHRfdXBkYXRlX3BpbmN0cmwoYmxvYik7Ci0JaWYgKGVyciA8IDApCi0JCXJlcG9ydF9lcnJvcigmY291bnRlciwgZm9yY2UsICJVcGRhdGluZyBwaW5jdHJsIGZhaWxlZFxuIik7Ci0KLQkvKiBVcGRhdGUgY29tcGF0aWJsZSAoYm9hcmQgbmFtZSkgaW4gRFQgKi8KLQllcnIgPSBtdl9mZHRfYm9hcmRfY29tcGF0aWJsZV9uYW1lX3VwZGF0ZShibG9iKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmVwb3J0X2Vycm9yKCZjb3VudGVyLCBmb3JjZSwgIlVwZGF0aW5nIGJvYXJkIG5hbWUgZmFpbGVkXG4iKTsKLQotCS8qIFVwZGF0ZSBzZXJpYWwvVUFSVCBub2RlcyBpbiBEVCAqLwotCWVyciA9IG12X2ZkdF91cGRhdGVfc2VyaWFsKGJsb2IpOwotCWlmIChlcnIgPCAwKQotCQlyZXBvcnRfZXJyb3IoJmNvdW50ZXIsIGZvcmNlLCAiVXBkYXRpbmcgc2VyaWFsIGZhaWxlZFxuIik7Ci0KLQllcnIgPSBtdl9mZHRfdXBkYXRlX3BpY19ncGlvKGJsb2IpOwotCWlmIChlcnIgPCAwKQotCQlyZXBvcnRfZXJyb3IoJmNvdW50ZXIsIGZvcmNlLCAiVXBkYXRpbmcgcGljIGdwaW8gZmFpbGVkXG4iKTsKLQotCWlmIChjb3VudGVyID4gMCkgewotCQltdl9mZHRfZHByaW50ZigiRW5jb3VudGVyZWQgJWQgZXJyb3JzIHdoaWxlIHVwZGF0aW5nIGRldmljZSB0cmVlXG4iLCBjb3VudGVyKTsKLQkJZ290byBic19mYWlsOworCS8qIE1ha2UgdXBkYXRlcyBvZiBmdW5jdGlvbnMgaW4gdXBkYXRlX3NlcXVlbmNlICovCisJZm9yICh1cGRhdGVfZm5jX3B0ciA9IHVwZGF0ZV9zZXF1ZW5jZTsgKnVwZGF0ZV9mbmNfcHRyOyArK3VwZGF0ZV9mbmNfcHRyKSB7CisJCWVyciA9ICgqdXBkYXRlX2ZuY19wdHIpKGJsb2IpOworCQlpZiAoZXJyIDwgMCkgeworCQkJcmVwb3J0X2Vycm9yKCZjb3VudGVyLCBmb3JjZSwKKwkJCQkiVXBkYXRpbmcgZnVuY3Rpb24gMHglMDh4IGZhaWxlZFxuIiwgdXBkYXRlX2ZuY19wdHIpOworCQkJLyogcmVwb3J0X2Vycm9yIHdpbGwgImdvdG8gYnNfZmFpbCIgb24gIWZvcmNlICovCisJCX0KIAl9CiAKIAlwcmludGYoIlVwZGF0aW5nIGRldmljZSB0cmVlIHN1Y2Nlc3NmdWxcbiIpOwpAQCAtMzYzLDYgKzM4MSw5IEBACiAqIG12X2ZkdF91cGRhdGVfY3B1cwogKgogKiBERVNDUklQVElPTjoKKyogdGFyZ2V0CQk6IHJlbW92ZSBleGNlc3NpY2UgY3B1IG5vZGVzLgorKiBub2RlCQkJOiBjcHVzCisqIGRlcGVuZGVuY2llcwkJOiBDUFUgY29yZSBudW0gaW4gU09DX0NPSEVSRU5DWV9GQUJSSUNfQ0ZHX1JFRy4KICoKICogSU5QVVQ6CiAqCWZkdC4KQEAgLTQyNCwxMCArNDQ1LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBNVl9JTkNMVURFX1NBVEEKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12X2ZkdF91cGRhdGVfc2F0YQogKgogKiBERVNDUklQVElPTjoKKyogdGFyZ2V0ICAgICAgICAgICAgICAgIDogVXBkYXRlIHN0YXR1cyBmaWVsZCBvZiBTQVRBIG5vZGVzLgorKiBub2RlLCBwcm9wZXJ0aWVzICAgICAgOiAtcHJvcGVydHkgc3RhdHVzIEAgbm9kZSBTQVRBCisqIGRlcGVuZGVuY2llcyAgICAgICAgICA6IHNhdGEgdW5pdCBzdGF0dXMgaW4gc2F0YVVuaXRBY3RpdmUgYXJyYXkuCiAqCiAqIElOUFVUOgogKglmZHQuCkBAIC00NTcsMTggKzQ4MiwxNjAgQEAKIAkJc3ByaW50Zihub2RlLCAic2F0YUAleCIsIG12Q3RybFNhdGFSZWdCYXNlR2V0KGkpKTsKIAkJaWYgKG12X2ZkdF9zZXRfbm9kZV9wcm9wKGZkdCwgbm9kZSwgcHJvcCwgcHJvcHZhbCkgPCAwKSB7CiAJCQltdl9mZHRfZHByaW50ZigiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSAnJXMnIG9mIG5vZGUgJyVzJyBpbiBkZXZpY2UgdHJlZVxuIiwgcHJvcCwgbm9kZSk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAogCXJldHVybiAwOwogfQorI2VuZGlmIC8qIE1WX0lOQ0xVREVfU0FUQSAqLworCisjaWZkZWYgTVZfSU5DTFVERV9URE0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2ZkdF91cGRhdGVfdGRtCisqCisqIERFU0NSSVBUSU9OOgorKiB0YXJnZXQJCTogdXBkYXRlIHN0YXR1cyBmaWVsZCBvZiB0ZG1AWCBub2RlLgorKiBub2RlLCBwcm9wZXJ0aWVzCTogLXByb3BlcnR5IHN0YXR1cyBAIG5vZGUgdGRtQHguCisqIGRlcGVuZGVuY2llcwkJOiBpc1RkbUNvbm5lY3RlZCBlbnRyeSBpbiBib2FyZCBzdHJ1Y3R1cmUuCisqCisqIElOUFVUOgorKglmZHQuCisqCisqIE9VVFBVVDoKKyoJTm9uZS4KKyoKKyogUkVUVVJOOgorKgktMSBvbiBlcnJvciBvcyAwIG90aGVyd2lzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfdGRtKHZvaWQgKmZkdCkKK3sKKwlpbnQgZXJyLCBub2Rlb2Zmc2V0OwkJCQkvKiBub2Rlb2Zmc2V0OiBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLworCWNoYXIgcHJvcHZhbFsxMF07CQkJCS8qIHByb3BlcnR5IHZhbHVlICovCisJY29uc3QgY2hhciAqcHJvcCA9ICJzdGF0dXMiOwkJCS8qIHByb3BlcnR5IG5hbWUgKi8KKwljaGFyIG5vZGVbNjRdOwkJCQkJLyogbm9kZSBuYW1lICovCisKKwlpZiAobXZCb2FyZElzVGRtQ29ubmVjdGVkKCkgPT0gTVZfVFJVRSkKKwkJc3ByaW50Zihwcm9wdmFsLCAib2theSIpOworCWVsc2UKKwkJc3ByaW50Zihwcm9wdmFsLCAiZGlzYWJsZWQiKTsKKworCXNwcmludGYobm9kZSwgInRkbUAleCIsIE1WX1RETV9PRkZTRVQpOworCW5vZGVvZmZzZXQgPSBtdl9mZHRfZmluZF9ub2RlKGZkdCwgbm9kZSk7CisKKwlpZiAobm9kZW9mZnNldCA8IDApIHsKKwkJbXZfZmR0X2RwcmludGYoIkxhY2sgb2YgJyVzJyBub2RlIGluIGRldmljZSB0cmVlXG4iLCBub2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cm5jbXAoZmR0X2dldF9uYW1lKGZkdCwgbm9kZW9mZnNldCwgTlVMTCksIG5vZGUsIHN0cmxlbihub2RlKSkgPT0gMCkgeworCQltdl9mZHRfbW9kaWZ5KGZkdCwgZXJyLCBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIHByb3AsCisJCQkJCQlwcm9wdmFsLCBzdHJsZW4ocHJvcHZhbCkrMSkpOworCQlpZiAoZXJyIDwgMCkgeworCQkJbXZfZmR0X2RwcmludGYoIk1vZGlmeWluZyAnJXMnIGluICclcycgbm9kZSBmYWlsZWRcbiIsIHByb3AsIG5vZGUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbXZfZmR0X2RwcmludGYoIlNldCAnJXMnIHByb3BlcnR5IHRvICclcycgaW4gJyVzJyBub2RlXG4iLCBwcm9wLCBwcm9wdmFsLCBub2RlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgTVZfVVNCX1ZCVVNfQ1lDTEUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2ZkdF91cGRhdGVfdXNiX3ZidXMKKyoKKyogREVTQ1JJUFRJT046CisqIHRhcmdldAkJOiB1cGRhdGUgc3RhdHVzIGZpZWxkIG9mIHVzYjNfcGh5IGFuZCB1c2IzLXZidXMtZ3Bpby91c2IzLXZidXMtZXhwMSBub2RlLgorKiBub2RlLCBwcm9wZXJ0aWVzCTogLXByb3BlcnR5IHN0YXR1cyBAIG5vZGUgdXNiM19waHkgYW5kIHVzYjMtdmJ1cy1ncGlvL3VzYjMtdmJ1cy1leHAxIG5vZGUuCisqIGRlcGVuZGVuY2llcwkJOiBCT0FSRF9HUFBfVVNCX1ZCVVMgZW50cnkgaW4gQm9hcmRHcHBJbmZvIC0tPiB1c2IzLXZidXMtZ3BpbyBub2RlCisqIAkJCSAgTVZfSU9fRVhQQU5ERVJfVVNCX1ZCVVMgZW50cnkgaW4gQm9hcmRJb0V4cFBpbkluZm8gLS0+IHVzYjMtdmJ1cy1leHAxCisqCisqIElOUFVUOgorKglmZHQuCisqCisqIE9VVFBVVDoKKyoJTm9uZS4KKyoKKyogUkVUVVJOOgorKgktMSBvbiBlcnJvciBvcyAwIG90aGVyd2lzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfdXNiX3ZidXModm9pZCAqZmR0KQoreworCWludCBlcnIsIG5vZGVvZmZzZXQ7CQkJCS8qIG5vZGVvZmZzZXQ6IG5vZGUgb2Zmc2V0IGZyb20gbGliZmR0ICovCisJY2hhciBwcm9wdmFsWzEwXTsJCQkJLyogcHJvcGVydHkgdmFsdWUgKi8KKwljb25zdCBjaGFyICpwcm9wID0gInN0YXR1cyI7CQkJLyogcHJvcGVydHkgbmFtZSAqLworCWNvbnN0IGNoYXIgKm5vZGUgPSBOVUxMLCAqcGh5X25vZGUgPSBOVUxMOwkvKiBub2RlIG5hbWUgKi8KKwlNVl9CT0FSRF9JT19FWFBBTkRFUl9UWVBFX0lORk8gaW9JbmZvOwkJLyogZW1wdHkgc3R1YiAtIG5vdCB0byBiZSB1c2VkICovCisKKwlzcHJpbnRmKHByb3B2YWwsICJva2F5Iik7CisKKwlpZiAobXZCb2FyZElvRXhwYW5kZXJUeXBlR2V0KE1WX0lPX0VYUEFOREVSX1VTQl9WQlVTLCAmaW9JbmZvKSAhPSBNVl9FUlJPUikgeworCQlub2RlID0gInVzYjMtdmJ1cy1leHAxIjsKKwkJcGh5X25vZGUgPSAidXNiMy1waHktZXhwMSI7CisJfSBlbHNlIHsKKwkJLyogcmVtb3ZlIGludmFsaWQgaTJjIHBpbnMgaW5mb3JtYXRpb24sIHRvIGF2b2lkIHVuZXhwZWN0ZWQgTGludXggYmVoYXZpb3VyKi8KKwkJbXZfZmR0X3JlbW92ZV9ub2RlKGZkdCwgImkyYy1waW5zLTAiKTsKKwl9CisJaWYgKG12Qm9hcmRVU0JWYnVzR3Bpb1BpbkdldCgwKSAhPSBNVl9FUlJPUikgeworCQkJbm9kZSA9ICJ1c2IzLXZidXMtZ3BpbyI7CisJCQlwaHlfbm9kZSA9ICJ1c2IzLXBoeS1ncGlvIjsKKwl9IGVsc2UgeworCQkvKiByZW1vdmUgaW52YWxpZCB2YnVzIGdwaW8gcGlucyBpbmZvcm1hdGlvbiwgdG8gYXZvaWQgdW5leHBlY3RlZCBMaW51eCBiZWhhdmlvdXIqLworCQltdl9mZHRfcmVtb3ZlX25vZGUoZmR0LCAieGhjaTAtdmJ1cy1waW5zIik7CisJfQorCisJaWYgKCFub2RlICYmICFwaHlfbm9kZSkKKwkJcmV0dXJuIDA7CisKKwlub2Rlb2Zmc2V0ID0gbXZfZmR0X2ZpbmRfbm9kZShmZHQsIG5vZGUpOworCisJaWYgKG5vZGVvZmZzZXQgPCAwKSB7CisJCW12X2ZkdF9kcHJpbnRmKCJMYWNrIG9mICclcycgbm9kZSBpbiBkZXZpY2UgdHJlZVxuIiwgbm9kZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoc3RybmNtcChmZHRfZ2V0X25hbWUoZmR0LCBub2Rlb2Zmc2V0LCBOVUxMKSwgbm9kZSwgc3RybGVuKG5vZGUpKSA9PSAwKSB7CisJCW12X2ZkdF9tb2RpZnkoZmR0LCBlcnIsIGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgcHJvcCwKKwkJCQkJCXByb3B2YWwsIHN0cmxlbihwcm9wdmFsKSsxKSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQltdl9mZHRfZHByaW50ZigiTW9kaWZ5aW5nICclcycgaW4gJyVzJyBub2RlIGZhaWxlZFxuIiwgcHJvcCwgbm9kZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQltdl9mZHRfZHByaW50ZigiU2V0ICclcycgcHJvcGVydHkgdG8gJyVzJyBpbiAnJXMnIG5vZGVcbiIsIHByb3AsIHByb3B2YWwsIG5vZGUpOworCX0KKworCS8qIGVuYWJsZSAndXNiM19waHknIG5vZGUgLSBmb3IgTGludXggcmVndWxhdG9yIHVzYWdlICovCisJbm9kZW9mZnNldCA9IG12X2ZkdF9maW5kX25vZGUoZmR0LCBwaHlfbm9kZSk7CisKKwlpZiAobm9kZW9mZnNldCA8IDApIHsKKwkJbXZfZmR0X2RwcmludGYoIkxhY2sgb2YgJyVzJyBub2RlIGluIGRldmljZSB0cmVlXG4iLCBwaHlfbm9kZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJuY21wKGZkdF9nZXRfbmFtZShmZHQsIG5vZGVvZmZzZXQsIE5VTEwpLCBwaHlfbm9kZSwgc3RybGVuKHBoeV9ub2RlKSkgPT0gMCkgeworCQltdl9mZHRfbW9kaWZ5KGZkdCwgZXJyLCBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIHByb3AsCisJCQkJCQlwcm9wdmFsLCBzdHJsZW4ocHJvcHZhbCkrMSkpOworCQlpZiAoZXJyIDwgMCkgeworCQkJbXZfZmR0X2RwcmludGYoIk1vZGlmeWluZyAnJXMnIGluICclcycgbm9kZSBmYWlsZWRcbiIsIHByb3AsIHBoeV9ub2RlKTsKKwkJCXJldHVybiAwOworCQl9CisJCW12X2ZkdF9kcHJpbnRmKCJTZXQgJyVzJyBwcm9wZXJ0eSB0byAnJXMnIGluICclcycgbm9kZVxuIiwgcHJvcCwgcHJvcHZhbCwgcGh5X25vZGUpOworCX0JcmV0dXJuIDA7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogTVZfVVNCX1ZCVVNfQ1lDTEUgKi8KIAogI2lmZGVmIENPTkZJR19NVl9TREhDSQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZfZmR0X3VwZGF0ZV9zZGhjaQogKgogKiBERVNDUklQVElPTjoKKyogdGFyZ2V0CQk6IHVwZGF0ZSBzdGF0dXMgYW5kIGRhdDMtY2QgZmllbGRzIG9mIE1NQyBub2RlLgorKiBub2RlLCBwcm9wZXJ0aWVzCTogLXByb3BlcnR5IHN0YXR1cyBhbmQgZGF0My1jZCBAIG5vZGUgc2RoY2lAWC4KKyogZGVwZW5kZW5jaWVzCQk6IHN0YXR1cyBvZiBNTUMgaW4gaXNTZE1tY0Nvbm5lY3RlZCBlbnRyeSBpbiBib2FyZCBzdHJ1Y3R1cmUuCiAqCiAqIElOUFVUOgogKglmZHQuCkBAIC00ODYsNiArNjUzLDcgQEAKIAljaGFyIHByb3B2YWxbMTBdOwkJCQkvKiBwcm9wZXJ0eSB2YWx1ZSAqLwogCWNvbnN0IGNoYXIgKnByb3AgPSAic3RhdHVzIjsJCQkvKiBwcm9wZXJ0eSBuYW1lICovCiAJY2hhciBub2RlWzY0XTsJCQkJCS8qIG5vZGUgbmFtZSAqLworCWNoYXIgKmVudjsKIAogCWlmIChtdkJvYXJkaXNTZGlvQ29ubmVjdGVkKCkpCiAJCXNwcmludGYocHJvcHZhbCwgIm9rYXkiKTsKQEAgLTQ5Nyw3ICs2NjUsNyBAQAogCiAJaWYgKG5vZGVvZmZzZXQgPCAwKSB7CiAJCW12X2ZkdF9kcHJpbnRmKCJMYWNrIG9mICclcycgbm9kZSBpbiBkZXZpY2UgdHJlZVxuIiwgbm9kZSk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHN0cm5jbXAoZmR0X2dldF9uYW1lKGZkdCwgbm9kZW9mZnNldCwgTlVMTCksIG5vZGUsIHN0cmxlbihub2RlKSkgPT0gMCkgewpAQCAtNTA1LDExICs2NzMsMTIyIEBACiAJCQkJCQlwcm9wdmFsLCBzdHJsZW4ocHJvcHZhbCkrMSkpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJbXZfZmR0X2RwcmludGYoIk1vZGlmeWluZyAnJXMnIGluICclcycgbm9kZSBmYWlsZWRcbiIsIHByb3AsIG5vZGUpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIDA7CiAJCX0KIAkJbXZfZmR0X2RwcmludGYoIlNldCAnJXMnIHByb3BlcnR5IHRvICclcycgaW4gJyVzJyBub2RlXG4iLCBwcm9wLCBwcm9wdmFsLCBub2RlKTsKIAl9CiAKKwkvKiBhZGQgREFUMyBkZXRlY3Rpb24gKi8KKwllbnYgPSBnZXRlbnYoInNkX2RldGVjdGlvbl9kYXQzIik7CisKKwlpZiAoIWVudiB8fCBzdHJjbXAoZW52LCAieWVzIikgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlwcm9wID0gImRhdDMtY2QiOworCisJLyogYWRkIGVtcHR5IHByb3BlcnR5ICdkYXQzLWNkJyAqLworCWlmIChmZHRfYXBwZW5kcHJvcChmZHQsIG5vZGVvZmZzZXQsIHByb3AsIE5VTEwsIDApIDwgMCkKKwkJbXZfZmR0X2RwcmludGYoIkZhaWxlZCB0byBzZXQgcHJvcGVydHkgJyVzJyBvZiBub2RlICclcycgaW4gZGV2aWNlIHRyZWVcbiIsIHByb3AsIG5vZGUpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIE1WX0lOQ0xVREVfQVVESU8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2ZkdF91cGRhdGVfYXVkaW8KKyoKKyogREVTQ1JJUFRJT046IHVwZGF0ZSBhdWRpby1jb250cm9sbGVyIGFuZCBzb3VuZCBub2RlcyAoU1BESUYvSTJTKQorKgorKiBJTlBVVDogZmR0LgorKiBPVVRQVVQ6IE5vbmUuCisqIFJFVFVSTjogLTEgb24gZXJyb3Igb3MgMCBvdGhlcndpc2UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX2F1ZGlvKHZvaWQgKmZkdCkKK3sKKwlpbnQgZXJyLCBub2Rlb2Zmc2V0LCBpOwkJCQkvKiBub2Rlb2Zmc2V0OiBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLworCWNoYXIgcHJvcHZhbFsxMF07CQkJCS8qIHByb3BlcnR5IHZhbHVlICovCisJY29uc3QgY2hhciAqcHJvcCA9ICJzdGF0dXMiOwkJCS8qIHByb3BlcnR5IG5hbWUgKi8KKwljaGFyIG5vZGVzWzJdWzY0XTsJCQkJLyogbm9kZSBuYW1lcyAqLworCisJaWYgKG12Qm9hcmRJc0F1ZGlvQ29ubmVjdGVkKCkgPT0gTVZfVFJVRSkKKwkJc3ByaW50Zihwcm9wdmFsLCAib2theSIpOworCWVsc2UKKwkJc3ByaW50Zihwcm9wdmFsLCAiZGlzYWJsZWQiKTsKKworCXNwcmludGYobm9kZXNbMF0sICJhdWRpby1jb250cm9sbGVyQCV4IiwgTVZfQVVESU9fT0ZGU0VUKTsKKwlzcHJpbnRmKG5vZGVzWzFdLCAic291bmQiKTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKwkJbm9kZW9mZnNldCA9IG12X2ZkdF9maW5kX25vZGUoZmR0LCBub2Rlc1tpXSk7CisJCWlmIChub2Rlb2Zmc2V0IDwgMCkgeworCQkJbXZfZmR0X2RwcmludGYoIkxhY2sgb2YgJyVzJyBub2RlIGluIGRldmljZSB0cmVlXG4iLCBub2Rlc1tpXSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChzdHJuY21wKGZkdF9nZXRfbmFtZShmZHQsIG5vZGVvZmZzZXQsIE5VTEwpLCBub2Rlc1tpXSwgc3RybGVuKG5vZGVzW2ldKSkgPT0gMCkgeworCQkJbXZfZmR0X21vZGlmeShmZHQsIGVyciwgZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLAorCQkJCQkJCXByb3B2YWwsIHN0cmxlbihwcm9wdmFsKSsxKSk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCW12X2ZkdF9kcHJpbnRmKCJNb2RpZnlpbmcgJyVzJyBpbiAnJXMnIG5vZGUgZmFpbGVkXG4iLCBwcm9wLCBub2Rlc1tpXSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQltdl9mZHRfZHByaW50ZigiU2V0ICclcycgcHJvcGVydHkgdG8gJyVzJyBpbiAnJXMnIG5vZGVcbiIsIHByb3AsIHByb3B2YWwsIG5vZGVzW2ldKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1dJVENISU5HX1NFUlZJQ0VTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9mZHRfdXBkYXRlX3ByZXN0ZXJhCisqCisqIERFU0NSSVBUSU9OOgorKiB0YXJnZXQJCTogdXBkYXRlIHN0YXR1cyBmaWVsZCBvZiBwcmVzdGVyYSBub2RlIGJ5IGNoZWNraW5nIGlmIHRoZSBib2FyZCBpcyBBTUMuCisqIG5vZGUsIHByb3BlcnRpZXMJOiAtcHJvcGVydHkgc3RhdHVzIEAgbm9kZSBwcmVzdGVyYS4KKyogZGVwZW5kZW5jaWVzCQk6IEFNQyBzdGF0dXMgc2F2ZWQgaW4gaXNBbWMgZW50cnkgaW4gYm9hcmQgc3RydWN0dXJlCisqCisqIElOUFVUOgorKglmZHQuCisqCisqIE9VVFBVVDoKKyoJTm9uZS4KKyoKKyogUkVUVVJOOgorKgktMSBvbiBlcnJvciBvcyAwIG90aGVyd2lzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfcHJlc3RlcmEodm9pZCAqZmR0KQoreworCWludCBlcnIsIG5vZGVvZmZzZXQ7CQkJCQkvKiBub2Rlb2Zmc2V0OiBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLworCWNoYXIgcHJvcHZhbFsxMF07CQkJCQkvKiBwcm9wZXJ0eSB2YWx1ZSAqLworCWNvbnN0IGNoYXIgKnByb3AgPSAic3RhdHVzIjsJCQkJLyogcHJvcGVydHkgbmFtZSAqLworCWNvbnN0IGNoYXIgKm5vZGUgPSAicHJlc3RlcmEiOwkJCQkvKiBub2RlIG5hbWUgKi8KKwlNVl9CT09MIGlzQW1jOworCisJaXNBbWMgPSBtdkJvYXJkaXNBbWMoKTsKKwlpZiAoaXNBbWMpCisJCXNwcmludGYocHJvcHZhbCwgIm9rYXkiKTsKKwllbHNlCisJCXNwcmludGYocHJvcHZhbCwgImRpc2FibGVkIik7CisKKwlub2Rlb2Zmc2V0ID0gbXZfZmR0X2ZpbmRfbm9kZShmZHQsIG5vZGUpOworCisJaWYgKG5vZGVvZmZzZXQgPCAwKSB7CisJCW12X2ZkdF9kcHJpbnRmKCJMYWNrIG9mICclcycgbm9kZSBpbiBkZXZpY2UgdHJlZVxuIiwgbm9kZSk7CisJCXJldHVybiAwOworCX0KKworCW12X2ZkdF9tb2RpZnkoZmR0LCBlcnIsIGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgcHJvcCwKKwkJCQkJcHJvcHZhbCwgc3RybGVuKHByb3B2YWwpKzEpKTsKKwlpZiAoZXJyIDwgMCkgeworCQltdl9mZHRfZHByaW50ZigiTW9kaWZ5aW5nICclcycgaW4gJyVzJyBub2RlIGZhaWxlZFxuIiwgcHJvcCwgbm9kZSk7CisJCXJldHVybiAtMTsKKwl9CisJbXZfZmR0X2RwcmludGYoIlNldCAnJXMnIHByb3BlcnR5IHRvICclcycgaW4gJyVzJyBub2RlXG4iLCBwcm9wLCBwcm9wdmFsLCBub2RlKTsKKwogCXJldHVybiAwOwogfQogI2VuZGlmCkBAIC01MTgsNiArNzk3LDkgQEAKICogbXZfZmR0X3VwZGF0ZV9wZXgKICoKICogREVTQ1JJUFRJT046CisqIHRhcmdldAkJOiB1cGRhdGUgc3RhdHVzIGZpZWxkcyBvZiBwY2llWCBub2Rlcy4KKyogbm9kZSwgcHJvcGVydGllcwk6IC1wcm9wZXJ0eSBzdGF0dXMgQCBub2RlIHBjaWVYLgorKiBkZXBlbmRlbmNpZXMJCTogYm9hcmRQZXhJbmZvIHN0cnVjdHVyZSBlbnRyeSBpbiBib2FyZCBzdHJ1Y3R1cmUuCiAqCiAqIElOUFVUOgogKglmZHQuCkBAIC01NTUsNyArODM3LDcgQEAKIAlub2Rlb2Zmc2V0ID0gbXZfZmR0X2ZpbmRfbm9kZShmZHQsIG5vZGUpOwogCWlmIChub2Rlb2Zmc2V0IDwgMCkgewogCQltdl9mZHRfZHByaW50ZigiTGFjayBvZiAnJXMnIG5vZGUgaW4gZGV2aWNlIHRyZWVcbiIsIG5vZGUpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOwogCX0KIAl3aGlsZSAoc3RybmNtcChub2RlLCAicGNpZSIsIDQpID09IDApIHsKIAkJZm9yIChrID0gMDsgayA8PSBwZXhudW07IGsrKykKQEAgLTU3Miw3ICs4NTQsNyBAQAogCQlpZiAoZXJyIDwgMCkgewogCQkJbXZfZmR0X2RwcmludGYoIk1vZGlmeWluZyAnJXMnIGluICclcycgbm9kZSBmYWlsZWRcbiIsCiAJCQkJICAgICAgIHByb3AsIG5vZGUpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIDA7CiAJCX0KIAkJbXZfZmR0X2RwcmludGYoIlNldCAnJXMnIHByb3BlcnR5IHRvICclcycgaW4gJyVzJyBub2RlXG4iLCBwcm9wLAogCQkJICAgICAgIHByb3B2YWwsIG5vZGUpOwpAQCAtNTgwLDEzICs4NjIsMTMgQEAKIAkJaWYgKG5vZGVvZmZzZXQgPCAwKSB7CiAJCQltdl9mZHRfZHByaW50ZigiTW9kaWZ5aW5nICclcycgaW4gJyVzJyBub2RlIGZhaWxlZFxuIiwKIAkJCQkgICAgICAgcHJvcCwgbm9kZSk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gMDsKIAkJfQogCQlub2RlID0gZmR0X2dldF9uYW1lKGZkdCwgbm9kZW9mZnNldCwgTlVMTCk7CiAJfQogCXJldHVybiAwOwogfQotCisjaWZkZWYgTVZfSU5DTFVERV9VU0IKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12X2ZkdF91cGRhdGVfdXNiCiAqCkBAIC02MTMsNyArODk1LDcgQEAKIAkJc3ByaW50Zihub2RlLCAidXNiJXNAJXgiLCB1bml0VHlwZSA9PSBVU0JfVU5JVF9JRCA/ICIiIDogIjMiLCBNVl9VU0IyX1VTQjNfUkVHU19PRkZTRVQodW5pdFR5cGUsIGkpKTsKIAkJaWYgKG12X2ZkdF9zZXRfbm9kZV9wcm9wKGZkdCwgbm9kZSwgcHJvcCwgcHJvcHZhbCkgPCAwKSB7CiAJCQltdl9mZHRfZHByaW50ZigiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSAnJXMnIG9mIG5vZGUgJyVzJyBpbiBkZXZpY2UgdHJlZVxuIiwgcHJvcCwgbm9kZSk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KIApAQCAtNjIxLDkgKzkwMyw5NiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9mZHRfdXBkYXRlX3VzYjIKKyoKKyogREVTQ1JJUFRJT046IHVwZGF0ZSBVU0IyLjAoZUhDSSkgc3RhdHVzLCB0aGlzIGZ1bmN0aW9uIGlzIHdyYXBwZXIgZnVuY3Rpb24KKyogdG8gbXZfZmR0X3VwZGF0ZV91c2IsIEluIG9yZGVyIHRvIGFkZCBpdCB0byB1cGRhdGVfc2VxdWVuY2UgYXJyYXkKKyoKKyogSU5QVVQ6IGZkdC4KKyogT1VUUFVUOiBOb25lLgorKiBSRVRVUk46IC0xIG9uIGVycm9yIG9zIDAgb3RoZXJ3aXNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV91c2IyKHZvaWQgKmZkdCkKK3sKKwlyZXR1cm4gbXZfZmR0X3VwZGF0ZV91c2IoZmR0LCBVU0JfVU5JVF9JRCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2ZkdF91cGRhdGVfdXNiMworKgorKiBERVNDUklQVElPTjogdXBkYXRlIFVTQjMuMCh4SENJKSBzdGF0dXMsIHRoaXMgZnVuY3Rpb24gaXMgd3JhcHBlciBmdW5jdGlvbgorKiB0byBtdl9mZHRfdXBkYXRlX3VzYiwgSW4gb3JkZXIgdG8gYWRkIGl0IHRvIHVwZGF0ZV9zZXF1ZW5jZSBhcnJheQorKgorKiBJTlBVVDogZmR0LgorKiBPVVRQVVQ6IE5vbmUuCisqIFJFVFVSTjogLTEgb24gZXJyb3Igb3MgMCBvdGhlcndpc2UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3VzYjModm9pZCAqZmR0KQoreworCXJldHVybiBtdl9mZHRfdXBkYXRlX3VzYihmZHQsIFVTQjNfVU5JVF9JRCk7Cit9CisjZW5kaWYgLyogTVZfSU5DTFVERV9VU0IgKi8KKworI2lmZGVmIE1WX0lOQ0xVREVfVVNCX0RFVklDRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfZmR0X3VwZGF0ZV91c2JfZGV2aWNlCisqCisqIERFU0NSSVBUSU9OOiB1c2IzIGRldmljZSBzdGF0dXMKKyogdGFyZ2V0CQk6IHVwZGF0ZSBzdGF0dXMgZmllbGQgb2YgdTNkIGFuZCB1ZGMgbm9kZXMuCisqIG5vZGUsIHByb3BlcnRpZXMJOiBwcm9wZXJ0eSBzdGF0dXMgQCBub2RlcyB1c2IzQFgsIHVkY0BYIGFuZCB1ZGNAWC4KKyogZGVwZW5kZW5jaWVzCQk6IFNAUiBmaWVsZCAndXNiM3BvcnQwJyBvciAndXNiM3BvcnQxJy4KKyoKKyogSU5QVVQ6IGZkdC4KKyogT1VUUFVUOiBOb25lLgorKiBSRVRVUk46IC0xIG9uIGVycm9yIG9zIDAgb3RoZXJ3aXNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV91c2JfZGV2aWNlKHZvaWQgKmZkdCkKK3sKKwljaGFyIHByb3B2YWxbMTBdOwkJCQkvKiBwcm9wZXJ0eSB2YWx1ZSAqLworCWNvbnN0IGNoYXIgKnByb3AgPSAic3RhdHVzIjsJCQkvKiBwcm9wZXJ0eSBuYW1lICovCisJY2hhciBub2RlWzY0XTsJCQkJCS8qIG5vZGUgbmFtZSAqLworCWludCBpOworCU1WX0JPT0wgaXNEZXZpY2UgPSBNVl9GQUxTRTsKKworCS8qIGRpc2FibGUgdXNiMyBub2RlcyAqLworCWZvciAoaSA9IDA7IGkgPCBNVl9VU0IzX01BWF9IT1NUX1BPUlRTOyBpKyspIHsKKwkJaWYgKG12Qm9hcmRJc1VzYjNQb3J0RGV2aWNlKGkpKSB7CisJCQkvKiBpZiBQb3J0IGlzIERldmljZSwgZGlzYWJsZSBjb3JyZXNwb25kaW5nIEhvc3Qgbm9kZSAqLworCQkJc3ByaW50Zihwcm9wdmFsLCAiZGlzYWJsZWQiKTsKKwkJCWlzRGV2aWNlID0gTVZfVFJVRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGlzRGV2aWNlID09IE1WX0ZBTFNFKQorCQlyZXR1cm4gMDsKKworCXNwcmludGYobm9kZSwgInVzYjNAJXgiLCBNVl9VU0IyX1VTQjNfUkVHU19PRkZTRVQoVVNCM19VTklUX0lELCBpKSk7CisJaWYgKG12X2ZkdF9zZXRfbm9kZV9wcm9wKGZkdCwgbm9kZSwgcHJvcCwgcHJvcHZhbCkgPCAwKQorCQltdl9mZHRfZHByaW50ZigiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSAnJXMnIG9mIG5vZGUgJyVzJyBpbiBkZXZpY2UgdHJlZVxuIiwgcHJvcCwgbm9kZSk7CisKKwkvKiBlbmFibGUgJ3UzZCcgYW5kICd1ZGMnIG5vZGVzICovCisJc3ByaW50Zihwcm9wdmFsLCAib2theSIpOworCXNwcmludGYobm9kZSwgInUzZEAleCIsIE1WX1VTQjNfREVWSUNFX1JFR1NfT0ZGU0VUKTsKKwlpZiAobXZfZmR0X3NldF9ub2RlX3Byb3AoZmR0LCBub2RlLCBwcm9wLCBwcm9wdmFsKSA8IDApIHsKKwkJbXZfZmR0X2RwcmludGYoIkZhaWxlZCB0byBzZXQgcHJvcGVydHkgJyVzJyBvZiBub2RlICclcycgaW4gZGV2aWNlIHRyZWVcbiIsIHByb3AsIG5vZGUpOworCQlyZXR1cm4gMDsKKwl9CisJc3ByaW50Zihub2RlLCAidWRjQCV4IiwgTVZfVVNCM19ERVZJQ0VfVVNCMl9SRUdTX09GRlNFVCk7CisJaWYgKG12X2ZkdF9zZXRfbm9kZV9wcm9wKGZkdCwgbm9kZSwgcHJvcCwgcHJvcHZhbCkgPCAwKSB7CisJCW12X2ZkdF9kcHJpbnRmKCJGYWlsZWQgdG8gc2V0IHByb3BlcnR5ICclcycgb2Ygbm9kZSAnJXMnIGluIGRldmljZSB0cmVlXG4iLCBwcm9wLCBub2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmIC8qIE1WX0lOQ0xVREVfVVNCX0RFVklDRSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZfZmR0X3VwZGF0ZV9waW5jdHJsCiAqCiAqIERFU0NSSVBUSU9OOgorKiB0YXJnZXQJCTogdXBkYXRlIGNvbXBhdGlibGUgZmllbGQgb2YgcGluY3RybCBub2RlLgorKiBub2RlLCBwcm9wZXJ0aWVzCTogLXByb3BlcnR5IGNvbXBhdGlibGUgQCBub2RlIHBpbmN0cmwuCisqIGRlcGVuZGVuY2llcwkJOkRFVl9JRF9SRUcgdmFsdWUgImRldmljZSBtb2RlbCB0eXBlIi4KICoKICogSU5QVVQ6CiAqCWZkdC4KQEAgLTY0NSwxMSArMTAxNCwxMSBAQAogCWNvbnN0IGNoYXIgKm5vZGUgPSAicGluY3RybCI7CQkJLyogbm9kZSBuYW1lICovCiAjZW5kaWYKIAotCS8qIHVwZGF0ZSBwaW5jdHJsIGRyaXZlciAnY29tcGF0aWJsZScgcHJvcGVydCwgYWNjb3JkaW5nIHRvIGRldmljZSBtb2RlbCB0eXBlICovCisJLyogdXBkYXRlIHBpbmN0cmwgZHJpdmVyICdjb21wYXRpYmxlJyBwcm9wZXJ0eSwgYWNjb3JkaW5nIHRvIGRldmljZSBtb2RlbCB0eXBlICovCiAJc3ByaW50Zihwcm9wdmFsLCAibWFydmVsbCxtdjg4ZiV4LXBpbmN0cmwiLCBtdkN0cmxNb2RlbEdldCgpKTsKIAlpZiAobXZfZmR0X3NldF9ub2RlX3Byb3AoZmR0LCBub2RlLCBwcm9wLCBwcm9wdmFsKSA8IDApIHsKIAkJbXZfZmR0X2RwcmludGYoIkZhaWxlZCB0byBzZXQgcHJvcGVydHkgJyVzJyBvZiBub2RlICclcycgaW4gZGV2aWNlIHRyZWVcbiIsIHByb3AsIG5vZGUpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOwogCX0KIAogCXJldHVybiAwOwpAQCAtNjU5LDYgKzEwMjgsMTQgQEAKICogbXZfZmR0X3VwZGF0ZV9ldGhudW0KICoKICogREVTQ1JJUFRJT046CisqIHRhcmdldAkJOiB1cGRhdGUgZXRoZXJuZXQgbm9kZXMgZm9yIFBQMy9OZXRhIGRyaXZlcnMuCisqIG5vZGUsIHByb3BlcnRpZXMJOiBQUDMgRHJpdmVyCTogLXByb3BlcnR5IHN0YXR1cyBAIG5vZGUgbmljQFguCisqCQkJCQkgIC1wcm9wZXJ0eSBwaHktbW9kZSBhbmQgcGh5LWlkIEAgbm9kZSBtYWNYLgorKgkJCSAgTmV0YSBEcml2ZXIJOiAtcHJvcGVydHkgc3RhdHVzIGFuZCBwaHktbW9kZSBAIG5vZGUgZXRoZXJuZXRAWC4KKyoJCQkJCSAgLXByb3BlcnR5IHJlZyBAIG5vZGUgZXRoZXJuZXQtcGh5QFguCisqIGRlcGVuZGVuY2llcwkJOiBwQm9hcmROZXRDb21wbGV4SW5mbyBlbnRyeSBpbiBib2FyZCBzdHJ1Y3R1cmUuCisqCQkJICBwQm9hcmRNYWNJbmZvIGVudHJ5IGluIGJvYXJkIHN0cnVjdHVyZS4KKyoJICAgICAJCSAgRm9yIFBQMy9OZXRhIGRyaXZlciB3ZSBnZXQgZXRoZXJuZXQgbm9kZXMgdmlhICJuaWNAL2V0aGVybmV0QCIgYWxpYXNzZXMuCiAqCiAqIElOUFVUOgogKglmZHQuCkBAIC02OTEsNyArMTA2OCw3IEBACiAJYWxpYXNlc29mZnNldCA9IG12X2ZkdF9maW5kX25vZGUoZmR0LCAiYWxpYXNlcyIpOwogCWlmIChhbGlhc2Vzb2Zmc2V0IDwgMCkgewogCQltdl9mZHRfZHByaW50ZigiTGFjayBvZiAnYWxpYXNlcycgbm9kZSBpbiBkZXZpY2UgdHJlZVxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIDA7CiAJfQogCiAJLyogV2FsayB0cm91Z2ggYWxsIGFsaWFzZXMgYW5kIGNvdW50IEV0aGVybmV0IHBvcnRzIGVudHJpZXMgKi8KQEAgLTcxMywxMSArMTA5MCwxMSBAQAogCQlub2RlID0gZmR0X2dldHByb3AoZmR0LCBhbGlhc2Vzb2Zmc2V0LCBwcm9wLCAmbGVuKTsKIAkJaWYgKG5vZGUgPT0gTlVMTCkgewogCQkJbXZfZmR0X2RwcmludGYoIkxhY2sgb2YgJyVzJyBwcm9wZXJ0eSBpbiAnYWxpYXNlcycgbm9kZVxuIiwgcHJvcCk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gMDsKIAkJfQogCQlpZiAobGVuID09IDApIHsKIAkJCW12X2ZkdF9kcHJpbnRmKCJFbXB0eSBwcm9wZXJ0eSB2YWx1ZVxuIik7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gMDsKIAkJfQogCQkvKiBBbGlhcyBwb2ludHMgdG8gdGhlIEVUSCBwb3J0IG5vZGUgdXNpbmcgZnVsbCBEVCBwYXRoICovCiAJCW5vZGVvZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQoZmR0LCBub2RlKTsKQEAgLTczOCwxMiArMTExNSwxMiBAQAogCQkJcGhhbmRsZSA9IGZkdF9nZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgInBoeSIsICZsZW4pOwogCQkJaWYgKGxlbiA9PSAwKSB7CiAJCQkJbXZfZmR0X2RwcmludGYoIkVtcHR5IFwicGh5XCIgcHJvcGVydHkgdmFsdWVcbiIpOwotCQkJCXJldHVybiAtMTsKKwkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCXBoeW9mZnNldCA9IGZkdF9ub2RlX29mZnNldF9ieV9waGFuZGxlKGZkdCwgbnRvaGwoKnBoYW5kbGUpKTsKIAkJCWlmIChwaHlvZmZzZXQgPCAwKSB7CiAJCQkJbXZfZmR0X2RwcmludGYoIkZhaWxlZCB0byBnZXQgUEhZIG5vZGUgYnkgcGhhbmRsZSAleFxuIiwgbnRvaGwoKnBoYW5kbGUpKTsKLQkJCQlyZXR1cm4gLTE7CisJCQkJcmV0dXJuIDA7CiAJCQl9CiAKIAkJCS8qIFNldHVwIFBIWSBhZGRyZXNzIGluIERUIGluICJyZWciIHByb3BlcnR5IG9mIGFuIGFwcHJvcHJpYXRlIFBIWSBub2RlLgpAQCAtNzU0LDcgKzExMzEsNyBAQAogCQkJaWYgKGVyciA8IDApIHsKIAkJCQltdl9mZHRfZHByaW50ZigiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSAnJXMnIG9mIG5vZGUgJyVzJyBpbiBkZXZpY2UgdHJlZVxuIiwKIAkJCQkJCQkgICBwcm9wLCBmZHRfZ2V0X25hbWUoZmR0LCBwaHlvZmZzZXQsIE5VTEwpKTsKLQkJCQlyZXR1cm4gLTE7CisJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQltdl9mZHRfZHByaW50ZigiU2V0IHByb3BlcnR5ICclcycgb2Ygbm9kZSAnJXMnIHRvICUjMDEweFxuIiwKIAkJCQkJCSAgIHByb3AsIGZkdF9nZXRfbmFtZShmZHQsIHBoeW9mZnNldCwgTlVMTCksIG50b2hsKHBoeUFkZHIpKTsKQEAgLTc3MSw3ICsxMTQ4LDcgQEAKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJbXZfZmR0X2RwcmludGYoIkJhZCBwb3J0IHR5cGUgcmVjZWl2ZWQgZm9yIGludGVyZmFjZSAlZFxuIiwgcG9ydCk7Ci0JCQkJcmV0dXJuIC0xOworCQkJCXJldHVybiAwOwogCQkJfQogCiAJCQkvKiBTZXR1cCBQSFkgY29ubmVjdGlvbiB0eXBlIGluIERUICovCkBAIC03NzksNyArMTE1Niw3IEBACiAJCQltdl9mZHRfbW9kaWZ5KGZkdCwgZXJyLCBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIHByb3AsIHByb3B2YWwsIHN0cmxlbihwcm9wdmFsKSsxKSk7CiAJCQlpZiAoZXJyIDwgMCkgewogCQkJCW12X2ZkdF9kcHJpbnRmKCJGYWlsZWQgdG8gc2V0IHByb3BlcnR5ICclcycgb2Ygbm9kZSAnJXMnIGluIGRldmljZSB0cmVlXG4iLCBwcm9wLCBub2RlKTsKLQkJCQlyZXR1cm4gLTE7CisJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQltdl9mZHRfZHByaW50ZigiU2V0ICclcycgcHJvcGVydHkgdG8gJyVzJyBpbiAnJXMnIG5vZGVcbiIsIHByb3AsIHByb3B2YWwsIG5vZGUpOwogCkBAIC03OTEsNyArMTE2OCw3IEBACiAJCW12X2ZkdF9tb2RpZnkoZmR0LCBlcnIsIGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgcHJvcCwgcHJvcHZhbCwgc3RybGVuKHByb3B2YWwpKzEpKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCW12X2ZkdF9kcHJpbnRmKCJGYWlsZWQgdG8gc2V0IHByb3BlcnR5ICclcycgb2Ygbm9kZSAnJXMnIGluIGRldmljZSB0cmVlXG4iLCBwcm9wLCBub2RlKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAwOwogCQl9CiAJCW12X2ZkdF9kcHJpbnRmKCJTZXQgJyVzJyBwcm9wZXJ0eSB0byAnJXMnIGluICclcycgbm9kZVxuIiwgcHJvcCwgcHJvcHZhbCwgbm9kZSk7CiAKQEAgLTg1NSw3ICsxMjMyLDcgQEAKIAkJc3ByaW50Zihub2RlLCAic3BpQCV4IiwgTVZfU1BJX1JFR1NfT0ZGU0VUKHVuaXQpKTsKIAkJaWYgKG12X2ZkdF9zZXRfbm9kZV9wcm9wKGZkdCwgbm9kZSwgcHJvcCwgcHJvcHZhbCkgPCAwKSB7CiAJCQltdl9mZHRfZHByaW50ZigiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSAnJXMnIG9mIG5vZGUgJyVzJyBpbiBkZXZpY2UgdHJlZVxuIiwgcHJvcCwgbm9kZSk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0gLyogU1BJIHVuaXRzL2J1c2VzICovCiAKQEAgLTg4Miw3ICsxMjU5LDcgQEAKICNlbmRpZgogCWlmIChtdl9mZHRfc2V0X25vZGVfcHJvcChmZHQsIG5vZGUsIHByb3AsIHByb3B2YWwpIDwgMCkgewogCQltdl9mZHRfZHByaW50ZigiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSAnJXMnIG9mIG5vZGUgJyVzJyBpbiBkZXZpY2UgdHJlZVxuIiwgcHJvcCwgbm9kZSk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIDA7CiAJfQogCiAJLyogaGFuZGxlIE5PUiBmbGFzaGVzIC0gdGhlcmUgaXMgb25seSBvbmUgTk9SIHVuaXQsIGJ1dCBkaWZmZXJlbnQgQ1MgYXJlIHBvc3NpYmxlICovCkBAIC05MTYsMTAgKzEyOTMsOSBAQAogCiAJCWlmIChtdl9mZHRfc2V0X25vZGVfcHJvcChmZHQsIG5vZGUsIHByb3AsIHByb3B2YWwpIDwgMCkgewogCQkJbXZfZmR0X2RwcmludGYoIkZhaWxlZCB0byBzZXQgcHJvcGVydHkgJyVzJyBvZiBub2RlICclcycgaW4gZGV2aWNlIHRyZWVcbiIsIHByb3AsIG5vZGUpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA3Miw4ICsxNDQ4LDggQEAKIAlpbnQgZXJyID0gMDsJCS8qIGVycm9yIG51bWJlciAqLwogCWludCBsZXZlbCA9IDA7CQkvKiBjdXJyZW50IGZkdCBzY2FubmluZyBkZXB0aCAqLwogCWNoYXIgYWxpYXNuYW1lWzEyOF07CS8qIGFsaWFzIG5hbWUgdG8gYmUgc3RvcmVkIGluICcvYWxpYXNlcycgbm9kZSAqLwotCWNoYXIgcGF0aFsxMjhdID0gIiI7CS8qIGZ1bGwgcGF0aCB0byBjdXJyZW50IG5vZGUgKi8KLQljaGFyIHRtcFsxMjhdOwkJLyogYXV4aWxpYXJ5IGNoYXIgYXJyYXkgZm9yIGV4dGVuZGVkIG5vZGUgbmFtZSovCisJY2hhciBwYXRoWzI1Nl0gPSAiIjsJLyogZnVsbCBwYXRoIHRvIGN1cnJlbnQgbm9kZSAqLworCWNoYXIgdG1wWzI1Nl07CQkvKiBhdXhpbGlhcnkgY2hhciBhcnJheSBmb3IgZXh0ZW5kZWQgbm9kZSBuYW1lKi8KIAljaGFyICpjdXQ7CQkvKiBhdXhpbGlhcnkgY2hhciBwb2ludGVyICovCiAJY29uc3QgY2hhciAqbm9kZTsJLyogbm9kZSBuYW1lICovCiAJdWludDMyX3QgdGFnOwkJLyogZGV2aWNlIHRyZWUgdGFnIGF0IGdpdmVuIG9mZnNldCAqLwpAQCAtMTI4Niw3ICsxNjYyLDcgQEAKIAkJaWYgKGVyciA8IDApIHsKIAkJCW12X2ZkdF9kcHJpbnRmKCJORkMgdXBkYXRlOiBmYWlsIHRvIG1vZGlmeSAnJXMnXG4iLAogCQkJCSAgICAgICBwcm9wKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAwOwogCQl9CiAJCW12X2ZkdF9kcHJpbnRmKCJORkMgdXBkYXRlOiBzZXQgJyVzJyBwcm9wZXJ0eSB0byAnJXMnXG4iLAogCQkJICAgICAgIHByb3AsIHByb3B2YWwpOwpAQCAtMTM0Myw3ICsxNzE5LDcgQEAKIAkJbXZfZmR0X21vZGlmeShmZHQsIGVyciwgZmR0X3NldHByb3AoZmR0LDAgLCBwcm9wLCBwcm9wdmFsLCBsZW4pKTsKIAlpZiAobGVuIDw9IDAgfHwgZXJyIDwgMCkgewogCQltdl9mZHRfZHByaW50ZigiTW9kaWZ5aW5nICclcycgaW4gJyVzJyBub2RlIGZhaWxlZFxuIiwgcHJvcCwgbm9kZSk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIDA7CiAJfQogCW12X2ZkdF9kcHJpbnRmKCJTZXQgJyVzJyBwcm9wZXJ0eSB0byBSb290IG5vZGVcbiIsIHByb3ApOwogCkBAIC0xMzU0LDYgKzE3MzAsOSBAQAogKiBtdl9mZHRfdXBkYXRlX3NlcmlhbAogKgogKiBERVNDUklQVElPTjoKKyogdGFyZ2V0CQk6IFVwZGF0ZSBzdGF0dXMgZmllbGQgb2Ygc2VyaWFsIG5vZGVzLgorKiBub2RlLCBwcm9wZXJ0aWVzOgk6IC1wcm9wZXJ0eSBzdGF0dXMgQCBub2RlIHNlcmlhbAorKiBkZXBlbmRlbmNpZXMJCTogY2hlY2tzIGlmIGl0IGlzIGEgYWN0aXZlIHNlcmlhbCBwb3J0IHZpYSBtdlVhcnRQb3J0R2V0IGZ1bmN0aW9uLgogKgogKiBJTlBVVDoKICoJZmR0LgpAQCAtMTM4MSwxMyArMTc2MCwxMyBAQAogCQlzcHJpbnRmKG5vZGUsICJzZXJpYWxAJXgiLCBNVl9VQVJUX1JFR1NfT0ZGU0VUKGkpKTsKIAkJaWYgKG12X2ZkdF9zZXRfbm9kZV9wcm9wKGZkdCwgbm9kZSwgcHJvcCwgcHJvcHZhbCkgPCAwKSB7CiAJCQltdl9mZHRfZHByaW50ZigiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSAnJXMnIG9mIG5vZGUgJyVzJyBpbiBkZXZpY2UgdHJlZVxuIiwgcHJvcCwgbm9kZSk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAogCXJldHVybiAwOwogfQotCisjaWZkZWYgQ09ORklHX1BJQ19HUElPCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdl9mZHRfdXBkYXRlX3BpY19ncGlvCiAqCkBAIC0xMzk3LDcgKzE3NzYsNyBAQAogKiAxLiBwaW5jdHJsL3BpYy1waW5zLTAvbWFydmVsbCxwaW5zID0gIm1wcDMzIiwgIm1wcDM0IjsKICogMi4gcG1fcGljL2N0cmwtZ3Bpb3MgPSA8MHgwMDAwMDAwYyAweDAwMDAwMDAxIDB4MDAwMDAwMDEgMHgwMDAwMDAwYyAweDAwMDAwMDAyIDB4MDAwMDAwMDE+OwogKiAgICBFYWNoIEdQSU8gaXMgcmVwcmVzZW50ZWQgaW4gJ2N0cmwtZ3Bpb3MnIHByb3BlcnR5IHdpdGggMyB2YWx1ZXMgb2YgMzIgYml0czoKLSogICAgJzxwaW5jdHJsLTBfYmFzZSArIGdwaW9fZ3JvdXBfbnVtICAgZ3Bpb19waW5fbnVtX2luX2dyb3VwICAgQUNUSVZFX0xPVz4nCisqICAgICc8Z3Bpb3NfcGhhbmRsZVtncGlvX2dyb3VwX251bV0gICBncGlvX3Bpbl9udW1faW5fZ3JvdXAgICBBQ1RJVkVfTE9XPicKICogICAgaS5lIDogZm9yIG1wcCAzMywgYW5kIGdpdmVuIHBpbmN0cmwtMCA9IDwweDAwMDAwMDBiPiA6CiAqICAgIGdwaW9fZ3JvdXBfbnVtCT0gMzMvMzIgPSAxCiAqICAgIGdwaW9fcGluX251bV9pbl9ncm91cD0gMzMlMzIgPSAxCkBAIC0xNDIxLDExICsxODAwLDEzIEBACiAJY29uc3QgY2hhciAqbWFydmVsbF9waW5zX3Byb3AgCT0gIm1hcnZlbGwscGlucyI7CiAJY29uc3QgY2hhciAqcG1fcGljTm9kZSAgCT0gInBtX3BpYyI7CiAJY29uc3QgY2hhciAqY3RybF9ncGlvc19wcm9wIAk9ICJjdHJsLWdwaW9zIjsKLQljb25zdCB2b2lkICpwaW5jdHJsXzBfYmFzZTsKLQlNVl9VMzIgcGluY3RybF8wX2Jhc2VfdmFsLCBwaWNHcGlvSW5mb1tNQVhfR1BJT19OVU1dOworCU1WX1UzMiBwaWNHcGlvSW5mb1tNQVhfR1BJT19OVU1dOwogCU1WX1UzMiBjdHJsX2dwaW9zX3Byb3BfdmFsdWVbMypNQVhfR1BJT19OVU1dOyAvKiAzKjMyYml0IGlzIHJlcXVpcmVkIHBlciBHUElPICovCiAJY2hhciBwcm9wdmFsWzI1Nl0gPSAiIjsKIAlpbnQgZXJyLCBsZW4gPSAwLCBub2Rlb2Zmc2V0LCBpLCBncGlvTWF4TnVtID0gbXZCb2FyZFBJQ0dwaW9HZXQocGljR3Bpb0luZm8pOworCU1WX1UzMiBncGlvc19waGFuZGxlWzJdOwkvKiBwaGFuZGxlIHZhbHVlcyBvZiBncGlvIG5vZGVzICovCisJTVZfVTMyIGdwaW9fb2Zmc2V0OworCWNoYXIgZ3Bpb19ub2RlWzMwXSA9ICIiOwogCiAJLyogaWYgYm9hcmQgaGFzIG5vIGRlZGljYXRlZCBQSUMgTVBQIFBpbnM6IHJlbW92ZSAncG1fcGljJyAmICdwaW5jdHJsL3BpYy1waW5zLTAnICovCiAJaWYgKGdwaW9NYXhOdW0gPD0gMCkgewpAQCAtMTQzNyw2ICsxODE4LDIxIEBACiAJCXJldHVybiAwOwogCX0KIAorCS8qIGZldGNoIGdwaW8gbm9kZXMnIHBoYW5kbGUuCisJICogZXZlcnkgR1BJTyBncm91cCBoYXZlIEdQSU8gbm9kZSBpZCBEVAorCSAqIGFuZCBmb3IgZWFjaCBHUElPIHBpbiwgYW4gZW50cnkgaXMgYWRkZWQgdG8gdGhlIGN0cmwtZ3Bpb3MsCisJICogaW4gb3JkZXIgdG8gbGluayBiZXR3ZWVuIHRoZSBlbnRyeSBhbmQgdGhlIHJlbGV2YW50IGdwaW8gbm9kZSBmb3IgdGhlIHJlbGV2YW50CisJICogZ3JvdXAsIHRoZSBwaGFuZGxlIG9mIHRoZSBncGlvIG5vZGUgaXMgYWRkZWQgdG8gdGhlIGVudHJ5ICovCisJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCQlzcHJpbnRmKGdwaW9fbm9kZSwgImdwaW9AJVgiLCBNVl9HUFBfUkVHU19PRkZTRVQoaSkpOworCQlncGlvX29mZnNldCA9IG12X2ZkdF9maW5kX25vZGUoZmR0LCBncGlvX25vZGUpOworCQlncGlvc19waGFuZGxlW2ldID0gZmR0X2dldF9waGFuZGxlKGZkdCwgZ3Bpb19vZmZzZXQpOworCQlpZiAoIWdwaW9zX3BoYW5kbGVbaV0pIHsKKwkJCW12T3NQcmludGYoIkZhaWxlZCB1cGRhdGluZyBzdXNwZW5kLXJlc3VtZSBHUElPIHBpbiBzZXR0aW5ncyBpbiBEVFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwogCS8qIHNldCBwaW5jdHJsL3BpYy1waW5zLTAvbWFydmVsbCxwaW5zIHByb3BlcnR5IGFzIGNvbmNhdGVuYXRlZCBzdHJpbmdzLgogCSAqIChpLmUgOiBtYXJ2ZWxsLHBpbnMgPSAibXBwMzMiLCAibXBwMzQiLCAibXBwMzUiKQogCSAqIGFwcGVuZCBuZXh0IHN0cmluZyBhZnRlciB0aGUgTlVMTCBjaGFyYWN0ZXIgdGhhdCB0aGUgcHJldmlvdXMKQEAgLTE0NDgsMjkgKzE4NDQsMjggQEAKIAltdl9mZHRfbW9kaWZ5KGZkdCwgZXJyLCBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIG1hcnZlbGxfcGluc19wcm9wLCBwcm9wdmFsLCBsZW4pKTsKIAlpZiAoZXJyIDwgMCkgewogCQltdl9mZHRfZHByaW50ZigiTW9kaWZ5aW5nICclcycgaW4gJyVzJyBub2RlIGZhaWxlZFxuIiwgbWFydmVsbF9waW5zX3Byb3AsIHBpY1BpbnNOb2RlKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gMDsKIAl9CiAJbXZfZmR0X2RwcmludGYoIlNldCAnJXMnIHByb3BlcnR5IGluICclcycgbm9kZVxuIiwgbWFydmVsbF9waW5zX3Byb3AsIHBpY1BpbnNOb2RlKTsKIAogCiAJLyogc2V0IHBtX3BpYy9jdHJsLWdwaW9zIHByb3BlcnR5OiAqLwogCW5vZGVvZmZzZXQgPSBtdl9mZHRfZmluZF9ub2RlKGZkdCwgcG1fcGljTm9kZSk7IAkvKiBmaW5kICdwbV9waWMnIG5vZGUgKi8KLQlwaW5jdHJsXzBfYmFzZSA9IGZkdF9nZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgInBpbmN0cmwtMCIsICZsZW4pOworCiAJaWYgKGxlbiA9PSAwKSB7CiAJCXByaW50ZigiRW1wdHkgcHJvcGVydHkgdmFsdWVcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOwogCX0KIAkvKiBFYWNoIEdQSU8gaXMgcmVwcmVzZW50ZWQgaW4gJ2N0cmwtZ3Bpb3MnIHByb3BlcnR5IHdpdGggMyB2YWx1ZXMgb2YgMzIgYml0czoKLQkgKiAnPHBpbmN0cmwtMF9iYXNlICsgZ3Bpb19ncm91cF9udW0gICBncGlvX3Bpbl9udW1faW5fZ3JvdXAgICBBQ1RJVkVfTE9XPicKKwkgKiAnPGdwaW9zX3BoYW5kbGVbZ3Bpb19ncm91cF9udW1dICAgZ3Bpb19waW5fbnVtX2luX2dyb3VwICAgQUNUSVZFX0xPVz4nCiAJICogaS5lIDogZm9yIG1wcCAzMywgYW5kIGdpdmVuIHBpbmN0cmwtMCA9IDwweDAwMDAwMDBiPiA6CiAJICogZ3Bpb19ncm91cF9udW0JPSAzMy8zMiA9IDEKIAkgKiBncGlvX3Bpbl9udW1faW5fZ3JvdXA9IDMzJTMyID0gMQogCSAqIEFDVElWRV9MT1cgPSAxCiAJICogRFQgZW50cnkgaXMgOiAnPDB4MDAwMDAwMGMgMHgwMDAwMDAwMSAweDAwMDAwMDAxPic7ICovCi0JcGluY3RybF8wX2Jhc2VfdmFsID0gbnRvaGwoKigodW5zaWduZWQgaW50KilwaW5jdHJsXzBfYmFzZSkpOwkvKiBEVCBpbnRlZ2VyIHZhbHVlcyBhcmUgaW4gQkUgZm9ybWF0ICovCiAJZm9yIChpID0gMCA7IGkgPCBncGlvTWF4TnVtIDsgaSsrKSB7CiAJCS8qIHBpbmN0cmxfMF9iYXNlICtncGlvIEdyb3VwIG51bSAqLwotCQljdHJsX2dwaW9zX3Byb3BfdmFsdWVbMyppXSA9IGh0b25sKHBpbmN0cmxfMF9iYXNlX3ZhbCArIHBpY0dwaW9JbmZvW2ldIC8gMzIpOworCQljdHJsX2dwaW9zX3Byb3BfdmFsdWVbMyppXSA9IGh0b25sKGdwaW9zX3BoYW5kbGVbcGljR3Bpb0luZm9baV0gLyAzMl0pOwogCiAJCS8qIDMyIHBpbnMgaW4gZWFjaCBncm91cCAqLwogCQljdHJsX2dwaW9zX3Byb3BfdmFsdWVbMyppICsgMV0gPSBodG9ubChwaWNHcGlvSW5mb1tpXSAlIDMyKTsKQEAgLTE0ODIsMTEgKzE4NzcsMTM1IEBACiAJbXZfZmR0X21vZGlmeShmZHQsIGVyciwgZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBjdHJsX2dwaW9zX3Byb3AsIGN0cmxfZ3Bpb3NfcHJvcF92YWx1ZSwgNCpncGlvTWF4TnVtKjMpKTsKIAlpZiAoZXJyIDwgMCkgewogCQltdl9mZHRfZHByaW50ZigiTW9kaWZ5aW5nICclcycgaW4gJyVzJyBub2RlIGZhaWxlZFxuIiwgY3RybF9ncGlvc19wcm9wLCBwbV9waWNOb2RlKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gMDsKIAl9CiAJbXZfZmR0X2RwcmludGYoIlNldCAnJXMnIHByb3BlcnR5IGluICclcycgbm9kZVxuIiwgY3RybF9ncGlvc19wcm9wLCBwbV9waWNOb2RlKTsKIAogCXJldHVybiAwOwotfQogCit9CisjZW5kaWYgLyogQ09ORklHX1BJQ19HUElPICovCisjaWZkZWYgTVZfSU5DTFVERV9TV0lUQ0gKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2ZkdF91cGRhdGVfc3dpdGNoCisqCisqIERFU0NSSVBUSU9OOgorKiAgVGhpcyByb3V0aW5lcyB1cGRhdGVzIHN3aXRjaCBub2RlIGFuZCBldGhlcm5ldC1waHkgbm9kZSBvbiBzdGF0dXMgYW5kIHJnbWlpXyh0KXJ4X3RpbWluZ19kZWxheSBwcm9wZXJ0aWVzCisqICBhY2NvcmRpbmcgdG8gU3dpdGNoIGV4aXN0ZW5jZSBhbmQgRGV2aWNlIElEIGRldGVjdGlvbiwgdGhpcyByb3V0ZSBhbHNvIHNldCBldGhlcm5ldC1waHlAaSBub2RlIG9uIHJlZyBwcm9wZXJ0eQorKiAgaWYgZXRoaSBpcyBjb25uZWN0ZWQgdG8gc3dpdGNoCisqCisqIElOUFVUOgorKglmZHQuCisqCisqIE9VVFBVVDoKKyoJTm9uZS4KKyoKKyogUkVUVVJOOgorKgktMSBvbiBlcnJvciBvcyAwIG90aGVyd2lzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfc3dpdGNoKHZvaWQgKmZkdCkKK3sKKwljaGFyIHByb3B2YWxbMTBdOwkJCQkvKiBwcm9wZXJ0eSB2YWx1ZSAqLworCXUzMiBwcm9wdmFsX3UzMiA9IDA7CisJY2hhciBwcm9wWzUwXTsJCQkJCS8qIHByb3BlcnR5IG5hbWUgKi8KKwljaGFyIG5vZGVbNjRdOwkJCQkJLyogbm9kZSBuYW1lICovCisJTVZfVTE2IHN3aXRjaF9kZXZpY2VfaWQ7CisJaW50IG5vZGVvZmZzZXQ7CQkJCQkvKiBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLworCWludCBlcnI7CisKKwlzd2l0Y2hfZGV2aWNlX2lkID0gbXZFdGhTd2l0Y2hHZXREZXZpY2VJRCgpOworCisJLyppZiBzd2l0Y2ggbW9kdWxlIGlzIGNvbm5lY3RlZCBhbmQgZGV0ZWN0IGNvcnJlY3Qgc3dpdGNoIGRldmljZSBJRCwgZW5hYmxlIHN3aXRjaCBpbiBmZHQqLworCWlmIChzd2l0Y2hfZGV2aWNlX2lkID4gMCkKKwkJc3ByaW50Zihwcm9wdmFsLCAib2theSIpOworCWVsc2UKKwkJc3ByaW50Zihwcm9wdmFsLCAiZGlzYWJsZWQiKTsKKworCXNwcmludGYobm9kZSwgInN3aXRjaCIpOworCXNwcmludGYocHJvcCwgInN0YXR1cyIpOworCisJaWYgKG12X2ZkdF9zZXRfbm9kZV9wcm9wKGZkdCwgbm9kZSwgcHJvcCwgcHJvcHZhbCkgPCAwKSB7CisJCW12X2ZkdF9kcHJpbnRmKCJGYWlsZWQgdG8gc2V0IHByb3BlcnR5ICclcycgb2Ygbm9kZSAnJXMnIGluIGRldmljZSB0cmVlXG4iLCBwcm9wLCBub2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZCgpKSB7CisJCWludCBpID0gMDsKKwkJc3dpdGNoX2RldmljZV9pZCA+Pj0gUURfUkVHX1NXSVRDSF9JRF9QUk9EVUNUX05VTV9PRkZTRVQ7CisKKwkJZm9yIChpID0gMDsgaSA8IG12Q3RybEV0aE1heFBvcnRHZXQoKTsgaSsrKSB7CisJCQkvKmNoYW5nZSB0aGUgc3dpdGNoIGNvbm5lY3RlZCBldGggcG9ydHMnIHBoeSB0byA5OTkqLworCQkJLyo5OTkgbWVhbiB0aGF0IGV0aGVybmV0IGlzIG5vdCBjb25uZWN0ZWQgdG8gcGh5Ki8KKwkJCWlmIChtdkJvYXJkU3dpdGNoQ29ubmVjdGVkUG9ydEdldChpKSAhPSAtMSkgeworCQkJCXNwcmludGYobm9kZSwgImV0aGVybmV0LXBoeUAlZCIsIGkpOworCQkJCXNwcmludGYocHJvcCwgInJlZyIpOworCQkJCXByb3B2YWxfdTMyID0gOTk5OworCisJCQkJbm9kZW9mZnNldCA9IG12X2ZkdF9maW5kX25vZGUoZmR0LCBub2RlKTsKKwkJCQlpZiAobm9kZW9mZnNldCA8IDApIHsKKwkJCQkJbXZfZmR0X2RwcmludGYoIkxhY2sgb2YgJyVzJyBub2RlIGluIGRldmljZSB0cmVlXG4iLCBub2RlKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKworCQkJCS8qIFNldHVwIFBIWSBhZGRyZXNzIGluIERUIGluICJyZWciIHByb3BlcnR5IG9mIGFuIGFwcHJvcHJpYXRlIFBIWSBub2RlLgorCQkJCVRoaXMgdmFsdWUgaXMgSEVYIG51bWJlciwgbm90IGEgc3RyaW5nLCBhbmQgdXNlcyBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwkJCQlwcm9wdmFsX3UzMiA9IGh0b25sKHByb3B2YWxfdTMyKTsKKwkJCQltdl9mZHRfbW9kaWZ5KGZkdCwgZXJyLCBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIHByb3AsCisJCQkJCSZwcm9wdmFsX3UzMiwgc2l6ZW9mKHByb3B2YWxfdTMyKSkpOworCQkJCWlmIChlcnIgPCAwKSB7CisJCQkJCW12X2ZkdF9kcHJpbnRmKCJNb2RpZnlpbmcgJyVzJyBpbiAnJXMnIG5vZGUgZmFpbGVkXG4iLCBwcm9wLCBub2RlKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qZm9yIEU2MTcyIHN3aXRjaCwgcmdtaWlfcnhfdGltaW5nX2RlbGF5IGFuZCByZ21paV90eF90aW1pbmdfZGVsYXkgc2hvdWxkIGJlIGVuYWJsZWQqLworCQlpZiAoc3dpdGNoX2RldmljZV9pZCA9PSBNVl9FNjE3Ml9QUk9EVUNUX05VTSkgeworCQkJLypzZXQgcmdtaWlfcnhfdGltaW5nX2RlbGF5IGFuZCByZ21paV90eF90aW1pbmdfZGVsYXkgdG8gYmUgZW5hYmxlZCovCisJCQlzcHJpbnRmKG5vZGUsICJzd2l0Y2giKTsKKwkJCXNwcmludGYocHJvcCwgInJnbWlpX3J4X3RpbWluZ19kZWxheSIpOworCQkJLyplbmFibGUgZGVsYXkgdG8gUlhDTEsgZm9yIElORCBpbnB1dHMgd2hlbiBwb3J0IGlzIGluIFJHTUlJIG1vZGUqLworCQkJcHJvcHZhbF91MzIgPSAxOworCisJCQlub2Rlb2Zmc2V0ID0gbXZfZmR0X2ZpbmRfbm9kZShmZHQsIG5vZGUpOworCQkJaWYgKG5vZGVvZmZzZXQgPCAwKSB7CisJCQkJbXZfZmR0X2RwcmludGYoIkxhY2sgb2YgJyVzJyBub2RlIGluIGRldmljZSB0cmVlXG4iLCBub2RlKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCS8qIFNldHVwIHJnbWlpX3J4X3RpbWluZ19kZWxheSBpbiBEVC4KKwkJCVRoaXMgdmFsdWUgaXMgSEVYIG51bWJlciwgbm90IGEgc3RyaW5nLCBhbmQgdXNlcyBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwkJCXByb3B2YWxfdTMyID0gaHRvbmwocHJvcHZhbF91MzIpOworCQkJbXZfZmR0X21vZGlmeShmZHQsIGVyciwgZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLCAmcHJvcHZhbF91MzIsIHNpemVvZihwcm9wdmFsX3UzMikpKTsKKwkJCWlmIChlcnIgPCAwKSB7CisJCQkJbXZfZmR0X2RwcmludGYoIk1vZGlmeWluZyAnJXMnIGluICclcycgbm9kZSBmYWlsZWRcbiIsIHByb3AsIG5vZGUpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJc3ByaW50Zihub2RlLCAic3dpdGNoIik7CisJCQlzcHJpbnRmKHByb3AsICJyZ21paV90eF90aW1pbmdfZGVsYXkiKTsKKwkJCS8qZW5hYmxlIGRlbGF5IHRvIEdUWENMSyBmb3IgT1VURCBvdXRwdXRzIHdoZW4gcG9ydCBpcyBpbiBSR01JSSBtb2RlKi8KKwkJCXByb3B2YWxfdTMyID0gMTsKKwkJCW5vZGVvZmZzZXQgPSBtdl9mZHRfZmluZF9ub2RlKGZkdCwgbm9kZSk7CisJCQlpZiAobm9kZW9mZnNldCA8IDApIHsKKwkJCQltdl9mZHRfZHByaW50ZigiTGFjayBvZiAnJXMnIG5vZGUgaW4gZGV2aWNlIHRyZWVcbiIsIG5vZGUpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJLyogU2V0dXAgcmdtaWlfdHhfdGltaW5nX2RlbGF5IGluIERULgorCQkJVGhpcyB2YWx1ZSBpcyBIRVggbnVtYmVyLCBub3QgYSBzdHJpbmcsIGFuZCB1c2VzIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCQkJcHJvcHZhbF91MzIgPSBodG9ubChwcm9wdmFsX3UzMik7CisJCQltdl9mZHRfbW9kaWZ5KGZkdCwgZXJyLCBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIHByb3AsICZwcm9wdmFsX3UzMiwgc2l6ZW9mKHByb3B2YWxfdTMyKSkpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQltdl9mZHRfZHByaW50ZigiTW9kaWZ5aW5nICclcycgaW4gJyVzJyBub2RlIGZhaWxlZFxuIiwgcHJvcCwgbm9kZSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9tYWluLmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9tYWluLmMKaW5kZXggZGJmMjE1OS4uMmFhYTQzOSAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfbWFpbi5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X21haW4uYwpAQCAtOTgsNyArOTgsNyBAQAogI2Vsc2UKICNkZWZpbmUgREIoeCkKICNlbmRpZgotCitleHRlcm4gdm9pZCBmZHRfZW52X3NldHVwKGNoYXIgKmZkdGZpbGUsIE1WX0JPT0wgcnVuVXBkYXRlKTsKIGV4dGVybiBpbnQgZGlzcGxheV9kcmFtX2NvbmZpZyhpbnQgcHJpbnQpOwogaW50IGxhdGVfcHJpbnRfY3B1aW5mbyh2b2lkKTsKIC8qIENQVSBhZGRyZXNzIGRlY29kZSB0YWJsZS4gKi8KQEAgLTI5MSw3ICsyOTEsNiBAQAogCQkqKHVuc2lnbmVkIGludCAqKSgweDAgKyBpKSA9ICoodW5zaWduZWQgaW50KikoQ09ORklHX1NZU19URVhUX0JBU0UgKyBpKTsKIAl9CiAJbXZCb2FyZERlYnVnTGVkKDQpOwotCW12X3ByaW50X21hcCgpOwogCXJldHVybiAwOwogfQogCkBAIC0zMDMsOCArMzAyLDggQEAKIAogCWVudlNldERlZmF1bHQoImNvbnNvbGUiLCAiY29uc29sZT10dHlTMCwxMTUyMDAiKTsKICNpZiBkZWZpbmVkKE1WX05BTkQpICYmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCi0JZW52U2V0RGVmYXVsdCgibXRkcGFydHMiLCAiJ210ZHBhcnRzPWFybWFkYS1uYW5kOjhtKGJvb3Qpcm8sOG1AOG0oa2VybmVsKSwtKHJvb3Rmcyk7bXRkcGFydHM9c3BpX2ZsYXNoOjRtKGJvb3QpLC0oc3BpLXJvb3RmcyknIik7Ci0JZW52U2V0RGVmYXVsdCgibXRkaWRzIiwgIm5hbmQwPWFybWFkYS1uYW5kO3NwaTA9c3BpX2ZsYXNoIik7CisJZW52U2V0RGVmYXVsdCgibXRkcGFydHMiLCAiJ210ZHBhcnRzPWFybWFkYS1uYW5kOjhtKGJvb3Qpcm8sOG1AOG0oa2VybmVsKSwtKHJvb3Rmcyk7c3BpX2ZsYXNoOjRtKGJvb3QpLC0oc3BpLXJvb3RmcyknIik7CisJZW52U2V0RGVmYXVsdCgibXRkaWRzIiwgIm5hbmQwPWFybWFkYS1uYW5kLHNwaTA9c3BpX2ZsYXNoIik7CiAjZWxpZiBkZWZpbmVkKE1WX05BTkQpCiAJZW52U2V0RGVmYXVsdCgibXRkcGFydHMiLCAibXRkcGFydHM9YXJtYWRhLW5hbmQ6OG0oYm9vdClybyw4bUA4bShrZXJuZWwpLC0ocm9vdGZzKSIpOwogCWVudlNldERlZmF1bHQoIm10ZGlkcyIsICJuYW5kMD1hcm1hZGEtbmFuZCIpOwpAQCAtMzkzLDYgKzM5Miw5IEBACiAJZW52U2V0RGVmYXVsdCgiYm9vdGNtZF9sZ2N5IiwgInRmdHBib290IDB4MjAwMDAwMCAkaW1hZ2VfbmFtZTsgc2V0ZW52IGJvb3RhcmdzICRib290YXJnc19kZmx0OyBib290bSAweDIwMDAwMDA7ICIpOwogI2VuZGlmIC8qICNpZiBkZWZpbmVkIChDT05GSUdfQ01EX1NUQUdFX0JPT1QpICovCiAKKyNpZmRlZiBDT05GSUdfQ01EX1NPVVJDRQorCWVudlNldERlZmF1bHQoInJ1bl9zY3JpcHQiLCAibm8iKTsKKyNlbmRpZgogCS8qIG5ldGJzZCBib290IGFyZ3VtZW50cyAqLwogCWVudiA9IGdldGVudigibmV0YnNkX2VuIik7CiAJaWYoICFlbnYgfHwgKCAoKHN0cmNtcChlbnYsIm5vIikgPT0gMCkgfHwgKHN0cmNtcChlbnYsIk5vIikgPT0gMCkgKSkpIHsKQEAgLTQ2Myw2ICs0NjUsMTMgQEAKIAllbnZTZXREZWZhdWx0KCJlbmFMUEFFIiwgIm5vIik7OwogI2VuZGlmCiAKKwkvKiBGbGF0dGVuIERldmljZSBUcmVlIGVudmlyb25tZW50IHNldHVwICovCisjaWZkZWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQKKwlmZHRfZW52X3NldHVwKCJtc3lzLmR0YiIsIE1WX0ZBTFNFKTsgLyogc3RhdGljIHNldHVwOiBTa2lwIERUIHVwZGF0ZSBmb3IgY3VzdG9tZXIgKi8KKyNlbHNlCisJZmR0X2Vudl9zZXR1cCgibXN5cy5kdGIiLCBNVl9GQUxTRSk7IC8qIGR5bmFtaWMgc2V0dXA6IHJ1biBEVCB1cGRhdGUgKGZhbHNlIHNpbmNlIG5vdCBzdXBwb3J0ZWQgeWV0KSAqLworI2VuZGlmCisKICNpZiAoQ09ORklHX0JPT1RERUxBWSA+PSAwKQogCWVudiA9IGdldGVudigiYm9vdGNtZCIpOwogCWlmKCFlbnYpCkBAIC02ODEsNyArNjkwLDcgQEAKIAogCS8qIGluaXQgdGhlIHVuaXRzIGRlY29kZSB3aW5kb3dzICovCiAJbWlzY19pbml0X3JfZGVjX3dpbigpOwotCisJbXZfcHJpbnRfbWFwKCk7CiAJLyogQ2xlYXIgb2xkIGtlcm5lbCBpbWFnZXMgd2hpY2ggcmVtYWluZWQgc3RvcmVkIGluIG1lbW9yeSAqLwogCW1lbXNldCAoKHZvaWQgKilDT05GSUdfU1lTX0xPQURfQUREUiwgMCwgQ09ORklHX1NZU19NSU5fSERSX0RFTF9TSVpFKTsKIAltdkJvYXJkRGVidWdMZWQoNik7CkBAIC02OTgsNyArNzA3LDEyIEBACiAJLyogSW5pdCB0aGUgUEhZIG9yIFN3aXRjaCBvZiB0aGUgYm9hcmQgKi8KIAltdkJvYXJkRWdpZ2FQaHlJbml0KCk7CiAjZW5kaWYgLyogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9VTk1fRVRIKSB8fCBkZWZpbmVkKE1WX0lOQ0xVREVfR0lHX0VUSCkgKi8KLQorI2lmZGVmIENPTkZJR19DTURfU09VUkNFCisJLyogcnVuIHNhdmVkIHNjcmlwdCAqLworCWVudiA9IGdldGVudigicnVuX3NjcmlwdCIpOworCWlmIChlbnYgJiYgc3RyY21wKGVudiwgInllcyIpID09IDApCisJCXJ1bl9jb21tYW5kKCJtdnNvdXJjZSBydW4iLCAwKTsKKyNlbmRpZgogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9waHkuYyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X3BoeS5jCmluZGV4IDQxMWU3MzkuLmQyODllMmUgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X3BoeS5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X3BoeS5jCkBAIC04MCw2ICs4MCw3IEBACiAjaW5jbHVkZSAiZXRoL2diZS9tdkV0aFJlZ3MuaCIKICNlbmRpZgogI2luY2x1ZGUgIm12U3lzRXRoUGh5QXBpLmgiCisjaW5jbHVkZSAiZXRoU3dpdGNoL212U3dpdGNoUmVncy5oIgogI2luY2x1ZGUgImV0aFN3aXRjaC9tdlN3aXRjaC5oIgogCiAjaWYgZGVmaW5lZCAoTVY4OEY2NlhYKQpAQCAtMTkxLDcgKzE5Miw5IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBtdkJvYXJkTGVkTWF0cml4SW5pdCh2b2lkKQogeworI2lmZGVmIE1WX0lOQ0xVREVfU1dJVENICiAJTVZfVTggaTsKKyNlbmRpZgogCiAJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzg4RjY3WDApCiAJCS8qIExlZCBtYXRyaXggbW9kZSBpbiA3Qml0ICovCkBAIC0yMDUsNiArMjA4LDcgQEAKIAkJLyogVXNlIGFuIGludGVybmFsIGRldmljZSBzaWduYWwgdG8gZHJpdmUgdGhlIExFRCBNYXRyaXggQ29udHJvbCAqLwogCQlNVl9SRUdfV1JJVEUoTEVEX01BVFJJWF9DT05UUk9MX1JFRygyKSwgQklUMCB8IEJJVDIgfCBCSVQzIHwgQklUNSk7CiAKKyNpZmRlZiBNVl9JTkNMVURFX1NXSVRDSAogCQkvKiBpbml0aWFsaXplIGludGVybmFsIFBIWXMgY29udHJvbGxlZCBieSBzd2l0Y2ggKi8KIAkJaWYgKG12Qm9hcmRJc0ludGVybmFsU3dpdGNoQ29ubmVjdGVkKCkgPT0gTVZfVFJVRSkgewogCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewpAQCAtMjE4LDYgKzIyMiw3IEBACiAJCQkJbXZFdGhTd2l0Y2hQaHlSZWdXcml0ZSgweDAsIGksIDB4MTYsIDB4MCk7CiAJCQl9CiAJCX0KKyNlbmRpZgogCX0KIAogCS8qIGluaXRpYWxpemUgRXh0ZXJuYWwgUkdNSUktMCBQSFkgKFNNSSBjb250cm9sbGVkIGJ5IE1BQzAgQGFkZHJlc3MgMHgxKSAqLwpAQCAtMjg2LDYgKzI5MSw5IEBACiAJaW50IGk7CiAJTVZfU1RBVFVTICAgc3RhdHVzOwogCU1WX1UzMiBwaHlBZGRyOworI2lmZGVmIE1WX0lOQ0xVREVfU1dJVENICisJTVZfVTE2IHN3aXRjaERldmljZUlEOworI2VuZGlmCiAKIAlmb3IgKGkgPSAwOyBpIDwgbXZDdHJsRXRoTWF4UG9ydEdldCgpOyBpKyspIHsKIAkJaWYgKE1WX0ZBTFNFID09IG12Q3RybFB3ckNsY2tHZXQoRVRIX0dJR19VTklUX0lELCBpKSkKQEAgLTMyMSw2ICszMjksMjcgQEAKIAkJfQogCX0KIAorI2lmZGVmIE1WX0lOQ0xVREVfU1dJVENICisJc3dpdGNoRGV2aWNlSUQgPSBtdkV0aFN3aXRjaEdldERldmljZUlEKCk7CisJaWYgKG12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZCgpKSB7CisJCXN3aXRjaERldmljZUlEID4+PSBRRF9SRUdfU1dJVENIX0lEX1BST0RVQ1RfTlVNX09GRlNFVDsKKwkJZm9yIChpID0gMDsgaSA8IG12Q3RybEV0aE1heFBvcnRHZXQoKTsgaSsrKSB7CisJCQkvKmZvcmNlIHRoZSBzd2l0Y2ggY29ubmVjdGVkIGV0aCBwb3J0IGxpbmsgdXAgYW5kIGRpc2FibGUgYXV0by1uZWcsIGJpdCAxNSBtdXN0IHNldCB0byAxKi8KKwkJCWlmIChtdkJvYXJkU3dpdGNoQ29ubmVjdGVkUG9ydEdldChpKSAhPSAtMSkKKwkJCQlNVl9SRUdfV1JJVEUoKE5FVEFfR01BQ19BTl9DVFJMX1JFRyhpKSArIElOVEVSX1JFR1NfQkFTRSksCisJCQkJCShORVRBX0ZPUkNFX0xJTktfUEFTU19NQVNLIHwgTkVUQV9TRVRfR01JSV9TUEVFRF8xMDAwX01BU0sgfAorCQkJCQlORVRBX1NFVF9GTE9XX0NPTlRST0xfTUFTSyB8IE5FVEFfRkxPV19DT05UUk9MX0FEVkVSVElTRV9NQVNLIHwKKwkJCQkJTkVUQV9TRVRfRlVMTF9EVVBMRVhfTUFTSyB8IEJJVDE1KS8qMHg5MzQyKi8pOworCQl9CisKKwkJLypub3cgb25seSBFNjE3MiBzd2l0Y2ggd29ya3MgZm9yIE5FVEEsIHNvIGhlcmUgbm8gb3RoZXIgc3dpdGNoIGluaXRpYWxpemF0aW9uIGlzIGNhbGxlZCovCisJCWlmIChzd2l0Y2hEZXZpY2VJRCA9PSBNVl9FNjE3Ml9QUk9EVUNUX05VTSkKKwkJCW12RXRoRTYxNzJTd2l0Y2hCYXNpY0luaXQoMCk7CisJCWlmIChzd2l0Y2hEZXZpY2VJRCA9PSBNVl9FNjE3Nl9QUk9EVUNUX05VTSkKKwkJCW12RXRoRTYxNzFTd2l0Y2hCYXNpY0luaXQoMCk7CisJfQorI2VuZGlmCisKICNlbGlmIGRlZmluZWQgKE1WODhGNjZYWCkgLyogQXZhbnRhLUxQOiBkeW5hbWljIFBQdjIgY29uZmlndXJhdGlvbiAqLwogICAgICAgICBNVl9VMzIgZXRoQ29tcGxleCA9IG12Qm9hcmRFdGhDb21wbGV4Q29uZmlnR2V0KCk7CiAJY2hhciAqZWVlRW5hYmxlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X3J0YzIuYyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X3J0YzIuYwppbmRleCAwM2I4MTIwLi5jNjFiNDA1IDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9ydGMyLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfcnRjMi5jCkBAIC03MCwzOCArNzAsMTAwIEBACiAjaW5jbHVkZSAibXZfcnRjMi5oIgogCiAjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCi0KKy8qIFRoaXMgZGVmaW5lIGZvciBXQSBpbiBydGMgcmVhZCAqLworI2RlZmluZSBTQU1QTEVfTlIgMTAwCiBzdGF0aWMgaW50IHJ0Y19yZWFkeSA9IC0xOwogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBydGNfaW5pdCh2b2lkKQogewogCS8qIFVwZGF0ZSBSVEMtTUJVUyBicmlkZ2UgdGltaW5nIHBhcmFtZXRlcnMgKi8KKwkjaWZkZWYgRVJSQVRBX0ZFXzMxMjQwNjQKKwkvKiBGdW5jdGlvbmFsIEVycmF0YSBSZWYgIzogRkUtMzEyNDA2NCAtICBXQSBmb3IgZmFpbGluZyB0aW1lIHJlYWQgYXR0ZW1wdHMuCisJICogRGVzY3JpcHRpb246CisJICogCVRoZSBkZXZpY2Ugc3VwcG9ydHMgQ1BVIHdyaXRlIGFuZCByZWFkIGFjY2VzcyB0byB0aGUgUlRDIFRpbWUgcmVnaXN0ZXIuCisJICogCUhvd2V2ZXIsIGR1ZSB0byB0aGlzIGVycmF0dW0sIFdyaXRlIHRvIFJUQyBUSU1FIHJlZ2lzdGVyIG1heSBmYWlsLgorCSAqIAlSZWFkIGZyb20gUlRDIFRJTUUgcmVnaXN0ZXIgbWF5IGZhaWwuCisJICogV29ya2Fyb3VuZDoKKwkgKiAJQmVmb3JlIHdyaXRpbmcgdG8gUlRDIFRJTUUgcmVnaXN0ZXIsIGlzc3VlIGEgZHVtbXkgd3JpdGUgb2YgMHgwIHR3aWNlIHRvIFJUQyBTdGF0dXMgcmVnaXN0ZXIuCisJICogCVJUQyBUSU1FIHJlZ2lzdGVyIHNob3VsZCBiZSByZWFkIHR3aWNlLCB0aGUgc2Vjb25kIHJlYWQgd2lsbCByZXR1cm4gYSBwcm9wZXIgdmFsdWUuCisJICogCUNvbmZpZ3VyZSBtYXhpbXVtIHZhbHVlICgweDNGRikgaW4gd3JpdGUgY2xvY2sgcGVyaW9kIGluIFJUQyBNYnVzIEJyaWRnZSBUaW1pbmcgQ29udHJvbCByZWdpc3Rlci4KKwkgKiBGdW5jdGlvbmFsIEltcGFjdCBBZnRlciBXb3JrYXJvdW5kIGlzIGFwcGxpZWQ6CisJICogCU5vIGZ1bmN0aW9uYWwgaW1wYWN0IGFmdGVyIFdBIGlzIGFwcGxpZWQKKwkgKi8KKwlNVl9SRUdfV1JJVEUoTVZfUlRDMl9TT0NfT0ZGU0VULCAweEZENEQ0RkZGKTsKKyNlbHNlCiAJTVZfUkVHX1dSSVRFKE1WX1JUQzJfU09DX09GRlNFVCwgMHhGRDRENENGQSk7CisjZW5kaWYKIAlydGNfcmVhZHkgPSAxOwogfQogCisjaWZkZWYgRVJSQVRBX0ZFXzMxMjQwNjQKK3N0cnVjdCBfc3RyVGltZTJGcmVxIHsKKwl1bnNpZ25lZCBsb25nIG5UaW1lOworCXVuc2lnbmVkIGludCAgbkZyZXE7CisKK307CisjZW5kaWYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgcnRjX2dldChzdHJ1Y3QgcnRjX3RpbWUgKnRtKQogewotCXVuc2lnbmVkIGxvbmcgdGltZSwgdGltZV9jaGVjazsKKyNpZmRlZiBFUlJBVEFfRkVfMzEyNDA2NAorCS8qIEZ1bmN0aW9uYWwgRXJyYXRhIFJlZiAjOiBGRS0zMTI0MDY0IC0gV0EgZm9yIGZhaWxpbmcgdGltZSByZWFkIGF0dGVtcHRzLgorCSAqIERlc2NyaXB0aW9uOgorCSAqICAgICAgVGhlIGRldmljZSBzdXBwb3J0cyBDUFUgd3JpdGUgYW5kIHJlYWQgYWNjZXNzIHRvIHRoZSBSVEMgVGltZSByZWdpc3Rlci4KKwkgKglIb3dldmVyLCBkdWUgdG8gdGhpcyBlcnJhdHVtLCBXcml0ZSB0byBSVEMgVElNRSByZWdpc3RlciBtYXkgZmFpbC4KKwkgKglSZWFkIGZyb20gUlRDIFRJTUUgcmVnaXN0ZXIgbWF5IGZhaWwuCisJICogV29ya2Fyb3VuZDoKKwkgKglCZWZvcmUgd3JpdGluZyB0byBSVEMgVElNRSByZWdpc3RlciwgaXNzdWUgYSBkdW1teSB3cml0ZSBvZiAweDAgdHdpY2UgdG8KKwkgKglSVEMgU3RhdHVzIHJlZ2lzdGVyLgorCSAqCUNvbmZpZ3VyZSBtYXhpbXVtIHZhbHVlICgweDNGRikgaW4gd3JpdGUgY2xvY2sgcGVyaW9kIGluIFJUQyBNYnVzIEJyaWRnZQorCSAqCVRpbWluZyBDb250cm9sIHJlZ2lzdGVyLgorCSAqCUJlZm9yZSB3cml0aW5nIHRvIFJUQyBUSU1FIHJlZ2lzdGVyLCBpc3N1ZSBhIGR1bW15IHdyaXRlIG9mIDB4MCB0d2ljZSB0bworCSAqCVJUQyBTdGF0dXMgcmVnaXN0ZXIuCisJICogICAgICBSVEMgVElNRSByZWdpc3RlciBzaG91bGQgYmUgcmVhZCAxMDAgdGltZXMsIHRoZW4gZmluZCB0aGUgcmVzdWx0CisJICoJdGhhdCBhcHBlYXIgbW9zdCBmcmVxdWVudGx5LCB1c2UgdGhpcyByZXN1bHQgYXMgdGhlIGNvcnJlY3QgdmFsdWUuCisJICovCisJdW5zaWduZWQgbG9uZyBuVGltZUFycmF5W1NBTVBMRV9OUl0sIGksIGosIG5UaW1lLCBuTWF4ID0gMCwgaW5kZXhNYXggPSBTQU1QTEVfTlIgLSAxOworCXN0cnVjdCBfc3RyVGltZTJGcmVxIHNUaW1lVG9GcmVxW1NBTVBMRV9OUl07CisjZW5kaWYKIAogCWlmIChydGNfcmVhZHkgIT0gMSkKIAkJcnRjX2luaXQoKTsKKyNpZmRlZiBFUlJBVEFfRkVfMzEyNDA2NAorCS8qIHJlYWQgUlRDIFRJTUUgcmVnaXN0ZXIgMTAwIHRpbWVzIGFuZCBzYXZlIHRoZSB2YWx1ZXMgaW4gYXJyYXksCisJICAgaW5pdGlhbGl6ZSB0aGUgY291bnRlcnMgdG8gemVybyAqLworCWZvciAoaSA9IDA7IGkgPCBTQU1QTEVfTlI7IGkrKykgeworCQlzVGltZVRvRnJlcVtpXS5uRnJlcSA9IDA7CisJCW5UaW1lQXJyYXlbaV0gPSBSVENfUkVBRF9SRUcoUlRDX1RJTUVfUkVHX09GRlMpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgU0FNUExFX05SOyBpKyspIHsKKwkJblRpbWUgPSBuVGltZUFycmF5W2ldOworCQkvKiBpZiBuVGltZSBhcHBlYXJzIGluIHNUaW1lVG9GcmVxIGFycmF5IHNvIGFkZCB0aGUgY291bnRlciBvZiBuVGltZSB2YWx1ZSwKKwkJICAgaWYgZGlkbid0IGFwcGVhciB5ZXQgaW4gY291bnRlcnMgYXJyYXkgdGhlbiBhbGxvY2F0ZSBuZXcgbWVtYmVyIG9mCisJCSAgIHNUaW1lVG9GcmVxIGFycmF5IHdpdGggY291bnRlciA9IDEgKi8KKwkJZm9yIChqID0gMDsgaiA8IFNBTVBMRV9OUjsgaisrKSB7CisJCQlpZiAoc1RpbWVUb0ZyZXFbal0ubkZyZXEgPT0gMCB8fCBzVGltZVRvRnJlcVtqXS5uVGltZSA9PSBuVGltZSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoc1RpbWVUb0ZyZXFbal0ubkZyZXEgPT0gMCkKKwkJCXNUaW1lVG9GcmVxW2pdLm5UaW1lID0gblRpbWU7CisJCXNUaW1lVG9GcmVxW2pdLm5GcmVxKys7CisJCS8qZmluZCB0aGUgbW9zdCBjb21tb24gcmVzdWx0Ki8KKwkJaWYgKG5NYXggPCBzVGltZVRvRnJlcVtqXS5uRnJlcSkgeworCQkJaW5kZXhNYXggPSBqOworCQkJbk1heCA9IHNUaW1lVG9GcmVxW2pdLm5GcmVxOworCQl9CisJfQogCi0JdGltZSA9IFJUQ19SRUFEX1JFRyhSVENfVElNRV9SRUdfT0ZGUyk7Ci0JLyogV0EgZm9yIGZhaWxpbmcgdGltZSByZWFkIGF0dGVtcHRzLiBUaGUgSFcgRVJSQVRBIGluZm9ybWF0aW9uIHNob3VsZCBiZSBhZGRlZCBoZXJlICovCi0JLyogaWYgZGV0ZWN0ZWQgbW9yZSB0aGFuIG9uZSBzZWNvbmQgYmV0d2VlbiB0d28gdGltZSByZWFkcywgcmVhZCBvbmNlIGFnYWluICovCi0JdGltZV9jaGVjayA9IFJUQ19SRUFEX1JFRyhSVENfVElNRV9SRUdfT0ZGUyk7Ci0JaWYgKCh0aW1lX2NoZWNrIC0gdGltZSkgPiAxKQotCQl0aW1lX2NoZWNrID0gUlRDX1JFQURfUkVHKFJUQ19USU1FX1JFR19PRkZTKTsKLQkvKiBFbmQgb2YgV0EgKi8KLQotCXRvX3RtKHRpbWVfY2hlY2ssIHRtKTsKLQorCXRvX3RtKHNUaW1lVG9GcmVxW2luZGV4TWF4XS5uVGltZSwgdG0pOworI2Vsc2UKKwl0b190bShSVENfUkVBRF9SRUcoUlRDX1RJTUVfUkVHX09GRlMpLCB0bSk7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgcnRjX3NldChzdHJ1Y3QgcnRjX3RpbWUgKnRtKQogewpAQCAtMTEzLDEwICsxNzUsMjIgQEAKIAl0aW1lID0gbWt0aW1lKHRtLT50bV95ZWFyLCB0bS0+dG1fbW9uLAogCQkJCSAgdG0tPnRtX21kYXksIHRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKIAotCS8qIFdBIGZvciBmYWlsaW5nIHRpbWUgc2V0IGF0dGVtcHRzLiBUaGUgSFcgRVJSQVRBIGluZm9ybWF0aW9uIHNob3VsZCBiZSBhZGRlZCBoZXJlICovCisjaWZkZWYgRVJSQVRBX0ZFXzMxMjQwNjQKKwkvKiBGdW5jdGlvbmFsIEVycmF0YSBSZWYgIzogRkUtMzEyNDA2NCAtICBXQSBmb3IgZmFpbGluZyB0aW1lIHJlYWQgYXR0ZW1wdHMuCisJICogRGVzY3JpcHRpb246CisJICogCVRoZSBkZXZpY2Ugc3VwcG9ydHMgQ1BVIHdyaXRlIGFuZCByZWFkIGFjY2VzcyB0byB0aGUgUlRDIFRpbWUgcmVnaXN0ZXIuCisJICogCUhvd2V2ZXIsIGR1ZSB0byB0aGlzIGVycmF0dW0sIFdyaXRlIHRvIFJUQyBUSU1FIHJlZ2lzdGVyIG1heSBmYWlsLgorCSAqIAlSZWFkIGZyb20gUlRDIFRJTUUgcmVnaXN0ZXIgbWF5IGZhaWwuCisJICogV29ya2Fyb3VuZDoKKwkgKiAJQmVmb3JlIHdyaXRpbmcgdG8gUlRDIFRJTUUgcmVnaXN0ZXIsIGlzc3VlIGEgZHVtbXkgd3JpdGUgb2YgMHgwIHR3aWNlIHRvIFJUQyBTdGF0dXMgcmVnaXN0ZXIuCisJICogCVJUQyBUSU1FIHJlZ2lzdGVyIHNob3VsZCBiZSByZWFkIHR3aWNlLCB0aGUgc2Vjb25kIHJlYWQgd2lsbCByZXR1cm4gYSBwcm9wZXIgdmFsdWUuCisJICogCUNvbmZpZ3VyZSBtYXhpbXVtIHZhbHVlICgweDNGRikgaW4gd3JpdGUgY2xvY2sgcGVyaW9kIGluIFJUQyBNYnVzIEJyaWRnZSBUaW1pbmcgQ29udHJvbCByZWdpc3Rlci4KKwkgKiBGdW5jdGlvbmFsIEltcGFjdCBBZnRlciBXb3JrYXJvdW5kIGlzIGFwcGxpZWQ6CisJICogCU5vIGZ1bmN0aW9uYWwgaW1wYWN0IGFmdGVyIFdBIGlzIGFwcGxpZWQKKwkgKi8KIAlSVENfV1JJVEVfUkVHKDAsIFJUQ19TVEFUVVNfUkVHX09GRlMpOwotCW1kZWxheSgxMDApOwotCS8qIEVuZCBvZiBTVyBXQSAqLworCVJUQ19XUklURV9SRUcoMCwgUlRDX1NUQVRVU19SRUdfT0ZGUyk7CisjZW5kaWYKIAlSVENfV1JJVEVfUkVHKHRpbWUsIFJUQ19USU1FX1JFR19PRkZTKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfc2VyaWFsLmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9zZXJpYWwuYwppbmRleCA4OWVhMjliLi4xZTQ5ZWY5IDEwMDc1NQotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9zZXJpYWwuYworKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9zZXJpYWwuYwpAQCAtNDAsNyArNDAsMTEgQEAKICAqLwogX193ZWFrIE1WX1UzMiBtdlVhcnRQb3J0R2V0KHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX0FNUF9TVVBQT1JUCisJcmV0dXJuIHdob0FtSSgpOworI2Vsc2UKIAlyZXR1cm4gQ09ORklHX1NZU19EVUFSVF9DSEFOOworI2VuZGlmCiB9CiAKIGludCBtdl9zZXJpYWxfaW5pdCAodm9pZCkKQEAgLTY2LDE4ICs3MCwxOCBAQAogewogCWlmIChjID09ICdcbicpCiAKLQltdlVhcnRQdXRjKHdob0FtSSgpLCAnXHInKTsKLQltdlVhcnRQdXRjKHdob0FtSSgpLCBjKTsKKwltdlVhcnRQdXRjKG12VWFydFBvcnRHZXQoKSwgJ1xyJyk7CisJbXZVYXJ0UHV0YyhtdlVhcnRQb3J0R2V0KCksIGMpOwogfQogCiBpbnQgbXZfc2VyaWFsX2dldGModm9pZCkKIHsKLQlyZXR1cm4gbXZVYXJ0R2V0Yyh3aG9BbUkoKSk7CisJcmV0dXJuIG12VWFydEdldGMobXZVYXJ0UG9ydEdldCgpKTsKIH0KIAogaW50IG12X3NlcmlhbF90c3RjKHZvaWQpCiB7Ci0JcmV0dXJuIG12VWFydFRzdGMod2hvQW1JKCkpOworCXJldHVybiBtdlVhcnRUc3RjKG12VWFydFBvcnRHZXQoKSk7CiB9CiAKIHZvaWQgbXZfc2VyaWFsX3NldGJyZyAodm9pZCkKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X3VzYi5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfdXNiLmMKaW5kZXggMzc5NGRkMC4uYmQyNGI2NSAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfdXNiLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfdXNiLmMKQEAgLTM1LDQyICszNSw2IEBACiAjZW5kaWYKICNpbmNsdWRlICJtdlN5c1VzYkNvbmZpZy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBnZXRVc2JBY3RpdmUgLSByZWFkICd1c2JBY3RpdmUnIGVudiB2YXJpYWJsZSBhbmQgc2V0IGFjdGl2ZSBwb3J0Ci0qCi0qIElOUFVUOgotKiAJTVZfVTMyIHVzYlVuaXRJZCAtIFVTQiBpbnRlcmZhY2UgaW5kaWNhdGlvbiAoVVNCMi4wIC8gVVNCMy4wKQotKgotKiBPVVRQVVQ6Ci0qIAlwcmludHMgc2VsZWN0ZWQgYWN0aXZlIHBvcnQgbnVtYmVyLCBhbmQgc2VsZWN0ZWQgaW50ZXJmYWNlCi0qCi0qIFJFVFVSTjoKLSogICAgICAgTnVtIG9mIHJlcXVlc3RlZCBpbnRlcmZhY2UgVVNCMi8zCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIGdldFVzYkFjdGl2ZShNVl9VMzIgdXNiVW5pdElkLCBNVl9VMzIgbWF4VXNiSG9zdFBvcnRzLCBNVl9VMzIgbWF4U2VyRGVzTGFuZXMsIE1WX0JPT0wgcHJpbnRFbikKLXsKLQljaGFyICplbnYgPSBnZXRlbnYoInVzYkFjdGl2ZSIpOwotCWludCB1c2JBY3RpdmUgPSBzaW1wbGVfc3RydG91bChlbnYsIE5VTEwsIDEwKTsKLQotCS8qICBpZiByZXF1ZXN0ZWQgVVNCMy4wIGlzIG5vdCBjb25uZWN0ZWQgdmlhIFNlckRlcywgYnV0IHRoZXJlIGFyZSBlbm91Z2ggVVNCMy4wIHBvcnRzICovCi0JaWYgKHByaW50RW4pIHsKLQkJaWYgKHVzYlVuaXRJZCA9PSBVU0IzX1VOSVRfSUQgJiYgKHVzYkFjdGl2ZSA+PSBtYXhTZXJEZXNMYW5lcyAmJiBtYXhVc2JIb3N0UG9ydHMgPiBtYXhTZXJEZXNMYW5lcykpIHsKLQkJCW12T3NQcmludGYoIlxuJ3VzYkFjdGl2ZScgd2FybmluZyAoJWQpOiBJbnZhbGlkIFVTQjMuMCBwb3J0IChubyB2YWxpZCBTZXJEZXMpLi4iLCB1c2JBY3RpdmUpOwotCQkJbXZPc1ByaW50ZigiVHJ5aW5nIFVTQjIuMCBIb3N0IHZpYSBVU0IzLjBcbiIpOwotCQl9IGVsc2UgaWYgKHVzYkFjdGl2ZSA+PSBtYXhVc2JIb3N0UG9ydHMgJiYgdXNiVW5pdElkID09IFVTQl9VTklUX0lEKSB7Ci0JCQltdk9zUHJpbnRmKCJcbid1c2JBY3RpdmUnIHdhcm5pbmcgKCVkKTogSW52YWxpZCBVU0IyLjAgcG9ydFxuIiwgdXNiQWN0aXZlKTsKLQkJfQotCi0JCW12T3NQcmludGYoIlBvcnQgKHVzYkFjdGl2ZSkgOiAlZFx0SW50ZXJmYWNlICh1c2JUeXBlID0gJWQpIDogIiwgdXNiQWN0aXZlLAotCQkJCSgodXNiVW5pdElkID09IFVTQjNfVU5JVF9JRCkgPyAzIDogMikpOwotCX0KLQkvKiBGZXRjaCBTb0MgVVNCIG1hcHBpbmc6Ci0JICAgRm9yIFNvbWUgU29Dcywgd2hlbiB1c2luZyBzaW5nbGUgVVNCIHBvcnQsIHVuaXQgMSBpcyBhY3RpdmUgYW5kIG5vdCAwICovCi0JdXNiQWN0aXZlID0gbXZDdHJsVXNiTWFwR2V0KHVzYlVuaXRJZCwgdXNiQWN0aXZlKTsKLQotCXJldHVybiB1c2JBY3RpdmU7Ci19CiAKICNpZiBkZWZpbmVkIChDT05GSUdfVVNCX1hIQ0kpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTk3LDYgKzE2MSw0NCBAQAogCS5pbnRlcmZhY2Vfc3VwcG9ydGVkID0gTVZfRkFMU0UKICNlbmRpZgogfTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHByaW50VXNiRXJyb3IgIC0gVGhpcyBmdW5jdGlvbiB1c2VkIHRvIHByaW50IGVycm9yIG1lc3NhZ2Ugd2hlbiBVU0IgZXJyb3IgZGVkZWN0ZWQuCisqCQkJIGNhbGxlZCBmcm9tICJ1c2JfbG93bGV2ZWxfaW5pdCIgYW5kICJ1c2JfbG93bGV2ZWxfc3RvcCIgZnVuY3Rpb25zLgorKgorKiBJTlBVVDoKKyoJTVZfQk9PTCB2YWx1ZSAtIE1WX1RSVUUgaWYgdXNiIGNvbm5lY3RlZCBvbiBjdXJyZW50IGJvYXJkICxNVl9GQUxTRSBvdGhlcndpc2UuCisqCisqIE9VVFBVVDoKKyoJcHJpbnRzIFVTQiBlcnJvciBtZXNzYWdlcy4KKyoKKyogUkVUVVJOOgorKgktMQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJpbnRVc2JFcnJvcihNVl9CT09MIG12Qm9hcmRJc1VzYlBvcnRDb25uZWN0ZWQgLGludCBwb3J0KQoreworICAgICAgICBpbnQgdXNiVHlwZSA9IHNpbXBsZV9zdHJ0b3VsKGdldGVudigidXNiVHlwZSIpLCBOVUxMLCAxMCk7CisgICAgICAgIGludCB1c2IzSG9zdE51bSA9IG12Q3RybFVzYjNIb3N0TWF4R2V0KCk7CisgICAgICAgIGludCB1c2IySG9zdE51bSA9IG12Q3RybFVzYk1heEdldCgpOworCisJaWYobXZCb2FyZElzVXNiUG9ydENvbm5lY3RlZCA9PSBNVl9GQUxTRSkKKwkJbXZPc1ByaW50ZigiXG5FcnJvcjogcmVxdWVzdGVkICd1c2JBY3RpdmUnICglZCkgaXMgbm90IGNvbm5lY3RlZCBvbiBjdXJyZW50IGJvYXJkXG4iLHBvcnQpOworCWVsc2UgeworCQltdk9zUHJpbnRmKCJFcnJvcjogcmVxdWVzdGVkICd1c2JUeXBlJyAoVHlwZSAlZCkgaXMgbm90IHN1cHBvcnRlZC4iLCB1c2JUeXBlKTsKKwkJaWYgKCh1c2JUeXBlID09IDIgJiYgdXNiMkhvc3ROdW0gPCAxKSB8fCAodXNiVHlwZSA9PTMgJiYgdXNiM0hvc3ROdW0gPCAxKSkKKwkJbXZPc1ByaW50ZigiIChubyBhdmFpbGFibGUgVVNCJWQgcG9ydHMgb24gY3VycmVudCBTb2MpLlxuIix1c2JUeXBlKTsKKwl9CisJaWYgKChoY19laGNpLmludGVyZmFjZV9zdXBwb3J0ZWQgPT0gTVZfVFJVRSAmJiB1c2IySG9zdE51bSA+IDApIHx8CisJCQkoaGNfeGhjaS5pbnRlcmZhY2Vfc3VwcG9ydGVkID09IE1WX1RSVUUgJiYgdXNiM0hvc3ROdW0gPiAwKSkKKwkJbXZPc1ByaW50ZigiXG5cblx0IFN1cHBvcnRlZCBVbml0czpcbiIpOworCWlmIChoY19laGNpLmludGVyZmFjZV9zdXBwb3J0ZWQgPT0gTVZfVFJVRSAmJiB1c2IySG9zdE51bSA+IDApCisJCW12T3NQcmludGYoIlxuXHRVU0IyLjA6ICVkIHBvcnRzOiBzZXQgdXNiVHlwZSA9IDIgLS0+IEVIQ0kgU3RhY2sgd2lsbCBiZSB1c2VkXG4iLCB1c2IySG9zdE51bSk7CisJaWYgKGhjX3hoY2kuaW50ZXJmYWNlX3N1cHBvcnRlZCA9PSBNVl9UUlVFICYmIHVzYjNIb3N0TnVtID4gMCkKKwkJbXZPc1ByaW50ZigiXHRVU0IzLjA6ICVkIHBvcnRzOiBzZXQgdXNiVHlwZSA9IDMgLS0+IHhIQ0kgU3RhY2sgd2lsbCBiZSB1c2VkXG4iLCB1c2IzSG9zdE51bSk7CisJcmV0dXJuIC0xOworCit9CisKIAogLyogdXNiX2xvd2xldmVsX2luaXQ6CiAqCXRoaXMgcm91dGluZSBuYXZpZ2F0ZSBiZXR3ZWVuIGN1cnJlbnRseSBzZWxlY3RlZCBzdGFjayAoZUhDSS94SENJKQpAQCAtMjA1LDEwICsyMDcsMTQgQEAKICoJICB1c2JUeXBlID0gMyAtLSA+IHhIQ0kKICoJLSBDYWxsIHVzYl9sb3dsZXZlbF9pbml0IGZyb20gc2VsZWN0ZWQgc3RhY2sKICovCisKKy8qIG1hcmsgZGV0ZWN0ZWQgdXNiIHBvcnQsIHRvIGVuc3VyZSBwcm9wZXIgJ3N0b3AnCisgKiBwcm9jZXNzIGJlZm9yZSBuZXh0IGRldGVjdGlvbiByZXF1ZXN0ICovCitpbnQgY3VycmVudFVzYkFjdGl2ZSA9IC0xOwogaW50IHVzYl9sb3dsZXZlbF9pbml0KGludCBpbmRleCwgdm9pZCAqKmNvbnRyb2xsZXIpCiB7CiAJaW50IHVzYjJIb3N0TnVtLCB1c2IzSG9zdE51bSwgdXNiVHlwZSwgdXNiQWN0aXZlID0gMDsKLQorCXVzYkFjdGl2ZSA9IHNpbXBsZV9zdHJ0b3VsKGdldGVudigidXNiQWN0aXZlIiksIE5VTEwsIDEwKTsKIAl1c2JUeXBlID0gc2ltcGxlX3N0cnRvdWwoZ2V0ZW52KCJ1c2JUeXBlIiksIE5VTEwsIDEwKTsKIAl1c2IzSG9zdE51bSA9IG12Q3RybFVzYjNIb3N0TWF4R2V0KCk7CiAJdXNiMkhvc3ROdW0gPSBtdkN0cmxVc2JNYXhHZXQoKTsKQEAgLTIxNiw5NSArMjIyLDcwIEBACiAJc3dpdGNoICh1c2JUeXBlKSB7CiAJY2FzZSAyOgogCQlpZiAoaGNfZWhjaS5pbnRlcmZhY2Vfc3VwcG9ydGVkID09IE1WX1RSVUUgJiYgdXNiMkhvc3ROdW0gPiAwKSB7Ci0JCQl1c2JBY3RpdmUgPSBnZXRVc2JBY3RpdmUoVVNCX1VOSVRfSUQsIHVzYjJIb3N0TnVtLCAwLCBNVl9UUlVFKTsgLyogcmVhZCByZXF1ZXN0ZWQgYWN0aXZlIHBvcnQgKi8KKwkJCXVzYkFjdGl2ZSA9IG12Q3RybFVzYk1hcEdldChVU0JfVU5JVF9JRCwgdXNiQWN0aXZlKTsKKwkJCWlmIChtdkJvYXJkSXNVc2JQb3J0Q29ubmVjdGVkKFVTQl9VTklUX0lELCB1c2JBY3RpdmUpID09IE1WX0ZBTFNFKQorCQkJCXJldHVybiBwcmludFVzYkVycm9yKE1WX0ZBTFNFLCB1c2JBY3RpdmUpOwogCQkJaGMgPSAmaGNfZWhjaTsgLyogc2V0IEhvc3QgQ29udHJvbGxlciBzdHJ1Y3QgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzICAqLwogCQl9IGVsc2UKLQkJCWdvdG8gaW5wdXRfZXJyb3I7CisJCQkgcmV0dXJuIHByaW50VXNiRXJyb3IoTVZfVFJVRSwgdXNiQWN0aXZlKTsKIAkJYnJlYWs7CiAJY2FzZSAzOgogCQlpZiAoaGNfeGhjaS5pbnRlcmZhY2Vfc3VwcG9ydGVkID09IE1WX1RSVUUgJiYgdXNiM0hvc3ROdW0gPiAwKSB7Ci0JCQl1c2JBY3RpdmUgPSBnZXRVc2JBY3RpdmUoVVNCM19VTklUX0lELCB1c2IzSG9zdE51bSAsIG12Q3RybFVzYjNNYXhHZXQoKSwKLQkJCQkJTVZfVFJVRSk7IC8qIHJlYWQgcmVxdWVzdGVkIGFjdGl2ZSBwb3J0ICovCisJCQkvKiBtdkN0cmxVc2JNYXBHZXQgdXNlZCBvbmx5IGZvciBsZWdhY3kgZGV2aWNlcyBBTFAvQTM3NSAqLworCQkJdXNiQWN0aXZlID0gbXZDdHJsVXNiTWFwR2V0KFVTQjNfVU5JVF9JRCwgdXNiQWN0aXZlKTsKKwkJCWlmIChtdkJvYXJkSXNVc2JQb3J0Q29ubmVjdGVkKFVTQjNfVU5JVF9JRCwgdXNiQWN0aXZlKSA9PSBNVl9GQUxTRSkKKwkJCQlyZXR1cm4gcHJpbnRVc2JFcnJvcihNVl9GQUxTRSwgdXNiQWN0aXZlKTsKKwkJCWlmIChtdkN0cmxJc1VzYlNlckRlc0Nvbm5lY3RlZCh1c2JBY3RpdmUpID09IE1WX0ZBTFNFKSB7CisJCQkJbXZPc1ByaW50ZigiXG4ndXNiQWN0aXZlJyB3YXJuaW5nICglZCk6IEludmFsaWQgVVNCMy4wIHBvcnQgKG5vIHZhbGlkIFNlckRlcykuLiIsIHVzYkFjdGl2ZSk7CisJCQkJbXZPc1ByaW50ZigiVHJ5aW5nIFVTQjIuMCBIb3N0IHZpYSBVU0IzLjBcbiIpOworCQkJfQorI2lmZGVmIE1WX1VTQl9WQlVTX0NZQ0xFCisJCQkvKiBWQlVTIHNpZ25hbCBpcyBsb3dlcmVkIHByaW9yIHRvIFNlckRlcyBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSwKKwkJCSAqIGJlZm9yZSBpbml0aWFsaXppbmcgYW5kIGRldGVjdGluZyBkZXZpY2UsIHNldCBWQlVTIGVuYWJsZWQgKi8KKwkJCW12Qm9hcmRVc2JWYnVzU2V0KHVzYkFjdGl2ZSk7CisjZW5kaWYKIAkJCWhjID0gJmhjX3hoY2k7IC8qIHNldCBIb3N0IENvbnRyb2xsZXIgc3RydWN0IGZvciBmdW5jdGlvbiBwb2ludGVycyAgKi8KIAkJfSBlbHNlCi0JCQlnb3RvIGlucHV0X2Vycm9yOworCQkJcmV0dXJuIHByaW50VXNiRXJyb3IoTVZfVFJVRSwgdXNiQWN0aXZlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZ290byBpbnB1dF9lcnJvcjsKKwkJcmV0dXJuIHByaW50VXNiRXJyb3IoTVZfVFJVRSwgdXNiQWN0aXZlKTsKKwl9CisJbXZPc1ByaW50ZigiUG9ydCAodXNiQWN0aXZlKSA6ICVkXHRJbnRlcmZhY2UgKHVzYlR5cGUgPSAlZCkgOiAiLCB1c2JBY3RpdmUsCisgICAgICAgICAgICAgICAgKCh1c2JUeXBlID09IDMpID8gMyA6IDIpKTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHVzYkFjdGl2ZSBuZXZlciBleGVlZHMgdGhlIGNvbmZpZ3VyZWQgbWF4IGNvbnRyb2xsZXJzIGNvdW50CisJICAgVGhlIENPTkZJR19VU0JfTUFYX0NPTlRST0xMRVJfQ09VTlQgY2FuIGJlIGNoYW5nZWQgZm9yIGRpZmZlcmVudCBib2FyZHMgKi8KKwlpZiAodXNiQWN0aXZlID49IENPTkZJR19VU0JfTUFYX0NPTlRST0xMRVJfSE9TVF9DT1VOVCkgeworCQltdk9zUHJpbnRmKCJ1c2JBY3RpdmU9JWQgaXMgb3V0IG9mIHN1cHBvcnRlZCByYW5nZVxuIix1c2JBY3RpdmUpOworCQlyZXR1cm4gLTE7CiAJfQogCisJLyogTWFydmVsbCBVU0IgY29kZSBzdXBwb3J0cyBvbmx5IG9uZSBhY3RpdmUgY29udHJvbGxlciAoVVNCMCksIHdoaWxlIHRoZSBhY3R1YWwgaG9zdAorCSAgIGRldmljZSBpcyBzZWxlY3RlZCBieSB1c2JBY3RpdmUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKwlpZiAoaW5kZXggPiAwKSB7CisJCW12T3NQcmludGYoIlxuT25seSBvbmUgYWN0aXZlIGNvbnRyb2xsZXIgc3VwcG9ydGVkISBTa2lwcGluZyBVU0IlZCBpbml0aWFsaXphdGlvbi5cbiIsIGluZGV4KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWN1cnJlbnRVc2JBY3RpdmUgPSB1c2JBY3RpdmU7CiAJcmV0dXJuIGhjLT5oY191c2JfbG93bGV2ZWxfaW5pdCh1c2JBY3RpdmUsIGNvbnRyb2xsZXIpOwotCi1pbnB1dF9lcnJvcjoKLQltdk9zUHJpbnRmKCJFcnJvcjogcmVxdWVzdGVkICd1c2JUeXBlJyAoVHlwZSAlZCkgaXMgbm90IHN1cHBvcnRlZCIsIHVzYlR5cGUpOwotCWlmICgodXNiVHlwZSA9PSAyICYmIHVzYjJIb3N0TnVtIDwgMSkgfHwgKHVzYlR5cGUgPT0zICYmIHVzYjNIb3N0TnVtIDwgMSkpCi0JCW12T3NQcmludGYoIiAobm8gYXZhaWxhYmxlIFVTQiBwb3J0cykuXG4iKTsKLQotCWlmICgoaGNfZWhjaS5pbnRlcmZhY2Vfc3VwcG9ydGVkID09IE1WX1RSVUUgJiYgdXNiMkhvc3ROdW0gPiAwKSB8fAotCQkoaGNfeGhjaS5pbnRlcmZhY2Vfc3VwcG9ydGVkID09IE1WX1RSVUUgJiYgdXNiM0hvc3ROdW0gPiAwKSkKLQkJbXZPc1ByaW50ZigiXG5cblx0IFN1cHBvcnRlZCBVbml0czpcbiIpOwotCWlmIChoY19laGNpLmludGVyZmFjZV9zdXBwb3J0ZWQgPT0gTVZfVFJVRSAmJiB1c2IySG9zdE51bSA+IDApCi0JCW12T3NQcmludGYoIlxuXHRVU0IyLjA6ICVkIHBvcnRzOiBzZXQgdXNiVHlwZSA9IDIgLS0+IEVIQ0kgU3RhY2sgd2lsbCBiZSB1c2VkXG4iLCB1c2IySG9zdE51bSk7Ci0JaWYgKGhjX3hoY2kuaW50ZXJmYWNlX3N1cHBvcnRlZCA9PSBNVl9UUlVFICYmIHVzYjNIb3N0TnVtID4gMCkKLQkJbXZPc1ByaW50ZigiXHRVU0IzLjA6ICVkIHBvcnRzOiBzZXQgdXNiVHlwZSA9IDMgLS0+IHhIQ0kgU3RhY2sgd2lsbCBiZSB1c2VkXG4iLCB1c2IzSG9zdE51bSk7Ci0JcmV0dXJuIC0xOwogfQogCiBpbnQgdXNiX2xvd2xldmVsX3N0b3AoaW50IGluZGV4KQogewotCWludCB1c2IyVW5pdE51bSwgdXNiM1VuaXROdW0sIHVzYlR5cGUsIHVzYkFjdGl2ZSA9IDA7CisJaW50IHVzYkFjdGl2ZSA9IGN1cnJlbnRVc2JBY3RpdmUsIHJldDsKIAogCWlmICghaGMpIHsKIAkJbXZPc1ByaW50ZigiJXM6IEVycm9yOiBydW4gJ3VzYiByZXNldCcgdG8gc2V0IGhvc3QgY29udHJvbGxlciBpbnRlcmZhY2UuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQl1c2JUeXBlID0gc2ltcGxlX3N0cnRvdWwoZ2V0ZW52KCJ1c2JUeXBlIiksIE5VTEwsIDEwKTsKLQl1c2IzVW5pdE51bSA9IG12Q3RybFVzYjNNYXhHZXQoKTsKLQl1c2IyVW5pdE51bSA9IG12Q3RybFVzYk1heEdldCgpOwotCi0Jc3dpdGNoICh1c2JUeXBlKSB7Ci0JY2FzZSAyOgotCQlpZiAoaGMgIT0gJmhjX2VoY2kpIHsKLQkJCW12T3NQcmludGYoIkVycm9yIC0gUGxlYXNlIHJ1biBcInVzYiBzdG9wXCIgYmVmb3JlIGNoYW5naW5nIFwidXNiVHlwZVwiLlxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoaGNfZWhjaS5pbnRlcmZhY2Vfc3VwcG9ydGVkID09IE1WX1RSVUUgJiYgdXNiMlVuaXROdW0gPiAwKQotCQkJdXNiQWN0aXZlID0gZ2V0VXNiQWN0aXZlKFVTQl9VTklUX0lELCB1c2IyVW5pdE51bSwgMCwKLQkJCQkJTVZfRkFMU0UpOyAvKiByZWFkIHJlcXVlc3RlZCBhY3RpdmUgcG9ydCAqLwotCQllbHNlCi0JCQlnb3RvIGlucHV0X2Vycm9yOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCWlmIChoYyAhPSAmaGNfeGhjaSkgewotCQkJbXZPc1ByaW50ZigiRXJyb3IgLSBQbGVhc2UgcnVuIFwidXNiIHN0b3BcIiBiZWZvcmUgY2hhbmdpbmcgXCJ1c2JUeXBlXCIuXG4iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmIChoY194aGNpLmludGVyZmFjZV9zdXBwb3J0ZWQgPT0gTVZfVFJVRSAmJiB1c2IzVW5pdE51bSA+IDApCi0JCQl1c2JBY3RpdmUgPSBnZXRVc2JBY3RpdmUoVVNCM19VTklUX0lELCB1c2IzVW5pdE51bSwgbXZDdHJsVXNiM01heEdldCgpLAotCQkJCQlNVl9GQUxTRSk7IC8qIHJlYWQgcmVxdWVzdGVkIGFjdGl2ZSBwb3J0ICovCi0JCWVsc2UKLQkJCWdvdG8gaW5wdXRfZXJyb3I7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWdvdG8gaW5wdXRfZXJyb3I7Ci0JfQotCi0JcmV0dXJuIGhjLT5oY191c2JfbG93bGV2ZWxfc3RvcCh1c2JBY3RpdmUpOwotaW5wdXRfZXJyb3I6Ci0JbXZPc1ByaW50ZigiRXJyb3I6IHJlcXVlc3RlZCAndXNiVHlwZScgKFR5cGUgJWQpIGlzIG5vdCBzdXBwb3J0ZWQiLCB1c2JUeXBlKTsKLQlpZiAoKHVzYlR5cGUgPT0gMiAmJiB1c2IyVW5pdE51bSA8IDEpIHx8ICh1c2JUeXBlID09IDMgJiYgdXNiM1VuaXROdW0gPCAxKSkKLQkJbXZPc1ByaW50ZigiIChubyBhdmFpbGFibGUgVVNCIHBvcnRzKS5cbiIpOwotCi0JaWYgKChoY19laGNpLmludGVyZmFjZV9zdXBwb3J0ZWQgPT0gTVZfVFJVRSAmJiB1c2IyVW5pdE51bSA+IDApIHx8Ci0JCShoY194aGNpLmludGVyZmFjZV9zdXBwb3J0ZWQgPT0gTVZfVFJVRSAmJiB1c2IzVW5pdE51bSA+IDApKQotCQltdk9zUHJpbnRmKCJcblxuXHQgU3VwcG9ydGVkIFVuaXRzOlxuIik7Ci0JaWYgKGhjX2VoY2kuaW50ZXJmYWNlX3N1cHBvcnRlZCA9PSBNVl9UUlVFICYmIHVzYjJVbml0TnVtID4gMCkKLQkJbXZPc1ByaW50ZigiXG5cdFVTQjIuMDogJWQgcG9ydHM6IHNldCB1c2JUeXBlID0gMiAtLT4gRUhDSSBTdGFjayB3aWxsIGJlIHVzZWRcbiIsIHVzYjJVbml0TnVtKTsKLQlpZiAoaGNfeGhjaS5pbnRlcmZhY2Vfc3VwcG9ydGVkID09IE1WX1RSVUUgJiYgdXNiM1VuaXROdW0gPiAwKQotCQltdk9zUHJpbnRmKCJcdFVTQjMuMDogJWQgcG9ydHM6IHNldCB1c2JUeXBlID0gMyAtLT4geEhDSSBTdGFjayB3aWxsIGJlIHVzZWRcbiIsIHVzYjNVbml0TnVtKTsKLQlyZXR1cm4gLTE7Ci0KKwkvKiBNYXJrIHRoYXQgdGhlcmUgaXMgbm8gY3VycmVudCB1c2JBY3RpdmUgdG8gc3RvcCAqLworCWN1cnJlbnRVc2JBY3RpdmUgPSAtMTsKKwlyZXQgPSBoYy0+aGNfdXNiX2xvd2xldmVsX3N0b3AodXNiQWN0aXZlKTsKKwloYyA9IE5VTEw7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IHN1Ym1pdF9pbnRfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLApkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1Avc3dpdGNoaW5nU2VydmljZXMvc2FyX2JjMi5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1Avc3dpdGNoaW5nU2VydmljZXMvc2FyX2JjMi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcxNDg2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9zd2l0Y2hpbmdTZXJ2aWNlcy9zYXJfYmMyLmMKQEAgLTAsMCArMSw0NzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5CitkaXNjbGFpbWVyLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPHNwaV9mbGFzaC5oPgorI2luY2x1ZGUgPGJ6bGliLmg+CisKKyNpbmNsdWRlICJtdkNvbW1vbi5oIgorI2luY2x1ZGUgImN0cmxFbnYvbXZDdHJsRW52TGliLmgiCisjaW5jbHVkZSAiYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5oIgorI2luY2x1ZGUgImNwdS9tdkNwdS5oIgorCisjaWYgZGVmaW5lZChNVl9JTkNfQk9BUkRfTk9SX0ZMQVNIKQorI2luY2x1ZGUgIm5vcmZsYXNoL212Rmxhc2guaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX0dJR19FVEgpCisjaW5jbHVkZSAiZXRoLXBoeS9tdkV0aFBoeS5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfUEVYKQorI2luY2x1ZGUgInBleC9tdlBleC5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfUERNQSkKKyNpbmNsdWRlICJwZG1hL212UGRtYS5oIgorI2luY2x1ZGUgIm12U3lzUGRtYUFwaS5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfWE9SKQorI2luY2x1ZGUgInhvci9tdlhvclJlZ3MuaCIKKyNpbmNsdWRlICJ4b3IvbXZYb3IuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1BNVSkKKyNpbmNsdWRlICJwbXUvbXZQbXVSZWdzLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImNudG1yL212Q250bXJSZWdzLmgiCisjaW5jbHVkZSAic3dpdGNoaW5nU2VydmljZXMuaCIKKworLyogZGVmaW5lcyAgKi8KKyN1bmRlZiBNVl9ERUJVRworI2lmZGVmIE1WX0RFQlVHCisjZGVmaW5lIERCKHgpIHgKKyNkZWZpbmUgREIxKHgpICB4CisjZWxzZQorI2RlZmluZSBEQih4KQorI2RlZmluZSBEQjEoeCkKKyNlbmRpZgorCisvKiBTQVIgZGVmaW5lcyB3aGVuIENvbm5lY3RlZCB0byBCYzIqLworI2RlZmluZSBNVl9CT0FSRF9DVFJMX0kyQ19BRERSX0JDMgkweDAKKyNkZWZpbmUgVFdTSV9DSEFOTkVMX0JDMgkJCTAKKyNkZWZpbmUgVFdTSV9TUEVFRF9CQzIJCQkJMjAwMDAgLy8gd2EgZm9yIGJpdHMgMSwyIGluIDB4NGMuIE1tdXN0IGxvd2VyIDEwMDAwMCAtPiAyMDAwMCAuIGFkaXksIGVyZXoKK3R5cGVkZWYgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBWVUw7CisKK3N0YXRpYyBNVl9VOCB0cmVhZF9iYzIoTVZfVTggYWRkciwgaW50IHJlZykKK3sKKwkJTVZfVFdTSV9TTEFWRSB0d3NpU2xhdmU7CisJCU1WX1RXU0lfQUREUiBzbGF2ZTsKKwkJTVZfVTggZGF0YTsKKworCQlEQihwcmludGYoInRyZWFkX2JjMiwgRGV2QWRkciA9IDB4JXhcbiIsIGFkZHIpKTsKKworCQkvKiBUV1NJIGluaXQgKi8KKwkJc2xhdmUuYWRkcmVzcyA9IE1WX0JPQVJEX0NUUkxfSTJDX0FERFJfQkMyOworCQlzbGF2ZS50eXBlID0gQUREUjdfQklUOworCisJCW12VHdzaUluaXQgKFRXU0lfQ0hBTk5FTF9CQzIsIFRXU0lfU1BFRURfQkMyLCBtdkJvYXJkVGNsa0dldCgpLCAmc2xhdmUsIDApOworCisJCS8qIHJlYWQgU2F0UiAqLworCQl0d3NpU2xhdmUuc2xhdmVBZGRyLnR5cGUgPSBBRERSN19CSVQ7CisJCXR3c2lTbGF2ZS5zbGF2ZUFkZHIuYWRkcmVzcyA9IGFkZHIgOworCQl0d3NpU2xhdmUudmFsaWRPZmZzZXQgPSBNVl9UUlVFOworCQl0d3NpU2xhdmUub2Zmc2V0ID0gcmVnOworCQl0d3NpU2xhdmUubW9yZVRoZW4yNTYgPSBNVl9GQUxTRTsKKworCQlpZiAoTVZfT0sgIT0gbXZUd3NpUmVhZChUV1NJX0NIQU5ORUxfQkMyLCAmdHdzaVNsYXZlLCAmZGF0YSwgMSkpIHsKKwkJCQlEQihwcmludGYoInRyZWFkX2JjMiA6IHR3c2kgcmVhZCBmYWlsXG4iKSk7CisJCQkJcmV0dXJuIE1WX0VSUk9SOworCQl9CisJCURCKHByaW50ZigidHJlYWRfYmMyOiB0d3NpIHJlYWQgc3VjY2VlZGVkLCBkYXRhID0gMHgleFxuIiwgZGF0YSkpOworCisJCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgTVZfU1RBVFVTIHR3cml0ZV9iYzIoTVZfVTggYWRkciwgaW50IHJlZywgTVZfVTggcmVnVmFsKQoreworCQlNVl9UV1NJX1NMQVZFIHR3c2lTbGF2ZTsKKwkJTVZfVFdTSV9BRERSIHNsYXZlOworCQlNVl9VOCBkYXRhOworCisJCS8vICBwcmludGYoIj4+PiBpbiB0d3JpdGVfYmMyLCBhZGRyPTB4JXgsIHJlZyA9IDB4JXgsIHZhbD0weCV4XG4iLCBhZGRyLCByZWcsIHJlZ1ZhbCk7CisJCS8qIFRXU0kgaW5pdCAqLworCQlzbGF2ZS5hZGRyZXNzID0gTVZfQk9BUkRfQ1RSTF9JMkNfQUREUl9CQzI7CisJCXNsYXZlLnR5cGUgPSBBRERSN19CSVQ7CisKKwkJbXZUd3NpSW5pdCAoVFdTSV9DSEFOTkVMX0JDMiwgVFdTSV9TUEVFRF9CQzIsIG12Qm9hcmRUY2xrR2V0KCksICZzbGF2ZSwgMCk7CisKKwkJLyogd3JpdGUgU2F0UiAqLworCQl0d3NpU2xhdmUuc2xhdmVBZGRyLmFkZHJlc3MgPSBhZGRyOworCQl0d3NpU2xhdmUuc2xhdmVBZGRyLnR5cGUgPSBBRERSN19CSVQ7CisJCXR3c2lTbGF2ZS52YWxpZE9mZnNldCA9IE1WX1RSVUU7CisJCXR3c2lTbGF2ZS5vZmZzZXQgPSByZWc7CisJCXR3c2lTbGF2ZS5tb3JlVGhlbjI1NiA9IE1WX0ZBTFNFOworCisJCWRhdGEgPSByZWdWYWw7CisJCWlmIChNVl9PSyAhPSBtdlR3c2lXcml0ZShUV1NJX0NIQU5ORUxfQkMyLCAmdHdzaVNsYXZlLCAmZGF0YSwgMSkpIHsKKwkJCQlEQihtdk9zUHJpbnRmKCJ0d3JpdGVfYmMyOiB0d3NpIHdyaXRlIGZhaWxcbiIpKTsKKwkJCQlyZXR1cm4gTVZfRVJST1I7CisJCX0KKwkJREIobXZPc1ByaW50ZigidHdyaXRlX2JjMjogdHdzaSB3cml0ZSBzdWNjZWVkZWRcbiIpKTsKKworCQlyZXR1cm4gTVZfT0s7Cit9CisKK3N0YXRpYyBpbnQgZG9fc2FyX2xpc3RfYmMyKGludCBhcmdjLCBjaGFyICpjb25zdCBhcmd2W10pCit7CisJCWNvbnN0IGNoYXIgKmNtZDsKKwkJaW50IGFsbCA9IDA7CisKKwkJaWYgKGFyZ2MgPCAxKQorCQkJCWdvdG8gdXNhZ2U7CisJCWNtZCA9IGFyZ3ZbMF07CisKKwkJaWYgKHN0cmNtcChjbWQsICJhbGwiKSA9PSAwKQorCQkJCWFsbCA9IDE7CisKKwkJaWYgKChzdHJjbXAoY21kLCAiY29yZWZyZXEiKSA9PSAwKSB8fCBhbGwpIHsKKwkJCQlwcmludGYoImNvcmVmcmVxICgweDRkIDA6Myk6IERldGVybWluZXMgdGhlIENPUkUgZnJlcXVlbmN5OlxuIik7CisJCQkJcHJpbnRmKCJcdDB4MCA9IDM2ME1IelxuIik7CisJCQkJcHJpbnRmKCJcdDB4MSA9IDIyME1IelxuIik7CisJCQkJcHJpbnRmKCJcdDB4MiA9IDI1ME1IelxuIik7CisJCQkJcHJpbnRmKCJcdDB4MyA9IDQwME1IelxuIik7CisJCQkJcHJpbnRmKCJcdDB4NCA9IDUwME1IelxuIik7CisJCQkJcHJpbnRmKCJcdDB4NSA9IDUyME1IelxuIik7CisJCQkJcHJpbnRmKCJcdDB4NiA9IDQ1ME1IelxuIik7CisJCQkJcHJpbnRmKCJcbiIpOworCQl9CisKKwkJaWYgKChzdHJjbXAoY21kLCAiY3B1ZnJlcSIpID09IDApICB8fCBhbGwpIHsKKwkJCQlwcmludGYoImNwdWZyZXEgKDB4NGQgMzo0ICsgMHg0ZSAwOjApOiBEZXRlcm1pbmVzIHRoZSBDUFUgYW5kIEREUiBmcmVxdWVuY2llczpcbiIpOworCQkJCXByaW50ZigiXHQweDAgPSBDUFUgNDAwTUh6LCBERFIgNDAwTUh6XG4iKTsKKwkJCQlwcmludGYoIlx0MHgyID0gQ1BVIDY2N01IeiwgRERSIDY2N01IelxuIik7CisJCQkJcHJpbnRmKCJcdDB4MyA9IENQVSA4MDBNSHosIEREUiA4MDBNSHpcbiIpOworCQkJCXByaW50ZigiXG4iKTsKKwkJfQorCisJCWlmICgoc3RyY21wKGNtZCwgInRtZnJlcSIpID09IDApICB8fCBhbGwpIHsKKwkJCQlwcmludGYoInRtZnJlcSAoMHg0ZSAxOjMpOiBEZXRlcm1pbmVzIHRoZSBib290IHNlbGVjdGlvbjpcbiIpOworCQkJCXByaW50ZigiXHQweDAgPSBUTSBjbG9jayBpcyBkaXNhYmxlZFxuIik7CisJCQkJcHJpbnRmKCJcdDB4MSA9IFRNIHJ1bnMgNDAwTUhaLCBERFIzIHJ1bnMgODAwTUh6XG4iKTsKKwkJCQlwcmludGYoIlx0MHgyID0gVE0gcnVucyA0NjZNSFosIEREUjMgcnVucyA5MzNNSHpcbiIpOworCQkJCXByaW50ZigiXHQweDMgPSBUTSBydW5zIDMzM01IWiwgRERSMyBydW5zIDY2N01IelxuIik7CisJCQkJcHJpbnRmKCJcbiIpOworCQl9CisKKwkJaWYgKChzdHJjbXAoY21kLCAiYm9vdHNlbCIpID09IDApIHx8IGFsbCkgeworCQkJCXByaW50ZigiYm9vdHNlbCAoMHg0ZiAwOjIpOiBEZXRlcm1pbmVzIHRoZSBUTSBmcmVxdWVuY3k6XG4iKTsKKwkJCQlwcmludGYoIlx0MHgwID0gQm9vdFJPTSBlbmFibGVkLCBCb290IGZyb20gRGV2aWNlKE5PUikgZmxhc2hcbiIpOworCQkJCXByaW50ZigiXHQweDEgPSBCb290Uk9NIGVuYWJsZWQsIEJvb3QgZnJvbSBOQU5EIGZsYXNoIChuZXcgTkYgY29udHJvbGxlciBvbiBERVZfQ1NuWzBdKVxuIik7CisJCQkJcHJpbnRmKCJcdDB4MiA9IEJvb3RST00gZW5hYmxlZCwgYm9vdCBmcm9tIFVBUlRcbiIpOworCQkJCXByaW50ZigiXHQweDMgPSBCb290Uk9NIGVuYWJsZWQsIGJvb3QgZnJvbSBTUEkwKENTMClcbiIpOworCQkJCXByaW50ZigiXHQweDUgPSBCb290Uk9NIGVuYWJsZWQsIFN0YW5kYnkgc2xhdmUuIE11c3Qgc2V0IFBDSXMgYXMgZW5kcG9pbnQgKGkuZS4gQ1BVIElETEUpXG4iKTsKKwkJCQlwcmludGYoIlx0MHg2ID0gQm9vdFJPTSBlbmFibGVkLCBVQVJUIGRlYnVnIHByb21wdCBtb2RlXG4iKTsKKwkJCQlwcmludGYoIlxuIik7CisJCX0KKworCQlpZiAoKHN0cmNtcChjbWQsICJqdGFnY3B1IikgPT0gMCkgfHwgYWxsKSB7CisJCQkJcHJpbnRmKCJqdGFnY3B1ICgweDRmIDM6Myk6IERldGVybWluZXMgdGhlIEpUQUcgdG8gQ1BVIGNvbm5lY3Rpb246XG4iKTsKKwkJCQlwcmludGYoIlx0MHgwID0gSlRBRyBpcyBjb25uZWN0ZWQgdG8gQzNNIENQVVxuIik7CisJCQkJcHJpbnRmKCJcdDB4MSA9IEpUQUcgaXMgY29ubmVjdGVkIHRvIE1TWVMgQ1BVXG4iKTsKKwkJCQlwcmludGYoIlxuIik7CisJCX0KKworCQlpZiAoKHN0cmNtcChjbWQsICJwdHBwbGwiKSA9PSAwKSB8fCBhbGwpIHsKKwkJCQlwcmludGYoInB0cHBsbCAoMHg0ZiA0OjQpOiBEZXRlcm1pbmVzIHRoZSBwdHBwbGw6XG4iKTsKKwkJCQlwcmludGYoIlx0MHgxID0gTXVzdCB3cml0ZSAweDEuIFBUUCBQTEwgcnVucyBAIDEwOTMuNzVNSHosIFBUUCBDbG9jayA9IDU0Ni44NzVNSHpcbiIpOworCQkJCXByaW50ZigiXG4iKTsKKwkJfQorCisJCWlmICgoc3RyY21wKGNtZCwgInBjaWVnZW4xIikgPT0gMCkgfHwgYWxsKSB7CisJCQkJcHJpbnRmKCJwY2llZ2VuMSAoMHg0Yy4xIDQ6NCk6IERldGVybWluZXMgdGhlIHBjaWVnZW4xOlxuIik7CisJCQkJcHJpbnRmKCJcdDB4MCA9IERvIG5vdCBmb3JjZSBCQzIgUENJZSBjb25uZWN0aW9uIHRvIEdFTjFcbiIpOworCQkJCXByaW50ZigiXHQweDEgPSBGb3JjZSBCQzIgUENJZSBjb25uZWN0aW9uIHRvIEdFTjFcbiIpOworCQkJCXByaW50ZigiXG4iKTsKKwkJfQorCisJCXJldHVybiAwOworCisJCXVzYWdlOgorCQlwcmludGYoIlVzYWdlOiBTYXRyIC0gc2VlIG9wdGlvbnNcbiIpOworCQlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkb19zYXJfcmVhZF9iYzIoaW50IGFyZ2MsIGNoYXIgKmNvbnN0IGFyZ3ZbXSkKK3sKKworLyoKKyAgIGJjMiBzYW1wbGUgYW5kIHJlc2V0IHJlZ2lzdGVyCisKKyMgICAgIDRmICAgICAgICMgICAgIDRlICAgICAgICMgICAgIDRkICAgICAgICMgICAgICA0YyAgICAgICMKKyMgICAgICAgICAgICAgICMgICAgICAgICAgICAgICMgICAgICAgICAgICAgICMgICAgICAgICAgICAgICMKKyMtLXwtLXwtLXwtLXwtLSMtLXwtLXwtLXwtLXwtLSMtLXwtLXwtLXwtLXwtLSMtLXwtLXwtLXwtLXwtLSMKKyMgIHwgIHwgIHwgIHwgICMgIHwgIHwgIHwgIHwgICMgIHwgIHwgIHwgIHwgICMgIHwgIHwgIHwgIHwgICMKKyMtLXwtLXwtLXwtLXwtLSMtLXwtLXwtLXwtLXwtLSMtLXwtLXwtLXwtLXwtLSMtLXwtLXwtLXwtLXwtLSMKKyMgIHwgICAgICAgICAgICMgIHwgICAgICAgIHwgICMgICAgIHwgICAgICAgICMgICAgICAgICAgICAgICMKKyMtUHwtUnxib290c2VsLSMtUnwtVE0tZi0tLXwtQ1BVLWYtLXwtQ09SRS1mLSMtLS0tLWRldmlkLS0tLSMKKworCisqLworCisJCWNvbnN0IGNoYXIgKmNtZDsKKwkJdm9sYXRpbGUgdWludCBzYXRyX3JlZzsKKworCQljbWQgPSBhcmd2WzBdOworCisJCWlmIChzdHJjbXAoY21kLCAiZHVtcCIpID09IDApIHsKKwkJCQlzYXRyX3JlZyA9CisJCQkJKCh0cmVhZF9iYzIoMHg0YywgMCkmMHgxZikgPDwgMCkgfAkvLyA1IGJpdHMKKwkJCQkoKHRyZWFkX2JjMigweDRkLCAwKSYweDFmKSA8PCA1KSB8CisJCQkJKCh0cmVhZF9iYzIoMHg0ZSwgMCkmMHgxZikgPDwgMTApIHwKKwkJCQkoKHRyZWFkX2JjMigweDRmLCAwKSYweDFmKSA8PCAxNSk7CisJCQkJcHJpbnRmKCJCQzIgU0BSIHJhdyByZWdpc3RlciA9IDB4JTA4eFxuIiwgc2F0cl9yZWcpOworCQl9CisKKwkJZWxzZSBpZiAoc3RyY21wKGNtZCwgImRldmlkIikgPT0gMCkgeworCQkJCXNhdHJfcmVnID0gdHJlYWRfYmMyKDB4NGMsIDApICYgMHgxZjsKKwkJCQlwcmludGYoIkJDMiBTQFIgZGV2aWQgPSAweCUwMnhcbiIsIHNhdHJfcmVnKTsKKwkJfQorCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJjb3JlZnJlcSIpID09IDApIHsKKwkJCQlzYXRyX3JlZyA9IHRyZWFkX2JjMigweDRkLCAwKSAmIDB4MDc7CisJCQkJcHJpbnRmKCJCQzIgU0BSIGNvcmVmcmVxID0gMHgleFxuIiwgc2F0cl9yZWcpOworCQl9CisKKwkJZWxzZSBpZiAoc3RyY21wKGNtZCwgImNwdWZyZXEiKSA9PSAwKSB7CisJCQkJc2F0cl9yZWcgPSAoKHRyZWFkX2JjMigweDRkLCAwKSAmIDB4MTgpID4+IDMpIHwgKCh0cmVhZF9iYzIoMHg0ZSwgMCkgJiAweDAxKSA8PCAyKTsKKwkJCQlwcmludGYoIkJDMiBTQFIgY3B1ZnJlcSA9IDB4JXhcbiIsIHNhdHJfcmVnKTsKKwkJfQorCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJ0bWZyZXEiKSA9PSAwKSB7CisJCQkJc2F0cl9yZWcgPSAodHJlYWRfYmMyKDB4NGUsIDApICYgMHgwZSkgPj4gMTsKKwkJCQlwcmludGYoIkJDMiBTQFIgdG1mcmVxID0gMHgleFxuIiwgc2F0cl9yZWcpOworCQl9CisKKwkJZWxzZSBpZiAoc3RyY21wKGNtZCwgImJvb3RzZWwiKSA9PSAwKSB7CisJCQkJc2F0cl9yZWcgPSB0cmVhZF9iYzIoMHg0ZiwgMCkgJiAweDA3OworCQkJCXByaW50ZigiQkMyIFNAUiBib290c2VsID0gMHgleFxuIiwgc2F0cl9yZWcpOworCQl9CisKKwkJZWxzZSBpZiAoc3RyY21wKGNtZCwgImp0YWdjcHUiKSA9PSAwKSB7CisJCQkJc2F0cl9yZWcgPSAodHJlYWRfYmMyKDB4NGYsIDApICYgMHgwOCkgPj4gMzsKKwkJCQlwcmludGYoIkJDMiBTQFIganRhZ2NwdSA9IDB4JXhcbiIsIHNhdHJfcmVnKTsKKwkJfQorCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJwdHBwbGwiKSA9PSAwKSB7CisJCQkJc2F0cl9yZWcgPSAodHJlYWRfYmMyKDB4NGYsIDApICYgMHgxMCkgPj4gNDsKKwkJCQlwcmludGYoIkJDMiBTQFIgcHRwcGxsID0gMHgleFxuIiwgc2F0cl9yZWcpOworCQl9CisKKwkJZWxzZSBpZiAoc3RyY21wKGNtZCwgInBjaWVnZW4xIikgPT0gMCkgeworCQkJCXNhdHJfcmVnID0gKHRyZWFkX2JjMigweDRjLCAxKSAmIDB4MTApID4+IDQ7CisJCQkJcHJpbnRmKCJCQzIgU0BSIHBjaWVnZW4xID0gMHgleFxuIiwgc2F0cl9yZWcpOworCQl9CisKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fc2FyX3dyaXRlX2JjMihpbnQgYXJnYywgY2hhciAqY29uc3QgYXJndltdKQoreworCQljb25zdCBjaGFyICpjbWQ7CisJCXZvbGF0aWxlIHVpbnQgc2F0cl9yZWc7CisJCXZvbGF0aWxlIGludCBiaXRfbWFzazsKKworCQljbWQgPSBhcmd2WzBdOworCisJCWlmIChzdHJjbXAoY21kLCAiZGV2aWQiKSA9PSAwKSB7CisJCQkJYml0X21hc2sgPSAoc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpICYgMHgxZik7CisJCQkJdHdyaXRlX2JjMigweDRjLCAwLCAoTVZfVTgpYml0X21hc2spOworCQl9CisKKwkJZWxzZSBpZiAoc3RyY21wKGNtZCwgImNvcmVmcmVxIikgPT0gMCkgeworCQkJCWJpdF9tYXNrID0gKHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KSAmIDB4MDcpOworCQkJCXNhdHJfcmVnID0gdHJlYWRfYmMyKDB4NGQsIDApICYgMHgxZjsKKwkJCQlzYXRyX3JlZyA9IChzYXRyX3JlZyAmIDB4MTgpIHwgYml0X21hc2s7CisJCQkJdHdyaXRlX2JjMigweDRkLCAwLCAoTVZfVTgpc2F0cl9yZWcpOworCQl9CisKKwkJZWxzZSBpZiAoc3RyY21wKGNtZCwgImNwdWZyZXEiKSA9PSAwKSB7CisJCQkJYml0X21hc2sgPSAoc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpICYgMHgwNyk7CisJCQkJc2F0cl9yZWcgPSB0cmVhZF9iYzIoMHg0ZCwgMCkgJiAweDFmOworCQkJCXNhdHJfcmVnID0gKHNhdHJfcmVnICYgMHgwNykgfCAoKGJpdF9tYXNrICYgMHgwMykgPDwgMyk7CisJCQkJdHdyaXRlX2JjMigweDRkLCAwLCAoTVZfVTgpc2F0cl9yZWcpOworCisJCQkJc2F0cl9yZWcgPSB0cmVhZF9iYzIoMHg0ZSwgMCkgJiAweDFmOworCQkJCXNhdHJfcmVnID0gKHNhdHJfcmVnICYgMHgxZSkgfCAoKGJpdF9tYXNrICYgMHgwNCkgPj4gMik7CisJCQkJdHdyaXRlX2JjMigweDRlLCAwLCAoTVZfVTgpc2F0cl9yZWcpOworCQl9CisKKwkJZWxzZSBpZiAoc3RyY21wKGNtZCwgInRtZnJlcSIpID09IDApIHsKKwkJCQliaXRfbWFzayA9IChzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNikgJiAweDA3KTsKKwkJCQlzYXRyX3JlZyA9IHRyZWFkX2JjMigweDRlLCAwKSAmIDB4MWY7CisJCQkJc2F0cl9yZWcgPSAoc2F0cl9yZWcgJiAweDExKSB8IChiaXRfbWFzayAgPDwgMSk7CisJCQkJdHdyaXRlX2JjMigweDRlLCAwLCAoTVZfVTgpc2F0cl9yZWcpOworCQl9CisKKwkJZWxzZSBpZiAoc3RyY21wKGNtZCwgImJvb3RzZWwiKSA9PSAwKSB7CisJCQkJYml0X21hc2sgPSAoc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpICYgMHgwNyk7CisJCQkJc2F0cl9yZWcgPSB0cmVhZF9iYzIoMHg0ZiwgMCkgJiAweDFmOworCQkJCXNhdHJfcmVnID0gKHNhdHJfcmVnICYgMHgxOCkgfCBiaXRfbWFzazsKKwkJCQl0d3JpdGVfYmMyKDB4NGYsIDAsIChNVl9VOClzYXRyX3JlZyk7CisJCX0KKworCQllbHNlIGlmIChzdHJjbXAoY21kLCAianRhZ2NwdSIpID09IDApIHsKKwkJCQliaXRfbWFzayA9IChzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNikgJiAweDAxKTsKKwkJCQlzYXRyX3JlZyA9IHRyZWFkX2JjMigweDRmLCAwKSAmIDB4MWY7CisJCQkJc2F0cl9yZWcgPSAoc2F0cl9yZWcgJiAweDE3KSB8IChiaXRfbWFzayA8PCAzKTsKKwkJCQl0d3JpdGVfYmMyKDB4NGYsIDAsIChNVl9VOClzYXRyX3JlZyk7CisJCX0KKworCQllbHNlIGlmIChzdHJjbXAoY21kLCAicHRwcGxsIikgPT0gMCkgeworCQkJCWJpdF9tYXNrID0gKHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KSAmIDB4MDEpOworCQkJCXNhdHJfcmVnID0gdHJlYWRfYmMyKDB4NGYsIDApICYgMHgxZjsKKwkJCQlzYXRyX3JlZyA9IChzYXRyX3JlZyAmIDB4MGYpIHwgKGJpdF9tYXNrIDw8IDQpOworCQkJCXR3cml0ZV9iYzIoMHg0ZiwgMCwgKE1WX1U4KXNhdHJfcmVnKTsKKwkJfQorCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJwY2llZ2VuMSIpID09IDApIHsKKwkJCWJpdF9tYXNrID0gKHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KSAmIDB4MDEpOworCQkJc2F0cl9yZWcgPSB0cmVhZF9iYzIoMHg0YywgMSkgJiAweDFmOworCQkJc2F0cl9yZWcgPSAoc2F0cl9yZWcgJiAweDBmKSB8IChiaXRfbWFzayA8PCA0KTsKKwkJCXR3cml0ZV9iYzIoMHg0YywgMSwgKE1WX1U4KXNhdHJfcmVnKTsKKwkJfQorCisJCXJldHVybiAwOworfQorCisKKworTVZfU1RBVFVTIGNoZWNrX3R3c2lfYmMyKHZvaWQpCit7CisJCU1WX1U4IHJlZyA9IHRyZWFkX2JjMigweDRjLCAwKTsKKwkJREIocHJpbnRmKCJcbmNoZWNrX3R3c2lfYmMyOiByZWFkX0JDMj0gMHgleFxuIiwgcmVnKSk7CisJCWlmIChyZWcgPT0gMHhmZikKKwkJCQlyZXR1cm4gTVZfRVJST1I7CisJCWVsc2UKKwkJCQlyZXR1cm4gTVZfT0s7Cit9CisKK2ludCBkb19zYXJfYmMyKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCit7CisKKwkJY29uc3QgY2hhciAqY21kOworCisJCS8qIG5lZWQgYXQgbGVhc3QgdHdvIGFyZ3VtZW50cyAqLworCQlpZiAoYXJnYyA8IDIpCisJCQkJZ290byB1c2FnZTsKKworCQljbWQgPSBhcmd2WzFdOworCisJCWlmIChjaGVja190d3NpX2JjMigpID09IE1WX0VSUk9SKSB7CisJCQkJcHJpbnRmKCJCQzIgdHdzaSBjaGFubmVsIG5vdCBjb25uZWN0ZWRcbiIpOworCQkJCXJldHVybiAxOworCQl9CisKKworCQlpZiAoc3RyY21wKGNtZCwgImxpc3QiKSA9PSAwKQorCQkJCXJldHVybiBkb19zYXJfbGlzdF9iYzIoYXJnYyAtIDIsIGFyZ3YgKyAyKTsKKworCQllbHNlIGlmIChzdHJjbXAoY21kLCAicmVhZCIpID09IDApCisJCQkJcmV0dXJuIGRvX3Nhcl9yZWFkX2JjMihhcmdjIC0gMiwgYXJndiArIDIpOworCisKKwkJZWxzZSBpZiAoc3RyY21wKGNtZCwgIndyaXRlIikgPT0gMCkgeworCQkJCWlmIChkb19zYXJfd3JpdGVfYmMyKGFyZ2MgLSAyLCBhcmd2ICsgMikgPT0gMCkgeworCQkJCQkJZG9fc2FyX3JlYWRfYmMyKGFyZ2MgLSAyLCBhcmd2ICsgMik7CisJCQkJfQorCQkJCXJldHVybiAwOworCisJCX0KKworCQl1c2FnZToKKwkJcHJpbnRmKCJcbiIpOworCQlwcmludGYoIkJDMiBTYW1wbGUgQXQgUmVzZXQgc3ViLXN5c3RlbVxuIik7CisJCXByaW50ZigiU2F0UiBsaXN0IGNvcmVmcmVxICAtIHByaW50IGNvcmVmcmVxIGxpc3RcbiIpOworCQlwcmludGYoIlNhdFIgbGlzdCBjcHVmcmVxICAgLSBwcmludCBjcHVmcmVxIGxpc3RcbiIpOworCQlwcmludGYoIlNhdFIgbGlzdCB0bWZyZXEgICAgLSBwcmludCB0bWZyZXEgbGlzdFxuIik7CisJCXByaW50ZigiU2F0UiBsaXN0IGJvb3RzZWwgICAtIHByaW50IGJvb2xzZWwgbGlzdFxuIik7CisJCXByaW50ZigiU2F0UiBsaXN0IGp0YWdjcHUgICAtIHByaW50IGp0YWdjcHUgbGlzdFxuIik7CisJCXByaW50ZigiU2F0UiBsaXN0IHB0cHBsbCAgICAtIHByaW50IHB0cHBsbCBsaXN0XG4iKTsKKwkJcHJpbnRmKCJTYXRSIGxpc3QgcGNpZWdlbjEgIC0gcHJpbnQgcGNpZWdlbjEgbGlzdFxuIik7CisKKwkJcHJpbnRmKCJcbiIpOworCisJCXByaW50ZigiU2F0UiByZWFkIGRldmlkICAgICAtIHJlYWQgZGV2aWNlIGlkXG4iKTsKKwkJcHJpbnRmKCJTYXRSIHJlYWQgY29yZWZyZXEgIC0gcmVhZCBDT1JFIGZyZXF1ZW5jeVxuIik7CisJCXByaW50ZigiU2F0UiByZWFkIGNwdWZyZXEgICAtIHJlYWQgQ1BVIGZyZXF1ZW5jeVxuIik7CisJCXByaW50ZigiU2F0UiByZWFkIHRtZnJlcSAgICAtIHJlYWQgVE0gZnJlcXVlbmN5XG4iKTsKKwkJcHJpbnRmKCJTYXRSIHJlYWQgYm9vdHNlbCAgIC0gcmVhZCBCb290IHNlbGVjdFxuIik7CisJCXByaW50ZigiU2F0UiByZWFkIGp0YWdjcHUgICAtIHJlYWQgSlRBRyBDUFUgc2VsZWN0aW9uXG4iKTsKKwkJcHJpbnRmKCJTYXRSIHJlYWQgcHRwcGxsICAgIC0gcmVhZCBQVFAgUExMIHNldHRpbmdcbiIpOworCQlwcmludGYoIlNhdFIgcmVhZCBwY2llZ2VuMSAgLSByZWFkIEZvcmNlIFBDSWUgR0VOMSBzZXR0aW5nXG4iKTsKKwkJcHJpbnRmKCJTYXRSIHJlYWQgZHVtcCAgICAgIC0gcmVhZCBhbGwgdmFsdWVzXG4iKTsKKwkJcHJpbnRmKCJcbiIpOworCisJCXByaW50ZigiU2F0UiB3cml0ZSBkZXZpZCAgICA8dmFsPiAtIHdyaXRlIGRldmljZSBpZFxuIik7CisJCXByaW50ZigiU2F0UiB3cml0ZSBjb3JlZnJlcSA8dmFsPiAtIHdyaXRlIENPUkUgZnJlcXVlbmN5XG4iKTsKKwkJcHJpbnRmKCJTYXRSIHdyaXRlIGNwdWZyZXEgIDx2YWw+IC0gd3JpdGUgQ1BVICBmcmVxdWVuY3lcbiIpOworCQlwcmludGYoIlNhdFIgd3JpdGUgdG1mcmVxICAgPHZhbD4gLSB3cml0ZSBUTSBmcmVxdWVuY3lcbiIpOworCQlwcmludGYoIlNhdFIgd3JpdGUgYm9vdHNlbCAgPHZhbD4gLSB3cml0ZSBCb290IHNlbGVjdFxuIik7CisJCXByaW50ZigiU2F0UiB3cml0ZSBqdGFnY3B1ICA8dmFsPiAtIHdyaXRlIEpUQUcgQ1BVIHNlbGVjdGlvblxuIik7CisJCXByaW50ZigiU2F0UiB3cml0ZSBwdHBwbGwgICA8dmFsPiAtIHdyaXRlIFBUUCBQTEwgc2V0dGluZ1xuIik7CisJCXByaW50ZigiU2F0UiB3cml0ZSBwY2llZ2VuMSA8dmFsPiAtIHdyaXRlIEZvcmNlIFBDSWUgR0VOMSBzZXR0aW5nXG4iKTsKKworCQlyZXR1cm4gMTsKK30KKworI2lmbmRlZiBNVl9NU1lTCisvKiBUaGlzIGZ1bmN0aW9uIHVzZWQgZm9yIEFNQyArIHJlbW90ZSBNU1lTIGNhc2UuIFRoZSBNU1lTIHN0YW5kYWxvbmUgaW1wbGVtZW50YXRpb24gZGlmZmVycyAqLworc3RhdGljIGludCBkb19xc2dtaWlfc2VsKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK3sKKworCQlpbnQgYml0X21hc2s7CisKKwkJaWYgKGFyZ2MgPCAyKQorCQkJCWdvdG8gdXNhZ2U7CisKKwkJaWYgKGNoZWNrX3R3c2lfYmMyKCkgPT0gTVZfRVJST1IpIHsKKwkJCQlwcmludGYoIkJDMiB0d3NpIGNoYW5uZWwgbm90IGNvbm5lY3RlZFxuIik7CisJCQkJcmV0dXJuIDE7CisJCX0KKworCQliaXRfbWFzayA9IChzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNikgJiAweDAwMDBmZmZmKTsKKworCQl0d3JpdGVfYmMyKDB4MjAsIDIsIChNVl9VOCkoKGJpdF9tYXNrID4+IDApICYgMHhmZikpOworCQl0d3JpdGVfYmMyKDB4MjAsIDMsIChNVl9VOCkoKGJpdF9tYXNrID4+IDgpICYgMHhmZikpOworCQl0d3JpdGVfYmMyKDB4MjAsIDYsIDB4MCk7CisJCXR3cml0ZV9iYzIoMHgyMCwgNywgMHgwKTsKKwkJcmV0dXJuIDE7CisKKwkJdXNhZ2U6CisJCWNtZF91c2FnZShjbWR0cCk7CisJCXJldHVybiAxOworfQorCisKK1VfQk9PVF9DTUQoCisJCSAgcXNnbWlpX3NlbCwgICAgICAyLCAgICAgMSwgICAgICBkb19xc2dtaWlfc2VsLAorCQkgICIgU2VsZWN0IFNGUCBvciBRU0dNSUkgbW9kZXMgb24gYmMyLlxuIiwKKwkJICAiIGFwcGx5IDE2IGJpdCBhcnJheSB0byBzZWxlY3QgU0ZQIG9yIFFTR01JSSBtb2RlcyIKKwkJICApOworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9zd2l0Y2hpbmdTZXJ2aWNlcy9zd2l0Y2hpbmdTZXJ2aWNlcy5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1Avc3dpdGNoaW5nU2VydmljZXMvc3dpdGNoaW5nU2VydmljZXMuYwppbmRleCA1ODg1YWFmLi44YTViNWNjIDEwMDc1NQotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9zd2l0Y2hpbmdTZXJ2aWNlcy9zd2l0Y2hpbmdTZXJ2aWNlcy5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL3N3aXRjaGluZ1NlcnZpY2VzL3N3aXRjaGluZ1NlcnZpY2VzLmMKQEAgLTI0Niw2ICsyNDYsMTkgQEAKIAkiXG4gICAgLSBwcmludCBpbmZvcm1hdGlvbiBmb3IgYWxsIFNQSSBGTEFTSCBtZW1vcnkgYmFua3NcbiIKICk7CiAKK3N0YXRpYyBpbnQgaXNTd2l0Y2hpbmdTZXJ2aWNlc1N1cHBvcnRlZCh2b2lkKQoreworCU1WX1UzMiBmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKKworCS8qIGVuYWJsZSBjb21tYW5kIG9ubHkgZm9yIEFDMyAmIEJDMiAmIEFNQyBib2FyZHMgICovCisJaWYgKCEoKGZhbWlseSA+PSBNVl9BTExFWUNBVDNfREVWX0lEICYmIGZhbWlseSA8PSBNVl9BTExFWUNBVDNfTUFYX0RFVl9JRCkKKwkJfHwgZmFtaWx5ID09IE1WX0JPQkNBVDJfREVWX0lEIHx8IG12Qm9hcmRpc0FtYygpKSkgeworCQlwcmludGYoIkNvbW1hbmQgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBTb0MvQm9hcmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGRvX2Nwc3NfZW52IC0gU2F2ZSBDUFNTIGVudmlyb21lbnQgb24gZmxhc2gKICoKQEAgLTI2Myw2ICsyNzYsOSBAQAogewogCWNoYXIgYnVmWzEwMjRdOwogCisJaWYgKCFpc1N3aXRjaGluZ1NlcnZpY2VzU3VwcG9ydGVkKCkpCisJCXJldHVybiAwOworCiAJcHJpbnRmKCJTYXZpbmcgY3BzcyBlbnZpcm9ubWVudCB2YXJpYWJsZVxuIik7CiAJc2V0ZW52KCJzdGFuZGFsb25lIiwgIiIpOwogCXNldGVudigiYm9vdGNtZCIsICJydW4gc3RhbmRhbG9uZV9tdGQiKTsKQEAgLTI3Nyw3ICsyOTMsNyBAQAogCQkJCQkgImNvbnNvbGU9JHtjb25zb2xlZGV2fSwke2JhdWRyYXRlfSAke290aGJvb3RhcmdzfSAke2xpbnV4X3BhcnRzfTsgdGZ0cCAke2xpbnV4X2xvYWRhZGRyfSAiCiAJCQkJCSAiJHtpbWFnZV9uYW1lfTtib290bSAke2xpbnV4X2xvYWRhZGRyfSIpOwogCi0Jc3ByaW50ZihidWYsIidzcGlfZmxhc2g6JWRtKHNwaV91Ym9vdClybywlZG0oc3BpX2tlcm5lbCksJWRtKHNwaV9yb290ZnMpLC0ocmVtYWluZGVyKSIKKwlzcHJpbnRmKGJ1ZiwiJ210ZHBhcnRzPXNwaV9mbGFzaDolZG0oc3BpX3Vib290KXJvLCVkbShzcGlfa2VybmVsKSwlZG0oc3BpX3Jvb3RmcyksLShyZW1haW5kZXIpIgogCQkiO2FybWFkYS1uYW5kOiVkbShuYW5kX2tlcm5lbCksLShuYW5kX3Jvb3RmcyknIiwgQ0ZHX0FQUExfRkxBU0hfUEFSVF9VQk9PVF9TSVpFIC8gXzFNLAogCQlDRkdfQVBQTF9TUElfRkxBU0hfUEFSVF9LRVJORUxfU0laRSAvIF8xTSwgQ0ZHX0FQUExfU1BJX0ZMQVNIX1BBUlRfUk9PVEZTX1NJWkUgLyBfMU0sCiAJCUNGR19BUFBMX05BTkRfRkxBU0hfUEFSVF9LRVJORUxfU0laRSAvIF8xTSk7CkBAIC0yOTAsNyArMzA2LDcgQEAKIAlzcHJpbnRmKGJ1ZiwKIAkJInNmIHByb2JlOyBzZiByZWFkICR7bG9hZGFkZHJ9IDB4JXggMHgleDsgc2V0ZW52IGJvb3RhcmdzICR7Y29uc29sZX0gIgogCQkiaXA9JHtpcGFkZHJ9OiR7c2VydmVyaXB9OiR7Z2F0ZXdheWlwfToke25ldG1hc2t9OiR7aG9zdG5hbWV9OiR7bmV0ZGV2fTpvZmYgIgotCQkicm9vdD0vZGV2L210ZGJsb2NrMiBydyBpbml0PS9saW51eHJjIHJvb3Rmc3R5cGU9amZmczIgcm9vdHdhaXQgbXRkcGFydHM9JHttdGRwYXJ0c30gIgorCQkicm9vdD0vZGV2L210ZGJsb2NrMiBydyBpbml0PS9saW51eHJjIHJvb3Rmc3R5cGU9amZmczIgcm9vdHdhaXQgJHttdGRwYXJ0c30gIgogCQkiJHttdk5ldENvbmZpZ307IGJvb3RtICR7bG9hZGFkZHJ9ICIsCiAJCUNGR19BUFBMX1NQSV9GTEFTSF9QQVJUX0tFUk5FTF9TVEFSVCwgQ0ZHX0FQUExfU1BJX0ZMQVNIX1BBUlRfS0VSTkVMX1NJWkUpOwogI2lmbmRlZiBNVl9OQU5ECkBAIC0zMDQsNyArMzIwLDcgQEAKIAogI2lmZGVmIE1WX05BTkQKIAlzcHJpbnRmKGJ1ZiwKLQkJIm5hbmQgcmVhZCAke2xvYWRhZGRyfSAweCV4IDB4JXg7IHNldGVudiBib290YXJncyAke2NvbnNvbGV9IG10ZHBhcnRzPSR7bXRkcGFydHN9ICIKKwkJIm5hbmQgcmVhZCAke2xvYWRhZGRyfSAweCV4IDB4JXg7IHNldGVudiBib290YXJncyAke2NvbnNvbGV9ICR7bXRkcGFydHN9ICIKIAkJImlwPSR7aXBhZGRyfToke3NlcnZlcmlwfToke2dhdGV3YXlpcH06JHtuZXRtYXNrfToke2hvc3RuYW1lfToke25ldGRldn06b2ZmICIKIAkJInViaS5tdGQ9NSByb290PXViaTA6cm9vdGZzX25hbmQgcm8gcm9vdGZzdHlwZT11YmlmcyAke212TmV0Q29uZmlnfTsgYm9vdG0gMHgyMDAwMDAwOyIgLAogCQlDRkdfQVBQTF9OQU5EX0ZMQVNIX1BBUlRfS0VSTkVMX1NUQVJULApAQCAtMzI0LDcgKzM0MCw5IEBACiAJIiIKICk7CiAKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQogZXh0ZXJuIHN0cnVjdCBzcGlfZmxhc2ggKmZsYXNoOworI2VuZGlmCiAKIHN0cnVjdCBwYXJ0aXRpb25JbmZvcm1hdGlvbiBuYW5kSW5mbyA9IHsKIAkuZGVmYXVsdEltYWdlID0gInViaWZzX2FybV9uYW5kLmltYWdlIiwKQEAgLTM1NSw4ICszNzMsMTEgQEAKIAkJc3ByaW50ZihjbWRCdWYsICJuYW5kIHdyaXRlLnRyaW1mZnMgJXggJXggJXhcbiIsIHNvdXJjZSwgZGVzdGluYXRpb24sIGxlbik7CiAJCXByaW50ZihjbWRCdWYpOwogCQlydW5fY29tbWFuZChjbWRCdWYsIDApOwotCX0gZWxzZQorCX0KKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQorCWVsc2UKIAkJc3BpX2ZsYXNoX3dyaXRlKGZsYXNoLCBkZXN0aW5hdGlvbiwgbGVuLCAoY29uc3Qgdm9pZCAqKXNvdXJjZSk7CisjZW5kaWYKIH0KIAogdm9pZCBmbGFzaEVyYXNlIChNVl9VMzIgZGVzdGluYXRpb24sIE1WX1UzMiBsZW4sIE1WX0JPT0wgaXNOYW5kKQpAQCAtMzY2LDE0ICszODcsMTYgQEAKIAkJc3ByaW50ZihjbWRCdWYsICJuYW5kIGVyYXNlICV4ICV4XG4iLCBkZXN0aW5hdGlvbiwgbGVuKTsKIAkJcHJpbnRmKGNtZEJ1Zik7CiAJCXJ1bl9jb21tYW5kKGNtZEJ1ZiwgMCk7Ci0JfSBlbHNlCisJfQorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCisJZWxzZQogCQlzcGlfZmxhc2hfZXJhc2UoZmxhc2gsIGRlc3RpbmF0aW9uLCBsZW4pOwotCisjZW5kaWYKIH0KIAogc3RhdGljIGludCBkb19tdGRidXJuKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKIHsKLQlNVl9VMzIgaSwgZmlsZXNpemUsIGFkZHIsIHNyY19hZGRyLCBkZXN0X2FkZHI7CisJTVZfVTMyIGksIGFkZHIsIHNyY19hZGRyLCBkZXN0X2FkZHI7CiAJTVZfVTMyIGtlcm5lbF91bmNfbGVuLCByb290ZnNfdW5jX2xlbiA9IDAsIHVuY19sZW4sIHNyY19sZW47CiAJTVZfVTMyIGtlcm5lbF9hZGRyID0gQ0ZHX0RFRl9LRVJORUxfREVTVF9BRERSOwogCU1WX1UzMiByb290ZnNfYWRkciA9IENGR19ERUZfUk9PVEZTX0RFU1RfQUREUjsKQEAgLTM4NSw3ICs0MDgsMTAgQEAKIAlNVl9VMzIgZnN5cyA9IEZTX1RZUEVfRkFUOwkJCQkvKiBkZWZhdWx0IEZTID0gRkFUICovCiAJTVZfQk9PTCBpc05hbmQgPSBNVl9UUlVFOwkJCQkvKiBkZWZhdWx0IGRlc3RpbmF0aW9uID0gTkFORCAqLwogCWFkZHIgPSBsb2FkX2FkZHIgPSBDRkdfREVGX1NPVVJDRV9MT0FEX0FERFI7Ci0JaW50IGZpbGVTaXplRnJvbVJhbSA9IC0xOworCWludCBmaWxlc2l6ZSwgZmlsZVNpemVGcm9tUmFtID0gLTE7CisKKwlpZiAoIWlzU3dpdGNoaW5nU2VydmljZXNTdXBwb3J0ZWQoKSkKKwkJcmV0dXJuIDA7CiAKIAkvKiBzY2FuIGZvciBmbGFzaCBkZXN0aW5hdGlvbiBpbiBhcmd1bWVudHMgKGFsbG93aW5nIHVzYWdlIG9mIG9ubHkgJ210ZGJ1cm4gc3BpJykgKi8KIAlmb3IgKGkgPSAxIDsgaSA8IGFyZ2MgOyBpKyspIHsKQEAgLTQwMywzMCArNDI5LDI5IEBACiAJCWZpbGVTaXplRnJvbVJhbSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNl0sIE5VTEwsIDE2KTsKIAljYXNlIDY6LyogYXJnIzYgaXMgZmxhc2ggZGVzdGluYXRpb24sIHNjYW5uZWQgcHJldmlvdXNseSAtLT4gZmFsbCB0byA1Ki8KIAljYXNlIDU6Ci0JCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCBhcmd2WzRdLCBzaXplb2YoQm9vdEZpbGUpKTsKKwkJaWYoc3RyY21wKGFyZ3ZbNF0sICJFWFQyIikgPT0gMCkKKwkJCWZzeXMgPSBGU19UWVBFX0VYVDsKIAkJLyogZmFsbCB0byA0Ki8KIAljYXNlIDQ6Ci0JCWlmKHN0cmNtcChhcmd2WzNdLCAiRVhUMiIpID09IDApCi0JCQlmc3lzID0gRlNfVFlQRV9FWFQ7CisJCWRldlBhcnQgPSBhcmd2WzNdOwogCQkvKiBmYWxsIHRvIDMqLwogCWNhc2UgMzoKLQkJZGV2UGFydCA9IGFyZ3ZbMl07Ci0JCS8qIGZhbGwgdG8gMiovCi0JY2FzZSAyOgotCQlpZihzdHJjbXAoYXJndlsxXSwgInVzYiIpID09IDApCisJCWlmKHN0cmNtcChhcmd2WzJdLCAidXNiIikgPT0gMCkKIAkJCWxvYWRmcm9tID0gMTsKLQkJZWxzZSBpZihzdHJjbXAoYXJndlsxXSwgIm1tYyIpID09IDApCisJCWVsc2UgaWYoc3RyY21wKGFyZ3ZbMl0sICJtbWMiKSA9PSAwKQogCQkJbG9hZGZyb20gPSAyOwotCQllbHNlIGlmKHN0cmNtcChhcmd2WzFdLCAicmFtIikgPT0gMCkgeworCQllbHNlIGlmKHN0cmNtcChhcmd2WzJdLCAicmFtIikgPT0gMCkgewogCQkJbG9hZGZyb20gPSAzOwogCQkJaWYgKGRldlBhcnQgIT0gTlVMTCkKIAkJCQlhZGRyID0gbG9hZF9hZGRyID0gKHVuc2lnbmVkIGludClzaW1wbGVfc3RydG91bChkZXZQYXJ0LCBOVUxMLCAxNik7CiAJCX0KIAkJaWYgKChsb2FkZnJvbSA9PSAxIHx8IGxvYWRmcm9tID09IDIpICYmIGRldlBhcnQgPT0gTlVMTCkgLyogaWYgdXNpbmcgVVNCL01NQywgYW5kIG5vdCBzZWxlY3RlZCBpbnRlcmZhY2UgbnVtICovCiAJCQlkZXZQYXJ0ID0gIjAiOwkJCQkJIC8qIGRlZmF1bHQgaW50ZXJmYWNlIG51bWJlciBpcyAwICovCi0JCS8qIGZhbGwgdG8gMSovCisJCS8qIGZhbGwgdG8gMiovCisJY2FzZSAyOgorCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgYXJndlsxXSwgc2l6ZW9mKEJvb3RGaWxlKSk7CiAJY2FzZSAxOiAgICAvKiBubyBwYXJhbWV0ZXIgYWxsIGRlZmF1bHQgKi8KLQkJaWYoYXJnYyA8IDQpCisJCWlmIChhcmdjIDwgMikKIAkJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCBwYXJ0aXRpb25JbmZvLT5kZWZhdWx0SW1hZ2UsIHNpemVvZihCb290RmlsZSkpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtNDUxLDEyICs0NzYsMTkgQEAKIAlpZiAobXZWZXJpZnlSZXF1ZXN0KCkgPT0gTVZfRkFMU0UpCiAJCXJldHVybiAwOwogCi0JaWYgKGlzTmFuZCA9PSBNVl9GQUxTRSAmJiAhZmxhc2gpIHsKLQkJZmxhc2ggPSBzcGlfZmxhc2hfcHJvYmUoMCwgMCwgQ09ORklHX1NGX0RFRkFVTFRfU1BFRUQsIENPTkZJR19TRl9ERUZBVUxUX01PREUpOworCWlmIChpc05hbmQgPT0gTVZfRkFMU0UpIHsKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQogCQlpZiAoIWZsYXNoKSB7Ci0JCQlwcmludGYoIkZhaWxlZCB0byBwcm9iZSBTUEkgRmxhc2hcbiIpOwotCQkJcmV0dXJuIDA7CisJCQlmbGFzaCA9IHNwaV9mbGFzaF9wcm9iZSgwLCAwLCBDT05GSUdfU0ZfREVGQVVMVF9TUEVFRCwgQ09ORklHX1NGX0RFRkFVTFRfTU9ERSk7CisJCQlpZiAoIWZsYXNoKSB7CisJCQkJcHJpbnRmKCJGYWlsZWQgdG8gcHJvYmUgU1BJIEZsYXNoXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KIAkJfQorI2Vsc2UKKwkJcHJpbnRmKCJTUEkgRmxhc2ggaXMgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAwOworI2VuZGlmCiAJfQogCiAJLyogRmV0Y2ggcmVxdWVzdGVkIGZpbGUsIGZpbGVzaXplIGlzIG5lZWRlZCBmb3Igc2luZ2xlIGltYWdlIG9ubHkgKi8KQEAgLTU1MSwxMCArNTgzLDExIEBACiAJfQogCiAJLyogRXJhc2UgZW50aXJlIE5BTkQgZmxhc2ggLSBhdm9pZCBpbnZhbGlkIGZpbGUgc3lzdGVtIHByZXBhcmF0aW9ucyAqLwotCXByaW50ZigiXG5Hb2luZyB0byBlcmFzZSB0aGUgZW50aXJlIE5BTkQgZmxhc2guICIpOwotCWlmIChtdlZlcmlmeVJlcXVlc3QoKSA9PSBNVl9UUlVFKQotCQlydW5fY29tbWFuZCgibmFuZCBlcmFzZS5jaGlwIiwgMCk7Ci0KKwlpZiAoaXNOYW5kID09IE1WX1RSVUUpIHsKKwkJcHJpbnRmKCJcbkdvaW5nIHRvIGVyYXNlIHRoZSBlbnRpcmUgTkFORCBmbGFzaC4gIik7CisJCWlmIChtdlZlcmlmeVJlcXVlc3QoKSA9PSBNVl9UUlVFKQorCQkJcnVuX2NvbW1hbmQoIm5hbmQgZXJhc2UuY2hpcCIsIDApOworCX0KIAlwcmludGYoIlxuQnVybmluZyAlcyBvbiBmbGFzaCBhdCAweCUwOHgsIGxlbmd0aD0lZEtcbiIsCiAJCShzaW5nbGVfZmlsZSkgPyAic2luZ2xlIGltYWdlIiA6ICJrZXJuZWwiLAogCQlwYXJ0aXRpb25JbmZvLT5LRVJORUxfU1RBUlQsIGtlcm5lbF91bmNfbGVuL18xSyk7CkBAIC01OTMsMTQgKzYyNiwxNSBAQAogVV9CT09UX0NNRCgKIAltdGRidXJuLCAgICAgIDYsICAgICAxLCAgICAgIGRvX210ZGJ1cm4sCiAJIkJ1cm4gYSBMaW51eCBpbWFnZSBhbmQgRmlsZXN5c3RlbWAgb24gdGhlIE5BTkQvU1BJIGZsYXNoLlxuIiwKLQkiW2ludGVyZmFjZSBbPGRldls6cGFydF0+ICBbRmlsZSBzeXN0ZW0gW2ZpbGVuYW1lXV1dXSBbZmxhc2ggZGVzdGluYXRpb25dIFtzaW5nbGUgZmlsZSBzaXplIG9uIFJBTV1cbiIKKwkiW2ZpbGVuYW1lIFtpbnRlcmZhY2UgWzxkZXZbOnBhcnRdPiBbRmlsZSBzeXN0ZW1dXV1dIFtmbGFzaCBkZXN0aW5hdGlvbl0gW3NpbmdsZSBmaWxlIHNpemUgb24gUkFNXVxuIgogCSJcdGludGVyZmFjZSAgOiByYW0gPGxvYWQgYWRkcmVzcz4sIHRmdHAsIG9yIG1tYy91c2IgPGludGVyZmFjZV9udW0+IChkZWZhdWx0IGlzIHRmdHApXG4iCiAJIlx0RmlsZSBzeXN0ZW06IEZBVCBvciBFWFQyIChkZWZhdWx0IGlzIEZBVCkuXG4iCiAJIlx0TkFORCBkZWZhdWx0IGZpbGUtbmFtZSBpcyB1Ymlmc19hcm1fbmFuZC5pbWFnZS5cbiIKIAkiXHRTUEkgZGVmYXVsdCBmaWxlLW5hbWUgaXMgamZmczJfYXJtLmltYWdlLlxuIgogCSJcdEZsYXNoIERlc3RpbmF0aW9uOiBuYW5kIG9yIHNwaSAoZGVmYXVsdCBpcyBuYW5kKS4gXG4iCi0JIlx0ZS5nLiBNTUM6ICdtdGRidXJuIG1tYyAwIEZBVCB1Ymlmc19hcm1fbmFuZC5pbWFnZSBuYW5kJ1xuIgotCSJcdGUuZy4gUkFNOiAnbXRkYnVybiByYW0gNTAwMDAwMCBuYW5kJ1xuIgorCSJcdGUuZy4gVEZUUDogJ210ZGJ1cm4gdWJpZnNfYXJtX25hbmQuaW1hZ2UnXG4iCisJIlx0ZS5nLiBNTUM6ICdtdGRidXJuIHViaWZzX2FybV9uYW5kLmltYWdlIG1tYyAwIEZBVCBuYW5kJ1xuIgorCSJcdGUuZy4gUkFNOiAnbXRkYnVybiB1Ymlmc19hcm1fbmFuZC5pbWFnZSByYW0gNTAwMDAwMCBuYW5kJ1xuIgogCiApOwogCkBAIC03OTEsNiArODI1LDcgQEAKIAkJcmV0dXJuIHNpbHQ7CiB9CiAKKyNpZmRlZiBNVl9NU1lTCiBzdGF0aWMgaW50IGRvX3FzZ21paV9zZWwoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQogewogCkBAIC04MjEsNiArODU2LDcgQEAKIAkJICAiIFNlbGVjdCBTRlAgb3IgUVNHTUlJIG1vZGVzIG9uIGJjMi5cbiIsCiAJCSAgIiBhcHBseSAxNiBiaXQgYXJyYXkgdG8gc2VsZWN0IFNGUCBvciBRU0dNSUkgbW9kZXMiCiAJCSAgKTsKKyNlbmRpZgogCiB2b2lkIGh3U2VydmljZXNMYXRlSW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1Avc3dpdGNoaW5nU2VydmljZXMvc3dpdGNoaW5nU2VydmljZXMuaCBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL3N3aXRjaGluZ1NlcnZpY2VzL3N3aXRjaGluZ1NlcnZpY2VzLmgKaW5kZXggYWI0MGRhYS4uMzhlMjFkNCAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1Avc3dpdGNoaW5nU2VydmljZXMvc3dpdGNoaW5nU2VydmljZXMuaAorKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9zd2l0Y2hpbmdTZXJ2aWNlcy9zd2l0Y2hpbmdTZXJ2aWNlcy5oCkBAIC0xNDMsMTAgKzE0MywxMCBAQAogCQlTSUxUX05QNSwKIAkJU0lMVF9CQzIsCiAJCVNJTFRfT1RIRVIsCi0JCVNMSUNfTk9UX0RFVEVDVCA9IDB4NWE1YQorCQlTSUxUX05PVF9ERVRFQ1QgPSAweDVhNWEKIH0gU0lMSUNPTl9UWVBFOwogCiBTSUxJQ09OX1RZUEUgZ2V0X2F0dGFjaGVkX3NpbGljb25fdHlwZSh2b2lkKTsKIGludCBkb19zYXJfYmMyKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pOwotCit2b2lkIGh3U2VydmljZXNMYXRlSW5pdCh2b2lkKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9jb21tb24vbXZDb21tb24uaCBiL2JvYXJkL212X2VidS9jb21tb24vY29tbW9uL212Q29tbW9uLmgKaW5kZXggNDA1ZmQzYy4uYmM1ZWY4NCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9jb21tb24vbXZDb21tb24uaAorKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL2NvbW1vbi9tdkNvbW1vbi5oCkBAIC0yMzEsNiArMjMxLDcgQEAKICNkZWZpbmUgXzJHICAgICAgICAgMHg4MDAwMDAwMAogCiAvKiBUY2xvY2sgYW5kIFN5cyBjbG9jayBkZWZpbmUgKi8KKyNkZWZpbmUgXzUwTUh6ICAgICAgNTAwMDAwMDAKICNkZWZpbmUgXzEwME1IeiAgICAgMTAwMDAwMDAwCiAjZGVmaW5lIF8xMjVNSHogICAgIDEyNTAwMDAwMAogI2RlZmluZSBfMTMzTUh6ICAgICAxMzMzMzMzMzQKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vY29tbW9uL212RGV2aWNlSWQuaCBiL2JvYXJkL212X2VidS9jb21tb24vY29tbW9uL212RGV2aWNlSWQuaAppbmRleCA0Yzg0ZTE1Li5kZGNiNTAzIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL2NvbW1vbi9tdkRldmljZUlkLmgKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9jb21tb24vbXZEZXZpY2VJZC5oCkBAIC00MDAsNiArNDAwLDEwIEBACiAjZGVmaW5lIE1WXzY4MTFfREVWX0lECQkweDY4MTEKICNkZWZpbmUgTVZfNjgyMF9ERVZfSUQJCTB4NjgyMAogI2RlZmluZSBNVl82ODI4X0RFVl9JRAkJMHg2ODI4CisjZGVmaW5lIE1WXzZXMjJfREVWX0lECQkweDY4MjMgLyogNlcyMj1BMzgzICovCisjZGVmaW5lIE1WXzZXMjNfREVWX0lECQkweDY4MjQgLyogNlcyMz1BMzg0ICovCisjZGVmaW5lIE1WXzZXMjJfREVWX05BTUUJIjZXMjIiCisjZGVmaW5lIE1WXzZXMjNfREVWX05BTUUJIjZXMjMiCiAKIC8qIEEzOHggcmV2aXNpb25zICovCiAjZGVmaW5lIE1WXzg4RjY4WFhfWjFfSUQJCTB4MApAQCAtNDM4LDExICs0NDIsNDYgQEAKIAlNVl9CT0JDQVQyX0IwX05BTUUsXAogfQogCisvKiBCb2JLICBGYW1pbHkgKi8KKyNkZWZpbmUgTVZfQk9CS19ERVZfSUQJCTB4QkMwMAorCisvKiBCb2JLIGRlaXZjZXMgbWF0cml4ICovCisjZGVmaW5lIE1WX0JPQktfQ0VUVVNfOThEWDQyMzVfREVWX0lECQkweEJFMDAKKyNkZWZpbmUgTVZfQk9CS19DQUVMVU1fOThEWDQyMDNfREVWX0lECQkweEJDMDAKKyNkZWZpbmUgTVZfQk9CS19MRVdJU185OERYODIxMl9ERVZfSUQJCTB4QkUxMAorCisvKiBCb2JLICBSZXZpc2lvbnMgKi8KKyNkZWZpbmUgTVZfQk9CS19BMF9JRAkJMHgwCisjZGVmaW5lIE1WX0JPQktfQTBfTkFNRQkJIkEwIgorCisjZGVmaW5lIE1WX0JPQktfSURfQVJSQVkgeyBcCisJIE1WX0JPQktfQTBfTkFNRSxcCit9CisKICAvKiBMaW9uMiAgRmFtaWx5ICovCiAjZGVmaW5lIE1WX0xJT04yX0RFVl9JRAkJMHg4MDAwCiAKIC8qIEFsbGV5Q2F0MyAgRmFtaWx5ICovCiAjZGVmaW5lIE1WX0FMTEVZQ0FUM19ERVZfSUQJCTB4RjQwMAorI2RlZmluZSBNVl9BTExFWUNBVDNfTUFYX0RFVl9JRAkJMHhGNEZGCisKKy8qIEFsbGV5Q2F0My9Qb21jYXQzIGRlaXZjZXMgbWF0cml4ICovCisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYMzMzNl9ERVZfSUQJMHhGNDAwCisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYMzMzNV9ERVZfSUQJMHhGNDAxCisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYMzMzNF9ERVZfSUQJMHhGNDAyCisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYMzMzM19ERVZfSUQJMHhGNDAzCisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYMTIzM19ERVZfSUQJMHhGNDA4CisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYMTIzNV9ERVZfSUQJMHhGNDA5CisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYMzIzNl9ERVZfSUQJMHhGNDEwCisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYMzIzNV9ERVZfSUQJMHhGNDExCisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYMzIzNF9ERVZfSUQJMHhGNDEyCisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYMzIzM19ERVZfSUQJMHhGNDEzCisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYSDMzM19ERVZfSUQJMHhGNDE0CisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYMTMzM19ERVZfSUQJMHhGNDE4CisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYMTMzNV9ERVZfSUQJMHhGNDE5CisjZGVmaW5lIE1WX0FMTEVZQ0FUM185OERYMTMzNl9ERVZfSUQJMHhGNDFBCisKKyNkZWZpbmUgTVZfTUFYX0RFVl9JRAkJCTB4RkZGRgogCiAvKiBBbGxleUNhdDMgIFJldmlzaW9ucyAqLwogI2RlZmluZSBNVl9BTExFWUNBVDNfQTBfSUQJCTB4MwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvY2VzYS9tdkNlc2EuYyBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL2Nlc2EvbXZDZXNhLmMKaW5kZXggYjM5YThjNS4uOTk3M2UwYyAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvY2VzYS9tdkNlc2EuYworKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9jZXNhL212Q2VzYS5jCkBAIC0xMDI2LDI2ICsxMDI2LDE0IEBACiAJCQkJcmV0dXJuIE1WX09VVF9PRl9DUFVfTUVNOwogCQkJfQogCQkJc3RhdHVzID0gbXZDZXNhRnJhZ1JlcVByb2Nlc3MoY2hhbiwgcFJlcSwgZnJhZyk7Ci0JCQlpZiAoc3RhdHVzID09IE1WX09LKSB7Ci0jaWYgZGVmaW5lZChNVl9DRVNBX0NIQUlOX01PREUpIHx8IGRlZmluZWQoTVZfQ0VTQV9JTlRfQ09BTEVTQ0lOR19TVVBQT1JUKSB8fCBcCi0JCQkJCQkJICAgICBkZWZpbmVkKENPTkZJR19PRikKLSNpZmRlZiBDT05GSUdfT0YKLQkJCQlpZiAoKG12X2Nlc2FfZmVhdHVyZSA9PSBJTlRfQ09BTEVTQ0lORykgfHwKLQkJCQkJCShtdl9jZXNhX2ZlYXR1cmUgPT0gQ0hBSU4pKSB7Ci0jZW5kaWYgLyogQ09ORklHX09GICovCi0JCQkJCWlmIChmcmFnKSB7Ci0JCQkJCQlwUmVxLT5kbWFbZnJhZyAtIDFdLnBEbWFMYXN0LT5waHlOZXh0RGVzY1B0ciA9Ci0JCQkJCQkgICAgTVZfMzJCSVRfTEUobXZDZXNhVmlydFRvUGh5cygmcFJlcS0+ZG1hRGVzY0J1ZiwKLQkJCQkJCQlwUmVxLT5kbWFbZnJhZ10ucERtYUZpcnN0KSk7Ci0JCQkJCQltdk9zQ2FjaGVGbHVzaChjZXNhT3NIYW5kbGUsIHBSZXEtPmRtYVtmcmFnIC0gMV0ucERtYUxhc3QsCi0JCQkJCQkgICAgc2l6ZW9mKE1WX0RNQV9ERVNDKSk7Ci0JCQkJCX0KLSNpZmRlZiBDT05GSUdfT0YKLQkJCQl9Ci0jZW5kaWYgLyogQ09ORklHX09GICovCi0jZW5kaWYgLyogTVZfQ0VTQV9DSEFJTl9NT0RFIHx8IE1WX0NFU0FfSU5UX0NPQUxFU0NJTkdfU1VQUE9SVCB8fCBDT05GSUdfT0YqLwotCQkJCWZyYWcrKzsKKwkJCWlmIChzdGF0dXMgPT0gTVZfT0sgJiYgZnJhZykgeworCQkJCXBSZXEtPmRtYVtmcmFnIC0gMV0ucERtYUxhc3QtPnBoeU5leHREZXNjUHRyID0KKwkJCQkJTVZfMzJCSVRfTEUobXZDZXNhVmlydFRvUGh5cygmcFJlcS0+ZG1hRGVzY0J1ZiwKKwkJCQkJCSAgICBwUmVxLT5kbWFbZnJhZ10ucERtYUZpcnN0KSk7CisJCQkJbXZPc0NhY2hlRmx1c2goY2VzYU9zSGFuZGxlLCBwUmVxLT5kbWFbZnJhZyAtIDFdLnBEbWFMYXN0LAorCQkJCQkgICAgICAgc2l6ZW9mKE1WX0RNQV9ERVNDKSk7CiAJCQl9CisJCQlmcmFnKys7CiAJCX0KIAkJcFJlcS0+ZnJhZ3MubnVtRnJhZyA9IGZyYWc7CiAKQEAgLTEyODIsMTIgKzEyNzAsOCBAQAogCQlNVl9VOCAqcE5ld0RpZ2VzdDsKIAkJaW50IGZyYWc7CiAKLSNpZiBkZWZpbmVkKE1WX0NFU0FfQ0hBSU5fTU9ERSkgfHwgZGVmaW5lZChNVl9DRVNBX0lOVF9DT0FMRVNDSU5HX1NVUFBPUlQpIHx8IFwKLQkJCQkJCQkgICAgIGRlZmluZWQoQ09ORklHX09GKQogCQlwUmVxLT5mcmFncy5uZXh0RnJhZyA9IDE7CiAJCXdoaWxlIChwUmVxLT5mcmFncy5uZXh0RnJhZyA8PSBwUmVxLT5mcmFncy5udW1GcmFnKSB7Ci0jZW5kaWYKLQogCQkJZnJhZyA9IChwUmVxLT5mcmFncy5uZXh0RnJhZyAtIDEpOwogCiAJCQkvKiBSZXN0b3JlIERNQSBkZXNjcmlwdG9yIGxpc3QgKi8KQEAgLTEzMjksMTkgKzEzMTMsOCBAQAogCQkJCX0KIAkJCQlyZWFkeVN0YXR1cyA9IE1WX09LOwogCQkJfQotI2lmIGRlZmluZWQoTVZfQ0VTQV9DSEFJTl9NT0RFKSB8fCBkZWZpbmVkKE1WX0NFU0FfSU5UX0NPQUxFU0NJTkdfU1VQUE9SVCkgfHwgXAotCQkJCQkJCSAgICAgZGVmaW5lZChDT05GSUdfT0YpCi0jaWZkZWYgQ09ORklHX09GCi0JCWlmICgobXZfY2VzYV9mZWF0dXJlID09IElOVF9DT0FMRVNDSU5HKSB8fAotCQkJCQkobXZfY2VzYV9mZWF0dXJlID09IENIQUlOKSkKIAkJCXBSZXEtPmZyYWdzLm5leHRGcmFnKys7Ci0JCWVsc2UKLQkJCWJyZWFrOwotI2Vsc2UgLyogQ09ORklHX09GICovCi0JCQlwUmVxLT5mcmFncy5uZXh0RnJhZysrOwotI2VuZGlmIC8qIENPTkZJR19PRiAqLwogCQl9Ci0jZW5kaWYgLyogTVZfQ0VTQV9DSEFJTl9NT0RFIHx8IE1WX0NFU0FfSU5UX0NPQUxFU0NJTkdfU1VQUE9SVCB8fCBDT05GSUdfT0YgKi8KIAl9IGVsc2UgewogCQltdkNlc2FNYnVmQ2FjaGVVbm1hcChwUmVxLT5wQ21kLT5wRHN0LCAwLCBwUmVxLT5wQ21kLT5wRHN0LT5tYnVmU2l6ZSk7CiAKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL25ldGEvZ2JlL212TmV0YS5oIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvbmV0YS9nYmUvbXZOZXRhLmgKaW5kZXggMTI1MTllNS4uNDQ5MjgxNCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvbmV0YS9nYmUvbXZOZXRhLmgKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvbmV0YS9nYmUvbXZOZXRhLmgKQEAgLTM0Niw2ICszNDYsOSBAQAogI2RlZmluZSBNVl9ORVRBX1FVRVVFX1BSRVZfREVTQyhwUXVldWVDdHJsLCBkZXNjSWR4KSAgXAogICAgICgoKGRlc2NJZHgpID4gMCkgPyAoKGRlc2NJZHgpIC0gMSkgOiAocFF1ZXVlQ3RybCktPmxhc3REZXNjKQogCisjZGVmaW5lIE1WX05FVEFfUlhfTEFTVF9ERVNDX1BUUihwUXVldWVDdHJsKSAgXAorCSgoKE5FVEFfUlhfREVTQyAqKXBRdWV1ZUN0cmwucEZpcnN0KSArIHBRdWV1ZUN0cmwubGFzdERlc2MpCisKIHR5cGVkZWYgc3RydWN0IHsKIAlNVl9ORVRBX1FVRVVFX0NUUkwgcXVldWVDdHJsOwogCkBAIC02MjIsNiArNjI1LDE5IEBACiAJcmV0dXJuIHBSeERlc2M7CiB9CiAKKy8qIEdldCB0aGUgbmV4dCBkZXNjIHBvaW50ZXIgZm9sbG93aW5nIGN1cnJlbnQgZGVzYyAqLworc3RhdGljIElOTElORSBORVRBX1JYX0RFU0MgKm12TmV0YVJ4cU5leHREZXNjUHRyKE1WX05FVEFfUlhRX0NUUkwgKnBSeHEsIE5FVEFfUlhfREVTQyAqcFJ4RGVzYykKK3sKKwlORVRBX1JYX0RFU0MgKnBOZXh0RGVzYzsKKworCWlmIChwUnhEZXNjID09IE1WX05FVEFfUlhfTEFTVF9ERVNDX1BUUihwUnhxLT5xdWV1ZUN0cmwpKQorCQlwTmV4dERlc2MgPSAoTkVUQV9SWF9ERVNDICopcFJ4cS0+cXVldWVDdHJsLnBGaXJzdDsKKwllbHNlCisJCXBOZXh0RGVzYyA9ICsrcFJ4RGVzYzsKKworCXJldHVybiBwTmV4dERlc2M7Cit9CisKIHN0YXRpYyBJTkxJTkUgTkVUQV9SWF9ERVNDICptdk5ldGFSeHFEZXNjR2V0KE1WX05FVEFfUlhRX0NUUkwgKnBSeHEpCiB7CiAJTkVUQV9SWF9ERVNDCSpwUnhEZXNjOwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvbmV0YS9nYmUvbXZOZXRhRGVidWcuYyBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL25ldGEvZ2JlL212TmV0YURlYnVnLmMKaW5kZXggMzY4ZTlhNS4uMzdmNWU2OSAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvbmV0YS9nYmUvbXZOZXRhRGVidWcuYworKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9uZXRhL2diZS9tdk5ldGFEZWJ1Zy5jCkBAIC00OTAsNyArNDkwLDcgQEAKIAkJCQkgICBpLCBwUnhEZXNjLCBwUnhEZXNjLT5zdGF0dXMsCiAJCQkJICAgcFJ4RGVzYy0+ZGF0YVNpemUsIChNVl9VMzIpIHBSeERlc2MtPmJ1ZlBoeXNBZGRyLCAoTVZfVTMyKSBwUnhEZXNjLT5idWZDb29raWUpOwogCi0JCQltdk9zQ2FjaGVMaW5lSW52KE5VTEwsIHBSeERlc2MpOworCQkJbXZPc0NhY2hlTGluZUludihwUG9ydEN0cmwtPm9zSGFuZGxlLCBwUnhEZXNjKTsKIAkJfQogCX0KIH0KQEAgLTU0MSw3ICs1NDEsNyBAQAogCQkJCSAgIGksIHBUeERlc2MsIHBUeERlc2MtPmNvbW1hbmQsIHBUeERlc2MtPmRhdGFTaXplLAogCQkJCSAgIChNVl9VMzIpIHBUeERlc2MtPmJ1ZlBoeXNBZGRyLCBwVHhEZXNjLT5od19jbWQpOwogCi0JCQltdk9zQ2FjaGVMaW5lSW52KE5VTEwsIHBUeERlc2MpOworCQkJbXZPc0NhY2hlTGluZUludihwUG9ydEN0cmwtPm9zSGFuZGxlLCBwVHhEZXNjKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL25ldGEvcG5jL212UG5jLmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9uZXRhL3BuYy9tdlBuYy5jCmluZGV4IDY0OGQ2ZTMuLjQ5M2VjNTAgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL25ldGEvcG5jL212UG5jLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvbmV0YS9wbmMvbXZQbmMuYwpAQCAtMTM4LDEwICsxMzgsNyBAQAogCQl8fCBjdHJsX21vZGVsID09IE1WODhGNjU2MF9ERVZfSUQpIHsKIAkJLyogQXJtYWRhIEtXMiBJRCAqLwogCQltZW1jcHkoJmdiZV9wbmNfbWFwLCAmZ2JlX3BuY19tYXBfa3cyLCBzaXplb2YoZ2JlX3BuY19tYXBfa3cyKSk7Ci0JfSBlbHNlIGlmIChjdHJsX21vZGVsID09IE1WODhGNjgxMF9ERVZfSUQKLQkJfHwgY3RybF9tb2RlbCA9PSBNVjg4RjY4MTFfREVWX0lECi0JCXx8IGN0cmxfbW9kZWwgPT0gTVY4OEY2ODIwX0RFVl9JRAotCQl8fCBjdHJsX21vZGVsID09IE1WODhGNjgyOF9ERVZfSUQpIHsKKwl9IGVsc2UgaWYgKChjdHJsX21vZGVsICYgfjB4RkYpID09IE1WXzg4RjY4WFgpIHsKIAkJLyogQXJtYWRhIEEzOHggSUQgKi8KIAkJbWVtY3B5KCZnYmVfcG5jX21hcCwgJmdiZV9wbmNfbWFwXzM4eCwgc2l6ZW9mKGdiZV9wbmNfbWFwXzM4eCkpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9xZC1kc2R0LTMuMy9zcmMvbXNhcGkvZ3RTeXNDb25maWcuYyBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL3FkLWRzZHQtMy4zL3NyYy9tc2FwaS9ndFN5c0NvbmZpZy5jCmluZGV4IGJmZjAyMGYuLjEwZDNjN2IgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL3FkLWRzZHQtMy4zL3NyYy9tc2FwaS9ndFN5c0NvbmZpZy5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL3FkLWRzZHQtMy4zL3NyYy9tc2FwaS9ndFN5c0NvbmZpZy5jCkBAIC03NjIsNiArNzYyLDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBHVF84OEU2MTcyOgogICAgICAgICAgICAgICAgIGRldi0+bnVtT2ZQb3J0cyA9IDc7CisJCWRldi0+bWF4UG9ydHMgPSA3OworCQlkZXYtPm1heFBoeU51bSA9IDU7CiAgICAgICAgICAgICAgICAgZGV2LT52YWxpZFBvcnRWZWMgPSAoMSA8PCBkZXYtPm51bU9mUG9ydHMpIC0gMTsKICAgICAgICAgICAgICAgICBkZXYtPnZhbGlkUGh5VmVjID0gMHgxRjsKICAgICAgICAgICAgICAgICBkZXYtPnZhbGlkU2VyZGVzVmVjID0gMHg4MDAwOwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvc2F0YS9zYXRhMy9tdlNhdGEzQWRkckRlYy5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvc2F0YS9zYXRhMy9tdlNhdGEzQWRkckRlYy5jCmluZGV4IGIzMGQyYmUwLi43Yjc2NzQ0IDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9zYXRhL3NhdGEzL212U2F0YTNBZGRyRGVjLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvc2F0YS9zYXRhMy9tdlNhdGEzQWRkckRlYy5jCkBAIC05Miw3ICs5Miw3IEBACiAjZGVmaW5lIE1WX1NBVEEzX1dJTl9CQVNFX09GRlNFVCAgICAgICAgICAgICAgNAogI2RlZmluZSBNVl9TQVRBM19XSU5fQkFTRV9NQVNLICAgICAgICAgICAgICAgICgweEZGRkZGRkY8PE1WX1NBVEEzX1dJTl9CQVNFX09GRlNFVCkKIAotI2RlZmluZSBNVl9TQVRBM19XSU5fU0laRV9BTElHTgkJICAgIF82NEsKKyNkZWZpbmUgTVZfU0FUQTNfV0lOX1NJWkVfQUxJR04JCSAgICBfMU0KIAogTVZfVEFSR0VUIHNhdGEzQWRkckRlY1ByaW9UYWJbXSA9IHsKICNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU0RSQU1fQ1MwKQpAQCAtMjEzLDE5ICsyMTMsMTQgQEAKIAkJcmV0dXJuIE1WX0VSUk9SOwogCX0KIAotCWJhc2VSZWcgPSBwQWRkckRlY1dpbi0+YWRkcldpbi5iYXNlTG93ICYgTVZfU0FUQTNfV0lOX0JBU0VfTUFTSzsKKwliYXNlUmVnID0gKHBBZGRyRGVjV2luLT5hZGRyV2luLmJhc2VMb3cgLyBNVl9TQVRBM19XSU5fU0laRV9BTElHTik7CisJYmFzZVJlZyA9IChiYXNlUmVnIDw8IE1WX1NBVEEzX1dJTl9CQVNFX09GRlNFVCkgJiBNVl9TQVRBM19XSU5fQkFTRV9NQVNLOwogCXNpemVSZWcgPSAocEFkZHJEZWNXaW4tPmFkZHJXaW4uc2l6ZSAvIE1WX1NBVEEzX1dJTl9TSVpFX0FMSUdOKSAtIDE7CiAJc2l6ZVJlZyA9IHNpemVSZWcgPDwgTVZfU0FUQTNfV0lOX1NJWkVfT0ZGU0VUOwogCiAJLyogc2V0IGF0dHJpYnV0ZXMgKi8KIAljdHJsUmVnID0gKHBBZGRyRGVjV2luLT5hdHRyaWIgPDwgTVZfU0FUQTNfV0lOX0FUVFJfT0ZGU0VUKTsKIAotI2lmZGVmIE1WODhGNjhYWAotCS8qIFRlbXAgV0EgZm9yIEEzOHg6IHNldCBhdHRyaWJ1dGUgd2l0aCBJT0NDIGJpdCBlbmFibGVkOgotCSAqIFdoZW4gdXNpbmcgRHVhbCBDUywgZGlzayBkZXRlY3Rpb24gZmFpbHMgd2l0aG91dCB1c2luZyBJT0NDIGJpdCBlbmFibGVkICovCi0JY3RybFJlZyB8PSBCSVQxMjsKLSNlbmRpZgotCiAJLyogc2V0IHRhcmdldCBJRCAqLwogCWN0cmxSZWcgJj0gfk1WX1NBVEEzX1dJTl9UQVJHRVRfTUFTSzsKIAljdHJsUmVnIHw9IChwQWRkckRlY1dpbi0+dGFyZ2V0SWQgPDwgTVZfU0FUQTNfV0lOX1RBUkdFVF9PRkZTRVQpOwpAQCAtMjc2LDcgKzI3MSw4IEBACiAJLyogRXh0cmFjdCBiYXNlIGFkZHJlc3MgYW5kIHNpemUgICAgKi8KIAlzaXplUmVnVmFsID0gKHNpemVSZWcgJiBNVl9TQVRBM19XSU5fU0laRV9NQVNLKSA+PiBNVl9TQVRBM19XSU5fU0laRV9PRkZTRVQ7CiAJcEFkZHJEZWNXaW4tPmFkZHJXaW4uc2l6ZSA9IChzaXplUmVnVmFsICsgMSkgKiBNVl9TQVRBM19XSU5fU0laRV9BTElHTjsKLQlwQWRkckRlY1dpbi0+YWRkcldpbi5iYXNlTG93ID0gYmFzZVJlZyAmIE1WX1NBVEEzX1dJTl9CQVNFX01BU0s7CisJcEFkZHJEZWNXaW4tPmFkZHJXaW4uYmFzZUxvdyA9IChiYXNlUmVnICYgTVZfU0FUQTNfV0lOX0JBU0VfTUFTSykgPj4gTVZfU0FUQTNfV0lOX1NJWkVfT0ZGU0VUOworCXBBZGRyRGVjV2luLT5hZGRyV2luLmJhc2VMb3cgKj0gTVZfU0FUQTNfV0lOX1NJWkVfQUxJR047CiAJcEFkZHJEZWNXaW4tPmFkZHJXaW4uYmFzZUhpZ2ggPSAwOwogCiAJLyogYXR0cmliIGFuZCB0YXJnZXRJZCAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL3NwaS9tdlNwaS5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvc3BpL212U3BpLmMKaW5kZXggNjJlMjM2NC4uOGEwZmJmMyAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvc3BpL212U3BpLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvc3BpL212U3BpLmMKQEAgLTQ3NSw2ICs0NzUsMjUgQEAKIAkJKHNwaUhhbERhdGEuY3RybE1vZGVsID09IE1WXzYzMjFfREVWX0lEKSkKIAkJCU1WX1NQSV9SRUdfQklUX1NFVChNVl9TUElfSUZfQ09ORklHX1JFRyhzcGlJZCksIEJJVDE0KTsKIAorCS8qIHNldCByZWxheGVkIFNQSV9UTUlTT19TQU1QTEUgc2V0dGluZ3MsIGluIDEgb2YgdGhlIGZvbGxvd2luZzoKKwkgKiAxLiBBcm1hZGEgMzh4LzM5eDogRVJSQVRBIEZFLTkxNDQ1NzI6IFRjbG9jayBAIDI1ME1IeiAmIFNQSSBjbG9jayBAIDUwTUh6ICYgY2xrUGhhc2U9Y2xvY2tQb2xMb3c9MQorCSAqIDIuIEFsbGV5LUNhdDM6IGFsd2F5cywgdG8gYXZvaWQgdGltaW5nIHZpb2xhdGlvbiB3aXRoIFNDTEsgPSA0MC81ME1oeiovCisjaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkgfHwgZGVmaW5lZChDT05GSUdfQUxMRVlDQVQzKQorCQlNVl9VMzIgdGltaW5nUmVnOworI2lmbmRlZiBDT05GSUdfQUxMRVlDQVQzCisJCWlmIChzcGlIYWxEYXRhLnRjbGsgPT0gTVZfQk9BUkRfVENMS18yNTBNSFogJiYgc2VyaWFsQmF1ZFJhdGUgPT0gXzUwTUh6CisJCQkmJiBzcGlUeXBlc1tTUElfVFlQRV9GTEFTSF0uY2xvY2tQb2xMb3cgPT0gMQorCQkJJiYgc3BpVHlwZXNbU1BJX1RZUEVfRkxBU0hdLmNsa1BoYXNlID09IDEpCisjZW5kaWYgLyogaWZuZGVmIENPTkZJR19BTExFWUNBVDMgKi8KKwkJCXsKKwkJLyogc2V0IFRNSVNPX1NBTVBMRSB0byAweDI6IE1JU08gc2FtcGxlIG9jY3VycyAyIGNvcmVfY2xrIGFmdGVyIFNQSV9DTEsgZWRnZSAqLworCQkJdGltaW5nUmVnID0gTVZfUkVHX1JFQUQoTVZfU1BJX1RNTkdfUEFSQU1TX1JFRyhzcGlJZCkpOworCQkJdGltaW5nUmVnICY9IH5NVl9TUElfVE1JU09fU0FNUExFX01BU0s7CisJCQl0aW1pbmdSZWcgfD0gKDB4MikgPDwgTVZfU1BJX1RNSVNPX1NBTVBMRV9PRkZTRVQ7CisJCQlNVl9SRUdfV1JJVEUoTVZfU1BJX1RNTkdfUEFSQU1TX1JFRyhzcGlJZCksIHRpbWluZ1JlZyk7CisJCQl9CisjZW5kaWYgLyogQ09ORklHX0FSTUFEQV8zOFggfHwgQ09ORklHX0FSTUFEQV8zOVggfHwgQ09ORklHX0FMTEVZQ0FUMyAqLworCiAgICAgLyogVmVyaWZ5IHRoYXQgdGhlIENTIGlzIGRlYXNzZXJ0ZWQgKi8KICAgICBtdlNwaUNzRGVhc3NlcnQoc3BpSWQpOwogCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC90d3NpL212VHdzaS5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvdHdzaS9tdlR3c2kuYwppbmRleCA2YmU2OTA2Li42MjkyMGQ1IDEwMDc1NQotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC90d3NpL212VHdzaS5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL3R3c2kvbXZUd3NpLmMKQEAgLTM1NCw3ICszNTQsNyBAQAogCU1WX1UzMiBhY3R1YWxGcmVxID0gMCwgYWN0dWFsTiA9IDAsIGFjdHVhbE0gPSAwLCB2YWw7CiAKIAlpZiAoZnJlcXVhbmN5ID4gMTAwMDAwKQotCQltdk9zUHJpbnRmKCJXYXJuaW5nIFRXU0kgZnJlcXVhbmN5IGlzIHRvbyBoaWdoLCBwbGVhc2UgdXNlIHVwIHRvIDEwMEtoei5cbiIpOworCQltdk9zUHJpbnRmKCJXYXJuaW5nIFRXU0kgZnJlcXVlbmN5IGlzIHRvbyBoaWdoLCBwbGVhc2UgdXNlIHVwIHRvIDEwMEtoei5cbiIpOwogCiAJREIobXZPc1ByaW50ZigiVFdTSTogbXZUd3NpSW5pdCAtIFRjbGsgPSAlZCBmcmVxID0gJWRcbiIsIFRjbGssIGZyZXF1YW5jeSkpOwogCS8qIENhbHVjYWx0ZSBOIGFuZCBNIGZvciB0aGUgVFdTSSBjbG9jayBiYXVkIHJhdGUgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsX2lmL212U3lzVXNiLmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbF9pZi9tdlN5c1VzYi5jCmluZGV4IDEzNTJiMGMuLjVkZDkyNTMgMTAwNzU1Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsX2lmL212U3lzVXNiLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWxfaWYvbXZTeXNVc2IuYwpAQCAtNjgsNyArNjgsOCBAQAogI2luY2x1ZGUgInVzYi9tdlVzYi5oIgogI2luY2x1ZGUgImN0cmxFbnYvbXZDdHJsRW52QWRkckRlYy5oIgogI2luY2x1ZGUgInVzYi9tdlVzYlJlZ3MuaCIKLQorI2luY2x1ZGUgImJvYXJkRW52L212Qm9hcmRFbnZMaWIuaCIKKyNpbmNsdWRlICJjdHJsRW52L212Q3RybEVudlNwZWMuaCIKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12U3lzVXNiSGFsSW5pdCAtIEluaXRpYWxpemUgdGhlIFVTQiBzdWJzeXN0ZW0KICoKQEAgLTg4LDcgKzg5LDYgQEAKIAlNVl9TVEFUVVMgc3RhdHVzID0gTVZfT0s7CiAJTVZfVTMyIGRldjsKIAlNVl9VTklUX1dJTl9JTkZPIGFkZHJXaW5NYXBbTUFYX1RBUkdFVFMgKyAxXTsKLQogCWhhbERhdGEuY3RybE1vZGVsID0gbXZDdHJsTW9kZWxHZXQoKTsKIAloYWxEYXRhLmN0cmxSZXYgPSBtdkN0cmxSZXZHZXQoKTsKIAloYWxEYXRhLmN0cmxGYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldChoYWxEYXRhLmN0cmxNb2RlbCk7CkBAIC0xMDQsNyArMTA0LDkgQEAKIAkJIE1BQyBJRDAgKHVzYkFjdGl2ZSA9MCkgaXMgY29ubmVjdGVkIHRvIFBoeXNpY2FsIE1BQyBJRDEgKi8KIAkJaW50IGlkLCBtYWNfaWRbMl0gPSB7MSwgMH07CiAKLQkJZm9yIChpZCA9IDA7IGlkIDwgbXZDdHJsVXNiTWF4R2V0KCk7IGlkKyspIHsKKwkJIGZvciAoaWQgPSAwOyBpZCA8IG1heFVzYlBvcnRzIDsgaWQrKykgeworCQkJaWYgKG12Qm9hcmRJc1VzYlBvcnRDb25uZWN0ZWQoVVNCX1VOSVRfSUQsaWQpID09IE1WX0ZBTFNFKQorCQkJCWNvbnRpbnVlOwogCQkJaWYgKG1heFVzYlBvcnRzID09IDEgJiYgKGhhbERhdGEuY3RybEZhbWlseSA9PSBNVl84OEY2N1gwIHx8CiAJCQkJCShoYWxEYXRhLmN0cmxSZXYgPT0gTVZfODhGNjZYWF9BMF9JRCAmJiBoYWxEYXRhLmN0cmxGYW1pbHkgPT0gTVZfODhGNjZYMCkpKQogCQkJCWRldiA9IG1hY19pZFtpZF07CkBAIC0xMzYsNyArMTM4LDkgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19VU0JfWEhDSQogCQlNVl9VMzIgcmVnOwotCQlmb3IgKGRldiA9IDA7IGRldiA8IG12Q3RybFVzYjNIb3N0TWF4R2V0KCkgOyBkZXYrKykgeworCQlmb3IgKGRldiA9IDA7IGRldiA8IG12Q3RybFVzYjNIb3N0TWF4R2V0KCk7IGRldisrKSB7CisJCQlpZiAobXZCb2FyZElzVXNiUG9ydENvbm5lY3RlZChVU0IzX1VOSVRfSUQsZGV2KSA9PSBNVl9GQUxTRSkKKwkJCQljb250aW51ZTsKIAkJCXN0YXR1cyA9IG12VXNiVXRtaVBoeUluaXQoZGV2LCAmaGFsRGF0YSk7CiAJCQlpZiAoaGFsRGF0YS5jdHJsRmFtaWx5ID09IE1WXzg4RjY2WDAgfHwgaGFsRGF0YS5jdHJsRmFtaWx5ID09IE1WXzg4RjY3WDApIHsKIAkJCQkvKiBBTFAvQTM3NTogU2V0IFVUTUkgUEhZIFNlbGVjdG9yOgpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvY21kX3Nhci5jIGIvYm9hcmQvbXZfZWJ1L21zeXMvY21kX3Nhci5jCmluZGV4IGRmNjI1OTIuLjMwZDY1NzIgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9tc3lzL2NtZF9zYXIuYworKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9jbWRfc2FyLmMKQEAgLTI0LDggKzI0LDEzIEBACiAjaW5jbHVkZSAiY3RybEVudi9tdkN0cmxFbnZMaWIuaCIKICNpbmNsdWRlICJib2FyZEVudi9tdkJvYXJkRW52TGliLmgiCiAKLWV4dGVybiBNVl9CT0FSRF9JTkZPICptYXJ2ZWxsQUMzQm9hcmRJbmZvVGJsW107Ci0KKyNpZiBkZWZpbmVkIENPTkZJR19BTExFWUNBVDMKKwlleHRlcm4gTVZfQk9BUkRfSU5GTyAqbWFydmVsbEFDM0JvYXJkSW5mb1RibFtdOworCU1WX0JPQVJEX0lORk8gKiptdk1zeXNCb2FyZEluZm9UYmwgPSBtYXJ2ZWxsQUMzQm9hcmRJbmZvVGJsOworI2Vsc2UKKwlleHRlcm4gTVZfQk9BUkRfSU5GTyAqbWFydmVsbEJDMkJvYXJkSW5mb1RibFtdOworCU1WX0JPQVJEX0lORk8gKiptdk1zeXNCb2FyZEluZm9UYmwgPSBtYXJ2ZWxsQkMyQm9hcmRJbmZvVGJsOworI2VuZGlmCiAvKgogICAgYmMyIHNhbXBsZSBhbmQgcmVzZXQgcmVnaXN0ZXIKICMgICAgIDRmICAgICAgICMgICAgIDRlICAgICAgICMgICAgIDRkICAgICAgICMgICAgICA0YyAgICAgICMKQEAgLTUzLDkgKzU4LDkgQEAKIAlDTURfQVZTX01PREUsCiAJQ01EX1NMQVZFX0FERFIsCiAJQ01EX0RFVklDRV9OVU0sCi0JQ01EX0JPQVJEX0lELAogCUNNRF9ERFJfRUNDX0VOLAogI2VuZGlmCisJQ01EX0JPQVJEX0lELAogCUNNRF9QQ0lFX01PREUsCiAJQ01EX0JPT1RTUkMsCiAJQ01EX0RFVklDRV9JRCwKQEAgLTc0LDcgKzc5LDggQEAKIAkJCQkJCSAgIDAsCS8qIE9PQjAgY29ubmVjdGlvbiAqLwogCQkJCQkJICAgMCwJLyogT09CMSBjb25uZWN0aW9uICovCiAJCQkJCQkgICAwLAkvKiBGb3JjZSBBTUMgUkMgR0VOMSBQQ0llICovCi0JCQkJCQkgICAxLAkvKiBQQ0llIG1vZGUgKi8KKwkJCQkJCSAgIDAsCS8qIEJvYXJkIElEICovCisJCQkJCQkgICAwLAkvKiBQQ0llIG1vZGUgKi8KIAkJCQkJCSAgIDMsCS8qIEJvb3Qgc291cmNlICovCiAJCQkJCQkgICAwIH07CS8qIERldmljZSBJRCAqLwogCU1WX1UzMiBjb3JlQ2xvY2tUYmxbXSA9IE1WX0NPUkVfQ0xLX1RCTF9CQzI7CkBAIC04Nyw4ICs5Myw4IEBACiAJCQkJCQkgICAxLAkvKiBBVlMgTW9kZSAqLwogCQkJCQkJICAgMSwJLyogSTJDL1NNSSBTbGF2ZSBhZGRyZXNzICovCiAJCQkJCQkgICAwLAkvKiBEZXZpY2UgbnVtYmVyICovCi0JCQkJCQkgICAwLAkvKiBCb2FyZCBJRCAqLwogCQkJCQkJICAgMCwJLyogRERSIEVDQyBlbmFibGUgKi8KKwkJCQkJCSAgIDAsCS8qIEJvYXJkIElEICovCiAJCQkJCQkgICAwLAkvKiBQQ0llIG1vZGUgKi8KIAkJCQkJCSAgIDMsCS8qIEJvb3Qgc291cmNlICovCiAJCQkJCQkgICAwIH07CS8qIERldmljZSBJRCAqLwpAQCAtMTU2LDExICsxNjIsMTEgQEAKIAkJcmV0dXJuIENNRF9TTEFWRV9BRERSOwogCWlmIChzdHJjbXAoY21kLCAiZGV2aWNlbnVtIikgPT0gMCkKIAkJcmV0dXJuIENNRF9ERVZJQ0VfTlVNOwotCWlmIChzdHJjbXAoY21kLCAiYm9hcmRpZCIpID09IDApCi0JCXJldHVybiBDTURfQk9BUkRfSUQ7CiAJaWYgKHN0cmNtcChjbWQsICJkZHJlY2NlbmFibGUiKSA9PSAwKQogCQlyZXR1cm4gQ01EX0REUl9FQ0NfRU47CiAjZW5kaWYKKwlpZiAoc3RyY21wKGNtZCwgImJvYXJkaWQiKSA9PSAwKQorCQlyZXR1cm4gQ01EX0JPQVJEX0lEOwogCWlmIChzdHJjbXAoY21kLCAicGNpbW9kZSIpID09IDApCiAJCXJldHVybiBDTURfUENJRV9NT0RFOwogCWlmIChzdHJjbXAoY21kLCAiYm9vdHNyYyIpID09IDApCkBAIC0zMDEsMTggKzMwNywxOCBAQAogCQlwcmludGYoIlx0fCAgMSAgfCAgICAgICAgICAxICAgICAgICAgIHxcbiIpOwogCQlwcmludGYoIlx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCQlicmVhazsKLQljYXNlIENNRF9CT0FSRF9JRDoKLQkJcHJpbnRmKCJEZXRlcm1pbmVzIHRoZSBib2FyZCBJRCAoMC03KVxuIik7Ci0JCXByaW50ZigiXHR8IElEICB8ICAgICAgQm9hcmQgICAgICAgICAgICAgICB8XG4iKTsKLQkJcHJpbnRmKCJcdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgQUMzX01BUlZFTExfQk9BUkRfTlVNIDsgaSsrKQotCQkJcHJpbnRmKCJcdHwgICVkICB8ICAlLTIycyAgfFxuIiwgaSwgbWFydmVsbEFDM0JvYXJkSW5mb1RibFtpXS0+Ym9hcmROYW1lICk7Ci0JCXByaW50ZigiXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQkJYnJlYWs7CiAJY2FzZSBDTURfREVWSUNFX05VTToKIAkJcHJpbnRmKCJEZXRlcm1pbmVzIHRoZSBkZXZpY2UgbnVtYmVyICgwLTMpXG4iKTsKIAkJYnJlYWs7CiAjZW5kaWYKKwljYXNlIENNRF9CT0FSRF9JRDoKKwkJcHJpbnRmKCJEZXRlcm1pbmVzIHRoZSBib2FyZCBJRCAoMC03KVxuIik7CisJCXByaW50ZigiXHR8IElEICB8ICAgICAgQm9hcmQgICAgICAgICAgICAgICB8XG4iKTsKKwkJcHJpbnRmKCJcdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgTVZfTUFSVkVMTF9CT0FSRF9OVU0gOyBpKyspCisJCQlwcmludGYoIlx0fCAgJWQgIHwgICUtMjJzICB8XG4iLCBpLCBtdk1zeXNCb2FyZEluZm9UYmxbaV0tPmJvYXJkTmFtZSApOworCQlwcmludGYoIlx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCWJyZWFrOwogCWNhc2UgQ01EX1BDSUVfTU9ERToKIAkJcHJpbnRmKCJEZXRlcm1pbmVzIHRoZSBQQ0ktRSBtb2RlOlxuIik7CiAJCXByaW50ZigiXHR8IElEICB8ICAgICAgIE1vZGUgICAgIHxcbiIpOwpAQCAtNDU5LDE0ICs0NjUsMTQgQEAKIAkJCXByaW50ZigiZGV2aWNlbnVtIEVycm9yOiBmYWlsZWQgcmVhZGluZyBkZXZpY2VudW1cbiIpOwogCQlicmVhazsKIAorI2VuZGlmCiAJY2FzZSBDTURfQk9BUkRfSUQ6CiAJCWlmIChtdkJvYXJkU2FyQm9hcmRJZEdldCgmdG1wKSA9PSBNVl9PSykKLQkJCXByaW50ZigiYm9hcmRpZFx0XHRcdD0gJWQgPT0+ICAlc1xuIiwgdG1wLCBtYXJ2ZWxsQUMzQm9hcmRJbmZvVGJsW3RtcF0tPmJvYXJkTmFtZSk7CisJCQlwcmludGYoImJvYXJkaWRcdFx0XHQ9ICVkID09PiAgJXNcbiIsIHRtcCwgbXZNc3lzQm9hcmRJbmZvVGJsW3RtcF0tPmJvYXJkTmFtZSk7CiAJCWVsc2UKIAkJCXByaW50ZigiYm9hcmRpZCBFcnJvcjogZmFpbGVkIHJlYWRpbmcgYm9hcmRpZFxuIik7CiAJCWJyZWFrOwogCi0jZW5kaWYKIAljYXNlIENNRF9QQ0lFX01PREU6CiAJCWlmIChtdkJvYXJkUGNpZU1vZGVHZXQoJnRtcCkgPT0gTVZfT0spCiAJCQlwcmludGYoInBjaW1vZGUgXHRcdD0gJWQgPT0+ICAlc1xuIiwgdG1wLCAoKHRtcCA9PSAwKSA/ICJFbmRwb2ludCIgOiAiUm9vdCBDb21wbGV4IikpOwpAQCAtNTY1LDEzICs1NzEsMTMgQEAKIAljYXNlIENNRF9TTEFWRV9BRERSOgogCQlyYyA9IG12Qm9hcmRTbWlJMmMyQWRkclNldCh0bXApOwogCQlicmVhazsKLQljYXNlIENNRF9CT0FSRF9JRDoKLQkJcmMgPSBtdkJvYXJkU2FyQm9hcmRJZFNldCh0bXApOwotCQlicmVhazsKIAljYXNlIENNRF9ERVZJQ0VfTlVNOgogCQlyYyA9IG12Qm9hcmREZXZpY2VOdW1TZXQodG1wKTsKIAkJYnJlYWs7CiAjZW5kaWYKKwljYXNlIENNRF9CT0FSRF9JRDoKKwkJcmMgPSBtdkJvYXJkU2FyQm9hcmRJZFNldCh0bXApOworCQlicmVhazsKIAljYXNlIENNRF9QQ0lFX01PREU6CiAJCXJjID0gbXZCb2FyZFBjaWVNb2RlU2V0KHRtcCk7CiAJCWJyZWFrOwpAQCAtNTgzLDE1ICs1ODksMTMgQEAKIAkJYnJlYWs7CiAJY2FzZSBDTURfREVGQVVMVDoKIAkJZm9yIChpID0gMCA7IGkgPCBDTURfRFVNUDsgaSsrKSB7Ci0jaWYgZGVmaW5lZCBDT05GSUdfQUxMRVlDQVQzCiAJCQlpZiAoaSA9PSBDTURfQk9BUkRfSUQpIHsKIAkJCQlNVl9VMzIgYnJkSWQgPSBtdkJvYXJkSWRHZXQoKTsKLQkJCQlpZiAoKGJyZElkIDwgQUMzX01BUlZFTExfQk9BUkRfSURfQkFTRSkgfHwgKGJyZElkID49IEFDM19NQVJWRUxMX01BWF9CT0FSRF9JRCkpCisJCQkJaWYgKChicmRJZCA8IE1BUlZFTExfQk9BUkRfSURfQkFTRSkgfHwgKGJyZElkID49IE1WX01BWF9NQVJWRUxMX0JPQVJEX0lEKSkKIAkJCQkJbXZPc1ByaW50ZigiQmFkIEJvYXJkIElEIHJldHVybmVkIC0gJWQhIEFzc2lnbmluZyBkZWZhdWx0IHZhbHVlIVxuIiwgYnJkSWQpOwogCQkJCWVsc2UKLQkJCQkJZGVmYXVsdFZhbHVlW2ldID0gYnJkSWQgLSBBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFOyAvKiBVcGRhdGUgZGVmYXVsdCB2YWx1ZSB3aXRoIHJlYWwgYm9hcmQgSUQqLworCQkJCQlkZWZhdWx0VmFsdWVbaV0gPSBicmRJZCAtIE1BUlZFTExfQk9BUkRfSURfQkFTRTsgLyogVXBkYXRlIGRlZmF1bHQgdmFsdWUgd2l0aCByZWFsIGJvYXJkIElEKi8KIAkJCX0KLSNlbmRpZiAvKiBDT05GSUdfQUxMRVlDQVQzICovCiAJCQlpZiAoMSA9PSBkb19zYXJfd3JpdGUoaSwgZGVmYXVsdFZhbHVlW2ldKSkKIAkJCQlyYyA9IE1WX0ZBTFNFOwogCQkJZG9fc2FyX3JlYWQoaSk7CkBAIC02MjMsMTIgKzYyNywxMCBAQAogCWNtZCA9IGFyZ3ZbMV07CiAJbW9kZSA9IHNhcl9jbWRfZ2V0KGFyZ3ZbMl0pOwogCi0jaWYgZGVmaW5lZCBDT05GSUdfQUxMRVlDQVQzCi0JaWYobXZCb2FyZElkR2V0KCkgIT0gREJfQUMzX0lEICYmIG1vZGUgIT0gQ01EX0JPQVJEX0lEKSB7CisJaWYobXZCb2FyZElkR2V0KCkgIT0gTVZfREVGQVVMVF9CT0FSRF9JRCAmJiBtb2RlICE9IENNRF9CT0FSRF9JRCkgewogCQltdk9zUHJpbnRmKCJFcnJvcjogU2FtcGxlIGF0IHJlc2V0IHN1cHBvcnRzIG1vZGlmeWluZyBvbmx5ICdib2FyZGlkJyBmaWVsZCBmb3IgY3VycmVudCBib2FyZFxuXG4iKTsKIAkJZ290byB1c2FnZTsKIAl9Ci0jZW5kaWYKIAogCWlmIChzdHJjbXAoY21kLCAibGlzdCIpID09IDApCiAJCXJldHVybiBkb19zYXJfbGlzdChtb2RlKTsKQEAgLTY3NCwxMyArNjc2LDEzIEBACiAjZW5kaWYKICJib290c3JjICAgICAgICAgICAgICAgICAgICAtIEJvb3Qgc291cmNlXG4iCiAiZGV2aWNlaWQgICAgICAgICAgICAgICAgICAgLSBEZXZpY2UgSURcbiIKLSNpZmRlZiBDT05GSUdfQUxMRVlDQVQzCi0iXHQtLS0tTGVnYWN5IGZpbGVkcy0tLS1cbiIKLSJwbGxjbG9jayAgICAgICAgICAgICAgICAgICAtIFBMTDIgVkNPIGNsb2NrIGZyZXF1ZW5jeS4gVmFsaWQgZm9yIHJldi5BMCBvbmx5XG4iCiAiXG5cdFNXIFNhdFIgZmllbGRzXG4iCiAiXHQtLS0tLS0tLS0tLS0tLVxuIgotImRkcmVjY2VuYWJsZSAgICAgICAgICAgICAgIC0gRERSIEVDQyBtb2Rlc1xuIgogImJvYXJkaWQgICAgICAgICAgICAgICAgICAgIC0gQm9hcmQgSURcbiIKKyNpZmRlZiBDT05GSUdfQUxMRVlDQVQzCisiZGRyZWNjZW5hYmxlICAgICAgICAgICAgICAgLSBERFIgRUNDIG1vZGVzXG4iCisiXHQtLS0tTGVnYWN5IGZpbGVkcy0tLS1cbiIKKyJwbGxjbG9jayAgICAgICAgICAgICAgICAgICAtIFBMTDIgVkNPIGNsb2NrIGZyZXF1ZW5jeS4gVmFsaWQgZm9yIHJldi5BMCBvbmx5XG4iCiAjZW5kaWYKICk7CiAjZW5kaWYgLypkZWZpbmVkKENPTkZJR19DTURfU0FSKSovCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmMgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmMKaW5kZXggMzMyNzQ5Yy4uNTMwMWFmZiAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5jCisrKyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuYwpAQCAtOTQsMTIgKzk0LDM5IEBACiBleHRlcm4gTVZfQk9BUkRfSU5GTyAqY3VzdG9tZXJCQzJCb2FyZEluZm9UYmxbXTsKIGV4dGVybiBNVl9CT0FSRF9JTkZPICptYXJ2ZWxsQUMzQm9hcmRJbmZvVGJsW107CiBleHRlcm4gTVZfQk9BUkRfSU5GTyAqY3VzdG9tZXJBQzNCb2FyZEluZm9UYmxbXTsKK2V4dGVybiBNVl9CT0FSRF9JTkZPICptYXJ2ZWxsQk9CS0JvYXJkSW5mb1RibFtdOworZXh0ZXJuIE1WX0JPQVJEX0lORk8gKmN1c3RvbWVyQk9CS0JvYXJkSW5mb1RibFtdOwogLyogR2xvYmFsIHZhcmlhYmxlcyBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIEJTUyAoc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUpCiAgICBmb3IgYXZvaWRpbmcgbWVtb3J5IGNvcnJ1cHRpb24gZHVyaW5nIGVhcmx5IGFjY2VzcyB1cG9uIGNvZGUgcmVsb2NhdGlvbiAqLwogc3RhdGljIE1WX0JPQVJEX0lORk8gKmJvYXJkID0gKE1WX0JPQVJEX0lORk8gKiktMTsKIAogLyogTG9jYWxzICovCiBzdGF0aWMgTVZfREVWX0NTX0lORk8gKm12Qm9hcmRHZXREZXZFbnRyeShNVl8zMiBkZXZOdW0sIE1WX0JPQVJEX0RFVl9DTEFTUyBkZXZDbGFzcyk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkaXNVc2JQb3J0Q29ubmVjdGVkCisqCisqIERFU0NSSVBUSU9OOgorKglyZXR1cm4gVHJ1ZSBpZiByZXF1ZXN0ZWQgVVNCIHR5cGUgYW5kIHBvcnQgbnVtIGV4aXN0cyBvbiBjdXJyZW50IGJvYXJkCisqCisqIElOUFVUOgorKgl1c2JUeXBlSUQgICAgICAgLSByZXF1ZXN0ZWQgVVNCIHR5cGUgOiBVU0IzX1VOSVRfSUQgLyBVU0JfVU5JVF9JRAorKgl1c2JQb3J0TnVtYmRlciAgLSByZXF1ZXN0ZWQgVVNCIHBvcnQgbnVtYmVyIChhY2NvcmRpbmcgdG8geEhDSSBNQUMgcG9ydCBudW0pCisqCisqIE9VVFBVVDogTm9uZQorKgorKiBSRVRVUk46IE1WX1RSVUUgaWYgcmVxdWVzdGVkIHBvcnQvdHlwZSBleGlzdCBvbiBib2FyZAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBtdkJvYXJkSXNVc2JQb3J0Q29ubmVjdGVkKE1WX1VOSVRfSUQgdXNiVHlwZUlELCBNVl9VOCB1c2JQb3J0TnVtYmVyKQoreworCS8qQm9iQ2F0MiBTb0MgaGF2ZSBubyB1c2IgcG9ydAorCUFsbGV5Q2F0MyAmIEJvYksgU29DIGJvYXJkIGhhcyBvbmx5IG9uZSB1c2IyIHBvcnQgKi8KKyNpZmRlZiBNVl9VU0IKKwlpZiAodXNiVHlwZUlEID09IFVTQl9VTklUX0lEICYmIHVzYlBvcnROdW1iZXIgPT0gMCkKKwkJcmV0dXJuIE1WX1RSVUU7CisjZW5kaWYKKwlyZXR1cm4gTVZfRkFMU0U7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12Qm9hcmRJZEluZGV4R2V0CkBAIC0xNzYsNiArMjAzLDEyIEBACiAJbXZHcHBUeXBlU2V0KDAsIDB4RkZGRkZGRkYsIGJvYXJkLT5ncHBPdXRFblZhbExvdyk7CiAJbXZHcHBUeXBlU2V0KDEsIDB4RkZGRkZGRkYsIGJvYXJkLT5ncHBPdXRFblZhbE1pZCk7CiAKKwlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfNzg0NjBfREVWX0lEKSB7CisJCU1WX1JFR19XUklURShHUFBfREFUQV9PVVRfUkVHKDIpLCBib2FyZC0+Z3BwT3V0VmFsSGlnaCk7CisJCW12R3BwUG9sYXJpdHlTZXQoMiwgMHhGRkZGRkZGRiwgYm9hcmQtPmdwcFBvbGFyaXR5VmFsSGlnaCk7CisJCW12R3BwVHlwZVNldCgyLCAweEZGRkZGRkZGLCBib2FyZC0+Z3BwT3V0RW5WYWxIaWdoKTsKKwl9CisKICNpZm5kZWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQKIAltdkJvYXJkT29iUG9ydENmZ1NldCgpOwogI2VuZGlmCkBAIC0yNzUsMTAgKzMwOCw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfQk9PTCBtdkJvYXJkSXNFdGhDb25uZWN0ZWQoTVZfVTMyIGV0aE51bSkKIHsKLQlpZiAoZXRoTnVtIDw9IG12Q3RybEV0aE1heFBvcnRHZXQoKSkKLQkJcmV0dXJuIE1WX1RSVUU7Ci0KLQlyZXR1cm4gTVZfRkFMU0U7CisJcmV0dXJuIG12Qm9hcmRJc0diRVBvcnRDb25uZWN0ZWQoZXRoTnVtKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMyNCw2ICszNTQsMTAgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9CT09MIG12Qm9hcmRJc1BvcnRJblNnbWlpKE1WX1UzMiBldGhQb3J0TnVtKQogeworCU1WX1UzMiBib2FyZElkID0gbXZCb2FyZElkR2V0KCk7CisKKwlpZiAoYm9hcmRJZCA9PSBEQl83OFg2MF9BTUNfSUQgJiYgZXRoUG9ydE51bSA9PSAwKQorCQlyZXR1cm4gTVZfRkFMU0U7CiAJcmV0dXJuIE1WX1RSVUU7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzUwLDYgKzM4NCwzMCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkUG9ydFR5cGVHZXQKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHBvcnQgdHlwZQorKgorKiBJTlBVVDoKKyogICAgICAgZXRoUG9ydE51bSAtIEV0aGVybmV0IHBvcnQgbnVtYmVyLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOOgorKiAgICAgICBNb2RlIG9mIHRoZSBwb3J0CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVTMyIG12Qm9hcmRQb3J0VHlwZUdldChNVl9VMzIgZXRoUG9ydE51bSkKK3sKKwlpZiAobXZCb2FyZElzUG9ydEluU2dtaWkoZXRoUG9ydE51bSkpCisJCXJldHVybiBNVl9QT1JUX1RZUEVfU0dNSUk7CisJZWxzZQorCQlyZXR1cm4gTVZfUE9SVF9UWVBFX1JHTUlJOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkSXNQb3J0SW5NaWkKICoKICogREVTQ1JJUFRJT046CkBAIC00MTgsNiArNDc2LDggQEAKIAogTVZfQk9PTCBtdkJvYXJkSXNQb3J0SW5SZ21paShNVl9VMzIgZXRoUG9ydE51bSkKIHsKKwlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfNzg0NjBfREVWX0lEKQorCQlyZXR1cm4gIW12Qm9hcmRJc1BvcnRJbkdtaWkoZXRoUG9ydE51bSk7CiAJcmV0dXJuICFtdkJvYXJkSXNQb3J0SW5HbWlpKGV0aFBvcnROdW0pICYmICFtdkJvYXJkSXNQb3J0SW5TZ21paShldGhQb3J0TnVtKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00ODksNyArNTQ5LDYzIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfVTMyIG12Qm9hcmRUY2xrR2V0KE1WX1ZPSUQpCiB7Ci0JcmV0dXJuIDIwMDAwMDAwMDsgLyogY29uc3RhbnQgVGNsb2NrIEAgMjAwTUh6IChub3QgU2FtcGxlZEBSZXNldCkgICovCisJLyogVS1Cb290IGZsb3cgZm9yIE1TWVMgY2FuIG5vdCByZWFkIEZhbWlseUlkR2V0IHRvIGRlcnJpdmUgVGNsaywKKwlzaW5jZSBGYW1pbHlJZEdldCBuZWVkcyBCb2FyZCBJRCwgdmlhIFRXU0kgdHJhc2FjdGlvbiwgd2hpY2ggZGVwZW5kcyBvbiBUY2xrIHJlYWRpbmcuCisJTVNZUyBwbGF0Zm9ybXMgdXNlIHN0YXRpYyBUY2xrPTIwME1IeiAobm90IFNhbXBsZWRAUmVzZXQpKi8KKyNpZmRlZiBNVl9NU1lTIC8qIE1WX01TWVMgaXMgZGVmaW5lZCBvbmx5IGluIFUtYm9vdCBmb3IgTVNZUyBwbGF0Zm9ybXM6IEFDMy9CQzIvQm9iSyAqLworCXJldHVybiBNVl9CT0FSRF9UQ0xLXzIwME1IWjsKKyNlbHNlCisKKwkvKiBmb3IgTGludXggZmxvdywgRmFtaWx5SWRHZXQgY2FuIHVzZSBCb2FyZElER2V0LCBzaW5jZSBCb2FyZCBpZCBpcyBub3QgcmVhZGVuIGZyb20gVFdTSSwKKwlidXQgcGFzc2VkIGZyb20gVS1Cb290IHRhZ3MgaW5zdGVhZCAqLworCisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApICE9IE1WXzc4NDYwX0RFVl9JRCkKKwkJLyogY29uc3RhbnQgVGNsb2NrIEAgMjAwTUh6IChub3QgU2FtcGxlZEBSZXNldCkgKi8KKwkJcmV0dXJuIE1WX0JPQVJEX1RDTEtfMjAwTUhaOworCisJaWYgKChNVl9SRUdfUkVBRChNUFBfU0FNUExFX0FUX1JFU0VUKDApKSAmIE1TQVJfVENMS19NQVNLKSAhPSAwKQorCQlyZXR1cm4gTVZfQk9BUkRfVENMS18yMDBNSFo7CisJZWxzZQorCQlyZXR1cm4gTVZfQk9BUkRfVENMS18yNTBNSFo7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZFN5c0Nsa0dldEF4cCAtIEdldCB0aGUgYm9hcmQgU3lzQ2xrIG9mIEFYUCAoQ1BVIGJ1cyBjbG9jayAsIGkuZS4gRERSIGNsb2NrKQorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyByb3V0aW5lIGV4dHJhY3QgdGhlIENQVSBidXMgY2xvY2suCisqCisqIElOUFVUOgorKiAgICAgICBjb3VudE51bSAtIENvdW50ZXIgbnVtYmVyLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyogICAgICAgMzJiaXQgY2xvY2sgY3ljbGVzIGluIEhlcnR6LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1UzMiBtdkJvYXJkU3lzQ2xrR2V0QXhwKE1WX1ZPSUQpCit7CisJTVZfVTMyIGlkeDsKKwlNVl9VMzIgY3B1RnJlcU1oeiwgZGRyRnJlcU1oejsKKwlNVl9DUFVfQVJNX0NMS19SQVRJTyBjbG9ja1JhdGlvVGJsW10gPSBNVl9ERFJfTDJfQ0xLX1JBVElPX1RCTF9BWFA7CisKKwlpZHggPSBNU0FSX0REUl9MMl9DTEtfUkFUSU9fSURYKE1WX1JFR19SRUFEKE1QUF9TQU1QTEVfQVRfUkVTRVQoMCkpLAorCQkJCQlNVl9SRUdfUkVBRChNUFBfU0FNUExFX0FUX1JFU0VUKDEpKSk7CisKKwlpZiAoY2xvY2tSYXRpb1RibFtpZHhdLnZjbzJjcHUgIT0gMCkgewkJCS8qIHZhbGlkIHJhdGlvID8gKi8KKwkJY3B1RnJlcU1oeiA9IG12Q3B1UGNsa0dldCgpIC8gMTAwMDAwMDsJCS8qIG9idGFpbiBDUFUgZnJlcSAqLworCQljcHVGcmVxTWh6ICo9IGNsb2NrUmF0aW9UYmxbaWR4XS52Y28yY3B1OwkvKiBjb21wdXRlIFZDTyBmcmVxICovCisJCWRkckZyZXFNaHogPSBjcHVGcmVxTWh6IC8gY2xvY2tSYXRpb1RibFtpZHhdLnZjbzJkZHI7CisJCS8qIHJvdW5kIHVwIHRvIGludGVnZXIgTUh6ICovCisJCWlmICgoKGNwdUZyZXFNaHogJSBjbG9ja1JhdGlvVGJsW2lkeF0udmNvMmRkcikgKiAxMCAvIGNsb2NrUmF0aW9UYmxbaWR4XS52Y28yZGRyKSA+PSA1KQorCQkJZGRyRnJlcU1oeisrOworCisJCXJldHVybiBkZHJGcmVxTWh6ICogMTAwMDAwMDsKKwl9IGVsc2UKKwkJcmV0dXJuIDB4RkZGRkZGRkY7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01MTMsOCArNjI5LDEyIEBACiAJTVZfVTMyCQlpZHg7CiAJTVZfVTMyCQlmcmVxX3RibF9iYzJbXSA9IE1WX0NPUkVfQ0xLX1RCTF9CQzI7CiAJTVZfVTMyCQlmcmVxX3RibF9hYzNbXSA9IE1WX0NPUkVfQ0xLX1RCTF9BQzM7CisJTVZfVTMyCQlmcmVxX3RibF9ib2JrX2NldHVzW10gPSBNVl9DT1JFX0NMS19UQkxfQk9CS19DRVRVUzsKKwlNVl9VMzIJCWZyZXFfdGJsX2JvYmtfY2FlbHVtW10gPSBNVl9DT1JFX0NMS19UQkxfQk9CS19DQUVMVU07CiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKIAorCWlmIChmYW1pbHkgPT0gTVZfNzg0NjBfREVWX0lEKQorCQlyZXR1cm4gbXZCb2FyZFN5c0Nsa0dldEF4cCgpOwogCWlkeCA9IE1TQVJfQ09SRV9DTEsoTVZfREZYX1JFR19SRUFEKERGWF9ERVZJQ0VfU0FSX1JFRygwKSksIE1WX0RGWF9SRUdfUkVBRChERlhfREVWSUNFX1NBUl9SRUcoMSkpKTsKIAogCWlmIChpZHggPj0gNykKQEAgLTUyNCw3ICs2NDQsMjAgQEAKIAkJcmV0dXJuIGZyZXFfdGJsX2JjMltpZHhdICogMTAwMDAwMDsKIAllbHNlIGlmIChmYW1pbHkgPT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkKIAkJcmV0dXJuIGZyZXFfdGJsX2FjM1tpZHhdICogMTAwMDAwMDsKLQllbHNlCisJZWxzZSBpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CisJCS8qIEJvYksgZmFtaWx5IGhhcyB0d28gZGlmZmVyZW50IGZsYXZvcnMoQ2V0dXMvQ2FlbHVtKSB3aXRoIGRpZmZlcmVudCBzZXR0aW5ncyAqLworCQlzd2l0Y2ggKG12Q3RybE1vZGVsR2V0KCkgJiB+Qk9CS19GTEFWT1JfTUFTSykgeworCQljYXNlIE1WX0JPQktfQ0VUVVNfOThEWDQyMzVfREVWX0lEOgorCQkJcmV0dXJuIGZyZXFfdGJsX2JvYmtfY2V0dXNbaWR4XSAqIDEwMDAwMDA7CisJCQlicmVhazsKKwkJY2FzZSBNVl9CT0JLX0NBRUxVTV85OERYNDIwM19ERVZfSUQ6CisJCQlyZXR1cm4gZnJlcV90YmxfYm9ia19jYWVsdW1baWR4XSAqIDEwMDAwMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW12T3NQcmludGYoIkVSUk9SOiBVbmtub3duIERldmljZSBJRCAlZCwgQ09SRSBmcmVxIGdldCBmYWlsZWRcbiIsIG12Q3RybE1vZGVsR2V0KCkpOworCQkJcmV0dXJuIDB4RkZGRkZGRkY7CisJCX0KKwl9IGVsc2UKIAkJcmV0dXJuIDB4RkZGRkZGRkY7CiB9CiAKQEAgLTc0Nyw3ICs4ODAsOCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX0JPT0wgbXZCb2FyZElzR2JFUG9ydENvbm5lY3RlZChNVl9VMzIgZXRoUG9ydE51bSkKIHsKLQlpZiAoKGV0aFBvcnROdW0gKyAxKSA8PSBib2FyZC0+bnVtQm9hcmRNYWNJbmZvKQorCWlmICgoZXRoUG9ydE51bSA8IGJvYXJkLT5udW1Cb2FyZE1hY0luZm8pICYmCisJCShib2FyZC0+cEJvYXJkTWFjSW5mb1tldGhQb3J0TnVtXS5ib2FyZE1hY0VuYWJsZWQgPT0gTVZfVFJVRSkpCiAJCXJldHVybiBNVl9UUlVFOwogCWVsc2UKIAkJcmV0dXJuIE1WX0ZBTFNFOwpAQCAtNzcyLDMwICs5MDYsMzcgQEAKIE1WX1ZPSUQgbXZCb2FyZENwbGRDb25maWd1cmF0aW9uR2V0KGNoYXIgKnN0cikKIHsKIAlNVl9VOCBjcGxkVHdzaURldiwgY3BsZENvbmZpZzsKKwlNVl9VOCBjcGxkQm9hcmRSZXZSZWcgPSBDUExEX0JPQVJEX1JFVl9SRUc7CisJTVZfVTE2IGJvYXJkTW9kZWw7CiAKLQkvKiBDUExEIGJvYXJkIGNvbmZpZ3VyYXRpb24gcHJpbnQgZm9yIEFDMyAqLwotCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKQotCQlyZXR1cm47CisJLyogUHJldmVudCB0aGUgY2FsbGVyIGZ1bmN0aW9uIGZyb20gcHJpbnRpbmcgdGhlIHNhbWUgc3RyaW5nIHR3aWNlIGlmIHRoaXMgZnVuY3Rpb24gZmFpbHMgKi8KKwkqc3RyID0gMDsKKwogCWNwbGRUd3NpRGV2ID0gbXZCb2FyZFR3c2lBZGRyR2V0KEJPQVJEX0RFVl9UV1NJX1BMRCwgMCk7CiAKIAkvKiB2ZXJpZnkgdGhhdCBDUExEIGRldmljZSBpcyBhdmFpbGFibGUgb24gY3VycmVudCBib2FyZCwgZWxzZSByZXR1cm4qLwogCWlmIChjcGxkVHdzaURldiA9PSAweGZmIHx8IG12VHdzaVByb2JlKGNwbGRUd3NpRGV2LCBtdkJvYXJkVGNsa0dldCgpKSAhPSBNVl9UUlVFKQogCQlyZXR1cm47CiAKKwlib2FyZE1vZGVsID0gbXZCb2FyZE1vZGVsR2V0KCk7CisJaWYgKGJvYXJkTW9kZWwgPT0gUkRfTVRMX0JDMl9QQ0JfSUQpCisJCWNwbGRCb2FyZFJldlJlZyA9IENQTERfUkRfTVRMX0JDMl9CT0FSRF9SRVZfUkVHOworCiAJLyogUmVhZCBCb2FyZCBSZXZpc2lvbiAqLwotCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVJlYWQoQk9BUkRfREVWX1RXU0lfUExELCAwLCBDUExEX0JPQVJEX1JFVl9SRUcsICZjcGxkQ29uZmlnKSkgeworCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVJlYWQoQk9BUkRfREVWX1RXU0lfUExELCAwLCBjcGxkQm9hcmRSZXZSZWcsICZjcGxkQ29uZmlnKSkgewogCQltdk9zUHJpbnRmKCJcbiVzOiBFcnJvcjogZmFpbGVkIHJlYWRpbmcgYm9hcmQgUmV2aXNpb24gZnJvbSBDUExELlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCXNwcmludGYoc3RyLCAiLCBSZXYgJWQiICwgY3BsZENvbmZpZyAmIENQTERfQk9BUkRfUkVWX01BU0spOwogCiAJLyogUmVhZCBDUExEIFJldmlzaW9uICovCi0JaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpUmVhZChCT0FSRF9ERVZfVFdTSV9QTEQsIDAsIENQTERfUkVWX1JFRywgJmNwbGRDb25maWcpKSB7Ci0JCW12T3NQcmludGYoIlxuJXM6IEVycm9yOiBmYWlsZWQgcmVhZGluZyBDUExEIFJldmlzaW9uIGZyb20gQ1BMRC5cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOworCWlmIChib2FyZE1vZGVsICE9IFJEX01UTF9CQzJfUENCX0lEKSB7CisJCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVJlYWQoQk9BUkRfREVWX1RXU0lfUExELCAwLCBDUExEX1JFVl9SRUcsICZjcGxkQ29uZmlnKSkgeworCQkJbXZPc1ByaW50ZigiXG4lczogRXJyb3I6IGZhaWxlZCByZWFkaW5nIENQTEQgUmV2aXNpb24gZnJvbSBDUExELlxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9CisJCXNwcmludGYoc3RyLCAiJXMsIENQTEQgUmV2ICVkIiwgc3RyLCBjcGxkQ29uZmlnICYgQ1BMRF9CT0FSRF9SRVZfTUFTSyk7CiAJfQotCi0Jc3ByaW50ZihzdHIsICIlcywgQ1BMRCBSZXYgJWQiLCBzdHIsIGNwbGRDb25maWcgJiBDUExEX0JPQVJEX1JFVl9NQVNLKTsKIH0KIAogLyogQm9hcmQgZGV2aWNlcyBBUEkgbWFuYWdtZW50cyAqLwpAQCAtMTAwOCw2ICsxMTQ5LDkyIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRHZXREZXZCdXNOdW0KKyoKKyogREVTQ1JJUFRJT046CisqCVJldHVybiB0aGUgZGV2aWNlJ3MgYnVzIG51bWJlci4KKyoKKyogSU5QVVQ6CisqCWRldkluZGV4IC0gVGhlIGRldmljZSBzZXF1ZW50aWFsIG51bWJlciBvbiB0aGUgYm9hcmQKKyoJZGV2VHlwZSAtIFRoZSBkZXZpY2UgdHlwZSAoIEZsYXNoLFJUQyAsIGV0YyAuLiApCisqCisqIE9VVFBVVDoKKyoJTm9uZS4KKyoKKyogUkVUVVJOOgorKglJZiB0aGUgZGV2aWNlIGlzIGZvdW5kIG9uIHRoZSBib2FyZCB0aGUgdGhlbiB0aGUgZnVuY3Rpb25zIHJldHVybnMgdGhlCisqCWRldiBidXMgbnVtYmVyIGVsc2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgMHhGRkZGRkZGRgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1UzMiBtdkJvYXJkR2V0RGV2QnVzTnVtKE1WXzMyIGRldk51bSwgTVZfQk9BUkRfREVWX0NMQVNTIGRldkNsYXNzKQoreworCU1WX0RFVl9DU19JTkZPICpkZXZFbnRyeSA9IG12Qm9hcmRHZXREZXZFbnRyeShkZXZOdW0sIGRldkNsYXNzKTsKKworCWlmIChkZXZFbnRyeSkKKwkJcmV0dXJuIGRldkVudHJ5LT5idXNOdW07CisKKwlyZXR1cm4gMHhGRkZGRkZGRjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZEdldERldlN0YXRlCisqCisqIERFU0NSSVBUSU9OOgorKglSZXR1cm4gdGhlIGRldmljZSdzIGFjdGl2aXR5IHN0YXRlLgorKgorKiBJTlBVVDoKKyoJZGV2SW5kZXggLSBUaGUgZGV2aWNlIHNlcXVlbnRpYWwgbnVtYmVyIG9uIHRoZSBib2FyZAorKglkZXZUeXBlIC0gVGhlIGRldmljZSB0eXBlICggRmxhc2gsUlRDICwgZXRjIC4uICkKKyoKKyogT1VUUFVUOgorKglOb25lLgorKgorKiBSRVRVUk46CisqCUlmIHRoZSBkZXZpY2UgaXMgZm91bmQgb24gdGhlIGJvYXJkIHRoZSB0aGVuIHRoZSBmdW5jdGlvbnMgcmV0dXJucyB0aGUKKyoJZGV2IGFjdGl2aXR5IHN0YXRlIGVsc2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgMHhGRkZGRkZGRgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0JPT0wgbXZCb2FyZEdldERldlN0YXRlKE1WXzMyIGRldk51bSwgTVZfQk9BUkRfREVWX0NMQVNTIGRldkNsYXNzKQoreworCU1WX0RFVl9DU19JTkZPICpkZXZFbnRyeSA9IG12Qm9hcmRHZXREZXZFbnRyeShkZXZOdW0sIGRldkNsYXNzKTsKKworCWlmIChkZXZFbnRyeSkKKwkJcmV0dXJuIGRldkVudHJ5LT5hY3RpdmU7CisKKwlyZXR1cm4gMHhGRkZGRkZGRjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZFNldERldlN0YXRlCisqCisqIERFU0NSSVBUSU9OOgorKglTZXRzIHRoZSBkZXZpY2UncyBhY3Rpdml0eSBzdGF0ZS4KKyoKKyogSU5QVVQ6CisqCWRldkluZGV4IC0gVGhlIGRldmljZSBzZXF1ZW50aWFsIG51bWJlciBvbiB0aGUgYm9hcmQKKyogICBkZXZUeXBlIC0gVGhlIGRldmljZSB0eXBlICggRmxhc2gsUlRDICwgZXRjIC4uICkKKyogICBuZXdTdGF0ZSAtIHJlcXVlc3RlZCBkZWV2aWNlIHN0YXRlCisqCisqIE9VVFBVVDoKKyoJTm9uZS4KKyoKKyogUkVUVVJOOgorKglJZiB0aGUgZGV2aWNlIGlzIGZvdW5kIG9uIHRoZSBib2FyZCB0aGUgdGhlbiB0aGUgZnVuY3Rpb25zIHJldHVybnMKKyoJTVZfT0sgZWxzZSBNVl9FUlJPUgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBtdkJvYXJkU2V0RGV2U3RhdGUoTVZfMzIgZGV2TnVtLCBNVl9CT0FSRF9ERVZfQ0xBU1MgZGV2Q2xhc3MsIE1WX0JPT0wgbmV3U3RhdGUpCit7CisJTVZfREVWX0NTX0lORk8gKmRldkVudHJ5ID0gbXZCb2FyZEdldERldkVudHJ5KGRldk51bSwgZGV2Q2xhc3MpOworCisJaWYgKGRldkVudHJ5KSB7CisJCWRldkVudHJ5LT5hY3RpdmUgPSBuZXdTdGF0ZTsKKwkJcmV0dXJuIE1WX09LOworCX0gZWxzZQorCQlyZXR1cm4gTVZfRVJST1I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12Qm9hcmRUd3NpQWRkclR5cGVHZXQgLQogKgogKiBERVNDUklQVElPTjoKQEAgLTExMjcsMTQgKzEzNTQsMjIgQEAKIHN0YXRpYyBNVl9VMzIgZ0JvYXJkSWQgPSAtMTsKIE1WX1ZPSUQgbXZCb2FyZFNldChNVl9VMzIgYm9hcmRJZCkKIHsKKwkvKiBNYXJ2ZWxsIEJvYksgQm9hcmRzICovCisJaWYgKGJvYXJkSWQgPj0gQk9CS19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgJiYgYm9hcmRJZCA8IEJPQktfTUFSVkVMTF9NQVhfQk9BUkRfSUQpIHsgLyogTWFydmVsbCBCb2FyZCAqLworCQlib2FyZCA9IG1hcnZlbGxCT0JLQm9hcmRJbmZvVGJsW212Qm9hcmRJZEluZGV4R2V0KGJvYXJkSWQpXTsKKwkJZ0JvYXJkSWQgPSBib2FyZElkOwogCS8qIE1hcnZlbGwgQm9iY2F0MiBCb2FyZHMgKi8KLQlpZiAoYm9hcmRJZCA+PSBCQzJfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICYmIGJvYXJkSWQgPCBCQzJfTUFSVkVMTF9NQVhfQk9BUkRfSUQpIHsgLyogTWFydmVsbCBCb2FyZCAqLworCX0gZWxzZSBpZiAoYm9hcmRJZCA+PSBCQzJfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICYmIGJvYXJkSWQgPCBCQzJfTUFSVkVMTF9NQVhfQk9BUkRfSUQpIHsgLyogTWFydmVsbCBCb2FyZCAqLwogCQlib2FyZCA9IG1hcnZlbGxCQzJCb2FyZEluZm9UYmxbbXZCb2FyZElkSW5kZXhHZXQoYm9hcmRJZCldOwogCQlnQm9hcmRJZCA9IGJvYXJkSWQ7CiAJLyogTWFydmVsbCBBbGxleUNhdDMgQm9hcmRzICovCiAJfSBlbHNlIGlmIChib2FyZElkID49IEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgJiYgYm9hcmRJZCA8IEFDM19NQVJWRUxMX01BWF9CT0FSRF9JRCkgeyAvKiBNYXJ2ZWxsIEJvYXJkICovCiAJCWJvYXJkID0gbWFydmVsbEFDM0JvYXJkSW5mb1RibFttdkJvYXJkSWRJbmRleEdldChib2FyZElkKV07CiAJCWdCb2FyZElkID0gYm9hcmRJZDsKKwkvKiBDdXN0b21lciBCb2JLIEJvYXJkcyAqLworCX0gZWxzZSBpZiAoYm9hcmRJZCA+PSBCT0JLX0NVU1RPTUVSX0JPQVJEX0lEX0JBU0UgJiYgYm9hcmRJZCA8IEJPQktfQ1VTVE9NRVJfTUFYX0JPQVJEX0lEKSB7LypDdXN0b21lciBCb2FyZCovCisJCWJvYXJkID0gY3VzdG9tZXJCT0JLQm9hcmRJbmZvVGJsW212Qm9hcmRJZEluZGV4R2V0KGJvYXJkSWQpXTsKKwkJZ0JvYXJkSWQgPSBib2FyZElkOwogCS8qIEN1c3RvbWVyIEJvYmNhdDIgQm9hcmRzICovCiAJfSBlbHNlIGlmIChib2FyZElkID49IEJDMl9DVVNUT01FUl9CT0FSRF9JRF9CQVNFICYmIGJvYXJkSWQgPCBCQzJfQ1VTVE9NRVJfTUFYX0JPQVJEX0lEKSB7IC8qIEN1c3RvbWVyIEJvYXJkICovCiAJCWJvYXJkID0gY3VzdG9tZXJCQzJCb2FyZEluZm9UYmxbbXZCb2FyZElkSW5kZXhHZXQoYm9hcmRJZCldOwpAQCAtMTE0MywxNCArMTM3OCwyNCBAQAogCX0gZWxzZSBpZiAoYm9hcmRJZCA+PSBBQzNfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRSAmJiBib2FyZElkIDwgQUMzX0NVU1RPTUVSX01BWF9CT0FSRF9JRCkgeyAvKiBDdXN0b21lciBCb2FyZCAqLwogCQlib2FyZCA9IGN1c3RvbWVyQUMzQm9hcmRJbmZvVGJsW212Qm9hcmRJZEluZGV4R2V0KGJvYXJkSWQpXTsKIAkJZ0JvYXJkSWQgPSBib2FyZElkOworCS8qIE1hcnZlbGwgQVhQLUFNQyBCb2FyZCAqLworCX0gZWxzZSBpZiAoYm9hcmRJZCA9PSBEQl83OFg2MF9BTUNfSUQpIHsKKwkJLyogVGhpcyBjYXNlIHNob3VsZCBlbnRlciBvbmx5IGZvciBMU1AgMy4yLzMuNCBmbG93OgorCQkgKiBUaGlzIGJvYXJkIElEIGlzIHBhc3NlZCBmcm9tIEFYUC1BTUMgVS1Cb290IDIwMTEuMTIsIGFuZCBzaGFyZWQgaGVyZSBvbmx5CisJCSAqIGZvciBMaW51eCB1c2FnZSAoQVhQIGZhbWlseSBpcyBzaGFyZWQgd2l0aCBNU1lTIGZhbWlseSBpbiBMU1ApICovCisJCWJvYXJkID0gbWFydmVsbEFYUGJvYXJkSW5mb1RibFswXTsKKwkJZ0JvYXJkSWQgPSBib2FyZElkOwogCX0gZWxzZSB7CiAJCW12T3NQcmludGYoIiVzOiBFcnJvcjogd3JvbmcgYm9hcmQgSWQgKCVkKVxuIiwgX19mdW5jX18sIGJvYXJkSWQpOwogI2lmZGVmIENPTkZJR19BTExFWUNBVDMKIAkJZ0JvYXJkSWQgPSBBQzNfQ1VTVE9NRVJfQk9BUkRfSUQwOwogCQlib2FyZCA9IGN1c3RvbWVyQUMzQm9hcmRJbmZvVGJsW2dCb2FyZElkXTsKLSNlbHNlCisjZWxpZiBkZWZpbmVkIENPTkZJR19CT0JDQVQyCiAJCWdCb2FyZElkID0gQkMyX0NVU1RPTUVSX0JPQVJEX0lEMDsKIAkJYm9hcmQgPSBjdXN0b21lckJDMkJvYXJkSW5mb1RibFtnQm9hcmRJZF07CisjZWxzZQorCQlnQm9hcmRJZCA9IEJPQktfQ0VUVVNfQ1VTVE9NRVJfQk9BUkRfSUQwOworCQlib2FyZCA9IGN1c3RvbWVyQk9CS0JvYXJkSW5mb1RibFtnQm9hcmRJZF07CiAjZW5kaWYKIAkJbXZPc1ByaW50ZigiQXBwbHlpbmcgZGVmYXVsdCBDdXN0b21lciBib2FyZCBJRCAoJWQ6ICVzKVxuIiwgZ0JvYXJkSWQsIGJvYXJkLT5ib2FyZE5hbWUpOwogCX0KQEAgLTExNzksNTUgKzE0MjQsNTkgQEAKIAlpZiAoZ0JvYXJkSWQgIT0gLTEpCiAJCXJldHVybiBnQm9hcmRJZDsKIAotI2lmIGRlZmluZWQgQ09ORklHX0FMTEVZQ0FUMworI2lmZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCiAKLQkjaWZkZWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQKKwkjaWYgZGVmaW5lZCBDT05GSUdfQUxMRVlDQVQzCiAJCSNpZmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMAogCQkJZ0JvYXJkSWQgPSBBQzNfQ1VTVE9NRVJfQk9BUkRfSUQwOwogCQkjZWxpZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMQogCQkJZ0JvYXJkSWQgPSBBQzNfQ1VTVE9NRVJfQk9BUkRfSUQxOwogCQkjZW5kaWYKLQkjZWxzZQkvKiAhQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQgKi8KLQotCS8qIEZvciBNYXJ2ZWxsIEJvYXJkczogVGVtcG9yYXJpbHkgc2V0IGdlbmVyaWMgYm9hcmQgc3RydWN0IHBvaW50ZXIgdG8KLQkgICB1c2UgU0BSIFRXU0kgYWRkcmVzcywgYW5kIHJlYWQgYm9hcmQgSUQgKi8KLQlib2FyZCA9IG1hcnZlbGxBQzNCb2FyZEluZm9UYmxbbXZCb2FyZElkSW5kZXhHZXQoREJfQUMzX0lEKV07Ci0JZ0JvYXJkSWQgPSBEQl9BQzNfSUQ7IC8qIFRlcnBvcmFyeSBmb3IgdXNhZ2UgYnkgbXZDdHJsRGV2RmFtaWx5SWRHZXQgKi8KLQlNVl9VOCByZWFkVmFsdWU7Ci0KLQlpZiAobXZCb2FyZFNhckJvYXJkSWRHZXQoJnJlYWRWYWx1ZSkgIT0gTVZfT0sgfHwgcmVhZFZhbHVlID49IEFDM19NQVJWRUxMX0JPQVJEX05VTSkgewotCQltdk9zUHJpbnRmKCIlczogRXJyb3Igb2J0YWluaW5nIEJvYXJkIElEIGZyb20gRUVQUk9NICglZClcbiIsIF9fZnVuY19fLCByZWFkVmFsdWUpOwotCQltdk9zUHJpbnRmKCIlczogU2V0dGluZyBkZWZhdWx0IGJvYXJkOiBEQi1EWEFDMy1NTVxuIiwgX19mdW5jX18pOwotCQlyZWFkVmFsdWUgPSBEQl9BQzNfSUQgLSBBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFOwotCX0KLQotCWdCb2FyZElkID0gQUMzX01BUlZFTExfQk9BUkRfSURfQkFTRSArIHJlYWRWYWx1ZTsKLQkjZW5kaWYJLyogQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQgKi8KLQotI2Vsc2UgLyogQ09ORklHX0JPQkNBVDIgKi8KLQotCSNpZmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVAorCSNlbGlmIGRlZmluZWQgQ09ORklHX0JPQkNBVDIKIAkJI2lmZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF8wCiAJCQlnQm9hcmRJZCA9IEJDMl9DVVNUT01FUl9CT0FSRF9JRDA7CiAJCSNlbGlmIENPTkZJR19DVVNUT01FUl9CT0FSRF8xCiAJCQlnQm9hcmRJZCA9IEJDMl9DVVNUT01FUl9CT0FSRF9JRDE7CiAJCSNlbmRpZgotCSNlbHNlCS8qICFDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCAqLwotCi0JCSNpZiBkZWZpbmVkKERCX0JPQkNBVDIpCi0JCQlnQm9hcmRJZCA9IERCX0RYX0JDMl9JRDsKLQkJI2VsaWYgZGVmaW5lZChSRF9CT0JDQVQyKQotCQkJZ0JvYXJkSWQgPSBSRF9EWF9CQzJfSUQ7Ci0JCSNlbGlmIGRlZmluZWQoUkRfTVRMX0JPQkNBVDIpCi0JCQlnQm9hcmRJZCA9IFJEX01UTF9CQzI7Ci0JCSNlbHNlCi0JCQltdk9zUHJpbnRmKCIlczogQm9hcmQgSUQgbXVzdCBiZSBkZWZpbmVkIVxuIiwgX19mdW5jX18pOwotCQkJd2hpbGUgKDEpCi0JCQkJY29udGludWU7CisJI2Vsc2UgLyogQk9CSyAqLworCQkjaWZkZWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEXzAKKwkJCWdCb2FyZElkID0gQk9CS19DRVRVU19DVVNUT01FUl9CT0FSRF9JRDA7CisJCSNlbGlmIENPTkZJR19DVVNUT01FUl9CT0FSRF8xCisJCQlnQm9hcmRJZCA9IEJPQktfQ0FFTFVNX0NVU1RPTUVSX0JPQVJEX0lEMTsKIAkJI2VuZGlmCi0JI2VuZGlmIC8qIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUICovCisJI2VuZGlmCiAKLSNlbmRpZgorI2Vsc2UJLyogIUNPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUICovCisKKwlNVl9VOCByZWFkVmFsdWU7CisJTVZfQk9BUkRfSU5GTyAqKm12Qm9hcmRJbmZvVGJsID0KKwkjaWYgZGVmaW5lZCBDT05GSUdfQUxMRVlDQVQzCisJCW1hcnZlbGxBQzNCb2FyZEluZm9UYmw7CisJI2VsaWYgZGVmaW5lZCBDT05GSUdfQk9CQ0FUMgorCQltYXJ2ZWxsQkMyQm9hcmRJbmZvVGJsOworCSNlbHNlIC8qIEJPQksgKi8KKwkJbWFydmVsbEJPQktCb2FyZEluZm9UYmw7CisJI2VuZGlmCisKKwkvKiBUZW1wb3JhcmlseSBzZXQgZ2VuZXJpYyBib2FyZCBzdHJ1Y3QgcG9pbnRlciwgdG8gc2V0L2dldCBFRVBST00gaTJjIGFkZHJlc3MsIGFuZCByZWFkIGJvYXJkIElEICovCisJYm9hcmQgPSBtdkJvYXJkSW5mb1RibFttdkJvYXJkSWRJbmRleEdldChNVl9ERUZBVUxUX0JPQVJEX0lEKV07CisJZ0JvYXJkSWQgPSBNVl9ERUZBVUxUX0JPQVJEX0lEOyAvKiBUZXJwb3JhcnkgZm9yIHVzYWdlIGJ5IG12Q3RybERldkZhbWlseUlkR2V0ICovCisKKwlpZiAobXZCb2FyZFNhckJvYXJkSWRHZXQoJnJlYWRWYWx1ZSkgIT0gTVZfT0spIHsKKwkJbXZPc1ByaW50ZigiJXM6IEVycm9yIG9idGFpbmluZyBCb2FyZCBJRCBmcm9tIEVFUFJPTSAoJWQpXG4iLCBfX2Z1bmNfXywgcmVhZFZhbHVlKTsKKwkJbXZPc1ByaW50ZigiJXM6IFNldHRpbmcgZGVmYXVsdCBib2FyZCB0bzogJXNcbiIsIF9fZnVuY19fLCBib2FyZC0+Ym9hcmROYW1lKTsKKwkJcmV0dXJuIE1WX0RFRkFVTFRfQk9BUkRfSUQ7CisJfQorCXJlYWRWYWx1ZSA9IHJlYWRWYWx1ZSAmIChCT0FSRF9JRF9JTkRFWF9NQVNLIC0gMSk7CisKKwlpZiAocmVhZFZhbHVlID49IE1WX01BUlZFTExfQk9BUkRfTlVNKSB7CisJCW12T3NQcmludGYoIiVzOiBFcnJvcjogcmVhZCB3cm9uZyBib2FyZCBJRCAoJWQpXG4iLCBfX2Z1bmNfXywgcmVhZFZhbHVlKTsKKwkJbXZPc1ByaW50ZigiJXM6IFNldHRpbmcgZGVmYXVsdCBib2FyZCB0bzogJXNcbiIsIF9fZnVuY19fLCBib2FyZC0+Ym9hcmROYW1lKTsKKwkJcmV0dXJuIE1WX0RFRkFVTFRfQk9BUkRfSUQ7CisJfQorCWdCb2FyZElkID0gTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgcmVhZFZhbHVlOworCisjZW5kaWYgLyogQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQgKi8KIAogCXJldHVybiBnQm9hcmRJZDsKIH0KQEAgLTE0MzAsOSArMTY3OSw5IEBACiAJTVZfVTgJCXNhcjA7CiAJTVZfU1RBVFVTCXJjMTsKIAlNVl9VMTYJCWZhbWlseSA9IG12Q3RybERldkZhbWlseUlkR2V0KDApOwotCU1WX1UzMgkJZmllbGRPZmZzID0gKGZhbWlseSA9PSBNVl9CT0JDQVQyX0RFVl9JRCkgPyAwIDogMjsKKwlNVl9VMzIJCWZpZWxkT2ZmcyA9IChmYW1pbHkgPT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgPyAyIDogMDsKIAotCWlmICgoZmFtaWx5ICE9IE1WX0FMTEVZQ0FUM19ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQpKSB7CisJaWYgKChmYW1pbHkgIT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgJiYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCkgJiYgKGZhbWlseSAhPSBNVl9CT0JLX0RFVl9JRCkpIHsKIAkJREIobXZPc1ByaW50ZigiJXM6IENvbnRyb2xsZXIgZmFtaWx5ICgweCUwNHgpIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fLCBmYW1pbHkpKTsKIAkJcmV0dXJuIE1WX0VSUk9SOwogCX0KQEAgLTE0NTIsOSArMTcwMSwxMCBAQAogCU1WX1U4CQlzYXIwOwogCU1WX1NUQVRVUwlyYzE7CiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKLQlNVl9VMzIJCWZpZWxkT2ZmcyA9IChmYW1pbHkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpID8gMCA6IDI7CisJTVZfVTMyCQlmaWVsZE9mZnMgPSAoZmFtaWx5ID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpID8gMiA6IDA7CiAKLQlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSkgeworCWlmICgoZmFtaWx5ICE9IE1WX0FMTEVZQ0FUM19ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQpCisJCSYmIChmYW1pbHkgIT0gTVZfQk9CS19ERVZfSUQpKSB7CiAJCURCKG12T3NQcmludGYoIiVzOiBDb250cm9sbGVyIGZhbWlseSAoMHglMDR4KSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXywgZmFtaWx5KSk7CiAJCXJldHVybiBNVl9FUlJPUjsKIAl9CkBAIC0xNDc1LDYgKzE3MjUsNzUgQEAKIAlEQihtdk9zUHJpbnRmKCJCb2FyZDogV3JpdGUgY29yZSBGcmVxT3B0IFNAUiBzdWNjZWVkZWRcbiIpKTsKIAlyZXR1cm4gTVZfT0s7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJlYWQgdGhlIG5ldyBTVyBTYXRSIGZpZWxkICJieXBhc3NfY29yZWNsb2NrIiBmcm9tIEVFUFJPTSgweDUwKSwgcmVnIzYgYml0c1syOjBdCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIG12Qm9hcmRCeXBhc3NDb3JlRnJlcUdldChNVl9VOCAqdmFsdWUpCit7CisJTVZfVTgJCXNhcjA7CisJTVZfU1RBVFVTCXJjMTsKKwlNVl9VMTYJCWZhbWlseSA9IG12Q3RybERldkZhbWlseUlkR2V0KDApOworCisJaWYgKGZhbWlseSAhPSBNVl9CT0JLX0RFVl9JRCkgeworCQlEQihtdk9zUHJpbnRmKCIlczogQ29udHJvbGxlciBmYW1pbHkgKDB4JTA0eCkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18sIGZhbWlseSkpOworCQlyZXR1cm4gTVZfRVJST1I7CisJfQorCisJLyogVGhlIENvcmUgRnJlcXVlbmN5IGluIEJ5cGFzcyBtb2RlIGlzIHRha2VuIGZyb20gdGhlIGZpcnN0IGFkZHJlc3MtdmFsdWUgcGFpciBvZiB0aGUgRUVQUk9NCisJICAgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UsIEluIG9yZGVyIHRvIHN1cHBvcnQgbm9ybWFsIFRXU0kgaW5pdCBzZXF1ZW5jZSBmbG93LCB0aGUgZmlyc3QgcGFpcgorCSAgIG9mIERXT1JEUyBvbiBFRVBST00gc2hvdWxkIGNvbnRhaW4gYW4gYWRkcmVzcyAoYnl0ZXMgMC0zKSBvZiBzb21lIHNjcmF0Y2ggcGFkIHJlZ2lzdGVyCisJICAgKGZvciBpbnN0YW5jZSBhbiBVQVJUIFNDUikgYW5kIGEgdmFsdWUgKGJ5dGVzIDQtNyksIHdoaWNoIHdpbGwgYmUgcGFydGlhbGx5IGludGVycHJldGVkCisJICAgYXMgQ29yZSBGcmVxIGluIGJ5cGFzcyBtb2RlIChiaXRzWzI6MF0gb2YgYnl0ZSA2KQorCSovCisKKwlyYzEgPSBtdkJvYXJkVHdzaVJlYWQoQk9BUkRfREVWX1RXU0lfSU5JVF9FUFJPTSwgMCwgNiwgJnNhcjApOworCWlmIChNVl9FUlJPUiA9PSByYzEpCisJCXJldHVybiBNVl9FUlJPUjsKKworCSp2YWx1ZSA9IChzYXIwICYgMHg3KTsKKworCXJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogV3JpdGUgdGhlIG5ldyBTVyBTYXRSIGZpZWxkICJieXBhc3NfY29yZWNsb2NrIiB0byBFRVBST00oMHg1MCksIHJlZyM2IGJpdHNbMjowXQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBtdkJvYXJkQnlwYXNzQ29yZUZyZXFTZXQoTVZfVTggZnJlcVZhbCkKK3sKKwlNVl9VOAkJc2FyMDsKKwlNVl9TVEFUVVMJcmMxOworCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7CisKKwlpZiAoZmFtaWx5ICE9IE1WX0JPQktfREVWX0lEKSB7CisJCURCKG12T3NQcmludGYoIiVzOiBDb250cm9sbGVyIGZhbWlseSAoMHglMDR4KSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXywgZmFtaWx5KSk7CisJCXJldHVybiBNVl9FUlJPUjsKKwl9CisKKwkvKiBUaGUgQ29yZSBGcmVxdWVuY3kgaW4gQnlwYXNzIG1vZGUgaXMgdGFrZW4gZnJvbSB0aGUgZmlyc3QgYWRkcmVzcy12YWx1ZSBwYWlyIG9mIHRoZSBFRVBST00KKwkgICBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSwgSW4gb3JkZXIgdG8gc3VwcG9ydCBub3JtYWwgVFdTSSBpbml0IHNlcXVlbmNlIGZsb3csIHRoZSBmaXJzdCBwYWlyCisJICAgb2YgRFdPUkRTIG9uIEVFUFJPTSBzaG91bGQgY29udGFpbiBhbiBhZGRyZXNzIChieXRlcyAwLTMpIG9mIHNvbWUgc2NyYXRjaCBwYWQgcmVnaXN0ZXIKKwkgICAoZm9yIGluc3RhbmNlIGFuIFVBUlQgU0NSKSBhbmQgYSB2YWx1ZSAoYnl0ZXMgNC03KSwgd2hpY2ggd2lsbCBiZSBwYXJ0aWFsbHkgaW50ZXJwcmV0ZWQKKwkgICBhcyBDb3JlIEZyZXEgaW4gYnlwYXNzIG1vZGUgKGJpdHNbMjowXSBvZiBieXRlIDYpCisJKi8KKworCXJjMSA9IG12Qm9hcmRUd3NpUmVhZChCT0FSRF9ERVZfVFdTSV9JTklUX0VQUk9NLCAwLCA2LCAmc2FyMCk7CisJaWYgKE1WX0VSUk9SID09IHJjMSkKKwkJcmV0dXJuIE1WX0VSUk9SOworCisJc2FyMCAmPSB+MHg3OworCXNhcjAgfD0gKGZyZXFWYWwgJiAweDcpOworCisJaWYgKE1WX09LICE9IG12Qm9hcmRUd3NpV3JpdGUoQk9BUkRfREVWX1RXU0lfSU5JVF9FUFJPTSwgMCwgNiwgc2FyMCkpIHsKKwkJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIEJ5cGFzcyBjb3JlIEZyZXEgU0BSIGZhaWxcbiIpKTsKKwkJcmV0dXJuIE1WX0VSUk9SOworCX0KKworCisJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIEJ5cHNzIGNvcmUgRnJlcU9wdCBTQFIgc3VjY2VlZGVkXG4iKSk7CisJcmV0dXJuIE1WX09LOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1NUQVRVUyBtdkJvYXJkQ3B1RnJlcUdldChNVl9VOCAqdmFsdWUpCiB7CkBAIC0xNDg5LDcgKzE4MDgsMTcgQEAKIAkJCShNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMiwgMCwgJnNhcjIpKSkKIAkJCXJldHVybiBNVl9FUlJPUjsKIAotCQkqdmFsdWUgPSAoKCgoc2FyMiAmIDB4MSkpIDw8IDMpIHwgKChzYXIgJiAweDE4KSA+PiAzKSk7CisJCSp2YWx1ZSA9ICgoKChzYXIyICYgMHgxKSkgPDwgMikgfCAoKHNhciAmIDB4MTgpID4+IDMpKTsKKworCX0gZWxzZSBpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CisJCU1WX1U4CQlzYXIyOworCisJCS8qIEJPQksgKi8KKwkJaWYgKChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMCwgMCwgJnNhcikpIHx8CisJCQkoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDMsIDAsICZzYXIyKSkpCisJCQlyZXR1cm4gTVZfRVJST1I7CisKKwkJKnZhbHVlID0gKCgoKHNhcjIgJiAweDEpKSA8PCAyKSB8ICgoc2FyICYgMHgxOCkgPj4gMykpOwogCiAJfSBlbHNlIGlmIChmYW1pbHkgPT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgewogCkBAIC0xNTM0LDYgKzE4NjMsMjcgQEAKIAkJCXJldHVybiBNVl9FUlJPUjsKIAkJfQogCisJfSBlbHNlIGlmIChmYW1pbHkgPT0gTVZfQk9CS19ERVZfSUQpIHsKKwkJTVZfVTgJCXNhcjI7CisJCS8qIEJPQksgKi8KKwkJaWYgKChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMCwgMCwgJnNhcikpIHx8CisJCQkoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDMsIDAsICZzYXIyKSkpCisJCQlyZXR1cm4gTVZfRVJST1I7CisKKwkJc2FyICAmPSB+MHgxODsKKwkJc2FyMiAmPSB+MHgxOworCQlzYXIgIHw9ICgoZnJlcVZhbCAmIDB4MDMpIDw8IDMpOworCQlzYXIyIHw9ICgoZnJlcVZhbCAmIDB4MDQpID4+IDIpOworCisJCWlmIChNVl9PSyAhPSBtdkJvYXJkVHdzaVNhdFJTZXQoMCwgMCwgc2FyKSkgeworCQkJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIENwdUZyZXEoMSkgU0BSIGZhaWxcbiIpKTsKKwkJCXJldHVybiBNVl9FUlJPUjsKKwkJfQorCQlpZiAoTVZfT0sgIT0gbXZCb2FyZFR3c2lTYXRSU2V0KDMsIDAsIHNhcjIpKSB7CisJCQlEQihtdk9zUHJpbnRmKCJCb2FyZDogV3JpdGUgQ3B1RnJlcSgyKSBTQFIgZmFpbFxuIikpOworCQkJcmV0dXJuIE1WX0VSUk9SOworCQl9CisKIAl9IGVsc2UgaWYgKGZhbWlseSA9PSBNVl9BTExFWUNBVDNfREVWX0lEKSB7CiAKIAkJLyogQUMzICovCkBAIC0xNTYzLDE2ICsxOTEzLDI3IEBACiAJTVZfVTgJCXNhcjI7CiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKIAotCWlmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQpIHsKKwlpZiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEICYmIGZhbWlseSAhPSBNVl9CT0JLX0RFVl9JRCkgewogCQlEQihtdk9zUHJpbnRmKCIlczogQUMzIGNvbnRyb2xsZXIgZmFtaWx5IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKSk7CiAJCXJldHVybiBNVl9FUlJPUjsgLyogQUMzICovCiAJfQogCi0JLyogQkMyICovCi0JaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgyLCAwLCAmc2FyMikpCi0JCXJldHVybiBNVl9FUlJPUjsKKwlpZiAoZmFtaWx5ID09IE1WX0JPQkNBVDJfREVWX0lEKSB7CiAKLQkqdmFsdWUgPSAoKHNhcjIgJiAweDBFKSA+PiAxKTsKKwkJLyogQkMyICovCisJCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMiwgMCwgJnNhcjIpKQorCQkJcmV0dXJuIE1WX0VSUk9SOworCisJCSp2YWx1ZSA9ICgoc2FyMiAmIDB4MEUpID4+IDEpOworCisJfSBlbHNlIGlmIChmYW1pbHkgPT0gTVZfQk9CS19ERVZfSUQpIHsKKworCQkvKiBCT0JLICovCisJCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMCwgMCwgJnNhcjIpKQorCQkJcmV0dXJuIE1WX0VSUk9SOworCisJCSp2YWx1ZSA9IChzYXIyICYgMHgwNyk7CisJfQogCiAJcmV0dXJuIE1WX09LOwogfQpAQCAtMTU4MywyMiArMTk0NCw0MSBAQAogCU1WX1U4CQlzYXIyOwogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7CiAKLQlpZiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSB7CisJaWYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCAmJiBmYW1pbHkgIT0gTVZfQk9CS19ERVZfSUQpIHsKIAkJREIobXZPc1ByaW50ZigiJXM6IEFDMyBjb250cm9sbGVyIGZhbWlseSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm4gTVZfRVJST1I7IC8qIEFDMyAqLwogCX0KIAotCS8qIEJDMiAqLwotCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMiwgMCwgJnNhcjIpKQotCQlyZXR1cm4gTVZfRVJST1I7CisJaWYgKGZhbWlseSA9PSBNVl9CT0JDQVQyX0RFVl9JRCkgewogCi0Jc2FyMiAmPSB+MHhFOwotCXNhcjIgfD0gKChmcmVxVmFsICYgMHgwNykgPDwgMSk7CisJCS8qIEJDMiAqLworCQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDIsIDAsICZzYXIyKSkKKwkJCXJldHVybiBNVl9FUlJPUjsKIAotCWlmIChNVl9PSyAhPSBtdkJvYXJkVHdzaVNhdFJTZXQoMiwgMCwgc2FyMikpIHsKLQkJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIFRNLUZyZXEgU0BSIGZhaWxcbiIpKTsKLQkJcmV0dXJuIE1WX0VSUk9SOworCQlzYXIyICY9IH4weEU7CisJCXNhcjIgfD0gKChmcmVxVmFsICYgMHgwNykgPDwgMSk7CisKKwkJaWYgKE1WX09LICE9IG12Qm9hcmRUd3NpU2F0UlNldCgyLCAwLCBzYXIyKSkgeworCQkJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIFRNLUZyZXEgU0BSIGZhaWxcbiIpKTsKKwkJCXJldHVybiBNVl9FUlJPUjsKKwkJfQorCX0gZWxzZSBpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CisKKwkJLyogQk9CSyAqLworCQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDAsIDAsICZzYXIyKSkKKwkJCXJldHVybiBNVl9FUlJPUjsKKworCQlzYXIyICY9IH4weDc7CisJCXNhcjIgfD0gKGZyZXFWYWwgJiAweDA3KTsKKworCQlpZiAoTVZfT0sgIT0gbXZCb2FyZFR3c2lTYXRSU2V0KDAsIDAsIHNhcjIpKSB7CisJCQlEQihtdk9zUHJpbnRmKCJCb2FyZDogV3JpdGUgVE0tRnJlcSBTQFIgZmFpbFxuIikpOworCQkJcmV0dXJuIE1WX0VSUk9SOworCQl9CiAJfQorCisJLyogQkMyIG9yIEJPQksqLworCiAJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIFRNLUZyZXEgU0BSIHN1Y2NlZWRlZFxuIikpOwogCiAJcmV0dXJuIE1WX09LOwpAQCAtMTYxMCwxNiArMTk5MCwyNyBAQAogCU1WX1U4CQlzYXI7CiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKIAotCWlmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQpIHsKKwlpZiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEICYmIGZhbWlseSAhPSBNVl9CT0JLX0RFVl9JRCkgewogCQlEQihtdk9zUHJpbnRmKCIlczogQUMzIGNvbnRyb2xsZXIgZmFtaWx5IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKSk7CiAJCXJldHVybiBNVl9FUlJPUjsgLyogQUMzICovCiAJfQogCi0JLyogQkMyICovCi0JaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgzLCAwLCAmc2FyKSkKLQkJcmV0dXJuIE1WX0VSUk9SOworCWlmIChmYW1pbHkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpIHsKIAotCSp2YWx1ZSA9IChzYXIgJiAweDgpID4+IDM7CisJCS8qIEJDMiAqLworCQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDMsIDAsICZzYXIpKQorCQkJcmV0dXJuIE1WX0VSUk9SOworCisJCSp2YWx1ZSA9IChzYXIgJiAweDgpID4+IDM7CisKKwl9IGVsc2UgaWYgKGZhbWlseSA9PSBNVl9CT0JLX0RFVl9JRCkgeworCisJCS8qIEJPQksgKi8KKwkJaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgxLCAwLCAmc2FyKSkKKwkJCXJldHVybiBNVl9FUlJPUjsKKworCQkqdmFsdWUgPSAoc2FyICYgMHg4KSA+PiAzOworCX0KIAogCXJldHVybiBNVl9PSzsKIH0KQEAgLTE2MzAsMjEgKzIwMjEsMzggQEAKIAlNVl9VOAkJc2FyOwogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7CiAKLQlpZiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSB7CisJaWYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCAmJiBmYW1pbHkgIT0gTVZfQk9CS19ERVZfSUQpIHsKIAkJREIobXZPc1ByaW50ZigiJXM6IEFDMyBjb250cm9sbGVyIGZhbWlseSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm4gTVZfRVJST1I7IC8qIEFDMyAqLwogCX0KIAotCS8qIEJDMiAqLwotCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMywgMCwgJnNhcikpCi0JCXJldHVybiBNVl9FUlJPUjsKKwlpZiAoZmFtaWx5ID09IE1WX0JPQkNBVDJfREVWX0lEKSB7CiAKLQlzYXIgJj0gfigweDgpOwotCXNhciB8PSAoKGNwdSAmIDB4MSkgPDwgMyk7CisJCS8qIEJDMiAqLworCQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDMsIDAsICZzYXIpKQorCQkJcmV0dXJuIE1WX0VSUk9SOwogCi0JaWYgKE1WX09LICE9IG12Qm9hcmRUd3NpU2F0UlNldCgzLCAwLCBzYXIpKSB7Ci0JCURCKG12T3NQcmludGYoIkJvYXJkOiBXcml0ZSBKVEFHIENQVSBTQFIgZmFpbFxuIikpOwotCQlyZXR1cm4gTVZfRVJST1I7CisJCXNhciAmPSB+KDB4OCk7CisJCXNhciB8PSAoKGNwdSAmIDB4MSkgPDwgMyk7CisKKwkJaWYgKE1WX09LICE9IG12Qm9hcmRUd3NpU2F0UlNldCgzLCAwLCBzYXIpKSB7CisJCQlEQihtdk9zUHJpbnRmKCJCb2FyZDogV3JpdGUgSlRBRyBDUFUgU0BSIGZhaWxcbiIpKTsKKwkJCXJldHVybiBNVl9FUlJPUjsKKwkJfQorCisJfSBlbHNlIGlmIChmYW1pbHkgPT0gTVZfQk9CS19ERVZfSUQpIHsKKworCQkvKiBCT0JLICovCisJCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMSwgMCwgJnNhcikpCisJCQlyZXR1cm4gTVZfRVJST1I7CisKKwkJc2FyICY9IH4oMHg4KTsKKwkJc2FyIHw9ICgoY3B1ICYgMHgxKSA8PCAzKTsKKworCQlpZiAoTVZfT0sgIT0gbXZCb2FyZFR3c2lTYXRSU2V0KDEsIDAsIHNhcikpIHsKKwkJCURCKG12T3NQcmludGYoIkJvYXJkOiBXcml0ZSBKVEFHIENQVSBTQFIgZmFpbFxuIikpOworCQkJcmV0dXJuIE1WX0VSUk9SOworCQl9CiAJfQogCiAJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIEpUQUcgQ1BVICBTQFIgc3VjY2VlZGVkXG4iKSk7CkBAIC0xNjU4LDggKzIwNjYsOCBAQAogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7CiAKIAlpZiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSB7Ci0JCURCKG12T3NQcmludGYoIiVzOiBBQzMgY29udHJvbGxlciBmYW1pbHkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pKTsKLQkJcmV0dXJuIE1WX0VSUk9SOyAvKiBBQzMgKi8KKwkJREIobXZPc1ByaW50ZigiJXM6IE9ubHkgU3VwcG9ydCBCQzIgY29udHJvbGxlciBmYW1pbHlcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBNVl9FUlJPUjsgLyogQUMzL0JPQksgKi8KIAl9CiAKIAkvKiBCQzIgKi8KQEAgLTE2NzgsOCArMjA4Niw4IEBACiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKIAogCWlmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQpIHsKLQkJREIobXZPc1ByaW50ZigiJXM6IEFDMyBjb250cm9sbGVyIGZhbWlseSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXykpOwotCQlyZXR1cm4gTVZfRVJST1I7IC8qIEFDMyAqLworCQlEQihtdk9zUHJpbnRmKCIlczogT25seSBTdXBwb3J0IEJDMiBjb250cm9sbGVyIGZhbWlseVxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIE1WX0VSUk9SOyAvKiBBQzMvQk9CSyAqLwogCX0KIAogCS8qIEJDMiAqLwpAQCAtMTcwNSw4ICsyMTEzLDggQEAKIAlNVl9VMTYJCWZhbWlseSA9IG12Q3RybERldkZhbWlseUlkR2V0KDApOwogCiAJaWYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCkgewotCQlEQihtdk9zUHJpbnRmKCIlczogQUMzIGNvbnRyb2xsZXIgZmFtaWx5IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKSk7Ci0JCXJldHVybiBNVl9FUlJPUjsgLyogQUMzICovCisJCURCKG12T3NQcmludGYoIiVzOiBPbmx5IFN1cHBvcnQgQkMyIGNvbnRyb2xsZXIgZmFtaWx5XG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm4gTVZfRVJST1I7IC8qIEFDMy9CT0JLICovCiAJfQogCiAJaWYgKHBvcnQgPiAxKSB7CkBAIC0xODA5LDkgKzIyMTcsOSBAQAogewogCU1WX1U4CQlzYXI7CiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKLQlNVl9VOAkJdHdzaURldmljZSA9IChmYW1pbHkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpID8gMyA6IDI7CisJTVZfVTgJCXR3c2lEZXZpY2UgPSAoZmFtaWx5ID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpID8gMiA6IDM7CiAKLQlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSkgeworCWlmICgoZmFtaWx5ICE9IE1WX0FMTEVZQ0FUM19ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CS19ERVZfSUQpKSB7CiAJCURCKG12T3NQcmludGYoIiVzOiBDb250cm9sbGVyIGZhbWlseSAoMHglMDR4KSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXywgZmFtaWx5KSk7CiAJCXJldHVybiBNVl9FUlJPUjsKIAl9CkBAIC0xODE5LDcgKzIyMjcsMTAgQEAKIAlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KHR3c2lEZXZpY2UsIDAsICZzYXIpKQogCQlyZXR1cm4gTVZfRVJST1I7CiAKLQkqdmFsdWUgPSAoc2FyICYgMHg3KTsKKwlpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKQorCQkqdmFsdWUgPSAoKHNhciAmIDB4MEUpID4+IDEpOworCWVsc2UKKwkJKnZhbHVlID0gKHNhciAmIDB4Nyk7CiAKIAlyZXR1cm4gTVZfT0s7CiB9CkBAIC0xODI5LDkgKzIyNDAsOSBAQAogewogCU1WX1U4CQlzYXI7CiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKLQlNVl9VOAkJdHdzaURldmljZSA9IChmYW1pbHkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpID8gMyA6IDI7CisJTVZfVTgJCXR3c2lEZXZpY2UgPSAoZmFtaWx5ID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpID8gMiA6IDM7CiAKLQlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSkgeworCWlmICgoZmFtaWx5ICE9IE1WX0FMTEVZQ0FUM19ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CS19ERVZfSUQpKSB7CiAJCURCKG12T3NQcmludGYoIiVzOiBDb250cm9sbGVyIGZhbWlseSAoMHglMDR4KSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXywgZmFtaWx5KSk7CiAJCXJldHVybiBNVl9FUlJPUjsKIAl9CkBAIC0xODM5LDggKzIyNTAsMTMgQEAKIAlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KHR3c2lEZXZpY2UsIDAsICZzYXIpKQogCQlyZXR1cm4gTVZfRVJST1I7CiAKLQlzYXIgJj0gfigweDcpOwotCXNhciB8PSAodmFsICYgMHg3KTsKKwlpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CisJCXNhciAmPSB+KDB4RSk7CisJCXNhciB8PSAoKHZhbCAmIDB4NykgPDwgMSk7CisJfSBlbHNlIHsKKwkJc2FyICY9IH4oMHg3KTsKKwkJc2FyIHw9ICh2YWwgJiAweDcpOworCX0KIAogCWlmIChNVl9PSyAhPSBtdkJvYXJkVHdzaVNhdFJTZXQodHdzaURldmljZSwgMCwgc2FyKSkgewogCQlEQihtdk9zUHJpbnRmKCJCb2FyZDogV3JpdGUgQm9vdERldiBTQFIgZmFpbFxuIikpOwpAQCAtMTg1NSwxNiArMjI3MSwxNyBAQAogewogCU1WX1U4CQlzYXI7CiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKKwlNVl9VOAkJdHdzaURldmljZSA9IChmYW1pbHkgPT0gTVZfQk9CS19ERVZfSUQpID8gMiA6IDA7CiAKLQlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSkgeworCWlmICgoZmFtaWx5ICE9IE1WX0FMTEVZQ0FUM19ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CS19ERVZfSUQpKSB7CiAJCURCKG12T3NQcmludGYoIiVzOiBDb250cm9sbGVyIGZhbWlseSAoMHglMDR4KSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXywgZmFtaWx5KSk7CiAJCXJldHVybiBNVl9FUlJPUjsKIAl9CiAKLQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDAsIDAsICZzYXIpKQotCQlyZXR1cm4gTVZfRVJST1I7CisJaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCh0d3NpRGV2aWNlLCAwLCAmc2FyKSkKKwkJCXJldHVybiBNVl9FUlJPUjsKIAotCSp2YWx1ZSA9IChzYXIgJiAweDFGKTsKKwkJKnZhbHVlID0gKHNhciAmIDB4MUYpOwogCiAJcmV0dXJuIE1WX09LOwogfQpAQCAtMTg3NCwxOSArMjI5MSwyMCBAQAogewogCU1WX1U4CQlzYXI7CiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKKwlNVl9VOAkJdHdzaURldmljZSA9IChmYW1pbHkgPT0gTVZfQk9CS19ERVZfSUQpID8gMiA6IDA7CiAKLQlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSkgeworCWlmICgoZmFtaWx5ICE9IE1WX0FMTEVZQ0FUM19ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CS19ERVZfSUQpKSB7CiAJCURCKG12T3NQcmludGYoIiVzOiBDb250cm9sbGVyIGZhbWlseSAoMHglMDR4KSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXywgZmFtaWx5KSk7CiAJCXJldHVybiBNVl9FUlJPUjsKIAl9CiAKLQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDAsIDAsICZzYXIpKQorCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQodHdzaURldmljZSwgMCwgJnNhcikpCiAJCXJldHVybiBNVl9FUlJPUjsKIAogCXNhciAmPSB+KDB4MUYpOwogCXNhciB8PSAodmFsICYgMHgxRik7CiAKLQlpZiAoTVZfT0sgIT0gbXZCb2FyZFR3c2lTYXRSU2V0KDAsIDAsIHNhcikpIHsKKwlpZiAoTVZfT0sgIT0gbXZCb2FyZFR3c2lTYXRSU2V0KHR3c2lEZXZpY2UsIDAsIHNhcikpIHsKIAkJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIGRldmljZS1pZCBTQFIgZmFpbFxuIikpOwogCQlyZXR1cm4gTVZfRVJST1I7CiAJfQpAQCAtMTk0NSwxNyArMjM2MywyNCBAQAogewogCU1WX1U4CQlzYXI7CiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKLQlNVl9VOAkJYml0T2Zmc2V0ID0gKGZhbWlseSA9PSBNVl9CT0JDQVQyX0RFVl9JRCkgPyA0IDogMzsKKwlNVl9VOAkJYml0T2Zmc2V0ID0gKGZhbWlseSA9PSBNVl9BTExFWUNBVDNfREVWX0lEKSA/IDMgOiA0OwogCi0JaWYgKChmYW1pbHkgIT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgJiYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCkpIHsKKwlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQktfREVWX0lEKSkgewogCQlEQihtdk9zUHJpbnRmKCIlczogQ29udHJvbGxlciBmYW1pbHkgKDB4JTA0eCkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18sIGZhbWlseSkpOwogCQlyZXR1cm4gTVZfRVJST1I7CiAJfQogCi0JaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgyLCAwLCAmc2FyKSkKLQkJcmV0dXJuIE1WX0VSUk9SOworCWlmICgoZmFtaWx5ID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpIHx8IChmYW1pbHkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpKSB7CisJCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMiwgMCwgJnNhcikpCisJCQlyZXR1cm4gTVZfRVJST1I7CiAKLQkqdmFsID0gKHNhciAmICgweDEgPDwgYml0T2Zmc2V0KSkgPj4gYml0T2Zmc2V0OworCQkqdmFsID0gKHNhciAmICgweDEgPDwgYml0T2Zmc2V0KSkgPj4gYml0T2Zmc2V0OworCX0gZWxzZSBpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CisJCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMywgMCwgJnNhcikpCisJCQlyZXR1cm4gTVZfRVJST1I7CisKKwkJKnZhbCA9IChzYXIgJiAoMHgxIDw8IGJpdE9mZnNldCkpID4+IGJpdE9mZnNldDsKKwl9CiAKIAlyZXR1cm4gTVZfT0s7CiB9CkBAIC0xOTY1LDIyICsyMzkwLDM1IEBACiB7CiAJTVZfVTgJCXNhcjsKIAlNVl9VMTYJCWZhbWlseSA9IG12Q3RybERldkZhbWlseUlkR2V0KDApOwotCU1WX1U4CQliaXRPZmZzZXQgPSAoZmFtaWx5ID09IE1WX0JPQkNBVDJfREVWX0lEKSA/IDQgOiAzOworCU1WX1U4CQliaXRPZmZzZXQgPSAoZmFtaWx5ID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpID8gMyA6IDQ7CiAKLQlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSkgeworCWlmICgoZmFtaWx5ICE9IE1WX0FMTEVZQ0FUM19ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CS19ERVZfSUQpKSB7CiAJCURCKG12T3NQcmludGYoIiVzOiBDb250cm9sbGVyIGZhbWlseSAoMHglMDR4KSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXywgZmFtaWx5KSk7CiAJCXJldHVybiBNVl9FUlJPUjsKIAl9CiAKLQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDIsIDAsICZzYXIpKQotCQlyZXR1cm4gTVZfRVJST1I7CisJaWYgKChmYW1pbHkgPT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgfHwgKGZhbWlseSA9PSBNVl9CT0JDQVQyX0RFVl9JRCkpIHsKKwkJaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgyLCAwLCAmc2FyKSkKKwkJCXJldHVybiBNVl9FUlJPUjsKIAotCXNhciAmPSB+KDB4MSA8PCBiaXRPZmZzZXQpOwotCXNhciB8PSAodmFsICYgMHgxKSA8PCBiaXRPZmZzZXQ7CisJCXNhciAmPSB+KDB4MSA8PCBiaXRPZmZzZXQpOworCQlzYXIgfD0gKHZhbCAmIDB4MSkgPDwgYml0T2Zmc2V0OwogCi0JaWYgKE1WX09LICE9IG12Qm9hcmRUd3NpU2F0UlNldCgyLCAwLCBzYXIpKSB7Ci0JCURCKG12T3NQcmludGYoIkJvYXJkOiBXcml0ZSBwY2ltb2RlIFNAUiBmYWlsXG4iKSk7Ci0JCXJldHVybiBNVl9FUlJPUjsKKwkJaWYgKE1WX09LICE9IG12Qm9hcmRUd3NpU2F0UlNldCgyLCAwLCBzYXIpKSB7CisJCQlEQihtdk9zUHJpbnRmKCJCb2FyZDogV3JpdGUgcGNpbW9kZSBTQFIgZmFpbFxuIikpOworCQkJcmV0dXJuIE1WX0VSUk9SOworCQl9CisJfSBlbHNlIGlmIChmYW1pbHkgPT0gTVZfQk9CS19ERVZfSUQpIHsKKwkJaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgzLCAwLCAmc2FyKSkKKwkJCXJldHVybiBNVl9FUlJPUjsKKworCQlzYXIgJj0gfigweDEgPDwgYml0T2Zmc2V0KTsKKwkJc2FyIHw9ICh2YWwgJiAweDEpIDw8IGJpdE9mZnNldDsKKworCQlpZiAoTVZfT0sgIT0gbXZCb2FyZFR3c2lTYXRSU2V0KDMsIDAsIHNhcikpIHsKKwkJCURCKG12T3NQcmludGYoIkJvYXJkOiBXcml0ZSBwY2ltb2RlIFNAUiBmYWlsXG4iKSk7CisJCQlyZXR1cm4gTVZfRVJST1I7CisJCX0KIAl9CiAKIAlEQihtdk9zUHJpbnRmKCJCb2FyZDogV3JpdGUgcGNpbW9kZSBTQFIgc3VjY2VlZGVkXG4iKSk7CkBAIC0yMTgyLDEyICsyNjIwLDYgQEAKIE1WX1NUQVRVUyBtdkJvYXJkU2FyQm9hcmRJZEdldChNVl9VOCAqdmFsdWUpCiB7CiAJTVZfVTgJCWJvYXJkSWQ7Ci0JTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKLQotCWlmIChmYW1pbHkgIT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgewotCQlEQihtdk9zUHJpbnRmKCIlczogQ29udHJvbGxlciBmYW1pbHkgKDB4JTA0eCkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18sIGZhbWlseSkpOwotCQlyZXR1cm4gTVZfRVJST1I7Ci0JfQogCiAJLyogVGhlIEJvYXJkIElkIGlzIHRha2VuIGZyb20gdGhlIGZpcnN0IGFkZHJlc3MtdmFsdWUgcGFpciBvZiB0aGUgRUVQUk9NIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlCiAJICAgSW4gb3JkZXIgdG8gc3VwcG9ydCBub3JtYWwgVFdTSSBpbml0IHNlcXVlbmNlIGZsb3csIHRoZSBmaXJzdCBwYWlyIG9mIERXT1JEUyBvbiBFRVBST00KQEAgLTIyMDgsMTQgKzI2NDAsMjEgQEAKIAlNVl9VOAkJYm9hcmRJZDsKIAlNVl9VMTYJCWZhbWlseSA9IG12Q3RybERldkZhbWlseUlkR2V0KDApOwogCi0JaWYgKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSB7Ci0JCURCKG12T3NQcmludGYoIiVzOiBDb250cm9sbGVyIGZhbWlseSAoMHglMDR4KSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXywgZmFtaWx5KSk7Ci0JCXJldHVybiBNVl9FUlJPUjsKLQl9Ci0KLQlpZiAodmFsID49IEFDM19NQVJWRUxMX0JPQVJEX05VTSkgewotCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IFVuc3VwcG9ydGVkIGJvYXJkIElEICglZClcbiIsIF9fZnVuY19fLCB2YWwpOwotCQlyZXR1cm4gTVZfRVJST1I7CisJaWYgKGZhbWlseSA9PSBNVl9BTExFWUNBVDNfREVWX0lEKSB7CisJCWlmICh2YWwgPj0gQUMzX01BUlZFTExfQk9BUkRfTlVNKSB7CisJCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IFVuc3VwcG9ydGVkIGJvYXJkIElEICglZClcbiIsIF9fZnVuY19fLCB2YWwpOworCQkJcmV0dXJuIE1WX0VSUk9SOworCQl9CisJfSBlbHNlIGlmIChmYW1pbHkgPT0gTVZfQk9CS19ERVZfSUQpIHsKKwkJaWYgKHZhbCA+PSBCT0JLX01BUlZFTExfQk9BUkRfTlVNKSB7CisJCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IFVuc3VwcG9ydGVkIGJvYXJkIElEICglZClcbiIsIF9fZnVuY19fLCB2YWwpOworCQkJcmV0dXJuIE1WX0VSUk9SOworCQl9CisJfSBlbHNlIGlmIChmYW1pbHkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpIHsKKwkJaWYgKHZhbCA+PSBCQzJfTUFSVkVMTF9CT0FSRF9OVU0pIHsKKwkJCW12T3NQcmludGYoIiVzOiBFcnJvcjogVW5zdXBwb3J0ZWQgYm9hcmQgSUQgKCVkKVxuIiwgX19mdW5jX18sIHZhbCk7CisJCQlyZXR1cm4gTVZfRVJST1I7CisJCX0KIAl9CiAKIAkvKiBUaGUgQm9hcmQgSWQgaXMgdGFrZW4gZnJvbSB0aGUgZmlyc3QgYWRkcmVzcy12YWx1ZSBwYWlyIG9mIHRoZSBFRVBST00gaW5pdGFsaXphdGlvbiBzZXF1bmNlCkBAIC0yMzY3LDYgKzI4MDYsMjkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZENvbmZpZ0F1dG9EZXRlY3RFbmFibGVkCisqCisqIERFU0NSSVBUSU9OOgorKglJbmRpY2F0ZSBpZiB0aGUgYm9hcmQgc3VwcG9ydHMgYXV0byBjb25maWd1cmF0aW9uIGFuZCBkZXRlY3Rpb24gb2YKKyoJbW9kdWxlcy4gVGhpcyBpcyB1c3VhbGx5IGVuYWJsZWQgZm9yIERCIGJvYXJkcyBvbmx5LgorKgorKiBJTlBVVDoKKyoJTm9uZS4KKyoKKyogT1VUUFVUOgorKglOb25lLgorKgorKiBSRVRVUk46CisqICAgICAgIE1WX1RSVUUgaWYgYXV0by1jb25maWcvZGV0ZWN0aW9uIGlzIGVuYWJsZWQuCisqCU1WX0ZBTFNFIG90aGVyd2lzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRDb25maWdBdXRvRGV0ZWN0RW5hYmxlZCgpCit7CisJcmV0dXJuIGJvYXJkLT5jb25maWdBdXRvRGV0ZWN0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkRGVidWdMZWcgLSBTZXQgdGhlIGJvYXJkIGRlYnVnIExlZHMKICoKICogREVTQ1JJUFRJT046IHR1cm4gb24vb2ZmIHN0YXR1cyBsZWRzLgpAQCAtMjQ2MCw2ICsyOTIyLDUzIEBACiAJcmV0dXJuIE1WX05GQ19FQ0NfRElTQUJMRTsKICNlbmRpZgogfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZENvbXBhdGlibGVOYW1lR2V0CisqCisqIERFU0NSSVBUSU9OOiByZXR1cm4gc3RyaW5nIGNvbnRhaW5pbmcgJ2NvbXBhdGlibGUnIHByb3BlcnR5IHZhbHVlCisqCQluZWVkZWQgZm9yIERldmljZSBUcmVlIGF1dG8tdXBkYXRlIHBhcnNpbmcgc2VxdWVuY2UKKyoKKyogSU5QVVQ6ICBOb25lCisqIE9VVFBVVDogTm9uZS4KKyoKKyogUkVUVVJOOiBsZW5ndGggb2YgcmV0dXJuZWQgc3RyaW5nIChpbmNsdWRpbmcgc3BlY2lhbCBkZWxpbWl0ZXJzKQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1U4IG12Qm9hcmRDb21wYXRpYmxlTmFtZUdldChjaGFyICpwTmFtZUJ1ZmYpCit7CisJTVZfVTggbGVuID0gMDsKKwlNVl9VMzIgYm9hcmRJZDsKKwkvKiBpLmU6IGNvbXBhdGlibGUgPSAibWFydmVsbCxtc3lzIiwgIm1hcnZlbGwsbXN5cy1iYzIiLCAibWFydmVsbCxtc3lzLWJjMi1kYiIsICJtYXJ2ZWxsLGFybWFkYS0zNzAteHAiOyAqLworCWxlbiA9IHNwcmludGYocE5hbWVCdWZmLCAibWFydmVsbCxtc3lzIikgKyAxOworCS8qCisJICogYXBwZW5kIG5leHQgc3RyaW5ncyBhZnRlciB0aGUgTlVMTCBjaGFyYWN0ZXIgdGhhdCB0aGUgcHJldmlvdXMKKwkgKiBzcHJpbnRmIHdyb3RlLiAgVGhpcyBpcyBob3cgYSBkZXZpY2UgdHJlZSBzdG9yZXMgbXVsdGlwbGUKKwkgKiBzdHJpbmdzIGluIGEgcHJvcGVydHkuCisJICovCisJYm9hcmRJZCA9IG12Qm9hcmRJZEdldCgpOworCWlmIChib2FyZElkID49IEJDMl9NQVJWRUxMX0JPQVJEX0lEX0JBU0UgJiYgYm9hcmRJZCA8IEJDMl9NQVJWRUxMX01BWF9CT0FSRF9JRCkgeworCQlsZW4gKz0gc3ByaW50ZihwTmFtZUJ1ZmYgKyBsZW4sICJtYXJ2ZWxsLG1zeXMtYmMyIikgKyAxOworCQlsZW4gKz0gc3ByaW50ZihwTmFtZUJ1ZmYgKyBsZW4sICJtYXJ2ZWxsLG1zeXMtYmMyLWRiIikgKyAxOworCX0gZWxzZSBpZiAoYm9hcmRJZCA+PSBBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICYmIGJvYXJkSWQgPCBBQzNfTUFSVkVMTF9NQVhfQk9BUkRfSUQpIHsKKwkJbGVuICs9IHNwcmludGYocE5hbWVCdWZmICsgbGVuLCAibWFydmVsbCxtc3lzLWFjMyIpICsgMTsKKwkJbGVuICs9IHNwcmludGYocE5hbWVCdWZmICsgbGVuLCAibWFydmVsbCxtc3lzLWFjMy1kYiIpICsgMTsKKwl9IGVsc2UgaWYgKGJvYXJkSWQgPj0gQk9CS19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgJiYgYm9hcmRJZCA8IEJPQktfTUFSVkVMTF9NQVhfQk9BUkRfSUQpIHsKKwkJbGVuICs9IHNwcmludGYocE5hbWVCdWZmICsgbGVuLCAibWFydmVsbCxtc3lzLWJvYmsiKSArIDE7CisJCWlmIChib2FyZElkID09IEJPQktfQ0VUVVNfREJfSUQpIHsKKwkJCWxlbiArPSBzcHJpbnRmKHBOYW1lQnVmZiArIGxlbiwgIm1hcnZlbGwsbXN5cy1ib2JrLWNldHVzIikgKyAxOworCQkJbGVuICs9IHNwcmludGYocE5hbWVCdWZmICsgbGVuLCAibWFydmVsbCxtc3lzLWJvYmstY2V0dXMtZGIiKSArIDE7CisJCX0gZWxzZSBpZiAoYm9hcmRJZCA9PSBCT0JLX0NBRUxVTV9EQl9JRCkgeworCQkJbGVuICs9IHNwcmludGYocE5hbWVCdWZmICsgbGVuLCAibWFydmVsbCxtc3lzLWJvYmstY2FlbHVtIikgKyAxOworCQkJbGVuICs9IHNwcmludGYocE5hbWVCdWZmICsgbGVuLCAibWFydmVsbCxtc3lzLWJvYmstY2FlbHVtLWRiIikgKyAxOworCQl9IGVsc2UgaWYgKGJvYXJkSWQgPT0gQk9CS19MRVdJU19SRF9JRCkgeworCQkJbGVuICs9IHNwcmludGYocE5hbWVCdWZmICsgbGVuLCAibWFydmVsbCxtc3lzLWJvYmstbGV3aXMiKSArIDE7CisJCQlsZW4gKz0gc3ByaW50ZihwTmFtZUJ1ZmYgKyBsZW4sICJtYXJ2ZWxsLG1zeXMtYm9iay1sZXdpcy1yZCIpICsgMTsKKwkJfQorCX0KKwlsZW4gKz0gc3ByaW50ZihwTmFtZUJ1ZmYgKyBsZW4sICJtYXJ2ZWxsLGFybWFkYS0zNzAteHAiKSArIDE7CisKKwlyZXR1cm4gbGVuOworfQogCiBNVl9OQU5EX0lGX01PREUgbXZCb2FyZE5hbmRJZkdldCgpCiB7CkBAIC0yNTMwLDMgKzMwMzksMTQxIEBACiAKIAlyZXR1cm4gTVZfT0s7CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkaXNBbWMKKyogREVTQ1JJUFRJT046IE1TWVMgcGxhdGZvcm0gYXJlIG5vdCBBTUMgY29tcGxpYW50IC0gcmV0dXJuIGFsd2F5cyBmYWxzZQorKgorKiBJTlBVVDogIE5vbmUKKyogT1VUUFVUOiBOb25lLgorKiBSRVRVUk46IE1WX0ZBTFNFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBtdkJvYXJkaXNBbWModm9pZCkKK3sKKwlyZXR1cm4gTVZfRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRQUFNtaUluZGV4R2V0CisqIERFU0NSSVBUSU9OOiBHZXQgdGhlIFBQIFNNSSBpbmRleCBmb3IgdGhlIGJvYXJkCisqCisqIElOUFVUOiAgTm9uZQorKiBPVVRQVVQ6IFBQIFNNSSBpbmRleC4KKyogUkVUVVJOOiBNVl9UUlVFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIG12Qm9hcmRQUFNtaUluZGV4R2V0KE1WX1UzMiAqaW5kZXgpCit7CisJKmluZGV4ID0gYm9hcmQtPnNtaUV4dGVybmFsUHBJbmRleDsKKwlyZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRVcGRhdGVDb25maWdmb3JEVAorKiBERVNDUklQVElPTjogVXBkYXRlIGJvYXJkIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGZvciBEVCB1cGRhdGUKKyoKKyogSU5QVVQ6ICBOb25lLgorKiBPVVRQVVQ6IE5vbmUuCisqIFJFVFVSTjogTm9uZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9WT0lEIG12Qm9hcmRVcGRhdGVDb25maWdmb3JEVChNVl9WT0lEKQoreworCit9CisKKyNpZmRlZiBDT05GSUdfTU1DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkaXNTZGlvQ29ubmVjdGVkCisqIERFU0NSSVBUSU9OOiByZXR1cm4gdHJ1ZSBpZiBTRElPIGNvbm5lY3RlZCBvbiBib2FyZAorKgorKiBJTlBVVDogIE5vbmUKKyogT1VUUFVUOiBOb25lLgorKiBSRVRVUk46IE1WX1RSVUU6U0RJTyBjb25uZWN0ZWQgb24gYm9hcmQKKyogICAgICAgICBNVl9GQUxTRTogZWxzZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0JPT0wgbXZCb2FyZGlzU2Rpb0Nvbm5lY3RlZCh2b2lkKQoreworCXJldHVybiBib2FyZC0+aXNTZE1tY0Nvbm5lY3RlZDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkR2V0TW9kZWxOYW1lCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgYm9hcmQgbW9kZWwuCisqCisqIE9VVFBVVDoKKyogICAgICAgcE5hbWVCdWZmIC0gQnVmZmVyIHRvIGNvbnRhaW4gYm9hcmQgbW9kZWwgbmFtZSBzdHJpbmcuIE1pbmltdW0gc2l6ZSAxMjggY2hhcnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtdkJvYXJkR2V0TW9kZWxOYW1lKGNoYXIgKnBOYW1lQnVmZikKK3sKKwltdk9zU1ByaW50ZihwTmFtZUJ1ZmYsICJNYXJ2ZWxsIE1TWVMgJXMgJXMiLCBib2FyZC0+bW9kZWxOYW1lLCBib2FyZC0+Ym9hcmROYW1lKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZElzUHBTbWkKKyogREVTQ1JJUFRJT046CisqCWNoZWNrcyB3aGV0aGVyIFBQX1NNSSBpcyB1c2VkIG9yIG5vdAorKgorKiBJTlBVVDogIE5vbmUKKyogT1VUUFVUOiBOb25lLgorKiBSRVRVUk46IE1WX1RSVUUgUFBfU01JIGlzIHVzZWQKKyoJICBNVl9GQUxTRSBvdGhlcndpc2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRJc1BwU21pKHZvaWQpCit7CisJcmV0dXJuIGJvYXJkLT5pc1NtaUV4dGVybmFsUHA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRQaW5DdHJsTmFtZUdldAorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb21wYXRpYmxlIHN0cmluZyBvZiBwaW5jdHJsCisqCisqIE9VVFBVVDoKKyogICAgICAgY29tcGF0aWJsZUJ1ZiAtIEJ1ZmZlciB0byBjb250YWluIHBpbmN0cmwgY29tcGF0aWJsZSBzdHJpbmcKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG12Qm9hcmRQaW5DdHJsTmFtZUdldChjaGFyICpjb21wYXRpYmxlQnVmKQoreworCW12T3NTUHJpbnRmKGNvbXBhdGlibGVCdWYsICJtYXJ2ZWxsLGJjMi1hYzMtcGluY3RybCIpOworfQorCisjaWZkZWYgTVZfQ00zCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkSXNDbTMKKyogREVTQ1JJUFRJT046CisqCWNoZWNrcyB3aGV0aGVyIENNMyBpcyB1c2VkIG9yIG5vdAorKgorKiBJTlBVVDogIE5vbmUKKyogT1VUUFVUOiBOb25lLgorKiBSRVRVUk46IE1WX1RSVUUgQ00zIGlzIHVzZWQKKyoJICBNVl9GQUxTRSBvdGhlcndpc2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRJc0NtMyh2b2lkKQoreworCXJldHVybiBib2FyZC0+aXNDbTM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRDbTNDb21wYXRpYmxlTmFtZUdldAorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb21wYXRpYmxlIHN0cmluZyBvZiBjbTMKKyoKKyogT1VUUFVUOgorKiAgICAgICBjb21wYXRpYmxlQnVmIC0gQnVmZmVyIHRvIGNvbnRhaW4gY20zIGNvbXBhdGlibGUgc3RyaW5nCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtdkJvYXJkQ20zQ29tcGF0aWJsZU5hbWVHZXQoY2hhciAqY29tcGF0aWJsZUJ1ZikKK3sKKwlpZiAoZ0JvYXJkSWQgPj0gIEJPQktfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICYmCisJCQlnQm9hcmRJZCA8IEJPQktfTUFSVkVMTF9NQVhfQk9BUkRfSUQpCisJCW12T3NTUHJpbnRmKGNvbXBhdGlibGVCdWYsICJtYXJ2ZWxsLG1zeXMtYm9iay1jbTMiKTsKKwllbHNlIGlmIChnQm9hcmRJZCA+PSAgQkMyX01BUlZFTExfQk9BUkRfSURfQkFTRSAmJgorCQkJZ0JvYXJkSWQgPCBCQzJfTUFSVkVMTF9NQVhfQk9BUkRfSUQpCisJCW12T3NTUHJpbnRmKGNvbXBhdGlibGVCdWYsICJtYXJ2ZWxsLG1zeXMtYmMyLWNtMyIpOworCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuaCBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuaAppbmRleCA2Yzc5NjM2Li45MDRmZWE4IDEwMDc1NQotLS0gYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmgKKysrIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5oCkBAIC04Myw2ICs4MywxNCBAQAogCiAjZGVmaW5lIE1WX0JPQVJEX01BWF9NUFAJCTkJLyogbnVtYmVyIG9mIE1QUCBjb25mIHJlZ2lzdGVycyAqLwogI2RlZmluZSBNVl9CT0FSRF9OQU1FX0xFTiAgCQkweDIwCisjZGVmaW5lIE1WX0JPQVJEX01PREVMX05BTUVfTEVOCQkweDUwCisKK2VudW0geworCU1WX1BPUlRfVFlQRV9TR01JSSwKKwlNVl9QT1JUX1RZUEVfUVNHTUlJLAorCU1WX1BPUlRfVFlQRV9SR01JSSwKKwlNVl9QT1JUX1RZUEVfVU5LTk9XTiA9IC0xLAorfTsKIAogdHlwZWRlZiBlbnVtIF9kZXZCb2FyZE1wcFR5cGVDbGFzcyB7CiAJTVZfQk9BUkRfQVVUTyA9IDAsCkBAIC0xNTMsNiArMTYxLDggQEAKIAlNVl9VMzIgZGV2Q2xhc3M7CS8qIE1WX0JPQVJEX0RFVl9DTEFTUyAqLwogCU1WX1U4IGRldldpZHRoOwogCU1WX1U4IGJ1c1dpZHRoOworCU1WX1U4IGJ1c051bTsKKwlNVl9CT09MIGFjdGl2ZTsKIH0gTVZfREVWX0NTX0lORk87CiAKIHR5cGVkZWYgc3RydWN0IF9ib2FyZFN3aXRjaEluZm8gewpAQCAtMTg3LDYgKzE5Nyw3IEBACiAJTVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQ7CiAJTVZfMzIJYm9hcmRFdGhTbWlBZGRyOwogCU1WXzMyIGJvYXJkRXRoU21pQWRkcjA7CisJTVZfQk9PTCBib2FyZE1hY0VuYWJsZWQ7CiB9IE1WX0JPQVJEX01BQ19JTkZPOwogCiB0eXBlZGVmIHN0cnVjdCBfYm9hcmRNcHBJbmZvIHsKQEAgLTI1NSw3ICsyNjYsMTYgQEAKIAlNVl9CT0FSRF9QRVhfSU5GTwlib2FyZFBleEluZm87CS8qIGZpbGxlZCBpbiBydW50aW1lICovCiAJTVZfVTMyIG5vckZsYXNoUmVhZFBhcmFtczsKIAlNVl9VMzIgbm9yRmxhc2hXcml0ZVBhcmFtczsKKwlNVl9CT09MIGlzU21pRXh0ZXJuYWxQcDsKKwlNVl9VMzIgc21pRXh0ZXJuYWxQcEluZGV4OworCU1WX0JPT0wgaXNTZE1tY0Nvbm5lY3RlZDsKIAorCS8qIEluZGljYXRlcyBpZiBhdXRvLWRldGVjdGlvbiBvZiBtb2R1bGVzIGlzIGVuYWJsZWQgb24gdGhpcyBib2FyZC4gKi8KKwkvKiBTZXQgdG8gTVZfRkFMU0UgZm9yIGFueSBib2FyZCB0aGF0IGlzIG5vdCBhIERCLiAqLworCU1WX0JPT0wgY29uZmlnQXV0b0RldGVjdDsKKworCWNoYXIgbW9kZWxOYW1lW01WX0JPQVJEX01PREVMX05BTUVfTEVOXTsKKwlNVl9CT09MIGlzQ20zOwogfSBNVl9CT0FSRF9JTkZPOwogCiBNVl9WT0lEIG12Qm9hcmRFbnZJbml0KE1WX1ZPSUQpOwpAQCAtMjY2LDExICsyODYsMTMgQEAKIE1WX0JPT0wgbXZCb2FyZElzRXRoQWN0aXZlKE1WX1UzMiBldGhOdW0pOwogTVZfQk9PTCBtdkJvYXJkSXNQb3J0SW5TZ21paShNVl9VMzIgZXRoUG9ydE51bSk7CiBNVl9CT09MIG12Qm9hcmRJc1BvcnRJbkdtaWkoTVZfVTMyIGV0aFBvcnROdW0pOworTVZfVTMyIG12Qm9hcmRQb3J0VHlwZUdldChNVl9VMzIgZXRoUG9ydE51bSk7CiBNVl9CT09MIG12Qm9hcmRJc1BvcnRJbk1paShNVl9VMzIgZXRoUG9ydE51bSk7CiBNVl9CT09MIG12Qm9hcmRJc1BvcnRJblJnbWlpKE1WX1UzMiBldGhQb3J0TnVtKTsKIE1WXzMyIG12Qm9hcmRQaHlBZGRyR2V0KE1WX1UzMiBldGhQb3J0TnVtKTsKIE1WXzMyIG12Qm9hcmRRdWFkUGh5QWRkcjBHZXQoTVZfVTMyIGV0aFBvcnROdW0pOwogTVZfMzIgbXZCb2FyZFN3aXRjaENwdVBvcnRHZXQoTVZfVTMyIHN3aXRjaElkeCk7CitNVl9CT09MIG12Qm9hcmRDb25maWdBdXRvRGV0ZWN0RW5hYmxlZCh2b2lkKTsKIE1WXzMyIG12Qm9hcmRTbWlTY2FuTW9kZUdldChNVl9VMzIgc3dpdGNoSWR4KTsKIE1WX1UzMiBtdkJvYXJkVGNsa0dldChNVl9WT0lEKTsKIE1WX1UzMiBtdkJvYXJkU3lzQ2xrR2V0KE1WX1ZPSUQpOwpAQCAtMjg5LDYgKzMxMSw5IEBACiBNVl8zMiBtdkJvYXJkR2V0RGV2aWNlV2lkdGgoTVZfMzIgZGV2TnVtLCBNVl9CT0FSRF9ERVZfQ0xBU1MgZGV2Q2xhc3MpOwogTVZfMzIgbXZCb2FyZEdldERldmljZVdpblNpemUoTVZfMzIgZGV2TnVtLCBNVl9CT0FSRF9ERVZfQ0xBU1MgZGV2Q2xhc3MpOwogTVZfVTMyIG12Qm9hcmRHZXREZXZDU051bShNVl8zMiBkZXZOdW0sIE1WX0JPQVJEX0RFVl9DTEFTUyBkZXZDbGFzcyk7CitNVl9VMzIgbXZCb2FyZEdldERldkJ1c051bShNVl8zMiBkZXZOdW0sIE1WX0JPQVJEX0RFVl9DTEFTUyBkZXZDbGFzcyk7CitNVl9CT09MIG12Qm9hcmRHZXREZXZTdGF0ZShNVl8zMiBkZXZOdW0sIE1WX0JPQVJEX0RFVl9DTEFTUyBkZXZDbGFzcyk7CitNVl9TVEFUVVMgbXZCb2FyZFNldERldlN0YXRlKE1WXzMyIGRldk51bSwgTVZfQk9BUkRfREVWX0NMQVNTIGRldkNsYXNzLCBNVl9CT09MIG5ld1N0YXRlKTsKIE1WX1U4IG12Qm9hcmRUd3NpQWRkclR5cGVHZXQoTVZfQk9BUkRfVFdTSV9DTEFTUyB0d3NpQ2xhc3MsIE1WX1UzMiBpbmRleCk7CiBNVl9VOCBtdkJvYXJkVHdzaUFkZHJHZXQoTVZfQk9BUkRfVFdTSV9DTEFTUyB0d3NpQ2xhc3MsIE1WX1UzMiBpbmRleCk7CiBNVl8zMiBtdkJvYXJkTmFuZFdpZHRoR2V0KHZvaWQpOwpAQCAtMzMwLDYgKzM1NSw4IEBACiBNVl9TVEFUVVMgbXZCb2FyZERyYW1CdXNXaWR0aFNldChNVl9VMTYgY29uZik7CiBNVl9VMTYgbXZCb2FyZERyYW1CdXNXaWR0aEdldChNVl9WT0lEKTsKIE1WX1NUQVRVUyBtdkJvYXJkQ29yZUZyZXFHZXQoTVZfVTggKnZhbHVlKTsKK01WX1NUQVRVUyBtdkJvYXJkQnlwYXNzQ29yZUZyZXFHZXQoTVZfVTggKnZhbHVlKTsKK01WX1NUQVRVUyBtdkJvYXJkQnlwYXNzQ29yZUZyZXFTZXQoTVZfVTggZnJlcVZhbCk7CiBNVl9TVEFUVVMgbXZCb2FyZFRtRnJlcUdldChNVl9VOCAqdmFsdWUpOwogTVZfU1RBVFVTIG12Qm9hcmRUbUZyZXFTZXQoTVZfVTggZnJlcVZhbCk7CiBNVl9TVEFUVVMgbXZCb2FyZEp0YWdDcHVHZXQoTVZfVTggKnZhbHVlKTsKQEAgLTM2MiwxMiArMzg5LDI4IEBACiBNVl9WT0lEIG12Qm9hcmREZWJ1Z0xlZChNVl9VMzIgaGV4TnVtKTsKIE1WX05GQ19FQ0NfTU9ERSBtdkJvYXJkTmFuZEVDQ01vZGVHZXQodm9pZCk7CiBNVl9VMzIgbXZCb2FyZENwc3NCb2FyZElkU2V0KE1WX1U4KTsKK01WX1U4IG12Qm9hcmRDb21wYXRpYmxlTmFtZUdldChjaGFyICpwTmFtZUJ1ZmYpOwogTVZfTkFORF9JRl9NT0RFIG12Qm9hcmROYW5kSWZHZXQodm9pZCk7CiBNVl9TVEFUVVMgbXZCb2FyZE9vYlBvcnRDZmdTZXQoTVZfVk9JRCk7CitNVl9CT09MIG12Qm9hcmRJc1VzYlBvcnRDb25uZWN0ZWQoTVZfVU5JVF9JRCB1c2JUeXBlSUQsIE1WX1U4IHVzYlBvcnROdW1iZXIpOworTVZfQk9PTCBtdkJvYXJkaXNBbWModm9pZCk7CitNVl9TVEFUVVMgbXZCb2FyZFBQU21pSW5kZXhHZXQoTVZfVTMyICppbmRleCk7CitNVl9WT0lEIG12Qm9hcmRVcGRhdGVDb25maWdmb3JEVChNVl9WT0lEKTsKKyNpZmRlZiBDT05GSUdfTU1DCitNVl9CT09MIG12Qm9hcmRpc1NkaW9Db25uZWN0ZWQodm9pZCk7CisjZW5kaWYKK3ZvaWQgbXZCb2FyZEdldE1vZGVsTmFtZShjaGFyICpwTmFtZUJ1ZmYpOworTVZfQk9PTCBtdkJvYXJkSXNQcFNtaSh2b2lkKTsKK3ZvaWQgbXZCb2FyZFBpbkN0cmxOYW1lR2V0KGNoYXIgKmNvbXBhdGlibGVCdWYpOworI2lmZGVmIE1WX0NNMworTVZfQk9PTCBtdkJvYXJkSXNDbTModm9pZCk7Cit2b2lkIG12Qm9hcmRDbTNDb21wYXRpYmxlTmFtZUdldChjaGFyICpjb21wYXRpYmxlQnVmKTsKKyNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCitleHRlcm4gTVZfQk9BUkRfSU5GTyAqbWFydmVsbEFYUGJvYXJkSW5mb1RibFtdOwogCiAjZW5kaWYgLyogX19JTkNtdkJvYXJkRW52TGliaCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMuYyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjLmMKaW5kZXggNzQ1MGJmOC4uNTU3MjFmNSAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMuYworKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYy5jCkBAIC05OCw4ICs5OCw4IEBACiAKIE1WX0JPQVJEX01BQ19JTkZPIGJvYmNhdDJfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmRNYWNJbmZvW10gPSB7CiAJLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLwotCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDAgfSwKLQl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MSwgMHgxIH0sCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MSwgTVZfVFJVRX0sCiB9OwogCiBNVl9CT0FSRF9NT0RVTEVfVFlQRV9JTkZPIGJvYmNhdDJfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmRNb2RUeXBlSW5mb1tdID0gewpAQCAtMTA5LDEyICsxMDksMTcgQEAKIH07CiAKIE1WX0RFVl9DU19JTkZPIGJvYmNhdDJfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmREZUNzSW5mb1tdID0gewotCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNXaWR0aCB9Ki8KKwkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aCwgYnVzV2lkdGgsIGJ1c051bSwgYWN0aXZlIH0qLwogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCi0Je1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOCwgOH0sIC8qIFNQSSBERVYgKi8KKwl7U1BJX0NTMCwgTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSwgLyogU1BJIERFViAqLwogI2VuZGlmCi0jaWYgZGVmaW5lZChNVl9JTkNMVURFX05PUikKLQl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNn0gLyogTk9SIERFViAqLworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpICYmIGRlZmluZWQoTVZfSU5DTFVERV9OQU5EKQorCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSwgLyogTkFORCBERVYgKi8KKwl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNiwgMCwgTVZfVFJVRX0gLyogTk9SIERFViAqLworI2VsaWYgZGVmaW5lZChNVl9JTkNMVURFX05BTkQpCisJe0RFVklDRV9DUzAsIE5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9IC8qIE5BTkQgREVWICovCisjZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTk9SKQorCXtERVZfQk9PQ1MsIE5fQSwgQk9BUkRfREVWX05PUl9GTEFTSCwgMTYsIDE2LCAwLCBNVl9UUlVFfSAvKiBOT1IgREVWICovCiAjZW5kaWYKIH07CiAKQEAgLTE3MCw3ICsxNzUsOCBAQAogCS5uYW5kRmxhc2hDb250cm9sCQk9IEJPQkNBVDJfQ1VTVE9NRVJfMF9CT0FSRF9OQU5EX0NPTlRST0wsCiAJLyogTk9SIGluaXQgcGFyYW1zICovCiAJLm5vckZsYXNoUmVhZFBhcmFtcwkJPSBCT0JDQVQyX0NVU1RPTUVSXzBfQk9BUkRfTk9SX1JFQURfUEFSQU1TLAotCS5ub3JGbGFzaFdyaXRlUGFyYW1zCQk9IEJPQkNBVDJfQ1VTVE9NRVJfMF9CT0FSRF9OT1JfV1JJVEVfUEFSQU1TCisJLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gQk9CQ0FUMl9DVVNUT01FUl8wX0JPQVJEX05PUl9XUklURV9QQVJBTVMsCisJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfRkFMU0UJLyogRW5hYmxlIG1vZHVsZXMgYXV0by1kZXRlY3Rpb24uICovCiB9OwogCiBNVl9CT0FSRF9JTkZPICpjdXN0b21lckJDMkJvYXJkSW5mb1RibFtdID0gewpAQCAtMTc4LDYgKzE4NCwyMzAgQEAKIAkmYm9iY2F0Ml9jdXN0b21lcl9ib2FyZF8wX0luZm8sCiB9OwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCUJvYksgQ2V0dXMgY3VzdG9tZXIgYm9hcmQgLSBCYXNlZCBvbiBCT0JLLUNFVFVTLURCLTk4RFg0MjM1LTEyWEcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9CT0FSRF9OQU5EX1JFQURfUEFSQU1TCTB4MDAwQzAyODIKKyNkZWZpbmUgQk9CS19DRVRVU19DVVNUT01FUl8wX0JPQVJEX05BTkRfV1JJVEVfUEFSQU1TCTB4MDAwMTAzMDUKKy8qTkFORCBjYXJlIHN1cHBvcnQgZm9yIHNtYWxsIHBhZ2UgY2hpcHMqLworI2RlZmluZSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfQk9BUkRfTkFORF9DT05UUk9MCQkweDAxYzAwNTQzCisKKyNkZWZpbmUgQk9CS19DRVRVU19DVVNUT01FUl8wX0JPQVJEX05PUl9SRUFEX1BBUkFNUwkweDQwM0UwN0NGCisjZGVmaW5lIEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9CT0FSRF9OT1JfV1JJVEVfUEFSQU1TCTB4MDAwRjBGMEYKKworTVZfQk9BUkRfVFdTSV9JTkZPCWJvYmtfY2V0dXNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmRUd3NpRGV2W10gPSB7CisvKiB7e01WX0JPQVJEX0RFVl9DTEFTUwlkZXZDbGFzcywgTVZfVTgJdHdzaURldkFkZHIsIE1WX1U4IHR3c2lEZXZBZGRyVHlwZX19ICovCisJe0JPQVJEX0RFVl9UV1NJX1BMRCwgMHgxOCwgQUREUjdfQklUfSwJCS8qIEFjY2VzcyB0byBjb250cm9sIFBMRCByZWcgZmlsZSAqLworCXtCT0FSRF9ERVZfVFdTSV9aQVJMSU5LLCAweDFCLCBBRERSN19CSVR9LAkJLyogQWNjZXNzIHRvIFphcmxpbmsJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0QywgQUREUjdfQklUfSwgICAgICAgICAvKiBTYXRSIGJpb3MgMAkJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0RCwgQUREUjdfQklUfSwgICAgICAgICAvKiBTYXRSIGJpb3MgMQkJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0RSwgQUREUjdfQklUfSwgICAgICAgICAgLyogU2F0UiBiaW9zIDIJCSovCisJe0JPQVJEX0RFVl9UV1NJX1NBVFIsIDB4NEYsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFNhdFIgYmlvcyAzCQkqLworCXtCT0FSRF9ERVZfVFdTSV9JTklUX0VQUk9NLCAweDUwLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBTZXJpYWwgSW5pdCBFUFJPTQkqLworCXtCT0FSRF9ERVZfVFdTSV9QQ0E5NTQ4X0lPX01VWCwgMHg3MCwgQUREUjdfQklUfSwgICAgICAgICAgLyogUENBOTU0OCBJMkMgbXV4IDAJKi8KKwl7Qk9BUkRfREVWX1RXU0lfUENBOTU0OF9JT19NVVgsIDB4NzEsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFBDQTk1NDggSTJDIG11eCAxCSovCisJe0JPQVJEX0RFVl9UV1NJX1BDQTk1NDhfSU9fTVVYLCAweDc1LCBBRERSN19CSVR9ICAgICAgICAgIC8qIFBDQTk1NDggSTJDIG11eCAyCSovCit9OworCitNVl9CT0FSRF9NQUNfSU5GTyBib2JrX2NldHVzX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkTWFjSW5mb1tdID0geworCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsIE1WXzMyIGJvYXJkRXRoU21pQWRkcjA7fX0gKi8KKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIC0xLCAtMSwgTVZfRkFMU0V9LAorCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDAsIE1WX1RSVUV9LAorfTsKKworTVZfQk9BUkRfTU9EVUxFX1RZUEVfSU5GTyBib2JrX2NldHVzX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkTW9kVHlwZUluZm9bXSA9IHsKKwl7CisJCS5ib2FyZE1wcE1vZAkJPSBNVl9CT0FSRF9BVVRPLAorCX0KK307CisKK01WX0RFVl9DU19JTkZPIGJvYmtfY2V0dXNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmREZUNzSW5mb1tdID0geworCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNXaWR0aCwgYnVzTnVtLCBhY3RpdmUgfSovCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKKwkJe1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0sIC8qIFNQSSBERVYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpCisJCXtERVZfQk9PQ1MsIE5fQSwgQk9BUkRfREVWX05PUl9GTEFTSCwgMTYsIDE2LCAwLCBNVl9UUlVFfSAvKiBOT1IgREVWICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTkFORCkKKwkJe0RFVklDRV9DUzAsIE5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9IC8qIE5BTkQgREVWICovCisjZW5kaWYKK307CisKK01WX0JPQVJEX01QUF9JTkZPIGJvYmtfY2V0dXNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmRNcHBDb25maWdWYWx1ZVtdID0geworCXsgeworCUJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9NUFAwXzcsCisJQk9CS19DRVRVU19DVVNUT01FUl8wX01QUDhfMTUsCisJQk9CS19DRVRVU19DVVNUT01FUl8wX01QUDE2XzIzLAorCUJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9NUFAyNF8zMSwKKwlCT0JLX0NFVFVTX0NVU1RPTUVSXzBfTVBQMzJfMzksCisJfSB9LAorfTsKKworTVZfQk9BUkRfSU5GTyBib2JrX2NldHVzX2N1c3RvbWVyX2JvYXJkXzBfSW5mbyA9IHsKKwkuYm9hcmROYW1lCQkJPSAiQk9CSy1DZXR1cy1DdXN0b21lci1Cb2FyZC0wIiwKKwkubnVtQm9hcmRNcHBUeXBlVmFsdWUJCT0gQVJSU1ooYm9ia19jZXR1c19jdXN0b21lcl9ib2FyZF8wX0luZm9Cb2FyZE1vZFR5cGVJbmZvKSwKKwkucEJvYXJkTW9kVHlwZVZhbHVlCQk9IGJvYmtfY2V0dXNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmRNb2RUeXBlSW5mbywKKwkubnVtQm9hcmRNcHBDb25maWdWYWx1ZQkJPSBBUlJTWihib2JrX2NldHVzX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUpLAorCS5wQm9hcmRNcHBDb25maWdWYWx1ZQkJPSBib2JrX2NldHVzX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUsCisJLmludHNHcHBNYXNrTG93CQkJPSAwLAorCS5pbnRzR3BwTWFza01pZAkJCT0gMCwKKwkuaW50c0dwcE1hc2tIaWdoCQk9IDAsCisJLm51bUJvYXJkRGV2aWNlSWYJCT0gQVJSU1ooYm9ia19jZXR1c19jdXN0b21lcl9ib2FyZF8wX0luZm9Cb2FyZERlQ3NJbmZvKSwKKwkucERldkNzSW5mbwkJCT0gYm9ia19jZXR1c19jdXN0b21lcl9ib2FyZF8wX0luZm9Cb2FyZERlQ3NJbmZvLAorCS5udW1Cb2FyZFR3c2lEZXYJCT0gQVJSU1ooYm9ia19jZXR1c19jdXN0b21lcl9ib2FyZF8wX0luZm9Cb2FyZFR3c2lEZXYpLAorCS5wQm9hcmRUd3NpRGV2CQkJPSBib2JrX2NldHVzX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkVHdzaURldiwKKwkubnVtQm9hcmRNYWNJbmZvCQk9IEFSUlNaKGJvYmtfY2V0dXNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmRNYWNJbmZvKSwKKwkucEJvYXJkTWFjSW5mbwkJCT0gYm9ia19jZXR1c19jdXN0b21lcl9ib2FyZF8wX0luZm9Cb2FyZE1hY0luZm8sCisJLm51bUJvYXJkR3BwSW5mbwkJPSAwLAorCS5wQm9hcmRHcHBJbmZvCQkJPSBOVUxMLAorCS5hY3RpdmVMZWRzTnVtYmVyCQk9IDAsCisJLnBMZWRHcHBQaW4JCQk9IE5VTEwsCisJLmxlZHNQb2xhcml0eQkJCT0gMCwKKworCS8qIEdQUCB2YWx1ZXMgKi8KKwkuZ3BwT3V0RW5WYWxMb3cJCQk9IEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9HUFBfT1VUX0VOQV9MT1csCisJLmdwcE91dEVuVmFsTWlkCQkJPSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfR1BQX09VVF9FTkFfTUlELAorCS5ncHBPdXRFblZhbEhpZ2gJCT0gMCwKKwkuZ3BwT3V0VmFsTG93CQkJPSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfR1BQX09VVF9WQUxfTE9XLAorCS5ncHBPdXRWYWxNaWQJCQk9IEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9HUFBfT1VUX1ZBTF9NSUQsCisJLmdwcE91dFZhbEhpZ2gJCQk9IDAsCisJLmdwcFBvbGFyaXR5VmFsTG93CQk9IEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9HUFBfUE9MX0xPVywKKwkuZ3BwUG9sYXJpdHlWYWxNaWQJCT0gQk9CS19DRVRVU19DVVNUT01FUl8wX0dQUF9QT0xfTUlELAorCS5ncHBQb2xhcml0eVZhbEhpZ2gJCT0gMCwKKworCS8qIEV4dGVybmFsIFN3aXRjaCBDb25maWd1cmF0aW9uICovCisJLnBTd2l0Y2hJbmZvID0gTlVMTCwKKwkuc3dpdGNoSW5mb051bSA9IDAsCisKKwkvKiBOQU5EIGluaXQgcGFyYW1zICovCisJLm5hbmRGbGFzaFJlYWRQYXJhbXMJCT0gQk9CS19DRVRVU19DVVNUT01FUl8wX0JPQVJEX05BTkRfUkVBRF9QQVJBTVMsCisJLm5hbmRGbGFzaFdyaXRlUGFyYW1zCQk9IEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9CT0FSRF9OQU5EX1dSSVRFX1BBUkFNUywKKwkubmFuZEZsYXNoQ29udHJvbAkJPSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfQk9BUkRfTkFORF9DT05UUk9MLAorCS8qIE5PUiBpbml0IHBhcmFtcyAqLworCS5ub3JGbGFzaFJlYWRQYXJhbXMJCT0gQk9CS19DRVRVU19DVVNUT01FUl8wX0JPQVJEX05PUl9SRUFEX1BBUkFNUywKKwkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUywKKwkuaXNTbWlFeHRlcm5hbFBwCQk9IE1WX1RSVUUsCisJLnNtaUV4dGVybmFsUHBJbmRleAkJPSAwLAorCS5pc1NkTW1jQ29ubmVjdGVkCQk9IE1WX1RSVUUsCisJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfRkFMU0UJLyogRW5hYmxlIG1vZHVsZXMgYXV0by1kZXRlY3Rpb24uICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCUJvYksgQ2FlbHVtIGN1c3RvbWVyIGJvYXJkIC0gQmFzZWQgb24gQk9CSy1DQUVMVU0tREItOThEWDQyMDMtNDhHMTJYRworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9CT0FSRF9OQU5EX1JFQURfUEFSQU1TCTB4MDAwQzAyODIKKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9CT0FSRF9OQU5EX1dSSVRFX1BBUkFNUwkweDAwMDEwMzA1CisvKk5BTkQgY2FyZSBzdXBwb3J0IGZvciBzbWFsbCBwYWdlIGNoaXBzKi8KKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9CT0FSRF9OQU5EX0NPTlRST0wJCTB4MDFjMDA1NDMKKworI2RlZmluZSBCT0JLX0NBRUxVTV9DVVNUT01FUl8xX0JPQVJEX05PUl9SRUFEX1BBUkFNUwkweDQwM0UwN0NGCisjZGVmaW5lIEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUwkweDAwMEYwRjBGCisKK01WX0JPQVJEX1RXU0lfSU5GTwlib2JrX2NhZWx1bV9jdXN0b21lcl9ib2FyZF8xX0luZm9Cb2FyZFR3c2lEZXZbXSA9IHsKKy8qIHt7TVZfQk9BUkRfREVWX0NMQVNTCWRldkNsYXNzLCBNVl9VOAl0d3NpRGV2QWRkciwgTVZfVTggdHdzaURldkFkZHJUeXBlfX0gKi8KKwl7Qk9BUkRfREVWX1RXU0lfUExELCAweDE4LCBBRERSN19CSVR9LAkJLyogQWNjZXNzIHRvIGNvbnRyb2wgUExEIHJlZyBmaWxlICovCisJe0JPQVJEX0RFVl9UV1NJX1pBUkxJTkssIDB4MUIsIEFERFI3X0JJVH0sCQkvKiBBY2Nlc3MgdG8gWmFybGluawkqLworCXtCT0FSRF9ERVZfVFdTSV9TQVRSLCAweDRDLCBBRERSN19CSVR9LCAgICAgICAgIC8qIFNhdFIgYmlvcyAwCQkqLworCXtCT0FSRF9ERVZfVFdTSV9TQVRSLCAweDRELCBBRERSN19CSVR9LCAgICAgICAgIC8qIFNhdFIgYmlvcyAxCQkqLworCXtCT0FSRF9ERVZfVFdTSV9TQVRSLCAweDRFLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBTYXRSIGJpb3MgMgkJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0RiwgQUREUjdfQklUfSwgICAgICAgICAgLyogU2F0UiBiaW9zIDMJCSovCisJe0JPQVJEX0RFVl9UV1NJX0lOSVRfRVBST00sIDB4NTAsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFNlcmlhbCBJbml0IEVQUk9NCSovCisJe0JPQVJEX0RFVl9UV1NJX1BDQTk1NTVfSU9fRVhQQU5ERVIsIDB4MjAsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFFzZ21paS9zZnAgbXV4IGNvbnRyb2wgUENBOTU1NSBJTyBleHBhbmRlciAqLworCXtCT0FSRF9ERVZfVFdTSV9QQ0E5NTQ4X0lPX01VWCwgMHg3MCwgQUREUjdfQklUfSwgICAgICAgICAgLyogUENBOTU0OCBJMkMgbXV4IDAJKi8KKwl7Qk9BUkRfREVWX1RXU0lfUENBOTU0OF9JT19NVVgsIDB4NzEsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFBDQTk1NDggSTJDIG11eCAxCSovCisJe0JPQVJEX0RFVl9UV1NJX1BDQTk1NDhfSU9fTVVYLCAweDc1LCBBRERSN19CSVR9ICAgICAgICAgIC8qIFBDQTk1NDggSTJDIG11eCAyCSovCit9OworCitNVl9CT0FSRF9NQUNfSU5GTyBib2JrX2NhZWx1bV9jdXN0b21lcl9ib2FyZF8xX0luZm9Cb2FyZE1hY0luZm9bXSA9IHsKKwkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIwO319ICovCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAtMSwgLTEsIE1WX0ZBTFNFfSwKKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9UUlVFfSwKK307CisKK01WX0JPQVJEX01PRFVMRV9UWVBFX0lORk8gYm9ia19jYWVsdW1fY3VzdG9tZXJfYm9hcmRfMV9JbmZvQm9hcmRNb2RUeXBlSW5mb1tdID0geworCXsKKwkJLmJvYXJkTXBwTW9kCQk9IE1WX0JPQVJEX0FVVE8sCisJfQorfTsKKworTVZfREVWX0NTX0lORk8gYm9ia19jYWVsdW1fY3VzdG9tZXJfYm9hcmRfMV9JbmZvQm9hcmREZUNzSW5mb1tdID0geworCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNXaWR0aCwgYnVzTnVtLCBhY3RpdmUgfSovCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKKwkJe1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0sIC8qIFNQSSBERVYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpCisJCXtERVZfQk9PQ1MsIE5fQSwgQk9BUkRfREVWX05PUl9GTEFTSCwgMTYsIDE2LCAwLCBNVl9UUlVFfSAvKiBOT1IgREVWICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTkFORCkKKwkJe0RFVklDRV9DUzAsIE5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9IC8qIE5BTkQgREVWICovCisjZW5kaWYKK307CisKK01WX0JPQVJEX01QUF9JTkZPIGJvYmtfY2FlbHVtX2N1c3RvbWVyX2JvYXJkXzFfSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWVbXSA9IHsKKwl7IHsKKwlCT0JLX0NBRUxVTV9DVVNUT01FUl8xX01QUDBfNywKKwlCT0JLX0NBRUxVTV9DVVNUT01FUl8xX01QUDhfMTUsCisJQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9NUFAxNl8yMywKKwlCT0JLX0NBRUxVTV9DVVNUT01FUl8xX01QUDI0XzMxLAorCUJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfTVBQMzJfMzksCisJfSB9LAorfTsKKworTVZfQk9BUkRfSU5GTyBib2JrX2NhZWx1bV9jdXN0b21lcl9ib2FyZF8xX0luZm8gPSB7CisJLmJvYXJkTmFtZQkJCT0gIkJPQkstQ2FlbHVtLUN1c3RvbWVyLUJvYXJkLTEiLAorCS5udW1Cb2FyZE1wcFR5cGVWYWx1ZQkJPSBBUlJTWihib2JrX2NhZWx1bV9jdXN0b21lcl9ib2FyZF8xX0luZm9Cb2FyZE1vZFR5cGVJbmZvKSwKKwkucEJvYXJkTW9kVHlwZVZhbHVlCQk9IGJvYmtfY2FlbHVtX2N1c3RvbWVyX2JvYXJkXzFfSW5mb0JvYXJkTW9kVHlwZUluZm8sCisJLm51bUJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gQVJSU1ooYm9ia19jYWVsdW1fY3VzdG9tZXJfYm9hcmRfMV9JbmZvQm9hcmRNcHBDb25maWdWYWx1ZSksCisJLnBCb2FyZE1wcENvbmZpZ1ZhbHVlCQk9IGJvYmtfY2FlbHVtX2N1c3RvbWVyX2JvYXJkXzFfSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUsCisJLmludHNHcHBNYXNrTG93CQkJPSAwLAorCS5pbnRzR3BwTWFza01pZAkJCT0gMCwKKwkuaW50c0dwcE1hc2tIaWdoCQk9IDAsCisJLm51bUJvYXJkRGV2aWNlSWYJCT0gQVJSU1ooYm9ia19jYWVsdW1fY3VzdG9tZXJfYm9hcmRfMV9JbmZvQm9hcmREZUNzSW5mbyksCisJLnBEZXZDc0luZm8JCQk9IGJvYmtfY2FlbHVtX2N1c3RvbWVyX2JvYXJkXzFfSW5mb0JvYXJkRGVDc0luZm8sCisJLm51bUJvYXJkVHdzaURldgkJPSBBUlJTWihib2JrX2NhZWx1bV9jdXN0b21lcl9ib2FyZF8xX0luZm9Cb2FyZFR3c2lEZXYpLAorCS5wQm9hcmRUd3NpRGV2CQkJPSBib2JrX2NhZWx1bV9jdXN0b21lcl9ib2FyZF8xX0luZm9Cb2FyZFR3c2lEZXYsCisJLm51bUJvYXJkTWFjSW5mbwkJPSBBUlJTWihib2JrX2NhZWx1bV9jdXN0b21lcl9ib2FyZF8xX0luZm9Cb2FyZE1hY0luZm8pLAorCS5wQm9hcmRNYWNJbmZvCQkJPSBib2JrX2NhZWx1bV9jdXN0b21lcl9ib2FyZF8xX0luZm9Cb2FyZE1hY0luZm8sCisJLm51bUJvYXJkR3BwSW5mbwkJPSAwLAorCS5wQm9hcmRHcHBJbmZvCQkJPSBOVUxMLAorCS5hY3RpdmVMZWRzTnVtYmVyCQk9IDAsCisJLnBMZWRHcHBQaW4JCQk9IE5VTEwsCisJLmxlZHNQb2xhcml0eQkJCT0gMCwKKworCS8qIEdQUCB2YWx1ZXMgKi8KKwkuZ3BwT3V0RW5WYWxMb3cJCQk9IEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfR1BQX09VVF9FTkFfTE9XLAorCS5ncHBPdXRFblZhbE1pZAkJCT0gQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9HUFBfT1VUX0VOQV9NSUQsCisJLmdwcE91dEVuVmFsSGlnaAkJPSAwLAorCS5ncHBPdXRWYWxMb3cJCQk9IEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfR1BQX09VVF9WQUxfTE9XLAorCS5ncHBPdXRWYWxNaWQJCQk9IEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfR1BQX09VVF9WQUxfTUlELAorCS5ncHBPdXRWYWxIaWdoCQkJPSAwLAorCS5ncHBQb2xhcml0eVZhbExvdwkJPSBCT0JLX0NBRUxVTV9DVVNUT01FUl8xX0dQUF9QT0xfTE9XLAorCS5ncHBQb2xhcml0eVZhbE1pZAkJPSBCT0JLX0NBRUxVTV9DVVNUT01FUl8xX0dQUF9QT0xfTUlELAorCS5ncHBQb2xhcml0eVZhbEhpZ2gJCT0gMCwKKworCS8qIEV4dGVybmFsIFN3aXRjaCBDb25maWd1cmF0aW9uICovCisJLnBTd2l0Y2hJbmZvID0gTlVMTCwKKwkuc3dpdGNoSW5mb051bSA9IDAsCisKKwkvKiBOQU5EIGluaXQgcGFyYW1zICovCisJLm5hbmRGbGFzaFJlYWRQYXJhbXMJCT0gQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9CT0FSRF9OQU5EX1JFQURfUEFSQU1TLAorCS5uYW5kRmxhc2hXcml0ZVBhcmFtcwkJPSBCT0JLX0NBRUxVTV9DVVNUT01FUl8xX0JPQVJEX05BTkRfV1JJVEVfUEFSQU1TLAorCS5uYW5kRmxhc2hDb250cm9sCQk9IEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfQk9BUkRfTkFORF9DT05UUk9MLAorCS8qIE5PUiBpbml0IHBhcmFtcyAqLworCS5ub3JGbGFzaFJlYWRQYXJhbXMJCT0gQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9CT0FSRF9OT1JfUkVBRF9QQVJBTVMsCisJLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9CT0FSRF9OT1JfV1JJVEVfUEFSQU1TLAorCS5pc1NtaUV4dGVybmFsUHAJCT0gTVZfVFJVRSwKKwkuc21pRXh0ZXJuYWxQcEluZGV4CQk9IDEsCisJLmlzU2RNbWNDb25uZWN0ZWQJCT0gTVZfVFJVRSwKKwkuY29uZmlnQXV0b0RldGVjdAkJPSBNVl9GQUxTRQkvKiBFbmFibGUgbW9kdWxlcyBhdXRvLWRldGVjdGlvbi4gKi8KK307CisKKworTVZfQk9BUkRfSU5GTyAqY3VzdG9tZXJCT0JLQm9hcmRJbmZvVGJsW10gPSB7CisJJmJvYmtfY2V0dXNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvLAorCSZib2JrX2NhZWx1bV9jdXN0b21lcl9ib2FyZF8xX0luZm8sCit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCUFsbGV5Y2F0MyBib2FyZCAtIEJhc2VkIG9uIEJPQkNBVDItREItRFgKQEAgLTIwNyw4ICs0MzcsOCBAQAogCiBNVl9CT0FSRF9NQUNfSU5GTyBhbGxleWNhdDNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmRNYWNJbmZvW10gPSB7CiAvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIwO319ICovCi0Je0JPQVJEX01BQ19TUEVFRF9BVVRPLCAtMSwgLTEgfSwKLQl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIC0xLCAtMSB9CisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAtMSwgLTEsIE1WX1RSVUV9LAorCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgLTEsIC0xLCBNVl9UUlVFfQogfTsKIAogTVZfQk9BUkRfTU9EVUxFX1RZUEVfSU5GTyBhbGxleWNhdDNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmRNb2RUeXBlSW5mb1tdID0gewpAQCAtMjE4LDEyICs0NDgsMTcgQEAKIH07CiAKIE1WX0RFVl9DU19JTkZPIGFsbGV5Y2F0M19jdXN0b21lcl9ib2FyZF8wX0luZm9Cb2FyZERlQ3NJbmZvW10gPSB7Ci0JLyp7ZGV2aWNlQ1MsIHBhcmFtcywgZGV2VHlwZSwgZGV2V2lkdGgsIGJ1c1dpZHRoIH0qLworCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNXaWR0aCwgYnVzTnVtLCBhY3RpdmUgfSovCiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKLQl7U1BJX0NTMCwgTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILCA4LCA4fSwgLyogU1BJIERFViAqLworCXtTUElfQ1MwLCBOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9LCAvKiBTUEkgREVWICovCiAjZW5kaWYKLSNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTk9SKQotCXtERVZfQk9PQ1MsIE5fQSwgQk9BUkRfREVWX05PUl9GTEFTSCwgMTYsIDE2fSAvKiBOT1IgREVWICovCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX05PUikgJiYgZGVmaW5lZChNVl9JTkNMVURFX05BTkQpCisJe0RFVklDRV9DUzAsIE5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9LCAvKiBOQU5EIERFViAqLworCXtERVZfQk9PQ1MsIE5fQSwgQk9BUkRfREVWX05PUl9GTEFTSCwgMTYsIDE2LCAwLCBNVl9UUlVFfSAvKiBOT1IgREVWICovCisjZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTkFORCkKKwl7REVWSUNFX0NTMCwgTl9BLCBCT0FSRF9ERVZfTkFORF9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0gLyogTkFORCBERVYgKi8KKyNlbGlmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpCisJe0RFVl9CT09DUywgTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILCAxNiwgMTYsIDAsIE1WX1RSVUV9IC8qIE5PUiBERVYgKi8KICNlbmRpZgogfTsKIApAQCAtMjc5LDcgKzUxNCw4IEBACiAJLm5hbmRGbGFzaENvbnRyb2wJCT0gQUxMRVlDQVQzX0NVU1RPTUVSXzBfQk9BUkRfTkFORF9DT05UUk9MLAogCS8qIE5PUiBpbml0IHBhcmFtcyAqLwogCS5ub3JGbGFzaFJlYWRQYXJhbXMJCT0gQUxMRVlDQVQzX0NVU1RPTUVSXzBfQk9BUkRfTk9SX1JFQURfUEFSQU1TLAotCS5ub3JGbGFzaFdyaXRlUGFyYW1zCQk9IEFMTEVZQ0FUM19DVVNUT01FUl8wX0JPQVJEX05PUl9XUklURV9QQVJBTVMKKwkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBBTExFWUNBVDNfQ1VTVE9NRVJfMF9CT0FSRF9OT1JfV1JJVEVfUEFSQU1TLAorCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX0ZBTFNFCS8qIEVuYWJsZSBtb2R1bGVzIGF1dG8tZGV0ZWN0aW9uLiAqLwogfTsKIAogTVZfQk9BUkRfSU5GTyAqY3VzdG9tZXJBQzNCb2FyZEluZm9UYmxbXSA9IHsKQEAgLTMxNiw4ICs1NTIsOCBAQAogCiBNVl9CT0FSRF9NQUNfSU5GTyBkYl9keF9iYzJJbmZvQm9hcmRNYWNJbmZvW10gPSB7CiAJLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLwotCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgLTEsIC0xIH0sCi0Je0JPQVJEX01BQ19TUEVFRF9BVVRPLCAtMSwgLTEgfSwKKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIC0xLCAtMSwgTVZfVFJVRX0sCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAtMSwgLTEsIE1WX1RSVUV9LAogfTsKIAogTVZfQk9BUkRfTU9EVUxFX1RZUEVfSU5GTyBkYl9keF9iYzJJbmZvQm9hcmRNb2RUeXBlSW5mb1tdID0gewpAQCAtMzI3LDEyICs1NjMsMTcgQEAKIH07CiAKIE1WX0RFVl9DU19JTkZPIGRiX2R4X2JjMkluZm9Cb2FyZERlQ3NJbmZvW10gPSB7Ci0JLyp7ZGV2aWNlQ1MsIHBhcmFtcywgZGV2VHlwZSwgZGV2V2lkdGgsIGJ1c1dpZHRoIH0qLworCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNXaWR0aCwgYnVzTnVtLCBhY3RpdmUgfSovCiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKLQl7U1BJX0NTMCwgTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILCA4LCA4fSwgLyogU1BJIERFViAqLworCXtTUElfQ1MwLCBOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9LCAvKiBTUEkgREVWICovCiAjZW5kaWYKLSNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTk9SKQotCXtERVZfQk9PQ1MsIE5fQSwgQk9BUkRfREVWX05PUl9GTEFTSCwgOCwgOH0gLyogTk9SIERFViAqLworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpICYmIGRlZmluZWQoTVZfSU5DTFVERV9OQU5EKQorCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSwgLyogTkFORCBERVYgKi8KKwl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNiwgMCwgTVZfVFJVRX0gLyogTk9SIERFViAqLworI2VsaWYgZGVmaW5lZChNVl9JTkNMVURFX05BTkQpCisJe0RFVklDRV9DUzAsIE5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9IC8qIE5BTkQgREVWICovCisjZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTk9SKQorCXtERVZfQk9PQ1MsIE5fQSwgQk9BUkRfREVWX05PUl9GTEFTSCwgMTYsIDE2LCAwLCBNVl9UUlVFfSAvKiBOT1IgREVWICovCiAjZW5kaWYKIH07CiAKQEAgLTM5Myw3ICs2MzQsMTIgQEAKIAkubmFuZEZsYXNoQ29udHJvbAkJPSBEQl9EWF9CQzJfQk9BUkRfTkFORF9DT05UUk9MLAogCS8qIE5PUiBpbml0IHBhcmFtcyAqLwogCS5ub3JGbGFzaFJlYWRQYXJhbXMJCT0gREJfRFhfQkMyX0JPQVJEX05PUl9SRUFEX1BBUkFNUywKLQkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9CQzJfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUworCS5ub3JGbGFzaFdyaXRlUGFyYW1zCQk9IERCX0RYX0JDMl9CT0FSRF9OT1JfV1JJVEVfUEFSQU1TLAorCS5tb2RlbE5hbWUJCQk9ICJCb2JDYXQyIERldmVsb3BtZW50IEJvYXJkIiwKKwkuaXNTbWlFeHRlcm5hbFBwCQk9IE1WX0ZBTFNFLAorCS5pc1NkTW1jQ29ubmVjdGVkCQk9IE1WX1RSVUUsCisJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfVFJVRSwJLyogRW5hYmxlIG1vZHVsZXMgYXV0by1kZXRlY3Rpb24uICovCisJLmlzQ20zCQkJCT0gTVZfVFJVRQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MDcsOCArNjUzLDcgQEAKIAogTVZfQk9BUkRfTUFDX0lORk8gcmRfZHhfYmMySW5mb0JvYXJkTWFjSW5mb1tdID0gewogCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsIE1WXzMyIGJvYXJkRXRoU21pQWRkcjA7fX0gKi8KLQl7Qk9BUkRfTUFDX1NQRUVEXzEwMDBNLCAweDAsIDB4MCB9LAotCXtCT0FSRF9NQUNfU1BFRURfMTAwME0sIDB4MSwgMHgxIH0sCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCiB9OwogCiBNVl9CT0FSRF9NT0RVTEVfVFlQRV9JTkZPIHJkX2R4X2JjMkluZm9Cb2FyZE1vZFR5cGVJbmZvW10gPSB7CkBAIC00MTgsOSArNjYzLDEyIEBACiB9OwogCiBNVl9ERVZfQ1NfSU5GTyByZF9keF9iYzJJbmZvQm9hcmREZUNzSW5mb1tdID0gewotCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRofSovCisJLyp7ZGV2aWNlQ1MsIHBhcmFtcywgZGV2VHlwZSwgZGV2V2lkdGgsIGJ1c051bSwgYWN0aXZlfSovCiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKLQl7U1BJX0NTMCwgTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILCA4fSAvKiBTUEkgREVWICovCisJe1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0sIC8qIFNQSSBERVYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OQU5EKQorCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSAvKiBOQU5EIERFViAqLwogI2VuZGlmCiB9OwogCkBAIC00NzMsNyArNzIxLDEyIEBACiAJIC8qIE5BTkQgaW5pdCBwYXJhbXMgKi8KIAkubmFuZEZsYXNoUmVhZFBhcmFtcwkJPSBSRF9EWF9CQzJfQk9BUkRfTkFORF9SRUFEX1BBUkFNUywKIAkubmFuZEZsYXNoV3JpdGVQYXJhbXMJCT0gUkRfRFhfQkMyX0JPQVJEX05BTkRfV1JJVEVfUEFSQU1TLAotCS5uYW5kRmxhc2hDb250cm9sCQk9IFJEX0RYX0JDMl9CT0FSRF9OQU5EX0NPTlRST0wKKwkubmFuZEZsYXNoQ29udHJvbAkJPSBSRF9EWF9CQzJfQk9BUkRfTkFORF9DT05UUk9MLAorCS5tb2RlbE5hbWUJCQk9ICJCb2JDYXQyIFJlZmVyZW5jZSBEZXNpZ24gQm9hcmQiLAorCS5pc1NtaUV4dGVybmFsUHAJCT0gTVZfRkFMU0UsCisJLmlzU2RNbWNDb25uZWN0ZWQJCT0gTVZfVFJVRSwKKwkuY29uZmlnQXV0b0RldGVjdAkJPSBNVl9UUlVFLAkvKiBFbmFibGUgbW9kdWxlcyBhdXRvLWRldGVjdGlvbi4gKi8KKwkuaXNDbTMJCQkJPSBNVl9UUlVFCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ4NSwxMCArNzM4LDE1IEBACiAvKk5BTkQgY2FyZSBzdXBwb3J0IGZvciBzbWFsbCBwYWdlIGNoaXBzKi8KICNkZWZpbmUgUkRfTVRMX0JDMl9CT0FSRF9OQU5EX0NPTlRST0wJCQkweDAxYzAwNTQzCiAKK01WX0JPQVJEX1RXU0lfSU5GTwliYzJfcmRfbXRsSW5mb0JvYXJkVHdzaURldltdID0geworLyoge3tNVl9CT0FSRF9ERVZfQ0xBU1MJZGV2Q2xhc3MsIE1WX1U4CXR3c2lEZXZBZGRyLCBNVl9VOCB0d3NpRGV2QWRkclR5cGV9fSAqLworCXtCT0FSRF9ERVZfVFdTSV9QTEQsIDB4NzcsIEFERFI3X0JJVH0sCQkJCS8qIEFjY2VzcyB0byBjb250cm9sIFBMRCByZWcgZmlsZSAqLworCXtCT0FSRF9ERVZfVFdTSV9JTklUX0VQUk9NLCAweDUwLCBBRERSN19CSVR9LAkJLyogU2VyaWFsIEluaSBFUFJPTQkqLworfTsKKwogTVZfQk9BUkRfTUFDX0lORk8gYmMyX3JkX210bEluZm9Cb2FyZE1hY0luZm9bXSA9IHsKIAkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIwO319ICovCi0Je0JPQVJEX01BQ19TUEVFRF8xMDAwTSwgMHgwLCAweDAgfSwKLQl7Qk9BUkRfTUFDX1NQRUVEXzEwMDBNLCAweDEsIDB4MSB9LAorCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDAsIE1WX1RSVUV9LAogfTsKIAogTVZfQk9BUkRfTU9EVUxFX1RZUEVfSU5GTyBiYzJfcmRfbXRsSW5mb0JvYXJkTW9kVHlwZUluZm9bXSA9IHsKQEAgLTQ5OCw5ICs3NTYsMTIgQEAKIH07CiAKIE1WX0RFVl9DU19JTkZPIGJjMl9yZF9tdGxJbmZvQm9hcmREZUNzSW5mb1tdID0gewotCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRofSovCisJLyp7ZGV2aWNlQ1MsIHBhcmFtcywgZGV2VHlwZSwgZGV2V2lkdGgsIGJ1c051bSwgYWN0aXZlfSovCiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKLQl7U1BJX0NTMCwgTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILCA4fSAvKiBTUEkgREVWICovCisJe1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0sIC8qIFNQSSBERVYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OQU5EKQorCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSAvKiBOQU5EIERFViAqLwogI2VuZGlmCiB9OwogCkBAIC01MTUsMjQgKzc3NiwyNCBAQAogfTsKIAogTVZfQk9BUkRfSU5GTyBiYzJfcmRfbXRsSW5mbyA9IHsKLQkuYm9hcmROYW1lCQkJPSAiUkQtQkMyLU1UTC1Qb0UtMlFTRlAtNlNGUCIsCisJLmJvYXJkTmFtZQkJCQkJPSAiUkQtTVRMLUJDMi00OEctMTJYRzJYTEciLAogCS5udW1Cb2FyZE1wcFR5cGVWYWx1ZQkJPSBBUlJTWihiYzJfcmRfbXRsSW5mb0JvYXJkTW9kVHlwZUluZm8pLAotCS5wQm9hcmRNb2RUeXBlVmFsdWUJCT0gYmMyX3JkX210bEluZm9Cb2FyZE1vZFR5cGVJbmZvLAorCS5wQm9hcmRNb2RUeXBlVmFsdWUJCQk9IGJjMl9yZF9tdGxJbmZvQm9hcmRNb2RUeXBlSW5mbywKIAkubnVtQm9hcmRNcHBDb25maWdWYWx1ZQkJPSBBUlJTWihiYzJfcmRfbXRsSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUpLAogCS5wQm9hcmRNcHBDb25maWdWYWx1ZQkJPSBiYzJfcmRfbXRsSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUsCiAJLmludHNHcHBNYXNrTG93CQkJPSAwLAogCS5pbnRzR3BwTWFza01pZAkJCT0gMCwKIAkuaW50c0dwcE1hc2tIaWdoCQk9IDAsCiAJLm51bUJvYXJkRGV2aWNlSWYJCT0gQVJSU1ooYmMyX3JkX210bEluZm9Cb2FyZERlQ3NJbmZvKSwKLQkucERldkNzSW5mbwkJCT0gYmMyX3JkX210bEluZm9Cb2FyZERlQ3NJbmZvLAotCS5udW1Cb2FyZFR3c2lEZXYJCT0gMCwKLQkucEJvYXJkVHdzaURldgkJCT0gTlVMTCwKKwkucERldkNzSW5mbwkJCQk9IGJjMl9yZF9tdGxJbmZvQm9hcmREZUNzSW5mbywKKwkubnVtQm9hcmRUd3NpRGV2CQk9IEFSUlNaKGJjMl9yZF9tdGxJbmZvQm9hcmRUd3NpRGV2KSwKKwkucEJvYXJkVHdzaURldgkJCT0gYmMyX3JkX210bEluZm9Cb2FyZFR3c2lEZXYsCiAJLm51bUJvYXJkTWFjSW5mbwkJPSBBUlJTWihiYzJfcmRfbXRsSW5mb0JvYXJkTWFjSW5mbyksCiAJLnBCb2FyZE1hY0luZm8JCQk9IGJjMl9yZF9tdGxJbmZvQm9hcmRNYWNJbmZvLAogCS5udW1Cb2FyZEdwcEluZm8JCT0gMCwKIAkucEJvYXJkR3BwSW5mbwkJCT0gTlVMTCwKIAkuYWN0aXZlTGVkc051bWJlcgkJPSAwLAotCS5wTGVkR3BwUGluCQkJPSBOVUxMLAorCS5wTGVkR3BwUGluCQkJCT0gTlVMTCwKIAkubGVkc1BvbGFyaXR5CQkJPSAwLAogCiAJLyogR1BQIHZhbHVlcyAqLwpAQCAtNTUxLDkgKzgxMiwzMzkgQEAKIAkuc3dpdGNoSW5mb051bSA9IDAsCiAKIAkvKiBOQU5EIGluaXQgcGFyYW1zICovCi0JLm5hbmRGbGFzaFJlYWRQYXJhbXMJCT0gUkRfTVRMX0JDMl9CT0FSRF9OQU5EX1JFQURfUEFSQU1TLAotCS5uYW5kRmxhc2hXcml0ZVBhcmFtcwkJPSBSRF9NVExfQkMyX0JPQVJEX05BTkRfV1JJVEVfUEFSQU1TLAotCS5uYW5kRmxhc2hDb250cm9sCQk9IFJEX01UTF9CQzJfQk9BUkRfTkFORF9DT05UUk9MCisJLm5hbmRGbGFzaFJlYWRQYXJhbXMJPSBSRF9NVExfQkMyX0JPQVJEX05BTkRfUkVBRF9QQVJBTVMsCisJLm5hbmRGbGFzaFdyaXRlUGFyYW1zCT0gUkRfTVRMX0JDMl9CT0FSRF9OQU5EX1dSSVRFX1BBUkFNUywKKwkubmFuZEZsYXNoQ29udHJvbAkJPSBSRF9NVExfQkMyX0JPQVJEX05BTkRfQ09OVFJPTCwKKwkubW9kZWxOYW1lCQkJPSAiQm9iQ2F0MiBSZWZlcmVuY2UgRGVzaWduIEJvYXJkIiwKKwkuaXNTbWlFeHRlcm5hbFBwCQk9IE1WX0ZBTFNFLAorCS5pc1NkTW1jQ29ubmVjdGVkCQk9IE1WX1RSVUUsCisJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfVFJVRSwJLyogRW5hYmxlIG1vZHVsZXMgYXV0by1kZXRlY3Rpb24uICovCisJLmlzQ20zCQkJCT0gTVZfVFJVRQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQk9CSy1DRVRVUy1EQi05OERYNDIzNS0xMlhHIEJPQVJEICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgREJfRFhfQk9CS19CT0FSRF9OQU5EX1JFQURfUEFSQU1TCTB4MDAwQzAyODIKKyNkZWZpbmUgREJfRFhfQk9CS19CT0FSRF9OQU5EX1dSSVRFX1BBUkFNUwkweDAwMDEwMzA1CisvKk5BTkQgY2FyZSBzdXBwb3J0IGZvciBzbWFsbCBwYWdlIGNoaXBzKi8KKyNkZWZpbmUgREJfRFhfQk9CS19CT0FSRF9OQU5EX0NPTlRST0wJCTB4MDFjMDA1NDMKKworI2RlZmluZSBEQl9EWF9CT0JLX0JPQVJEX05PUl9SRUFEX1BBUkFNUwkweDQwM0UwN0NGCisjZGVmaW5lIERCX0RYX0JPQktfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUwkweDAwMEYwRjBGCisKKy8qIFRPRE8gKi8KK01WX0JPQVJEX1RXU0lfSU5GTwlkYl9keF9ib2JrQ2V0dXNJbmZvQm9hcmRUd3NpRGV2W10gPSB7CisvKiB7e01WX0JPQVJEX0RFVl9DTEFTUwlkZXZDbGFzcywgTVZfVTgJdHdzaURldkFkZHIsIE1WX1U4IHR3c2lEZXZBZGRyVHlwZX19ICovCisJe0JPQVJEX0RFVl9UV1NJX1BMRCwgMHgxOCwgQUREUjdfQklUfSwJCS8qIEFjY2VzcyB0byBjb250cm9sIFBMRCByZWcgZmlsZSAqLworCXtCT0FSRF9ERVZfVFdTSV9aQVJMSU5LLCAweDFCLCBBRERSN19CSVR9LAkJLyogQWNjZXNzIHRvIFphcmxpbmsJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0QywgQUREUjdfQklUfSwgICAgICAgICAvKiBTYXRSIGJpb3MgMAkJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0RCwgQUREUjdfQklUfSwgICAgICAgICAvKiBTYXRSIGJpb3MgMQkJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0RSwgQUREUjdfQklUfSwgICAgICAgICAgLyogU2F0UiBiaW9zIDIJCSovCisJe0JPQVJEX0RFVl9UV1NJX1NBVFIsIDB4NEYsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFNhdFIgYmlvcyAzCQkqLworCXtCT0FSRF9ERVZfVFdTSV9JTklUX0VQUk9NLCAweDUwLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBTZXJpYWwgSW5pdCBFUFJPTQkqLworCXtCT0FSRF9ERVZfVFdTSV9QQ0E5NTQ4X0lPX01VWCwgMHg3MCwgQUREUjdfQklUfSwgICAgICAgICAgLyogUENBOTU0OCBJMkMgbXV4IDAJKi8KKwl7Qk9BUkRfREVWX1RXU0lfUENBOTU0OF9JT19NVVgsIDB4NzEsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFBDQTk1NDggSTJDIG11eCAxCSovCisJe0JPQVJEX0RFVl9UV1NJX1BDQTk1NDhfSU9fTVVYLCAweDc1LCBBRERSN19CSVR9ICAgICAgICAgIC8qIFBDQTk1NDggSTJDIG11eCAyCSovCit9OworCitNVl9CT0FSRF9NQUNfSU5GTyBkYl9keF9ib2JrQ2V0dXNJbmZvQm9hcmRNYWNJbmZvW10gPSB7CisJLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLworCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgLTEsIC0xLCBNVl9GQUxTRX0sCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCit9OworCitNVl9CT0FSRF9NT0RVTEVfVFlQRV9JTkZPIGRiX2R4X2JvYmtDZXR1c0luZm9Cb2FyZE1vZFR5cGVJbmZvW10gPSB7CisJeworCQkuYm9hcmRNcHBNb2QJCT0gTVZfQk9BUkRfQVVUTywKKwl9Cit9OworCisvKiBUTyBERSAqLworTVZfREVWX0NTX0lORk8gZGJfZHhfYm9ia0NldHVzSW5mb0JvYXJkRGVDc0luZm9bXSA9IHsKKwkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aCwgYnVzV2lkdGggfSovCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKKwl7U1BJX0NTMCwgTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSwgLyogU1BJIERFViAqLworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX05PUikKKwl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNiwgMCwgTVZfVFJVRX0gLyogTk9SIERFViAqLworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX05BTkQpCisJe0RFVklDRV9DUzAsIE5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9IC8qIE5BTkQgREVWICovCisjZW5kaWYKK307CisKK01WX0JPQVJEX01QUF9JTkZPIGRiX2R4X2JvYmtDZXR1c0luZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlW10gPSB7CisJeyB7CisjaWYgZGVmaW5lZChNVl9JTkNMVURFX05PUikKKwlEQl9EWF9CT0JLX0NFVFVTX05PUl9NUFAwXzcsCisJREJfRFhfQk9CS19DRVRVU19OT1JfTVBQOF8xNSwKKyNlbHNlCisJREJfRFhfQk9CS19DRVRVU19NUFAwXzcsCisJREJfRFhfQk9CS19DRVRVU19NUFA4XzE1LAorI2VuZGlmCisJREJfRFhfQk9CS19DRVRVU19NUFAxNl8yMywKKwlEQl9EWF9CT0JLX0NFVFVTX01QUDI0XzMxLAorCURCX0RYX0JPQktfQ0VUVVNfTVBQMzJfMzksCisJfSB9LAorfTsKKworTVZfQk9BUkRfSU5GTyBkYl9keF9ib2JrQ2V0dXNJbmZvID0geworCS5ib2FyZE5hbWUJCQk9ICJEQi05OERYNDIzNS0xMlhHIiwKKwkubnVtQm9hcmRNcHBUeXBlVmFsdWUJCT0gQVJSU1ooZGJfZHhfYm9ia0NldHVzSW5mb0JvYXJkTW9kVHlwZUluZm8pLAorCS5wQm9hcmRNb2RUeXBlVmFsdWUJCT0gZGJfZHhfYm9ia0NldHVzSW5mb0JvYXJkTW9kVHlwZUluZm8sCisJLm51bUJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gQVJSU1ooZGJfZHhfYm9ia0NldHVzSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUpLAorCS5wQm9hcmRNcHBDb25maWdWYWx1ZQkJPSBkYl9keF9ib2JrQ2V0dXNJbmZvQm9hcmRNcHBDb25maWdWYWx1ZSwKKwkuaW50c0dwcE1hc2tMb3cJCQk9IDAsCisJLmludHNHcHBNYXNrTWlkCQkJPSAwLAorCS5pbnRzR3BwTWFza0hpZ2gJCT0gMCwKKwkubnVtQm9hcmREZXZpY2VJZgkJPSBBUlJTWihkYl9keF9ib2JrQ2V0dXNJbmZvQm9hcmREZUNzSW5mbyksCisJLnBEZXZDc0luZm8JCQk9IGRiX2R4X2JvYmtDZXR1c0luZm9Cb2FyZERlQ3NJbmZvLAorCS5udW1Cb2FyZFR3c2lEZXYJCT0gQVJSU1ooZGJfZHhfYm9ia0NldHVzSW5mb0JvYXJkVHdzaURldiksCisJLnBCb2FyZFR3c2lEZXYJCQk9IGRiX2R4X2JvYmtDZXR1c0luZm9Cb2FyZFR3c2lEZXYsCisJLm51bUJvYXJkTWFjSW5mbwkJPSBBUlJTWihkYl9keF9ib2JrQ2V0dXNJbmZvQm9hcmRNYWNJbmZvKSwKKwkucEJvYXJkTWFjSW5mbwkJCT0gZGJfZHhfYm9ia0NldHVzSW5mb0JvYXJkTWFjSW5mbywKKwkubnVtQm9hcmRHcHBJbmZvCQk9IDAsCisJLnBCb2FyZEdwcEluZm8JCQk9IE5VTEwsCisJLmFjdGl2ZUxlZHNOdW1iZXIJCT0gMCwKKwkucExlZEdwcFBpbgkJCT0gTlVMTCwKKwkubGVkc1BvbGFyaXR5CQkJPSAwLAorCisJLyogR1BQIHZhbHVlcyAqLworCS5ncHBPdXRFblZhbExvdwkJCT0gREJfRFhfQk9CS19DRVRVU19HUFBfT1VUX0VOQV9MT1csCisJLmdwcE91dEVuVmFsTWlkCQkJPSBEQl9EWF9CT0JLX0NFVFVTX0dQUF9PVVRfRU5BX01JRCwKKwkuZ3BwT3V0RW5WYWxIaWdoCQk9IDAsCisJLmdwcE91dFZhbExvdwkJCT0gREJfRFhfQk9CS19DRVRVU19HUFBfT1VUX1ZBTF9MT1csCisJLmdwcE91dFZhbE1pZAkJCT0gREJfRFhfQk9CS19DRVRVU19HUFBfT1VUX1ZBTF9NSUQsCisJLmdwcE91dFZhbEhpZ2gJCQk9IDAsCisJLmdwcFBvbGFyaXR5VmFsTG93CQk9IERCX0RYX0JPQktfQ0VUVVNfR1BQX1BPTF9MT1csCisJLmdwcFBvbGFyaXR5VmFsTWlkCQk9IERCX0RYX0JPQktfQ0VUVVNfR1BQX1BPTF9NSUQsCisJLmdwcFBvbGFyaXR5VmFsSGlnaAkJPSAwLAorCisJLyogRXh0ZXJuYWwgU3dpdGNoIENvbmZpZ3VyYXRpb24gKi8KKwkucFN3aXRjaEluZm8gPSBOVUxMLAorCS5zd2l0Y2hJbmZvTnVtID0gMCwKKworCS8qIE5BTkQgaW5pdCBwYXJhbXMgKi8KKwkubmFuZEZsYXNoUmVhZFBhcmFtcwkJPSBEQl9EWF9CT0JLX0JPQVJEX05BTkRfUkVBRF9QQVJBTVMsCisJLm5hbmRGbGFzaFdyaXRlUGFyYW1zCQk9IERCX0RYX0JPQktfQk9BUkRfTkFORF9XUklURV9QQVJBTVMsCisJLm5hbmRGbGFzaENvbnRyb2wJCT0gREJfRFhfQk9CS19CT0FSRF9OQU5EX0NPTlRST0wsCisJLyogTk9SIGluaXQgcGFyYW1zICovCisJLm5vckZsYXNoUmVhZFBhcmFtcwkJPSBEQl9EWF9CT0JLX0JPQVJEX05PUl9SRUFEX1BBUkFNUywKKwkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9CT0JLX0JPQVJEX05PUl9XUklURV9QQVJBTVMsCisJLmlzU21pRXh0ZXJuYWxQcAkJPSBNVl9UUlVFLAorCS5zbWlFeHRlcm5hbFBwSW5kZXgJCT0gMCwKKwkubW9kZWxOYW1lCQkJPSAiQm9iSyBDZXR1cyBEZXZlbG9wbWVudCBCb2FyZCIsCisJLmlzU2RNbWNDb25uZWN0ZWQJCT0gTVZfVFJVRSwKKwkuY29uZmlnQXV0b0RldGVjdAkJPSBNVl9UUlVFLAkvKiBFbmFibGUgbW9kdWxlcyBhdXRvLWRldGVjdGlvbi4gKi8KKwkuaXNDbTMJCQkJPSBNVl9UUlVFCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQk9CSy1DQUVMVU0tREItOThEWDQyMDMtNDhHMTJYRyBCT0FSRCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitNVl9CT0FSRF9UV1NJX0lORk8JZGJfZHhfYm9ia0NhZWx1bUluZm9Cb2FyZFR3c2lEZXZbXSA9IHsKKy8qIHt7TVZfQk9BUkRfREVWX0NMQVNTCWRldkNsYXNzLCBNVl9VOAl0d3NpRGV2QWRkciwgTVZfVTggdHdzaURldkFkZHJUeXBlfX0gKi8KKwl7Qk9BUkRfREVWX1RXU0lfUExELCAweDE4LCBBRERSN19CSVR9LAkJLyogQWNjZXNzIHRvIGNvbnRyb2wgUExEIHJlZyBmaWxlICovCisJe0JPQVJEX0RFVl9UV1NJX1pBUkxJTkssIDB4MUIsIEFERFI3X0JJVH0sCQkvKiBBY2Nlc3MgdG8gWmFybGluawkqLworCXtCT0FSRF9ERVZfVFdTSV9TQVRSLCAweDRDLCBBRERSN19CSVR9LCAgICAgICAgIC8qIFNhdFIgYmlvcyAwCQkqLworCXtCT0FSRF9ERVZfVFdTSV9TQVRSLCAweDRELCBBRERSN19CSVR9LCAgICAgICAgIC8qIFNhdFIgYmlvcyAxCQkqLworCXtCT0FSRF9ERVZfVFdTSV9TQVRSLCAweDRFLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBTYXRSIGJpb3MgMgkJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0RiwgQUREUjdfQklUfSwgICAgICAgICAgLyogU2F0UiBiaW9zIDMJCSovCisJe0JPQVJEX0RFVl9UV1NJX0lOSVRfRVBST00sIDB4NTAsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFNlcmlhbCBJbml0IEVQUk9NCSovCisJe0JPQVJEX0RFVl9UV1NJX1BDQTk1NTVfSU9fRVhQQU5ERVIsIDB4MjAsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFFzZ21paS9zZnAgbXV4IGNvbnRyb2wgUENBOTU1NSBJTyBleHBhbmRlciAqLworCXtCT0FSRF9ERVZfVFdTSV9QQ0E5NTQ4X0lPX01VWCwgMHg3MCwgQUREUjdfQklUfSwgICAgICAgICAgLyogUENBOTU0OCBJMkMgbXV4IDAJKi8KKwl7Qk9BUkRfREVWX1RXU0lfUENBOTU0OF9JT19NVVgsIDB4NzEsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFBDQTk1NDggSTJDIG11eCAxCSovCisJe0JPQVJEX0RFVl9UV1NJX1BDQTk1NDhfSU9fTVVYLCAweDc1LCBBRERSN19CSVR9ICAgICAgICAgIC8qIFBDQTk1NDggSTJDIG11eCAyCSovCit9OworCitNVl9CT0FSRF9NQUNfSU5GTyBkYl9keF9ib2JrQ2FlbHVtSW5mb0JvYXJkTWFjSW5mb1tdID0geworCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsIE1WXzMyIGJvYXJkRXRoU21pQWRkcjA7fX0gKi8KKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIC0xLCAtMSwgTVZfRkFMU0V9LAorCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDAsIE1WX1RSVUV9LAorfTsKKworTVZfQk9BUkRfTU9EVUxFX1RZUEVfSU5GTyBkYl9keF9ib2JrQ2FlbHVtSW5mb0JvYXJkTW9kVHlwZUluZm9bXSA9IHsKKwl7CisJCS5ib2FyZE1wcE1vZAkJPSBNVl9CT0FSRF9BVVRPLAorCX0KK307CisKKy8qIFRPIERFICovCitNVl9ERVZfQ1NfSU5GTyBkYl9keF9ib2JrQ2FlbHVtSW5mb0JvYXJkRGVDc0luZm9bXSA9IHsKKwkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aCwgYnVzV2lkdGggfSovCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKKwl7U1BJX0NTMCwgTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSwgLyogU1BJIERFViAqLworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX05PUikKKwl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNiwgMCwgTVZfVFJVRX0gLyogTk9SIERFViAqLworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX05BTkQpCisJe0RFVklDRV9DUzAsIE5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9IC8qIE5BTkQgREVWICovCisjZW5kaWYKK307CisKK01WX0JPQVJEX01QUF9JTkZPIGRiX2R4X2JvYmtDYWVsdW1JbmZvQm9hcmRNcHBDb25maWdWYWx1ZVtdID0geworCXsgeworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpCisJREJfRFhfQk9CS19DQUVMVU1fTk9SX01QUDBfNywKKwlEQl9EWF9CT0JLX0NBRUxVTV9OT1JfTVBQOF8xNSwKKyNlbHNlCisJREJfRFhfQk9CS19DQUVMVU1fTVBQMF83LAorCURCX0RYX0JPQktfQ0FFTFVNX01QUDhfMTUsCisjZW5kaWYKKwlEQl9EWF9CT0JLX0NBRUxVTV9NUFAxNl8yMywKKwlEQl9EWF9CT0JLX0NBRUxVTV9NUFAyNF8zMSwKKwlEQl9EWF9CT0JLX0NBRUxVTV9NUFAzMl8zOSwKKwl9IH0sCit9OworCitNVl9CT0FSRF9JTkZPIGRiX2R4X2JvYmtDYWVsdW1JbmZvID0geworCS5ib2FyZE5hbWUJCQk9ICJEQi05OERYNDIwMy00OEcxMlhHIiwKKwkubnVtQm9hcmRNcHBUeXBlVmFsdWUJCT0gQVJSU1ooZGJfZHhfYm9ia0NhZWx1bUluZm9Cb2FyZE1vZFR5cGVJbmZvKSwKKwkucEJvYXJkTW9kVHlwZVZhbHVlCQk9IGRiX2R4X2JvYmtDYWVsdW1JbmZvQm9hcmRNb2RUeXBlSW5mbywKKwkubnVtQm9hcmRNcHBDb25maWdWYWx1ZQkJPSBBUlJTWihkYl9keF9ib2JrQ2FlbHVtSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUpLAorCS5wQm9hcmRNcHBDb25maWdWYWx1ZQkJPSBkYl9keF9ib2JrQ2FlbHVtSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUsCisJLmludHNHcHBNYXNrTG93CQkJPSAwLAorCS5pbnRzR3BwTWFza01pZAkJCT0gMCwKKwkuaW50c0dwcE1hc2tIaWdoCQk9IDAsCisJLm51bUJvYXJkRGV2aWNlSWYJCT0gQVJSU1ooZGJfZHhfYm9ia0NhZWx1bUluZm9Cb2FyZERlQ3NJbmZvKSwKKwkucERldkNzSW5mbwkJCT0gZGJfZHhfYm9ia0NhZWx1bUluZm9Cb2FyZERlQ3NJbmZvLAorCS5udW1Cb2FyZFR3c2lEZXYJCT0gQVJSU1ooZGJfZHhfYm9ia0NhZWx1bUluZm9Cb2FyZFR3c2lEZXYpLAorCS5wQm9hcmRUd3NpRGV2CQkJPSBkYl9keF9ib2JrQ2FlbHVtSW5mb0JvYXJkVHdzaURldiwKKwkubnVtQm9hcmRNYWNJbmZvCQk9IEFSUlNaKGRiX2R4X2JvYmtDYWVsdW1JbmZvQm9hcmRNYWNJbmZvKSwKKwkucEJvYXJkTWFjSW5mbwkJCT0gZGJfZHhfYm9ia0NhZWx1bUluZm9Cb2FyZE1hY0luZm8sCisJLm51bUJvYXJkR3BwSW5mbwkJPSAwLAorCS5wQm9hcmRHcHBJbmZvCQkJPSBOVUxMLAorCS5hY3RpdmVMZWRzTnVtYmVyCQk9IDAsCisJLnBMZWRHcHBQaW4JCQk9IE5VTEwsCisJLmxlZHNQb2xhcml0eQkJCT0gMCwKKworCS8qIEdQUCB2YWx1ZXMgKi8KKwkuZ3BwT3V0RW5WYWxMb3cJCQk9IERCX0RYX0JPQktfQ0FFTFVNX0dQUF9PVVRfRU5BX0xPVywKKwkuZ3BwT3V0RW5WYWxNaWQJCQk9IERCX0RYX0JPQktfQ0FFTFVNX0dQUF9PVVRfRU5BX01JRCwKKwkuZ3BwT3V0RW5WYWxIaWdoCQk9IDAsCisJLmdwcE91dFZhbExvdwkJCT0gREJfRFhfQk9CS19DQUVMVU1fR1BQX09VVF9WQUxfTE9XLAorCS5ncHBPdXRWYWxNaWQJCQk9IERCX0RYX0JPQktfQ0FFTFVNX0dQUF9PVVRfVkFMX01JRCwKKwkuZ3BwT3V0VmFsSGlnaAkJCT0gMCwKKwkuZ3BwUG9sYXJpdHlWYWxMb3cJCT0gREJfRFhfQk9CS19DQUVMVU1fR1BQX1BPTF9MT1csCisJLmdwcFBvbGFyaXR5VmFsTWlkCQk9IERCX0RYX0JPQktfQ0FFTFVNX0dQUF9QT0xfTUlELAorCS5ncHBQb2xhcml0eVZhbEhpZ2gJCT0gMCwKKworCS8qIEV4dGVybmFsIFN3aXRjaCBDb25maWd1cmF0aW9uICovCisJLnBTd2l0Y2hJbmZvID0gTlVMTCwKKwkuc3dpdGNoSW5mb051bSA9IDAsCisKKwkvKiBOQU5EIGluaXQgcGFyYW1zICovCisJLm5hbmRGbGFzaFJlYWRQYXJhbXMJCT0gREJfRFhfQk9CS19CT0FSRF9OQU5EX1JFQURfUEFSQU1TLAorCS5uYW5kRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9CT0JLX0JPQVJEX05BTkRfV1JJVEVfUEFSQU1TLAorCS5uYW5kRmxhc2hDb250cm9sCQk9IERCX0RYX0JPQktfQk9BUkRfTkFORF9DT05UUk9MLAorCS8qIE5PUiBpbml0IHBhcmFtcyAqLworCS5ub3JGbGFzaFJlYWRQYXJhbXMJCT0gREJfRFhfQk9CS19CT0FSRF9OT1JfUkVBRF9QQVJBTVMsCisJLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gREJfRFhfQk9CS19CT0FSRF9OT1JfV1JJVEVfUEFSQU1TLAorCS5pc1NtaUV4dGVybmFsUHAJCT0gTVZfVFJVRSwKKwkuc21pRXh0ZXJuYWxQcEluZGV4CQk9IDEsCisJLm1vZGVsTmFtZQkJCT0gIkJvYksgQ2FlbHVtIERldmVsb3BtZW50IEJvYXJkIiwKKwkuaXNTZE1tY0Nvbm5lY3RlZAkJPSBNVl9UUlVFLAorCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCS8qIEVuYWJsZSBtb2R1bGVzIGF1dG8tZGV0ZWN0aW9uLiAqLworCS5pc0NtMwkJCQk9IE1WX1RSVUUKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCT0JLLUxFV0lTLVJELUxXUy0xMlhHLUEgQk9BUkQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitNVl9CT0FSRF9UV1NJX0lORk8JcmRfZHhfYm9ia0xld2lzSW5mb0JvYXJkVHdzaURldltdID0geworLyoge3tNVl9CT0FSRF9ERVZfQ0xBU1MJZGV2Q2xhc3MsIE1WX1U4CXR3c2lEZXZBZGRyLCBNVl9VOCB0d3NpRGV2QWRkclR5cGV9fSAqLworCXtCT0FSRF9ERVZfVFdTSV9JTklUX0VQUk9NLCAweDUwLCBBRERSN19CSVR9LAkvKiBTZXJpYWwgSW5pdCBFUFJPTQkqLworfTsKKworCitNVl9CT0FSRF9NQUNfSU5GTyByZF9keF9ib2JrTGV3aXNJbmZvQm9hcmRNYWNJbmZvW10gPSB7CisvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIwO319ICovCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAtMSwgLTEsIE1WX0ZBTFNFfSwKKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9UUlVFfSwKK307CisKK01WX0JPQVJEX01PRFVMRV9UWVBFX0lORk8gcmRfZHhfYm9ia0xld2lzSW5mb0JvYXJkTW9kVHlwZUluZm9bXSA9IHsKKwl7CisJCS5ib2FyZE1wcE1vZAkJPSBNVl9CT0FSRF9BVVRPLAorCX0KK307CisKKy8qIFRPIERFICovCitNVl9ERVZfQ1NfSU5GTyByZF9keF9ib2JrTGV3aXNJbmZvQm9hcmREZUNzSW5mb1tdID0geworCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNXaWR0aCB9Ki8KKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQorCXtTUElfQ1MwLCBOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9LCAvKiBTUEkgREVWICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTkFORCkKKwl7REVWSUNFX0NTMCwgTl9BLCBCT0FSRF9ERVZfTkFORF9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0gLyogTkFORCBERVYgKi8KKyNlbmRpZgorfTsKKworTVZfQk9BUkRfTVBQX0lORk8gcmRfZHhfYm9ia0xld2lzSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWVbXSA9IHsKKwl7IHsKKwlSRF9EWF9CT0JLX0xFV0lTX01QUDBfNywKKwlSRF9EWF9CT0JLX0xFV0lTX01QUDhfMTUsCisJUkRfRFhfQk9CS19MRVdJU19NUFAxNl8yMywKKwlSRF9EWF9CT0JLX0xFV0lTX01QUDI0XzMxLAorCVJEX0RYX0JPQktfTEVXSVNfTVBQMzJfMzksCisJfSB9LAorfTsKKworTVZfQk9BUkRfSU5GTyByZF9keF9ib2JrTGV3aXNJbmZvID0geworCS5ib2FyZE5hbWUJCQk9ICJSRC1MV1MtMTJYRy1BIiwKKwkubnVtQm9hcmRNcHBUeXBlVmFsdWUJCT0gQVJSU1oocmRfZHhfYm9ia0xld2lzSW5mb0JvYXJkTW9kVHlwZUluZm8pLAorCS5wQm9hcmRNb2RUeXBlVmFsdWUJCT0gcmRfZHhfYm9ia0xld2lzSW5mb0JvYXJkTW9kVHlwZUluZm8sCisJLm51bUJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gQVJSU1oocmRfZHhfYm9ia0xld2lzSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUpLAorCS5wQm9hcmRNcHBDb25maWdWYWx1ZQkJPSByZF9keF9ib2JrTGV3aXNJbmZvQm9hcmRNcHBDb25maWdWYWx1ZSwKKwkuaW50c0dwcE1hc2tMb3cJCQk9IDAsCisJLmludHNHcHBNYXNrTWlkCQkJPSAwLAorCS5pbnRzR3BwTWFza0hpZ2gJCT0gMCwKKwkubnVtQm9hcmREZXZpY2VJZgkJPSBBUlJTWihyZF9keF9ib2JrTGV3aXNJbmZvQm9hcmREZUNzSW5mbyksCisJLnBEZXZDc0luZm8JCQk9IHJkX2R4X2JvYmtMZXdpc0luZm9Cb2FyZERlQ3NJbmZvLAorCS5udW1Cb2FyZFR3c2lEZXYJCT0gQVJSU1oocmRfZHhfYm9ia0xld2lzSW5mb0JvYXJkVHdzaURldiksCisJLnBCb2FyZFR3c2lEZXYJCQk9IHJkX2R4X2JvYmtMZXdpc0luZm9Cb2FyZFR3c2lEZXYsCisJLm51bUJvYXJkTWFjSW5mbwkJPSBBUlJTWihyZF9keF9ib2JrTGV3aXNJbmZvQm9hcmRNYWNJbmZvKSwKKwkucEJvYXJkTWFjSW5mbwkJCT0gcmRfZHhfYm9ia0xld2lzSW5mb0JvYXJkTWFjSW5mbywKKwkubnVtQm9hcmRHcHBJbmZvCQk9IDAsCisJLnBCb2FyZEdwcEluZm8JCQk9IE5VTEwsCisJLmFjdGl2ZUxlZHNOdW1iZXIJCT0gMCwKKwkucExlZEdwcFBpbgkJCT0gTlVMTCwKKwkubGVkc1BvbGFyaXR5CQkJPSAwLAorCisJLyogR1BQIHZhbHVlcyAqLworCS5ncHBPdXRFblZhbExvdwkJCT0gUkRfRFhfQk9CS19MRVdJU19HUFBfT1VUX0VOQV9MT1csCisJLmdwcE91dEVuVmFsTWlkCQkJPSBSRF9EWF9CT0JLX0xFV0lTX0dQUF9PVVRfRU5BX01JRCwKKwkuZ3BwT3V0RW5WYWxIaWdoCQk9IDAsCisJLmdwcE91dFZhbExvdwkJCT0gUkRfRFhfQk9CS19MRVdJU19HUFBfT1VUX1ZBTF9MT1csCisJLmdwcE91dFZhbE1pZAkJCT0gUkRfRFhfQk9CS19MRVdJU19HUFBfT1VUX1ZBTF9NSUQsCisJLmdwcE91dFZhbEhpZ2gJCQk9IDAsCisJLmdwcFBvbGFyaXR5VmFsTG93CQk9IFJEX0RYX0JPQktfTEVXSVNfR1BQX1BPTF9MT1csCisJLmdwcFBvbGFyaXR5VmFsTWlkCQk9IFJEX0RYX0JPQktfTEVXSVNfR1BQX1BPTF9NSUQsCisJLmdwcFBvbGFyaXR5VmFsSGlnaAkJPSAwLAorCisJLyogRXh0ZXJuYWwgU3dpdGNoIENvbmZpZ3VyYXRpb24gKi8KKwkucFN3aXRjaEluZm8gPSBOVUxMLAorCS5zd2l0Y2hJbmZvTnVtID0gMCwKKworCS8qIE5BTkQgaW5pdCBwYXJhbXMgKi8KKwkubmFuZEZsYXNoUmVhZFBhcmFtcwkJPSBEQl9EWF9CT0JLX0JPQVJEX05BTkRfUkVBRF9QQVJBTVMsCisJLm5hbmRGbGFzaFdyaXRlUGFyYW1zCQk9IERCX0RYX0JPQktfQk9BUkRfTkFORF9XUklURV9QQVJBTVMsCisJLm5hbmRGbGFzaENvbnRyb2wJCT0gREJfRFhfQk9CS19CT0FSRF9OQU5EX0NPTlRST0wsCisJLyogTk9SIGluaXQgcGFyYW1zICovCisJLm5vckZsYXNoUmVhZFBhcmFtcwkJPSBEQl9EWF9CT0JLX0JPQVJEX05PUl9SRUFEX1BBUkFNUywKKwkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9CT0JLX0JPQVJEX05PUl9XUklURV9QQVJBTVMsCisJLmlzU21pRXh0ZXJuYWxQcAkJPSBNVl9UUlVFLAorCS5zbWlFeHRlcm5hbFBwSW5kZXgJCT0gMCwKKwkubW9kZWxOYW1lCQkJPSAiQm9iSyBMZXdpcyBSZWZlcmVuY2UgRGVzaWduIEJvYXJkIiwKKwkuaXNTZE1tY0Nvbm5lY3RlZAkJPSBNVl9UUlVFCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTg0LDggKzExNzUsOCBAQAogCiBNVl9CT0FSRF9NQUNfSU5GTyBkYl9keF9hYzNJbmZvQm9hcmRNYWNJbmZvW10gPSB7CiAvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIwO319ICovCi0Je0JPQVJEX01BQ19TUEVFRF9BVVRPLCAtMSwgLTEgfSwKLQl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIC0xLCAtMSB9CisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAtMSwgLTEsIE1WX1RSVUV9LAorCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgLTEsIC0xLCBNVl9UUlVFfQogfTsKIAogTVZfQk9BUkRfTU9EVUxFX1RZUEVfSU5GTyBkYl9keF9hYzNJbmZvQm9hcmRNb2RUeXBlSW5mb1tdID0gewpAQCAtNTk1LDEyICsxMTg2LDE3IEBACiB9OwogCiBNVl9ERVZfQ1NfSU5GTyBkYl9keF9hYzNJbmZvQm9hcmREZUNzSW5mb1tdID0gewotCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNXaWR0aCB9Ki8KKwkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aCwgYnVzV2lkdGgsIGJ1c051bSwgYWN0aXZlIH0qLwogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCi0Je1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOCwgOH0sIC8qIFNQSSBERVYgKi8KKwl7U1BJX0NTMCwgTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSwgLyogU1BJIERFViAqLwogI2VuZGlmCi0jaWYgZGVmaW5lZChNVl9JTkNMVURFX05PUikKLQl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNn0gLyogTk9SIERFViAqLworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpICYmIGRlZmluZWQoTVZfSU5DTFVERV9OQU5EKQorCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSwgLyogTkFORCBERVYgKi8KKwl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNiwgMCwgTVZfVFJVRX0gLyogTk9SIERFViAqLworI2VsaWYgZGVmaW5lZChNVl9JTkNMVURFX05BTkQpCisJe0RFVklDRV9DUzAsIE5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9IC8qIE5BTkQgREVWICovCisjZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTk9SKQorCXtERVZfQk9PQ1MsIE5fQSwgQk9BUkRfREVWX05PUl9GTEFTSCwgMTYsIDE2LCAwLCBNVl9UUlVFfSAvKiBOT1IgREVWICovCiAjZW5kaWYKIH07CiAKQEAgLTY1Niw3ICsxMjUyLDEwIEBACiAJLm5hbmRGbGFzaENvbnRyb2wJCT0gREJfRFhfQUMzX0JPQVJEX05BTkRfQ09OVFJPTCwKIAkvKiBOT1IgaW5pdCBwYXJhbXMgKi8KIAkubm9yRmxhc2hSZWFkUGFyYW1zCQk9IERCX0RYX0FDM19CT0FSRF9OT1JfUkVBRF9QQVJBTVMsCi0JLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gREJfRFhfQUMzX0JPQVJEX05PUl9XUklURV9QQVJBTVMKKwkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9BQzNfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUywKKwkuY29uZmlnQXV0b0RldGVjdAkJPSBNVl9UUlVFLAkvKiBFbmFibGUgbW9kdWxlcyBhdXRvLWRldGVjdGlvbi4gKi8KKwkubW9kZWxOYW1lCQkJPSAiQWxsZXlDYXQzIERldmVsb3BtZW50IEJvYXJkIiwKKwkuaXNTbWlFeHRlcm5hbFBwCQk9IE1WX0ZBTFNFCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzE1LDcgKzEzMTQsMTAgQEAKIAkubmFuZEZsYXNoQ29udHJvbAkJPSBEQl9EWF9BQzNfQk9BUkRfTkFORF9DT05UUk9MLAogCS8qIE5PUiBpbml0IHBhcmFtcyAqLwogCS5ub3JGbGFzaFJlYWRQYXJhbXMJCT0gREJfRFhfQUMzX0JPQVJEX05PUl9SRUFEX1BBUkFNUywKLQkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9BQzNfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUworCS5ub3JGbGFzaFdyaXRlUGFyYW1zCQk9IERCX0RYX0FDM19CT0FSRF9OT1JfV1JJVEVfUEFSQU1TLAorCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCS8qIEVuYWJsZSBtb2R1bGVzIGF1dG8tZGV0ZWN0aW9uLiAqLworCS5tb2RlbE5hbWUJCQk9ICJBbGxleUNhdDMgUmVmZXJlbmNlIERlc2lnbiBCb2FyZCIsCisJLmlzU21pRXh0ZXJuYWxQcAkJPSBNVl9GQUxTRQogfTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03NzMsMTIgKzEzNzUsMTUgQEAKIAkubmFuZEZsYXNoQ29udHJvbAkJPSBEQl9EWF9BQzNfQk9BUkRfTkFORF9DT05UUk9MLAogCS8qIE5PUiBpbml0IHBhcmFtcyAqLwogCS5ub3JGbGFzaFJlYWRQYXJhbXMJCT0gREJfRFhfQUMzX0JPQVJEX05PUl9SRUFEX1BBUkFNUywKLQkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9BQzNfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUworCS5ub3JGbGFzaFdyaXRlUGFyYW1zCQk9IERCX0RYX0FDM19CT0FSRF9OT1JfV1JJVEVfUEFSQU1TLAorCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCS8qIEVuYWJsZSBtb2R1bGVzIGF1dG8tZGV0ZWN0aW9uLiAqLworCS5tb2RlbE5hbWUJCQk9ICJBbGxleUNhdDMgUmVmZXJlbmNlIERlc2lnbiBCb2FyZCIsCisJLmlzU21pRXh0ZXJuYWxQcAkJPSBNVl9GQUxTRQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEFMTEVZQ0FUMy1EQi1NSVNMLTI0RyBCT0FSRCAgICAgKi8KKy8qIEFMTEVZQ0FUMy1SRC1NVEwtMlhYRy0yWEcgQk9BUkQgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX0JPQVJEX01QUF9JTkZPIGRiX21pc2xfMjRHXzQ2X2FjM0luZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlW10gPSB7CiAJeyB7CkBAIC03OTEsMTEgKzEzOTYsMTEgQEAKIH07CiAKIE1WX0JPQVJEX0lORk8gZGJfbWlzbF8yNEdfNHhnX2FjM0luZm8gPSB7Ci0JLmJvYXJkTmFtZQkJCQk9ICJEQi1YQzMtMjRHLTRHIiwKLQkubnVtQm9hcmRNcHBUeXBlVmFsdWUJPSBBUlJTWihkYl9keF9hYzNJbmZvQm9hcmRNb2RUeXBlSW5mbyksCisJLmJvYXJkTmFtZQkJCT0gIkRCLVhDMy0yNEctNEciLAorCS5udW1Cb2FyZE1wcFR5cGVWYWx1ZQkJPSBBUlJTWihkYl9keF9hYzNJbmZvQm9hcmRNb2RUeXBlSW5mbyksCiAJLnBCb2FyZE1vZFR5cGVWYWx1ZQkJPSBkYl9keF9hYzNJbmZvQm9hcmRNb2RUeXBlSW5mbywKLQkubnVtQm9hcmRNcHBDb25maWdWYWx1ZQk9IEFSUlNaKGRiX21pc2xfMjRHXzQ2X2FjM0luZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlKSwKLQkucEJvYXJkTXBwQ29uZmlnVmFsdWUJPSBkYl9taXNsXzI0R180Nl9hYzNJbmZvQm9hcmRNcHBDb25maWdWYWx1ZSwKKwkubnVtQm9hcmRNcHBDb25maWdWYWx1ZQkJPSBBUlJTWihkYl9taXNsXzI0R180Nl9hYzNJbmZvQm9hcmRNcHBDb25maWdWYWx1ZSksCisJLnBCb2FyZE1wcENvbmZpZ1ZhbHVlCQk9IGRiX21pc2xfMjRHXzQ2X2FjM0luZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlLAogCS5pbnRzR3BwTWFza0xvdwkJCT0gMCwKIAkuaW50c0dwcE1hc2tNaWQJCQk9IDAsCiAJLmludHNHcHBNYXNrSGlnaAkJPSAwLApAQCAtODMyLDcgKzE0MzcsMTAgQEAKIAkubmFuZEZsYXNoQ29udHJvbAkJCT0gREJfRFhfQUMzX0JPQVJEX05BTkRfQ09OVFJPTCwKIAkvKiBOT1IgaW5pdCBwYXJhbXMgKi8KIAkubm9yRmxhc2hSZWFkUGFyYW1zCQkJPSBEQl9EWF9BQzNfQk9BUkRfTk9SX1JFQURfUEFSQU1TLAotCS5ub3JGbGFzaFdyaXRlUGFyYW1zCQk9IERCX0RYX0FDM19CT0FSRF9OT1JfV1JJVEVfUEFSQU1TCisJLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gREJfRFhfQUMzX0JPQVJEX05PUl9XUklURV9QQVJBTVMsCisJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfVFJVRSwJLyogRW5hYmxlIG1vZHVsZXMgYXV0by1kZXRlY3Rpb24uICovCisJLm1vZGVsTmFtZQkJCT0gIkFsbGV5Q2F0MyBSZWZlcmVuY2UgRGVzaWduIEJvYXJkIiwKKwkuaXNTbWlFeHRlcm5hbFBwCQk9IE1WX0ZBTFNFCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODYyLDggKzE0NzAsOCBAQAogCS5wRGV2Q3NJbmZvCQkJCT0gZGJfZHhfYWMzSW5mb0JvYXJkRGVDc0luZm8sCiAJLm51bUJvYXJkVHdzaURldgkJPSBBUlJTWihkYl9keF9hYzNJbmZvQm9hcmRUd3NpRGV2KSwKIAkucEJvYXJkVHdzaURldgkJCT0gZGJfZHhfYWMzSW5mb0JvYXJkVHdzaURldiwKLQkubnVtQm9hcmRNYWNJbmZvCQk9IDAsCi0JLnBCb2FyZE1hY0luZm8JCQk9IE5VTEwsCisJLm51bUJvYXJkTWFjSW5mbwkJPSBBUlJTWihkYl9keF9hYzNJbmZvQm9hcmRNYWNJbmZvKSwKKwkucEJvYXJkTWFjSW5mbwkJCT0gZGJfZHhfYWMzSW5mb0JvYXJkTWFjSW5mbywKIAkubnVtQm9hcmRHcHBJbmZvCQk9IDAsCiAJLnBCb2FyZEdwcEluZm8JCQk9IE5VTEwsCiAJLmFjdGl2ZUxlZHNOdW1iZXIJCT0gMCwKQEAgLTg4MiwxOCArMTQ5MCwxMjIgQEAKIAkuZ3BwUG9sYXJpdHlWYWxIaWdoCQk9IDAsCiAKIAkvKiBFeHRlcm5hbCBTd2l0Y2ggQ29uZmlndXJhdGlvbiAqLwotCS5wU3dpdGNoSW5mbwkJCT0gTlVMTCwKLQkuc3dpdGNoSW5mb051bQkJCT0gMCwKKwkucFN3aXRjaEluZm8gPSBOVUxMLAorCS5zd2l0Y2hJbmZvTnVtID0gMCwKIAogCS8qIE5BTkQgaW5pdCBwYXJhbXMgKi8KLQkubmFuZEZsYXNoUmVhZFBhcmFtcwk9IERCX0RYX0FDM19CT0FSRF9OQU5EX1JFQURfUEFSQU1TLAotCS5uYW5kRmxhc2hXcml0ZVBhcmFtcwk9IERCX0RYX0FDM19CT0FSRF9OQU5EX1dSSVRFX1BBUkFNUywKKwkubmFuZEZsYXNoUmVhZFBhcmFtcwkJPSBEQl9EWF9BQzNfQk9BUkRfTkFORF9SRUFEX1BBUkFNUywKKwkubmFuZEZsYXNoV3JpdGVQYXJhbXMJCT0gREJfRFhfQUMzX0JPQVJEX05BTkRfV1JJVEVfUEFSQU1TLAogCS5uYW5kRmxhc2hDb250cm9sCQk9IERCX0RYX0FDM19CT0FSRF9OQU5EX0NPTlRST0wsCiAJLyogTk9SIGluaXQgcGFyYW1zICovCiAJLm5vckZsYXNoUmVhZFBhcmFtcwkJPSBEQl9EWF9BQzNfQk9BUkRfTk9SX1JFQURfUEFSQU1TLAotCS5ub3JGbGFzaFdyaXRlUGFyYW1zCT0gREJfRFhfQUMzX0JPQVJEX05PUl9XUklURV9QQVJBTVMKKwkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9BQzNfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUywKKwkuY29uZmlnQXV0b0RldGVjdAkJPSBNVl9UUlVFLAkvKiBFbmFibGUgbW9kdWxlcyBhdXRvLWRldGVjdGlvbi4gKi8KKwkubW9kZWxOYW1lCQkJPSAiQWxsZXlDYXQzIFJlZmVyZW5jZSBEZXNpZ24gQm9hcmQiLAorCS5pc1NtaUV4dGVybmFsUHAJCT0gTVZfRkFMU0UKIH07CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBUk1BREEtWFAgQU1DIEJPQVJEIC0gIG9ubHkgZm9yIExpbnV4IHVzYWdlIChBWFAgZmFtaWx5IGlzIHNoYXJlZCB3aXRoIE1TWVMgaW4gTFNQKSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgREJfNzhYNjBfQU1DX0JPQVJEX05BTkRfUkVBRF9QQVJBTVMJCTB4MDAwQzAyODIKKyNkZWZpbmUgREJfNzhYNjBfQU1DX0JPQVJEX05BTkRfV1JJVEVfUEFSQU1TCQkweDAwMDEwMzA1CisvKk5BTkQgY2FyZSBzdXBwb3J0IGZvciBzbWFsbCBwYWdlIGNoaXBzKi8KKyNkZWZpbmUgREJfNzhYNjBfQU1DX0JPQVJEX05BTkRfQ09OVFJPTAkJCTB4MDFjMDA1NDMKKworTVZfVTgJZGI3OFg2MGFtY0luZm9Cb2FyZERlYnVnTGVkSWZbXSA9IHs1MywgNTQsIDU1LCA1Nn07IC8qIDcgc2VnbWVudCBNUFBzKi8KKworTVZfQk9BUkRfVFdTSV9JTkZPCWRiNzhYNjBhbWNJbmZvQm9hcmRUd3NpRGV2W10gPSB7CisJLyogTm8gVFdTSSBkZXZpY2VzIG9uIGJvYXJkKi8KK307CisKK01WX0JPQVJEX01BQ19JTkZPIGRiNzhYNjBhbWNJbmZvQm9hcmRNYWNJbmZvW10gPSB7CisJLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQJYm9hcmRNYWNTcGVlZCwgTVZfVTggYm9hcmRFdGhTbWlBZGRyfX0gKi8KKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MSwgMHgwLCBNVl9UUlVFfSwKKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4RCwgMHgwLCBNVl9UUlVFfSwKKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4QywgMHgwLCBNVl9UUlVFfSwKKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9UUlVFfQorfTsKKworCitNVl9CT0FSRF9NT0RVTEVfVFlQRV9JTkZPIGRiNzhYNjBhbWNJbmZvQm9hcmRNb2RUeXBlSW5mb1tdID0geworCS8qIE5vIE1vZHVsZXMgKi8KK307CisKK01WX0JPQVJEX0dQUF9JTkZPIGRiNzhYNjBhbWNJbmZvQm9hcmRHcHBJbmZvW10gPSB7CisJLyoge3tNVl9CT0FSRF9HUFBfQ0xBU1MJZGV2Q2xhc3MsIE1WX1U4CWdwcFBpbk51bX19ICovCisJe0JPQVJEX0dQUF9VU0JfVkJVUywgICAgNDZ9IC8qIGZyb20gTVBQIG1hcCAqLworfTsKKworTVZfREVWX0NTX0lORk8gZGI3OFg2MGFtY0luZm9Cb2FyZERlQ3NJbmZvW10gPSB7CisJLyp7ZGV2aWNlQ1MsIHBhcmFtcywgZGV2VHlwZSwgZGV2V2lkdGh9Ki8KKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQorCXtTUElfQ1MwX0FYUCwgTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSwgLyogU1BJIERFViAqLworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX05BTkQpCisJe0RFVklDRV9DUzAsIE5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9IC8qIE5BTkQgREVWICovCisjZW5kaWYKK307CisKK01WX0JPQVJEX01QUF9JTkZPIGRiNzhYNjBhbWNJbmZvQm9hcmRNcHBDb25maWdWYWx1ZVtdID0geworCXsgeworCQlEQl83OFg2MF9BTUNfTVBQMF83LAorCQlEQl83OFg2MF9BTUNfTVBQOF8xNSwKKwkJREJfNzhYNjBfQU1DX01QUDE2XzIzLAorCQlEQl83OFg2MF9BTUNfTVBQMjRfMzEsCisJCURCXzc4WDYwX0FNQ19NUFAzMl8zOSwKKwkJREJfNzhYNjBfQU1DX01QUDQwXzQ3LAorCQlEQl83OFg2MF9BTUNfTVBQNDhfNTUsCisJCURCXzc4WDYwX0FNQ19NUFA1Nl82MywKKwkJREJfNzhYNjBfQU1DX01QUDY0XzY3LAorCX0gfQorfTsKKworTVZfQk9BUkRfSU5GTyBkYjc4WDYwYW1jSW5mbyA9IHsKKwkuYm9hcmROYW1lCQkJPSAiREItNzg0NjAtQU1DIiwKKwkubnVtQm9hcmRNcHBUeXBlVmFsdWUJCT0gQVJSU1ooZGI3OFg2MGFtY0luZm9Cb2FyZE1vZFR5cGVJbmZvKSwKKwkucEJvYXJkTW9kVHlwZVZhbHVlCQk9IGRiNzhYNjBhbWNJbmZvQm9hcmRNb2RUeXBlSW5mbywKKwkubnVtQm9hcmRNcHBDb25maWdWYWx1ZQkJPSBBUlJTWihkYjc4WDYwYW1jSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUpLAorCS5wQm9hcmRNcHBDb25maWdWYWx1ZQkJPSBkYjc4WDYwYW1jSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUsCisJLmludHNHcHBNYXNrTG93CQkJPSAwLAorCS5pbnRzR3BwTWFza01pZAkJCT0gMCwKKwkuaW50c0dwcE1hc2tIaWdoCQk9IDAsCisJLm51bUJvYXJkRGV2aWNlSWYJCT0gQVJSU1ooZGI3OFg2MGFtY0luZm9Cb2FyZERlQ3NJbmZvKSwKKwkucERldkNzSW5mbwkJCT0gZGI3OFg2MGFtY0luZm9Cb2FyZERlQ3NJbmZvLAorCS5udW1Cb2FyZFR3c2lEZXYJCT0gQVJSU1ooZGI3OFg2MGFtY0luZm9Cb2FyZFR3c2lEZXYpLAorCS5wQm9hcmRUd3NpRGV2CQkJPSBkYjc4WDYwYW1jSW5mb0JvYXJkVHdzaURldiwKKwkubnVtQm9hcmRNYWNJbmZvCQk9IEFSUlNaKGRiNzhYNjBhbWNJbmZvQm9hcmRNYWNJbmZvKSwKKwkucEJvYXJkTWFjSW5mbwkJCT0gZGI3OFg2MGFtY0luZm9Cb2FyZE1hY0luZm8sCisJLm51bUJvYXJkR3BwSW5mbwkJPSBBUlJTWihkYjc4WDYwYW1jSW5mb0JvYXJkR3BwSW5mbyksCisJLnBCb2FyZEdwcEluZm8JCQk9IGRiNzhYNjBhbWNJbmZvQm9hcmRHcHBJbmZvLAorCS5hY3RpdmVMZWRzTnVtYmVyCQk9IEFSUlNaKGRiNzhYNjBhbWNJbmZvQm9hcmREZWJ1Z0xlZElmKSwKKwkucExlZEdwcFBpbgkJCT0gZGI3OFg2MGFtY0luZm9Cb2FyZERlYnVnTGVkSWYsCisJLmxlZHNQb2xhcml0eQkJCT0gMCwKKworCS8qIEdQUCB2YWx1ZXMgKi8KKwkuZ3BwT3V0RW5WYWxMb3cJCQk9IERCXzc4WDYwX0FNQ19HUFBfT1VUX0VOQV9MT1csCisJLmdwcE91dEVuVmFsTWlkCQkJPSBEQl83OFg2MF9BTUNfR1BQX09VVF9FTkFfTUlELAorCS5ncHBPdXRFblZhbEhpZ2gJCT0gREJfNzhYNjBfQU1DX0dQUF9PVVRfRU5BX0hJR0gsCisJLmdwcE91dFZhbExvdwkJCT0gREJfNzhYNjBfQU1DX0dQUF9PVVRfVkFMX0xPVywKKwkuZ3BwT3V0VmFsTWlkCQkJPSBEQl83OFg2MF9BTUNfR1BQX09VVF9WQUxfTUlELAorCS5ncHBPdXRWYWxIaWdoCQkJPSBEQl83OFg2MF9BTUNfR1BQX09VVF9WQUxfSElHSCwKKwkuZ3BwUG9sYXJpdHlWYWxMb3cJCT0gREJfNzhYNjBfQU1DX0dQUF9QT0xfTE9XLAorCS5ncHBQb2xhcml0eVZhbE1pZAkJPSBEQl83OFg2MF9BTUNfR1BQX1BPTF9NSUQsCisJLmdwcFBvbGFyaXR5VmFsSGlnaAkJPSBEQl83OFg2MF9BTUNfR1BQX1BPTF9ISUdILAorCisJLyogRXh0ZXJuYWwgU3dpdGNoIENvbmZpZ3VyYXRpb24gKi8KKwkucFN3aXRjaEluZm8gPSBOVUxMLAorCS5zd2l0Y2hJbmZvTnVtID0gMCwKKworCS8qIE5BTkQgaW5pdCBwYXJhbXMgKi8KKwkubmFuZEZsYXNoUmVhZFBhcmFtcwkJPSBEQl83OFg2MF9BTUNfQk9BUkRfTkFORF9SRUFEX1BBUkFNUywKKwkubmFuZEZsYXNoV3JpdGVQYXJhbXMJCT0gREJfNzhYNjBfQU1DX0JPQVJEX05BTkRfV1JJVEVfUEFSQU1TLAorCS5uYW5kRmxhc2hDb250cm9sCQk9IERCXzc4WDYwX0FNQ19CT0FSRF9OQU5EX0NPTlRST0wsCisJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfVFJVRSwJLyogRW5hYmxlIG1vZHVsZXMgYXV0by1kZXRlY3Rpb24uICovCisJLm1vZGVsTmFtZQkJCT0gIkFNQyBEZXZlbG9wbWVudCBCb2FyZCIKK307CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogTVZfQk9BUkRfSU5GTyAqbWFydmVsbEJDMkJvYXJkSW5mb1RibFtdID0gewpAQCAtOTAyLDYgKzE2MTQsMTIgQEAKIAkmYmMyX3JkX210bEluZm8KIH07CiAKK01WX0JPQVJEX0lORk8gKm1hcnZlbGxCT0JLQm9hcmRJbmZvVGJsW10gPSB7CisJJmRiX2R4X2JvYmtDZXR1c0luZm8sCisJJmRiX2R4X2JvYmtDYWVsdW1JbmZvLAorCSZyZF9keF9ib2JrTGV3aXNJbmZvCit9OworCiBNVl9CT0FSRF9JTkZPICptYXJ2ZWxsQUMzQm9hcmRJbmZvVGJsW10gPSB7CiAJJmRiX2R4X2FjM0luZm8sCiAJJnJkX210bF80eGdfYWMzSW5mbywKQEAgLTkwOSwzICsxNjI3LDggQEAKIAkmZGJfbWlzbF8yNEdfNHhnX2FjM0luZm8sCiAJJnJkX210bF8yNEdfYWMzSW5mbwogfTsKKworLyogb25seSBmb3IgTGludXggdXNhZ2UgKEFYUCBmYW1pbHkgaXMgc2hhcmVkIHdpdGggTVNZUyBpbiBMU1ApICovCitNVl9CT0FSRF9JTkZPICptYXJ2ZWxsQVhQYm9hcmRJbmZvVGJsW10gPSB7CisJJmRiNzhYNjBhbWNJbmZvCit9OwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMuaCBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjLmgKaW5kZXggMzQzNDYyNC4uZmJhNjNkZSAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMuaAorKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYy5oCkBAIC04MCw5ICs4MCw5IEBACiAKIC8qIEJvYmNhdDIgTWFydmVsbCBib2FyZHMgKi8KICNkZWZpbmUgQkMyX01BUlZFTExfQk9BUkRfSURfQkFTRQkweDEwCi0jZGVmaW5lIERCX0RYX0JDMl9JRAkJCQkoQkMyX01BUlZFTExfQk9BUkRfSURfQkFTRSArIDApCi0jZGVmaW5lIFJEX0RYX0JDMl9JRAkJCQkoQkMyX01BUlZFTExfQk9BUkRfSURfQkFTRSArIDEpCi0jZGVmaW5lIFJEX01UTF9CQzIJCQkJCShCQzJfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgMikKKyNkZWZpbmUgREJfRFhfQkMyX0lECQkJKEJDMl9NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyAwKQorI2RlZmluZSBSRF9EWF9CQzJfSUQJCQkoQkMyX01BUlZFTExfQk9BUkRfSURfQkFTRSArIDEpCisjZGVmaW5lIFJEX01UTF9CQzIJCQkoQkMyX01BUlZFTExfQk9BUkRfSURfQkFTRSArIDIpCiAjZGVmaW5lIEJDMl9NQVJWRUxMX01BWF9CT0FSRF9JRAkoQkMyX01BUlZFTExfQk9BUkRfSURfQkFTRSArIDMpCiAjZGVmaW5lIEJDMl9NQVJWRUxMX0JPQVJEX05VTQkJKEJDMl9NQVJWRUxMX01BWF9CT0FSRF9JRCAtIEJDMl9NQVJWRUxMX0JPQVJEX0lEX0JBU0UpCiAKQEAgLTk2LDE3ICs5Niw1MiBAQAogCiAvKiBBbGxleUNhdDMgTWFydmVsbCBib2FyZHMgKi8KICNkZWZpbmUgQUMzX01BUlZFTExfQk9BUkRfSURfQkFTRQkweDMwCi0jZGVmaW5lIERCX0FDM19JRAkJCQkJKEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyAwKQotI2RlZmluZSBSRF9NVExfNFhHX0FDM19JRAkJCShBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgMSkKKyNkZWZpbmUgREJfQUMzX0lECQkJKEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyAwKQorI2RlZmluZSBSRF9NVExfNFhHX0FDM19JRAkJKEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyAxKQogI2RlZmluZSBSRF9NVExfMlhYR18yWEdfQUMzX0lECQkoQUMzX01BUlZFTExfQk9BUkRfSURfQkFTRSArIDIpCiAjZGVmaW5lIERCX01JU0xfMjRHNEdfQUMzX0lECQkoQUMzX01BUlZFTExfQk9BUkRfSURfQkFTRSArIDMpCi0jZGVmaW5lIFJEX01UTF8yNEdfQUMzX0lECQkJKEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyA0KQorI2RlZmluZSBSRF9NVExfMjRHX0FDM19JRAkJKEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyA0KQogI2RlZmluZSBBQzNfTUFSVkVMTF9NQVhfQk9BUkRfSUQJKEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyA1KQogI2RlZmluZSBBQzNfTUFSVkVMTF9CT0FSRF9OVU0JCShBQzNfTUFSVkVMTF9NQVhfQk9BUkRfSUQgLSBBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFKQogCi0jZGVmaW5lIElOVkFMSURfQk9BUkRfSUQJCQkweEZGRkYKKy8qIEJvYksgQ3VzdG9tZXIgQm9hcmRzICovCisjZGVmaW5lIEJPQktfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRQkweDQwCisjZGVmaW5lIEJPQktfQ0VUVVNfQ1VTVE9NRVJfQk9BUkRfSUQwCQkoQk9CS19DVVNUT01FUl9CT0FSRF9JRF9CQVNFICsgMCkKKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfQk9BUkRfSUQxCQkoQk9CS19DVVNUT01FUl9CT0FSRF9JRF9CQVNFICsgMSkKKyNkZWZpbmUgQk9CS19DVVNUT01FUl9NQVhfQk9BUkRfSUQJCQkoQk9CS19DVVNUT01FUl9CT0FSRF9JRF9CQVNFICsgMikKKyNkZWZpbmUgQk9CS19DVVNUT01FUl9CT0FSRF9OVU0JCQkoQk9CS19DVVNUT01FUl9NQVhfQk9BUkRfSUQgLSBCT0JLX0NVU1RPTUVSX0JPQVJEX0lEX0JBU0UpCiAKKy8qIEJvYksgTWFydmVsbCBCb2FyZHMgKi8KKyNkZWZpbmUgQk9CS19NQVJWRUxMX0JPQVJEX0lEX0JBU0UJMHg1MAorI2RlZmluZSBCT0JLX0NFVFVTX0RCX0lECQkJKEJPQktfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgMCkKKyNkZWZpbmUgQk9CS19DQUVMVU1fREJfSUQJCQkoQk9CS19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyAxKQorI2RlZmluZSBCT0JLX0xFV0lTX1JEX0lECQkJKEJPQktfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgMikKKyNkZWZpbmUgQk9CS19NQVJWRUxMX01BWF9CT0FSRF9JRAkJKEJPQktfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgMykKKyNkZWZpbmUgQk9CS19NQVJWRUxMX0JPQVJEX05VTQkJKEJPQktfTUFSVkVMTF9NQVhfQk9BUkRfSUQgLSBCT0JLX01BUlZFTExfQk9BUkRfSURfQkFTRSkKKworLyogQVhQLUFNQyBib2FyZDogZm9yIExpbnV4IDIuNi8zLjQgdXNhZ2Ugb25seSAoQVhQIGZhbWlseSBpcyBzaGFyZWQgd2l0aCBNU1lTIGluIExTUCkgKi8KKyNkZWZpbmUgREJfNzhYNjBfQU1DX0lECQkJMHg2CisKKyNkZWZpbmUgSU5WQUxJRF9CT0FSRF9JRAkJMHhGRkZGCiAjZGVmaW5lIEJPQVJEX0lEX0lOREVYX01BU0sJCTB4MTAJLyogTWFzayB1c2VkIHRvIHJldHVybiBib2FyZCBpbmRleCB2aWEgYm9hcmQgSWQgKi8KKyNkZWZpbmUgUkRfTVRMX0JDMl9QQ0JfSUQJCTB4NzAKKworI2lmIGRlZmluZWQgQ09ORklHX0FMTEVZQ0FUMworCSNkZWZpbmUgTUFSVkVMTF9CT0FSRF9JRF9CQVNFCQlBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFCisJI2RlZmluZSBNVl9NQVhfTUFSVkVMTF9CT0FSRF9JRAkJQUMzX01BUlZFTExfTUFYX0JPQVJEX0lECisJI2RlZmluZSBNVl9NQVJWRUxMX0JPQVJEX05VTQkJQUMzX01BUlZFTExfQk9BUkRfTlVNCisJI2RlZmluZSBNVl9ERUZBVUxUX0JPQVJEX0lECQlEQl9BQzNfSUQKKyNlbGlmIGRlZmluZWQgQ09ORklHX0JPQkNBVDIKKwkjZGVmaW5lIE1BUlZFTExfQk9BUkRfSURfQkFTRQkJQkMyX01BUlZFTExfQk9BUkRfSURfQkFTRQorCSNkZWZpbmUgTVZfTUFYX01BUlZFTExfQk9BUkRfSUQJCUJDMl9NQVJWRUxMX01BWF9CT0FSRF9JRAorCSNkZWZpbmUgTVZfTUFSVkVMTF9CT0FSRF9OVU0JCUJDMl9NQVJWRUxMX0JPQVJEX05VTQorCSNkZWZpbmUgTVZfREVGQVVMVF9CT0FSRF9JRAkJREJfRFhfQkMyX0lECisjZWxzZQorCSNkZWZpbmUgTUFSVkVMTF9CT0FSRF9JRF9CQVNFCQlCT0JLX01BUlZFTExfQk9BUkRfSURfQkFTRQorCSNkZWZpbmUgTVZfTUFYX01BUlZFTExfQk9BUkRfSUQJCUJPQktfTUFSVkVMTF9NQVhfQk9BUkRfSUQKKwkjZGVmaW5lIE1WX01BUlZFTExfQk9BUkRfTlVNCQlCT0JLX01BUlZFTExfQk9BUkRfTlVNCisJI2RlZmluZSBNVl9ERUZBVUxUX0JPQVJEX0lECQlCT0JLX0NFVFVTX0RCX0lECisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlCb2JjYXQyIEJvYXJkcwpAQCAtMjc0LDYgKzMwOSwyMzggQEAKICNkZWZpbmUgUkRfTVRMX0JDMl9HUFBfUE9MX01JRAkJMHgwCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgkJQm9iayBCb2FyZHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEJvYksgQ2V0dXMgQ3VzdG9tZXIgYm9hcmQgLSBCYXNlZCBvbiBCT0JLLUNFVFVTLURCLTk4RFg0MjM1LTEyWEcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQk9CS19DRVRVU19DVVNUT01FUl8wX01QUDBfNwkJMHgyMjI0MjIyMgorI2RlZmluZSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfTVBQOF8xNQkJMHgxMTEyMjIyMgorI2RlZmluZSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfTVBQMTZfMjMJCTB4NDQ0NDQwNDQKKyNkZWZpbmUgQk9CS19DRVRVU19DVVNUT01FUl8wX01QUDI0XzMxCQkweDE0NDQ0NDQ0CisjZGVmaW5lIEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9NUFAzMl8zOQkJMHgwMDAwMDAwMQorCisjZGVmaW5lIEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9HUFBfT1VUX0VOQV9MT1cJKH4oQklUMCB8IEJJVDIgfCBCSVQzIHwgQklUNCB8IEJJVDYgfCBCSVQxMlwKKwkJCQkJCQkgfCBCSVQxMyB8IEJJVDE2IHwgQklUMTcgfCBCSVQyMCB8IEJJVDI5ICB8IEJJVDMwKSkKKyNkZWZpbmUgQk9CS19DRVRVU19DVVNUT01FUl8wX0dQUF9PVVRfRU5BX01JRAkofigwKSkKKworI2RlZmluZSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfR1BQX09VVF9WQUxfTE9XCShCSVQwIHwgQklUMiB8IEJJVDMgfCBCSVQ0IHwgQklUNiB8IEJJVDEyXAorCQkJCQkJCXwgQklUMTMgfCBCSVQxNiB8IEJJVDE3IHwgQklUMjAgfCBCSVQyOSAgfCBCSVQzMCkKKyNkZWZpbmUgQk9CS19DRVRVU19DVVNUT01FUl8wX0dQUF9PVVRfVkFMX01JRAkweDAKKworI2RlZmluZSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfR1BQX1BPTF9MT1cJCTB4MAorI2RlZmluZSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfR1BQX1BPTF9NSUQJCTB4MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBCb2JLIENhZWx1bSBDdXN0b21lciBib2FyZCAtIEJhc2VkIG9uIEJPQkstQ0FFTFVNLURCLTk4RFg0MjAzLTQ4RzEyWEcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9NUFAwXzcJCTB4MjIyNDIyMjIKKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9NUFA4XzE1CQkweDExMTIyMjIyCisjZGVmaW5lIEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfTVBQMTZfMjMJCTB4NDQ0NDQwNDQKKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9NUFAyNF8zMQkJMHgxNDQ0NDQ0NAorI2RlZmluZSBCT0JLX0NBRUxVTV9DVVNUT01FUl8xX01QUDMyXzM5CQkweDAwMDAwMDAxCisKKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9HUFBfT1VUX0VOQV9MT1cJKH4oQklUMCB8IEJJVDIgfCBCSVQzIHwgQklUNCB8IEJJVDYgfCBCSVQxMlwKKwkJCQkJCQkgfCBCSVQxMyB8IEJJVDE2IHwgQklUMTcgfCBCSVQyMCB8IEJJVDI5ICB8IEJJVDMwKSkKKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9HUFBfT1VUX0VOQV9NSUQJKH4oMCkpCisKKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9HUFBfT1VUX1ZBTF9MT1cJKEJJVDAgfCBCSVQyIHwgQklUMyB8IEJJVDQgfCBCSVQ2IHwgQklUMTJcCisJCQkJCQkJfCBCSVQxMyB8IEJJVDE2IHwgQklUMTcgfCBCSVQyMCB8IEJJVDI5ICB8IEJJVDMwKQorI2RlZmluZSBCT0JLX0NBRUxVTV9DVVNUT01FUl8xX0dQUF9PVVRfVkFMX01JRAkweDAKKworI2RlZmluZSBCT0JLX0NBRUxVTV9DVVNUT01FUl8xX0dQUF9QT0xfTE9XCQkweDAKKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9HUFBfUE9MX01JRAkJMHgwCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgQk9CSy1DRVRVUy1EQi05OERYNDIzNS0xMlhHICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBEQl9EWF9CT0JLX0NFVFVTX01QUDBfNwkweDIyMjQyMjIyCisjZGVmaW5lIERCX0RYX0JPQktfQ0VUVVNfTVBQOF8xNQkweDExMTIyMjIyCisjZGVmaW5lIERCX0RYX0JPQktfQ0VUVVNfTVBQMTZfMjMJMHg0NDQ0NDA0NAorI2RlZmluZSBEQl9EWF9CT0JLX0NFVFVTX01QUDI0XzMxCTB4MTQ0NDQ0NDQKKyNkZWZpbmUgREJfRFhfQk9CS19DRVRVU19NUFAzMl8zOQkweDAwMDAwMDAxCisKKyNkZWZpbmUgREJfRFhfQk9CS19DRVRVU19OT1JfTVBQMF83CTB4NDQ0NDQ0NDQKKyNkZWZpbmUgREJfRFhfQk9CS19DRVRVU19OT1JfTVBQOF8xNQkweDExMTIyMjQ0CisKKy8qIEdQUHMKK01QUCMJTkFNRQkJCUlOL09VVAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMAlTUElfTU9TSQkJKG91dCkKKzEJU1BJX01JU08JCShpbikKKzIJU1BJX1NDSwkJCShvdXQpCiszCVNQSV9DUzBuCQkob3V0KQorNAlERVZfQ1NuWzBdCQkob3V0KSBORiBDUyAoQm9vdCkKKzUJU0RfQ01ECQkJKGluL291dCkKKzYJU0RfQ0xLCQkJKG91dCkKKzcJU0RfRFswXQkJCShpbi9vdXQpCis4CVNEX0RbMV0JCQkoaW4vb3V0KQorOQlTRF9EWzJdCQkJKGluL291dCkKKzEwCVNEX0RbM10JCQkoaW4vb3V0KQorMTEJVUFSVDFfUlhECQkoaW4pCisxMglVQVJUMV9UWEQJCShvdXQpCisxMwlJTlRFUlJVUFRfT1VUbgkJKG91dCkKKzE0CUkyQ19TQ0wJCQkoaW4vb3V0KQorMTUJSTJDX1NEQQkJCShpbi9vdXQpCisKKzE2CURFVl9PZW5fTkZfUmVuCQkob3V0KQorMTcJREVWX0NMS19PVVQJCShvdXQpIFRlc3QgcG9pbnQKKzE4CUdQSU9bMThdCQkoaW4vb3V0KSBJTlRfaW4gLyBTRF9XUCAvIFZDMl9HUFAKKzE5CU5GX1JCbgkJCShpbikKKzIwCURFVl9XRW5bMF0JCShvdXQpCisyMQlERVZfQURbMF0JCShpbi9vdXQpCisyMglERVZfQURbMV0JCShpbi9vdXQpCisyMwlERVZfQURbMl0JCShpbi9vdXQpCisyNAlERVZfQURbM10JCShpbi9vdXQpCisyNQlERVZfQURbNF0JCShpbi9vdXQpCisyNglERVZfQURbNV0JCShpbi9vdXQpCisyNwlERVZfQURbNl0JCShpbi9vdXQpCisyOAlERVZfQURbN10JCShpbi9vdXQpCisyOQlORl9DTEVfREVWX0FbMF0JCShvdXQpCiszMAlORl9BTEVfREVWX0FbMV0JCShvdXQpCiszMQlTTFZfU01JX01EQwkJKGluKQorMzIJU0xWX1NNSV9NRElPCQkoaW4vb3V0KQorCisqLworI2RlZmluZSBEQl9EWF9CT0JLX0NFVFVTX0dQUF9PVVRfRU5BX0xPVwkofihCSVQwIHwgQklUMiB8IEJJVDMgfCBCSVQ0IHwgQklUNiB8IEJJVDEyXAorCQkJCQl8IEJJVDEzIHwgQklUMTYgfCBCSVQxNyB8IEJJVDIwIHwgQklUMjkgIHwgQklUMzApKQorI2RlZmluZSBEQl9EWF9CT0JLX0NFVFVTX0dQUF9PVVRfRU5BX01JRAkofigwKSkKKworI2RlZmluZSBEQl9EWF9CT0JLX0NFVFVTX0dQUF9PVVRfVkFMX0xPVwkoQklUMCB8IEJJVDIgfCBCSVQzIHwgQklUNCB8IEJJVDYgfCBCSVQxMlwKKwkJCQkJfCBCSVQxMyB8IEJJVDE2IHwgQklUMTcgfCBCSVQyMCB8IEJJVDI5ICB8IEJJVDMwKQorI2RlZmluZSBEQl9EWF9CT0JLX0NFVFVTX0dQUF9PVVRfVkFMX01JRAkweDAKKworI2RlZmluZSBEQl9EWF9CT0JLX0NFVFVTX0dQUF9QT0xfTE9XCQkweDAKKyNkZWZpbmUgREJfRFhfQk9CS19DRVRVU19HUFBfUE9MX01JRAkJMHgwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICBCT0JLLUNBRUxVTS1EQi05OERYNDIwMy00OEcxMlhHICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgREJfRFhfQk9CS19DQUVMVU1fTVBQMF83CTB4MjIyNDIyMjIKKyNkZWZpbmUgREJfRFhfQk9CS19DQUVMVU1fTVBQOF8xNQkweDExMTIyMjIyCisjZGVmaW5lIERCX0RYX0JPQktfQ0FFTFVNX01QUDE2XzIzCTB4NDQ0NDQwNDQKKyNkZWZpbmUgREJfRFhfQk9CS19DQUVMVU1fTVBQMjRfMzEJMHgxNDQ0NDQ0NAorI2RlZmluZSBEQl9EWF9CT0JLX0NBRUxVTV9NUFAzMl8zOQkweDAwMDAwMDAxCisKKyNkZWZpbmUgREJfRFhfQk9CS19DQUVMVU1fTk9SX01QUDBfNwkweDQ0NDQ0NDQ0CisjZGVmaW5lIERCX0RYX0JPQktfQ0FFTFVNX05PUl9NUFA4XzE1CTB4MTExMjIyNDQKKworLyogR1BQcworTVBQIwlOQU1FCQkJSU4vT1VUCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswCVNQSV9NT1NJCQkob3V0KQorMQlTUElfTUlTTwkJKGluKQorMglTUElfU0NLCQkJKG91dCkKKzMJU1BJX0NTMG4JCShvdXQpCis0CURFVl9DU25bMF0JCShvdXQpIE5GIENTIChCb290KQorNQlTRF9DTUQJCQkoaW4vb3V0KQorNglTRF9DTEsJCQkob3V0KQorNwlTRF9EWzBdCQkJKGluL291dCkKKzgJU0RfRFsxXQkJCShpbi9vdXQpCis5CVNEX0RbMl0JCQkoaW4vb3V0KQorMTAJU0RfRFszXQkJCShpbi9vdXQpCisxMQlVQVJUMV9SWEQJCShpbikKKzEyCVVBUlQxX1RYRAkJKG91dCkKKzEzCUlOVEVSUlVQVF9PVVRuCQkob3V0KQorMTQJSTJDX1NDTAkJCShpbi9vdXQpCisxNQlJMkNfU0RBCQkJKGluL291dCkKKworMTYJREVWX09lbl9ORl9SZW4JCShvdXQpCisxNwlERVZfQ0xLX09VVAkJKG91dCkgVGVzdCBwb2ludAorMTgJR1BJT1sxOF0JCShpbi9vdXQpIElOVF9pbiAvIFNEX1dQIC8gVkMyX0dQUAorMTkJTkZfUkJuCQkJKGluKQorMjAJREVWX1dFblswXQkJKG91dCkKKzIxCURFVl9BRFswXQkJKGluL291dCkKKzIyCURFVl9BRFsxXQkJKGluL291dCkKKzIzCURFVl9BRFsyXQkJKGluL291dCkKKzI0CURFVl9BRFszXQkJKGluL291dCkKKzI1CURFVl9BRFs0XQkJKGluL291dCkKKzI2CURFVl9BRFs1XQkJKGluL291dCkKKzI3CURFVl9BRFs2XQkJKGluL291dCkKKzI4CURFVl9BRFs3XQkJKGluL291dCkKKzI5CU5GX0NMRV9ERVZfQVswXQkJKG91dCkKKzMwCU5GX0FMRV9ERVZfQVsxXQkJKG91dCkKKzMxCVNMVl9TTUlfTURDCQkoaW4pCiszMglTTFZfU01JX01ESU8JCShpbi9vdXQpCisKKyovCisjZGVmaW5lIERCX0RYX0JPQktfQ0FFTFVNX0dQUF9PVVRfRU5BX0xPVwkofihCSVQwIHwgQklUMiB8IEJJVDMgfCBCSVQ0IHwgQklUNiB8IEJJVDEyXAorCQkJCQl8IEJJVDEzIHwgQklUMTYgfCBCSVQxNyB8IEJJVDIwIHwgQklUMjkgIHwgQklUMzApKQorI2RlZmluZSBEQl9EWF9CT0JLX0NBRUxVTV9HUFBfT1VUX0VOQV9NSUQJKH4oMCkpCisKKyNkZWZpbmUgREJfRFhfQk9CS19DQUVMVU1fR1BQX09VVF9WQUxfTE9XCShCSVQwIHwgQklUMiB8IEJJVDMgfCBCSVQ0IHwgQklUNiB8IEJJVDEyXAorCQkJCQl8IEJJVDEzIHwgQklUMTYgfCBCSVQxNyB8IEJJVDIwIHwgQklUMjkgIHwgQklUMzApCisjZGVmaW5lIERCX0RYX0JPQktfQ0FFTFVNX0dQUF9PVVRfVkFMX01JRAkweDAKKworI2RlZmluZSBEQl9EWF9CT0JLX0NBRUxVTV9HUFBfUE9MX0xPVwkJMHgwCisjZGVmaW5lIERCX0RYX0JPQktfQ0FFTFVNX0dQUF9QT0xfTUlECQkweDAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICBCT0JLLUxFV0lTLVJELUxXUy0xMlhHLUEgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFJEX0RYX0JPQktfTEVXSVNfTVBQMF83CTB4MDAwNDIyMjIgLyogMC0zOlNQSSwgNDpORl9DRW4sIDU6U0ZQX0RhdGEsIDY6RElBRyBMRUQsIDc6VFdTSV9TRUwxICovCisjZGVmaW5lIFJEX0RYX0JPQktfTEVXSVNfTVBQOF8xNQkweDExMDAwMDAwIC8qIDg6VFdTSV9TRUwyLDk6U0ZQX1RYLDEwLFRNUF9JTlQsMTE6SU5JVF9Eb25lLDEyOk1QUDEyLAorCQkJCQkJCTEzOlVTQl9PQywxNC0xNTpJMkNfW1NDTEssU0RBXSAqLworI2RlZmluZSBSRF9EWF9CT0JLX0xFV0lTX01QUDE2XzIzCTB4NDQ0NDQwMDQgLyogMTY6TkZfUkVuLCAxNzpUV1NJX1NFTDAsIDE4Ok5BLCAxOS0yMzpORl9bQnVzeSxXRW4sSU9bMCwxLDJdXSAqLworI2RlZmluZSBSRF9EWF9CT0JLX0xFV0lTX01QUDI0XzMxCTB4MTQ0NDQ0NDQgLyogMjQtMzA6IE5GX0lPWzMsNCw1LDYsN10sTkZfQ0xFLE5GX0FMRSwgMzE6IFNNSV9NU1RfTURDKFNNSSkgKi8KKyNkZWZpbmUgUkRfRFhfQk9CS19MRVdJU19NUFAzMl8zOQkweDAwMDAwMDAxIC8qIDMyOiBTTUlfTVNUX01ESU8oU01JKSAqLworCisKKy8qIEdQUHMKK01QUCMJTkFNRQkJCUlOL09VVAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMAlTUElfU0kJCQkoaW4vb3V0KQorMQlTUElfU08JCQkoaW4vb3V0KQorMglTUElfU0NLCQkJKGluL291dCkKKzMJU1BJX0NTMG4JCQkoaW4vb3V0KQorNAlORl9DRW4JCQkoaW4vb3V0KSBOQU5EIEZsYXNoCis1CVNGUF9EYXRhCQkJKGluKQorNglESUFHIExFRAkJCShvdXQpCis3CVRXU0lfU0VMMQkJKG91dCkKKzgJVFdTSV9TRUwyCQkob3V0KQorOQlTRlBfVFhfRElTCQkob3V0KQorMTAJVE1QX0lOVAkJCShpbikKKzExCUlOSVRfRG9uZQkJKGluKQorMTIJTVBQMTIJCQkoTi9BKQorMTMJVVNCX09DCQkJKGluKQorMTQJSTJDX1NDTEsJCQkob3V0KQorMTUJSTJDX1NEQQkJCShpbi9vdXQpCisKKzE2CU5GX1JFbgkJCShpbi9vdXQpTkFORCBGbGFzaAorMTcJVFdTSV9TRUwwCQkob3V0KQorMTgJTkEJCQkoTkEpCisxOQlORl9CdXN5CQkJKGluL291dClOQU5EIEZsYXNoCisyMAlORl9XRW4JCQkoaW4vb3V0KU5BTkQgRmxhc2gKKzIxCU5GX0lPWzBdCQkJKGluL291dClOQU5EIEZsYXNoCisyMglORl9JT1sxXQkJCShpbi9vdXQpTkFORCBGbGFzaAorMjMJTkZfSU9bMl0JCQkoaW4vb3V0KU5BTkQgRmxhc2gKKzI0CU5GX0lPWzNdCQkJKGluL291dClOQU5EIEZsYXNoCisyNQlORl9JT1s0XQkJCShpbi9vdXQpTkFORCBGbGFzaAorMjYJTkZfSU9bNV0JCQkoaW4vb3V0KU5BTkQgRmxhc2gKKzI3CU5GX0lPWzZdCQkJKGluL291dClOQU5EIEZsYXNoCisyOAlORl9JT1s3XQkJCShpbi9vdXQpTkFORCBGbGFzaAorMjkJTkZfQ0xFCQkJKGluL291dClOQU5EIEZsYXNoCiszMAlORl9BTEUJCQkoaW4vb3V0KU5BTkQgRmxhc2gKKzMxCVNNSV9NU1RfTURDCQkob3V0KQorMzIJU01JX01TVF9NRElPCQkoaW4vb3V0KQorCisqLworI2RlZmluZSBSRF9EWF9CT0JLX0xFV0lTX0dQUF9PVVRfRU5BX0xPVwkofihCSVQwIHwgQklUMiB8IEJJVDMgfCBCSVQ0IHwgQklUNiB8IEJJVDcgfCBCSVQ4XAorCQkJCQl8IEJJVDkgfCBCSVQxNCB8IEJJVDE3IHwgQklUMzEpKQorI2RlZmluZSBSRF9EWF9CT0JLX0xFV0lTX0dQUF9PVVRfRU5BX01JRAkofigwKSkKKworI2RlZmluZSBSRF9EWF9CT0JLX0xFV0lTX0dQUF9PVVRfVkFMX0xPVwkofihCSVQwIHwgQklUMiB8IEJJVDMgfCBCSVQ0IHwgQklUNiB8IEJJVDlcCisJCQkJCXwgQklUMTQgfCBCSVQxNyB8IEJJVDMxKSkKKyNkZWZpbmUgUkRfRFhfQk9CS19MRVdJU19HUFBfT1VUX1ZBTF9NSUQJMHgwCisKKyNkZWZpbmUgUkRfRFhfQk9CS19MRVdJU19HUFBfUE9MX0xPVwkJMHgwCisjZGVmaW5lIFJEX0RYX0JPQktfTEVXSVNfR1BQX1BPTF9NSUQJCTB4MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFsbGV5Q2F0MyBCb2FyZHMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MjQsOCArNjkxLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgIFJEX0RYXzJYWEdfMlhHX0FDMyAoTVRMMikgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgUkRfTVRMXzJYWEdfMlhHX0FDM19NUFAwXzcJCQkJUkRfTVRMXzRYR19BQzNfTVBQMF83Ci0jZGVmaW5lIFJEX01UTF8yWFhHXzJYR19BQzNfTVBQOF8xNQkJCQlSRF9NVExfNFhHX0FDM19NUFA4XzE1CisjZGVmaW5lIFJEX01UTF8yWFhHXzJYR19BQzNfTVBQMF83CQkJUkRfTVRMXzRYR19BQzNfTVBQMF83CisjZGVmaW5lIFJEX01UTF8yWFhHXzJYR19BQzNfTVBQOF8xNQkJCVJEX01UTF80WEdfQUMzX01QUDhfMTUKICNkZWZpbmUgUkRfTVRMXzJYWEdfMlhHX0FDM19NUFAxNl8yMwkJCVJEX01UTF80WEdfQUMzX01QUDE2XzIzCiAjZGVmaW5lIFJEX01UTF8yWFhHXzJYR19BQzNfTVBQMjRfMzEJCQlSRF9NVExfNFhHX0FDM19NUFAyNF8zMQogI2RlZmluZSBSRF9NVExfMlhYR18yWEdfQUMzX01QUDMyXzM5CQkJUkRfTVRMXzRYR19BQzNfTVBQMzJfMzkKQEAgLTQzNCw4ICs3MDEsOCBAQAogI2RlZmluZSBSRF9NVExfMlhYR18yWEdfQUMzX0dQUF9PVVRfRU5BX01JRAkJUkRfTVRMXzRYR19BQzNfR1BQX09VVF9FTkFfTUlECiAjZGVmaW5lIFJEX01UTF8yWFhHXzJYR19BQzNfR1BQX09VVF9WQUxfTE9XCQlSRF9NVExfNFhHX0FDM19HUFBfT1VUX1ZBTF9MT1cKICNkZWZpbmUgUkRfTVRMXzJYWEdfMlhHX0FDM19HUFBfT1VUX1ZBTF9NSUQJCVJEX01UTF80WEdfQUMzX0dQUF9PVVRfVkFMX01JRAotI2RlZmluZSBSRF9NVExfMlhYR18yWEdfQUMzX0dQUF9QT0xfTE9XCQkJUkRfTVRMXzRYR19BQzNfR1BQX1BPTF9MT1cKLSNkZWZpbmUgUkRfTVRMXzJYWEdfMlhHX0FDM19HUFBfUE9MX01JRAkJCVJEX01UTF80WEdfQUMzX0dQUF9QT0xfTUlECisjZGVmaW5lIFJEX01UTF8yWFhHXzJYR19BQzNfR1BQX1BPTF9MT1cJCVJEX01UTF80WEdfQUMzX0dQUF9QT0xfTE9XCisjZGVmaW5lIFJEX01UTF8yWFhHXzJYR19BQzNfR1BQX1BPTF9NSUQJCVJEX01UTF80WEdfQUMzX0dQUF9QT0xfTUlECiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgREItWEMzLTI0RzRHXzJYR19BQzMgIChSRF9NSVNMKSAgKi8KQEAgLTQ2OSw1ICs3MzYsNTYgQEAKICNkZWZpbmUgUkRfTVRMXzI0R19BQzNfR1BQX1BPTF9MT1cJCQlSRF9NVExfNFhHX0FDM19HUFBfUE9MX0xPVwogI2RlZmluZSBSRF9NVExfMjRHX0FDM19HUFBfUE9MX01JRAkJCVJEX01UTF80WEdfQUMzX0dQUF9QT0xfTUlECiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQXJtYWRhWFAgQm9hcmRzIDogb25seSBmb3IgTGludXggdXNhZ2UgKEFYUCBmYW1pbHkgaXMgc2hhcmVkIHdpdGggTVNZUyBpbiBMU1ApICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKi8KKy8qIERCLTc4NDYwLUFNQyAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBEQl83OFg2MF9BTUNfTVBQMF83CQkJMHgxMTExMTExMQorI2RlZmluZSBEQl83OFg2MF9BTUNfTVBQOF8xNQkJCTB4MDAwMDExMTEKKyNkZWZpbmUgREJfNzhYNjBfQU1DX01QUDE2XzIzCQkJMHgwMDAwMDAwMAorI2RlZmluZSBEQl83OFg2MF9BTUNfTVBQMjRfMzEJCQkweDAwMDAwMDAwCisjZGVmaW5lIERCXzc4WDYwX0FNQ19NUFAzMl8zOQkJCTB4MTExMTAwMDAKKyNkZWZpbmUgREJfNzhYNjBfQU1DX01QUDQwXzQ3CQkJMHgwMDAwNDAwMAorI2RlZmluZSBEQl83OFg2MF9BTUNfTVBQNDhfNTUJCQkweDAwMDAxMTEzCisjZGVmaW5lIERCXzc4WDYwX0FNQ19NUFA1Nl82MwkJCTB4MTExMTExMTAKKyNkZWZpbmUgREJfNzhYNjBfQU1DX01QUDY0XzY3CQkJMHgwMDAwMDExMQorCisvKiBHUFBzCitNUFAjCU5BTUUJCUlOL09VVAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTYJTUJfSU5UIwkJSU4KKzE3CVBoeTFfSU5UIwlJTgorMTgJUGh5Ml9JTlQjCUlOCisxOQlCcmRfTGVkXzAJSU4gKGZvciBuZXh0IGJvYXJkKQorMjEJQnJkX0xlZF8xCU9VVAorMjMJQnJkX0xlZF8yCU9VVAorMjkJQnJkX0xlZF8zCU9VVAorMzAJQnJkX0xlZF80CU9VVAorMzQJRGJnX0pQMAkJSU4KKzM1CURiZ19KUDEJCUlOCis0MAlEYmdfSlAyCQlJTgorNDEJRGJnX0pQMwkJSU4KKzQyCURiZ19KUDQJCUlOCis1Mwk3IFNlZ21lbnQgMAlPVVQKKzU0CTcgU2VnbWVudCAxCU9VVAorNTUJNyBTZWdtZW50IDIJT1VUCis1Ngk3IFNlZ21lbnQgMwlPVVQKKyovCisKKyNkZWZpbmUgREJfNzhYNjBfQU1DX0dQUF9PVVRfRU5BX0xPVwkJKH4oQklUMTkgfCBCSVQyMSB8IEJJVDIyIHwgQklUMjMgfCBCSVQyOSB8IEJJVDMwKSkKKyNkZWZpbmUgREJfNzhYNjBfQU1DX0dQUF9PVVRfRU5BX01JRAkJKH4oQklUMjEgfCBCSVQyMiB8IEJJVDIzIHwgQklUMjQpKQorI2RlZmluZSBEQl83OFg2MF9BTUNfR1BQX09VVF9FTkFfSElHSAkJKH4oMHgwKSkKKworI2RlZmluZSBEQl83OFg2MF9BTUNfR1BQX09VVF9WQUxfTE9XCQkweDAKKyNkZWZpbmUgREJfNzhYNjBfQU1DX0dQUF9PVVRfVkFMX01JRAkJMHgwCisjZGVmaW5lIERCXzc4WDYwX0FNQ19HUFBfT1VUX1ZBTF9ISUdICQkweDAKKworI2RlZmluZSBEQl83OFg2MF9BTUNfR1BQX1BPTF9MT1cJCTB4MAorI2RlZmluZSBEQl83OFg2MF9BTUNfR1BQX1BPTF9NSUQJCTB4MAorI2RlZmluZSBEQl83OFg2MF9BTUNfR1BQX1BPTF9ISUdICQkweDAKKwogI2VuZGlmIC8qIF9fSU5DbXZCb2FyZEVudlNwZWNoICovCiAKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2NwdS9tdkNwdS5jIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3B1L212Q3B1LmMKaW5kZXggNjNjZjc2YS4uYTdhMTQzZiAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3B1L212Q3B1LmMKKysrIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3B1L212Q3B1LmMKQEAgLTk2LDE3ICs5Niw0MiBAQAogewogCU1WX1UzMgkJCWlkeDsKIAlNVl9VMzIJCQlmcmVxTWh6OworCU1WX1UzMgkJCWNwdUNsa1tdID0gTVZfQ1BVX0NMS19UQkxfQVhQOwogCU1WX0NQVUREUl9NT0RFCWJjMkNsb2NrUmF0aW9UYmxbOF0gPSBNVl9DUFVfRERSX0NMS19UQkxfQkMyOwogCU1WX0NQVUREUl9NT0RFCWFjM0Nsb2NrUmF0aW9UYmxbOF0gPSBNVl9DUFVfRERSX0NMS19UQkxfQUMzOworCU1WX0NQVUREUl9NT0RFCWJvYmtDZXR1c0Nsb2NrUmF0aW9UYmxbOF0gPSBNVl9DUFVfRERSX0NMS19UQkxfQk9CS19DRVRVUzsKKwlNVl9DUFVERFJfTU9ERQlib2JrQ2FlbHVtQ2xvY2tSYXRpb1RibFs4XSA9IE1WX0NQVV9ERFJfQ0xLX1RCTF9CT0JLX0NBRUxVTTsKIAlNVl9VMTYJCQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKLQlNVl9VMzIJCQlzYXIyID0gTVZfREZYX1JFR19SRUFEKERGWF9ERVZJQ0VfU0FSX1JFRygxKSk7CisJTVZfVTMyCQkJc2FyMjsKKworCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpIHsKKwkJaWR4ID0gTVNBUl9DUFVfQ0xLX0lEWChNVl9SRUdfUkVBRChNUFBfU0FNUExFX0FUX1JFU0VUKDApKSwKKwkJCQkgICAgICAgTVZfUkVHX1JFQUQoTVBQX1NBTVBMRV9BVF9SRVNFVCgxKSkpOworCQlyZXR1cm4gY3B1Q2xrW2lkeF0gKiAxMDAwMDAwOworCX0KKworCXNhcjIgPSBNVl9ERlhfUkVHX1JFQUQoREZYX0RFVklDRV9TQVJfUkVHKDEpKTsKIAogCWlkeCA9IE1TQVJfQ1BVX0REUl9DTEsoMCwgc2FyMik7CiAJaWYgKGZhbWlseSA9PSBNVl9CT0JDQVQyX0RFVl9JRCkKIAkJZnJlcU1oeiA9IGJjMkNsb2NrUmF0aW9UYmxbaWR4XS5jcHVGcmVxICogMTAwMDAwMDsKIAllbHNlIGlmIChmYW1pbHkgPT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkKIAkJZnJlcU1oeiA9IGFjM0Nsb2NrUmF0aW9UYmxbaWR4XS5jcHVGcmVxICogMTAwMDAwMDsKLQllbHNlCisJZWxzZSBpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CisJCXN3aXRjaCAobXZDdHJsTW9kZWxHZXQoKSkgeworCQljYXNlIE1WX0JPQktfQ0VUVVNfOThEWDQyMzVfREVWX0lEOgorCQljYXNlIE1WX0JPQktfTEVXSVNfOThEWDgyMTJfREVWX0lEOgorCQkJLyogTEVXSVMgUkQgYm9hcmQncyBDUFUgZnJlcSBzZXR0aW5nIGlzIHRoZSBzYW1lIGFzIENFVFVTIGJvYXJkICovCisJCQlmcmVxTWh6ID0gYm9ia0NldHVzQ2xvY2tSYXRpb1RibFtpZHhdLmNwdUZyZXEgKiAxMDAwMDAwOworCQkJYnJlYWs7CisJCWNhc2UgTVZfQk9CS19DQUVMVU1fOThEWDQyMDNfREVWX0lEOgorCQkJZnJlcU1oeiA9IGJvYmtDYWVsdW1DbG9ja1JhdGlvVGJsW2lkeF0uY3B1RnJlcSAqIDEwMDAwMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW12T3NQcmludGYoIkVSUk9SOiBVbmtub3duIERldmljZUlEICVkLCBDUFUgZnJlcSBnZXQgZmFpbGVkXG4iLCBtdkN0cmxNb2RlbEdldCgpKTsKKwkJCXJldHVybiAweEZGRkZGRkZGOworCQl9CisJfSBlbHNlCiAJCXJldHVybiAweEZGRkZGRkZGOwogCiAJcmV0dXJuIGZyZXFNaHo7CkBAIC0xMzQsNiArMTU5LDggQEAKIAlNVl9VMzIJCQlmcmVxTWh6OwogCU1WX0NQVUREUl9NT0RFCWJjMkNsb2NrUmF0aW9UYmxbOF0gPSBNVl9DUFVfRERSX0NMS19UQkxfQkMyOwogCU1WX0NQVUREUl9NT0RFCWFjM0Nsb2NrUmF0aW9UYmxbOF0gPSBNVl9DUFVfRERSX0NMS19UQkxfQUMzOworCU1WX0NQVUREUl9NT0RFCWJvYmtDZXR1c0Nsb2NrUmF0aW9UYmxbOF0gPSBNVl9DUFVfRERSX0NMS19UQkxfQk9CS19DRVRVUzsKKwlNVl9DUFVERFJfTU9ERQlib2JrQ2FlbHVtQ2xvY2tSYXRpb1RibFs4XSA9IE1WX0NQVV9ERFJfQ0xLX1RCTF9CT0JLX0NBRUxVTTsKIAlNVl9VMTYJCQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKIAlNVl9VMzIJCQlzYXIyID0gTVZfREZYX1JFR19SRUFEKERGWF9ERVZJQ0VfU0FSX1JFRygxKSk7CiAKQEAgLTE0Miw3ICsxNjksMjEgQEAKIAkJZnJlcU1oeiA9IGJjMkNsb2NrUmF0aW9UYmxbaWR4XS5kZHJGcmVxICogMTAwMDAwMDsKIAllbHNlIGlmIChmYW1pbHkgPT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkKIAkJZnJlcU1oeiA9IGFjM0Nsb2NrUmF0aW9UYmxbaWR4XS5kZHJGcmVxICogMTAwMDAwMDsKLQllbHNlCisJZWxzZSBpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CisJCXN3aXRjaCAobXZDdHJsTW9kZWxHZXQoKSkgeworCQljYXNlIE1WX0JPQktfQ0VUVVNfOThEWDQyMzVfREVWX0lEOgorCQljYXNlIE1WX0JPQktfTEVXSVNfOThEWDgyMTJfREVWX0lEOgorCQkJLyogTEVXSVMgUkQgYm9hcmQncyBDUFUgZnJlcSBzZXR0aW5nIGlzIHRoZSBzYW1lIGFzIENFVFVTIGJvYXJkICovCisJCQlmcmVxTWh6ID0gYm9ia0NldHVzQ2xvY2tSYXRpb1RibFtpZHhdLmRkckZyZXEgKiAxMDAwMDAwOworCQkJYnJlYWs7CisJCWNhc2UgTVZfQk9CS19DQUVMVU1fOThEWDQyMDNfREVWX0lEOgorCQkJZnJlcU1oeiA9IGJvYmtDYWVsdW1DbG9ja1JhdGlvVGJsW2lkeF0uZGRyRnJlcSAqIDEwMDAwMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW12T3NQcmludGYoIkVSUk9SOiBVbmtub3duIERldmljZUlEICVkLCBERFIgZnJlcSBnZXQgZmFpbGVkXG4iLCBtdkN0cmxNb2RlbEdldCgpKTsKKwkJCXJldHVybiAweEZGRkZGRkZGOworCQl9CisJfSBlbHNlCiAJCXJldHVybiAweEZGRkZGRkZGOwogCiAJcmV0dXJuIGZyZXFNaHo7CkBAIC0xNzAsMjAgKzIxMSwzNyBAQAogCU1WX1UzMgkJZnJlcU1oejsKIAlNVl9DUFVERFJfTU9ERQliYzJDbG9ja1JhdGlvVGJsWzhdID0gTVZfQ1BVX0REUl9DTEtfVEJMX0JDMjsKIAlNVl9DUFVERFJfTU9ERQlhYzNDbG9ja1JhdGlvVGJsWzhdID0gTVZfQ1BVX0REUl9DTEtfVEJMX0FDMzsKKwlNVl9DUFVERFJfTU9ERQlib2JrQ2V0dXNDbG9ja1JhdGlvVGJsWzhdID0gTVZfQ1BVX0REUl9DTEtfVEJMX0JPQktfQ0VUVVM7CisJTVZfQ1BVRERSX01PREUJYm9ia0NhZWx1bUNsb2NrUmF0aW9UYmxbOF0gPSBNVl9DUFVfRERSX0NMS19UQkxfQk9CS19DQUVMVU07CiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKLQlNVl9VMzIJCXNhcjIgPSBNVl9ERlhfUkVHX1JFQUQoREZYX0RFVklDRV9TQVJfUkVHKDEpKTsKKwlNVl9VMzIJCXNhcjI7CisKKwlpZiAoZmFtaWx5ID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJcmV0dXJuIEFYUF9QTExfSU5fQ0xLOworCisJc2FyMiA9IE1WX0RGWF9SRUdfUkVBRChERlhfREVWSUNFX1NBUl9SRUcoMSkpOwogCiAJaWR4ID0gTVNBUl9DUFVfRERSX0NMSygwLCBzYXIyKTsKLQlzd2l0Y2ggKGZhbWlseSkgewotCWNhc2UgTVZfQk9CQ0FUMl9ERVZfSUQ6CisJaWYgKGZhbWlseSA9PSBNVl9CT0JDQVQyX0RFVl9JRCkKIAkJZnJlcU1oeiA9IGJjMkNsb2NrUmF0aW9UYmxbaWR4XS5wbGxDbGsgKiAxMDAwMDAwOwotCQlicmVhazsKLQljYXNlIE1WX0FMTEVZQ0FUM19ERVZfSUQ6CisJZWxzZSBpZiAoZmFtaWx5ID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpCiAJCWZyZXFNaHogPSBhYzNDbG9ja1JhdGlvVGJsW2lkeF0ucGxsQ2xrICogMTAwMDAwMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKKwllbHNlIGlmIChmYW1pbHkgPT0gTVZfQk9CS19ERVZfSUQpIHsKKwkJc3dpdGNoIChtdkN0cmxNb2RlbEdldCgpKSB7CisJCWNhc2UgTVZfQk9CS19DRVRVU185OERYNDIzNV9ERVZfSUQ6CisJCWNhc2UgTVZfQk9CS19MRVdJU185OERYODIxMl9ERVZfSUQ6CisJCQkvKiBMRVdJUyBSRCBib2FyZCdzIENQVSBmcmVxIHNldHRpbmcgaXMgdGhlIHNhbWUgYXMgQ0VUVVMgYm9hcmQgKi8KKwkJCWZyZXFNaHogPSBib2JrQ2V0dXNDbG9ja1JhdGlvVGJsW2lkeF0ucGxsQ2xrICogMTAwMDAwMDsKKwkJCWJyZWFrOworCQljYXNlIE1WX0JPQktfQ0FFTFVNXzk4RFg0MjAzX0RFVl9JRDoKKwkJCWZyZXFNaHogPSBib2JrQ2FlbHVtQ2xvY2tSYXRpb1RibFtpZHhdLnBsbENsayAqIDEwMDAwMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW12T3NQcmludGYoIkVSUk9SOiBVbmtub3duIERldmljZUlEICVkLCBQTEwgZnJlcSBnZXQgZmFpbGVkXG4iLCBtdkN0cmxNb2RlbEdldCgpKTsKKwkJCXJldHVybiAweEZGRkZGRkZGOworCQl9CisJfSBlbHNlCiAJCXJldHVybiAweEZGRkZGRkZGOwotCX0KIAogCXJldHVybiBmcmVxTWh6OwogfQpAQCAtMjAwLDYgKzI1OCwxMCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1UzMiBtdkNwdUwyQ2xrR2V0KE1WX1ZPSUQpCiB7CisJTVZfVTMyIGlkeDsKKwlNVl9VMzIgZnJlcU1oeiwgbDJGcmVxTWh6OworCU1WX0NQVV9BUk1fQ0xLX1JBVElPIGNsb2NrUmF0aW9UYmxbXSA9IE1WX0REUl9MMl9DTEtfUkFUSU9fVEJMX0FYUDsKKwogLyoJTVZfVTMyIGlkeDsKIAlNVl9VMzIgZnJlcU1oejsKIAlNVl9DUFVERFJfTU9ERSBjbG9ja1JhdGlvVGJsWzhdID0gTVZfQ1BVX0REUl9DTEtfVEJMOwpAQCAtMjA3LDcgKzI2OSwyNCBAQAogCiAJaWR4ID0gTVNBUl9DUFVfRERSX0NMSygwLCBzYXIyKTsKIAlmcmVxTWh6ID0gY2xvY2tSYXRpb1RibFtpZHhdLmNwdUZyZXEgKiAxMDAwMDAwOyAqLwotCXJldHVybiAyMDAwMDAwMDA7CisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApICE9IE1WXzc4NDYwX0RFVl9JRCkKKwkJcmV0dXJuIDIwMDAwMDAwMDsKKworCWlkeCA9IE1TQVJfRERSX0wyX0NMS19SQVRJT19JRFgoTVZfUkVHX1JFQUQoTVBQX1NBTVBMRV9BVF9SRVNFVCgwKSksCisJCQkJCU1WX1JFR19SRUFEKE1QUF9TQU1QTEVfQVRfUkVTRVQoMSkpKTsKKworCWlmIChjbG9ja1JhdGlvVGJsW2lkeF0udmNvMmNwdSAhPSAwKSB7CisJCWZyZXFNaHogPSBtdkNwdVBjbGtHZXQoKSAvIDEwMDAwMDA7CS8qIENQVSBmcmVxICovCisJCWZyZXFNaHogKj0gY2xvY2tSYXRpb1RibFtpZHhdLnZjbzJjcHU7CS8qIFZDTyBmcmVxICovCisJCWwyRnJlcU1oeiA9IGZyZXFNaHogLyBjbG9ja1JhdGlvVGJsW2lkeF0udmNvMmwyYzsKKwkJLyogcm91bmQgdXAgdG8gaW50ZWdlciBNSHogKi8KKwkJaWYgKCgoZnJlcU1oeiAlIGNsb2NrUmF0aW9UYmxbaWR4XS52Y28ybDJjKSAqIDEwIC8gY2xvY2tSYXRpb1RibFtpZHhdLnZjbzJsMmMpID49IDUpCisJCQlsMkZyZXFNaHorKzsKKworCQlyZXR1cm4gbDJGcmVxTWh6ICogMTAwMDAwMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gKE1WX1UzMiktMTsKKwl9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkFkZHJEZWMuYyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52QWRkckRlYy5jCmluZGV4IGEzNGRiYTQuLjcxMTUzMWYgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52QWRkckRlYy5jCisrKyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52QWRkckRlYy5jCkBAIC05MSw3ICs5MSw4IEBACiAjZW5kaWYKIAogLyogRGVmYXVsdCBBdHRyaWJ1dGVzIGFycmF5ICovCi1NVl9UQVJHRVRfQVRUUklCIG12VGFyZ2V0RGVmYXVsdHNBcnJheVtdID0gVEFSR0VUU19ERUZfQVJSQVk7CitNVl9UQVJHRVRfQVRUUklCIG12VGFyZ2V0RGVmYXVsdHNBcnJheU1zeXNbXSA9IFRBUkdFVFNfREVGX0FSUkFZOworTVZfVEFSR0VUX0FUVFJJQiBtdlRhcmdldERlZmF1bHRzQXJyYXlBeHBbXSA9IFRBUkdFVFNfREVGX0FSUkFZX0FYUDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZDdHJsQXR0cmliR2V0IC0KQEAgLTEwNyw2ICsxMDgsMTMgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9TVEFUVVMgbXZDdHJsQXR0cmliR2V0KE1WX1RBUkdFVCB0YXJnZXQsIE1WX1RBUkdFVF9BVFRSSUIgKnRhcmdldEF0dHJpYikKIHsKKwlNVl9UQVJHRVRfQVRUUklCICptdlRhcmdldERlZmF1bHRzQXJyYXk7CisKKwlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfNzg0NjBfREVWX0lEKQorCQltdlRhcmdldERlZmF1bHRzQXJyYXkgPSBtdlRhcmdldERlZmF1bHRzQXJyYXlBeHA7CisJZWxzZQorCQltdlRhcmdldERlZmF1bHRzQXJyYXkgPSBtdlRhcmdldERlZmF1bHRzQXJyYXlNc3lzOworCiAJdGFyZ2V0QXR0cmliLT5hdHRyaWIgPSBtdlRhcmdldERlZmF1bHRzQXJyYXlbTVZfQ0hBTkdFX0JPT1RfQ1ModGFyZ2V0KV0uYXR0cmliOwogCXRhcmdldEF0dHJpYi0+dGFyZ2V0SWQgPSBtdlRhcmdldERlZmF1bHRzQXJyYXlbTVZfQ0hBTkdFX0JPT1RfQ1ModGFyZ2V0KV0udGFyZ2V0SWQ7CiAKQEAgLTExNSw2ICsxMjMsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfU1RBVFVTIG12Q3RybEF0dHJpYlNldChNVl9UQVJHRVQgdGFyZ2V0LCBNVl9UQVJHRVRfQVRUUklCICp0YXJnZXRBdHRyaWIpCiB7CisJTVZfVEFSR0VUX0FUVFJJQiAqbXZUYXJnZXREZWZhdWx0c0FycmF5OworCisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJbXZUYXJnZXREZWZhdWx0c0FycmF5ID0gbXZUYXJnZXREZWZhdWx0c0FycmF5QXhwOworCWVsc2UKKwkJbXZUYXJnZXREZWZhdWx0c0FycmF5ID0gbXZUYXJnZXREZWZhdWx0c0FycmF5TXN5czsKKwogCW12VGFyZ2V0RGVmYXVsdHNBcnJheVtNVl9DSEFOR0VfQk9PVF9DUyh0YXJnZXQpXS5hdHRyaWIgID0gdGFyZ2V0QXR0cmliLT5hdHRyaWI7CiAJbXZUYXJnZXREZWZhdWx0c0FycmF5W01WX0NIQU5HRV9CT09UX0NTKHRhcmdldCldLnRhcmdldElkPSB0YXJnZXRBdHRyaWItPnRhcmdldElkOwogCkBAIC0xMzcsNiArMTUyLDEzIEBACiB7CiAJTVZfVEFSR0VUIHRhcmdldDsKIAlNVl9UQVJHRVQgeDsKKwlNVl9UQVJHRVRfQVRUUklCICptdlRhcmdldERlZmF1bHRzQXJyYXk7CisKKwlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfNzg0NjBfREVWX0lEKQorCQltdlRhcmdldERlZmF1bHRzQXJyYXkgPSBtdlRhcmdldERlZmF1bHRzQXJyYXlBeHA7CisJZWxzZQorCQltdlRhcmdldERlZmF1bHRzQXJyYXkgPSBtdlRhcmdldERlZmF1bHRzQXJyYXlNc3lzOworCiAJZm9yICh0YXJnZXQgPSBTRFJBTV9DUzA7IHRhcmdldCA8IE1BWF9UQVJHRVRTOyB0YXJnZXQrKykgewogCQl4ID0gTVZfQ0hBTkdFX0JPT1RfQ1ModGFyZ2V0KTsKIAkJaWYgKChtdlRhcmdldERlZmF1bHRzQXJyYXlbeF0uYXR0cmliID09IHRhcmdldEF0dHJpYi0+YXR0cmliKSAmJgpAQCAtMTY1LDYgKzE4NywxMyBAQAogewogCU1WX1RBUkdFVCB0YXJnZXQ7CiAJTVZfVEFSR0VUIHg7CisJTVZfVEFSR0VUX0FUVFJJQiAqbXZUYXJnZXREZWZhdWx0c0FycmF5OworCisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJbXZUYXJnZXREZWZhdWx0c0FycmF5ID0gbXZUYXJnZXREZWZhdWx0c0FycmF5QXhwOworCWVsc2UKKwkJbXZUYXJnZXREZWZhdWx0c0FycmF5ID0gbXZUYXJnZXREZWZhdWx0c0FycmF5TXN5czsKKwogCWZvciAodGFyZ2V0ID0gU0RSQU1fQ1MwOyB0YXJnZXQgPCBNQVhfVEFSR0VUUzsgdGFyZ2V0KyspIHsKIAkJeCA9IE1WX0NIQU5HRV9CT09UX0NTKHRhcmdldCk7CiAJCWlmICgobXZUYXJnZXREZWZhdWx0c0FycmF5W3hdLmF0dHJpYiA9PSB1bml0V2luSW5mby0+YXR0cmliKSAmJgpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuYyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmMKaW5kZXggYmUxNjE2ZC4uMTdjZWMyNyAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuYworKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jCkBAIC04OSw2ICs4OSw4IEBACiAjaW5jbHVkZSAiZGRyMl8zL212RHJhbUlmUmVncy5oIgogCiAjaW5jbHVkZSAidHdzaS9tdlR3c2lTcGVjLmgiCisjaW5jbHVkZSAiZGV2aWNlL212RGV2aWNlLmgiCisjaW5jbHVkZSAibXZEZXZpY2VJZC5oIgogCiAvKiBkZWZpbmVzICAqLwogI3VuZGVmIE1WX0RFQlVHCkBAIC0xMDEsMjIgKzEwMyw2MiBAQAogLyogTVNZUyBmYW1pbHkgbGluZWFyIGlkICovCiAjZGVmaW5lIE1WX01TWVNfQkMyX0lOREVYCQkwCiAjZGVmaW5lIE1WX01TWVNfQUMzX0lOREVYCQkxCi0jZGVmaW5lIE1WX01TWVNfSU5ERVhfTUFYCQkyCisjZGVmaW5lIE1WXzc4NDYwX0lOREVYCQkJMgorI2RlZmluZSBNVl9NU1lTX0JPQktfSU5ERVgJCQkzCisjZGVmaW5lIE1WX01TWVNfQVhQX0lOREVYX01BWAkJNAogCi1NVl9VTklUX0lEIG12Q3RybFNvY1VuaXROdW1zW01BWF9VTklUU19JRF1bTVZfTVNZU19JTkRFWF9NQVhdID0gewotLyoJCQkgICAgQkMyCQlBQzMgKi8KLS8qIERSQU1fVU5JVF9JRCAgICAgICAgICovIHsgMSwJCTEsIH0sCi0vKiBQRVhfVU5JVF9JRCAgICAgICAgICAqLyB7IDEsCQkxLCB9LAotLyogRVRIX0dJR19VTklUX0lEICAgICAgKi8geyAyLAkJMiwgfSwKLS8qIFhPUl9VTklUX0lEICAgICAgICAgICovIHsgMSwJCTEsIH0sCi0vKiBVQVJUX1VOSVRfSUQgICAgICAgICAqLyB7IDIsCQkyLCB9LAotLyogU1BJX1VOSVRfSUQgICAgICAgICAgKi8geyAyLAkJMSwgfSwKLS8qIFNESU9fVU5JVF9JRCAgICAgICAgICovIHsgMSwJCTEsIH0sCi0vKiBJMkNfVU5JVF9JRCAgICAgICAgICAqLyB7IDIsCQkyLCB9LAotLyogVVNCX1VOSVRfSUQgICAgICAgICAgKi8geyAwLAkJMSwgfSwKLS8qIFVTQjNfVU5JVF9JRCAgICAgICAgICovIHsgMCwJCTAsIH0sCitNVl9VTklUX0lEIG12Q3RybFNvY1VuaXROdW1zW01BWF9VTklUU19JRF1bTVZfTVNZU19BWFBfSU5ERVhfTUFYXSA9IHsKKy8qCQkJICAgICBCQzIJQUMzCQk3ODQ2MAkJQk9CSyovCisvKiBEUkFNX1VOSVRfSUQJCSovIHsgMSwJCTEsCQkxLAkJMSx9LAorLyogUEVYX1VOSVRfSUQJCSovIHsgMSwJCTEsCQk0LAkJMSx9LAorLyogRVRIX0dJR19VTklUX0lECSovIHsgMiwJCTIsCQk0LAkJMix9LAorLyogWE9SX1VOSVRfSUQJCSovIHsgMSwJCTEsCQk0LAkJMSx9LAorLyogVUFSVF9VTklUX0lECQkqLyB7IDIsCQkyLAkJNCwJCTIsfSwKKy8qIFNQSV9VTklUX0lECQkqLyB7IDEsCQkxLAkJMiwJCTEsfSwKKy8qIFNESU9fVU5JVF9JRAkJKi8geyAxLAkJMSwJCTEsCQkxLH0sCisvKiBJMkNfVU5JVF9JRAkJKi8geyAyLAkJMiwJCTIsCQkyLH0sCisvKiBVU0JfVU5JVF9JRAkJKi8geyAwLAkJMSwJCTMsCQkxLH0sCisvKiBVU0IzX1VOSVRfSUQJCSovIHsgMCwJCTAsCQkwLAkJMCx9LAorLyogTkFORF9VTklUX0lECQkqLyB7IDEsCQkxLAkJMSwJCTEsfSwKKy8qIERFVkJVU19VTklUX0lECSovIHsgMCwJCTAsCQkwLAkJMCx9LAorLyogSURNQV9VTklUX0lECQkqLyB7IDAsCQkwLAkJNCwJCTAsfSwKKy8qIFNBVEFfVU5JVF9JRAkJKi8geyAwLAkJMCwJCTIsCQkwLH0sCisvKiBURE1fVU5JVF9JRAkJKi8geyAwLAkJMCwJCTEsCQkwLH0sCisvKiBDRVNBX1VOSVRfSUQJCSovIHsgMCwJCTAsCQkyLAkJMCx9LAorLyogQVVESU9fVU5JVF9JRAkqLyB7IDAsCQkwLAkJMCwJCTAsfSwKKy8qIFRTX1VOSVRfSUQJCSovIHsgMCwJCTAsCQkwLAkJMCx9LAorLyogWFBPTl9VTklUX0lECQkqLyB7IDAsCQkwLAkJMCwJCTAsfSwKKy8qIEJNX1VOSVRfSUQJCSovIHsgMCwJCTAsCQkxLAkJMCx9LAorLyogUE5DX1VOSVRfSUQJCSovIHsgMCwJCTAsCQkxLAkJMCx9LAogfTsKIAorTVZfVTMyICBtdkRldjJDcHVNYXBUYWJsZVsyMF1bMl0gPSB7CisvKglEZXYgSUQJCQljb3JlcyMgICAqLworCXtNVl9CT0JDQVQyX0RFVl9JRCwJCTJ9LAorCXtNVl9CT0JLX0NFVFVTXzk4RFg0MjM1X0RFVl9JRCwJCTJ9LAorCXtNVl9CT0JLX0NBRUxVTV85OERYNDIwM19ERVZfSUQsCTJ9LAorCXtNVl9CT0JLX0xFV0lTXzk4RFg4MjEyX0RFVl9JRCwJMn0sCisJe01WX0FMTEVZQ0FUM185OERYMzMzNl9ERVZfSUQsCTJ9LAorCXtNVl9BTExFWUNBVDNfOThEWDMzMzVfREVWX0lELAkyfSwKKwl7TVZfQUxMRVlDQVQzXzk4RFgzMzM0X0RFVl9JRCwJMn0sCisJe01WX0FMTEVZQ0FUM185OERYMzMzM19ERVZfSUQsCTJ9LAorCXtNVl9BTExFWUNBVDNfOThEWDEyMzNfREVWX0lELAkxfSwKKwl7TVZfQUxMRVlDQVQzXzk4RFgxMjM1X0RFVl9JRCwJMX0sCisJe01WX0FMTEVZQ0FUM185OERYMzIzNl9ERVZfSUQsCTF9LAorCXtNVl9BTExFWUNBVDNfOThEWDMyMzVfREVWX0lELAkxfSwKKwl7TVZfQUxMRVlDQVQzXzk4RFgzMjM0X0RFVl9JRCwJMX0sCisJe01WX0FMTEVZQ0FUM185OERYMzIzM19ERVZfSUQsCTF9LAorCXtNVl9BTExFWUNBVDNfOThEWEgzMzNfREVWX0lELAkyfSwKKwl7TVZfQUxMRVlDQVQzXzk4RFgxMzMzX0RFVl9JRCwJMn0sCisJe01WX0FMTEVZQ0FUM185OERYMTMzNV9ERVZfSUQsCTJ9LAorCXtNVl9BTExFWUNBVDNfOThEWDEzMzZfREVWX0lELAkyfSwKKwl7TVZfNzg0NjBfREVWX0lELAkJNH0sCisJe01WX01BWF9ERVZfSUQsCQkJMH0sCit9OworCisKKworCiBzdGF0aWMgTVZfVTMyIG12Q3RybERldklkSW5kZXhHZXQoTVZfVTMyIGRldklkKQogewogCU1WX1UzMiBpbmRleDsKQEAgLTEyOCwxMiArMTcwLDM2IEBACiAJY2FzZSBNVl9BTExFWUNBVDNfREVWX0lEOgogCQlpbmRleCA9IE1WX01TWVNfQUMzX0lOREVYOwogCQlicmVhazsKKwljYXNlIE1WXzc4NDYwX0RFVl9JRDoKKwkJaW5kZXggPSBNVl83ODQ2MF9JTkRFWDsKKwkJYnJlYWs7CisJY2FzZSBNVl9CT0JLX0RFVl9JRDoKKwkJaW5kZXggPSBNVl9NU1lTX0JPQktfSU5ERVg7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWluZGV4ID0gTVZfTVNZU19BQzNfSU5ERVg7CiAJfQogCiAJcmV0dXJuIGluZGV4OwogfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkN0cmxJc1VzYlNlckRlc0Nvbm5lY3RlZAorKgorKiBERVNDUklQVElPTjogY2hlY2sgaWYgU2VyRGVzIGxhbmUgaXMgY29ubmVjdGVkIHRvIFVTQjMgaG9zdC4KKyoKKyoKKyogSU5QVVQ6IE5vbmUKKyoKKyogT1VUUFVUOiBOb25lCisqCisqIFJFVFVSTjpyZXR1cm4gdHJ1ZSBpZiBTZXJEZXMgbGFuZSBpcyBjb25uZWN0ZWQgdG8gVVNCMyBob3N0LCBmYWxzZSBvdGhlcndpc2UuCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBtdkN0cmxJc1VzYlNlckRlc0Nvbm5lY3RlZChNVl9VMzIgdXNiUG9ydCkKK3sKKwlyZXR1cm4gTVZfRkFMU0U7LypyZXR1cm4gZmFsc2UgYmVjYXVzZSBpbiBtc3lzIHRoZXJlIGlzIG5vIHVzYjMqLworfQogCiBNVl9VMzIgbXZDdHJsU29jVW5pdEluZm9OdW1HZXQoTVZfVU5JVF9JRCB1bml0KQogewpAQCAtMTQ3LDExICsyMTMsMzQgQEAKIAlkZXZJZEluZGV4ID0gbXZDdHJsRGV2SWRJbmRleEdldChtdkN0cmxNb2RlbEdldCgpKTsKIAlyZXR1cm4gbXZDdHJsU29jVW5pdE51bXNbdW5pdF1bZGV2SWRJbmRleF07CiB9Ci0KLU1WX1UzMiBtdkN0cmxHZXRDcHVOdW0oTVZfVk9JRCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZDdHJsR2V0Q3B1TnVtCisqCisqIERFU0NSSVBUSU9OOiBHZXQgdGhlIG51bWJlciBvZiBDUFUgY29yZXMKKyoKKyoKKyogSU5QVVQ6IE5vbmUKKyoKKyogT1VUUFVUOiBOb25lCisqCisqIFJFVFVSTjpjcHUgY29yZXMgbnVtYmVyIG9yIDAgaWYgdGhlIGRldmljZUlEIG5vdCBmb3VuZCBpbiBkZXZpY2UgSURzIHRhYmxlCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVTMyICBtdkN0cmxHZXRDcHVOdW0oTVZfVk9JRCkKIHsKKwlNVl9VMzIJdGFibGVfaW5kZXggPSAwOworCU1WX1UzMglkZXZpY2VJZCA9IG12Q3RybE1vZGVsR2V0KCk7CisKKwl3aGlsZSAobXZEZXYyQ3B1TWFwVGFibGVbdGFibGVfaW5kZXhdWzBdICE9IE1WX01BWF9ERVZfSUQpIHsKKwkJaWYgKGRldmljZUlkID09IG12RGV2MkNwdU1hcFRhYmxlW3RhYmxlX2luZGV4XVswXSkKKwkJCXJldHVybiBtdkRldjJDcHVNYXBUYWJsZVt0YWJsZV9pbmRleF1bMV07CisJCXRhYmxlX2luZGV4Kys7CisJfQorCW12T3NQcmludGYoIiVzOiBFcnJvcjogRGV2SUQgKCUjWCkgaXMgbm90IGZvdW5kIGluIENQVSBjb3JlcyBjb3VudCBwZXIgZGV2aWNlIHRhYmxlIVxuIiwgX19mdW5jX18sIGRldmljZUlkKTsKIAlyZXR1cm4gMDsKIH0KKwogTVZfQk9PTCBtdkN0cmxJc1ZhbGlkU2F0UihNVl9WT0lEKQogewogCXJldHVybiBNVl9UUlVFOwpAQCAtMjQ4LDcgKzMzNyw5IEBACiAJTVZfVTMyIG1wcEdyb3VwOwogCU1WX1UzMiBtcHBWYWw7CiAJTVZfVTMyIGksIGdwcE1hc2s7Ci0KKwlNVl9VMzIgbWF4R3JvdXAgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQgPworCQlNVl9NUFBfTUFYX0dST1VQX0FYUCA6IE1WX01QUF9NQVhfR1JPVVA7CisJTVZfU1RBVFVTIHN0YXR1czsKIAogCS8qIERpc2FibGUgTUJ1cyBFcnJvciBQcm9wYWdhdGlvbiAqLwogCU1WX1JFR19CSVRfUkVTRVQoU09DX0NPSEVSRU5DWV9GQUJSSUNfQ1RSTF9SRUcsIEJJVDgpOwpAQCAtMjYwLDIzICszNTEsMjMgQEAKIAltdkJvYXJkTXBwTW9kdWxlc1NjYW4oKTsKIAogCS8qIFJlYWQgTVBQIGNvbmZpZyB2YWx1ZXMgZnJvbSBib2FyZCBsZXZlbCBhbmQgd3JpdGUgTVBQIG9wdGlvbnMgdG8gSFcgKi8KLQlmb3IgKG1wcEdyb3VwID0gMDsgbXBwR3JvdXAgPCBNVl9NUFBfTUFYX0dST1VQOyBtcHBHcm91cCsrKSB7CisJZm9yIChtcHBHcm91cCA9IDA7IG1wcEdyb3VwIDwgbWF4R3JvdXA7IG1wcEdyb3VwKyspIHsKIAkJbXBwVmFsID0gbXZCb2FyZE1wcEdldChtcHBHcm91cCk7CS8qIGdldCBwcmUtZGVmaW5lZCB2YWx1ZXMgKi8KIAkJTVZfUkVHX1dSSVRFKG12Q3RybE1wcFJlZ0dldChtcHBHcm91cCksIG1wcFZhbCk7CiAJfQogCiAJLyogZGlzYWJsZSBhbGwgR1BJTyBpbnRlcnJ1cHRzICovCi0JZm9yIChpID0gMDsgaSA8IE1WX0dQUF9NQVhfR1JPVVA7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBtYXhHcm91cDsgaSsrKSB7CiAJCU1WX1JFR19XUklURShHUFBfSU5UX01BU0tfUkVHKGkpLCAweDApOwogCQlNVl9SRUdfV1JJVEUoR1BQX0lOVF9MVkxfUkVHKGkpLCAweDApOwogCX0KIAogCS8qIGNsZWFyIGFsbCBpbnQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTVZfR1BQX01BWF9HUk9VUDsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBtYXhHcm91cDsgaSsrKQogCQlNVl9SRUdfV1JJVEUoR1BQX0lOVF9DQVVTRV9SRUcoaSksIDB4MCk7CiAKIAkvKiBTZXQgZ3BwIGludGVycnVwdHMgYXMgbmVlZGVkICovCi0JZm9yIChpID0gMDsgaSA8IE1WX0dQUF9NQVhfR1JPVVA7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBtYXhHcm91cDsgaSsrKSB7CiAJCWdwcE1hc2sgPSBtdkJvYXJkR3Bpb0ludE1hc2tHZXQoaSk7CiAJCW12R3BwVHlwZVNldChpLCBncHBNYXNrICwgKE1WX0dQUF9JTiAmIGdwcE1hc2spKTsKIAkJbXZHcHBQb2xhcml0eVNldChpLCBncHBNYXNrICwgKE1WX0dQUF9JTl9JTlZFUlQgJiBncHBNYXNrKSk7CkBAIC0yODYsMTUgKzM3NywyMiBAQAogCW12Qm9hcmRPdGhlck1vZHVsZXNTY2FuKCk7CiAKIAkvKiBVcGRhdGUgaW50ZXJmYWNlcyBjb25maWd1cmF0aW9uIGJhc2VkIG9uIGFib3ZlIHNjYW4gKi8KLQlpZiAoTVZfT0sgIT0gbXZDdHJsU2VyZGVzUGh5Q29uZmlnKCkpCisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJc3RhdHVzID0gbXZDdHJsU2VyZGVzUGh5Q29uZmlnQXhwKCk7CisJZWxzZQorCQlzdGF0dXMgPSBtdkN0cmxTZXJkZXNQaHlDb25maWcoKTsKKworCWlmIChzdGF0dXMgIT0gTVZfT0spCiAJCW12T3NQcmludGYoIm12Q3RybEVudkluaXQ6IENhbid0IGluaXQgc29tZSBvciBhbGwgU0VSREVTIGxhbmVzXG4iKTsKIAotCW12Q3RybERldkJ1c0luaXQoKTsKKwlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgIT0gTVZfNzg0NjBfREVWX0lEKSB7CisJCW12Q3RybERldkJ1c0luaXQoKTsKIAogI2lmZGVmIEVSUkFUQV9HTF81OTU2ODAyCiAJCS8qIFNXIFdBIGZvciBFUlJBVEEgNTk1NjgwMiAtIGRpc2FibGUgdGhlIGV4dGVybmFsIGkyYyBkZWJ1Z2dlciBhY2Nlc3MgKi8KIAkJTVZfUkVHX0JJVF9SRVNFVChUV1NJX0NPTkZJR19ERUJVR19SRUcsIFRXU0lfREVCVUdfU0xBVkVfUE9SVDBfRU4pOwogI2VuZGlmCisJfQogCiAJbXZPc0RlbGF5KDEwMCk7CiAKQEAgLTMxOCw5ICs0MTYsMTQgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9VMzIgbXZDdHJsTXBwUmVnR2V0KE1WX1UzMiBtcHBHcm91cCkKIHsKLQlNVl9VMzIgcmV0OworCU1WX1UzMiByZXQsIG1heEdyb3VwOwogCi0JaWYgKG1wcEdyb3VwID49IE1WX01QUF9NQVhfR1JPVVApCisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJbWF4R3JvdXAgPSBNVl9NUFBfTUFYX0dST1VQX0FYUDsKKwllbHNlCisJCW1heEdyb3VwID0gTVZfTVBQX01BWF9HUk9VUDsKKworCWlmIChtcHBHcm91cCA+PSBtYXhHcm91cCkKIAkJbXBwR3JvdXAgPSAwOwogCiAJcmV0ID0gTVBQX0NPTlRST0xfUkVHKG1wcEdyb3VwKTsKQEAgLTM0OCw2ICs0NTEsOCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1UzMiBtdkN0cmxQZXhNYXhJZkdldChNVl9WT0lEKQogeworCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpCisJCXJldHVybiBNVl9QRVhfTUFYX0lGOwogCXJldHVybiBtdkN0cmxTb2NVbml0SW5mb051bUdldChQRVhfVU5JVF9JRCk7CiB9CiAKQEAgLTQzNyw2ICs1NDIsOCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1U4IG12Q3RybEV0aE1heENQVXNHZXQoTVZfVk9JRCkKIHsKKwlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfNzg0NjBfREVWX0lEKQorCQlyZXR1cm4gbXZDdHJsRXRoTWF4UG9ydEdldCgpOwogCXJldHVybiAyOwogfQogCkBAIC01NTgsNiArNjY1LDY0IEBACiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZDdHJsTW9kZWxHZXRBeHAgLSBHZXQgTWFydmVsbCBjb250cm9sbGVyIGRldmljZSBtb2RlbCAoSWQpIGZvciBBWFAgZGV2aWNlcworKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDE2Yml0IGRlc2NyaWJpbmcgdGhlIGRldmljZSBtb2RlbCAoSUQpIGFzIGRlZmluZWQKKyogICAgICAgaW4gUENJIERldmljZSBhbmQgVmVuZG9yIElEIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgb2Zmc2V0IDB4MC4KKyoKKyogSU5QVVQ6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICAxNmJpdCBkZXNzY3JpYmluZyBNYXJ2ZWxsIGNvbnRyb2xsZXIgSUQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9VMTYgbXZDdHJsTW9kZWxHZXRBeHAoTVZfVk9JRCkKK3sKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfQ0xLX1BXUl9DTlRSTCkKKwlNVl9VMzIgcGV4UG93ZXI7CisjZW5kaWYKKwlNVl9VMzIgZGV2SWQ7CisJTVZfVTE2IG1vZGVsID0gMDsKKwlNVl9VMzIgcmVnLCByZWcyOworCXN0YXRpYyBNVl9VMTYgbW9kZWxJZCA9IDB4ZmZmZjsKKworCWlmIChtb2RlbElkICE9IDB4ZmZmZikKKwkJcmV0dXJuIG1vZGVsSWQ7CisKKwkvKiBpZiBQRVgwIGNsb2NrcyBhcmUgZGlzYWJsZWQgLSBlbmFibGVkIGl0IHRvIHJlYWQgKi8KKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfQ0xLX1BXUl9DTlRSTCkKKwkvKiBDaGVjayBwZXggcG93ZXIgc3RhdGUgKi8KKwlwZXhQb3dlciA9IG12Q3RybFB3ckNsY2tHZXQoUEVYX1VOSVRfSUQsIDApOworCWlmIChwZXhQb3dlciA9PSBNVl9GQUxTRSkKKwkJbXZDdHJsUHdyQ2xja1NldChQRVhfVU5JVF9JRCwgMCwgTVZfVFJVRSk7CisjZW5kaWYKKwlyZWcgPSBNVl9SRUdfUkVBRChQT1dFUl9NTkdfQ1RSTF9SRUcpOworCWlmICgocmVnICYgQVhQX1BNQ19QRVhTVE9QQ0xPQ0tfTUFTSygwKSkgPT0gQVhQX1BNQ19QRVhTVE9QQ0xPQ0tfU1RPUCgwKSkgeworCQlyZWcyID0gKChyZWcgJiB+QVhQX1BNQ19QRVhTVE9QQ0xPQ0tfTUFTSygwKSkgfCBBWFBfUE1DX1BFWFNUT1BDTE9DS19FTigwKSk7CisJCU1WX1JFR19XUklURShQT1dFUl9NTkdfQ1RSTF9SRUcsIHJlZzIpOworCX0KKworCWRldklkID0gTVZfUkVHX1JFQUQoUEVYX0NGR19ESVJFQ1RfQUNDRVNTKDAsIFBFWF9ERVZJQ0VfQU5EX1ZFTkRPUl9JRCkpOworCisJLyogUmVzZXQgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBQRVgwIGNsb2NrICovCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX0NMS19QV1JfQ05UUkwpCisJLyogUmV0dXJuIHRvIHBvd2VyIG9mZiBzdGF0ZSAqLworCWlmIChwZXhQb3dlciA9PSBNVl9GQUxTRSkKKwkJbXZDdHJsUHdyQ2xja1NldChQRVhfVU5JVF9JRCwgMCwgTVZfRkFMU0UpOworI2VuZGlmCisKKwltb2RlbCA9IChNVl9VMTYpICgoZGV2SWQgPj4gMTYpICYgMHhGRkZGKTsKKworCW1vZGVsSWQgPSBtb2RlbDsKKwlyZXR1cm4gbW9kZWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12Q3RybE1vZGVsR2V0IC0gR2V0IE1hcnZlbGwgY29udHJvbGxlciBkZXZpY2UgbW9kZWwgKElkKQogKgogKiBERVNDUklQVElPTjoKQEAgLTU3OCwxMSArNzQzLDE1IEBACiB7CiAJTVZfVTMyCWN0cmxJZCA9IE1WX1JFR19SRUFEKERFVl9JRF9SRUcpOwogCisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJcmV0dXJuIG12Q3RybE1vZGVsR2V0QXhwKCk7CisKIAljdHJsSWQgPSAoY3RybElkICYgKERFVklDRV9JRF9NQVNLKSkgPj4gREVWSUNFX0lEX09GRlM7CiAKIAlzd2l0Y2ggKGN0cmxJZCAmIH5ERVZJQ0VfRkxBVk9SX01BU0spIHsKIAljYXNlIE1WX0JPQkNBVDJfREVWX0lEOgogCWNhc2UgTVZfQUxMRVlDQVQzX0RFVl9JRDoKKwljYXNlIE1WX0JPQktfREVWX0lEOgogCQlyZXR1cm4gY3RybElkOwogCWRlZmF1bHQ6CiAJCW12T3NQcmludGYoIiVzOiBFcnJvcjogRmFpbGVkIHRvIG9idGFpbiBDb250cm9sbGVyIERldmljZSBJRFxuIiwgX19mdW5jX18pOwpAQCAtNjA5LDggKzc3OCwzMCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1U4IG12Q3RybFJldkdldChNVl9WT0lEKQogewotCU1WX1UzMiB2YWx1ZSA9IE1WX0RGWF9SRUdfUkVBRChERVZfUkVWX0lEX1JFRyk7Ci0JcmV0dXJuICh2YWx1ZSAmIChSRVZJU09OX0lEX01BU0spKSA+PiBSRVZJU09OX0lEX09GRlM7CisjaWYgZGVmaW5lZChNVl9JTkNMVURFX0NMS19QV1JfQ05UUkwpCisJTVZfVTMyIHBleFBvd2VyOworI2VuZGlmCisJTVZfVTMyIHZhbHVlOworCU1WX1U4IHJldk51bTsKKworCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSAhPSBNVl83ODQ2MF9ERVZfSUQpIHsKKwkJdmFsdWUgPSBNVl9ERlhfUkVHX1JFQUQoREVWX1JFVl9JRF9SRUcpOworCQlyZXR1cm4gKHZhbHVlICYgKFJFVklTT05fSURfTUFTSykpID4+IFJFVklTT05fSURfT0ZGUzsKKwl9CisKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfQ0xLX1BXUl9DTlRSTCkKKwkvKiBDaGVjayBwZXggcG93ZXIgc3RhdGUgKi8KKwlwZXhQb3dlciA9IG12Q3RybFB3ckNsY2tHZXQoUEVYX1VOSVRfSUQsIDApOworCWlmIChwZXhQb3dlciA9PSBNVl9GQUxTRSkKKwkJbXZDdHJsUHdyQ2xja1NldChQRVhfVU5JVF9JRCwgMCwgTVZfVFJVRSk7CisjZW5kaWYKKwlyZXZOdW0gPSAoTVZfVTgpTVZfUkVHX1JFQUQoUEVYX0NGR19ESVJFQ1RfQUNDRVNTKDAsIFBDSV9DTEFTU19DT0RFX0FORF9SRVZJU0lPTl9JRCkpOworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9DTEtfUFdSX0NOVFJMKQorCS8qIFJldHVybiB0byBwb3dlciBvZmYgc3RhdGUgKi8KKwlpZiAocGV4UG93ZXIgPT0gTVZfRkFMU0UpCisJCW12Q3RybFB3ckNsY2tTZXQoUEVYX1VOSVRfSUQsIDAsIE1WX0ZBTFNFKTsKKyNlbmRpZgorCXJldHVybiAocmV2TnVtICYgUENDUklSX1JFVklEX01BU0spID4+IFBDQ1JJUl9SRVZJRF9PRkZTOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjMxLDcgKzgyMiwxMSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1NUQVRVUyBtdkN0cmxOYW1lR2V0KGNoYXIgKnBOYW1lQnVmZikKIHsKLQltdk9zU1ByaW50ZihwTmFtZUJ1ZmYsICIlcyIsIFNPQ19OQU1FX1BSRUZJWCk7CisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJbXZPc1NQcmludGYocE5hbWVCdWZmLCAiJXMiLCAiIik7CisJZWxzZQorCQltdk9zU1ByaW50ZihwTmFtZUJ1ZmYsICIlcyIsIFNPQ19OQU1FX1BSRUZJWCk7CisKIAlyZXR1cm4gTVZfT0s7CiB9CiAKQEAgLTcwMSw3ICs4OTYsMjYgQEAKIAkJCW12T3NTUHJpbnRmKHBOYW1lQnVmZiwgIiBSZXYgJXMiLCByZXZBcnJheUFDM1tyZXZJZF0pOwogCQkJcmV0dXJuOwogCQl9CisJfSBlbHNlIGlmIChjdHJsRmFtaWx5ID09IE1WXzc4NDYwX0RFVl9JRCkgeworCQlzd2l0Y2ggKG12Q3RybE1vZGVsUmV2R2V0KCkpIHsKKwkJY2FzZSBNVl83ODQ2MF9BMF9JRDoKKwkJCW12T3NTUHJpbnRmKHBOYW1lQnVmZiwgIiVzIiwgTVZfNzg0NjBfQTBfTkFNRSk7CisJCQlyZXR1cm47CisJCWNhc2UgTVZfNzg0NjBfQjBfSUQ6CisJCQltdk9zU1ByaW50ZihwTmFtZUJ1ZmYsICIlcyIsIE1WXzc4NDYwX0IwX05BTUUpOworCQkJcmV0dXJuOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKGN0cmxGYW1pbHkgPT0gTVZfQk9CS19ERVZfSUQpIHsKIAorCQljaGFyICpyZXZBcnJheUJPQktbXSA9IE1WX0JPQktfSURfQVJSQVk7CisKKwkJc3dpdGNoIChyZXZJZCkgeworCQljYXNlIE1WX0JPQktfQTBfSUQ6CisJCQltdk9zU1ByaW50ZihwTmFtZUJ1ZmYsICIgUmV2ICVzIiwgcmV2QXJyYXlCT0JLW3JldklkXSk7CisJCQlyZXR1cm47CisJCX0KIAl9IGVsc2UKIAkJbXZPc1ByaW50ZigiJXM6IEVycm9yOiBXcm9uZyBjb250cm9sbGVyIG1vZGVsICUjeFxuIiwgX19mdW5jX18sIGN0cmxGYW1pbHkpOwogCkBAIC03NTEsMTcgKzk2NSwyMiBAQAogewogCU1WX1UzMglib2FyZElkID0gbXZCb2FyZElkR2V0KCk7CiAKLQlpZiAoKGJvYXJkSWQgPj0gQkMyX0NVU1RPTUVSX0JPQVJEX0lEX0JBU0UpICYmIChib2FyZElkIDwgQkMyX01BUlZFTExfTUFYX0JPQVJEX0lEKSkKKwlpZiAoYm9hcmRJZCA9PSBEQl83OFg2MF9BTUNfSUQpCisJCXJldHVybiBNVl83ODQ2MF9ERVZfSUQ7CisJZWxzZSBpZiAoKGJvYXJkSWQgPj0gQkMyX0NVU1RPTUVSX0JPQVJEX0lEX0JBU0UpICYmIChib2FyZElkIDwgQkMyX01BUlZFTExfTUFYX0JPQVJEX0lEKSkKIAkJcmV0dXJuIE1WX0JPQkNBVDJfREVWX0lEOwogCWVsc2UgaWYgKChib2FyZElkID49IEFDM19DVVNUT01FUl9CT0FSRF9JRF9CQVNFKSAmJiAoYm9hcmRJZCA8IEFDM19NQVJWRUxMX01BWF9CT0FSRF9JRCkpCiAJCXJldHVybiBNVl9BTExFWUNBVDNfREVWX0lEOworCWVsc2UgaWYgKChib2FyZElkID49IEJPQktfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRSkgJiYgKGJvYXJkSWQgPCBCT0JLX01BUlZFTExfTUFYX0JPQVJEX0lEKSkKKwkJcmV0dXJuIE1WX0JPQktfREVWX0lEOwogCWVsc2UgewogCQltdk9zUHJpbnRmKCIlczogRVJSLiBJbnZhbGlkIEJvYXJkIElEICglZCkgLFVzaW5nIEJDMiBhcyBkZWZhdWx0IGZhbWlseVxuIiwgX19mdW5jX18sIGJvYXJkSWQpOwogCQlyZXR1cm4gTVZfQk9CQ0FUMl9ERVZfSUQ7CiAJfQogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqY250cmxOYW1lW10gPSBUQVJHRVRTX05BTUVfQVJSQVk7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNudHJsTmFtZU1zeXNbXSA9IFRBUkdFVFNfTkFNRV9BUlJBWTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY250cmxOYW1lQXhwW10gPSBUQVJHRVRTX05BTUVfQVJSQVlfQVhQOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkN0cmxUYXJnZXROYW1lR2V0IC0gR2V0IE1hcnZlbGwgY29udHJvbGxlciB0YXJnZXQgbmFtZQpAQCAtNzgzLDcgKzEwMDIsMTAgQEAKIAlpZiAodGFyZ2V0ID49IE1BWF9UQVJHRVRTKQogCQlyZXR1cm4gInRhcmdldCB1bmtub3duIjsKIAotCXJldHVybiBjbnRybE5hbWVbdGFyZ2V0XTsKKwlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfNzg0NjBfREVWX0lEKQorCQlyZXR1cm4gY250cmxOYW1lQXhwW3RhcmdldF07CisJZWxzZQorCQlyZXR1cm4gY250cmxOYW1lTXN5c1t0YXJnZXRdOwogfQogCiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX1BFWCkKQEAgLTExNjEsOCArMTM4MywxMCBAQAogCiAJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WX0JPQkNBVDJfREVWX0lEKQogCQlzYXRyID0gTVNBUl9CQzJfQk9PVF9NT0RFKHNhdHIsIDApOwotCWVsc2UKKwllbHNlIGlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl9BTExFWUNBVDNfREVWX0lEKQogCQlzYXRyID0gTVNBUl9BQzNfQk9PVF9NT0RFKHNhdHIsIDApOworCWVsc2UKKwkJc2F0ciA9IE1TQVJfQk9CS19CT09UX01PREUoc2F0ciwgMCk7CiAKIAlpZiAoc2F0ciA9PSBTQVIxX0JPT1RfRlJPTV9OT1IpCiAJCXJldHVybiBNVl9UUlVFOwpAQCAtMTE5Miw4ICsxNDE2LDEwIEBACiAKIAlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpCiAJCXNhdHIgPSBNU0FSX0JDMl9CT09UX01PREUoc2F0ciwgMCk7Ci0JZWxzZQorCWVsc2UgaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpCiAJCXNhdHIgPSBNU0FSX0FDM19CT09UX01PREUoc2F0ciwgMCk7CisJZWxzZQorCQlzYXRyID0gTVNBUl9CT0JLX0JPT1RfTU9ERShzYXRyLCAwKTsKIAogCWlmIChzYXRyID09IFNBUjFfQk9PVF9GUk9NX1NQSSkKIAkJcmV0dXJuIE1WX1RSVUU7CkBAIC0xMjIzLDggKzE0NDksMTAgQEAKIAogCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl9CT0JDQVQyX0RFVl9JRCkKIAkJc2F0ciA9IE1TQVJfQkMyX0JPT1RfTU9ERShzYXRyLCAwKTsKLQllbHNlCisJZWxzZSBpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkKIAkJc2F0ciA9IE1TQVJfQUMzX0JPT1RfTU9ERShzYXRyLCAwKTsKKwllbHNlCisJCXNhdHIgPSBNU0FSX0JPQktfQk9PVF9NT0RFKHNhdHIsIDApOwogCiAJaWYgKHNhdHIgPT0gU0FSMV9CT09UX0ZST01fTkFORCkKIAkJcmV0dXJuIE1WX1RSVUU7CkBAIC0xMjY2LDMzICsxNDk0LDg0IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfVk9JRCBtdkN0cmxQd3JDbGNrU2V0KE1WX1VOSVRfSUQgdW5pdElkLCBNVl9VMzIgaW5kZXgsIE1WX0JPT0wgZW5hYmxlKQogeworCU1WX1UzMiBtYXNrOwogCiAJc3dpdGNoICh1bml0SWQpIHsKICNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfUEVYKQogCWNhc2UgUEVYX1VOSVRfSUQ6Ci0JCWlmIChlbmFibGUgPT0gTVZfRkFMU0UpCi0JCQlNVl9SRUdfQklUX1JFU0VUKFBPV0VSX01OR19DVFJMX1JFRywgUE1DX1BFWFNUT1BDTE9DS19NQVNLKTsKKwkJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJCW1hc2sgPSBBWFBfUE1DX1BFWFNUT1BDTE9DS19NQVNLKGluZGV4KTsKIAkJZWxzZQotCQkJTVZfUkVHX0JJVF9TRVQoUE9XRVJfTU5HX0NUUkxfUkVHLCBQTUNfUEVYU1RPUENMT0NLX01BU0spOworCQkJbWFzayA9IFBNQ19QRVhTVE9QQ0xPQ0tfTUFTSzsKKworCQlpZiAoZW5hYmxlID09IE1WX0ZBTFNFKQorCQkJTVZfUkVHX0JJVF9SRVNFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIG1hc2spOworCQllbHNlCisJCQlNVl9SRUdfQklUX1NFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIG1hc2spOwogCiAJCWJyZWFrOwogI2VuZGlmCiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX0dJR19FVEgpCiAJY2FzZSBFVEhfR0lHX1VOSVRfSUQ6Ci0JCWlmIChlbmFibGUgPT0gTVZfRkFMU0UpCi0JCQlNVl9SRUdfQklUX1JFU0VUKFBPV0VSX01OR19DVFJMX1JFRywgUE1DX0dFU1RPUENMT0NLX01BU0soaW5kZXgpKTsKKwkJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJCW1hc2sgPSBBWFBfUE1DX0dFU1RPUENMT0NLX01BU0soaW5kZXgpOwogCQllbHNlCi0JCQlNVl9SRUdfQklUX1NFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIFBNQ19HRVNUT1BDTE9DS19NQVNLKGluZGV4KSk7CisJCQltYXNrID0gUE1DX0dFU1RPUENMT0NLX01BU0soaW5kZXgpOworCisJCWlmIChlbmFibGUgPT0gTVZfRkFMU0UpCisJCQlNVl9SRUdfQklUX1JFU0VUKFBPV0VSX01OR19DVFJMX1JFRywgbWFzayk7CisJCWVsc2UKKwkJCU1WX1JFR19CSVRfU0VUKFBPV0VSX01OR19DVFJMX1JFRywgbWFzayk7CiAKIAkJYnJlYWs7CiAjZW5kaWYKICNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU0RJTykKIAljYXNlIFNESU9fVU5JVF9JRDoKLQkJaWYgKGVuYWJsZSA9PSBNVl9GQUxTRSkKLQkJCU1WX1JFR19CSVRfUkVTRVQoUE9XRVJfTU5HX0NUUkxfUkVHLCBQTUNfU0RJT1NUT1BDTE9DS19NQVNLKTsKKwkJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJCW1hc2sgPSBBWFBfUE1DX1NESU9TVE9QQ0xPQ0tfTUFTSzsKIAkJZWxzZQotCQkJTVZfUkVHX0JJVF9TRVQoUE9XRVJfTU5HX0NUUkxfUkVHLCBQTUNfU0RJT1NUT1BDTE9DS19NQVNLKTsKKwkJCW1hc2sgPSBQTUNfU0RJT1NUT1BDTE9DS19NQVNLOwogCisJCWlmIChlbmFibGUgPT0gTVZfRkFMU0UpCisJCQlNVl9SRUdfQklUX1JFU0VUKFBPV0VSX01OR19DVFJMX1JFRywgbWFzayk7CisJCWVsc2UKKwkJCU1WX1JFR19CSVRfU0VUKFBPV0VSX01OR19DVFJMX1JFRywgbWFzayk7CisKKwkJYnJlYWs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfQ0VTQSkKKwljYXNlIENFU0FfVU5JVF9JRDoKKwkJaWYgKGVuYWJsZSA9PSBNVl9GQUxTRSkKKwkJCU1WX1JFR19CSVRfUkVTRVQoUE9XRVJfTU5HX0NUUkxfUkVHLCBBWFBfUE1DX0NFU0FTVE9QQ0xPQ0tfTUFTSyk7CisJCWVsc2UKKwkJCU1WX1JFR19CSVRfU0VUKFBPV0VSX01OR19DVFJMX1JFRywgQVhQX1BNQ19DRVNBU1RPUENMT0NLX01BU0spOworCisJCWJyZWFrOworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1VTQikKKwljYXNlIFVTQl9VTklUX0lEOgorCQlpZiAoZW5hYmxlID09IE1WX0ZBTFNFKQorCQkJTVZfUkVHX0JJVF9SRVNFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIEFYUF9QTUNfVVNCU1RPUENMT0NLX01BU0soaW5kZXgpKTsKKwkJZWxzZQorCQkJTVZfUkVHX0JJVF9TRVQoUE9XRVJfTU5HX0NUUkxfUkVHLCBBWFBfUE1DX1VTQlNUT1BDTE9DS19NQVNLKGluZGV4KSk7CisKKwkJYnJlYWs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfSU5URUdfU0FUQSkKKwljYXNlIFNBVEFfVU5JVF9JRDoKKwkJaWYgKGVuYWJsZSA9PSBNVl9GQUxTRSkKKwkJCU1WX1JFR19CSVRfUkVTRVQoUE9XRVJfTU5HX0NUUkxfUkVHLCBBWFBfUE1DX1NBVEFTVE9QQ0xPQ0tfTUFTSyhpbmRleCkpOworCQllbHNlCisJCQlNVl9SRUdfQklUX1NFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIEFYUF9QTUNfU0FUQVNUT1BDTE9DS19NQVNLKGluZGV4KSk7CisKKwkJYnJlYWs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfVERNKQorCWNhc2UgVERNX1VOSVRfSUQ6CisJCWlmIChlbmFibGUgPT0gTVZfRkFMU0UpCisJCQlNVl9SRUdfQklUX1JFU0VUKFBPV0VSX01OR19DVFJMX1JFRywgQVhQX1BNQ19URE1TVE9QQ0xPQ0tfTUFTSyk7CisJCWVsc2UKKwkJCU1WX1JFR19CSVRfU0VUKFBPV0VSX01OR19DVFJMX1JFRywgQVhQX1BNQ19URE1TVE9QQ0xPQ0tfTUFTSyk7CiAJCWJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoKQEAgLTEzMTUsMTMgKzE1OTQsMjIgQEAKIHsKICNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfUEVYKSB8fCBkZWZpbmVkKE1WX0lOQ0xVREVfUEVYKSB8fCBkZWZpbmVkKE1WX0lOQ0xVREVfR0lHX0VUSCkgfHwgZGVmaW5lZChNVl9JTkNMVURFX1NESU8pCiAJTVZfVTMyIHJlZyA9IE1WX1JFR19SRUFEKFBPV0VSX01OR19DVFJMX1JFRyk7CisJTVZfVTMyIG1hc2ssIHN0b3A7CiAjZW5kaWYKIAlNVl9CT09MIHN0YXRlID0gTVZfVFJVRTsKIAogCXN3aXRjaCAodW5pdElkKSB7CiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX1BFWCkKIAljYXNlIFBFWF9VTklUX0lEOgotCQlpZiAoKHJlZyAmIFBNQ19QRVhTVE9QQ0xPQ0tfTUFTSykgPT0gUE1DX1BFWFNUT1BDTE9DS19TVE9QKQorCQlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfNzg0NjBfREVWX0lEKSB7CisJCQltYXNrID0gQVhQX1BNQ19QRVhTVE9QQ0xPQ0tfTUFTSyhpbmRleCk7CisJCQlzdG9wID0gQVhQX1BNQ19QRVhTVE9QQ0xPQ0tfU1RPUChpbmRleCk7CisJCX0gZWxzZSB7CisJCQltYXNrID0gUE1DX1BFWFNUT1BDTE9DS19NQVNLOworCQkJc3RvcCA9IFBNQ19QRVhTVE9QQ0xPQ0tfU1RPUDsKKwkJfQorCisJCWlmICgocmVnICYgbWFzaykgPT0gc3RvcCkKIAkJCXN0YXRlID0gTVZfRkFMU0U7CiAJCWVsc2UKIAkJCXN0YXRlID0gTVZfVFJVRTsKQEAgLTEzMjksNyArMTYxNywxNSBAQAogI2VuZGlmCiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX0dJR19FVEgpCiAJY2FzZSBFVEhfR0lHX1VOSVRfSUQ6Ci0JCWlmICgocmVnICYgUE1DX0dFU1RPUENMT0NLX01BU0soaW5kZXgpKSA9PSBQTUNfR0VTVE9QQ0xPQ0tfU1RPUChpbmRleCkpCisJCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpIHsKKwkJCW1hc2sgPSBBWFBfUE1DX0dFU1RPUENMT0NLX01BU0soaW5kZXgpOworCQkJc3RvcCA9IEFYUF9QTUNfR0VTVE9QQ0xPQ0tfU1RPUChpbmRleCk7CisJCX0gZWxzZSB7CisJCQltYXNrID0gUE1DX0dFU1RPUENMT0NLX01BU0soaW5kZXgpOworCQkJc3RvcCA9IFBNQ19HRVNUT1BDTE9DS19TVE9QKGluZGV4KTsKKwkJfQorCisJCWlmICgocmVnICYgbWFzaykgPT0gc3RvcCkKIAkJCXN0YXRlID0gTVZfRkFMU0U7CiAJCWVsc2UKIAkJCXN0YXRlID0gTVZfVFJVRTsKQEAgLTEzMzcsNyArMTYzMyw0OSBAQAogI2VuZGlmCiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NESU8pCiAJY2FzZSBTRElPX1VOSVRfSUQ6Ci0JCWlmICgocmVnICYgUE1DX1NESU9TVE9QQ0xPQ0tfTUFTSykgPT0gUE1DX1NESU9TVE9QQ0xPQ0tfU1RPUCkKKwkJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkgeworCQkJbWFzayA9IEFYUF9QTUNfU0RJT1NUT1BDTE9DS19NQVNLOworCQkJc3RvcCA9IEFYUF9QTUNfU0RJT1NUT1BDTE9DS19TVE9QOworCQl9IGVsc2UgeworCQkJbWFzayA9IFBNQ19TRElPU1RPUENMT0NLX01BU0s7CisJCQlzdG9wID0gUE1DX1NESU9TVE9QQ0xPQ0tfU1RPUDsKKwkJfQorCisJCWlmICgocmVnICYgbWFzaykgPT0gc3RvcCkKKwkJCXN0YXRlID0gTVZfRkFMU0U7CisJCWVsc2UKKwkJCXN0YXRlID0gTVZfVFJVRTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfQ0VTQSkKKwljYXNlIENFU0FfVU5JVF9JRDoKKwkJaWYgKChyZWcgJiBBWFBfUE1DX0NFU0FTVE9QQ0xPQ0tfTUFTSykgPT0gQVhQX1BNQ19DRVNBU1RPUENMT0NLX1NUT1ApCisJCQlzdGF0ZSA9IE1WX0ZBTFNFOworCQllbHNlCisJCQlzdGF0ZSA9IE1WX1RSVUU7CisJCWJyZWFrOworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1VTQikKKwljYXNlIFVTQl9VTklUX0lEOgorCQlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgIT0gTVZfNzg0NjBfREVWX0lEKQorCQkJc3RhdGUgPSBNVl9UUlVFOworCQllbHNlIGlmICgocmVnICYgQVhQX1BNQ19VU0JTVE9QQ0xPQ0tfTUFTSyhpbmRleCkpID09IEFYUF9QTUNfVVNCU1RPUENMT0NLX1NUT1AoaW5kZXgpKQorCQkJc3RhdGUgPSBNVl9GQUxTRTsKKwkJZWxzZQorCQkJc3RhdGUgPSBNVl9UUlVFOworCQlicmVhazsKKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TQVRBKQorCWNhc2UgU0FUQV9VTklUX0lEOgorCQlpZiAoKHJlZyAmIEFYUF9QTUNfU0FUQVNUT1BDTE9DS19NQVNLKGluZGV4KSkgPT0gQVhQX1BNQ19TQVRBU1RPUENMT0NLX1NUT1AoaW5kZXgpKQorCQkJc3RhdGUgPSBNVl9GQUxTRTsKKwkJZWxzZQorCQkJc3RhdGUgPSBNVl9UUlVFOworCQlicmVhazsKKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9URE0pCisJY2FzZSBURE1fVU5JVF9JRDoKKwkJaWYgKChyZWcgJiBBWFBfUE1DX1RETVNUT1BDTE9DS19NQVNLKSA9PSBBWFBfUE1DX1RETVNUT1BDTE9DS19TVE9QKQogCQkJc3RhdGUgPSBNVl9GQUxTRTsKIAkJZWxzZQogCQkJc3RhdGUgPSBNVl9UUlVFOwpAQCAtMTM2Niw5ICsxNzA0LDE2IEBACiBNVl9VMzIgbXZDdHJsRERSQnVkV2lkdGgoTVZfVk9JRCkKIHsKIAlNVl9VMzIgcmVnOwotCXJlZyA9IE1WX1JFR19SRUFEKFJFR19TRFJBTV9DT05GSUdfQUREUik7CiAKLQlyZXR1cm4gKHJlZyAmICgxIDw8IFJFR19TRFJBTV9DT05GSUdfRERSX0JVU19PRkZTKSkgPyAzMiA6IDE2OworCXJlZyA9IE1WX1JFR19SRUFEKFJFR19TRFJBTV9DT05GSUdfQUREUik7CisJcmVnID0gcmVnICYgKDEgPDwgUkVHX1NEUkFNX0NPTkZJR19ERFJfQlVTX09GRlMpOworCisJLyogQm9iY2F0MiBhbmQgQm9iSyBoYXZlIDY0LzE2IEREUiBCdXMgd2lkdGggKi8KKwlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQgfHwgbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfQk9CS19ERVZfSUQpCisJCXJldHVybiByZWcgPyA2NCA6IDMyOworCWVsc2UJLyogQWxsZXktQ2F0MyBoYXZlIDMyLzE2IEREUiBCdXMgd2lkdGggKi8KKwkJcmV0dXJuIHJlZyA/IDMyIDogMTY7CisKIH0KIE1WX0JPT0wgbXZDdHJsRERSVGhydVhiYXIoTVZfVk9JRCkKIHsKQEAgLTEzODYsNiArMTczMSwxNjYgQEAKIAlyZXR1cm4gKHJlZyAmICgweDEgPDwgUkVHX1NEUkFNX0NPTkZJR19FQ0NfT0ZGUykpID8gTVZfVFJVRSA6IE1WX0ZBTFNFOwogfQogCitzdGF0aWMgY29uc3QgTVZfVTggc2VyZGVzQ2ZnW11bOF0gPSBTRVJERVNfQ0ZHX0FYUDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZDdHJsU2VyZGVzUGh5Q29uZmlnQXhwCisqCisqIERFU0NSSVBUSU9OOgorKglDb25maWd1cmUgU2VyZGVzIE1VWCBhbmQgaW5pdCBQSFlzIGNvbm5lY3RlZCB0byBTRVJERVMgbGluZXMgZm9yIEFYUC4KKyoKKyogSU5QVVQ6CisqCU5vbmUuCisqCisqIE9VVFBVVDoKKyoJTm9uZS4KKyoKKyogUkVUVVJOOgorKglTdGF0dXMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgbXZDdHJsU2VyZGVzUGh5Q29uZmlnQXhwKE1WX1ZPSUQpCit7CisJTVZfVTMyCQlzb2NDdHJsUmVnLCBSZWdYNCwgc2VyZGVzTGluZTBfNzsKKwlNVl9VMzIJCXNlcmRlc0xpbmVDZmc7CisJTVZfVTgJCXNlcmRlc0xpbmVOdW07CisJTVZfVTgJCXBleElmOworCU1WX1U4CQlwZXhVbml0OworCU1WX1NUQVRVUwlzdGF0dXMgPSBNVl9PSzsKKwlNVl9VMzIJCXBleElmTnVtID0gbXZDdHJsUGV4TWF4SWZHZXQoKTsKKwlNVl9VOAkJbWF4U2VyZGVzTGluZXMgPSAxNjsJLyogVmFsaWQgZm9yIE1WXzc4NDYwX0RFVl9JRCAqLworCU1WX0JPQVJEX1BFWF9JTkZPCSpib2FyZFBleEluZm8gPSBtdkJvYXJkUGV4SW5mb0dldCgpOworCisJLyogVGhpcyBpcyBhIG1hcHBpbmcgb2YgdGhlIGZpbmFsIHBvd2VyIG1hbmFnZW1lbnQgY2xvY2sKKwkgKiBnYXRpbmcgY29udHJvbCByZWdpc3RlciB2YWx1ZSBAIDB4MTgyMjAKKwkgKi8KKwlNVl9VMzIJcG93ZXJtbmdtbnRjdHJscmVnbWFwID0gMHgwOworCU1WX1UzMgl0bXBjb3VudGVyID0gMDsKKworCS8qIENoZWNrIGlmIG5vIFNFUkRFU3MgYXZhaWxhYmxlIC0gRlBHQSAqLworCWlmIChtYXhTZXJkZXNMaW5lcyA9PSAwKQorCQlyZXR1cm4gTVZfT0s7CisKKwltZW1zZXQoYm9hcmRQZXhJbmZvLCAwLCBzaXplb2YoTVZfQk9BUkRfUEVYX0lORk8pKTsKKwlzb2NDdHJsUmVnID0gTVZfUkVHX1JFQUQoU09DX0NUUkxfUkVHKTsKKwlSZWdYNCA9IE1WX1JFR19SRUFEKEdFTl9QVVJQX1JFU18yX1JFRyk7CisJYm9hcmRQZXhJbmZvLT5wZXhVbml0Q2ZnWzBdLnBleENmZyA9ICgoUmVnWDQgJiAweDBGKSA9PSAweDBGKSA/IFBFWF9CVVNfTU9ERV9YNCA6IFBFWF9CVVNfTU9ERV9YMTsKKwlib2FyZFBleEluZm8tPnBleFVuaXRDZmdbMV0ucGV4Q2ZnID0gKChSZWdYNCAmIDB4MEYwKSA9PSAweDBGMCkgPyBQRVhfQlVTX01PREVfWDQgOiBQRVhfQlVTX01PREVfWDE7CisJYm9hcmRQZXhJbmZvLT5wZXhVbml0Q2ZnWzJdLnBleENmZyA9ICgoUmVnWDQgJiAweDBGMDApID09IDB4MEYwMCkgPyBQRVhfQlVTX01PREVfWDQgOiBQRVhfQlVTX01PREVfWDE7CisJYm9hcmRQZXhJbmZvLT5wZXhVbml0Q2ZnWzNdLnBleENmZyA9ICgoUmVnWDQgJiAweDBGMDAwKSA9PSAweDBGMDAwKSA/IFBFWF9CVVNfTU9ERV9YNCA6IFBFWF9CVVNfTU9ERV9YMTsKKworCXNlcmRlc0xpbmUwXzcgPSBNVl9SRUdfUkVBRChTRVJERVNfTElORV9NVVhfUkVHXzBfNyk7CisJLyogUHJlcGFyZSBQSFkgcGFyYW1ldGVycyBmb3IgZWFjaCBzdGVwIGFjY29yZGluZyB0byAgTVVYIHNlbGVjdGlvbiAqLworCWZvciAocGV4SWYgPSAwOyBwZXhJZiA8IHBleElmTnVtOyBwZXhJZisrKSB7CisJCS8qIEZvciBlYWNoIHNlcmRlcyBsYW5lICovCisJCXBleFVuaXQgPSAocGV4SWYgPCA5KSA/IChwZXhJZiA+PiAyKSA6IDM7CisJCWlmICgoc29jQ3RybFJlZyAmICgxIDw8IHBleFVuaXQpKSA9PSAwKSB7CisJCQlib2FyZFBleEluZm8tPnBleFVuaXRDZmdbcGV4VW5pdF0ucGV4Q2ZnID0gUEVYX0JVU19ESVNBQkxFRDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChwZXhJZiA8IDgpIHsKKwkJCXNlcmRlc0xpbmVDZmcgPSAoc2VyZGVzTGluZTBfNyA+PiAocGV4SWYgPDwgMikpICYgMHhGOworCQkJaWYgKHNlcmRlc0xpbmVDZmcgIT0gc2VyZGVzQ2ZnW3BleElmXVtTRVJERVNfVU5JVF9QRVhdKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWJvYXJkUGV4SW5mby0+cGV4TWFwcGluZ1tib2FyZFBleEluZm8tPmJvYXJkUGV4SWZOdW1dID0gcGV4SWY7CisJCWJvYXJkUGV4SW5mby0+Ym9hcmRQZXhJZk51bSsrOworCQlib2FyZFBleEluZm8tPnBleFVuaXRDZmdbcGV4VW5pdF0ucGV4TGFuZVN0YXRbcGV4SWZdID0gMHgxOworCQlwb3dlcm1uZ21udGN0cmxyZWdtYXAgPSBwb3dlcm1uZ21udGN0cmxyZWdtYXAgfCAoMHgxIDw8IChwZXhJZiArIDUpKTsKKwkJaWYgKHBleElmIDwgOCkgeworCQkJaWYgKGJvYXJkUGV4SW5mby0+cGV4VW5pdENmZ1twZXhVbml0XS5wZXhDZmcgPT0gUEVYX0JVU19NT0RFX1g0KSB7CisJCQkJcG93ZXJtbmdtbnRjdHJscmVnbWFwIHw9ICgweGYgPDwgKHBleElmICsgNSkpOworCQkJCXBleElmICs9IDM7CisJCQl9IGVsc2UKKwkJCQlwb3dlcm1uZ21udGN0cmxyZWdtYXAgfD0gKDB4MSA8PCAocGV4SWYgKyA1KSk7CisJCX0gZWxzZQorCQkJcG93ZXJtbmdtbnRjdHJscmVnbWFwIHw9ICgweDEgPDwgKDE4ICsgcGV4SWYpKTsKKwl9CisKKwlmb3IgKHNlcmRlc0xpbmVOdW0gPSAwOyBzZXJkZXNMaW5lTnVtIDwgODsgc2VyZGVzTGluZU51bSsrKSB7CisJCXNlcmRlc0xpbmVDZmcgPSAoc2VyZGVzTGluZTBfNyA+PiAoc2VyZGVzTGluZU51bSA8PCAyKSkgJiAweEY7CisJCWlmIChzZXJkZXNMaW5lQ2ZnID09IHNlcmRlc0NmZ1tzZXJkZXNMaW5lTnVtXVtTRVJERVNfVU5JVF9TQVRBXSkgeworCQkJaWYgKChzZXJkZXNMaW5lTnVtID09IDQpIHx8IChzZXJkZXNMaW5lTnVtID09IDYpKQorCQkJCXBvd2VybW5nbW50Y3RybHJlZ21hcCB8PSBBWFBfUE1DX1NBVEFTVE9QQ0xPQ0tfTUFTSygwKTsKKwkJCWVsc2UgaWYgKHNlcmRlc0xpbmVOdW0gPT0gNSkKKwkJCQlwb3dlcm1uZ21udGN0cmxyZWdtYXAgfD0gQVhQX1BNQ19TQVRBU1RPUENMT0NLX01BU0soMSk7CisJCQllbHNlCisJCQkJZ290byBlcnJfY2ZnOworCisJCX0gZWxzZSBpZiAoc2VyZGVzTGluZUNmZyA9PSBzZXJkZXNDZmdbc2VyZGVzTGluZU51bV1bU0VSREVTX1VOSVRfU0dNSUkwXSkKKwkJCQlwb3dlcm1uZ21udGN0cmxyZWdtYXAgfD0gQVhQX1BNQ19HRVNUT1BDTE9DS19NQVNLKDApOworCQkJZWxzZSBpZiAoc2VyZGVzTGluZUNmZyA9PSBzZXJkZXNDZmdbc2VyZGVzTGluZU51bV1bU0VSREVTX1VOSVRfU0dNSUkxXSkKKwkJCQlwb3dlcm1uZ21udGN0cmxyZWdtYXAgfD0gQVhQX1BNQ19HRVNUT1BDTE9DS19NQVNLKDEpOworCQkJZWxzZSBpZiAoc2VyZGVzTGluZUNmZyA9PSBzZXJkZXNDZmdbc2VyZGVzTGluZU51bV1bU0VSREVTX1VOSVRfU0dNSUkyXSkKKwkJCQlwb3dlcm1uZ21udGN0cmxyZWdtYXAgfD0gQVhQX1BNQ19HRVNUT1BDTE9DS19NQVNLKDIpOworCQkJZWxzZSBpZiAoc2VyZGVzTGluZUNmZyA9PSBzZXJkZXNDZmdbc2VyZGVzTGluZU51bV1bU0VSREVTX1VOSVRfU0dNSUkzXSkKKwkJCQlwb3dlcm1uZ21udGN0cmxyZWdtYXAgfD0gQVhQX1BNQ19HRVNUT1BDTE9DS19NQVNLKDMpOworCQkJZWxzZSBpZiAoc2VyZGVzTGluZUNmZyA9PSBzZXJkZXNDZmdbc2VyZGVzTGluZU51bV1bU0VSREVTX1VOSVRfUVNHTUlJXSkKKwkJCQlwb3dlcm1uZ21udGN0cmxyZWdtYXAgfD0gQVhQX1BNQ19HRVNUT1BDTE9DS19NQVNLKDApIHwKKwkJCQkJCQkgQVhQX1BNQ19HRVNUT1BDTE9DS19NQVNLKDEpIHwKKwkJCQkJCQkgQVhQX1BNQ19HRVNUT1BDTE9DS19NQVNLKDIpIHwKKwkJCQkJCQkgQVhQX1BNQ19HRVNUT1BDTE9DS19NQVNLKDMpOworCX0KKworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9DTEtfUFdSX0NOVFJMKQorCS8qIEVuYWJsaW5nIHBvcnQgR0UwIGFsd2F5cyBzaW5jZSB3ZSBuZWVkIFNNSSAwIHRvIGFjY2VzcyBvdGhlciBQSFlzKi8KKwlwb3dlcm1uZ21udGN0cmxyZWdtYXAgPSBwb3dlcm1uZ21udGN0cmxyZWdtYXAgfCBCSVQ0OworCS8qIENoZWNrIGlmIEdFMSBpcyBub3QgZW5hYmxlZCB2aWEgTVBQcyBhbmQgbm90IFNlcmRlcyAtIGlmIHllcyB5b3UgaGF2ZSB0byBlbmFibGUgdGhlIGNsb2NrKi8KKwkJaWYgKE1WX1RSVUUgPT0gbXZCb2FyZElzR2JFUG9ydENvbm5lY3RlZCgxKSkKKwkJCXBvd2VybW5nbW50Y3RybHJlZ21hcCA9IHBvd2VybW5nbW50Y3RybHJlZ21hcCB8IEFYUF9QTUNfR0VTVE9QQ0xPQ0tfTUFTSygxKTsKKworCS8qIEhhcmQgY29yZSBlbmFibGUgRERSLCBVU0IsIFNESU8sIExDRCwgWE9SLCBJRE1BLCBDRVNBIGNhdXNlIHdlIGRvbid0IHN1cHBvcnQgdGhpcyBhdCB0aGlzIG1vbWVtdCovCisJcG93ZXJtbmdtbnRjdHJscmVnbWFwID0gcG93ZXJtbmdtbnRjdHJscmVnbWFwIHwgKEJJVDAgIHwgQklUMTMgfCAoMHgxRkY8PDE2KSB8CisJCQkJQklUMjQgfCBCSVQyNSB8IEJJVDI4IHwgQklUMzEpOworCURCKG12T3NQcmludGYoIiVzOlNodXR0aW5nIGRvd24gdW51c2VkIGludGVyZmFjZXM6XG4iLCBfX2Z1bmNfXykpOworCS8qIE5vdyByZXBvcnQgZXZlcnl0aGluZyB0byB0aGUgc2NyZWVuKi8KKwlpZiAoIShwb3dlcm1uZ21udGN0cmxyZWdtYXAgJiBBWFBfUE1DX1NBVEFTVE9QQ0xPQ0tfTUFTSygwKSkpIHsKKwkJREIobXZPc1ByaW50ZigiJXM6ICAgICAgIFNBVEEwXG4iLCBfX2Z1bmNfXykpOworCQltdkN0cmxQd3JDbGNrU2V0KFNBVEFfVU5JVF9JRCwgMCwgTVZfRkFMU0UpOworCX0KKwlpZiAoIShwb3dlcm1uZ21udGN0cmxyZWdtYXAgJiBBWFBfUE1DX1NBVEFTVE9QQ0xPQ0tfTUFTSygxKSkpIHsKKwkJREIobXZPc1ByaW50ZigiJXM6ICAgICAgIFNBVEExXG4iLCBfX2Z1bmNfXykpOworCQltdkN0cmxQd3JDbGNrU2V0KFNBVEFfVU5JVF9JRCwgMSwgTVZfRkFMU0UpOworCX0KKwlmb3IgKHRtcGNvdW50ZXIgPSAwOyB0bXBjb3VudGVyIDwgNDsgdG1wY291bnRlcisrKSB7CisJCWlmICghKHBvd2VybW5nbW50Y3RybHJlZ21hcCAmICgxIDw8ICg0IC0gdG1wY291bnRlcikpKSkgeworCQkJREIobXZPc1ByaW50ZigiJXM6ICAgICAgIEdCRSVkXG4iLCBfX2Z1bmNfXywgdG1wY291bnRlcikpOworCQkJbXZDdHJsUHdyQ2xja1NldChFVEhfR0lHX1VOSVRfSUQsIHRtcGNvdW50ZXIsIE1WX0ZBTFNFKTsKKwkJfQorCX0KKwlmb3IgKHRtcGNvdW50ZXIgPSAwOyB0bXBjb3VudGVyIDwgODsgdG1wY291bnRlcisrKSB7CisJCWlmICghKHBvd2VybW5nbW50Y3RybHJlZ21hcCAmICgxIDw8ICg1ICsgdG1wY291bnRlcikpKSkgeworCQkJREIobXZPc1ByaW50ZigiJXM6ICAgICAgIFBFWCVkLiVkXG4iLCBfX2Z1bmNfXywgdG1wY291bnRlcj4+MiwgdG1wY291bnRlciAlIDQpKTsKKwkJCW12Q3RybFB3ckNsY2tTZXQoUEVYX1VOSVRfSUQsIHRtcGNvdW50ZXIsIE1WX0ZBTFNFKTsKKwkJfQorCX0KKwlpZiAoIShwb3dlcm1uZ21udGN0cmxyZWdtYXAgJiBCSVQyNikpIHsKKwkJREIobXZPc1ByaW50ZigiJXM6ICAgICAgIFBFWDJcbiIsIF9fZnVuY19fKSk7CisJCW12Q3RybFB3ckNsY2tTZXQoUEVYX1VOSVRfSUQsIDgsIE1WX0ZBTFNFKTsKKwl9CisJaWYgKCEocG93ZXJtbmdtbnRjdHJscmVnbWFwICYgQklUMjcpKSB7CisJCURCKG12T3NQcmludGYoIiVzOiAgICAgICBQRVgzXG4iLCBfX2Z1bmNfXykpOworCQltdkN0cmxQd3JDbGNrU2V0KFBFWF9VTklUX0lELCA5LCBNVl9GQUxTRSk7CisJfQorCisJaWYgKCEocG93ZXJtbmdtbnRjdHJscmVnbWFwICYgQklUMjUpKSB7CisJCURCKG12T3NQcmludGYoIiVzOiAgICAgICBURE1cbiIsIF9fZnVuY19fKSk7CisJCW12Q3RybFB3ckNsY2tTZXQoVERNX1VOSVRfSUQsIDAsIE1WX0ZBTFNFKTsKKwl9CisKKwkvKiBBcHBseSBjbG9jayBnYXRpbmcgKi8KKwlNVl9SRUdfV1JJVEUoUE9XRVJfTU5HX0NUUkxfUkVHLCBNVl9SRUdfUkVBRChQT1dFUl9NTkdfQ1RSTF9SRUcpICYgcG93ZXJtbmdtbnRjdHJscmVnbWFwKTsKKwkvKiBUaGUgU2F0YSBkcml2ZXIgZG9lc24ndCBzdXBwb3J0IGNsb2NrIGdhdGluZyBhdCB0aGlzIHBvaW50IHNvIHdlIGVuYWJsZSB0aGUgbG9naWMgdG8gdGhlIGJsb2NrKi8KKwlNVl9SRUdfV1JJVEUoUE9XRVJfTU5HX0NUUkxfUkVHLCBNVl9SRUdfUkVBRChQT1dFUl9NTkdfQ1RSTF9SRUcpIHwgKEJJVDE1IHwgQklUMzApKTsKKyNlbmRpZiAvKiBkZWZpbmVkKE1WX0lOQ0xVREVfQ0xLX1BXUl9DTlRSTCkgKi8KKworCXJldHVybiBzdGF0dXM7CitlcnJfY2ZnOgorCURCKG12T3NQcmludGYoIiVzOiBXcm9uZyBDRkcgKCUjeCkgZm9yIFNFUkRFUyBsaW5lICVkLlxuIiwKKwkJX19mdW5jX18sIHNlcmRlc0xpbmVDZmcsIHNlcmRlc0xpbmVOdW0pKTsKKwlyZXR1cm4gTVZfRVJST1I7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12Q3RybFNlcmRlc1BoeUNvbmZpZwogKgpAQCAtMTU0OCw2ICsyMDUzLDUzIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Q3RybE5hbmRDbGtTZXRBeHAKKyoKKyogREVTQ1JJUFRJT046CisqCVNldCB0aGUgZGl2aXNpb24gcmF0aW8gb2YgRUNDIENsb2NrIGZvciBBWFAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG12Q3RybE5hbmRDbGtTZXRBeHAoaW50IG5mY19jbGtfZnJlcSwgTVZfVTMyIHBsbF9jbGspCit7CisJaW50IGRpdmlkZXI7CisKKwkvKiBTZXQgdGhlIGRpdmlzaW9uIHJhdGlvIG9mIEVDQyBDbG9jayAweDAwMDE4NzQ4WzEzOjhdIChieSBkZWZhdWx0IGl0J3MKKwkgKiBkb3VibGUgb2YgY29yZSBjbG9jaykKKwkgKi8KKwlNVl9VMzIgblZhbCA9IE1WX1JFR19SRUFEKEFYUF9DT1JFX0RJVl9DTEtfQ1RSTCgxKSk7CisKKwkvKiBDYWxjdWxhdGUgbmFuZCBkaXZpZGVyIGZvciByZXF1ZXN0ZWQgbmZjX2Nsa19mcmVxLiBJZiBpbnRlZ2VyIGRpdmlkZXIKKwkgKiBjYW5ub3QgYmUgYWNoaWV2ZWQsIGl0IHdpbGwgYmUgcm91bmRlZC11cCwgd2hpY2ggd2lsbCByZXN1bHQgaW4KKwkgKiBzZXR0aW5nIHRoZSBjbG9zZXN0IGxvd2VyIGZyZXF1ZW5jeS4KKwkgKiBFQ0MgZW5naW5lIGNsb2NrID0gKFBMTCBmcmVxdWVuY3kgLyBkaXZpZGVyKQorCSAqIE5GQyBjbG9jayA9IEVDQyBjbG9jayAvIDIKKwkgKi8KKwlkaXZpZGVyID0gRElWX1JPVU5EX1VQKHBsbF9jbGssICgyICogbmZjX2Nsa19mcmVxKSk7CisJREIobXZPc1ByaW50ZigiJXM6IGRpdmlkZXIgJWRcbiIsIF9fZnVuY19fLCBkaXZpZGVyKSk7CisKKwluVmFsICY9IH4oQVhQX05BTkRfRUNDX0RJVkNMS19SQVRJT19NQVNLKTsKKwluVmFsIHw9IChkaXZpZGVyIDw8IEFYUF9OQU5EX0VDQ19ESVZDTEtfUkFUSU9fT0ZGUyk7CisJTVZfUkVHX1dSSVRFKEFYUF9DT1JFX0RJVl9DTEtfQ1RSTCgxKSwgblZhbCk7CisKKwkvKiBTZXQgcmVsb2FkIGZvcmNlIG9mIEVDQyBjbG9jayAweDAwMDE4NzQwWzc6MF0gdG8gMHgyIChtZWFuaW5nIHlvdQorCSAqIHdpbGwgZm9yY2Ugb25seSB0aGUgRUNDIGNsb2NrKQorCSAqLworCW5WYWwgPSBNVl9SRUdfUkVBRChBWFBfQ09SRV9ESVZfQ0xLX0NUUkwoMCkpOworCW5WYWwgJj0gfihBWFBfQ09SRV9ESVZDTEtfUkVMT0FEX0ZPUkNFX01BU0spOworCW5WYWwgfD0gQVhQX0NPUkVfRElWQ0xLX1JFTE9BRF9GT1JDRV9WQUw7CisJTVZfUkVHX1dSSVRFKEFYUF9DT1JFX0RJVl9DTEtfQ1RSTCgwKSwgblZhbCk7CisKKwkvKiBTZXQgcmVsb2FkIHJhdGlvIGJpdCAweDAwMDE4NzQwWzhdIHRvIDEnYjEgKi8KKwlNVl9SRUdfQklUX1NFVChBWFBfQ09SRV9ESVZfQ0xLX0NUUkwoMCksIEFYUF9DT1JFX0RJVkNMS19SRUxPQURfUkFUSU9fTUFTSyk7CisJbXZPc0RlbGF5KDEpOyAvKiAgbXNlYyAqLworCS8qIFNldCByZWxvYWQgcmF0aW8gYml0IDB4MDAwMTg3NDBbOF0gdG8gMCdiMSAqLworCU1WX1JFR19CSVRfUkVTRVQoQVhQX0NPUkVfRElWX0NMS19DVFJMKDApLCBBWFBfQ09SRV9ESVZDTEtfUkVMT0FEX1JBVElPX01BU0spOworCisJLyogUmV0dXJuIGNhbGN1bGF0ZWQgbmFuZCBjbG9jayBmcmVxdWVuY3kgKi8KKwlyZXR1cm4gKHBsbF9jbGspLygyICogZGl2aWRlcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12Q3RybE5hbmRDbGtTZXQKICoKICogREVTQ1JJUFRJT046CkBAIC0xNTY1LDkgKzIxMTcsMTQgQEAKIGludCBtdkN0cmxOYW5kQ2xrU2V0KGludCBuZmNfY2xrX2ZyZXEpCiB7CiAJaW50IGRpdmlkZXI7Ci0JTVZfVTMyIG5WYWwgPSBNVl9ERlhfUkVHX1JFQUQoQ09SRV9ESVZfQ0xLX0NUUkwoMikpOworCU1WX1UzMiBuVmFsOwogCU1WX1UzMiBwbGxfY2xrID0gbXZDcHVQbGxDbGtHZXQoKTsKIAorCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpCisJCXJldHVybiBtdkN0cmxOYW5kQ2xrU2V0QXhwKG5mY19jbGtfZnJlcSwgcGxsX2Nsayk7CisKKwluVmFsID0gTVZfREZYX1JFR19SRUFEKENPUkVfRElWX0NMS19DVFJMKDIpKTsKKwogCS8qCiAJICogQ2FsY3VsYXRlIG5hbmQgZGl2aWRlciBmb3IgcmVxdWVzdGVkIG5mY19jbGtfZnJlcS4gSWYgaW50ZWdlciBkaXZpZGVyCiAJICogY2Fubm90IGJlIGFjaGlldmVkLCBpdCB3aWxsIGJlIHJvdW5kZWQtdXAsIHdoaWNoIHdpbGwgcmVzdWx0IGluCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuaAppbmRleCA2MjRkMTQ5Li4xZTExMzc5IDEwMDc1NQotLS0gYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oCisrKyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmgKQEAgLTgyLDYgKzgyLDE4IEBACiAvKiB0eXBlZGVmcyAqLwogdHlwZWRlZiBNVl9TVEFUVVMoKk1WX1dJTl9HRVRfRlVOQ19QVFIpKE1WX1UzMiwgTVZfVTMyLCBNVl9VTklUX1dJTl9JTkZPKik7CiAKKy8qIFNFUkRFUyBkZXNjcmlwdGlvbiAtIEFYUCBvbmx5ICovCit0eXBlZGVmIGVudW0geworCVNFUkRFU19VTklUX1VOQ09OTkVDVEVECT0gMHgwLAorCVNFUkRFU19VTklUX1BFWAkJPSAweDEsCisJU0VSREVTX1VOSVRfU0FUQQk9IDB4MiwKKwlTRVJERVNfVU5JVF9TR01JSTAJPSAweDMsCisJU0VSREVTX1VOSVRfU0dNSUkxCT0gMHg0LAorCVNFUkRFU19VTklUX1NHTUlJMgk9IDB4NSwKKwlTRVJERVNfVU5JVF9TR01JSTMJPSAweDYsCisJU0VSREVTX1VOSVRfUVNHTUlJCT0gMHg3LAorCVNFUkRFU19VTklUX0xBU1QKK30gTVZfU0VSREVTX1VOSVRfSU5EWDsKIAogdHlwZWRlZiBlbnVtIHsKIAlQRVhfQlVTX0RJU0FCTEVECT0gMCwKQEAgLTE2MiwxMSArMTc0LDEyIEBACiAKIE1WX1UzMgkgIG12Q3RybEV0aE1heFBvcnRHZXQoTVZfVk9JRCk7CiBNVl9VOAkgIG12Q3RybEV0aE1heENQVXNHZXQoTVZfVk9JRCk7Ci0jaWYgZGVmaW5lZChNVl9JTkNMVURFX1VTQikKIE1WX1UzMiBtdkN0cmxVc2JNYXhHZXQoTVZfVk9JRCk7CisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1VTQikKIE1WX1UzMiBtdkN0cmxVc2IzTWF4R2V0KE1WX1ZPSUQpOwogTVZfVTMyIG12Q3RybFVzYjNIb3N0TWF4R2V0KE1WX1ZPSUQpOwogTVZfVk9JRCBtdkN0cmxVdG1pUGh5U2VsZWN0b3JTZXQoTVZfVTMyIHVzYlVuaXRJZCk7CitNVl9CT09MIG12Q3RybElzVXNiU2VyRGVzQ29ubmVjdGVkKE1WX1UzMiB1c2JQb3J0KTsKICNlbmRpZgogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9YT1IpCiBNVl9VMzIgbXZDdHJsWG9yTWF4Q2hhbkdldChNVl9WT0lEKTsKQEAgLTE5Nyw2ICsyMTAsNyBAQAogTVZfQk9PTAkgIG12Q3RybElzQm9vdEZyb21OQU5EKE1WX1ZPSUQpOwogTVZfQk9PTAkgIG12Q3RybFB3ck1lbUdldChNVl9VTklUX0lEIHVuaXRJZCwgTVZfVTMyIGluZGV4KTsKIE1WX1NUQVRVUyBtdkN0cmxTZXJkZXNQaHlDb25maWcoTVZfVk9JRCk7CitNVl9TVEFUVVMgbXZDdHJsU2VyZGVzUGh5Q29uZmlnQXhwKE1WX1ZPSUQpOwogTVZfQk9PTCBtdkN0cmxJc0RMQkVuYWJsZWQoTVZfVk9JRCk7CiBNVl9VMzIgbXZDdHJsRERSQnVkV2lkdGgoTVZfVk9JRCk7CiBNVl9CT09MIG12Q3RybEREUlRocnVYYmFyKE1WX1ZPSUQpOwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZSZWdzLmggYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212Q3RybEVudlJlZ3MuaAppbmRleCBmMWQyNjMyLi5iYzdjNDY4IDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212Q3RybEVudlJlZ3MuaAorKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212Q3RybEVudlJlZ3MuaApAQCAtMTUxLDYgKzE1MSw3MyBAQAogI2RlZmluZSBQTUNfR0VTVE9QQ0xPQ0tfRU4ocG9ydCkJCSgxIDw8IFBNQ19HRVNUT1BDTE9DS19PRkZTKHBvcnQpKQogI2RlZmluZSBQTUNfR0VTVE9QQ0xPQ0tfU1RPUChwb3J0KQkJKDAgPDwgUE1DX0dFU1RPUENMT0NLX09GRlMocG9ydCkpCiAKKy8qICBQb3dlciBNYW5hZ2VtZW50IENsb2NrIEdhdGluZyBDb250cm9sIFJlZ2lzdGVyIC0gQVhQIG9ubHkgKi8KKworI2RlZmluZSBBWFBfUE1DX1RETVNUT1BDTE9DS19PRkZTCQkyNQorI2RlZmluZSBBWFBfUE1DX1RETVNUT1BDTE9DS19NQVNLCQkoMSA8PCBBWFBfUE1DX1RETVNUT1BDTE9DS19PRkZTKQorI2RlZmluZSBBWFBfUE1DX1RETVNUT1BDTE9DS19FTgkJCSgxIDw8IEFYUF9QTUNfVERNU1RPUENMT0NLX09GRlMpCisjZGVmaW5lIEFYUF9QTUNfVERNU1RPUENMT0NLX1NUT1AJCSgwIDw8IEFYUF9QTUNfVERNU1RPUENMT0NLX09GRlMpCisKKyNkZWZpbmUgQVhQX1BNQ19QRVhTVE9QQ0xPQ0tfT0ZGUyhwb3J0KQkJKChwb3J0KSA8IDggPyAoNSArIChwb3J0KSkgOiAoMTggKyAocG9ydCkpKQorI2RlZmluZSBBWFBfUE1DX1BFWFNUT1BDTE9DS19NQVNLKHBvcnQpCQkoMSA8PCBBWFBfUE1DX1BFWFNUT1BDTE9DS19PRkZTKHBvcnQpKQorI2RlZmluZSBBWFBfUE1DX1BFWFNUT1BDTE9DS19FTihwb3J0KQkJKDEgPDwgQVhQX1BNQ19QRVhTVE9QQ0xPQ0tfT0ZGUyhwb3J0KSkKKyNkZWZpbmUgQVhQX1BNQ19QRVhTVE9QQ0xPQ0tfU1RPUChwb3J0KQkJKDAgPDwgQVhQX1BNQ19QRVhTVE9QQ0xPQ0tfT0ZGUyhwb3J0KSkKKworI2RlZmluZSBBWFBfUE1DX1VTQlNUT1BDTE9DS19PRkZTKHBvcnQpCQkoKHBvcnQpIDwgMyA/ICgxOCArIChwb3J0KSkgOiAwKQorI2RlZmluZSBBWFBfUE1DX1VTQlNUT1BDTE9DS19NQVNLKHBvcnQpCQkoMSA8PCBBWFBfUE1DX1VTQlNUT1BDTE9DS19PRkZTKHBvcnQpKQorI2RlZmluZSBBWFBfUE1DX1VTQlNUT1BDTE9DS19FTihwb3J0KQkJKDEgPDwgQVhQX1BNQ19VU0JTVE9QQ0xPQ0tfT0ZGUyhwb3J0KSkKKyNkZWZpbmUgQVhQX1BNQ19VU0JTVE9QQ0xPQ0tfU1RPUChwb3J0KQkJKDAgPDwgQVhQX1BNQ19VU0JTVE9QQ0xPQ0tfT0ZGUyhwb3J0KSkKKworI2RlZmluZSBBWFBfUE1DX1NESU9TVE9QQ0xPQ0tfT0ZGUwkJMTcKKyNkZWZpbmUgQVhQX1BNQ19TRElPU1RPUENMT0NLX01BU0sJCSgxIDw8IEFYUF9QTUNfU0RJT1NUT1BDTE9DS19PRkZTKQorI2RlZmluZSBBWFBfUE1DX1NESU9TVE9QQ0xPQ0tfRU4JCSgxIDw8IEFYUF9QTUNfU0RJT1NUT1BDTE9DS19PRkZTKQorI2RlZmluZSBBWFBfUE1DX1NESU9TVE9QQ0xPQ0tfU1RPUAkJKDAgPDwgQVhQX1BNQ19TRElPU1RPUENMT0NLX09GRlMpCisKKyNkZWZpbmUgQVhQX1BNQ19SVU5JVFNUT1BDTE9DS19PRkZTCQkyNAorI2RlZmluZSBBWFBfUE1DX1JVTklUU1RPUENMT0NLX01BU0sJCSgxIDw8IEFYUF9QTUNfUlVOSVRTVE9QQ0xPQ0tfT0ZGUykKKyNkZWZpbmUgQVhQX1BNQ19SVU5JVFNUT1BDTE9DS19FTgkJKDEgPDwgQVhQX1BNQ19SVU5JVFNUT1BDTE9DS19PRkZTKQorI2RlZmluZSBBWFBfUE1DX1JVTklUU1RPUENMT0NLX1NUT1AJCSgwIDw8IEFYUF9QTUNfUlVOSVRTVE9QQ0xPQ0tfT0ZGUykKKworI2RlZmluZSBBWFBfUE1DX1hPUlNUT1BDTE9DS19PRkZTCQkyMgorI2RlZmluZSBBWFBfUE1DX1hPUlNUT1BDTE9DS19NQVNLCQkoMSA8PCBBWFBfUE1DX1hPUlNUT1BDTE9DS19PRkZTKQorI2RlZmluZSBBWFBfUE1DX1hPUlNUT1BDTE9DS19FTgkJCSgxIDw8IEFYUF9QTUNfWE9SU1RPUENMT0NLX09GRlMpCisjZGVmaW5lIEFYUF9QTUNfWE9SU1RPUENMT0NLX1NUT1AJCSgwIDw8IEFYUF9QTUNfWE9SU1RPUENMT0NLX09GRlMpCisKKyNkZWZpbmUgQVhQX1BNQ19TQVRBU1RPUENMT0NLX09GRlMoY2gpCQkoY2ggPT0gMCA/IDE0IDogMjkpCisjZGVmaW5lIEFYUF9QTUNfU0FUQVNUT1BDTE9DS19NQVNLKGNoKQkJKDMgPDwgQVhQX1BNQ19TQVRBU1RPUENMT0NLX09GRlMoY2gpKQorI2RlZmluZSBBWFBfUE1DX1NBVEFTVE9QQ0xPQ0tfRU4oY2gpCQkoMyA8PCBBWFBfUE1DX1NBVEFTVE9QQ0xPQ0tfT0ZGUyhjaCkpCisjZGVmaW5lIEFYUF9QTUNfU0FUQVNUT1BDTE9DS19TVE9QKGNoKQkJKDAgPDwgQVhQX1BNQ19TQVRBU1RPUENMT0NLX09GRlMoY2gpKQorCisjZGVmaW5lIEFYUF9QTUNfQ0VTQVNUT1BDTE9DS19PRkZTCQkyMworI2RlZmluZSBBWFBfUE1DX0NFU0FTVE9QQ0xPQ0tfTUFTSwkJKDEgPDwgQVhQX1BNQ19DRVNBU1RPUENMT0NLX09GRlMpCisjZGVmaW5lIEFYUF9QTUNfQ0VTQVNUT1BDTE9DS19FTgkJKDEgPDwgQVhQX1BNQ19DRVNBU1RPUENMT0NLX09GRlMpCisjZGVmaW5lIEFYUF9QTUNfQ0VTQVNUT1BDTE9DS19TVE9QCQkoMCA8PCBBWFBfUE1DX0NFU0FTVE9QQ0xPQ0tfT0ZGUykKKworI2RlZmluZSBBWFBfUE1DX0dFU1RPUENMT0NLX09GRlMocG9ydCkJCSgocG9ydCkgPCA0ID8gKDQgLSAocG9ydCkpIDogMCkKKyNkZWZpbmUgQVhQX1BNQ19HRVNUT1BDTE9DS19NQVNLKHBvcnQpCQkoMSA8PCBBWFBfUE1DX0dFU1RPUENMT0NLX09GRlMocG9ydCkpCisjZGVmaW5lIEFYUF9QTUNfR0VTVE9QQ0xPQ0tfRU4ocG9ydCkJCSgxIDw8IEFYUF9QTUNfR0VTVE9QQ0xPQ0tfT0ZGUyhwb3J0KSkKKyNkZWZpbmUgQVhQX1BNQ19HRVNUT1BDTE9DS19TVE9QKHBvcnQpCQkoMCA8PCBBWFBfUE1DX0dFU1RPUENMT0NLX09GRlMocG9ydCkpCisKKyNkZWZpbmUgQVhQX1BNQ19ORVRBU1RPUENMT0NLX09GRlMJCTEzCisjZGVmaW5lIEFYUF9QTUNfTkVUQVNUT1BDTE9DS19NQVNLCQkoMSA8PCBBWFBfUE1DX05FVEFTVE9QQ0xPQ0tfT0ZGUykKKyNkZWZpbmUgQVhQX1BNQ19ORVRBU1RPUENMT0NLX0VOCQkoMSA8PCBBWFBfUE1DX05FVEFTVE9QQ0xPQ0tfT0ZGUykKKyNkZWZpbmUgQVhQX1BNQ19ORVRBU1RPUENMT0NLX1NUT1AJCSgwIDw8IEFYUF9QTUNfTkVUQVNUT1BDTE9DS19PRkZTKQorCisjZGVmaW5lIEFYUF9QTUNfTENEU1RPUENMT0NLX09GRlMJCTE2CisjZGVmaW5lIEFYUF9QTUNfTENEU1RPUENMT0NLX01BU0sJCSgxIDw8IEFYUF9QTUNfTENEU1RPUENMT0NLX09GRlMpCisjZGVmaW5lIEFYUF9QTUNfTENEU1RPUENMT0NLX0VOCQkJKDEgPDwgQVhQX1BNQ19MQ0RTVE9QQ0xPQ0tfT0ZGUykKKyNkZWZpbmUgQVhQX1BNQ19MQ0RTVE9QQ0xPQ0tfU1RPUAkJKDAgPDwgQVhQX1BNQ19MQ0RTVE9QQ0xPQ0tfT0ZGUykKKworI2RlZmluZSBBWFBfUE1DX0lETUFTVE9QQ0xPQ0tfT0ZGUwkJMjEKKyNkZWZpbmUgQVhQX1BNQ19JRE1BU1RPUENMT0NLX01BU0sJCSgxIDw8IEFYUF9QTUNfSURNQVNUT1BDTE9DS19PRkZTKQorI2RlZmluZSBBWFBfUE1DX0lETUFTVE9QQ0xPQ0tfRU4JCSgxIDw8IEFYUF9QTUNfSURNQVNUT1BDTE9DS19PRkZTKQorI2RlZmluZSBBWFBfUE1DX0lETUFTVE9QQ0xPQ0tfU1RPUAkJKDAgPDwgQVhQX1BNQ19JRE1BU1RPUENMT0NLX09GRlMpCisKKyNkZWZpbmUgQVhQX1BNQ19ERFJTVE9QQ0xPQ0tfT0ZGUwkJMjgKKyNkZWZpbmUgQVhQX1BNQ19ERFJTVE9QQ0xPQ0tfTUFTSwkJKDEgPDwgQVhQX1BNQ19ERFJTVE9QQ0xPQ0tfT0ZGUykKKyNkZWZpbmUgQVhQX1BNQ19ERFJTVE9QQ0xPQ0tfRU4JCQkoMSA8PCBBWFBfUE1DX0REUlNUT1BDTE9DS19PRkZTKQorI2RlZmluZSBBWFBfUE1DX0REUlNUT1BDTE9DS19TVE9QCQkoMCA8PCBBWFBfUE1DX0REUlNUT1BDTE9DS19PRkZTKQorCiAvKiBkdW1teSBkZWZlbml0aW9uLCB1c2VkIGZvciBTR01JSSBjYXBhYmxlIGludGVyZmFjZXMgKi8KICNkZWZpbmUgU0dNSUlfU0VSREVTX0NGR19SRUcocG9ydCkJCSgwKQogCkBAIC0xNTgsNiArMjI1LDI3IEBACiAKICNkZWZpbmUgTVBQX0NPTlRST0xfUkVHKGlkKQkJCSgweDE4MDAwICsgKGlkICogNCkpCiAKKy8qIFN3aXRjaCBjb3JlIHJlZ2lzdGVycyAqLworI2RlZmluZSBNVl9QUF9BRERDT01QX0NOQ1RSTCAweDAwMDAwMTQwCisjZGVmaW5lIE1WX1BQX0FERENPTVBfUkVHKG4pICgweDAwMDAwMTIwICsgNCpuKQorI2RlZmluZSBNVl9QUF9BRERDT01QX01PREVfQklUCQkJMTYKKyNkZWZpbmUgTVZfUFBfQUREQ09NUF9NT0RFX01BU0sJCQkoMSA8PCBNVl9QUF9BRERDT01QX01PREVfQklUKQorCisjZGVmaW5lIE1WX1BQX1NNSV9NSVNDX0NPTkZJR19PRkZTRVQgMHg0CisjZGVmaW5lIE1WX1BQX1NNSV9JTlZFUlRfTURDX0JJVCAgICAgICAgICAxMQorI2RlZmluZSBNVl9QUF9TTUlfSU5WRVJUX01EQ19NQVNLICAgICAgICAgKDEgPDwgTVZfUFBfU01JX0lOVkVSVF9NRENfQklUKQorCisjZGVmaW5lIE1WX1BQX0VUSF9BRERDT01QX0lOREVYIDEKKyNkZWZpbmUgTVZfUFBfRVRIX1JFR19CQVNFX05PUk5BTCAoU1dJVENIX1JFR1NfVklSVF9CQVNFIHwgTVZfUFBfRVRIX0FERENPTVBfSU5ERVg8PDE5KQorI2RlZmluZSBNVl9QUF9FVEhfUkVHX0JBU0VfTEVHQUNZIChTV0lUQ0hfUkVHU19WSVJUX0JBU0UgfCBNVl9QUF9FVEhfQUREQ09NUF9JTkRFWDw8MjQpCisKKy8qIFNhbXBsZSBhdCBSZXNldCAtIEFYUCBvbmx5ICovCisjZGVmaW5lIE1QUF9TQU1QTEVfQVRfUkVTRVQoaWQpCQkJKDB4MTgyMzAgKyAoaWQgKiA0KSkKKworLyogQ29udHJvbGxlciBlbnZpcm9ubWVudCBhbmQgU0VSREVSUyByZWdpc3RlcnMgLSBBWFAgb25seSAqLworI2RlZmluZSBTRVJERVNfTElORV9NVVhfUkVHXzBfNwkJCTB4MTgyNzAKKyNkZWZpbmUgR0VOX1BVUlBfUkVTXzJfUkVHCQkJMHgxODJGOAorCiAvKiBEcmFnb25pdGUgUmVnaXN0ZXIgKi8KICNkZWZpbmUgRFJBR09OSVRFX0NUUkxfUkVHCQkJMHgxYwogI2RlZmluZSBEUkFHT05JVEVfUE9FX0NBVVNFX0lSUV9SRUcJCTB4NjQKQEAgLTE3OCw2ICsyNjYsOSBAQAogI2RlZmluZSBNU0FSX0FDM19CT09UX01PREUoc2FyMSwgc2FyMikJKCgoc2FyMSkgPj4gMTEpICYgMHg3KQkJLyogYm9vdCBmcm9tICovCiAjZGVmaW5lIE1TQVJfQUMzX1RNX0NMSyhzYXIxLCBzYXIyKQkoKChzYXIyKSA+PiAxNykgJiAweDEpCQkvKiBQTEwgMiBjb25maWcgKi8KIAorI2RlZmluZSBNU0FSX0JPQktfQk9PVF9NT0RFKHNhcjEsIHNhcjIpCSgoKHNhcjEpID4+IDEzKSAmIDB4NykJCS8qIGJvb3QgZnJvbSAqLworI2RlZmluZSBNU0FSX0JPQktfVE1fQ0xLKHNhcjEsIHNhcjIpCSgoKHNhcjIpID4+IDE1KSAmIDB4NykJCS8qIFBMTCAyIGNvbmZpZyAqLworCiAjZGVmaW5lIFNBUjFfQk9PVF9GUk9NX05PUgkJCTAKICNkZWZpbmUgU0FSMV9CT09UX0ZST01fTkFORAkJCTEKICNkZWZpbmUgU0FSMV9CT09UX0ZST01fVUFSVAkJCTIKQEAgLTIwOSwxMCArMzAwLDIzIEBACiAKICNkZWZpbmUgQ09SRV9ESVZfQ0xLX0NUUkwobnVtKQkJCShERlhfQ09SRV9ESVZDTEtfQ09OVFJPTDBfUkVHICsgKChudW0pICogMHg0KSkKIAotCiAjZGVmaW5lIERGWF9URU1QRVJBVFVSRV9TRU5TT1JfTFNCX0NUUkxfUkVHCQkweEY4MDcwCiAjZGVmaW5lIERGWF9URU1QRVJBVFVSRV9TRU5TT1JfTVNCX0NUUkxfUkVHCQkweEY4MDc0CiAjZGVmaW5lIERGWF9URU1QRVJBVFVSRV9TRU5TT1JfU1RBVFVTX1JFRwkJMHhGODA3OAorCisvKiBDb3JlIERpdmlkZXIgQ2xvY2sgQ29udHJvbCAtIEFYUCBvbmx5ICovCisjZGVmaW5lIEFYUF9DT1JFX0RJVl9DTEtfQ1RSTChudW0pCQkoMHgxODc0MCArICgobnVtKSAqIDB4OCkpCisKKyNkZWZpbmUgQVhQX0NPUkVfRElWQ0xLX1JFTE9BRF9GT1JDRV9PRkZTCTAKKyNkZWZpbmUgQVhQX0NPUkVfRElWQ0xLX1JFTE9BRF9GT1JDRV9NQVNLCSgweEZGIDw8IEFYUF9DT1JFX0RJVkNMS19SRUxPQURfRk9SQ0VfT0ZGUykKKyNkZWZpbmUgQVhQX0NPUkVfRElWQ0xLX1JFTE9BRF9GT1JDRV9WQUwJKDB4MiA8PCBBWFBfQ09SRV9ESVZDTEtfUkVMT0FEX0ZPUkNFX09GRlMpCisKKyNkZWZpbmUgQVhQX05BTkRfRUNDX0RJVkNMS19SQVRJT19PRkZTCQk4CisjZGVmaW5lIEFYUF9OQU5EX0VDQ19ESVZDTEtfUkFUSU9fTUFTSwkJKDB4M0YgPDwgQVhQX05BTkRfRUNDX0RJVkNMS19SQVRJT19PRkZTKQorCisjZGVmaW5lIEFYUF9DT1JFX0RJVkNMS19SRUxPQURfUkFUSU9fT0ZGUwk4CisjZGVmaW5lIEFYUF9DT1JFX0RJVkNMS19SRUxPQURfUkFUSU9fTUFTSwkoMSA8PCBBWFBfQ09SRV9ESVZDTEtfUkVMT0FEX1JBVElPX09GRlMpCisKIC8qIGRlZmluaXRpb24gZm9yIGNhY3VsYXRlIFRlbXBlcmF0dXJlICovCiAjZGVmaW5lIFRFTVBFUkFUVVJFX09GRlNFVCAgICAgICAgKDU5NikKICNkZWZpbmUgVEVNUEVSQVRVUkVfRkFDVE9SICAgICAgICAoMjE1NCkKQEAgLTI1NSw2ICszNTksNyBAQAogI2RlZmluZQlJQ0RSX1VJTklUX0lEX01BU0sJMHgwRgogI2RlZmluZSBJQ0RSX1VOSVRfSURfNF9ERlgJMHgwZgogCisjZGVmaW5lIENQTERfUkRfTVRMX0JDMl9CT0FSRF9SRVZfUkVHCTIKICNkZWZpbmUgQ1BMRF9CT0FSRF9SRVZfUkVHCTEKICNkZWZpbmUgQ1BMRF9CT0FSRF9SRVZfTUFTSwkweDcKICNkZWZpbmUgQ1BMRF9SRVZfUkVHCQkyCkBAIC0yNjMsMjcgKzM2OCwxMTQgQEAKICNkZWZpbmUgREVWX0lEX1JFRwkJCQkweDE4MjNDCiAjZGVmaW5lIERFVklDRV9JRF9PRkZTCQkJMAogI2RlZmluZSBERVZJQ0VfSURfTUFTSwkJCTB4RkZGRgotI2RlZmluZSBERVZJQ0VfRkxBVk9SX01BU0sJCTB4RkYKKworLyogZm9yIEJvYksgZGV2SUQsIENldHVzOiAweEJFMDAgQ2FlbHVtOjB4QkMwMCwgdGhlIGhpZ2hlciA2Yml0cyBhcmUgdGhlIHNhbWUuCitzbyB1cGRhdGUgbWFzayB0byAweDNGRiwgZm9yIEJDMiBmbGF2b3IoMHhGNFhYKSwgYW5kIEFDMyBmbGF2b3IoMHhGQzAwKSwKK3RoZSBoaWdoZXIgNmJpdHMgYXJlIGFsc28gdGhlIHNhbWUsIHNvIGNhbiB3b3JrIG5vcm1hbGx5ICovCisjZGVmaW5lIERFVklDRV9GTEFWT1JfTUFTSwkJMHgzRkYKKworI2RlZmluZSBCT0JLX0ZMQVZPUl9NQVNLCQkweEZGCS8qIG9ubHkgZm9yIENldHVzICYgQ2FlbHVtIGZsYXZvciAqLwogI2RlZmluZSBERVZfUkVWX0lEX1JFRwkJCTB4RjgyNDQKICNkZWZpbmUgUkVWSVNPTl9JRF9PRkZTCQkJMjgKICNkZWZpbmUgUkVWSVNPTl9JRF9NQVNLCQkJMHhGMDAwMDAwMAogCiAvKiBFeHRyYWN0IENQVSwgTDIsIEREUiBjbG9ja3MgU0FSIHZhbHVlIGZyb20KLSoqIFNBUiBiaXRzIDI0LTI3Ci0qLworICogU0FSIGJpdHMgMjQtMjcgLSBBWFAgb25seQorICovCisjZGVmaW5lIE1TQVJfQ1BVX0NMS19JRFgoc2FyMCwgc2FyMSkJCSgoKChzYXIwKSA+PiAyMSkgJiAweDcpICsgKCgoKHNhcjEpID4+IDIwKSAmIDEpIDw8IDMpKQorI2RlZmluZSBNU0FSX0NQVV9DTEtfVFdTSShzYXIwLCBzYXIxKQkJKCgoKHNhcjApID4+IDIpICAmIDB4NykgKyAoKChzYXIxKSAmIDEpIDw8IDMpKQorI2RlZmluZSBNU0FSX0REUl9MMl9DTEtfUkFUSU9fSURYKHNhcjAsIHNhcjEpCSgoKChzYXIwKSA+PiAyNCkgJiAweEYpICsgKCgoKHNhcjEpID4+IDE5KSAmIDEpIDw8IDQpKQorI2RlZmluZSBNU0FSX0REUl9MMl9DTEtfUkFUSU9fVFdTSShzYXIwKQkoKChzYXIwKSA+PiAxKSAgJiAweEYpCiAKKy8qIFNBUiBUQ0xLIGJpdCAtIEFYUCBvbmx5ICovCisjZGVmaW5lIE1TQVJfVENMS19PRkZTCQkJCTI4CisjZGVmaW5lIE1TQVJfVENMS19NQVNLCQkJCSgweDEgPDwgTVNBUl9UQ0xLX09GRlMpCisKKy8qIFBMTChDUFUpIGlucHV0IGNsb2NrIC0gQVhQIG9ubHkgKi8KKyNkZWZpbmUgQVhQX1BMTF9JTl9DTEsJCQlfMkdIegogCiAjaWZuZGVmIE1WX0FTTUxBTkdVQUdFCiAKKyNkZWZpbmUgTVZfQ1BVX0NMS19UQkxfQVhQIHsgMTAwMCwgMTA2NiwgMTIwMCwgMTMzMywgMTUwMCwgMTY2NiwgMTgwMCwgMjAwMCxcCisJCQkgICAgICA2MDAsICA2NjcsICA4MDAsIDE2MDAsIDIxMzMsIDIyMDAsIDI0MDAsIDAgfQogCisvKgkJY3B1CWwyYwloY2xrCWRkcgkqLworI2RlZmluZSBNVl9ERFJfTDJfQ0xLX1JBVElPX1RCTF9BWFAgeyBcCisvKjAwKi8JewkxLAkxLAk0LAkyCX0sXAorLyowMSovCXsJMSwJMiwJMiwJMgl9LFwKKy8qMDIqLwl7CTIsCTIsCTYsCTMJfSxcCisvKjAzKi8JewkyLAkyLAkzLAkzCX0sXAorLyowNCovCXsJMSwJMiwJMywJMwl9LFwKKy8qMDUqLwl7CTEsCTIsCTQsCTIJfSxcCisvKjA2Ki8JewkxLAkxLAkyLAkyCX0sXAorLyowNyovCXsJMiwJMywJNiwJNgl9LFwKKy8qMDgqLwl7CTIsCTMsCTUsCTUJfSxcCisvKjA5Ki8JewkxLAkyLAk2LAkzCX0sXAorLyoxMCovCXsJMiwJNCwJMTAsCTUJfSxcCisvKjExKi8JewkxLAkzLAk2LAk2CX0sXAorLyoxMiovCXsJMSwJMiwJNCwJNAl9LFwKKy8qMTMqLwl7CTEsCTMsCTYsCTMJfSxcCisvKjE0Ki8JewkxLAkyLAk1LAk1CX0sXAorLyoxNSovCXsJMiwJMiwJNSwJNQl9LFwKKy8qMTYqLwl7CTEsCTEsCTMsCTMJfSxcCisvKjE3Ki8JewkyLAk1LAkxMCwJMTAJfSxcCisvKjE4Ki8JewkxLAkzLAk4LAk0CX0sXAorLyoxOSovCXsJMSwJMSwJMiwJMQl9LFwKKy8qMjAqLwl7CTIsCTMsCTYsCTMJfSxcCisvKjIxKi8JewkxLAkyLAk4LAk0CX0sXAorLyoyMiovCXsJMiwJNSwJMTAsCTUJfSBcCit9CisKKy8qIFRoaXMgc3RydWN0dXJlIHJlZnJlY3QgcmVnaXN0ZXJzOgorICogU2VyZGVzIDAtNyBzZWxlY3RvcnMJCTB4MTgyNzAKKyAqIGFuZCBTZXJkZXMgOC0xNSBzZWxlY3RvcnMJMHgxODI3NAorICogQVhQIG9ubHkKKyAqLworCisjZGVmaW5lIFNFUkRFU19DRkdfQVhQIHsgXAorCXswLCAxLCAtMSAsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIC8qIExhbmUgMCAqLwlcCisJezAsIDEsIC0xICwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgLyogTGFuZSAxICovCVwKKwl7MCwgMSwgLTEgLCAgMiwgLTEsIC0xLCAtMSwgLTF9LCAvKiBMYW5lIDIgKi8JXAorCXswLCAxLCAtMSAsIC0xLCAgMiwgLTEsIC0xLCAgM30sIC8qIExhbmUgMyAqLwlcCisJezAsIDEsICAyICwgLTEsIC0xLCAgMywgLTEsIC0xfSwgLyogTGFuZSA0ICovCVwKKwl7MCwgMSwgIDIgLCAtMSwgIDMsIC0xLCAtMSwgIDR9LCAvKiBMYW5lIDUgKi8JXAorCXswLCAxLCAgMiAsICA0LCAtMSwgIDMsIC0xLCAtMX0sIC8qIExhbmUgNiAqLwlcCisJezAsIDEsIC0xICwgIDIsIC0xLCAtMSwgIDMsIC0xfSwgLyogTGFuZSA3ICovCVwKKwl7MCwgMSwgLTEgLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCAvKiBMYW5lIDggKi8JXAorCXswLCAxLCAtMSAsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIC8qIExhbmUgOSAqLwlcCisJezAsIDEsIC0xICwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgLyogTGFuZSAxMCAqLwlcCisJezAsIDEsIC0xICwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgLyogTGFuZSAxMSAqLwlcCisJezAsIDEsIC0xICwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgLyogTGFuZSAxMiAqLwlcCisJezAsIDEsIC0xICwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgLyogTGFuZSAxMyAqLwlcCisJezAsIDEsIC0xICwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgLyogTGFuZSAxNCAqLwlcCisJezAsIDEsIC0xICwgLTEsIC0xLCAtMSwgLTEsIC0xfQkgLyogTGFuZSAxNSAqLwlcCit9CiAvKiBUaGVzZSBtYWNyb3MgaGVscCB1bml0cyB0byBpZGVudGlmeSBhIHRhcmdldCBNcG9ydCBBcmJpdGVyIGdyb3VwICovCiAjZGVmaW5lIE1WX1RBUkdFVF9JU19EUkFNKHRhcmdldCkgICBcCiAJCSgodGFyZ2V0ID49IFNEUkFNX0NTMCkgJiYgKHRhcmdldCA8PSBTRFJBTV9DUzMpKQogCiAjZGVmaW5lIE1WX1RBUkdFVF9JU19QRVgwKHRhcmdldCkgICBcCiAJCSgodGFyZ2V0ID49IFBFWDBfTUVNKSAmJiAodGFyZ2V0IDw9IFBFWDBfSU8pKQorI2RlZmluZSBNVl9UQVJHRVRfSVNfUEVYMSh0YXJnZXQpICAgXAorCQkoKHRhcmdldCA+PSAoTVZfOClQRVgxX01FTSkgJiYgKHRhcmdldCA8PSAoTVZfOClQRVgxX0lPKSkKKyNkZWZpbmUgTVZfVEFSR0VUX0lTX1BFWDIodGFyZ2V0KSAgIFwKKwkJKCh0YXJnZXQgPj0gKE1WXzgpUEVYMl9NRU0pICYmICh0YXJnZXQgPD0gKE1WXzgpUEVYMl9JTykpCisjZGVmaW5lIE1WX1RBUkdFVF9JU19QRVgzKHRhcmdldCkgICBcCisJCSgodGFyZ2V0ID49IChNVl84KVBFWDNfTUVNKSAmJiAodGFyZ2V0IDw9IChNVl84KVBFWDNfSU8pKQorI2RlZmluZSBNVl9UQVJHRVRfSVNfUEVYNCh0YXJnZXQpICAgXAorCQkoKHRhcmdldCA+PSAoTVZfOClQRVg0X01FTSkgJiYgKHRhcmdldCA8PSAoTVZfOClQRVg0X0lPKSkKKyNkZWZpbmUgTVZfVEFSR0VUX0lTX1BFWDUodGFyZ2V0KSAgIFwKKwkJKCh0YXJnZXQgPj0gKE1WXzgpUEVYNV9NRU0pICYmICh0YXJnZXQgPD0gKE1WXzgpUEVYNV9JTykpCisjZGVmaW5lIE1WX1RBUkdFVF9JU19QRVg2KHRhcmdldCkgICBcCisJCSgodGFyZ2V0ID49IChNVl84KVBFWDZfTUVNKSAmJiAodGFyZ2V0IDw9IChNVl84KVBFWDZfSU8pKQorI2RlZmluZSBNVl9UQVJHRVRfSVNfUEVYNyh0YXJnZXQpICAgXAorCQkoKHRhcmdldCA+PSAoTVZfOClQRVg3X01FTSkgJiYgKHRhcmdldCA8PSAoTVZfOClQRVg3X0lPKSkKKyNkZWZpbmUgTVZfVEFSR0VUX0lTX1BFWDgodGFyZ2V0KSAgIFwKKwkJKCh0YXJnZXQgPj0gKE1WXzgpUEVYOF9NRU0pICYmICh0YXJnZXQgPD0gKE1WXzgpUEVYOF9JTykpCisjZGVmaW5lIE1WX1RBUkdFVF9JU19QRVg5KHRhcmdldCkgICBcCisJCSgodGFyZ2V0ID49IChNVl84KVBFWDlfTUVNKSAmJiAodGFyZ2V0IDw9IChNVl84KVBFWDlfSU8pKQogCi0jZGVmaW5lIE1WX1RBUkdFVF9JU19QRVgodGFyZ2V0KQlNVl9UQVJHRVRfSVNfUEVYMCh0YXJnZXQpCisjZGVmaW5lIE1WX1RBUkdFVF9JU19QRVgodGFyZ2V0KQkoKHRhcmdldCA+PSBQRVgwX01FTSkgJiYgKHRhcmdldCA8PSAoTVZfOClQRVg5X0lPKSkKIAogI2RlZmluZSBNVl9UQVJHRVRfSVNfREVWSUNFKHRhcmdldCkJKCh0YXJnZXQgPj0gREVWSUNFX0NTMCkgJiYgKHRhcmdldCA8PSBERVZJQ0VfQ1MzKSkKIApAQCAtMzIxLDcgKzUxMywxNiBAQAogCiB0eXBlZGVmIGVudW0gewogCVBFWDBfMHg0CT0gMCwKLQlQRVhJRl9NQVgJPSAxCisJUEVYMF8xeDQJPSAxLAorCVBFWDBfMng0CT0gMiwKKwlQRVgwXzN4NAk9IDMsCisJUEVYMV8weDQJPSA0LAorCVBFWDFfMXg0CT0gNSwKKwlQRVgxXzJ4NAk9IDYsCisJUEVYMV8zeDQJPSA3LAorCVBFWDJfMHg0CT0gOCwKKwlQRVgzXzB4NAk9IDksCisJUEVYSUZfTUFYCT0gMTAKIH0gTVZfUEVYSUZfSU5EWDsKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMzQ0LDYgKzU0NSwyNCBAQAogCQk0NTAJCQkJCVwKIAl9CiAKKyNkZWZpbmUgTVZfQ09SRV9DTEtfVEJMX0JPQktfQ0VUVVMJewlcCisJCTM2NSwgMjIwLAkJCVwKKwkJMjUwLCAyMDAsCQkJXAorCQkxNjcJCQkJCVwKKwl9CisKKyNkZWZpbmUgTVZfQ09SRV9DTEtfVEJMX0JPQktfQ0FFTFVNCXsJXAorCQkzNjUsIDIyMCwJCQlcCisJCTI1MCwgMjAwLAkJCVwKKwkJMTY3LCAxMzMJCQlcCisJfQorCisjZGVmaW5lIE1WX0JZUEFTU19DT1JFX0NMS19UQkxfQk9CSwl7CVwKKwkJMzY1LCAyMjAsCQkJXAorCQkyNTAsIDIwMCwJCQlcCisJCTE2NwkJCQkJXAorCX0KKwogI2RlZmluZSBNVl9DT1JFX0NMS19UQkxfQUMzCXsJXAogCQkyOTAsIDI1MCwJCQlcCiAJCTIyMiwgMTY3LAkJCVwKQEAgLTM2Miw2ICs1ODEsMjYgQEAKIAl7MTMzMywgNjY2LCAxNjAwLCBNVl9UUlVFfQlcCiB9CiAKKyNkZWZpbmUgTVZfQ1BVX0REUl9DTEtfVEJMX0JPQktfQ0VUVVMgewlcCisJeyA0MDAsIDQwMCwgIDQwMCwgTVZfRkFMU0V9LAlcCisJezEwMDAsIDY2NywgMjAwMCwgTVZfRkFMU0V9LAlcCisJeyA2NjcsIDY2NywgMjAwMCwgTVZfRkFMU0V9LAlcCisJeyA4MDAsIDgwMCwgIDgwMCwgTVZfRkFMU0V9LAlcCisJezEyMDAsIDgwMCwgMjQwMCwgTVZfRkFMU0V9LAlcCisJeyA4MDAsIDQwMCwgIDgwMCwgTVZfRkFMU0V9LAlcCisJeyA4MDAsIDgwMCwgIDgwMCwgTVZfVFJVRX0JXAorfQorCisjZGVmaW5lIE1WX0NQVV9ERFJfQ0xLX1RCTF9CT0JLX0NBRUxVTSB7CVwKKwl7IDQwMCwgNDAwLCAgNDAwLCBNVl9GQUxTRX0sCVwKKwl7MTAwMCwgNjY3LCAyMDAwLCBNVl9UUlVFfSwJXAorCXsgNjY3LCA2NjcsIDIwMDAsIE1WX0ZBTFNFfSwJXAorCXsgODAwLCA4MDAsICA4MDAsIE1WX0ZBTFNFfSwJXAorCXsxMjAwLCA4MDAsIDI0MDAsIE1WX1RSVUV9LAlcCisJeyA4MDAsIDQwMCwgIDgwMCwgTVZfRkFMU0V9LAlcCisJeyA4MDAsIDgwMCwgIDgwMCwgTVZfVFJVRX0JXAorfQorCiAjZGVmaW5lIE1WX0NQVV9ERFJfQ0xLX1RCTF9BQzMgewlcCiAJeyA1MzMsIDUzMywgIDUzMywgTVZfVFJVRX0sCVwKIAl7IDY2NywgNjY3LCAyMDAwLCBNVl9GQUxTRX0sCVwKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52U3BlYy5oIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZTcGVjLmgKaW5kZXggMjEwMjZlOS4uNjg1NGI5NSAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZTcGVjLmgKKysrIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZTcGVjLmgKQEAgLTcwLDE5ICs3MCwyMyBAQAogCiAjaW5jbHVkZSAiY3RybEVudi9zeXMvbXZDcHVJZlJlZ3MuaCIKIAorI2RlZmluZSBNQVhfVEFSR0VUUwkobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfNzg0NjBfREVWX0lEID8gXAorCQkJIE1BWF9UQVJHRVRTX0FYUCA6IE1BWF9UQVJHRVRTX01TWVMpCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAogI2RlZmluZSBNVl9BUk1fU09DCi0jaWZkZWYgQ09ORklHX0FMTEVZQ0FUMworI2lmIGRlZmluZWQgQ09ORklHX0FMTEVZQ0FUMwogI2RlZmluZSBTT0NfTkFNRV9QUkVGSVgJCQkJIkFsbGV5Y2F0MyIKLSNlbHNlCisjZWxpZiBkZWZpbmVkIENPTkZJR19CT0JDQVQyCiAjZGVmaW5lIFNPQ19OQU1FX1BSRUZJWAkJCQkiQm9iY2F0MiIKKyNlbHNlCisjZGVmaW5lIFNPQ19OQU1FX1BSRUZJWAkJCQkiQm9iSyIKICNlbmRpZgogLyoKLSAqIEJvYmNhdDIgVW5pdHMgQWRkcmVzcyBkZWNvZGluZworICogQm9iY2F0Mi9BWFAgVW5pdHMgQWRkcmVzcyBkZWNvZGluZwogICovCiAjZGVmaW5lIE1WX0RSQU1fUkVHU19PRkZTRVQJCQkoMHgwKQogI2RlZmluZSBNVl9BVVJPUkFfTDJfUkVHU19PRkZTRVQJCSgweDgwMDApCkBAIC05Miw5ICs5NiwxMSBAQAogI2RlZmluZSBNVl9UV1NJX1NMQVZFX1JFR1NfT0ZGU0VUKGNoYW5OdW0pCSgweDExMDAwICsgKGNoYW5OdW0gKiAweDEwMCkpCiAKICNkZWZpbmUgTVZfVUFSVF9SRUdTX09GRlNFVChjaGFuTnVtKQkJKDB4MTIwMDAgKyAoY2hhbk51bSAqIDB4MTAwKSkKKyNkZWZpbmUgTVZfUlVOSVRfUE1VX1JFR1NfT0ZGU0VUCQkoMHgxQzAwMCkKIAogI2RlZmluZSBNVl9NUFBfUkVHU19PRkZTRVQJCQkoMHgxODAwMCkKICNkZWZpbmUgTVZfR1BQX1JFR1NfT0ZGU0VUKHVuaXQpCQkoMHgxODEwMCArICgodW5pdCkgKiAweDgwKSkKKyNkZWZpbmUgTVZfR1BQX1JFR1NfT0ZGU0VUX0FYUCh1bml0KQkJKDB4MTgxMDAgKyAoKHVuaXQpICogMHg0MCkpCiAKICNkZWZpbmUgTVZfTUlTQ19SRUdTX09GRlNFVAkJCSgweDE4MjAwKQogI2RlZmluZSBNVl9DTEtfQ01QTFhfUkVHU19PRkZTRVQJCSgweDE4NzAwKQpAQCAtMTA4LDE2ICsxMTQsMjEgQEAKICNkZWZpbmUgTVZfQ1BVSUZfUkVHU19PRkZTRVQoY3B1KQkJKDB4MjE4MDAgKyAoY3B1KSAqIDB4MTAwKQogI2RlZmluZSBNVl9QTVVfTkZBQlJJQ19VTklUX1NFUlZfT0ZGU0VUCQkoMHgyMjAwMCkKICNkZWZpbmUgTVZfQ1BVX1BNVV9VTklUX1NFUlZfT0ZGU0VUKGNwdSkJKDB4MjIxMDAgKyAoY3B1KSAqIDB4MTAwKQorI2RlZmluZSBNVl9DUFVfSFdfU0VNX09GRlNFVAkJCSgweDIwNTAwKQogI2RlZmluZSBNVl9FVEhfQkFTRV9BRERSCQkJKDB4NzAwMDApCi0jZGVmaW5lIE1WX0VUSF9SRUdTX09GRlNFVChwb3J0KQkJKE1WX0VUSF9CQVNFX0FERFIgKyAocG9ydCkgKiAweDQwMDApCisjZGVmaW5lIE1WX0VUSF9SRUdTX09GRlNFVChwb3J0KQkJKE1WX0VUSF9CQVNFX0FERFIgLSAoKHBvcnQpIC8gMikgKiAweDQwMDAwICsgKChwb3J0KSAlIDIpICogMHg0MDAwKQogI2RlZmluZSBNVl9QRVhfSUZfUkVHU19PRkZTRVQocGV4SWYpXAogCQkJKHBleElmIDwgOCA/ICgweDQwMDAwICsgKChwZXhJZikgLyA0KSAqIDB4NDAwMDAgKyAoKHBleElmKSAlIDQpICogMHg0MDAwKVwKIAk6ICgwWDQyMDAwICsgKChwZXhJZikgJSA4KSAqIDB4NDAwMDApKQogI2RlZmluZSBNVl9VU0JfUkVHU19PRkZTRVQoZGV2KQkJCSgweDUwMDAwICsgKGRldiAqIDB4MTAwMCkpCisjZGVmaW5lIE1WX1VTQjJfVVNCM19SRUdTX09GRlNFVCh1bml0VHlwZSwgZGV2KSAoTVZfVVNCX1JFR1NfT0ZGU0VUKGRldikpCiAjZGVmaW5lIE1WX1hPUl9SRUdTX09GRlNFVCh1bml0KQkJKDB4RjA4MDApCisjZGVmaW5lIE1WX1hPUl9SRUdTX09GRlNFVF9BWFAodW5pdCkJCSh1bml0ID8gMHhGMDkwMCA6IDB4NjA5MDApCiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX0lETUEpCiAjZGVmaW5lIE1WX0lETUFfUkVHU19PRkZTRVQJCQkoMHg2MDgwMCkKICNlbmRpZgorI2RlZmluZSBNVl9DRVNBX1RETUFfUkVHU19PRkZTRVQoY2hhbk51bSkJKDB4OTAwMDAgKyAoY2hhbk51bSAqIDB4MjAwMCkpCisjZGVmaW5lIE1WX0NFU0FfUkVHU19PRkZTRVQoY2hhbk51bSkJCSgweDlEMDAwICsgKGNoYW5OdW0gKiAweDIwMDApKQogI2RlZmluZSBNVl9TQVRBX1JFR1NfT0ZGU0VUCQkJKDB4QTAwMDApCiAjZGVmaW5lIE1WX0NPTU1fVU5JVF9SRUdTX09GRlNFVAkJKDB4QjAwMDApCiAjZGVmaW5lIE1WX05GQ19SRUdTX09GRlNFVAkJCSgweEQwMDAwKQpAQCAtMTI2LDggKzEzNywxMSBAQAogI2RlZmluZSBNVl9TRE1NQ19SRUdTX09GRlNFVAkJCSgweEQ0MDAwKQogCiAjZGVmaW5lIE1WX1VTQjJfQ0FQTEVOR1RIX09GRlNFVChpbmRleCkJCShJTlRFUl9SRUdTX0JBU0UgKyBNVl9VU0JfUkVHU19PRkZTRVQoaW5kZXgpICsgMHgxMDApCi0KICNkZWZpbmUgTVZfRVRIX1NNSV9QT1JUICAgMAorCisjZGVmaW5lIE1WX1BQX1NNSV9CQVNFKG4pICgweDU0MDAwMDAwICsgMHgwMTAwMDAwMCpuKQorI2RlZmluZSBNVl9QUF9FVEhfU01JX1BPUlQgMAorCiAvKgogICogTWlzY2VsbGFudW91cyBDb250cm9sbGVyIENvbmZpZ3VyYXRpb25zCiAgKi8KQEAgLTE0MiwxNyArMTU2LDE5IEBACiAjZGVmaW5lIFRXU0kwX0NQVV9NQUlOX0lOVF9CSVQoY2gpCQkoKGNoKSArIDMpCiAjZGVmaW5lIFRXU0lfU1BFRUQJCQkJMTAwMDAwCiAKLSNkZWZpbmUgTVZfR1BQX01BWF9QSU5TCQkJCTMzCisjZGVmaW5lIE1WX0dQUF9NQVhfUElOUwkJCQk2OAogI2RlZmluZSBNVl9HUFBfTUFYX0dST1VQICAgIAkJCTIgCS8qIGdyb3VwID09IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXI/ICovCisjZGVmaW5lIE1WX0dQUF9NQVhfR1JPVVBfQVhQCQkJMwogI2RlZmluZSBNVl9DTlRNUl9NQVhfQ09VTlRFUiAJCQk4IAkvKiA0IGdsb2JhbCArIDEgZ2xvYmFsIFdEICsgMiBjdXJyZW50IHByaXZhdGUgQ1BVICsgMSBwcml2YXRlIENQVSBXRCovCiAKICNkZWZpbmUgTVZfVUFSVF9NQVhfQ0hBTgkJCTIKIAotI2RlZmluZSBNVl9YT1JfTUFYX1VOSVQJCQkJMSAvKiBYT1IgdW5pdCA9PSBYT1IgZW5naW5lICovCi0jZGVmaW5lIE1WX1hPUl9NQVhfQ0hBTiAgICAgICAgIAkJMiAvKiB0b3RhbCBjaGFubmVscyBmb3IgYWxsIHVuaXRzIHRvZ2V0aGVyKi8KKyNkZWZpbmUgTVZfWE9SX01BWF9VTklUCQkJCTIgLyogWE9SIHVuaXQgPT0gWE9SIGVuZ2luZSAqLworI2RlZmluZSBNVl9YT1JfTUFYX0NIQU4JCQkJNCAvKiB0b3RhbCBjaGFubmVscyBmb3IgYWxsIHVuaXRzIHRvZ2V0aGVyKi8KICNkZWZpbmUgTVZfWE9SX01BWF9DSEFOX1BFUl9VTklUCQkyIC8qIGNoYW5uZWxzIGZvciB1bml0cyAqLwogCiAjZGVmaW5lIE1WX01QUF9NQVhfR1JPVVAJCQk1CisjZGVmaW5lIE1WX01QUF9NQVhfR1JPVVBfQVhQCQkJOQogCiAjZGVmaW5lIE1WX0RSQU1fTUFYX0NTCQkJCTQKICNkZWZpbmUgTVZfU1BJX01BWF9DUwkJCQk4CkBAIC0xNjgsOCArMTg0LDggQEAKICNlbmRpZgogCiAvKiBUaGlzIGRlZmluZSBkZXNjcmliZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBQRVggSW50ZXJmYWNlcyAqLwotI2RlZmluZSBNVl9QRVhfTUFYX0lGCQkJCTEKLSNkZWZpbmUgTVZfUEVYX01BWF9VTklUCQkJCTEKKyNkZWZpbmUgTVZfUEVYX01BWF9JRgkJCQkxMAkvKiAxIGZvciBNU1lTICovCisjZGVmaW5lIE1WX1BFWF9NQVhfVU5JVAkJCQk0CS8qIDEgZm9yIE1TWVMgKi8KICNpZmRlZiBNVl9JTkNMVURFX1BFWAogI2RlZmluZSBNVl9JTkNMVURFX1BFWDAKICNkZWZpbmUgTVZfRElTQUJMRV9QRVhfREVWSUNFX0JBUgpAQCAtMTg2LDE1ICsyMDIsMjcgQEAKIC8qIFRoaXMgZGVmaW5lIGRlc2NyaWJlcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIFBDSSBJbnRlcmZhY2VzIAkqLwogI2RlZmluZSBNVl9ERVZJQ0VfTUFYX0NTICAgICAgCQkJNAogCisvKiBDRVNBIHZlcnNpb24gIzM6IE9uZSBjaGFubmVsLCAyS0IgU1JBTSwgVERNQSwgQ0hBSU4gTW9kZSBzdXBwb3J0ICovCisjZGVmaW5lIE1WX0NFU0FfVkVSU0lPTgkJCQkzCisjZGVmaW5lIE1WX0NFU0FfU1JBTV9TSVpFCQkJKDIgKiAxMDI0KQorCisjaWZkZWYgTVZfVVNCCisjZGVmaW5lIE1WX1VTQl9NQVhfUE9SVFMgMQorI2Vsc2UKKyNkZWZpbmUgTVZfVVNCX01BWF9QT1JUUyAwCisjZW5kaWYKKyNkZWZpbmUgTVZfVVNCM19NQVhfSE9TVF9QT1JUUyAwCiAKIC8qIFRoaXMgZGVmaW5lIGRlc2NyaWJlcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIEV0aGVybmV0IHBvcnRzICovCiAvKiBUT0RPIC0gdmVyaWZ5IGFsbCB0aGVzZSBudW1iZXJzICovCiAjZGVmaW5lIE1WX0VUSF9WRVJTSU9OIAkJCQk0IC8qIGZvciBMZWdhY3kgbW9kZSAqLwogI2RlZmluZSBNVl9ORVRBX1ZFUlNJT04JCQkJMSAvKiBmb3IgTkVUQSBtb2RlICovCi0jZGVmaW5lIE1WX0VUSF9NQVhfUE9SVFMJCQkyCisjZGVmaW5lIE1WX0VUSF9NQVhfUE9SVFMJCQk0CiAjZGVmaW5lIE1WX0VUSF9NQVhfUlhRICAgICAgICAgICAgICAJCTgKICNkZWZpbmUgTVZfRVRIX01BWF9UWFEgICAgICAgICAgICAgIAkJOAogI2RlZmluZSBNVl9FVEhfVFhfQ1NVTV9NQVhfU0laRSAJCTk4MDAKKyNkZWZpbmUgTVZfRVRIX1RYX0NTVU1fTUlOX1NJWkUJCQkyMDQ4CisjZGVmaW5lIE1WX1BOQ19UQ0FNX0xJTkVTCQkJMTAyNAkvKiBUQ0FNIG51bSBvZiBlbnRyaWVzICovCiAjZGVmaW5lIEJPQVJEX0VUSF9TV0lUQ0hfUE9SVF9OVU0JCTIKIAogLyogTmV3IEdNQUMgbW9kdWxlIGlzIHVzZWQgKi8KQEAgLTIzNSw2ICsyNjMsMTcgQEAKIAlJMkNfVU5JVF9JRCwKIAlVU0JfVU5JVF9JRCwKIAlVU0IzX1VOSVRfSUQsCisJTkFORF9VTklUX0lELAorCURFVkJVU19VTklUX0lELAorCUlETUFfVU5JVF9JRCwKKwlTQVRBX1VOSVRfSUQsCisJVERNX1VOSVRfSUQsCisJQ0VTQV9VTklUX0lELAorCUFVRElPX1VOSVRfSUQsCisJVFNfVU5JVF9JRCwKKwlYUE9OX1VOSVRfSUQsCisJQk1fVU5JVF9JRCwKKwlQTkNfVU5JVF9JRCwKIAlNQVhfVU5JVFNfSUQKIH0gTVZfVU5JVF9JRDsKIApAQCAtMjg4LDkgKzMyNyw1NyBAQAogCURFVl9CT09DUywJLyogMjMgREVWX0JPT0NTCQkJKi8KIAlVU0JfUkVHUywJLyogMjQgVVNCIEludGVybmFsIHJlZ2lzdGVycwkqLwogCURSQUdPTklURSwJLyogMjUgRHJhZ29uaXRlIGNvLXByb2Nlc3NvcgkqLwotCU1BWF9UQVJHRVRTCisJTUFYX1RBUkdFVFNfTVNZUwogfSBNVl9UQVJHRVQ7CiAKK2VudW0gX212VGFyZ2V0X2F4cCB7CisJU0RSQU1fQ1MwX0FYUCwJLyowIFNEUkFNIGNoaXAgc2VsZWN0IDAJCSovCisJU0RSQU1fQ1MxX0FYUCwJLyoxIFNEUkFNIGNoaXAgc2VsZWN0IDEJCSovCisJU0RSQU1fQ1MyX0FYUCwJLyoyIFNEUkFNIGNoaXAgc2VsZWN0IDIJCSovCisJU0RSQU1fQ1MzX0FYUCwJLyozIFNEUkFNIGNoaXAgc2VsZWN0IDMJCSovCisJREVWSUNFX0NTMF9BWFAsCS8qNCBEZXZpY2UgY2hpcCBzZWxlY3QgMAkqLworCURFVklDRV9DUzFfQVhQLAkvKjUgRGV2aWNlIGNoaXAgc2VsZWN0IDEJKi8KKwlERVZJQ0VfQ1MyX0FYUCwJLyo2IERldmljZSBjaGlwIHNlbGVjdCAyCSovCisJREVWSUNFX0NTM19BWFAsCS8qNyBEZXZpY2UgY2hpcCBzZWxlY3QgMwkqLworCVBFWDBfTUVNX0FYUCwJLyo4IFBDSSBFeHByZXNzIDAgTWVtb3J5CSovCisJUEVYMF9JT19BWFAsCS8qOSBQQ0kgRXhwcmVzcyAwIElPCQkqLworCVBFWDFfTUVNLAkvKjEwIFBDSSBFeHByZXNzIDEgTWVtb3J5CSovCisJUEVYMV9JTywJLyoxMSBQQ0kgRXhwcmVzcyAxIElPCQkqLworCVBFWDJfTUVNLAkvKjEyIFBDSSBFeHByZXNzIDIgTWVtb3J5CSovCisJUEVYMl9JTywJLyoxMyBQQ0kgRXhwcmVzcyAyIElPCQkqLworCVBFWDNfTUVNLAkvKjE0IFBDSSBFeHByZXNzIDMgTWVtb3J5CSovCisJUEVYM19JTywJLyoxNSBQQ0kgRXhwcmVzcyAzIElPCQkqLworCVBFWDRfTUVNLAkvKjE2IFBDSSBFeHByZXNzIDQgTWVtb3J5CSovCisJUEVYNF9JTywJLyoxNyBQQ0kgRXhwcmVzcyA0IElPCQkqLworCVBFWDVfTUVNLAkvKjE4IFBDSSBFeHByZXNzIDUgTWVtb3J5CSovCisJUEVYNV9JTywJLyoxOSBQQ0kgRXhwcmVzcyA1IElPCQkqLworCVBFWDZfTUVNLAkvKjIwIFBDSSBFeHByZXNzIDYgTWVtb3J5CSovCisJUEVYNl9JTywJLyoyMSBQQ0kgRXhwcmVzcyA2IElPCQkqLworCVBFWDdfTUVNLAkvKjIyIFBDSSBFeHByZXNzIDcgTWVtb3J5CSovCisJUEVYN19JTywJLyoyMyBQQ0kgRXhwcmVzcyA3IElPCQkqLworCVBFWDhfTUVNLAkvKjI0IFBDSSBFeHByZXNzIDggTWVtb3J5CSovCisJUEVYOF9JTywJLyoyNSBQQ0kgRXhwcmVzcyA4IElPCQkqLworCVBFWDlfTUVNLAkvKjI2IFBDSSBFeHByZXNzIDkgTWVtb3J5CSovCisJUEVYOV9JTywJLyoyNyBQQ0kgRXhwcmVzcyA5IElPCQkqLworCUlOVEVSX1JFR1NfQVhQLAkvKjI4IEludGVybmFsIHJlZ2lzdGVycwkJKi8KKwlETUFfVUFSVF9BWFAsCS8qMjkgRE1BIGJhc2VkIFVBUlQgcmVxdWVzdAkqLworCVNQSV9DUzBfQVhQLAkvKjMwIFNQSV9DUzAJCQkqLworCVNQSV9DUzFfQVhQLAkvKjMxIFNQSV9DUzEJCQkqLworCVNQSV9DUzJfQVhQLAkvKjMyIFNQSV9DUzIJCQkqLworCVNQSV9DUzNfQVhQLAkvKjMzIFNQSV9DUzMJCQkqLworCVNQSV9DUzRfQVhQLAkvKjM0IFNQSV9DUzQJCQkqLworCVNQSV9DUzVfQVhQLAkvKjM1IFNQSV9DUzUJCQkqLworCVNQSV9DUzZfQVhQLAkvKjM2IFNQSV9DUzYJCQkqLworCVNQSV9DUzdfQVhQLAkvKjM3IFNQSV9DUzcJCQkqLworCUJPT1RfUk9NX0NTX0FYUCwgLyozOCBCT09UX1JPTV9DUwkJKi8KKwlERVZfQk9PQ1NfQVhQLAkvKjM5IERFVl9CT09DUwkJCSovCisJUE1VX1NDUkFUQ0hQQUQsCS8qNDAgUE1VIFNjcmF0Y2hwYWQJCSovCisJQ1JZUFQwX0VORywJLyogNDEgQ3J5cHRvMCBFbmdpbmUJCSovCisJQ1JZUFQxX0VORywJLyogNDIgQ3J5cHRvMSBFbmdpbmUJCSovCisJUE5DX0JNLAkJLyogNDMgUE5DICsgQk0JCQkqLworCU1BWF9UQVJHRVRTX0FYUAorfTsKKwogI2lmZGVmIEFVUk9SQV9JT19DQUNIRV9DT0hFUkVOQ1kKICNkZWZpbmUgRFJBTV9DUzBfQVRUUgkJMHgxRQogI2RlZmluZSBEUkFNX0NTMV9BVFRSCQkweDFECkBAIC0zNjQsNiArNDUxLDEwMCBAQAogCiAKIAorI2RlZmluZSBUQVJHRVRTX0RFRl9BUlJBWV9BWFAJewkJCVwKKwl7RFJBTV9DUzBfQVRUUiwgRFJBTV9UQVJHRVRfSUQJfSwgLyogU0RSQU1fQ1MwICovCVwKKwl7RFJBTV9DUzFfQVRUUiwgRFJBTV9UQVJHRVRfSUQJfSwgLyogU0RSQU1fQ1MxICovCVwKKwl7RFJBTV9DUzJfQVRUUiwgRFJBTV9UQVJHRVRfSUQJfSwgLyogU0RSQU1fQ1MwICovCVwKKwl7RFJBTV9DUzNfQVRUUiwgRFJBTV9UQVJHRVRfSUQJfSwgLyogU0RSQU1fQ1MxICovCVwKKwl7MHgzRSwgREVWX1RBUkdFVF9JRAl9LCAvKiBERVZJQ0VfQ1MwICovCVwKKwl7MHgzRCwgREVWX1RBUkdFVF9JRAl9LCAvKiBERVZJQ0VfQ1MxICovCVwKKwl7MHgzQiwgREVWX1RBUkdFVF9JRAl9LCAvKiBERVZJQ0VfQ1MyICovCVwKKwl7MHgzNywgREVWX1RBUkdFVF9JRAl9LCAvKiBERVZJQ0VfQ1MzICovCVwKKwl7MHhFOCwgUEVYMF9UQVJHRVRfSUQJfSwgLyogUEVYMF9MQU5FMF9NRU0gKi8JXAorCXsweEUwLCBQRVgwX1RBUkdFVF9JRAl9LCAvKiBQRVgwX0xBTkUwX0lPICovCVwKKwl7MHhEOCwgUEVYMF9UQVJHRVRfSUQJfSwgLyogUEVYMF9MQU5FMV9NRU0gKi8JXAorCXsweEQwLCBQRVgwX1RBUkdFVF9JRAl9LCAvKiBQRVgwX0xBTkUxX0lPICovCVwKKwl7MHhCOCwgUEVYMF9UQVJHRVRfSUQJfSwgLyogUEVYMF9MQU5FMl9NRU0gKi8JXAorCXsweEIwLCBQRVgwX1RBUkdFVF9JRAl9LCAvKiBQRVgwX0xBTkUyX0lPICovCVwKKwl7MHg3OCwgUEVYMF9UQVJHRVRfSUQJfSwgLyogUEVYMF9MQU5FM19NRU0gKi8JXAorCXsweDcwLCBQRVgwX1RBUkdFVF9JRAl9LCAvKiBQRVgwX0xBTkUzX0lPICovCVwKKwl7MHhFOCwgREZYX1RBUkdFVF9JRAl9LCAvKiBQRVgxX0xBTkUwX01FTSAqLwlcCisJezB4RTAsIERGWF9UQVJHRVRfSUQJfSwgLyogUEVYMV9MQU5FMF9JTyAqLwlcCisJezB4RDgsIERGWF9UQVJHRVRfSUQJfSwgLyogUEVYMV9MQU5FMV9NRU0gKi8JXAorCXsweEQwLCBERlhfVEFSR0VUX0lECX0sIC8qIFBFWDFfTEFORTFfSU8gKi8JXAorCXsweEI4LCBERlhfVEFSR0VUX0lECX0sIC8qIFBFWDFfTEFORTJfTUVNICovCVwKKwl7MHhCMCwgREZYX1RBUkdFVF9JRAl9LCAvKiBQRVgxX0xBTkUyX0lPICovCVwKKwl7MHg3OCwgREZYX1RBUkdFVF9JRAl9LCAvKiBQRVgxX0xBTkUzX01FTSAqLwlcCisJezB4NzAsIERGWF9UQVJHRVRfSUQJfSwgLyogUEVYMV9MQU5FM19JTyAqLwlcCisJezB4RjgsIFBFWDBfVEFSR0VUX0lECX0sIC8qIFBFWDJfTEFORTBfTUVNICovCVwKKwl7MHhGMCwgUEVYMF9UQVJHRVRfSUQJfSwgLyogUEVYMl9MQU5FMF9JTyAqLwlcCisJezB4RjgsIERGWF9UQVJHRVRfSUQJfSwgLyogUEVYM19MQU5FMF9NRU0gKi8JXAorCXsweEYwLCBERlhfVEFSR0VUX0lECX0sIC8qIFBFWDNfTEFORTBfSU8gKi8JXAorCXsweEZGLCAweEZGCQl9LCAvKiBJTlRFUl9SRUdTICovCVwKKwl7MHgwMSwgREVWX1RBUkdFVF9JRAl9LCAvKiBETUFfVUFSVCAqLwlcCisJezB4MUUsIERFVl9UQVJHRVRfSUQJfSwgLyogU1BJX0NTMCAqLwlcCisJezB4NUUsIERFVl9UQVJHRVRfSUQJfSwgLyogU1BJX0NTMSAqLwlcCisJezB4OUUsIERFVl9UQVJHRVRfSUQJfSwgLyogU1BJX0NTMiAqLwlcCisJezB4REUsIERFVl9UQVJHRVRfSUQJfSwgLyogU1BJX0NTMyAqLwlcCisJezB4MUYsIERFVl9UQVJHRVRfSUQJfSwgLyogU1BJX0NTNCAqLwlcCisJezB4NUYsIERFVl9UQVJHRVRfSUQJfSwgLyogU1BJX0NTNSAqLwlcCisJezB4OUYsIERFVl9UQVJHRVRfSUQJfSwgLyogU1BJX0NTNiAqLwlcCisJezB4REYsIERFVl9UQVJHRVRfSUQJfSwgLyogU1BJX0NTNyAqLwlcCisJezB4MUQsIERFVl9UQVJHRVRfSUQJfSwgLyogTWFpbiBCb290IGRldmljZSAqLwlcCisJezB4MkYsIERFVl9UQVJHRVRfSUQJfSwgLyogU2Vjb25kYXJ5IEJvb3QgZGV2aWNlLCAqLwlcCisJezB4MkQsIERFVl9UQVJHRVRfSUQJfSwgLyogUE1VX1NDUkFUQ0hQQUQgKi8JXAorCXsweDA5LCBDUllQVF9UQVJHRVRfSUQJfSwgLyogQ1JZUFRfRU5HMCAqLwlcCisJezB4MDUsIENSWVBUX1RBUkdFVF9JRAl9LCAvKiBDUllQVF9FTkcxICovICAgICBcCisJezB4MDAsIFBOQ19CTV9UQVJHRVRfSUQJfSwgLyogUE5DX0JNICovCQlcCit9CisKKyNkZWZpbmUgVEFSR0VUU19OQU1FX0FSUkFZX0FYUAl7CQlcCisJIlNEUkFNX0NTMCIsCS8qIFNEUkFNX0NTMCAqLwkJXAorCSJTRFJBTV9DUzEiLAkvKiBTRFJBTV9DUzEgKi8JCVwKKwkiU0RSQU1fQ1MyIiwJLyogU0RSQU1fQ1MxICovCQlcCisJIlNEUkFNX0NTMyIsCS8qIFNEUkFNX0NTMSAqLwkJXAorCSJERVZJQ0VfQ1MwIiwJLyogREVWSUNFX0NTMCAqLwlcCisJIkRFVklDRV9DUzEiLAkvKiBERVZJQ0VfQ1MxICovCVwKKwkiREVWSUNFX0NTMiIsCS8qIERFVklDRV9DUzIgKi8JXAorCSJERVZJQ0VfQ1MzIiwJLyogREVWSUNFX0NTMyAqLwlcCisJIlBFWDBfTUVNIiwJLyogUEVYMF9NRU0gKi8JCVwKKwkiUEVYMF9JTyIsCS8qIFBFWDBfSU8gKi8JCVwKKwkiUEVYMV9NRU0iLAkvKiBQRVgxX01FTSAqLwkJXAorCSJQRVgxX0lPIiwJLyogUEVYMV9JTyAqLwkJXAorCSJQRVgyX01FTSIsCS8qIFBFWDJfTUVNICovCQlcCisJIlBFWDJfSU8iLAkvKiBQRVgyX0lPICovCQlcCisJIlBFWDNfTUVNIiwJLyogUEVYM19NRU0gKi8JCVwKKwkiUEVYM19JTyIsCS8qIFBFWDNfSU8gKi8JCVwKKwkiUEVYNF9NRU0iLAkvKiBQRVg0X01FTSAqLwkJXAorCSJQRVg0X0lPIiwJLyogUEVYNF9JTyAqLwkJXAorCSJQRVg1X01FTSIsCS8qIFBFWDVfTUVNICovCQlcCisJIlBFWDVfSU8iLAkvKiBQRVg1X0lPICovCQlcCisJIlBFWDZfTUVNIiwJLyogUEVYNl9NRU0gKi8JCVwKKwkiUEVYNl9JTyIsCS8qIFBFWDZfSU8gKi8JCVwKKwkiUEVYN19NRU0iLAkvKiBQRVg3X01FTSAqLwkJXAorCSJQRVg3X0lPIiwJLyogUEVYN19JTyAqLwkJXAorCSJQRVg4X01FTSIsCS8qIFBFWDhfTUVNICovCQlcCisJIlBFWDhfSU8iLAkvKiBQRVg4X0lPICovCQlcCisJIlBFWDlfTUVNIiwJLyogUEVYOV9NRU0gKi8JCVwKKwkiUEVYOV9JTyIsCS8qIFBFWDlfSU8gKi8JCVwKKwkiSU5URVJfUkVHUyIsCS8qIElOVEVSX1JFR1MgKi8JXAorCSJETUFfVUFSVCIsCS8qIERNQV9VQVJUICovCQlcCisJIlNQSV9DUzAiLAkvKiBTUElfQ1MwICovCQlcCisJIlNQSV9DUzEiLAkvKiBTUElfQ1MxICovCQlcCisJIlNQSV9DUzIiLAkvKiBTUElfQ1MyICovCQlcCisJIlNQSV9DUzMiLAkvKiBTUElfQ1MzICovCQlcCisJIlNQSV9DUzQiLAkvKiBTUElfQ1M0ICovCQlcCisJIlNQSV9DUzUiLAkvKiBTUElfQ1M1ICovCQlcCisJIlNQSV9DUzYiLAkvKiBTUElfQ1M2ICovCQlcCisJIlNQSV9DUzciLAkvKiBTUElfQ1M3ICovCQlcCisJIkJPT1RfUk9NX0NTIiwJLyogQk9PVF9ST01fQ1MgKi8JXAorCSJERVZfQk9PVENTIiwJLyogREVWX0JPT0NTICovCQlcCisJIlBNVV9TQ1JBVENIUEFEIiwvKiBQTVVfU0NSQVRDSFBBRCAqLwlcCisJIkNSWVBUMV9FTkciLAkvKiBDUllQVDFfRU5HICovCVwKKwkiQ1JZUFQyX0VORyIsCS8qIENSWVBUMl9FTkcgKi8JXAorCSJQTkNfQk0iCS8qIFBOQ19CTSAqLwkJXAorfQorCiAjZW5kaWYgLyogTVZfQVNNTEFOR1VBR0UgKi8KIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212U2VtYXBob3JlLmMgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212U2VtYXBob3JlLmMKaW5kZXggZDcxZGY0ZS4uZGU2YzQ5NiAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdlNlbWFwaG9yZS5jCisrKyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZTZW1hcGhvcmUuYwpAQCAtNDIsMTIgKzQyLDEyIEBACiAJICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAKICAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKwlkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogCiAgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCi0gICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCXVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKwlzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212U2VtYXBob3JlLmggYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212U2VtYXBob3JlLmgKaW5kZXggOGI4OTk0Yy4uOWFjODEzNCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdlNlbWFwaG9yZS5oCisrKyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZTZW1hcGhvcmUuaApAQCAtNDIsMTIgKzQyLDEyIEBACiAJICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAKICAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKwlkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogCiAgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCi0gICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCXVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKwlzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L3N5cy9tdkFoYlRvTWJ1cy5jIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9zeXMvbXZBaGJUb01idXMuYwppbmRleCBlNDYwOGFiLi4wMjI5ZDIyIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L3N5cy9tdkFoYlRvTWJ1cy5jCisrKyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvc3lzL212QWhiVG9NYnVzLmMKQEAgLTI1NSw3ICsyNTUsMTAgQEAKIAogCWlmICh3aW5OdW0gPT0gTVZfQUhCX1RPX01CVVNfSU5UUkVHX1dJTikgewogCQlwQWRkckRlY1dpbi0+YWRkcldpbi5zaXplID0gSU5URVJfUkVHU19TSVpFOwotCQlwQWRkckRlY1dpbi0+dGFyZ2V0ID0gSU5URVJfUkVHUzsKKwkJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJCXBBZGRyRGVjV2luLT50YXJnZXQgPSAoTVZfVTgpSU5URVJfUkVHU19BWFA7CisJCWVsc2UKKwkJCXBBZGRyRGVjV2luLT50YXJnZXQgPSBJTlRFUl9SRUdTOwogCQlwQWRkckRlY1dpbi0+ZW5hYmxlID0gTVZfVFJVRTsKIAogCQlyZXR1cm4gTVZfT0s7CkBAIC0zMDEsNyArMzA0LDcgQEAKIAkJcmV0dXJuIDB4ZmZmZmZmZmY7CiAJfQogCi0JaWYgKElOVEVSX1JFR1MgPT0gdGFyZ2V0KQorCWlmIChJTlRFUl9SRUdTID09IHRhcmdldCB8fCAoTVZfVTgpSU5URVJfUkVHU19BWFAgPT0gdGFyZ2V0KQogCQlyZXR1cm4gTVZfQUhCX1RPX01CVVNfSU5UUkVHX1dJTjsKIAogCWZvciAod2luTnVtID0gMDsgd2luTnVtIDwgTUFYX0FIQl9UT19NQlVTX1dJTlM7IHdpbk51bSsrKSB7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L3N5cy9tdkNwdUlmLmMgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L3N5cy9tdkNwdUlmLmMKaW5kZXggNThkYjM0OS4uYjVkMjYzMiAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9zeXMvbXZDcHVJZi5jCisrKyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvc3lzL212Q3B1SWYuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJLyogU2V0IElPIEJ5cGFzcyBiYXNlIGFkZHJlc3MgYW5kIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBjcHVBZGRyV2luTWFwICovCiAJZm9yICh0YXJnZXQgPSAwOyBjcHVBZGRyV2luTWFwW3RhcmdldF0uZW5hYmxlICE9IFRCTF9URVJNOyB0YXJnZXQrKykgewogCQlpZiAoKE1WX1RBUkdFVF9JU19EUkFNKHRhcmdldCkpIHx8IChESVMgPT0gY3B1QWRkcldpbk1hcFt0YXJnZXRdLmVuYWJsZSkgfHwKLQkJICAgICh0YXJnZXQgPT0gSU5URVJfUkVHUykpCisJCSAgICAodGFyZ2V0ID09IElOVEVSX1JFR1MpIHx8ICh0YXJnZXQgPT0gKE1WX1U4KUlOVEVSX1JFR1NfQVhQKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoY3B1QWRkcldpbk1hcFt0YXJnZXRdLmFkZHJXaW4uYmFzZUxvdyA9PSAwKQogCQkJY29udGludWU7CkBAIC0xOTAsNyArMTkwLDggQEAKIAogCS8qIEZpcnN0IGRpc2FibGUgYWxsIENQVSB0YXJnZXQgd2luZG93cyAgKi8KIAlmb3IgKHRhcmdldCA9IDA7IGNwdUFkZHJXaW5NYXBbdGFyZ2V0XS5lbmFibGUgIT0gVEJMX1RFUk07IHRhcmdldCsrKSB7Ci0JCWlmICgoTVZfVEFSR0VUX0lTX0RSQU0odGFyZ2V0KSkgfHwgKHRhcmdldCA9PSBJTlRFUl9SRUdTKSkKKwkJaWYgKChNVl9UQVJHRVRfSVNfRFJBTSh0YXJnZXQpKSB8fCAodGFyZ2V0ID09IElOVEVSX1JFR1MpIHx8CisJCSAgICAodGFyZ2V0ID09IChNVl9VOClJTlRFUl9SRUdTX0FYUCkpCiAJCQljb250aW51ZTsKIAogI2lmIGRlZmluZWQoTVZfTUVNX09WRVJfUEVYX1dBKSB8fCBkZWZpbmVkKE1WX1VBUlRfT1ZFUl9QRVhfV0EpCkBAIC03MjAsOSArNzIxLDIzIEBACiAJTVZfVTMyIHdpbk51bTsKIAogCS8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLQlpZiAoIU1WX1RBUkdFVF9JU19QRVgwKHBleFRhcmdldCkpIHsKLQkJbXZPc1ByaW50ZigibXZDcHVJZlBleFJlbWFwOiB0YXJnZXQgJWQgaXMgaWxsZWdhbFxuIiwgcGV4VGFyZ2V0KTsKLQkJcmV0dXJuIDB4ZmZmZmZmZmY7CisJaWYgKG12Q3RybFBleE1heElmR2V0KCkgPiAxKSB7CisJCWlmICgoIU1WX1RBUkdFVF9JU19QRVgwKHBleFRhcmdldCkpICYmCisJCQkoIU1WX1RBUkdFVF9JU19QRVgxKHBleFRhcmdldCkpICYmCisJCQkoIU1WX1RBUkdFVF9JU19QRVgyKHBleFRhcmdldCkpICYmCisJCQkoIU1WX1RBUkdFVF9JU19QRVgzKHBleFRhcmdldCkpICYmCisJCQkoIU1WX1RBUkdFVF9JU19QRVg0KHBleFRhcmdldCkpICYmCisJCQkoIU1WX1RBUkdFVF9JU19QRVg1KHBleFRhcmdldCkpICYmCisJCQkoIU1WX1RBUkdFVF9JU19QRVg2KHBleFRhcmdldCkpICYmCisJCQkoIU1WX1RBUkdFVF9JU19QRVg3KHBleFRhcmdldCkpICYmCisJCQkoIU1WX1RBUkdFVF9JU19QRVg4KHBleFRhcmdldCkpICYmCisJCQkoIU1WX1RBUkdFVF9JU19QRVg5KHBleFRhcmdldCkpKSB7CisJCQltdk9zUHJpbnRmKCJtdkNwdUlmUGV4UmVtYXA6IHRhcmdldCAlZCBpcyBpbGxlZ2FsXG4iLCBwZXhUYXJnZXQpOworCQkJcmV0dXJuIDB4ZmZmZmZmZmY7CisJCX0KKwl9IGVsc2UgaWYgKCFNVl9UQVJHRVRfSVNfUEVYMChwZXhUYXJnZXQpKSB7CisJCQltdk9zUHJpbnRmKCJtdkNwdUlmUGV4UmVtYXA6IHRhcmdldCAlZCBpcyBpbGxlZ2FsXG4iLCBwZXhUYXJnZXQpOworCQkJcmV0dXJuIDB4ZmZmZmZmZmY7CiAJfQogCiAJLyogZ2V0IHRoZSBXaW5kb3cgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhcmdldCAqLwpAQCAtOTQwLDMgKzk1NSwzMiBAQAogCiAJcmV0dXJuIE1WX09LOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkNwdUlmTWJ1c1dpbmRvd1NldAorKgorKiBERVNDUklQVElPTjoKKyoJU2V0IE1idXMgQnJpZGdlIFdpbmRvdyByZWdpc3RlcgorKgorKiBJTlBVVDoKKyoJV2luZG93cyBCYXNlIEFkZHJlc3MKKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk46CisqICAgICAgIE5vbmUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVk9JRCBtdkNwdUlmTWJ1c1dpbmRvd1NldChNVl9VMzIgYmFzZSwgTVZfVTMyIHNpemUpCit7CisJTVZfVTMyIHJlZzsKKworCU1WX1JFR19XUklURShNQlVTX0JSSURHRV9XSU5fQkFTRV9SRUcsIGJhc2UpOworCS8qIEFsaWduIHdpbmRvdyBzaXplIHRvIDY0S0IgKi8KKwlzaXplID0gKChzaXplIC8gXzY0SykgLSAxKSA8PCBCUklER1dDUl9TSVpFX09GRlM7CisJcmVnID0gTVZfUkVHX1JFQUQoTUJVU19CUklER0VfV0lOX0NUUkxfUkVHKTsKKwlyZWcgJj0gfkJSSURHV0NSX1NJWkVfTUFTSzsKKwlyZWcgfD0gKHNpemUgJiBCUklER1dDUl9TSVpFX01BU0spOworCU1WX1JFR19XUklURShNQlVTX0JSSURHRV9XSU5fQ1RSTF9SRUcsIHJlZyk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L3N5cy9tdkNwdUlmUmVncy5oIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9zeXMvbXZDcHVJZlJlZ3MuaAppbmRleCAwYzZjMTRmLi5mNzk1ZWNmIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L3N5cy9tdkNwdUlmUmVncy5oCisrKyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvc3lzL212Q3B1SWZSZWdzLmgKQEAgLTM0OCw2ICszNDgsMTcgQEAKICNkZWZpbmUgQ1BVX0FSTV9UT19IT1NUX0RSQkxfUkVHKGNwdSkJCShNVl9DUFVJRl9SRUdTX0JBU0UoY3B1KSArIDB4NzApCiAjZGVmaW5lIENQVV9BUk1fVE9fSE9TVF9NQVNLX1JFRyhjcHUpCQkoTVZfQ1BVSUZfUkVHU19CQVNFKGNwdSkgKyAweDc0KQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENMT0NLIENvbXBsZXggUmVnaXN0ZXJzIE1hcCAtIEFYUCBvbmx5ICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ1BVX0RJVl9DTEtfQ1RSTDBfUkVHCQkJKE1WX0NMS19DTVBMWF9SRUdTX09GRlNFVCkKKyNkZWZpbmUgQ1BVX0RJVl9DTEtfQ1RSTDBfUkVTRVRfTUFTS19PRkZTCTgKKyNkZWZpbmUgQ1BVX0RJVl9DTEtfQ1RSTDJfUkFUSU9fRlVMTDBfUkVHCShNVl9DTEtfQ01QTFhfUkVHU19PRkZTRVQgKyAweDgpCisjZGVmaW5lIENQVV9ESVZfQ0xLX0NUUkwyX05CX1JBVElPX09GRlMJCTE2CisjZGVmaW5lIENQVV9ESVZfQ0xLX0NUUkwzX1JBVElPX0ZVTEwxX1JFRwkoTVZfQ0xLX0NNUExYX1JFR1NfT0ZGU0VUICsgMHhDKQorI2RlZmluZSBDUFVfRElWX0NMS19DVFJMM19DUFVfUkFUSU9fT0ZGUwk4CisKIC8qIENQVSBjb250cm9sIHJlZ2lzdGVyIG1hcCAqLwogLyogU2V0IGJpdHMgbWVhbnMgdmFsdWUgaXMgYWJvdXQgdG8gY2hhbmdlIGFjY29yZGluZyB0byBuZXcgdmFsdWUgKi8KICNkZWZpbmUgQ1BVX0NPTkZJR19ERUZBVUxUX01BU0sgICAgICAgICAJKENDUl9WRUNfSU5JVF9MT0NfTUFTSykKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2RldmljZS9tdkRldmljZVJlZ3MuaCBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2RldmljZS9tdkRldmljZVJlZ3MuaAppbmRleCA0MTNhYmQ4Li42OWJkOGFhIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9kZXZpY2UvbXZEZXZpY2VSZWdzLmgKKysrIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvZGV2aWNlL212RGV2aWNlUmVncy5oCkBAIC03Niw2ICs3Niw4IEBACiAJc3dpdGNoIChudW0pIHsKIAljYXNlIChERVZfQk9PQ1MpOgogCQlyZXR1cm4gTVZfREVWX0JVU19SRUdTX09GRlNFVCArIDB4MDA7CisJY2FzZSAoREVWX0JPT0NTX0FYUCk6CisJCXJldHVybiBNVl9ERVZfQlVTX1JFR1NfT0ZGU0VUICsgMHgwMDsKIAljYXNlIChERVZJQ0VfQ1MwKToKIAkJcmV0dXJuIE1WX0RFVl9CVVNfUkVHU19PRkZTRVQgKyAweDA4OwogCWNhc2UgKERFVklDRV9DUzEpOgpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvbXZTeXNId0NvbmZpZy5oIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXZTeXNId0NvbmZpZy5oCmluZGV4IGU3ZDQ5MGUuLmFhZjE4NGUgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9tc3lzL212U3lzSHdDb25maWcuaAorKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9tdlN5c0h3Q29uZmlnLmgKQEAgLTEzNSw2ICsxMzUsNyBAQAogI2RlZmluZSBTV0lUQ0hfUkVHU19CQVNFCQkweEE4MDAwMDAwCiAjZGVmaW5lIFNXSVRDSF9SRUdTX1NJWkUJCV82NE0KICNkZWZpbmUgU1dJVENIX1JFR1NfVklSVF9CQVNFCVNXSVRDSF9SRUdTX0JBU0UKKyNkZWZpbmUgU1dJVENIX1dJTl9JRAkJCTUKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXZpY2U6IENTMCAtIE5PUiBvciBOQU5ELCBDUzEgLSBTUEksIENTMiAtIEJvb3QgUk9NLCBDUzMgLSBCb290IGRldmljZSAqLwogLyogTk9SIGFuZCBOQU5EIGFyZSBjb25maWd1cmUgdG8gQ1MwIGJ1dCBpdCBpcyBwb3NpYmxlIHRvIGxvYWQKQEAgLTI1Miw3ICsyNTMsNyBAQAogCQl7IHsgUEVYMF9JT19CQVNFLCAgICAgICAgIDAsICAgICAgUEVYMF9JT19TSVpFICAgIH0sICAgICAgVEJMX1VOVVNFRCwgICAgIERJUyB9LCAgICAgICAgLyogIDkgUEVYMF9JTyAqLwlcCiAJCXsgeyBJTlRFUl9SRUdTX0JBU0UsICAgICAgMCwgSU5URVJfUkVHU19TSVpFIH0sIE1WX0FIQl9UT19NQlVTX0lOVFJFR19XSU4sIEVOIH0sICAgICAgICAvKiAxMCBJTlRFUl9SRUdTICovIFwKIAkJeyB7IERGWF9SRUdTX0JBU0UsICAgICAgICAwLCAgICAgIERGWF9SRUdTX1NJWkUgICB9LCAgICAgIDEsICAgICAgICAgICAgICAgRU4gfSwgICAgICAgIC8qIDExIERGWF9SRUdTICovIFwKLQkJeyB7IFNXSVRDSF9SRUdTX0JBU0UsICAgICAwLCAgICAgU1dJVENIX1JFR1NfU0laRSB9LCAgICAgIDUsICAgICAgICAgICAgICAgRU4gfSwgICAgICAgIC8qIDEyIFNXSVRDSCAgICovIFwKKwkJeyB7IFNXSVRDSF9SRUdTX0JBU0UsICAgICAwLCAgICAgU1dJVENIX1JFR1NfU0laRSB9LCAgICAgIFNXSVRDSF9XSU5fSUQsICAgRU4gfSwgICAgICAgIC8qIDEyIFNXSVRDSCAgICovIFwKIAkJeyB7IFRCTF9VTlVTRUQsICAgICAgICAgICAwLCAgICAgIFRCTF9VTlVTRUQgICAgICB9LCAgICAgIFRCTF9VTlVTRUQsICAgICBESVMgfSwgICAgICAgIC8qIDEzIERNQV9VQVJUICAgKi8gXAogCQl7IHsgU1BJX0NTX0JBU0UsICAgICAgICAgIDAsICAgICAgU1BJX0NTX1NJWkUgICAgIH0sICAgICAgOCwgICAgICAgICAgICAgICBFTiB9LCAgICAgICAgLyogMTQgU1BJX0NTMCAqLwlcCiAJCXsgeyBUQkxfVU5VU0VELCAgICAgICAgICAgMCwgICAgICBUQkxfVU5VU0VEICAgICAgfSwgICAgICBUQkxfVU5VU0VELCAgICAgRElTIH0sICAgICAgICAvKiAxNSBTUElfQ1MxICovCVwKZGlmZiAtLWdpdCBhL2JvYXJkcy5jZmcgYi9ib2FyZHMuY2ZnCmluZGV4IGY0OTdiODkuLjRhMDE0MzAgMTAwNjQ0Ci0tLSBhL2JvYXJkcy5jZmcKKysrIGIvYm9hcmRzLmNmZwpAQCAtNTQsNiArNTQsNyBAQAogYXJtYWRhXzM4eCAgICAgICAgICAgICAgICAgICBhcm0gICAgICAgICBhcm12NyAgICAgICBhMzh4ICAgICAgICAgICAgICAgIG12X2VidSAgICAgICAgIG12Y2E5ICAgICAgICBhcm1hZGFfMzh4OkFSTUFEQV8zOFgKIGFybWFkYV8zOHhfY3VzdG9tZXIwICAgICAgICAgYXJtICAgICAgICAgYXJtdjcgICAgICAgYTM4eCAgICAgICAgICAgICAgICBtdl9lYnUgICAgICAgICBtdmNhOSAgICAgICAgYXJtYWRhXzM4eDpDVVNUT01FUl9CT0FSRF8wLEFSTUFEQV8zOFgKIGFybWFkYV8zOHhfY3VzdG9tZXIxICAgICAgICAgYXJtICAgICAgICAgYXJtdjcgICAgICAgYTM4eCAgICAgICAgICAgICAgICBtdl9lYnUgICAgICAgICBtdmNhOSAgICAgICAgYXJtYWRhXzM4eDpDVVNUT01FUl9CT0FSRF8xLEFSTUFEQV8zOFgKK2FybWFkYV8zOHhfY2xlYXJmb2cgICAgICAgICAgYXJtICAgICAgICAgYXJtdjcgICAgICAgYTM4eCAgICAgICAgICAgICAgICBtdl9lYnUgICAgICAgICBtdmNhOSAgICAgICAgYXJtYWRhXzM4eDpDTEVBUkZPR19CT0FSRCxBUk1BREFfMzhYCiBhcm1hZGFfMzh4X2dmY2gxMDAgICAgICAgICAgIGFybSAgICAgICAgIGFybXY3ICAgICAgIGEzOHggICAgICAgICAgICAgICAgbXZfZWJ1ICAgICAgICAgbXZjYTkgICAgICAgIGFybWFkYV8zOHg6R0ZDSDEwMCxBUk1BREFfMzhYCiBhcm1hZGFfMzl4ICAgICAgICAgICAgICAgICAgIGFybSAgICAgICAgIGFybXY3ICAgICAgIGEzOHggICAgICAgICAgICAgICAgbXZfZWJ1ICAgICAgICAgbXZjYTkgICAgICAgIGFybWFkYV8zOHg6QVJNQURBXzM5WAogYXJtYWRhXzM5eF9jdXN0b21lcjAgICAgICAgICBhcm0gICAgICAgICBhcm12NyAgICAgICBhMzh4ICAgICAgICAgICAgICAgIG12X2VidSAgICAgICAgIG12Y2E5ICAgICAgICBhcm1hZGFfMzh4OkNVU1RPTUVSX0JPQVJEXzAsQVJNQURBXzM5WApkaWZmIC0tZ2l0IGEvYnVpbGQucGwgYi9idWlsZC5wbAppbmRleCAxN2I5OTY4Li5kNzg2ZWUxIDEwMDc1NQotLS0gYS9idWlsZC5wbAorKysgYi9idWlsZC5wbApAQCAtMTMsMTQgKzEzLDE0IEBACiAJcHJpbnQgIk9wdGlvbnM6XG4iOwogCXByaW50ICJcdC1mXHRCb290IGRldmljZS4gQWNjZXB0cyBzcGksIG5vciwgbmFuZCwgbW1jXG4iOwogCXByaW50ICJcdC1iXHRCb2FyZCB0eXBlLiBBY2NlcHRzOlx0YXZhbnRhX2xwICwgYXZhbnRhX2xwX2N1c3RvbWVyMCAsIGF2YW50YV9scF9jdXN0b21lcjFcbiI7Ci0JcHJpbnQgIlx0XHRcdFx0XHRhcm1hZGFfMzh4LCBhcm1hZGFfMzh4X2N1c3RvbWVyMCwgYXJtYWRhXzM4eF9jdXN0b21lcjFcbiI7CisJcHJpbnQgIlx0XHRcdFx0XHRhcm1hZGFfMzh4LCBhcm1hZGFfMzh4X2NsZWFyZm9nLCBhcm1hZGFfMzh4X2N1c3RvbWVyMCwgYXJtYWRhXzM4eF9jdXN0b21lcjFcbiI7CiAJcHJpbnQgIlx0XHRcdFx0XHRhcm1hZGFfMzl4LCBhcm1hZGFfMzl4X2N1c3RvbWVyMCwgYXJtYWRhXzM5eF9jdXN0b21lcjFcbiI7CiAJcHJpbnQgIlx0XHRcdFx0XHRhcm1hZGFfMzc1LCBhcm1hZGFfMzc1X2N1c3RvbWVyMCwgYXJtYWRhXzM3NV9jdXN0b21lcjFcbiI7CiAJcHJpbnQgIlx0XHRcdFx0XHRib2JjYXQyX2RiLCBib2JjYXQyX3JkLCBib2JjYXQyX2N1c3RvbWVyMCwgYm9iY2F0Ml9jdXN0b21lcjFcbiI7CiAJcHJpbnQgIlx0XHRcdFx0XHRhYzNfZGIsIGFjM19yZCwgYWMzX2N1c3RvbWVyMCwgYWMzX2N1c3RvbWVyMVxuIjsKIAlwcmludCAiXHQtb1x0T3V0cHV0IGRpci9maWxlLiBUaGUgaW1hZ2Ugd2lsbCBiZSBjb3BpZWQgaW50byB0aGlzIGRpci9maWxlXG4iOwogCXByaW50ICJcdC1lXHRCaWcgRW5kaWFuLiBJZiBub3Qgc3BlY2lmaWVkIExpdHRsZSBlbmRpYW4gaXMgdXNlZFxuIjsKLQlwcmludCAiXHQtbVx0RERSIHR5cGUoZGVmYXVsdDogRERSMykuIEFjY2VwdHM6IDMgZm9yIEREUjMsIDQgZm9yIEREUjRcbiI7CisgCXByaW50ICJcdC1tXHRERFIgdHlwZShkZWZhdWx0OiBERFI0IGZvciBBMzl4LCBERFIzIGZvciB0aGUgcmVzdCkuIEFjY2VwdHM6IDMgZm9yIEREUjMsIDQgZm9yIEREUjRcbiI7CiAJcHJpbnQgIlx0LWlcdFN1cHBvcnRlZCBpbnRlcmZhY2VzLCBzZXBlcmF0ZWQgYnkgXCI6XCIgLSAgQWNjZXB0cyBbc3BpOm5vcjpuYW5kXVxuIjsKIAlwcmludCAiXHQtdlx0U1cgdmVyc2lvbiAoaW4gZmlsZSBuYW1lOiB1LWJvb3QtYWxwLVguWC5YLXNwaS5iaW4sIGVsc2UgdXNpbmcgZGF0ZSBieSBkZWZhdWx0KVxuIjsKIAlwcmludCAiXHRcdGludGVyZmFjZXMuIFN1cHBvcnRzIHNwaSwgbm9yLCBuYW5kLiB0aGUgYm9vdCBcbiI7CkBAIC05NCw2ICs5NCw3IEBACiAJKCRvcHRfYiBlcSAiYXJtYWRhXzM3NV9jdXN0b21lcjAiKSBvcgogCSgkb3B0X2IgZXEgImFybWFkYV8zNzVfY3VzdG9tZXIxIikgb3IKIAkoJG9wdF9iIGVxICJhcm1hZGFfMzh4Iikgb3IKKwkoJG9wdF9iIGVxICJhcm1hZGFfMzh4X2NsZWFyZm9nIikgb3IKIAkoJG9wdF9iIGVxICJhcm1hZGFfMzh4X2N1c3RvbWVyMCIpIG9yCiAJKCRvcHRfYiBlcSAiYXJtYWRhXzM4eF9jdXN0b21lcjEiKSBvcgogCSgkb3B0X2IgZXEgImFybWFkYV8zOHhfZ2ZjaDEwMCIpIG9yCkBAIC0xMTEsMTkgKzExMiwyNCBAQAogCSgkb3B0X2IgZXEgImFjM19jdXN0b21lcjEiKSApCiB7CiAJJGJvYXJkID0gJG9wdF9iOworCSRkZHIzTGliQnVpbGQ9InllcyI7CiAJaWYoIChzdWJzdHIgJGJvYXJkLDcgLCAzKSBlcSAiMzcwIiApIHsKIAkJJGJvYXJkSUQ9ImEzNzAiOwogCQkkdGFyZ2V0Qm9hcmQgPSBzdWJzdHIgJGJvYXJkLCAxMTsKKwkJJGRkcjNMaWJCdWlsZD0ibm8iOwogCX0KIAllbHNpZiAoIChzdWJzdHIgJGJvYXJkLDcgLCAyKSBlcSAieHAiICkgewogCQkkYm9hcmRJRD0iYXhwIjsKIAkJJHRhcmdldEJvYXJkID0gc3Vic3RyICRib2FyZCwgMTA7CisJCSRkZHIzTGliQnVpbGQ9Im5vIjsKIAl9CiAJZWxzaWYgKCAoc3Vic3RyICRib2FyZCw3ICwgMikgZXEgImxwIiApIHsKIAkJJGJvYXJkSUQ9ImFscCI7CisJCSRkZHIzTGliQnVpbGQ9Im5vIjsKIAl9CiAJZWxzaWYgKCAoc3Vic3RyICRib2FyZCw3ICwgMykgZXEgIjM3NSIgKSB7CiAJCSRib2FyZElEPSJhMzc1IjsKKwkJJGRkcjNMaWJCdWlsZD0ibm8iOwogCX0KIAllbHNpZiAoIChzdWJzdHIgJGJvYXJkLDcgLCAzKSBlcSAiMzh4IiApIHsKIAkJJGJvYXJkSUQ9ImEzOHgiOwpAQCAtMTM5LDEwICsxNDUsMTIgQEAKIAkJJGJvYXJkSUQ9Im1zeXMtYWMzIjsKIAkJJHRhcmdldEJvYXJkID0gc3Vic3RyICRib2FyZCwgODsKIAl9Ci0JIyBpZiBib2FyZCBzdHJpbmcgY29udGFpbnMgImN1c3RvbWVyIiwgdXNlIGN1c3RvbWVyIGRlZmluZSBmb3IgYmluYXJ5X2hlYWRlcgotCWlmIChpbmRleCgkYm9hcmQsICJjdXN0b21lciIpICE9IC0xIHx8IGluZGV4KCRib2FyZCwgImdmY2gxMDAiKSAhPSAtMSl7Ci0JCXN5c3RlbSgiZWNobyBcIiNkZWZpbmUgQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQgMVwiID4+IGluY2x1ZGUvY29uZmlnLmgiKTsKKwkjIGlmIGJvYXJkIHN0cmluZyBjb250YWlucyAiY3VzdG9tZXIiIChPciBBMzh4LVNvbGlkUnVuIENsZWFyIGZvZyBib2FyZCksIHVzZSBjdXN0b21lciBkZWZpbmUgZm9yIGJpbmFyeV9oZWFkZXIKKwlpZiAoKGluZGV4KCRib2FyZCwgImN1c3RvbWVyIikgIT0gLTEpIG9yIChpbmRleCgkYm9hcmQsICJjbGVhcmZvZyIpICE9IC0xKQorCQlvciAoaW5kZXgoJGJvYXJkLCAiZ2ZjaDEwMCIpICE9IC0xKSkgeworCQkJc3lzdGVtKCJlY2hvIFwiI2RlZmluZSBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCAxXCIgPj4gaW5jbHVkZS9jb25maWcuaCIpOwogCX0KKwogfQogZWxzZQogewpAQCAtMzQ0LDYgKzM1MiwxOSBAQAogCXByaW50ICJcbiI7CiB9CiAKK2lmKCRvcHRfZCBlcSA0KQoreworCXN5c3RlbSgiZWNobyBcIkREUjRTVUJMSUIgPSB5ZXNcIiA+PiBpbmNsdWRlL2NvbmZpZy5tayIpOworCXByaW50ICIqKiBSZWJ1aWxkIEREUjQgc3VibGliICoqXG4iOworCSRvcHRfZCA9IDI7Cit9CisKKyNieSBkZWZhdWx0IC1kIDIgd2lsbCBiZSBlbmFibGVkIGZvciBuZXcgVElQIFNvQ3MKK2lmKCgkZGRyM0xpYkJ1aWxkIGVxICJ5ZXMiKSAmJiAhKChzdWJzdHIgJGJvYXJkLDcgLCAzKSBlcSAiMzl4IikpCit7CisJJG9wdF9kID0gMjsKK30KKwogaWYoZGVmaW5lZCAkb3B0X2QpCiB7CiAJc3lzdGVtKCJlY2hvIFwiRERSM0xJQiA9ICRvcHRfZFwiID4+IGluY2x1ZGUvY29uZmlnLm1rIik7CkBAIC00MzksNiArNDYwLDcgQEAKIHByaW50ICJcbioqKiogW0NyZWF0aW5nIEltYWdlXVx0KioqKipcblxuIjsKIAogJGZhaWxVYXJ0ID0gc3lzdGVtKCIuL3Rvb2xzL21hcnZlbGwvZG9pbWFnZSAtVCB1YXJ0IC1EIDAgLUUgMCAtRyAuL3Rvb2xzL21hcnZlbGwvYmluX2hkci9iaW5faGRyLnVhcnQuYmluIHUtYm9vdC5iaW4gdS1ib290LSRib2FyZElELSRvcHRfdi0kZmxhc2hfbmFtZSR0YXJnZXRCb2FyZC11YXJ0LmJpbiIpOworJGZhaWxEZWJ1ZyA9IHN5c3RlbSgiLi90b29scy9tYXJ2ZWxsL2RvaW1hZ2UgLVQgdWFydCAtRCAwIC1FIDAgLUggMyAtRyAuL3Rvb2xzL21hcnZlbGwvYmluX2hkci9iaW5faGRyLmRlYnVnLmJpbiB1LWJvb3QuYmluIHUtYm9vdC0kYm9hcmRJRC0kb3B0X3YtJGZsYXNoX25hbWUkdGFyZ2V0Qm9hcmQtZGVidWcuYmluIik7CiAkZmFpbCA9IHN5c3RlbSgiLi90b29scy9tYXJ2ZWxsL2RvaW1hZ2UgLVQgJGltZ190eXBlIC1EIDB4MCAtRSAweDAgJGltZ19vcHRzICRyc2Ffb3B0cyAkaWRfb3B0cyAkZXh0cmFfb3B0IC1HIC4vdG9vbHMvbWFydmVsbC9iaW5faGRyLyRiaW5faGRyX24gdS1ib290LmJpbiB1LWJvb3QtJGJvYXJkSUQtJG9wdF92LSRmbGFzaF9uYW1lJHRhcmdldEJvYXJkLmJpbiIpOwogCiBpZigkZmFpbCl7CkBAIC00NDksNiArNDcxLDEwIEBACiAJcHJpbnQgIlxuICoqKiBFcnJvcjogRG9pbWFnZSBmb3IgdWFydCBpbWFnZSBmYWlsZWRcblxuIjsKIAlleGl0IDE7CiB9CitpZigkZmFpbERlYnVnKXsKKwlwcmludCAiXG4gKioqIEVycm9yOiBEb2ltYWdlIGZvciBkZWJ1ZyBpbWFnZSBmYWlsZWRcblxuIjsKKwlleGl0IDE7Cit9CiAKIGlmKGRlZmluZWQgJG9wdF9vKQogewpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9kaXNrLmMgYi9jb21tb24vY21kX2Rpc2suYwppbmRleCBlZTRlMjE1Li44YzRkMGJkIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2Rpc2suYworKysgYi9jb21tb24vY21kX2Rpc2suYwpAQCAtNjcsNyArNjcsOCBAQAogCSAgICAgICAiTmFtZTogJS4zMnMgIFR5cGU6ICUuMzJzXG4iLCBpbnRmLCBkZXYsIHBhcnQsIGluZm8ubmFtZSwKIAkgICAgICAgaW5mby50eXBlKTsKIAotCWRlYnVnKCJGaXJzdCBCbG9jazogJWxkLCAgIyBvZiBibG9ja3M6ICVsZCwgQmxvY2sgU2l6ZTogJWxkXG4iLAorCWRlYnVnKCJGaXJzdCBCbG9jazogIiBMQkFGVSAiLCAgIyBvZiBibG9ja3M6ICIgTEJBRlUKKwkgICAgICAiLCBCbG9jayBTaXplOiAlbGRcbiIsCiAJICAgICAgaW5mby5zdGFydCwgaW5mby5zaXplLCBpbmZvLmJsa3N6KTsKIAogCWlmIChkZXZfZGVzYy0+YmxvY2tfcmVhZChkZXYsIGluZm8uc3RhcnQsIDEsICh1bG9uZyAqKSBhZGRyKSAhPSAxKSB7CmRpZmYgLS1naXQgYS9jb21tb24vY21kX2kyYy5jIGIvY29tbW9uL2NtZF9pMmMuYwppbmRleCA0MzgwNzk0Li42YjU1Y2E4IDEwMDY0NAotLS0gYS9jb21tb24vY21kX2kyYy5jCisrKyBiL2NvbW1vbi9jbWRfaTJjLmMKQEAgLTE1NzYsNiArMTU3Niw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIENPTkZJR19TWVNfTE9OR0hFTFAKIHN0YXRpYyBjaGFyIGkyY19oZWxwX3RleHRbXSA9CisJImFkZHJlc3MuWy4wLCAuMl0gPSBBZGRyZXNzIGxlbmd0aCBbYnl0ZSwgMmJ5dGVdIgorCSJ4eC5bLmIsIC53LCAubF0gID0gUmV0dXJuZWQgRGF0YSBsZW5ndGggW2J5dGUsIDJieXRlLCA0Ynl0ZV0iCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX01VWCkKIAkiYnVzIFttdXh0eXBlOm11eGFkZHI6bXV4Y2hhbm5lbF0gLSBhZGQgYSBuZXcgYnVzIHJlYWNoZWQgb3ZlciBtdXhlc1xuaTJjICIKICNlbmRpZiAgLyogQ09ORklHX0kyQ19NVVggKi8KQEAgLTE1ODgsOSArMTU5MCw5IEBACiAjZW5kaWYgIC8qIENPTkZJR19JMkNfRURJRCAqLwogCSJpMmMgbG9vcCBjaGlwIGFkZHJlc3NbLjAsIC4xLCAuMl0gWyMgb2Ygb2JqZWN0c10gLSBsb29waW5nIHJlYWQgb2YgZGV2aWNlXG4iCiAJImkyYyBtZCBjaGlwIGFkZHJlc3NbLjAsIC4xLCAuMl0gWyMgb2Ygb2JqZWN0c10gLSByZWFkIGZyb20gSTJDIGRldmljZVxuIgotCSJpMmMgbW0gY2hpcCBhZGRyZXNzWy4wLCAuMSwgLjJdIC0gd3JpdGUgdG8gSTJDIGRldmljZSAoYXV0by1pbmNyZW1lbnRpbmcpXG4iCi0JImkyYyBtdyBjaGlwIGFkZHJlc3NbLjAsIC4xLCAuMl0gdmFsdWUgW2NvdW50XSAtIHdyaXRlIHRvIEkyQyBkZXZpY2UgKGZpbGwpXG4iCi0JImkyYyBubSBjaGlwIGFkZHJlc3NbLjAsIC4xLCAuMl0gLSB3cml0ZSB0byBJMkMgZGV2aWNlIChjb25zdGFudCBhZGRyZXNzKVxuIgorCSJpMmMgbW1bLmIsIC53LCAubF0gY2hpcCBhZGRyZXNzWy4wLCAuMSwgLjJdIC0gd3JpdGUgdG8gSTJDIGRldmljZSAoYXV0by1pbmNyZW1lbnRpbmcpXG4iCisJImkyYyBubVsuYiwgLncsIC5sXSBjaGlwIGFkZHJlc3NbLjAsIC4xLCAuMl0gLSB3cml0ZSB0byBJMkMgZGV2aWNlIChjb25zdGFudCBhZGRyZXNzKVxuIgorCSJpMmMgbXcgY2hpcCBhZGRyZXNzWy4wLCAuMSwgLjJdIHZhbHVlIFtjb3VudF0gLSB3cml0ZSB0byBJMkMgZGV2aWNlIChmaWxsIGNvbnN0YW50IHZhbHVlKVxuIgogCSJpMmMgcHJvYmUgW2FkZHJlc3NdIC0gdGVzdCBmb3IgYW5kIHNob3cgZGV2aWNlKHMpIG9uIHRoZSBJMkMgYnVzXG4iCiAJImkyYyByZWFkIGNoaXAgYWRkcmVzc1suMCwgLjEsIC4yXSBsZW5ndGggbWVtYWRkcmVzcyAtIHJlYWQgdG8gbWVtb3J5IFxuIgogCSJpMmMgd3JpdGUgbWVtYWRkcmVzcyBjaGlwIGFkZHJlc3NbLjAsIC4xLCAuMl0gbGVuZ3RoIC0gd3JpdGUgbWVtb3J5IHRvIGkyY1xuIgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9tdGRwYXJ0cy5jIGIvY29tbW9uL2NtZF9tdGRwYXJ0cy5jCmluZGV4IDY0MmVkNGIuLjE4MjZlMWUgMTAwNzU1Ci0tLSBhL2NvbW1vbi9jbWRfbXRkcGFydHMuYworKysgYi9jb21tb24vY21kX210ZHBhcnRzLmMKQEAgLTg2Niw2ICs4NjYsMTkgQEAKIAkvKiB2ZXJpZnkgaWYgd2UgaGF2ZSBhIHZhbGlkIGRldmljZSBzcGVjaWZpZWQgKi8KIAlpZiAoKGlkID0gaWRfZmluZF9ieV9tdGRfaWQobXRkX2lkLCBtdGRfaWRfbGVuIC0gMSkpID09IE5VTEwpIHsKIAkJcHJpbnRmKCJpbnZhbGlkIG10ZCBkZXZpY2UgJyUuKnMnXG4iLCBtdGRfaWRfbGVuIC0gMSwgbXRkX2lkKTsKKwkJLyogbGV0ICdwJyBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZGV2aWNlIGluIG9yZGVyCisJCSAqIHRvIHRyeSB0byBwYXJzZSBpdCBpbiB0aGUgbmV4dCBpdGVyYXRpb24KKwkJICogZXhhbXBsZTogbXRkcGFydHM9c3BpX2ZsYXNoOjRtKGJvb3QpLC0oc3BpLXJvb3Rmcyk7YXJtYWRhLW5hbmQ6OG0uLi4KKwkJICogd2hlbiBmYWlsaW5nIHRvIHJlY29nbml6ZSAnc3BpX2ZsYXNoJywgbGV0ICdwJyBwb2ludCB0byB0aGUgc3RhcnQKKwkJICogb2YgJ2FybWFkYS1uYW5kJworCQkgKiAqLworCQlwID0gc3RyY2hyKHAsICc7Jyk7CisJCWlmIChyZXQpIHsKKwkJCWlmIChwKQorCQkJCSpyZXQgPSArK3A7CisJCQllbHNlCisJCQkJKnJldCA9IE5VTEw7CisJCX0KIAkJcmV0dXJuIDE7CiAJfQogCkBAIC05MjgsNyArOTQxLDEyIEBACiAJCWlmICgqcCA9PSAnOycpIHsKIAkJCWlmIChyZXQpCiAJCQkJKnJldCA9ICsrcDsKLQkJfSBlbHNlIGlmICgqcCA9PSAnXDAnKSB7CisJCX0gZWxzZSBpZiAoKnAgPT0gJ1wwJyB8fCAoKnAgPT0gJ1wnJyAmJiAqKHArMSkgPT0gJ1wwJykpIHsKKwkJCS8qIGlnbm9yZSAnIGlmIGl0IGlzIHRoZSBsYXN0IGNoYXJhY3RlciwgaW4gY2FzZSAnbXRkcGFydHMnIGlzIHdyYXBwZWQKKwkJCSAqIHdpdGggcXVvdGF0aW9uIG1hcmtzLgorCQkJICogZXhhbXBsZTogbXRkcGFydHM9J210ZHBhcnRzPXNwaV9mbGFzaDo0bShib290KSwtKHNwaS1yb290ZnMpO2FybWFkYS1uYW5kOjhtLi4uJworCQkJICogaWdub3JlIHRoZSBsYXN0IGNoYXJhY3RlciAocXVvdGF0aW9uIG1hcmsgJyksIGFuZCBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlIG9uIGl0CisJCQkgKiAqLwogCQkJaWYgKHJldCkKIAkJCQkqcmV0ID0gcDsKIAkJfSBlbHNlIHsKQEAgLTE1NTEsNiArMTU2OSwxNCBAQAogCS8qIHJlLXJlYWQgJ210ZHBhcnRzJyB2YXJpYWJsZSwgbXRkX2RldmljZXNfaW5pdCBtYXkgYmUgdXBkYXRpbmcgZW52ICovCiAJcCA9IGdldGVudigibXRkcGFydHMiKTsKIAorCS8qIGlnbm9yZSAnIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIsIGluIGNhc2UgJ210ZHBhcnRzJyBpcyB3cmFwcGVkCisJICogd2l0aCBxdW90YXRpb24gbWFya3MuCisJICogZXhhbXBsZTogbXRkcGFydHM9J210ZHBhcnRzPXNwaV9mbGFzaDo0bShib290KSwtKHNwaS1yb290ZnMpO2FybWFkYS1uYW5kOjhtLi4uJworCSAqIGlnbm9yZSB0aGUgZmlyc3QgY2hhcmFjdGVyIChxdW90YXRpb24gbWFyayAnKSwgYW5kIGRvbid0IHByaW50IGVycm9yCisJICogKi8KKwlpZiAoKnAgPT0gJ1wnJykKKwkJcCsrOworCiAJaWYgKHN0cm5jbXAocCwgIm10ZHBhcnRzPSIsIDkpICE9IDApIHsKIAkJcHJpbnRmKCJtdGRwYXJ0cyB2YXJpYWJsZSBkb2Vzbid0IHN0YXJ0IHdpdGggJ210ZHBhcnRzPSdcbiIpOwogCQlyZXR1cm4gZXJyOwpAQCAtMTU1OSw4ICsxNTg1LDEyIEBACiAKIAl3aGlsZSAocCAmJiAoKnAgIT0gJ1wwJykpIHsKIAkJZXJyID0gMTsKLQkJaWYgKChkZXZpY2VfcGFyc2UocCwgJnAsICZkZXYpICE9IDApIHx8ICghZGV2KSkKLQkJCWJyZWFrOworCQlpZiAoKGRldmljZV9wYXJzZShwLCAmcCwgJmRldikgIT0gMCkgfHwgKCFkZXYpKSB7CisJCQkvKiB0cnkgdG8gcGFyc2UgbmV4dCBkZXZpY2UgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGZhaWxzCisJCQkgKiAncCcgd2lsbCBwb2ludCB0byB0aGUgbmV4dCBkZXZpY2UgKi8KKwkJCWVyciA9IDA7CisJCQljb250aW51ZTsKKwkJfQogCiAJCWRlYnVnKCIrIGRldmljZTogJXNcdCVkXHQlc1xuIiwgTVREX0RFVl9UWVBFKGRldi0+aWQtPnR5cGUpLAogCQkJCWRldi0+aWQtPm51bSwgZGV2LT5pZC0+bXRkX2lkKTsKQEAgLTE2MTksOCArMTY0OSwxNyBAQAogCiAJCXJldCA9IDE7CiAJCS8qIHBhcnNlICdub3InfCduYW5kJ3wnb25lbmFuZCc8ZGV2LW51bT4gKi8KLQkJaWYgKG10ZF9pZF9wYXJzZShwLCAmcCwgJnR5cGUsICZudW0pICE9IDApCi0JCQlicmVhazsKKwkJaWYgKG10ZF9pZF9wYXJzZShwLCAmcCwgJnR5cGUsICZudW0pICE9IDApIHsKKwkJCS8qIGxldCAncCcgcG9pbnQgdG8gdGhlIG5leHQgPGlkbWFwPiwgd2hlbiB0aGUgY3VycmVudCA8aWRtYXA+IHBhcnNpbmcgZmFpbHMuCisJCQkgKiBleGFtcGxlOiBtdGRpZHM9c3BpMD1zcGlfZmxhc2gsbmFuZDA9YXJtYWRhLW5hbmQKKwkJCSAqIHdoZW4gZmFpbGluZyB0byBwYXJzZSBzcGkwLCBsZXQgJ3AnIHBvaW50IHRvIHRoZSBzdGFydCBvZiBuYW5kMD1hcm1hZGEtbmFuZAorCQkJICovCisJCQlwID0gc3RyY2hyKHAsICcsJyk7CisJCQlpZiAocCkKKwkJCQlwKys7CisJCQlyZXQgPSAwOworCQkJY29udGludWU7CisJCX0KIAogCQlpZiAoKnAgIT0gJz0nKSB7CiAJCQlwcmludGYoIm10ZGlkczogaW5jb3JyZWN0IDxkZXYtbnVtPlxuIik7CmRpZmYgLS1naXQgYS9jb21tb24vY21kX3Njc2kuYyBiL2NvbW1vbi9jbWRfc2NzaS5jCmluZGV4IDYyZjIwNDIuLjk3N2JkZTkgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfc2NzaS5jCisrKyBiL2NvbW1vbi9jbWRfc2NzaS5jCkBAIC0xMTIsNiArMTEyLDE0IEBACiAJbGJhaW50X3QgY2FwYWNpdHk7CiAJdW5zaWduZWQgbG9uZyBibGtzejsKIAljY2IqIHBjY2I9KGNjYiAqKSZ0ZW1wY2NiOworCXN0YXRpYyBpbnQgc2NzaV9kZXRlY3RlZCA9IDA7CisKKwlpZiAoc2NzaV9kZXRlY3RlZCkgeworCQlwcmludGYoIioqIHNjc2kgZGV0ZWN0aW9uIGNhbiBydW4gb25seSBvbmNlIC0gcGxlYXNlIik7CisJCXByaW50ZigiIHJlc2V0IGJvYXJkIGJlZm9yZSBydW5uaW5nIGRldGVjdGlvbiBhZ2FpbiAqKlxuIik7CisJCXJldHVybjsKKwl9CisJc2NzaV9kZXRlY3RlZCA9IDE7CiAKIAlpZihtb2RlPT0xKSB7CiAJCXByaW50Zigic2Nhbm5pbmcgYnVzIGZvciBkZXZpY2VzLi4uXG4iKTsKQEAgLTUxNyw3ICs1MjUsNyBAQAogCQkgICAgICBfX2Z1bmNfXywgc3RhcnQsIHNtYWxsYmxrcywgYnVmX2FkZHIpOwogCQlpZiAoc2NzaV9leGVjKHBjY2IpICE9IFRSVUUpIHsKIAkJCXNjc2lfcHJpbnRfZXJyb3IocGNjYik7Ci0JCQlibGtjbnQgLT0gYmxrczsKKwkJCWJsa2NudCAtPSAoYmxrcyArIHNtYWxsYmxrcyk7CiAJCQlicmVhazsKIAkJfQogCQlidWZfYWRkciArPSBwY2NiLT5kYXRhbGVuOwpkaWZmIC0tZ2l0IGEvZGlzay9wYXJ0X2VmaS5jIGIvZGlzay9wYXJ0X2VmaS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMTEyYjQzOC4uNmZiNWQ0NgotLS0gYS9kaXNrL3BhcnRfZWZpLmMKKysrIGIvZGlzay9wYXJ0X2VmaS5jCkBAIC0yMDYsOCArMjA2LDggQEAKIAl1dWlkX3N0cmluZyhncHRfcHRlW3BhcnQgLSAxXS51bmlxdWVfcGFydGl0aW9uX2d1aWQuYiwgaW5mby0+dXVpZCk7CiAjZW5kaWYKIAotCWRlYnVnKCIlczogc3RhcnQgMHglbFgsIHNpemUgMHglbFgsIG5hbWUgJXMiLCBfX2Z1bmNfXywKLQkJaW5mby0+c3RhcnQsIGluZm8tPnNpemUsIGluZm8tPm5hbWUpOworCWRlYnVnKCIlczogc3RhcnQgMHgiIExCQUYgIiwgc2l6ZSAweCIgTEJBRiAiLCBuYW1lICVzIiwgX19mdW5jX18sCisJICAgICAgaW5mby0+c3RhcnQsIGluZm8tPnNpemUsIGluZm8tPm5hbWUpOwogCiAJLyogUmVtZW1iZXIgdG8gZnJlZSBwdGUgKi8KIAlmcmVlKGdwdF9wdGUpOwpAQCAtNDQyLDcgKzQ0Miw3IEBACiAJCQlncHRfZVtpXS5wYXJ0aXRpb25fbmFtZVtrXSA9CiAJCQkJKGVmaV9jaGFyMTZfdCkocGFydGl0aW9uc1tpXS5uYW1lW2tdKTsKIAotCQlkZWJ1ZygiJXM6IG5hbWU6ICVzIG9mZnNldFslZF06IDB4JXggc2l6ZVslZF06IDB4JWx4XG4iLAorCQlkZWJ1ZygiJXM6IG5hbWU6ICVzIG9mZnNldFslZF06IDB4JXggc2l6ZVslZF06IDB4IiBMQkFGICJcbiIsCiAJCSAgICAgIF9fZnVuY19fLCBwYXJ0aXRpb25zW2ldLm5hbWUsIGksCiAJCSAgICAgIG9mZnNldCwgaSwgcGFydGl0aW9uc1tpXS5zaXplKTsKIAl9CmRpZmYgLS1naXQgYS9kaXNrL3BhcnRfaXNvLmMgYi9kaXNrL3BhcnRfaXNvLmMKaW5kZXggYmFlY2VkNy4uNDliZmYxNSAxMDA2NDQKLS0tIGEvZGlzay9wYXJ0X2lzby5jCisrKyBiL2Rpc2svcGFydF9pc28uYwpAQCAtMjYxLDggKzI2MSw4IEBACiAJcHJpbnRmKCJQYXJ0ICAgU3RhcnQgICAgIFNlY3QgeCBTaXplIFR5cGVcbiIpOwogCWk9MDsKIAlkbyB7Ci0JCXByaW50ZiAoIiAlMmQgJThsZCAlOGxkICU2bGQgJS4zMnNcbiIsCi0JCQlpLCBpbmZvLnN0YXJ0LCBpbmZvLnNpemUsIGluZm8uYmxrc3osIGluZm8udHlwZSk7CisJCXByaW50ZigiICUyZCAiIExCQUZVICIgIiBMQkFGVSAiICU2bGQgJS4zMnNcbiIsCisJCSAgICAgICBpLCBpbmZvLnN0YXJ0LCBpbmZvLnNpemUsIGluZm8uYmxrc3osIGluZm8udHlwZSk7CiAJCWkrKzsKIAl9IHdoaWxlIChnZXRfcGFydGl0aW9uX2luZm9faXNvX3ZlcmIoZGV2X2Rlc2MsaSwmaW5mbywwKSE9LTEpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9haGNpLmMgYi9kcml2ZXJzL2Jsb2NrL2FoY2kuYwppbmRleCBkOTc2N2IzLi4wNGMxNzI5IDEwMDc1NQotLS0gYS9kcml2ZXJzL2Jsb2NrL2FoY2kuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FoY2kuYwpAQCAtNTAzLDYgKzUwMywyMCBAQAogCXBwLT5jbWRfc2xvdC0+dGJsX2FkZHJfaGkgPSAwOwogfQogCitzdGF0aWMgaW50IHdhaXRfc3BpbnVwKHZvbGF0aWxlIHU4ICpwb3J0X21taW8pCit7CisJdWxvbmcgc3RhcnQ7CisJdTMyIHRmX2RhdGE7CisKKwlzdGFydCA9IGdldF90aW1lcigwKTsKKwlkbyB7CisJCXRmX2RhdGEgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX1RGREFUQSk7CisJCWlmICghKHRmX2RhdGEgJiBBVEFfQlVTWSkpCisJCQlyZXR1cm4gMDsKKwl9IHdoaWxlIChnZXRfdGltZXIoc3RhcnQpIDwgV0FJVF9NU19TUElOVVApOworCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CiAKICNpZmRlZiBDT05GSUdfQUhDSV9TRVRGRUFUVVJFU19YRkVSCiBzdGF0aWMgdm9pZCBhaGNpX3NldF9mZWF0dXJlKHN0cnVjdCBhaGNpX3Byb2JlX2VudCAqcHJvYmVfZW50LCB1OCBwb3J0KQpAQCAtNTk1LDcgKzYwOSwxMSBAQAogCiAJZGVidWcoIkV4aXQgc3RhcnQgcG9ydCAlZFxuIiwgcG9ydCk7CiAKLQlyZXR1cm4gMDsKKwkvKgorCSAqIE1ha2Ugc3VyZSBpbnRlcmZhY2UgaXMgbm90IGJ1c3kgYmFzZWQgb24gZXJyb3IgYW5kIHN0YXR1cworCSAqIGluZm9ybWF0aW9uIGZyb20gdGFzayBmaWxlIGRhdGEgcmVnaXN0ZXIgYmVmb3JlIHByb2NlZWRpbmcKKwkgKi8KKwlyZXR1cm4gd2FpdF9zcGludXAocG9ydF9tbWlvKTsKIH0KIAogCkBAIC0xMDY1LDYgKzEwODMsMTQgQEAKIAlmaXNbMV0gPSAxIDw8IDc7CSAvKiBDb21tYW5kIEZJUy4gKi8KIAlmaXNbMl0gPSBBVEFfQ01EX0ZMVVNIX0VYVDsKIAorCS8qIENsZWFyIElSUSBzdGF0dXMgcmVnaXN0ZXIKKwkgKiBiZWZvcmUgaXNzdWluZyB0aGUgZmx1c2ggY29tbWFuZCB0byB0aGUgY29udHJvbGxlciwgbWFrZQorCSAqIHN1cmUgSVJRIHN0YXR1cyByZWdpc3RlciBpcyBmbHVzaGVkIChpbiBjYXNlIGEgcHJldmlvdXMKKwkgKiB0cmFuc2FjdGlvbiBlbmRlZCwgd2l0aG91dCBjbGVhcmluZyBpdCkuICoqIEZsdXNoIGNvbW1hbmQKKwkgKiB3aWxsIG5vdCBzdGFydC9jb21wbGV0ZSB1bmxlc3MgY2xlYXJpbmcgSVJRICoqCisJICogKi8KKwl3cml0ZWxfd2l0aF9mbHVzaCgweGZmZmZmZmZmLCBwb3J0X21taW8gKyBQT1JUX0lSUV9TVEFUKTsKKwogCW1lbWNweSgodW5zaWduZWQgY2hhciAqKXBwLT5jbWRfdGJsLCBmaXMsIDIwKTsKIAlhaGNpX2ZpbGxfY21kX3Nsb3QocHAsIGNtZF9maXNfbGVuKTsKIAl3cml0ZWxfd2l0aF9mbHVzaCgxLCBwb3J0X21taW8gKyBQT1JUX0NNRF9JU1NVRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9zZGhjaS5jIGIvZHJpdmVycy9tbWMvc2RoY2kuYwppbmRleCAzYmFiNzM5Li43MjI3YmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9zZGhjaS5jCisrKyBiL2RyaXZlcnMvbW1jL3NkaGNpLmMKQEAgLTE0OSw4ICsxNDksOCBAQAogCWludCB0cmFuc19ieXRlcyA9IDAsIGlzX2FsaWduZWQgPSAxOwogCXUzMiBtYXNrLCBmbGFncywgbW9kZTsKIAl1bnNpZ25lZCBpbnQgdGltZSA9IDAsIHN0YXJ0X2FkZHIgPSAwOwotCXVuc2lnbmVkIGludCByZXRyeSA9IDEwMDAwOwogCWludCBtbWNfZGV2ID0gbW1jLT5ibG9ja19kZXYuZGV2OworCXVuc2lnbmVkIHN0YXJ0ID0gZ2V0X3RpbWVyKDApOwogCiAJLyogVGltZW91dCB1bml0IC0gbXMgKi8KIAlzdGF0aWMgdW5zaWduZWQgaW50IGNtZF90aW1lb3V0ID0gQ09ORklHX1NESENJX0NNRF9ERUZBVUxUX1RJTUVPVVQ7CkBAIC0yMzYsNiArMjM2LDcgQEAKIAlmbHVzaF9jYWNoZShzdGFydF9hZGRyLCB0cmFuc19ieXRlcyk7CiAjZW5kaWYKIAlzZGhjaV93cml0ZXcoaG9zdCwgU0RIQ0lfTUFLRV9DTUQoY21kLT5jbWRpZHgsIGZsYWdzKSwgU0RIQ0lfQ09NTUFORCk7CisJc3RhcnQgPSBnZXRfdGltZXIoMCk7CiAJZG8gewogCQlzdGF0ID0gc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfSU5UX1NUQVRVUyk7CiAJCWlmIChzdGF0ICYgU0RIQ0lfSU5UX0VSUk9SKQpAQCAtMjQ3LDExICsyNDgsMTAgQEAKIAkJCWNtZC0+Y21kaWR4ID09IE1NQ19DTURfU1RPUF9UUkFOU01JU1NJT04pCiAJCQl1ZGVsYXkoNSk7CiAjZW5kaWYKLQkJaWYgKC0tcmV0cnkgPT0gMCkKLQkJCWJyZWFrOwotCX0gd2hpbGUgKChzdGF0ICYgbWFzaykgIT0gbWFzayk7CisJfSB3aGlsZSAoKChzdGF0ICYgbWFzaykgIT0gbWFzaykgJiYKKwkJIChnZXRfdGltZXIoc3RhcnQpIDwgQ09ORklHX1NESENJX0NNRF9ERUZBVUxUX1RJTUVPVVQpKTsKIAotCWlmIChyZXRyeSA9PSAwKSB7CisJaWYgKGdldF90aW1lcihzdGFydCkgPj0gQ09ORklHX1NESENJX0NNRF9ERUZBVUxUX1RJTUVPVVQpIHsKIAkJaWYgKGhvc3QtPnF1aXJrcyAmIFNESENJX1FVSVJLX0JST0tFTl9SMUIpCiAJCQlyZXR1cm4gMDsKIAkJZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZC5jCmluZGV4IGQ3OWJjMWMuLmVkNDBhYjYgMTAwNzU1Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZC5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAlib2FyZF9uYW5kX3NlbGVjdF9kZXZpY2UobmFuZF9pbmZvW25hbmRfY3Vycl9kZXZpY2VdLnByaXYsIG5hbmRfY3Vycl9kZXZpY2UpOwogI2VuZGlmCiB9Ci0jaWYgZGVmaW5lZChDT05GSUdfRU5WX0lTX0lOX05BTkQpCisKIGludCBuYW5kX2dldF9lbnZfb2Zmcyh2b2lkKQogewogCXNpemVfdCBvZmZzZXQgPSAwOwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAoaSArIDEpICogYmxvY2tzaXplOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgaWYgKHN1bSA+PSBDT05GSUdfRU5WX1JBTkdFKQorICAgICAgICAgICAgICAgIGlmIChzdW0gPj0gQ09ORklHX0VOVl9SQU5HRV9OQU5EKQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgfQpAQCAtMTY2LDExICsxNjYsMTAgQEAKIAlzaXplX3QgZW52X3NpemUgPSAwOwogCXNpemVfdCBibG9ja3NpemUgPSBuYW5kX2luZm9bMF0uZXJhc2VzaXplOwogCi0JaWYgKGJsb2Nrc2l6ZSA8IENPTkZJR19FTlZfU0laRSkgewotCQllbnZfc2l6ZSA9ICgoQ09ORklHX0VOVl9TSVpFICsgKGJsb2Nrc2l6ZSAtIDEpKSAmICh+KGJsb2Nrc2l6ZS0xKSkpOworCWlmIChibG9ja3NpemUgPCBDT05GSUdfRU5WX1NJWkVfTkFORCkgeworCQllbnZfc2l6ZSA9ICgoQ09ORklHX0VOVl9TSVpFX05BTkQgKyAoYmxvY2tzaXplIC0gMSkpICYgKH4oYmxvY2tzaXplLTEpKSk7CiAJCXJldHVybiBlbnZfc2l6ZTsKIAl9IGVsc2UKIAkJcmV0dXJuIGJsb2Nrc2l6ZTsKIH0KLSNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2thZGRyLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2thZGRyLmgKaW5kZXggYmM0ZmNkYi4uZTIxNjNkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrYWRkci5oCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2FkZHIuaApAQCAtMTU2LDYgKzE1Niw3IEBACiAKIHR5cGVkZWYgc3RydWN0IHNfTWFjQWRkciB7CiAJU0tfVTgJYVtTS19NQUNfQUREUl9MRU5dOworCVNLX1UxNglEdW1teUFsaWduV29yZDsgLyogRHVtbXkgZW50cnkgZm9yIDMyYml0IGFsaWdubWVudCBvbmx5LiAqLwogfSBTS19NQUNfQUREUjsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCmluZGV4IDU5ODEyMDAuLmM1NTMwMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCB4aGNpX2N0cmwgeGhjaWNbQ09ORklHX1VTQl9NQVhfQ09OVFJPTExFUl9DT1VOVF07CitzdGF0aWMgc3RydWN0IHhoY2lfY3RybCB4aGNpY1tDT05GSUdfVVNCX01BWF9DT05UUk9MTEVSX0hPU1RfQ09VTlRdOwogCiAvKioKICAqIFdhaXRzIGZvciBhcyBwZXIgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lCmRpZmYgLS1naXQgYS9mcy9leHQ0L2Rldi5jIGIvZnMvZXh0NC9kZXYuYwppbmRleCA0NjRhNjdkLi5kY2JiMTdmIDEwMDY0NAotLS0gYS9mcy9leHQ0L2Rldi5jCisrKyBiL2ZzL2V4dDQvZGV2LmMKQEAgLTQxLDcgKzQxLDcgQEAKICNpbmNsdWRlIDxleHQ0ZnMuaD4KICNpbmNsdWRlIDxleHRfY29tbW9uLmg+CiAKLXVuc2lnbmVkIGxvbmcgcGFydF9vZmZzZXQ7CitsYmFpbnRfdCBwYXJ0X29mZnNldDsKIAogc3RhdGljIGJsb2NrX2Rldl9kZXNjX3QgKmV4dDRmc19ibG9ja19kZXZfZGVzYzsKIHN0YXRpYyBkaXNrX3BhcnRpdGlvbl90ICpwYXJ0X2luZm87CkBAIC01NSw3ICs1NSw3IEBACiAJZ2V0X2ZzKCktPmRldl9kZXNjID0gcmJkZDsKIH0KIAotaW50IGV4dDRmc19kZXZyZWFkKGludCBzZWN0b3IsIGludCBieXRlX29mZnNldCwgaW50IGJ5dGVfbGVuLCBjaGFyICpidWYpCitpbnQgZXh0NGZzX2RldnJlYWQobGJhaW50X3Qgc2VjdG9yLCBpbnQgYnl0ZV9vZmZzZXQsIGludCBieXRlX2xlbiwgY2hhciAqYnVmKQogewogCUFMTE9DX0NBQ0hFX0FMSUdOX0JVRkZFUihjaGFyLCBzZWNfYnVmLCBTRUNUT1JfU0laRSk7CiAJdW5zaWduZWQgYmxvY2tfbGVuOwpAQCAtNjQsNyArNjQsNyBAQAogCWlmICgoc2VjdG9yIDwgMCkKIAkgICAgfHwgKChzZWN0b3IgKyAoKGJ5dGVfb2Zmc2V0ICsgYnl0ZV9sZW4gLSAxKSA+PiBTRUNUT1JfQklUUykpID49CiAJCXBhcnRfaW5mby0+c2l6ZSkpIHsKLQkJcHJpbnRmKCIlcyByZWFkIG91dHNpZGUgcGFydGl0aW9uICVkXG4iLCBfX2Z1bmNfXywgc2VjdG9yKTsKKwkJcHJpbnRmKCIlcyByZWFkIG91dHNpZGUgcGFydGl0aW9uICIgTEJBRlUgIlxuIiwgX19mdW5jX18sIHNlY3Rvcik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNzIsNyArNzIsNyBAQAogCXNlY3RvciArPSBieXRlX29mZnNldCA+PiBTRUNUT1JfQklUUzsKIAlieXRlX29mZnNldCAmPSBTRUNUT1JfU0laRSAtIDE7CiAKLQlkZWJ1ZygiIDwlZCwgJWQsICVkPlxuIiwgc2VjdG9yLCBieXRlX29mZnNldCwgYnl0ZV9sZW4pOworCWRlYnVnKCIgPCIgTEJBRlUgIiwgJWQsICVkPlxuIiwgc2VjdG9yLCBieXRlX29mZnNldCwgYnl0ZV9sZW4pOwogCiAJaWYgKGV4dDRmc19ibG9ja19kZXZfZGVzYyA9PSBOVUxMKSB7CiAJCXByaW50ZigiKiogSW52YWxpZCBCbG9jayBEZXZpY2UgRGVzY3JpcHRvciAoTlVMTClcbiIpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0X2NvbW1vbi5jIGIvZnMvZXh0NC9leHQ0X2NvbW1vbi5jCmluZGV4IGJjYzlkYzguLmM2MTg1Y2EgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9jb21tb24uYworKysgYi9mcy9leHQ0L2V4dDRfY29tbW9uLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAogCWlmICgoc3RhcnRibG9jayArIChzaXplIC8gU0VDVE9SX1NJWkUpKSA+CiAJICAgIChwYXJ0X29mZnNldCArIGZzLT50b3RhbF9zZWN0KSkgewotCQlwcmludGYoInBhcnRfb2Zmc2V0IGlzICVsdVxuIiwgcGFydF9vZmZzZXQpOworCQlwcmludGYoInBhcnRfb2Zmc2V0IGlzICIgTEJBRlUgIlxuIiwgcGFydF9vZmZzZXQpOwogCQlwcmludGYoInRvdGFsX3NlY3RvciBpcyAlbGx1XG4iLCBmcy0+dG90YWxfc2VjdCk7CiAJCXByaW50ZigiZXJyb3I6IG92ZXJmbG93IG9jY3Vyc1xuIik7CiAJCXJldHVybjsKQEAgLTQwNSw3ICs0MDUsNyBAQAogCQlwcmV2aW91c19ibGtuciA9IHJvb3RfYmxrbnI7CiAJfQogCi0Jc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoZmlyc3RfYmxvY2tfbm9fb2Zfcm9vdAorCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClmaXJzdF9ibG9ja19ub19vZl9yb290CiAJCQkJKiBmcy0+c2VjdF9wZXJibGssCiAJCQkJMCwgZnMtPmJsa3N6LCByb290X2ZpcnN0X2Jsb2NrX2J1ZmZlcik7CiAJaWYgKHN0YXR1cyA9PSAwKQpAQCAtNDU3LDkgKzQ1Nyw5IEBACiAJCQkJCWdvdG8gZmFpbDsKIAkJCQl9CiAJCQkJcHV0X2V4dDQoKCh1aW50NjRfdCkKLQkJCQkJICAoZ19wYXJlbnRfaW5vZGUtPmIuCisJCQkJCSAgKCh1aW50NjRfdClnX3BhcmVudF9pbm9kZS0+Yi4KIAkJCQkJICAgYmxvY2tzLmRpcl9ibG9ja3NbZGlyZWN0X2Jsa19pZHhdICoKLQkJCQkJICAgZnMtPmJsa3N6KSksIHplcm9fYnVmZmVyLCBmcy0+Ymxrc3opOworCQkJCQkgICAodWludDY0X3QpZnMtPmJsa3N6KSksIHplcm9fYnVmZmVyLCBmcy0+Ymxrc3opOwogCQkJCWdfcGFyZW50X2lub2RlLT5zaXplID0KIAkJCQkgICAgZ19wYXJlbnRfaW5vZGUtPnNpemUgKyBmcy0+Ymxrc3o7CiAJCQkJZ19wYXJlbnRfaW5vZGUtPmJsb2NrY250ID0KQEAgLTU0NSw3ICs1NDUsNyBAQAogCQlpZiAoIWJsb2NrX2J1ZmZlcikKIAkJCWdvdG8gZmFpbDsKIAotCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZChibGtuciAqIGZzLT5zZWN0X3BlcmJsaywKKwkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJsa25yICogZnMtPnNlY3RfcGVyYmxrLAogCQkJCQkwLCBmcy0+Ymxrc3osIChjaGFyICopYmxvY2tfYnVmZmVyKTsKIAkJaWYgKHN0YXR1cyA9PSAwKQogCQkJZ290byBmYWlsOwpAQCAtNzgzLDcgKzc4Myw3IEBACiAJaWYgKCFyb290X2ZpcnN0X2Jsb2NrX2J1ZmZlcikKIAkJcmV0dXJuIC1FTk9NRU07CiAJcm9vdF9maXJzdF9ibG9ja19hZGRyID0gcm9vdF9maXJzdF9ibG9ja19idWZmZXI7Ci0Jc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoZmlyc3RfYmxvY2tfbm9fb2Zfcm9vdCAqCisJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWZpcnN0X2Jsb2NrX25vX29mX3Jvb3QgKgogCQkJCWZzLT5zZWN0X3BlcmJsaywgMCwKIAkJCQlmcy0+Ymxrc3osIHJvb3RfZmlyc3RfYmxvY2tfYnVmZmVyKTsKIAlpZiAoc3RhdHVzID09IDApCkBAIC04NzYsOCArODc2LDggQEAKIAkJZm9yIChpID0gMDsgaSA8IGZzLT5ub19ibGtncnA7IGkrKykgewogCQkJaWYgKGJnZFtpXS5mcmVlX2Jsb2NrcykgewogCQkJCWlmIChiZ2RbaV0uYmdfZmxhZ3MgJiBFWFQ0X0JHX0JMT0NLX1VOSU5JVCkgewotCQkJCQlwdXRfZXh0NCgoKHVpbnQ2NF90KSAoYmdkW2ldLmJsb2NrX2lkICoKLQkJCQkJCQkgICAgICBmcy0+Ymxrc3opKSwKKwkJCQkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKCh1aW50NjRfdCliZ2RbaV0uYmxvY2tfaWQgKgorCQkJCQkJCSAgICAgICh1aW50NjRfdClmcy0+Ymxrc3opKSwKIAkJCQkJCSB6ZXJvX2J1ZmZlciwgZnMtPmJsa3N6KTsKIAkJCQkJYmdkW2ldLmJnX2ZsYWdzID0KIAkJCQkJICAgIGJnZFtpXS4KQEAgLTg5NSw3ICs4OTUsOCBAQAogCQkJCWZzLT5maXJzdF9wYXNzX2JibWFwKys7CiAJCQkJYmdkW2ldLmZyZWVfYmxvY2tzLS07CiAJCQkJZnMtPnNiLT5mcmVlX2Jsb2Nrcy0tOwotCQkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGJnZFtpXS5ibG9ja19pZCAqCisJCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KQorCQkJCQkJCWJnZFtpXS5ibG9ja19pZCAqCiAJCQkJCQkJZnMtPnNlY3RfcGVyYmxrLCAwLAogCQkJCQkJCWZzLT5ibGtzeiwKIAkJCQkJCQlqb3VybmFsX2J1ZmZlcik7CkBAIC05NDAsOCArOTQxLDggQEAKIAogCQlpZiAoYmdkW2JnX2lkeF0uYmdfZmxhZ3MgJiBFWFQ0X0JHX0JMT0NLX1VOSU5JVCkgewogCQkJbWVtc2V0KHplcm9fYnVmZmVyLCAnXDAnLCBmcy0+Ymxrc3opOwotCQkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKGJnZFtiZ19pZHhdLmJsb2NrX2lkICoKLQkJCQkJZnMtPmJsa3N6KSksIHplcm9fYnVmZmVyLCBmcy0+Ymxrc3opOworCQkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKCh1aW50NjRfdCliZ2RbYmdfaWR4XS5ibG9ja19pZCAqCisJCQkJCSh1aW50NjRfdClmcy0+Ymxrc3opKSwgemVyb19idWZmZXIsIGZzLT5ibGtzeik7CiAJCQltZW1jcHkoZnMtPmJsa19ibWFwc1tiZ19pZHhdLCB6ZXJvX2J1ZmZlciwgZnMtPmJsa3N6KTsKIAkJCWJnZFtiZ19pZHhdLmJnX2ZsYWdzID0gYmdkW2JnX2lkeF0uYmdfZmxhZ3MgJgogCQkJCQkJfkVYVDRfQkdfQkxPQ0tfVU5JTklUOwpAQCAtOTU3LDcgKzk1OCw3IEBACiAJCS8qIGpvdXJuYWwgYmFja3VwICovCiAJCWlmIChwcmV2X2JnX2JpdG1hcF9pbmRleCAhPSBiZ19pZHgpIHsKIAkJCW1lbXNldChqb3VybmFsX2J1ZmZlciwgJ1wwJywgZnMtPmJsa3N6KTsKLQkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGJnZFtiZ19pZHhdLmJsb2NrX2lkCisJCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpYmdkW2JnX2lkeF0uYmxvY2tfaWQKIAkJCQkJCSogZnMtPnNlY3RfcGVyYmxrLAogCQkJCQkJMCwgZnMtPmJsa3N6LCBqb3VybmFsX2J1ZmZlcik7CiAJCQlpZiAoc3RhdHVzID09IDApCkBAIC0xMDA3LDggKzEwMDgsOCBAQAogCQkJCQkJYmdkW2ldLmZyZWVfaW5vZGVzOwogCQkJCWlmIChiZ2RbaV0uYmdfZmxhZ3MgJiBFWFQ0X0JHX0lOT0RFX1VOSU5JVCkgewogCQkJCQlwdXRfZXh0NCgoKHVpbnQ2NF90KQotCQkJCQkJICAoYmdkW2ldLmlub2RlX2lkICoKLQkJCQkJCQlmcy0+Ymxrc3opKSwKKwkJCQkJCSAgKCh1aW50NjRfdCliZ2RbaV0uaW5vZGVfaWQgKgorCQkJCQkJCSh1aW50NjRfdClmcy0+Ymxrc3opKSwKIAkJCQkJCSB6ZXJvX2J1ZmZlciwgZnMtPmJsa3N6KTsKIAkJCQkJYmdkW2ldLmJnX2ZsYWdzID0gYmdkW2ldLmJnX2ZsYWdzICYKIAkJCQkJCQl+RVhUNF9CR19JTk9ERV9VTklOSVQ7CkBAIC0xMDI2LDcgKzEwMjcsOCBAQAogCQkJCWJnZFtpXS5mcmVlX2lub2Rlcy0tOwogCQkJCWJnZFtpXS5iZ19pdGFibGVfdW51c2VkLS07CiAJCQkJZnMtPnNiLT5mcmVlX2lub2Rlcy0tOwotCQkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGJnZFtpXS5pbm9kZV9pZCAqCisJCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KQorCQkJCQkJCWJnZFtpXS5pbm9kZV9pZCAqCiAJCQkJCQkJZnMtPnNlY3RfcGVyYmxrLCAwLAogCQkJCQkJCWZzLT5ibGtzeiwKIAkJCQkJCQlqb3VybmFsX2J1ZmZlcik7CkBAIC0xMDQ3LDggKzEwNDksOCBAQAogCQlpYm1hcF9pZHggPSBmcy0+Y3Vycl9pbm9kZV9ubyAvIGlub2Rlc19wZXJfZ3JwOwogCQlpZiAoYmdkW2libWFwX2lkeF0uYmdfZmxhZ3MgJiBFWFQ0X0JHX0lOT0RFX1VOSU5JVCkgewogCQkJbWVtc2V0KHplcm9fYnVmZmVyLCAnXDAnLCBmcy0+Ymxrc3opOwotCQkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKGJnZFtpYm1hcF9pZHhdLmlub2RlX2lkICoKLQkJCQkJICAgICAgZnMtPmJsa3N6KSksIHplcm9fYnVmZmVyLAorCQkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKCh1aW50NjRfdCliZ2RbaWJtYXBfaWR4XS5pbm9kZV9pZCAqCisJCQkJCSAgICAgICh1aW50NjRfdClmcy0+Ymxrc3opKSwgemVyb19idWZmZXIsCiAJCQkJIGZzLT5ibGtzeik7CiAJCQliZ2RbaWJtYXBfaWR4XS5iZ19mbGFncyA9CiAJCQkgICAgYmdkW2libWFwX2lkeF0uYmdfZmxhZ3MgJiB+RVhUNF9CR19JTk9ERV9VTklOSVQ7CkBAIC0xMDY3LDcgKzEwNjksOCBAQAogCQkvKiBqb3VybmFsIGJhY2t1cCAqLwogCQlpZiAocHJldl9pbm9kZV9iaXRtYXBfaW5kZXggIT0gaWJtYXBfaWR4KSB7CiAJCQltZW1zZXQoam91cm5hbF9idWZmZXIsICdcMCcsIGZzLT5ibGtzeik7Ci0JCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZChiZ2RbaWJtYXBfaWR4XS5pbm9kZV9pZAorCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KQorCQkJCQkJYmdkW2libWFwX2lkeF0uaW5vZGVfaWQKIAkJCQkJCSogZnMtPnNlY3RfcGVyYmxrLAogCQkJCQkJMCwgZnMtPmJsa3N6LCBqb3VybmFsX2J1ZmZlcik7CiAJCQlpZiAoc3RhdHVzID09IDApCkBAIC0xMTI5LDcgKzExMzIsNyBAQAogCQkoKm5vX2Jsa3NfcmVxZCkrKzsKIAkJZGVidWcoIlNJUEIgJWxkOiAldVxuIiwgc2lfYmxvY2tubywgKnRvdGFsX3JlbWFpbmluZ19ibG9ja3MpOwogCi0JCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKHNpX2Jsb2Nrbm8gKiBmcy0+c2VjdF9wZXJibGssCisJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClzaV9ibG9ja25vICogZnMtPnNlY3RfcGVyYmxrLAogCQkJCQkwLCBmcy0+Ymxrc3osIChjaGFyICopc2lfYnVmZmVyKTsKIAkJbWVtc2V0KHNpX2J1ZmZlciwgJ1wwJywgZnMtPmJsa3N6KTsKIAkJaWYgKHN0YXR1cyA9PSAwKQpAQCAtMTE1Miw3ICsxMTU1LDcgQEAKIAkJfQogCiAJCS8qIHdyaXRlIHRoZSBibG9jayB0byBkaXNrICovCi0JCXB1dF9leHQ0KCgodWludDY0X3QpIChzaV9ibG9ja25vICogZnMtPmJsa3N6KSksCisJCXB1dF9leHQ0KCgodWludDY0X3QpICgodWludDY0X3Qpc2lfYmxvY2tubyAqICh1aW50NjRfdClmcy0+Ymxrc3opKSwKIAkJCSBzaV9zdGFydF9hZGRyLCBmcy0+Ymxrc3opOwogCQlmaWxlX2lub2RlLT5iLmJsb2Nrcy5pbmRpcl9ibG9jayA9IHNpX2Jsb2Nrbm87CiAJfQpAQCAtMTE5Myw3ICsxMTk2LDcgQEAKIAkJZGVidWcoIkRJUEIgJWxkOiAldVxuIiwgZGlfYmxvY2tub19wYXJlbnQsCiAJCSAgICAgICp0b3RhbF9yZW1haW5pbmdfYmxvY2tzKTsKIAotCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZChkaV9ibG9ja25vX3BhcmVudCAqCisJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClkaV9ibG9ja25vX3BhcmVudCAqCiAJCQkJCWZzLT5zZWN0X3BlcmJsaywgMCwKIAkJCQkJZnMtPmJsa3N6LCAoY2hhciAqKWRpX3BhcmVudF9idWZmZXIpOwogCkBAIC0xMjI0LDcgKzEyMjcsNyBAQAogCQkJZGVidWcoIkRJQ0IgJWxkOiAldVxuIiwgZGlfYmxvY2tub19jaGlsZCwKIAkJCSAgICAgICp0b3RhbF9yZW1haW5pbmdfYmxvY2tzKTsKIAotCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoZGlfYmxvY2tub19jaGlsZCAqCisJCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpZGlfYmxvY2tub19jaGlsZCAqCiAJCQkJCQlmcy0+c2VjdF9wZXJibGssIDAsCiAJCQkJCQlmcy0+Ymxrc3osCiAJCQkJCQkoY2hhciAqKWRpX2NoaWxkX2J1ZmYpOwpAQCAtMTI1MSw3ICsxMjU0LDcgQEAKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCQkvKiB3cml0ZSB0aGUgYmxvY2sgIHRhYmxlICovCi0JCQlwdXRfZXh0NCgoKHVpbnQ2NF90KSAoZGlfYmxvY2tub19jaGlsZCAqIGZzLT5ibGtzeikpLAorCQkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKCh1aW50NjRfdClkaV9ibG9ja25vX2NoaWxkICogKHVpbnQ2NF90KWZzLT5ibGtzeikpLAogCQkJCSBkaV9jaGlsZF9idWZmX3N0YXJ0LCBmcy0+Ymxrc3opOwogCQkJZnJlZShkaV9jaGlsZF9idWZmX3N0YXJ0KTsKIAkJCWRpX2NoaWxkX2J1ZmZfc3RhcnQgPSBOVUxMOwpAQCAtMTI1OSw3ICsxMjYyLDcgQEAKIAkJCWlmICgqdG90YWxfcmVtYWluaW5nX2Jsb2NrcyA9PSAwKQogCQkJCWJyZWFrOwogCQl9Ci0JCXB1dF9leHQ0KCgodWludDY0X3QpIChkaV9ibG9ja25vX3BhcmVudCAqIGZzLT5ibGtzeikpLAorCQlwdXRfZXh0NCgoKHVpbnQ2NF90KSAoKHVpbnQ2NF90KWRpX2Jsb2Nrbm9fcGFyZW50ICogKHVpbnQ2NF90KWZzLT5ibGtzeikpLAogCQkJIGRpX2Jsb2NrX3N0YXJ0X2FkZHIsIGZzLT5ibGtzeik7CiAJCWZpbGVfaW5vZGUtPmIuYmxvY2tzLmRvdWJsZV9pbmRpcl9ibG9jayA9IGRpX2Jsb2Nrbm9fcGFyZW50OwogCX0KQEAgLTEzNTcsOCArMTM2MCw4IEBACiAJCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJLyogd3JpdGUgdGhlIGNoaWxkIGJsb2NrICovCi0JCQkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKHRpX2NoaWxkX2Jsb2Nrbm8gKgotCQkJCQkJICAgICAgZnMtPmJsa3N6KSksCisJCQkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKCh1aW50NjRfdCl0aV9jaGlsZF9ibG9ja25vICoKKwkJCQkJCSAgICAgICh1aW50NjRfdClmcy0+Ymxrc3opKSwKIAkJCQkJIHRpX2NidWZmX3N0YXJ0X2FkZHIsIGZzLT5ibGtzeik7CiAJCQkJZnJlZSh0aV9jYnVmZl9zdGFydF9hZGRyKTsKIApAQCAtMTM2Niw3ICsxMzY5LDcgQEAKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCQkvKiB3cml0ZSB0aGUgcGFyZW50IGJsb2NrICovCi0JCQlwdXRfZXh0NCgoKHVpbnQ2NF90KSAodGlfcGFyZW50X2Jsb2Nrbm8gKiBmcy0+Ymxrc3opKSwKKwkJCXB1dF9leHQ0KCgodWludDY0X3QpICgodWludDY0X3QpdGlfcGFyZW50X2Jsb2Nrbm8gKiAodWludDY0X3QpZnMtPmJsa3N6KSksCiAJCQkJIHRpX3BidWZmX3N0YXJ0X2FkZHIsIGZzLT5ibGtzeik7CiAJCQlmcmVlKHRpX3BidWZmX3N0YXJ0X2FkZHIpOwogCkBAIC0xMzc0LDcgKzEzNzcsNyBAQAogCQkJCWJyZWFrOwogCQl9CiAJCS8qIHdyaXRlIHRoZSBncmFuZCBwYXJlbnQgYmxvY2sgKi8KLQkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKHRpX2dwX2Jsb2Nrbm8gKiBmcy0+Ymxrc3opKSwKKwkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKCh1aW50NjRfdCl0aV9ncF9ibG9ja25vICogKHVpbnQ2NF90KWZzLT5ibGtzeikpLAogCQkJIHRpX2dwX2J1ZmZfc3RhcnRfYWRkciwgZnMtPmJsa3N6KTsKIAkJZmlsZV9pbm9kZS0+Yi5ibG9ja3MudHJpcGxlX2luZGlyX2Jsb2NrID0gdGlfZ3BfYmxvY2tubzsKIAl9CkBAIC0xNDQ3LDcgKzE0NTAsOCBAQAogCQlibG9jayA9IGxlMzJfdG9fY3B1KGluZGV4W2ldLmVpX2xlYWZfaGkpOwogCQlibG9jayA9IChibG9jayA8PCAzMikgKyBsZTMyX3RvX2NwdShpbmRleFtpXS5laV9sZWFmX2xvKTsKIAotCQlpZiAoZXh0NGZzX2RldnJlYWQoYmxvY2sgPDwgbG9nMl9ibGtzeiwgMCwgZnMtPmJsa3N6LCBidWYpKQorCQlpZiAoZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJsb2NrIDw8IGxvZzJfYmxrc3osIDAsIGZzLT5ibGtzeiwKKwkJCQkgICBidWYpKQogCQkJZXh0X2Jsb2NrID0gKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKilidWY7CiAJCWVsc2UKIAkJCXJldHVybiAwOwpAQCAtMTQ2OSw3ICsxNDczLDcgQEAKIAlkZWJ1ZygiZXh0NGZzIHJlYWQgJWQgZ3JvdXAgZGVzY3JpcHRvciAoYmxrbm8gJWxkIGJsa29mZiAldSlcbiIsCiAJICAgICAgZ3JvdXAsIGJsa25vLCBibGtvZmYpOwogCi0JcmV0dXJuIGV4dDRmc19kZXZyZWFkKGJsa25vIDw8IExPRzJfRVhUMl9CTE9DS19TSVpFKGRhdGEpLAorCXJldHVybiBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpYmxrbm8gPDwgTE9HMl9FWFQyX0JMT0NLX1NJWkUoZGF0YSksCiAJCQkgICAgICBibGtvZmYsIHNpemVvZihzdHJ1Y3QgZXh0Ml9ibG9ja19ncm91cCksCiAJCQkgICAgICAoY2hhciAqKWJsa2dycCk7CiB9CkBAIC0xNDk1LDcgKzE0OTksNyBAQAogCSAgICAoaW5vICUgX19sZTMyX3RvX2NwdShzYmxvY2stPmlub2Rlc19wZXJfZ3JvdXApKSAvIGlub2Rlc19wZXJfYmxvY2s7CiAJYmxrb2ZmID0gKGlubyAlIGlub2Rlc19wZXJfYmxvY2spICogZnMtPmlub2Rlc3o7CiAJLyogUmVhZCB0aGUgaW5vZGUuICovCi0Jc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoYmxrbm8gPDwgTE9HMl9FWFQyX0JMT0NLX1NJWkUoZGF0YSksIGJsa29mZiwKKwlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpYmxrbm8gPDwgTE9HMl9FWFQyX0JMT0NLX1NJWkUoZGF0YSksIGJsa29mZiwKIAkJCQlzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGUpLCAoY2hhciAqKWlub2RlKTsKIAlpZiAoc3RhdHVzID09IDApCiAJCXJldHVybiAwOwpAQCAtMTU5Miw3ICsxNTk2LDcgQEAKIAkJaWYgKChfX2xlMzJfdG9fY3B1KGlub2RlLT5iLmJsb2Nrcy5pbmRpcl9ibG9jaykgPDwKIAkJICAgICBsb2cyX2Jsa3N6KSAhPSBleHQ0ZnNfaW5kaXIxX2Jsa25vKSB7CiAJCQlzdGF0dXMgPQotCQkJICAgIGV4dDRmc19kZXZyZWFkKF9fbGUzMl90b19jcHUKKwkJCSAgICBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpX19sZTMyX3RvX2NwdQogCQkJCQkgICAoaW5vZGUtPmIuYmxvY2tzLgogCQkJCQkgICAgaW5kaXJfYmxvY2spIDw8IGxvZzJfYmxrc3osIDAsCiAJCQkJCSAgIGJsa3N6LCAoY2hhciAqKWV4dDRmc19pbmRpcjFfYmxvY2spOwpAQCAtMTY0MSw3ICsxNjQ1LDcgQEAKIAkJaWYgKChfX2xlMzJfdG9fY3B1KGlub2RlLT5iLmJsb2Nrcy5kb3VibGVfaW5kaXJfYmxvY2spIDw8CiAJCSAgICAgbG9nMl9ibGtzeikgIT0gZXh0NGZzX2luZGlyMV9ibGtubykgewogCQkJc3RhdHVzID0KLQkJCSAgICBleHQ0ZnNfZGV2cmVhZChfX2xlMzJfdG9fY3B1CisJCQkgICAgZXh0NGZzX2RldnJlYWQoKGxiYWludF90KV9fbGUzMl90b19jcHUKIAkJCQkJICAgKGlub2RlLT5iLmJsb2Nrcy4KIAkJCQkJICAgIGRvdWJsZV9pbmRpcl9ibG9jaykgPDwgbG9nMl9ibGtzeiwKIAkJCQkJICAgMCwgYmxrc3osCkBAIC0xNjgxLDcgKzE2ODUsNyBAQAogCQl9CiAJCWlmICgoX19sZTMyX3RvX2NwdShleHQ0ZnNfaW5kaXIxX2Jsb2NrW3JibG9jayAvIHBlcmJsb2NrXSkgPDwKIAkJICAgICBsb2cyX2Jsa3N6KSAhPSBleHQ0ZnNfaW5kaXIyX2Jsa25vKSB7Ci0JCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZChfX2xlMzJfdG9fY3B1CisJCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpX19sZTMyX3RvX2NwdQogCQkJCQkJKGV4dDRmc19pbmRpcjFfYmxvY2sKIAkJCQkJCSBbcmJsb2NrIC8KIAkJCQkJCSAgcGVyYmxvY2tdKSA8PCBsb2cyX2Jsa3N6LCAwLApAQCAtMTczMyw3ICsxNzM3LDggQEAKIAkJaWYgKChfX2xlMzJfdG9fY3B1KGlub2RlLT5iLmJsb2Nrcy50cmlwbGVfaW5kaXJfYmxvY2spIDw8CiAJCSAgICAgbG9nMl9ibGtzeikgIT0gZXh0NGZzX2luZGlyMV9ibGtubykgewogCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQKLQkJCSAgICAoX19sZTMyX3RvX2NwdShpbm9kZS0+Yi5ibG9ja3MudHJpcGxlX2luZGlyX2Jsb2NrKQorCQkJICAgICgobGJhaW50X3QpCisJCQkgICAgIF9fbGUzMl90b19jcHUoaW5vZGUtPmIuYmxvY2tzLnRyaXBsZV9pbmRpcl9ibG9jaykKIAkJCSAgICAgPDwgbG9nMl9ibGtzeiwgMCwgYmxrc3osCiAJCQkgICAgIChjaGFyICopZXh0NGZzX2luZGlyMV9ibG9jayk7CiAJCQlpZiAoc3RhdHVzID09IDApIHsKQEAgLTE3NzMsNyArMTc3OCw3IEBACiAJCQkJCQkgICAgICAgcGVyYmxvY2tfcGFyZW50XSkgPDwKIAkJICAgICBsb2cyX2Jsa3N6KQogCQkgICAgIT0gZXh0NGZzX2luZGlyMl9ibGtubykgewotCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoX19sZTMyX3RvX2NwdQorCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KV9fbGUzMl90b19jcHUKIAkJCQkJCShleHQ0ZnNfaW5kaXIxX2Jsb2NrCiAJCQkJCQkgW3JibG9jayAvCiAJCQkJCQkgIHBlcmJsb2NrX3BhcmVudF0pIDw8CkBAIC0xODE4LDcgKzE4MjMsNyBAQAogCQkJCQkJICAgICAgIHBlcmJsb2NrX2NoaWxkXSkgPDwKIAkJICAgICBsb2cyX2Jsa3N6KSAhPSBleHQ0ZnNfaW5kaXIzX2Jsa25vKSB7CiAJCQlzdGF0dXMgPQotCQkJICAgIGV4dDRmc19kZXZyZWFkKF9fbGUzMl90b19jcHUKKwkJCSAgICBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpX19sZTMyX3RvX2NwdQogCQkJCQkgICAoZXh0NGZzX2luZGlyMl9ibG9jawogCQkJCQkgICAgWyhyYmxvY2sgLyBwZXJibG9ja19jaGlsZCkKIAkJCQkJICAgICAlIChibGtzeiAvIDQpXSkgPDwgbG9nMl9ibGtzeiwgMCwKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9qb3VybmFsLmMgYi9mcy9leHQ0L2V4dDRfam91cm5hbC5jCmluZGV4IDlmMDE3MDguLmJhZmQ3OTMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9qb3VybmFsLmMKKysrIGIvZnMvZXh0NC9leHQ0X2pvdXJuYWwuYwpAQCAtMzYwLDcgKzM2MCw4IEBACiAJCQkgIChzdHJ1Y3QgZXh0Ml9pbm9kZSAqKSZpbm9kZV9qb3VybmFsKTsKIAlibGtuciA9IHJlYWRfYWxsb2NhdGVkX2Jsb2NrKChzdHJ1Y3QgZXh0Ml9pbm9kZSAqKQogCQkJCSAgICAgJmlub2RlX2pvdXJuYWwsIGkpOwotCWV4dDRmc19kZXZyZWFkKGJsa25yICogZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osIHRlbXBfYnVmZik7CisJZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJsa25yICogZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osCisJCSAgICAgICB0ZW1wX2J1ZmYpOwogCXBfamRiID0gKGNoYXIgKil0ZW1wX2J1ZmY7CiAJamRiID0gKHN0cnVjdCBqb3VybmFsX2hlYWRlcl90ICopIHRlbXBfYnVmZjsKIAlvZnMgPSBzaXplb2Yoc3RydWN0IGpvdXJuYWxfaGVhZGVyX3QpOwpAQCAtMzg0LDkgKzM4NSw5IEBACiAJCQkJY29udGludWU7CiAJCX0KIAkJYmxrbnIgPSByZWFkX2FsbG9jYXRlZF9ibG9jaygmaW5vZGVfam91cm5hbCwgaSk7Ci0JCWV4dDRmc19kZXZyZWFkKGJsa25yICogZnMtPnNlY3RfcGVyYmxrLCAwLAorCQlleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpYmxrbnIgKiBmcy0+c2VjdF9wZXJibGssIDAsCiAJCQkgICAgICAgZnMtPmJsa3N6LCBtZXRhZGF0YV9idWZmKTsKLQkJcHV0X2V4dDQoKHVpbnQ2NF90KShiZTMyX3RvX2NwdSh0YWctPmJsb2NrKSAqIGZzLT5ibGtzeiksCisJCXB1dF9leHQ0KCh1aW50NjRfdCkoKHVpbnQ2NF90KWJlMzJfdG9fY3B1KHRhZy0+YmxvY2spICogKHVpbnQ2NF90KWZzLT5ibGtzeiksCiAJCQkgbWV0YWRhdGFfYnVmZiwgKHVpbnQzMl90KSBmcy0+Ymxrc3opOwogCX0gd2hpbGUgKCEoZmxhZ3MgJiBFWFQzX0pPVVJOQUxfRkxBR19MQVNUX1RBRykpOwogZmFpbDoKQEAgLTQzMSw3ICs0MzIsOCBAQAogCiAJZXh0NGZzX3JlYWRfaW5vZGUoZXh0NGZzX3Jvb3QsIEVYVDJfSk9VUk5BTF9JTk8sICZpbm9kZV9qb3VybmFsKTsKIAlibGtuciA9IHJlYWRfYWxsb2NhdGVkX2Jsb2NrKCZpbm9kZV9qb3VybmFsLCBFWFQyX0pPVVJOQUxfU1VQRVJCTE9DSyk7Ci0JZXh0NGZzX2RldnJlYWQoYmxrbnIgKiBmcy0+c2VjdF9wZXJibGssIDAsIGZzLT5ibGtzeiwgdGVtcF9idWZmKTsKKwlleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpYmxrbnIgKiBmcy0+c2VjdF9wZXJibGssIDAsIGZzLT5ibGtzeiwKKwkJICAgICAgIHRlbXBfYnVmZik7CiAJanNiID0gKHN0cnVjdCBqb3VybmFsX3N1cGVyYmxvY2tfdCAqKSB0ZW1wX2J1ZmY7CiAKIAlpZiAoZnMtPnNiLT5mZWF0dXJlX2luY29tcGF0ICYgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpIHsKQEAgLTQ1NSw3ICs0NTcsNyBAQAogCXdoaWxlICgxKSB7CiAJCWJsa25yID0gcmVhZF9hbGxvY2F0ZWRfYmxvY2soJmlub2RlX2pvdXJuYWwsIGkpOwogCQltZW1zZXQodGVtcF9idWZmMSwgJ1wwJywgZnMtPmJsa3N6KTsKLQkJZXh0NGZzX2RldnJlYWQoYmxrbnIgKiBmcy0+c2VjdF9wZXJibGssCisJCWV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClibGtuciAqIGZzLT5zZWN0X3BlcmJsaywKIAkJCSAgICAgICAwLCBmcy0+Ymxrc3osIHRlbXBfYnVmZjEpOwogCQlqZGIgPSAoc3RydWN0IGpvdXJuYWxfaGVhZGVyX3QgKikgdGVtcF9idWZmMTsKIApAQCAtNTQ3LDcgKzU0OSw3IEBACiAKIAkJYmxrbnIgPSByZWFkX2FsbG9jYXRlZF9ibG9jaygmaW5vZGVfam91cm5hbCwKIAkJCQkJIEVYVDJfSk9VUk5BTF9TVVBFUkJMT0NLKTsKLQkJcHV0X2V4dDQoKHVpbnQ2NF90KSAoYmxrbnIgKiBmcy0+Ymxrc3opLAorCQlwdXRfZXh0NCgodWludDY0X3QpICgodWludDY0X3QpYmxrbnIgKiAodWludDY0X3QpZnMtPmJsa3N6KSwKIAkJCSAoc3RydWN0IGpvdXJuYWxfc3VwZXJibG9ja190ICopdGVtcF9idWZmLAogCQkJICh1aW50MzJfdCkgZnMtPmJsa3N6KTsKIAkJZXh0NGZzX2ZyZWVfcmV2b2tlX2Jsa3MoKTsKQEAgLTU3Niw3ICs1NzgsOCBAQAogCWV4dDRmc19yZWFkX2lub2RlKGV4dDRmc19yb290LCBFWFQyX0pPVVJOQUxfSU5PLCAmaW5vZGVfam91cm5hbCk7CiAJanNiX2Jsa25yID0gcmVhZF9hbGxvY2F0ZWRfYmxvY2soJmlub2RlX2pvdXJuYWwsCiAJCQkJCSBFWFQyX0pPVVJOQUxfU1VQRVJCTE9DSyk7Ci0JZXh0NGZzX2RldnJlYWQoanNiX2Jsa25yICogZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osIHRlbXBfYnVmZik7CisJZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWpzYl9ibGtuciAqIGZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LAorCQkgICAgICAgdGVtcF9idWZmKTsKIAlqc2IgPSAoc3RydWN0IGpvdXJuYWxfc3VwZXJibG9ja190ICopIHRlbXBfYnVmZjsKIAogCWpkYi5oX2Jsb2NrdHlwZSA9IGNwdV90b19iZTMyKEVYVDNfSk9VUk5BTF9ERVNDUklQVE9SX0JMT0NLKTsKQEAgLTYwNSw3ICs2MDgsNyBAQAogCXRhZy5mbGFncyA9IGNwdV90b19iZTMyKEVYVDNfSk9VUk5BTF9GTEFHX0xBU1RfVEFHKTsKIAltZW1jcHkodGVtcCAtIHNpemVvZihzdHJ1Y3QgZXh0M19qb3VybmFsX2Jsb2NrX3RhZyksICZ0YWcsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgZXh0M19qb3VybmFsX2Jsb2NrX3RhZykpOwotCXB1dF9leHQ0KCh1aW50NjRfdCkgKGJsa25yICogZnMtPmJsa3N6KSwgYnVmLCAodWludDMyX3QpIGZzLT5ibGtzeik7CisJcHV0X2V4dDQoKHVpbnQ2NF90KSAoKHVpbnQ2NF90KWJsa25yICogKHVpbnQ2NF90KWZzLT5ibGtzeiksIGJ1ZiwgKHVpbnQzMl90KSBmcy0+Ymxrc3opOwogCiAJZnJlZSh0ZW1wX2J1ZmYpOwogCWZyZWUoYnVmKTsKQEAgLTYyMywxMCArNjI2LDEyIEBACiAJaWYgKCF0ZW1wX2J1ZmYpCiAJCXJldHVybjsKIAotCWV4dDRmc19yZWFkX2lub2RlKGV4dDRmc19yb290LCBFWFQyX0pPVVJOQUxfSU5PLCAmaW5vZGVfam91cm5hbCk7CisJZXh0NGZzX3JlYWRfaW5vZGUoZXh0NGZzX3Jvb3QsIEVYVDJfSk9VUk5BTF9JTk8sCisJCQkgICZpbm9kZV9qb3VybmFsKTsKIAlqc2JfYmxrbnIgPSByZWFkX2FsbG9jYXRlZF9ibG9jaygmaW5vZGVfam91cm5hbCwKIAkJCQkJIEVYVDJfSk9VUk5BTF9TVVBFUkJMT0NLKTsKLQlleHQ0ZnNfZGV2cmVhZChqc2JfYmxrbnIgKiBmcy0+c2VjdF9wZXJibGssIDAsIGZzLT5ibGtzeiwgdGVtcF9idWZmKTsKKwlleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpanNiX2Jsa25yICogZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osCisJCSAgICAgICB0ZW1wX2J1ZmYpOwogCWpzYiA9IChzdHJ1Y3Qgam91cm5hbF9zdXBlcmJsb2NrX3QgKikgdGVtcF9idWZmOwogCiAJamRiLmhfYmxvY2t0eXBlID0gY3B1X3RvX2JlMzIoRVhUM19KT1VSTkFMX0NPTU1JVF9CTE9DSyk7CkBAIC02MzgsNyArNjQzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAltZW1jcHkoYnVmLCAmamRiLCBzaXplb2Yoc3RydWN0IGpvdXJuYWxfaGVhZGVyX3QpKTsKLQlwdXRfZXh0NCgodWludDY0X3QpIChibGtuciAqIGZzLT5ibGtzeiksIGJ1ZiwgKHVpbnQzMl90KSBmcy0+Ymxrc3opOworCXB1dF9leHQ0KCh1aW50NjRfdCkgKCh1aW50NjRfdClibGtuciAqICh1aW50NjRfdClmcy0+Ymxrc3opLCBidWYsICh1aW50MzJfdCkgZnMtPmJsa3N6KTsKIAogCWZyZWUodGVtcF9idWZmKTsKIAlmcmVlKGJ1Zik7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRmcy5jIGIvZnMvZXh0NC9leHQ0ZnMuYwppbmRleCBiMmY4NGIxLi4yZDc5Zjc2IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRmcy5jCisrKyBiL2ZzL2V4dDQvZXh0NGZzLmMKQEAgLTY2LDE1ICs2NiwxNSBAQAogCQl1bnNpZ25lZCBpbnQgbGVuLCBjaGFyICpidWYpCiB7CiAJaW50IGk7Ci0JaW50IGJsb2NrY250OworCWxiYWludF90IGJsb2NrY250OwogCWludCBsb2cyYmxvY2tzaXplID0gTE9HMl9FWFQyX0JMT0NLX1NJWkUobm9kZS0+ZGF0YSk7CiAJaW50IGJsb2Nrc2l6ZSA9IDEgPDwgKGxvZzJibG9ja3NpemUgKyBESVNLX1NFQ1RPUl9CSVRTKTsKIAl1bnNpZ25lZCBpbnQgZmlsZXNpemUgPSBfX2xlMzJfdG9fY3B1KG5vZGUtPmlub2RlLnNpemUpOwotCWludCBwcmV2aW91c19ibG9ja19udW1iZXIgPSAtMTsKLQlpbnQgZGVsYXllZF9zdGFydCA9IDA7Ci0JaW50IGRlbGF5ZWRfZXh0ZW50ID0gMDsKLQlpbnQgZGVsYXllZF9za2lwZmlyc3QgPSAwOwotCWludCBkZWxheWVkX25leHQgPSAwOworCWxiYWludF90IHByZXZpb3VzX2Jsb2NrX251bWJlciA9IC0xOworCWxiYWludF90IGRlbGF5ZWRfc3RhcnQgPSAwOworCWxiYWludF90IGRlbGF5ZWRfZXh0ZW50ID0gMDsKKwlsYmFpbnRfdCBkZWxheWVkX3NraXBmaXJzdCA9IDA7CisJbGJhaW50X3QgZGVsYXllZF9uZXh0ID0gMDsKIAljaGFyICpkZWxheWVkX2J1ZiA9IE5VTEw7CiAJc2hvcnQgc3RhdHVzOwogCkBAIC04NSw3ICs4NSw3IEBACiAJYmxvY2tjbnQgPSAoKGxlbiArIHBvcykgKyBibG9ja3NpemUgLSAxKSAvIGJsb2Nrc2l6ZTsKIAogCWZvciAoaSA9IHBvcyAvIGJsb2Nrc2l6ZTsgaSA8IGJsb2NrY250OyBpKyspIHsKLQkJaW50IGJsa25yOworCQlsYmFpbnRfdCBibGtucjsKIAkJaW50IGJsb2Nrb2ZmID0gcG9zICUgYmxvY2tzaXplOwogCQlpbnQgYmxvY2tlbmQgPSBibG9ja3NpemU7CiAJCWludCBza2lwZmlyc3QgPSAwOwpAQCAtMjExLDE4ICsyMTEsMTggQEAKIAkvKiB1cGRhdGUgYmxvY2sgZ3JvdXBzICovCiAJZm9yIChpID0gMDsgaSA8IGZzLT5ub19ibGtncnA7IGkrKykgewogCQlmcy0+YmdkW2ldLmJnX2NoZWNrc3VtID0gZXh0NGZzX2NoZWNrc3VtX3VwZGF0ZShpKTsKLQkJcHV0X2V4dDQoKHVpbnQ2NF90KShmcy0+YmdkW2ldLmJsb2NrX2lkICogZnMtPmJsa3N6KSwKKwkJcHV0X2V4dDQoKHVpbnQ2NF90KSgodWludDY0X3QpZnMtPmJnZFtpXS5ibG9ja19pZCAqICh1aW50NjRfdClmcy0+Ymxrc3opLAogCQkJIGZzLT5ibGtfYm1hcHNbaV0sIGZzLT5ibGtzeik7CiAJfQogCiAJLyogdXBkYXRlIGlub2RlIHRhYmxlIGdyb3VwcyAqLwogCWZvciAoaSA9IDA7IGkgPCBmcy0+bm9fYmxrZ3JwOyBpKyspIHsKLQkJcHV0X2V4dDQoKHVpbnQ2NF90KSAoZnMtPmJnZFtpXS5pbm9kZV9pZCAqIGZzLT5ibGtzeiksCisJCXB1dF9leHQ0KCh1aW50NjRfdCkgKCh1aW50NjRfdClmcy0+YmdkW2ldLmlub2RlX2lkICogKHVpbnQ2NF90KWZzLT5ibGtzeiksCiAJCQkgZnMtPmlub2RlX2JtYXBzW2ldLCBmcy0+Ymxrc3opOwogCX0KIAogCS8qIHVwZGF0ZSB0aGUgYmxvY2sgZ3JvdXAgZGVzY3JpcHRvciB0YWJsZSAqLwotCXB1dF9leHQ0KCh1aW50NjRfdCkoZnMtPmdkdGFibGVfYmxrbm8gKiBmcy0+Ymxrc3opLAorCXB1dF9leHQ0KCh1aW50NjRfdCkoKHVpbnQ2NF90KWZzLT5nZHRhYmxlX2Jsa25vICogKHVpbnQ2NF90KWZzLT5ibGtzeiksCiAJCSAoc3RydWN0IGV4dDJfYmxvY2tfZ3JvdXAgKilmcy0+Z2R0YWJsZSwKIAkJIChmcy0+Ymxrc3ogKiBmcy0+bm9fYmxrX3BlcmdkdCkpOwogCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAlpZiAoIWZzLT5nZHRhYmxlKQogCQlyZXR1cm4gLUVOT01FTTsKIAkvKiByZWFkIHRoZSBncm91cCBkZXNjcmlwdG9yIHRhYmxlICovCi0Jc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoZnMtPmdkdGFibGVfYmxrbm8gKiBmcy0+c2VjdF9wZXJibGssIDAsCisJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWZzLT5nZHRhYmxlX2Jsa25vICogZnMtPnNlY3RfcGVyYmxrLCAwLAogCQkJCWZzLT5ibGtzeiAqIGZzLT5ub19ibGtfcGVyZ2R0LCBmcy0+Z2R0YWJsZSk7CiAJaWYgKHN0YXR1cyA9PSAwKQogCQlnb3RvIGZhaWw7CkBAIC0zMDEsNyArMzAxLDcgQEAKIAkJLyogam91cm5hbCBiYWNrdXAgKi8KIAkJaWYgKHByZXZfYmdfYm1hcF9pZHggIT0gYmdfaWR4KSB7CiAJCQlzdGF0dXMgPQotCQkJICAgIGV4dDRmc19kZXZyZWFkKGJnZFtiZ19pZHhdLmJsb2NrX2lkICoKKwkJCSAgICBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpYmdkW2JnX2lkeF0uYmxvY2tfaWQgKgogCQkJCQkgICBmcy0+c2VjdF9wZXJibGssIDAsIGZzLT5ibGtzeiwKIAkJCQkJICAgam91cm5hbF9idWZmZXIpOwogCQkJaWYgKHN0YXR1cyA9PSAwKQpAQCAtMzQ1LDcgKzM0NSw3IEBACiAJCX0KIAkJRElCX3N0YXJ0X2FkZHIgPSAodW5zaWduZWQgaW50ICopZGlfYnVmZmVyOwogCQlibGtuciA9IGlub2RlLT5iLmJsb2Nrcy5kb3VibGVfaW5kaXJfYmxvY2s7Ci0JCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGJsa25yICogZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osCisJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClibGtuciAqIGZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LAogCQkJCQkoY2hhciAqKWRpX2J1ZmZlcik7CiAJCWZvciAoaSA9IDA7IGkgPCBmcy0+Ymxrc3ogLyBzaXplb2YoaW50KTsgaSsrKSB7CiAJCQlpZiAoKmRpX2J1ZmZlciA9PSAwKQpAQCAtMzY3LDcgKzM2Nyw3IEBACiAJCQlmcy0+c2ItPmZyZWVfYmxvY2tzKys7CiAJCQkvKiBqb3VybmFsIGJhY2t1cCAqLwogCQkJaWYgKHByZXZfYmdfYm1hcF9pZHggIT0gYmdfaWR4KSB7Ci0JCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoYmdkW2JnX2lkeF0uYmxvY2tfaWQKKwkJCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpYmdkW2JnX2lkeF0uYmxvY2tfaWQKIAkJCQkJCQkqIGZzLT5zZWN0X3BlcmJsaywgMCwKIAkJCQkJCQlmcy0+Ymxrc3osCiAJCQkJCQkJam91cm5hbF9idWZmZXIpOwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJCS8qIGpvdXJuYWwgYmFja3VwICovCiAJCWlmIChwcmV2X2JnX2JtYXBfaWR4ICE9IGJnX2lkeCkgewogCQkJbWVtc2V0KGpvdXJuYWxfYnVmZmVyLCAnXDAnLCBmcy0+Ymxrc3opOwotCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoYmdkW2JnX2lkeF0uYmxvY2tfaWQgKgorCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJnZFtiZ19pZHhdLmJsb2NrX2lkICoKIAkJCQkJCWZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LAogCQkJCQkJam91cm5hbF9idWZmZXIpOwogCQkJaWYgKHN0YXR1cyA9PSAwKQpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAJCX0KIAkJdGliX3N0YXJ0X2FkZHIgPSAodW5zaWduZWQgaW50ICopdGlncF9idWZmZXI7CiAJCWJsa25yID0gaW5vZGUtPmIuYmxvY2tzLnRyaXBsZV9pbmRpcl9ibG9jazsKLQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoYmxrbnIgKiBmcy0+c2VjdF9wZXJibGssIDAsIGZzLT5ibGtzeiwKKwkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJsa25yICogZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osCiAJCQkJCShjaGFyICopdGlncF9idWZmZXIpOwogCQlmb3IgKGkgPSAwOyBpIDwgZnMtPmJsa3N6IC8gc2l6ZW9mKGludCk7IGkrKykgewogCQkJaWYgKCp0aWdwX2J1ZmZlciA9PSAwKQpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAJCQlpZiAoIXRpcF9idWZmZXIpCiAJCQkJZ290byBmYWlsOwogCQkJdGlwYl9zdGFydF9hZGRyID0gKHVuc2lnbmVkIGludCAqKXRpcF9idWZmZXI7Ci0JCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZCgoKnRpZ3BfYnVmZmVyKSAqCisJCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpKCp0aWdwX2J1ZmZlcikgKgogCQkJCQkJZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osCiAJCQkJCQkoY2hhciAqKXRpcF9idWZmZXIpOwogCQkJZm9yIChqID0gMDsgaiA8IGZzLT5ibGtzeiAvIHNpemVvZihpbnQpOyBqKyspIHsKQEAgLTQ4NCw2ICs0ODQsNyBAQAogCQkJCWlmIChwcmV2X2JnX2JtYXBfaWR4ICE9IGJnX2lkeCkgewogCQkJCQlzdGF0dXMgPQogCQkJCQkgICAgZXh0NGZzX2RldnJlYWQoCisJCQkJCQkJKGxiYWludF90KQogCQkJCQkJCWJnZFtiZ19pZHhdLmJsb2NrX2lkICoKIAkJCQkJCQlmcy0+c2VjdF9wZXJibGssIDAsCiAJCQkJCQkJZnMtPmJsa3N6LApAQCAtNTI0LDcgKzUyNSw3IEBACiAJCQlpZiAocHJldl9iZ19ibWFwX2lkeCAhPSBiZ19pZHgpIHsKIAkJCQltZW1zZXQoam91cm5hbF9idWZmZXIsICdcMCcsIGZzLT5ibGtzeik7CiAJCQkJc3RhdHVzID0KLQkJCQkgICAgZXh0NGZzX2RldnJlYWQoYmdkW2JnX2lkeF0uYmxvY2tfaWQgKgorCQkJCSAgICBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpYmdkW2JnX2lkeF0uYmxvY2tfaWQgKgogCQkJCQkJICAgZnMtPnNlY3RfcGVyYmxrLCAwLAogCQkJCQkJICAgZnMtPmJsa3N6LCBqb3VybmFsX2J1ZmZlcik7CiAJCQkJaWYgKHN0YXR1cyA9PSAwKQpAQCAtNTUzLDcgKzU1NCw3IEBACiAJCS8qIGpvdXJuYWwgYmFja3VwICovCiAJCWlmIChwcmV2X2JnX2JtYXBfaWR4ICE9IGJnX2lkeCkgewogCQkJbWVtc2V0KGpvdXJuYWxfYnVmZmVyLCAnXDAnLCBmcy0+Ymxrc3opOwotCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoYmdkW2JnX2lkeF0uYmxvY2tfaWQgKgorCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJnZFtiZ19pZHhdLmJsb2NrX2lkICoKIAkJCQkJCWZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LAogCQkJCQkJam91cm5hbF9idWZmZXIpOwogCQkJaWYgKHN0YXR1cyA9PSAwKQpAQCAtNjM5LDcgKzY0MCw3IEBACiAJCQkvKiBqb3VybmFsIGJhY2t1cCAqLwogCQkJaWYgKHByZXZfYmdfYm1hcF9pZHggIT0gYmdfaWR4KSB7CiAJCQkJc3RhdHVzID0KLQkJCQkgICAgZXh0NGZzX2RldnJlYWQoYmdkW2JnX2lkeF0uYmxvY2tfaWQgKgorCQkJCSAgICBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpYmdkW2JnX2lkeF0uYmxvY2tfaWQgKgogCQkJCQkJICAgZnMtPnNlY3RfcGVyYmxrLCAwLAogCQkJCQkJICAgZnMtPmJsa3N6LCBqb3VybmFsX2J1ZmZlcik7CiAJCQkJaWYgKHN0YXR1cyA9PSAwKQpAQCAtNjgzLDcgKzY4NCw3IEBACiAJCQkvKiBqb3VybmFsIGJhY2t1cCAqLwogCQkJaWYgKHByZXZfYmdfYm1hcF9pZHggIT0gYmdfaWR4KSB7CiAJCQkJbWVtc2V0KGpvdXJuYWxfYnVmZmVyLCAnXDAnLCBmcy0+Ymxrc3opOwotCQkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGJnZFtiZ19pZHhdLmJsb2NrX2lkCisJCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJnZFtiZ19pZHhdLmJsb2NrX2lkCiAJCQkJCQkJKiBmcy0+c2VjdF9wZXJibGssCiAJCQkJCQkJMCwgZnMtPmJsa3N6LAogCQkJCQkJCWpvdXJuYWxfYnVmZmVyKTsKQEAgLTcxNCw3ICs3MTUsNyBAQAogCWlmICghcmVhZF9idWZmZXIpCiAJCWdvdG8gZmFpbDsKIAlzdGFydF9ibG9ja19hZGRyZXNzID0gcmVhZF9idWZmZXI7Ci0Jc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoYmxrbm8gKiBmcy0+c2VjdF9wZXJibGssCisJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJsa25vICogZnMtPnNlY3RfcGVyYmxrLAogCQkJCTAsIGZzLT5ibGtzeiwgcmVhZF9idWZmZXIpOwogCWlmIChzdGF0dXMgPT0gMCkKIAkJZ290byBmYWlsOwpAQCAtNzM3LDcgKzczOCw3IEBACiAJZnMtPnNiLT5mcmVlX2lub2RlcysrOwogCS8qIGpvdXJuYWwgYmFja3VwICovCiAJbWVtc2V0KGpvdXJuYWxfYnVmZmVyLCAnXDAnLCBmcy0+Ymxrc3opOwotCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGJnZFtpYm1hcF9pZHhdLmlub2RlX2lkICoKKwlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpYmdkW2libWFwX2lkeF0uaW5vZGVfaWQgKgogCQkJCWZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LCBqb3VybmFsX2J1ZmZlcik7CiAJaWYgKHN0YXR1cyA9PSAwKQogCQlnb3RvIGZhaWw7CkBAIC04MTMsNyArODE0LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBmcy0+bm9fYmxrZ3JwOyBpKyspIHsKIAkJc3RhdHVzID0KLQkJICAgIGV4dDRmc19kZXZyZWFkKGZzLT5iZ2RbaV0uYmxvY2tfaWQgKiBmcy0+c2VjdF9wZXJibGssIDAsCisJCSAgICBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpZnMtPmJnZFtpXS5ibG9ja19pZCAqIGZzLT5zZWN0X3BlcmJsaywgMCwKIAkJCQkgICBmcy0+Ymxrc3osIChjaGFyICopZnMtPmJsa19ibWFwc1tpXSk7CiAJCWlmIChzdGF0dXMgPT0gMCkKIAkJCWdvdG8gZmFpbDsKQEAgLTgzMCw3ICs4MzEsNyBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBmcy0+bm9fYmxrZ3JwOyBpKyspIHsKLQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoZnMtPmJnZFtpXS5pbm9kZV9pZCAqIGZzLT5zZWN0X3BlcmJsaywKKwkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWZzLT5iZ2RbaV0uaW5vZGVfaWQgKiBmcy0+c2VjdF9wZXJibGssCiAJCQkJCTAsIGZzLT5ibGtzeiwKIAkJCQkJKGNoYXIgKilmcy0+aW5vZGVfYm1hcHNbaV0pOwogCQlpZiAoc3RhdHVzID09IDApCkBAIC04NzAsMTEgKzg3MSwxMSBAQAogCQkJCSAgJmlub2RlX2pvdXJuYWwpOwogCQlibGtuciA9IHJlYWRfYWxsb2NhdGVkX2Jsb2NrKCZpbm9kZV9qb3VybmFsLAogCQkJCQlFWFQyX0pPVVJOQUxfU1VQRVJCTE9DSyk7Ci0JCWV4dDRmc19kZXZyZWFkKGJsa25yICogZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osCisJCWV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClibGtuciAqIGZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LAogCQkJICAgICAgIHRlbXBfYnVmZik7CiAJCWpzYiA9IChzdHJ1Y3Qgam91cm5hbF9zdXBlcmJsb2NrX3QgKil0ZW1wX2J1ZmY7CiAJCWpzYi0+c19zdGFydCA9IGNwdV90b19iZTMyKDApOwotCQlwdXRfZXh0NCgodWludDY0X3QpIChibGtuciAqIGZzLT5ibGtzeiksCisJCXB1dF9leHQ0KCh1aW50NjRfdCkgKCh1aW50NjRfdClibGtuciAqICh1aW50NjRfdClmcy0+Ymxrc3opLAogCQkJIChzdHJ1Y3Qgam91cm5hbF9zdXBlcmJsb2NrX3QgKil0ZW1wX2J1ZmYsIGZzLT5ibGtzeik7CiAJCWZyZWUodGVtcF9idWZmKTsKIAl9CkBAIC05NTYsOCArOTU3LDggQEAKIAkJCQkJZGVsYXllZF9leHRlbnQgKz0gYmxvY2tlbmQ7CiAJCQkJCWRlbGF5ZWRfbmV4dCArPSBibG9ja2VuZCA+PiBTRUNUT1JfQklUUzsKIAkJCQl9IGVsc2UgewkvKiBzcGlsbCAqLwotCQkJCQlwdXRfZXh0NCgodWludDY0X3QpIChkZWxheWVkX3N0YXJ0ICoKLQkJCQkJCQkgICAgIFNFQ1RPUl9TSVpFKSwKKwkJCQkJcHV0X2V4dDQoKHVpbnQ2NF90KSBkZWxheWVkX3N0YXJ0ICoKKwkJCQkJCQkgICAgIFNFQ1RPUl9TSVpFLAogCQkJCQkJIGRlbGF5ZWRfYnVmLAogCQkJCQkJICh1aW50MzJfdCkgZGVsYXllZF9leHRlbnQpOwogCQkJCQlwcmV2aW91c19ibG9ja19udW1iZXIgPSBibGtucjsKQEAgLTk3OCw4ICs5NzksOCBAQAogCQl9IGVsc2UgewogCQkJaWYgKHByZXZpb3VzX2Jsb2NrX251bWJlciAhPSAtMSkgewogCQkJCS8qIHNwaWxsICovCi0JCQkJcHV0X2V4dDQoKHVpbnQ2NF90KSAoZGVsYXllZF9zdGFydCAqCi0JCQkJCQkgICAgIFNFQ1RPUl9TSVpFKSwgZGVsYXllZF9idWYsCisJCQkJcHV0X2V4dDQoKHVpbnQ2NF90KSBkZWxheWVkX3N0YXJ0ICoKKwkJCQkJCSAgICAgU0VDVE9SX1NJWkUsIGRlbGF5ZWRfYnVmLAogCQkJCQkgKHVpbnQzMl90KSBkZWxheWVkX2V4dGVudCk7CiAJCQkJcHJldmlvdXNfYmxvY2tfbnVtYmVyID0gLTE7CiAJCQl9CkBAIC05ODksNyArOTkwLDcgQEAKIAl9CiAJaWYgKHByZXZpb3VzX2Jsb2NrX251bWJlciAhPSAtMSkgewogCQkvKiBzcGlsbCAqLwotCQlwdXRfZXh0NCgodWludDY0X3QpIChkZWxheWVkX3N0YXJ0ICogU0VDVE9SX1NJWkUpLAorCQlwdXRfZXh0NCgodWludDY0X3QpIGRlbGF5ZWRfc3RhcnQgKiBTRUNUT1JfU0laRSwKIAkJCSBkZWxheWVkX2J1ZiwgKHVpbnQzMl90KSBkZWxheWVkX2V4dGVudCk7CiAJCXByZXZpb3VzX2Jsb2NrX251bWJlciA9IC0xOwogCX0KQEAgLTEwOTEsNyArMTA5Miw3IEBACiAJCQkoaW5vZGVubyAlIF9fbGUzMl90b19jcHUoc2Jsb2NrLT5pbm9kZXNfcGVyX2dyb3VwKSkgLwogCQkJaW5vZGVzX3Blcl9ibG9jazsKIAlibGtvZmYgPSAoaW5vZGVubyAlIGlub2Rlc19wZXJfYmxvY2spICogZnMtPmlub2Rlc3o7Ci0JZXh0NGZzX2RldnJlYWQoaXRhYmxlX2Jsa25vICogZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osIHRlbXBfcHRyKTsKKwlleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpaXRhYmxlX2Jsa25vICogZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osIHRlbXBfcHRyKTsKIAlpZiAoZXh0NGZzX2xvZ19qb3VybmFsKHRlbXBfcHRyLCBpdGFibGVfYmxrbm8pKQogCQlnb3RvIGZhaWw7CiAKQEAgLTExMTEsNyArMTExMiw3IEBACiAJYmxrb2ZmID0gKHBhcmVudF9pbm9kZW5vICUgaW5vZGVzX3Blcl9ibG9jaykgKiBmcy0+aW5vZGVzejsKIAlpZiAocGFyZW50X2l0YWJsZV9ibGtubyAhPSBpdGFibGVfYmxrbm8pIHsKIAkJbWVtc2V0KHRlbXBfcHRyLCAnXDAnLCBmcy0+Ymxrc3opOwotCQlleHQ0ZnNfZGV2cmVhZChwYXJlbnRfaXRhYmxlX2Jsa25vICogZnMtPnNlY3RfcGVyYmxrLAorCQlleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpcGFyZW50X2l0YWJsZV9ibGtubyAqIGZzLT5zZWN0X3BlcmJsaywKIAkJCSAgICAgICAwLCBmcy0+Ymxrc3osIHRlbXBfcHRyKTsKIAkJaWYgKGV4dDRmc19sb2dfam91cm5hbCh0ZW1wX3B0ciwgcGFyZW50X2l0YWJsZV9ibGtubykpCiAJCQlnb3RvIGZhaWw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYXJtYWRhXzM3NS5oIGIvaW5jbHVkZS9jb25maWdzL2FybWFkYV8zNzUuaAppbmRleCAwYzQ1ZTNjLi40NDZjYmVjIDEwMDc1NQotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYXJtYWRhXzM3NS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9hcm1hZGFfMzc1LmgKQEAgLTI2NSwyMCArMjY1LDI2IEBACiAjZGVmaW5lIENPTkZJR19TRl9ERUZBVUxUX0JVUwkJQ09ORklHX0VOVl9TUElfQlVTCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoTVZfU0VDXzY0SykKKyNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkVfU1BJCTB4MTAwMDAKKyNlbGlmIGRlZmluZWQoTVZfU0VDXzEyOEspCisjZGVmaW5lIENPTkZJR19FTlZfU0VDVF9TSVpFX1NQSQkweDIwMDAwCisjZWxpZiBkZWZpbmVkKE1WX1NFQ18yNTZLKQorI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkJMHg0MDAwMAorI2VuZGlmCisKKyNkZWZpbmUJQ09ORklHX0VOVl9PRkZTRVRfU1BJCQkweDEwMDAwMAorI2RlZmluZQlDT05GSUdfRU5WX1NJWkVfU1BJCQlDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkKKworCiAvKiBCb290IGZyb20gU1BJIHNldHRpbmdzICovCiAJI2lmIGRlZmluZWQoTVZfU1BJX0JPT1QpCiAJCSNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9TUElfRkxBU0gKIAotCQkjaWYgZGVmaW5lZChNVl9TRUNfNjRLKQotCQkJI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRSAgICAgICAgICAgIDB4MTAwMDAKLQkJI2VsaWYgZGVmaW5lZChNVl9TRUNfMTI4SykKLQkJCSNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkUgICAgICAgICAgICAweDIwMDAwCi0JCSNlbGlmIGRlZmluZWQoTVZfU0VDXzI1NkspCi0JCQkjZGVmaW5lIENPTkZJR19FTlZfU0VDVF9TSVpFICAgICAgICAgICAgMHg0MDAwMAotCQkjZW5kaWYKKwkJI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRQkJCUNPTkZJR19FTlZfU0VDVF9TSVpFX1NQSQogCi0JCSNkZWZpbmUgQ09ORklHX0VOVl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIENPTkZJR19FTlZfU0VDVF9TSVpFICAgIC8qIGVudmlyb25tZW50IHRha2VzIG9uZSBzZWN0b3IgKi8KLQkJI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAgICAgICAgICAgICAgICAgLyogKDFNQiBGb3IgSW1hZ2UpIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworCQkjZGVmaW5lIENPTkZJR19FTlZfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkgICAgLyogZW52aXJvbm1lbnQgdGFrZXMgb25lIHNlY3RvciAqLworCQkjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfRU5WX09GRlNFVF9TUEkgICAvKiAoMU1CIEZvciBJbWFnZSkgZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCiAJCSNkZWZpbmUgQ09ORklHX0VOVl9BRERSICAgICAgICAgICAgICAgICAgICAgICAgIENPTkZJR19FTlZfT0ZGU0VUCiAJCSNkZWZpbmUgTU9OSVRPUl9IRUFERVJfTEVOICAgICAgICAgICAgICAgICAgICAgIDB4MjAwCiAJCSNkZWZpbmUgQ09ORklHX1NZU19NT05JVE9SX0JBU0UgICAgICAgICAgICAgICAgIDAKQEAgLTMwMSw2ICszMDcsOSBAQAogLyogTkFORC1GTEFTSCBzdHVmZiAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgTVZfTkFORAorCSNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gaW50IG5hbmRfZ2V0X2Vudl9vZmZzKHZvaWQpOworCSNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAkjZGVmaW5lIE1WX05BTkRfUElPX01PREUKIAkjZGVmaW5lIE1WX05BTkRfMUNTX01PREUKIAkvKgpAQCAtMzI0LDE3ICszMzMsMjEgQEAKIAkjdW5kZWYgTVZfTkZDX0RCRwogCSNkZWZpbmUgQ09ORklHX0pGRlMyX05BTkQKIAorCSNkZWZpbmUJQ09ORklHX0VOVl9TSVpFX05BTkQJCQkweDgwMDAwCisJI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVF9OQU5ECQkJbmFuZF9nZXRfZW52X29mZnMoKQorCSNkZWZpbmUJQ09ORklHX0VOVl9SQU5HRV9OQU5ECQkJQ09ORklHX0VOVl9TSVpFX05BTkQgKiA4CisKIC8qIEJvb3QgZnJvbSBOQU5EIHNldHRpbmdzICovCiAJI2lmIGRlZmluZWQoTVZfTkFORF9CT09UKQogCQkjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fTkFORAogCi0JCSNkZWZpbmUgQ09ORklHX0VOVl9TSVpFICAgICAgICAgICAgICAgICAweDgwMDAwICAgICAgICAgICAgICAgICAvKiBlbnZpcm9ubWVudCB0YWtlcyBvbmUgZXJhc2UgYmxvY2sgKi8KLQkJI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVCAgICAgICAgICAgICAgIG5hbmRfZ2V0X2Vudl9vZmZzKCkgICAgIC8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworCQkjZGVmaW5lIENPTkZJR19FTlZfU0laRSAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9TSVpFX05BTkQgICAgICAgICAgICAgICAgIC8qIGVudmlyb25tZW50IHRha2VzIG9uZSBlcmFzZSBibG9jayAqLworCQkjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUICAgICAgICAgICAgICAgQ09ORklHX0VOVl9PRkZTRVRfTkFORCAgICAgLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCiAJCSNkZWZpbmUgQ09ORklHX0VOVl9BRERSICAgICAgICAgICAgICAgICBDT05GSUdfRU5WX09GRlNFVAogCQkjZGVmaW5lIE1PTklUT1JfSEVBREVSX0xFTiAgICAgICAgICAgICAgMHgyMDAKIAkJI2RlZmluZSBDT05GSUdfU1lTX01PTklUT1JfQkFTRSAgICAgICAgIDAKIAkJI2RlZmluZSBDT05GSUdfU1lTX01PTklUT1JfTEVOICAgICAgICAgIDB4ODAwMDAgICAgICAgICAgIC8qIFJlc2VydmUgNTEyIGtCIGZvciBNb25pdG9yICovCi0JCSNkZWZpbmUgQ09ORklHX0VOVl9SQU5HRSAgICAgICAgICAgICAgICBDT05GSUdfRU5WX1NJWkUgKiA4CisJCSNkZWZpbmUgQ09ORklHX0VOVl9SQU5HRSAgICAgICAgICAgICAgICBDT05GSUdfRU5WX1JBTkdFX05BTkQKIAogCQkjZGVmaW5lIE1WX05CT09UX0JBU0UgICAgICAgICAgICAgICAgICAgMAogCQkjZGVmaW5lIE1WX05CT09UX0xFTiAgICAgICAgICAgICAgICAgICAgKDQgPDwgMTApICAgICAgIC8qIFJlc2VydmVkIDRLQiBmb3IgYm9vdCBzdHJhcCAqLwpAQCAtNDQzLDYgKzQ1NiwxMyBAQAogCSNkZWZpbmUgRU5WX1VTQjBfTU9ERSAgICJob3N0IgogCSNkZWZpbmUgRU5WX1VTQl9BQ1RJVkUgICAgICAgICIwIgogCSNkZWZpbmUgRU5WX1VTQl9NT0RFICAgICAgICAgICIzIgkvKiAzID0gVVNCMy4wIHwgMiA9IFVTQjIuMCAqLworCS8qIE1hcnZlbGwgZW5jYXBzdWxhdGUgaXQncyBVU0IgdXNhZ2Ugd2l0aCB1c2JBY3RpdmUgaW50ZXJuYWwgaW5kZXgsCisJICogdGhlIHVzYiBzdGFjayB1c2VzIDEgY29udHJvbGxlciBzaW11bHRhbmVvdXNseSAqLworCSNkZWZpbmUgQ09ORklHX1VTQl9NQVhfQ09OVFJPTExFUl9DT1VOVAkJMQorCS8qIHhIQ0kgY29kZSByZWxpZXMgb24gaW5kZXggcmVjZWl2aW5nIGZyb20gdGhhdCB1c2JBY3RpdmUsCisJICogd2hpY2ggY291bGQgZ28gdXAgdG8gMiBmb3Igc2V2ZXJhbCBTb0NzLiB0aGlzIHJlcXVpcmVzIHhIQ0kgYXJyYXlzIHRvIGJlIGFzIGJpZyBhcworCSAqIHRoZSBhY3R1YWwgVVNCIGhvc3QgY291bnQgKi8KKwkjZGVmaW5lIENPTkZJR19VU0JfTUFYX0NPTlRST0xMRVJfSE9TVF9DT1VOVAkxCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX1hIQ0kpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9FSENJKQogCSNkZWZpbmUgQ09ORklHX1VTQl9YSENJX0hDRCAvKiBzZXQga2VybmVsIGRlZmluZSAtIGZvciBtdl9oYWwvdXNiIHVzYWdlICovCiAjZW5kaWYgLyogQ09ORklHX1VTQl9YSENJICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYXJtYWRhXzM4eC5oIGIvaW5jbHVkZS9jb25maWdzL2FybWFkYV8zOHguaAppbmRleCA3NWVmYWEyLi4xNjIzOGJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYXJtYWRhXzM4eC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9hcm1hZGFfMzh4LmgKQEAgLTU3LDYgKzU3LDcgQEAKICAqLwogI2lmZGVmIENPTkZJR19BUk1BREFfMzhYCiAJI2RlZmluZSBNVjg4RjY4WFgKKwkjZGVmaW5lIENPTkZJR19TV0lUQ0hJTkdfU0VSVklDRVMKICNlbmRpZgogI2lmZGVmIENPTkZJR19BUk1BREFfMzlYCiAJI2RlZmluZSBNVjg4RjY5WFgKQEAgLTY3LDE0ICs2OCwyMSBAQAogI2RlZmluZSBNVl9ERFJfNjRCSVQKICNkZWZpbmUgTVZfQk9PVFJPTQogCi0jaWYgZGVmaW5lZCAoQ09ORklHX0NVU1RPTUVSX0JPQVJEXzApIHx8IGRlZmluZWQgKENPTkZJR19DVVNUT01FUl9CT0FSRF8xKSB8fCBkZWZpbmVkIChDT05GSUdfR0ZDSDEwMCkKKyNpZiBkZWZpbmVkIChDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMCkgfHwgZGVmaW5lZCAoQ09ORklHX0NVU1RPTUVSX0JPQVJEXzEpIHx8IGRlZmluZWQgKENPTkZJR19DTEVBUkZPR19CT0FSRCkgfHwgZGVmaW5lZCAoQ09ORklHX0dGQ0gxMDApCiAjZGVmaW5lIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCiAjZW5kaWYKIAorI2lmZGVmIE1WX0lOQ0xVREVfU1dJVENICisvKkFSTUFEQTM4eCBzd2l0Y2ggcmVzZ2l0ZXJzIGFyZSBhY2Nlc3NlZCBieSBTTUkqLworLyp3ZSBwcm92aWRlIG5hbWUgdW5pZmllZCBzd2l0Y2ggcmVnaXN0ZXIgYWNjZXNzIEFQSXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIGFjY29yZGluZyB0byB0aGUgYWNjZXNzIHdheSovCisjZGVmaW5lIE1WX1NXSVRDSF9TTUlfQUNDRVNTCisjZW5kaWYKKwogI2RlZmluZSBNVl9VU0IKICNkZWZpbmUgTVZfRlMKICNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YKKyNkZWZpbmUgQ09ORklHX1BJQ19HUElPIAkJLyogIHN1cHBvcnQgR1BJTyBzaWduYWxzIGZvciBQSUMgKHByb2dyYW1tYWJsZSBpbnRlcmZhY2UgY2lyY3VpdCkgKi8KIAogI2RlZmluZSBNVl9ERFJfVFJBSU5JTkdfQ01EX05FV19USVAKIApAQCAtMTU2LDExICsxNjQsMTMgQEAKICNkZWZpbmUgQ09ORklHX0NNRF9CT09UX01FTlUKICNkZWZpbmUgQ09ORklHX0NNRF9TWVNfUkVTVE9SRQogI2RlZmluZSBDT05GSUdfQ01EX0hOVlJBTQorCiAvKiBPcGVuIHRoaXMgZGVmaW5lIGZvciBlbmFibGluZyBTZWN1cmUgQm9vdCBNb2RlIGVGdXNlcyBtb2RpZmljYXRpb24KICNkZWZpbmUgQ09ORklHX0NNRF9FRlVTRQogKi8KICNpZmRlZiBDT05GSUdfQVJNQURBXzM5WAogCSNpZm5kZWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQKKwkJI2RlZmluZSBNVl9DUk9TU19GTEFTSF9CT09UCiAJCSNkZWZpbmUgQ09ORklHX0NNRF9CT0FSRENGRwogCSNlbmRpZiAvKiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCAqLwogI2VuZGlmIC8qIENPTkZJR19BUk1BREFfMzlYICovCkBAIC0yODYsNiArMjk2LDE3IEBACiAJI2RlZmluZSBDT05GSUdfRU5WX1NQSV9DUyAgICAgICAgICAgICAgIDAKIAkjZGVmaW5lIENPTkZJR19FTlZfU1BJX0JVUyAgICAgICAgICAgICAgbXZCb2FyZFNwaUJ1c0dldCgpCiAKKyNpZiBkZWZpbmVkKE1WX1NFQ182NEspCisJI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkJCTB4MTAwMDAKKyNlbGlmIGRlZmluZWQoTVZfU0VDXzEyOEspCisJI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkJCTB4MjAwMDAKKyNlbGlmIGRlZmluZWQoTVZfU0VDXzI1NkspCisJI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkJCTB4NDAwMDAKKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19FTlZfU0laRV9TUEkJCUNPTkZJR19FTlZfU0VDVF9TSVpFX1NQSQkvKiBlbnZpcm9ubWVudCB0YWtlcyBvbmUgc2VjdG9yICovCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUX1NQSQkJMHgxMDAwMDAJCQkvKiAoMU1CIEZvciBJbWFnZSkgZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisKICNpZm5kZWYgQ09ORklHX1NGX0RFRkFVTFRfU1BFRUQKICMgZGVmaW5lIENPTkZJR19TRl9ERUZBVUxUX1NQRUVEICAgICAgICBDT05GSUdfRU5WX1NQSV9NQVhfSFoKICNlbmRpZgpAQCAtMzAzLDE2ICszMjQsMTAgQEAKIAkjaWYgZGVmaW5lZChNVl9TUElfQk9PVCkKIAkJI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX1NQSV9GTEFTSAogCi0JCSNpZiBkZWZpbmVkKE1WX1NFQ182NEspCi0JCQkjZGVmaW5lIENPTkZJR19FTlZfU0VDVF9TSVpFICAgICAgICAgICAgMHgxMDAwMAotCQkjZWxpZiBkZWZpbmVkKE1WX1NFQ18xMjhLKQotCQkJI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRSAgICAgICAgICAgIDB4MjAwMDAKLQkJI2VsaWYgZGVmaW5lZChNVl9TRUNfMjU2SykKLQkJCSNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkUgICAgICAgICAgICAweDQwMDAwCi0JCSNlbmRpZgorCQkjZGVmaW5lIENPTkZJR19FTlZfU0VDVF9TSVpFICAgICAgICAgICAJCUNPTkZJR19FTlZfU0VDVF9TSVpFX1NQSQogCiAJCSNkZWZpbmUgQ09ORklHX0VOVl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIENPTkZJR19FTlZfU0VDVF9TSVpFICAgIC8qIGVudmlyb25tZW50IHRha2VzIG9uZSBzZWN0b3IgKi8KLQkJI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAgICAgICAgICAgICAgICAgLyogKDFNQiBGb3IgSW1hZ2UpIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworCQkjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfRU5WX09GRlNFVF9TUEkKIAkJI2RlZmluZSBDT05GSUdfRU5WX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9PRkZTRVQKIAkJI2RlZmluZSBNT05JVE9SX0hFQURFUl9MRU4gICAgICAgICAgICAgICAgICAgICAgMHgyMDAKIAkJI2RlZmluZSBDT05GSUdfU1lTX01PTklUT1JfQkFTRSAgICAgICAgICAgICAgICAgMApAQCAtMzM1LDYgKzM1MCwxMCBAQAogLyogTkFORC1GTEFTSCBzdHVmZiAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgTVZfTkFORAorCSNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gaW50IG5hbmRfZ2V0X2Vudl9vZmZzKHZvaWQpOworCSNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKwogCSNkZWZpbmUgTVZfTkFORF9QSU9fTU9ERQogCSNkZWZpbmUgTVZfTkFORF8xQ1NfTU9ERQogCS8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgbWFza2VkIGZvciBhMzh4OgpAQCAtMzY0LDE3ICszODMsMjIgQEAKIAkjdW5kZWYgTVZfTkZDX0RCRwogCSNkZWZpbmUgQ09ORklHX0pGRlMyX05BTkQKIAorCisJI2RlZmluZSBDT05GSUdfRU5WX1NJWkVfTkFORAkJCTB4ODAwMDAKKwkjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUX05BTkQJCQluYW5kX2dldF9lbnZfb2ZmcygpCisJI2RlZmluZSBDT05GSUdfRU5WX1JBTkdFX05BTkQJCQlDT05GSUdfRU5WX1NJWkVfTkFORCAqIDgKKwogLyogQm9vdCBmcm9tIE5BTkQgc2V0dGluZ3MgKi8KIAkjaWYgZGVmaW5lZChNVl9OQU5EX0JPT1QpCiAJCSNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9OQU5ECiAKLQkJI2RlZmluZSBDT05GSUdfRU5WX1NJWkUgICAgICAgICAgICAgICAgIDB4ODAwMDAgICAgICAgICAgICAgICAgIC8qIGVudmlyb25tZW50IHRha2VzIG9uZSBlcmFzZSBibG9jayAqLworCQkjZGVmaW5lIENPTkZJR19FTlZfU0laRSAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9TSVpFX05BTkQgICAgICAgICAgICAgICAgIC8qIGVudmlyb25tZW50IHRha2VzIG9uZSBlcmFzZSBibG9jayAqLwogCQkjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUICAgICAgICAgICAgICAgbmFuZF9nZXRfZW52X29mZnMoKSAgICAgLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCiAJCSNkZWZpbmUgQ09ORklHX0VOVl9BRERSICAgICAgICAgICAgICAgICBDT05GSUdfRU5WX09GRlNFVAogCQkjZGVmaW5lIE1PTklUT1JfSEVBREVSX0xFTiAgICAgICAgICAgICAgMHgyMDAKIAkJI2RlZmluZSBDT05GSUdfU1lTX01PTklUT1JfQkFTRSAgICAgICAgIDAKIAkJI2RlZmluZSBDT05GSUdfU1lTX01PTklUT1JfTEVOICAgICAgICAgIDB4ODAwMDAgICAgICAgICAgIC8qIFJlc2VydmUgNTEyIGtCIGZvciBNb25pdG9yICovCi0JCSNkZWZpbmUgQ09ORklHX0VOVl9SQU5HRSAgICAgICAgICAgICAgICBDT05GSUdfRU5WX1NJWkUgKiA4CisJCSNkZWZpbmUgQ09ORklHX0VOVl9SQU5HRSAgICAgICAgICAgICAgICBDT05GSUdfRU5WX1JBTkdFX05BTkQKIAogCQkjZGVmaW5lIE1WX05CT09UX0JBU0UgICAgICAgICAgICAgICAgICAgMAogCQkjZGVmaW5lIE1WX05CT09UX0xFTiAgICAgICAgICAgICAgICAgICAgKDQgPDwgMTApICAgICAgIC8qIFJlc2VydmVkIDRLQiBmb3IgYm9vdCBzdHJhcCAqLwpAQCAtNDkzLDE3ICs1MTcsMzIgQEAKIAkjZGVmaW5lIENPTkZJR19VU0JfWEhDSQogCSNkZWZpbmUgQ09ORklHX1NZU19VU0JfWEhDSV9NQVhfUk9PVF9QT1JUUyAgMQogCSNkZWZpbmUgTVZfSU5DTFVERV9VU0IKKwkjZGVmaW5lIE1WX0lOQ0xVREVfVVNCX0RFVklDRQogCSNkZWZpbmUgQ09ORklHX0NNRF9VU0IKIAkjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQogCSNkZWZpbmUgQ09ORklHX0VIQ0lfSVNfVERJCiAJI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCSNkZWZpbmUgQ09ORklHX0lTT19QQVJUSVRJT04KIAkjZGVmaW5lIEVOVl9VU0IwX01PREUgICAiaG9zdCIKKyNpZmRlZiBDT05GSUdfQ0xFQVJGT0dfQk9BUkQKKwkjZGVmaW5lIEVOVl9VU0JfQUNUSVZFICAgICAgICAiMSIKKwkjZGVmaW5lIEVOVl9VU0JfTU9ERSAgICAgICAgICAiMyIJLyogMyA9IFVTQjMuMCB8IDIgPSBVU0IyLjAgKi8KKyNlbHNlCiAJI2RlZmluZSBFTlZfVVNCX0FDVElWRSAgICAgICAgIjAiCiAJI2RlZmluZSBFTlZfVVNCX01PREUgICAgICAgICAgIjMiCS8qIDMgPSBVU0IzLjAgfCAyID0gVVNCMi4wICovCisjZW5kaWYKIAogCSNkZWZpbmUgQ09ORklHX1VTQl9IT1NUX0VUSEVSCiAJI2RlZmluZSBDT05GSUdfVVNCX0VUSEVSX0FTSVgKKwkvKiBNYXJ2ZWxsIGVuY2Fwc3VsYXRlIGl0J3MgVVNCIHVzYWdlIHdpdGggdXNiQWN0aXZlIGludGVybmFsIGluZGV4LAorCSAqIHRoZSB1c2Igc3RhY2sgdXNlcyAxIGNvbnRyb2xsZXIgc2ltdWx0YW5lb3VzbHkgKi8KKwkjZGVmaW5lIENPTkZJR19VU0JfTUFYX0NPTlRST0xMRVJfQ09VTlQJCTEKKwkvKiB4SENJIGNvZGUgcmVsaWVzIG9uIGluZGV4IHJlY2VpdmluZyBmcm9tIHRoYXQgdXNiQWN0aXZlLAorCSAqIHdoaWNoIGNvdWxkIGdvIHVwIHRvIDIuIHRoaXMgcmVxdWlyZXMgeEhDSSBhcnJheXMgdG8gYmUgYXMgYmlnIGFzCisJICogdGhlIGFjdHVhbCBVU0IgaG9zdCBjb3VudCAqLworCSNkZWZpbmUgQ09ORklHX1VTQl9NQVhfQ09OVFJPTExFUl9IT1NUX0NPVU5UCTIKKworCSNkZWZpbmUgTVZfVVNCX1ZCVVNfQ1lDTEUKIAogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9YSENJKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfRUhDSSkKIAkjZGVmaW5lIENPTkZJR19VU0JfWEhDSV9IQ0QgLyogc2V0IGtlcm5lbCBkZWZpbmUgLSBmb3IgbXZfaGFsL3VzYiB1c2FnZSAqLwpAQCAtNTM5LDYgKzU3OCwxNCBAQAogLy8jZGVmaW5lIENPTkZJR19NTUNfVFJBQ0UKIC8qIEJvb3QgZnJvbSBNTUMgc2V0dGluZ3MgKi8KICNpZiBkZWZpbmVkKE1WX01NQ19CT09UKQorLyogdGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgc3VwcG9ydGVkIG9ubHkgd2l0aCBTUEkvTkFORCBpbnRlcmZhY2VzICovCisjaWYgKCFkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKSAmJiAhZGVmaW5lZChNVl9OQU5EKSkKKwkjdW5kZWYgQ09ORklHX0NNRF9TT1VSQ0UJLyogY21kX212c291cmNlLmMgc3VwcG9ydHMgc2NyaXB0IGJ1cm5pbmcgdG8gU1BJL05BTkQgb25seSAqLworCSN1bmRlZiBDT05GSUdfQ01EX1NUQUdFX0JPT1QKKwkjdW5kZWYgQ09ORklHX0NNRF9SQ1ZSCisJI3VuZGVmIENPTkZJR19DTURfQk9PVF9NRU5VCisJI3VuZGVmIENPTkZJR19DTURfU1lTX1JFU1RPUkUKKyNlbmRpZgogCSNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9NTUMJLyogRW52aXJvbm1lbnQgaXMgYXQgYWJzb2x1dGUgbG9jYXRpb24gKFJBVykgKi8KIC8vCSNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GQVQJLyogRW52aXJvbm1lbnQgaXMgaW4gZmlsZSBvbiBGQVQgcGFydGl0aW9uICovCiAvLwkjZGVmaW5lIENPTkZJR19GQVRfV1JJVEUKQEAgLTU2NywxMSArNjE0LDkgQEAKICAqLwogI2lmZGVmIENPTkZJR19BUk1BREFfMzhYCiAjZGVmaW5lIE1WX0JPT1RBUkdTX0VORCAgICAgICAgICI6MTAuNC41MC4yNTQ6MjU1LjI1NS4yNTUuMDpBcm1hZGEzOHg6ZXRoMDpub25lIgotI2RlZmluZSBNVl9CT09UQVJHU19FTkRfU1dJVENIICAiOjo6QXJtYWRhMzh4OmV0aDA6bm9uZSIKICNkZWZpbmUgTVZfRERSX0wyX0FMSUdOTUVOVAogI2VsaWYgZGVmaW5lZCBDT05GSUdfQVJNQURBXzM5WAogI2RlZmluZSBNVl9CT09UQVJHU19FTkQgICAgICAgICAiOjEwLjQuNTAuMjU0OjI1NS4yNTUuMjU1LjA6QXJtYWRhMzl4OmV0aDA6bm9uZSIKLSNkZWZpbmUgTVZfQk9PVEFSR1NfRU5EX1NXSVRDSCAgIjo6OkFybWFkYTM5eDpldGgwOm5vbmUiCiAjZW5kaWYKICNkZWZpbmUgUkNWUl9JUF9BRERSICAgICAgICAgICAgIjE2OS4yNTQuMTAwLjEwMCIKIAkjZGVmaW5lIFJDVlJfTE9BRF9BRERSICAgICAgICAgICIweDAyMDAwMDAwIgpAQCAtNjI3LDcgKzY3Miw2IEBACiAvKiBQblAgUENJIE5ldHdvcmsgY2FyZHMgKi8KIAkjZGVmaW5lIENPTkZJR19FRVBSTzEwMCAvKiBTdXBwb3J0IGZvciBJbnRlbCA4MjU1Ny84MjU1OS84MjU1OUVSIGNoaXBzICovCiAJI2RlZmluZSBDT05GSUdfRTEwMDAKLQkjZGVmaW5lIENPTkZJR19TSzk4CiAJI2RlZmluZSBZVUtfRVRIQUREUiAgICAgICAgICAgICAgICAgICAgICIwMDowMDowMDpFRTo1MTo4MSIKICNlbmRpZgogCkBAIC02OTUsNyArNzM5LDEzIEBACiAjZGVmaW5lIEJPQVJEX0xBVEVfSU5JVAogI2RlZmluZSBDT05GSUdfQk9BUkRfTEFURV9JTklUCiAjdW5kZWYgIENPTkZJR19VU0VfSVJRCisjZGVmaW5lIENPTkZJR19CWklQMgogCiAjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUgICAgICAgICgxIDw8IDIwKSAgICAgICAvKiByZWd1bGFyIHN0YWNrIC0gdXAgdG8gNE0gKGluIGNhc2Ugb2YgZXhjZXB0aW9uKSovCiAKKy8qCisgKiBFUlJBVEEKKyAqLworI2RlZmluZSBFUlJBVEFfRkVfMzEyNDA2NAorCiAjZW5kaWYgLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2F2YW50YV9scC5oIGIvaW5jbHVkZS9jb25maWdzL2F2YW50YV9scC5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYmM4M2YwMy4uNDNmNTliMwotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYXZhbnRhX2xwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2F2YW50YV9scC5oCkBAIC01Myw2ICs1MywxMiBAQAogCiAjaW5jbHVkZSAiLi4vLi4vYm9hcmQvbXZfZWJ1L2FscC9tdlN5c0h3Q29uZmlnLmgiCiAKKyNpZmRlZiBNVl9JTkNMVURFX1NXSVRDSAorLypBdmFudGEgTFAgc3dpdGNoIHJlc2dpdGVycyBhcmUgYWNjZXNzZWQgYnkgQ1BVIGRpcmVjdGx5Ki8KKy8qd2UgcHJvdmlkZSBuYW1lIHVuaWZpZWQgc3dpdGNoIHJlZ2lzdGVyIGFjY2VzcyBBUElzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGFjY2VzcyB3YXkqLworI2RlZmluZSBNVl9TV0lUQ0hfRElSRUNUX0FDQ0VTUworI2VuZGlmCisKIC8qIFZlcnNpb24gbnVtYmVyIHBhc3NlZCB0byBrZXJuZWwgKi8KICNkZWZpbmUgVkVSX05VTSAweDExMTIwMDAwICAgICAgICAgICAgICAvKiAyMDExLjEyICovCiAKQEAgLTI2NSwyMSArMjcxLDI3IEBACiAjZGVmaW5lIENPTkZJR19TRl9ERUZBVUxUX0JVUwkJQ09ORklHX0VOVl9TUElfQlVTCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoTVZfU0VDXzY0SykKKyNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkVfU1BJCTB4MTAwMDAKKyNlbGlmIGRlZmluZWQoTVZfU0VDXzEyOEspCisjZGVmaW5lIENPTkZJR19FTlZfU0VDVF9TSVpFX1NQSQkweDIwMDAwCisjZWxpZiBkZWZpbmVkKE1WX1NFQ18yNTZLKQorI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkJMHg0MDAwMAorI2VuZGlmCisKKyNkZWZpbmUJQ09ORklHX0VOVl9PRkZTRVRfU1BJCQkweDEwMDAwMAorI2RlZmluZQlDT05GSUdfRU5WX1NJWkVfU1BJCQlDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkKKworCiAvKiBCb290IGZyb20gU1BJIHNldHRpbmdzICovCiAJI2lmIGRlZmluZWQoTVZfU1BJX0JPT1QpCiAJCSNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9TUElfRkxBU0gKIAotCQkjaWYgZGVmaW5lZChNVl9TRUNfNjRLKQotCQkJI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRSAgICAgICAgICAgIDB4MTAwMDAKLQkJI2VsaWYgZGVmaW5lZChNVl9TRUNfMTI4SykKLQkJCSNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkUgICAgICAgICAgICAweDIwMDAwCi0JCSNlbGlmIGRlZmluZWQoTVZfU0VDXzI1NkspCi0JCQkjZGVmaW5lIENPTkZJR19FTlZfU0VDVF9TSVpFICAgICAgICAgICAgMHg0MDAwMAotCQkjZW5kaWYKKwkJI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRSAgICAgICAgICAgIAlDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkKIAotCQkjZGVmaW5lIENPTkZJR19FTlZfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfRU5WX1NFQ1RfU0laRSAgICAvKiBlbnZpcm9ubWVudCB0YWtlcyBvbmUgc2VjdG9yICovCi0JCSNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwICAgICAgICAgICAgICAgIC8qICgxTUIgRm9yIEltYWdlKSBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KLQkJI2RlZmluZSBDT05GSUdfRU5WX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9PRkZTRVQKKwkJI2RlZmluZSBDT05GSUdfRU5WX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9TRUNUX1NJWkVfU1BJICAgIC8qIGVudmlyb25tZW50IHRha2VzIG9uZSBzZWN0b3IgKi8KKwkJI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9PRkZTRVRfU1BJICAgICAgIC8qICgxTUIgRm9yIEltYWdlKSBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKwkJI2RlZmluZSBDT05GSUdfRU5WX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9PRkZTRVRfU1BJCiAJCSNkZWZpbmUgTU9OSVRPUl9IRUFERVJfTEVOICAgICAgICAgICAgICAgICAgICAgIDB4MjAwCiAJCSNkZWZpbmUgQ09ORklHX1NZU19NT05JVE9SX0JBU0UgICAgICAgICAgICAgICAgIDAKIAkJI2RlZmluZSBDT05GSUdfU1lTX01PTklUT1JfTEVOICAgICAgICAgICAgICAgICAgMHg4MDAwMCAgICAgICAgICAgICAgICAgLyooNTEyIDw8IDEwKSBSZXNlcnZlIDUxMiBrQiBmb3IgTW9uaXRvciAqLwpAQCAtMzAxLDYgKzMxMywxMCBAQAogLyogTkFORC1GTEFTSCBzdHVmZiAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgTVZfTkFORAorCSNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gaW50IG5hbmRfZ2V0X2Vudl9vZmZzKHZvaWQpOworZXh0ZXJuIGludCBuYW5kX2dldF9lbnZfcmFuZ2Uodm9pZCk7CisJI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCSNkZWZpbmUgTVZfTkFORF9QSU9fTU9ERQogCSNkZWZpbmUgTVZfTkFORF8xQ1NfTU9ERQogCSNkZWZpbmUgTVZfTkFORF80QklUX01PREUKQEAgLTMxOSwxNyArMzM1LDIxIEBACiAJI3VuZGVmIENPTkZJR19DTURfTkFORF9ZQUZGUzIKIAkjdW5kZWYgQ09ORklHX01URF9OQU5EX1lBRkZTMgogCisJI2RlZmluZQlDT05GSUdfRU5WX1NJWkVfTkFORAkJCTB4MTAwMDAKKwkjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUX05BTkQJCQluYW5kX2dldF9lbnZfb2ZmcygpCisJI2RlZmluZQlDT05GSUdfRU5WX1JBTkdFX05BTkQJCQluYW5kX2dldF9lbnZfcmFuZ2UoKQorCiAvKiBCb290IGZyb20gTkFORCBzZXR0aW5ncyAqLwogCSNpZiBkZWZpbmVkKE1WX05BTkRfQk9PVCkKIAkJI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX05BTkQKIAotCQkjZGVmaW5lIENPTkZJR19FTlZfU0laRSAgICAgICAgICAgICAgICAgMHgxMDAwMAkJCS8qIGVudmlyb25tZW50IHRha2VzIG9uZSBlcmFzZSBibG9jayAqLwotCQkjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUICAgICAgICAgICAgICAgbmFuZF9nZXRfZW52X29mZnMoKSAgICAgLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCi0JCSNkZWZpbmUgQ09ORklHX0VOVl9BRERSICAgICAgICAgICAgICAgICBDT05GSUdfRU5WX09GRlNFVAorCQkjZGVmaW5lIENPTkZJR19FTlZfU0laRSAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9TSVpFX05BTkQJLyogZW52aXJvbm1lbnQgdGFrZXMgb25lIGVyYXNlIGJsb2NrICovCisJCSNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQgICAgICAgICAgICAgICBDT05GSUdfRU5WX09GRlNFVF9OQU5EICAvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKwkJI2RlZmluZSBDT05GSUdfRU5WX0FERFIgICAgICAgICAgICAgICAgIENPTkZJR19FTlZfT0ZGU0VUX05BTkQKIAkJI2RlZmluZSBNT05JVE9SX0hFQURFUl9MRU4gICAgICAgICAgICAgIDB4MjAwCiAJCSNkZWZpbmUgQ09ORklHX1NZU19NT05JVE9SX0JBU0UgICAgICAgICAwCiAJCSNkZWZpbmUgQ09ORklHX1NZU19NT05JVE9SX0xFTiAgICAgICAgICAweDgwMDAwICAgICAgICAgICAvKiBSZXNlcnZlIDUxMiBrQiBmb3IgTW9uaXRvciAqLwotCQkjZGVmaW5lIENPTkZJR19FTlZfUkFOR0UgICAgICAgICAgICAgICAgbmFuZF9nZXRfZW52X3JhbmdlKCkKKwkJI2RlZmluZSBDT05GSUdfRU5WX1JBTkdFICAgICAgICAgICAgICAgIENPTkZJR19FTlZfUkFOR0VfTkFORAogCiAJCSNkZWZpbmUgTVZfTkJPT1RfQkFTRSAgICAgICAgICAgICAgICAgICAwCiAJCSNkZWZpbmUgTVZfTkJPT1RfTEVOICAgICAgICAgICAgICAgICAgICAoNCA8PCAxMCkgICAgICAgLyogUmVzZXJ2ZWQgNEtCIGZvciBib290IHN0cmFwICovCkBAIC00NDMsNiArNDYzLDEzIEBACiAJI2RlZmluZSBFTlZfVVNCMV9NT0RFICAgImhvc3QiCiAJI2RlZmluZSBFTlZfVVNCX0FDVElWRSAgICAgICAgIjAiCiAJI2RlZmluZSBFTlZfVVNCX01PREUgICAgICAgICAgIjMiCS8qIDMgPSBVU0IzLjAgfCAyID0gVVNCMi4wICovCisJLyogTWFydmVsbCBlbmNhcHN1bGF0ZSBpdCdzIFVTQiB1c2FnZSB3aXRoIHVzYkFjdGl2ZSBpbnRlcm5hbCBpbmRleCwKKwkgKiB0aGUgdXNiIHN0YWNrIHVzZXMgMSBjb250cm9sbGVyIHNpbXVsdGFuZW91c2x5ICovCisJI2RlZmluZSBDT05GSUdfVVNCX01BWF9DT05UUk9MTEVSX0NPVU5UCQkxCisJLyogeEhDSSBjb2RlIHJlbGllcyBvbiBpbmRleCByZWNlaXZpbmcgZnJvbSB0aGF0IHVzYkFjdGl2ZSwKKwkgKiB3aGljaCBjb3VsZCBnbyB1cCB0byAyIGZvciBzZXZlcmFsIFNvQ3MuIHRoaXMgcmVxdWlyZXMgeEhDSSBhcnJheXMgdG8gYmUgYXMgYmlnIGFzCisJICogdGhlIGFjdHVhbCBVU0IgaG9zdCBjb3VudCAqLworCSNkZWZpbmUgQ09ORklHX1VTQl9NQVhfQ09OVFJPTExFUl9IT1NUX0NPVU5UCTEKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfWEhDSSkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0VIQ0kpCiAJI2RlZmluZSBDT05GSUdfVVNCX1hIQ0lfSENEIC8qIHNldCBrZXJuZWwgZGVmaW5lIC0gZm9yIG12X2hhbC91c2IgdXNhZ2UgKi8KICNlbmRpZiAvKiBDT05GSUdfVVNCX1hIQ0kgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9tc3lzLmggYi9pbmNsdWRlL2NvbmZpZ3MvbXN5cy5oCmluZGV4IDM3Yjc4MDQuLjhjZDEzN2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9tc3lzLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL21zeXMuaApAQCAtMTE0LDYgKzExNCw3IEBACiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCWV4dGVybiB1bnNpZ25lZCBpbnQgbXZDcHVEZHJDbGtHZXQodm9pZCk7CiAJZXh0ZXJuIHVuc2lnbmVkIGludCBtdlRjbGtHZXQodm9pZCk7CisJZXh0ZXJuIHVuc2lnbmVkIGludCBtdlVhcnRQb3J0R2V0KHZvaWQpOwogCSNkZWZpbmUgVUJPT1RfQ05UUgkJMAkJLyogY291bnRlciB0byB1c2UgZm9yIHVib290IHRpbWVyICovCiAJI2RlZmluZSBNVl9UQ0xLX0NOVFIJCTEJCS8qIGNvdW50ZXIgdG8gdXNlIGZvciB1Ym9vdCB0aW1lciAqLwogCSNkZWZpbmUgTVZfUkVGX0NMS19ERVZfQklUCTEwMDAJCS8qIE51bWJlciBvZiBjeWNsZSB0byBlYW5ibGUgdGltZXIgKi8KQEAgLTIwNCw2ICsyMDUsMTEgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RQX1BYRV9DTElFTlRBUkNICTB4MTAwCiAjZGVmaW5lIENPTkZJR19CT09UUF9WQ0lfU1RSSU5HCQkiVS1ib290LmFybXY3LmFybWFkYV94cCIKIAorLyogRmxhdHRlbmVkIERldmljZSBUcmVlIChGRFQpIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX09GX0xJQkZEVCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ09ORklHX09GX0JPQVJEX1NFVFVQCisjdW5kZWYgQ09ORklHX09GX0xJQkZEVF9JU19ERUZBVUxUICAgLyogZGZ0IGlzIHRoZSBkZWZhdWx0IGZvciBib290Y21kICovCisKIC8qIEZTIHN1cHBvcnRlZCAqLwogI2RlZmluZSBDT05GSUdfQ01EX0VYVDIKICNkZWZpbmUgQ09ORklHX0NNRF9FWFQ0CkBAIC0zMzAsNyArMzM2LDcgQEAKICAqLwogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAJMTE1MjAwICAgLyogY29uc29sZSBiYXVkcmF0ZSA9IDExNTIwMCAgICAqLwogI2RlZmluZSBDT05GSUdfU1lTX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDAsIDQ2MDgwMCwgOTIxNjAwIH0KLSNkZWZpbmUgQ09ORklHX1NZU19EVUFSVF9DSEFOCQkxCQkvKiBjaGFubmVsIHRvIHVzZSBmb3IgY29uc29sZSAqLworI2RlZmluZSBDT05GSUdfU1lTX0RVQVJUX0NIQU4JCTAJCS8qIGNoYW5uZWwgdG8gdXNlIGZvciBjb25zb2xlICovCiAKIAogI2RlZmluZSBDT05GSUdfU1lTX0lOSVRfQ0hBTjEKQEAgLTM5OCw2ICs0MDQsMTMgQEAKIAkjZGVmaW5lIEVOVl9VU0IxX01PREUgICAiaG9zdCIKIAkjZGVmaW5lIEVOVl9VU0JfQUNUSVZFICAgICAgICAiMCIKIAkjZGVmaW5lIEVOVl9VU0JfTU9ERSAgICAgICAgICAiMiIgLyogMyA9IFVTQjMuMCB8IDIgPSBVU0IyLjAgKi8KKwkvKiBNYXJ2ZWxsIGVuY2Fwc3VsYXRlIGl0J3MgVVNCIHVzYWdlIHdpdGggdXNiQWN0aXZlIGludGVybmFsIGluZGV4LAorCSAqIHRoZSB1c2Igc3RhY2sgdXNlcyAxIGNvbnRyb2xsZXIgc2ltdWx0YW5lb3VzbHkgKi8KKwkjZGVmaW5lIENPTkZJR19VU0JfTUFYX0NPTlRST0xMRVJfQ09VTlQJCTEKKwkvKiB4SENJIGNvZGUgcmVsaWVzIG9uIGluZGV4IHJlY2VpdmluZyBmcm9tIHRoYXQgdXNiQWN0aXZlLAorCSAqIHdoaWNoIGNvdWxkIGdvIHVwIHRvIDIgZm9yIHNldmVyYWwgU29Dcy4gdGhpcyByZXF1aXJlcyB4SENJIGFycmF5cyB0byBiZSBhcyBiaWcgYXMKKwkgKiB0aGUgYWN0dWFsIFVTQiBob3N0IGNvdW50ICovCisJI2RlZmluZSBDT05GSUdfVVNCX01BWF9DT05UUk9MTEVSX0hPU1RfQ09VTlQJMQogCiAJI2RlZmluZSBDT05GSUdfVVNCX0hPU1RfRVRIRVIKIAkjZGVmaW5lIENPTkZJR19VU0JfRVRIRVJfQVNJWApAQCAtNTc5LDYgKzU5MiwxMSBAQAogCSNkZWZpbmUgQ09ORklHX1NZU19OQU5EX01BWF9DSElQUyAxCiAKICNpZiBkZWZpbmVkKE1WX05BTkQpCisKKwkjaWZuZGVmIF9fQVNTRU1CTFlfXworZXh0ZXJuIGludCBuYW5kX2dldF9lbnZfb2Zmcyh2b2lkKTsKKwkjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKIAkjZGVmaW5lIE1WX05BTkRfUElPX01PREUKIAkjZGVmaW5lIE1WX05BTkRfMUNTX01PREUKIAkjZGVmaW5lIE1WX05BTkRfNEJJVF9NT0RFCkBAIC02NjYsNiArNjg0LDcgQEAKICNkZWZpbmUgQ09ORklHX0JPQVJEX0xBVEVfSU5JVAogI3VuZGVmIENPTkZJR19VU0VfSVJRCiAjZGVmaW5lIENPTkZJR19CWklQMgorI2RlZmluZSBNVl9TV0lUQ0hfQUREUkVTU19DT01QTEVUSU9OCiAKIC8qIGZvciBydW5uaW5nIGZyb20gTDIgU1JBTQogI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgxMjggPDwgMTApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbXZfdmVyc2lvbi5oIGIvaW5jbHVkZS9jb25maWdzL212X3ZlcnNpb24uaAppbmRleCBlMzU5MGE1Li40NTg5MzZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbXZfdmVyc2lvbi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9tdl92ZXJzaW9uLmgKQEAgLTM5LDYgKzM5LDYgQEAKIC8qCiAgKiBWZXJzaW9uCiAgKi8KLSNkZWZpbmUgQ09ORklHX0lERU5UX1NUUklORwkiIE1hcnZlbGwgdmVyc2lvbjogMjAxNV9UMS4wIgorI2RlZmluZSBDT05GSUdfSURFTlRfU1RSSU5HCSIgTWFydmVsbCB2ZXJzaW9uOiAyMDE1X1QxLjBwMTYiCiAKICNlbmRpZiAvKiBfX01WX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9leHQ0ZnMuaCBiL2luY2x1ZGUvZXh0NGZzLmgKaW5kZXggMDliYTM3ZS4uNTI2YmRiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9leHQ0ZnMuaAorKysgYi9pbmNsdWRlL2V4dDRmcy5oCkBAIC0xMzUsNyArMTM1LDcgQEAKIHZvaWQgZXh0NGZzX2Nsb3NlKHZvaWQpOwogaW50IGV4dDRmc19scyhjb25zdCBjaGFyICpkaXJuYW1lLCBjaGFyICpvdXRidWZmLCBpbnQgb3V0c2l6ZSk7CiB2b2lkIGV4dDRmc19mcmVlX25vZGUoc3RydWN0IGV4dDJmc19ub2RlICpub2RlLCBzdHJ1Y3QgZXh0MmZzX25vZGUgKmN1cnJyb290KTsKLWludCBleHQ0ZnNfZGV2cmVhZChpbnQgc2VjdG9yLCBpbnQgYnl0ZV9vZmZzZXQsIGludCBieXRlX2xlbiwgY2hhciAqYnVmKTsKK2ludCBleHQ0ZnNfZGV2cmVhZChsYmFpbnRfdCBzZWN0b3IsIGludCBieXRlX29mZnNldCwgaW50IGJ5dGVfbGVuLCBjaGFyICpidWYpOwogdm9pZCBleHQ0ZnNfc2V0X2Jsa19kZXYoYmxvY2tfZGV2X2Rlc2NfdCAqcmJkZCwgZGlza19wYXJ0aXRpb25fdCAqaW5mbyk7CiBsb25nIGludCByZWFkX2FsbG9jYXRlZF9ibG9jayhzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUsIGludCBmaWxlYmxvY2spOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2V4dF9jb21tb24uaCBiL2luY2x1ZGUvZXh0X2NvbW1vbi5oCmluZGV4IDg2MzczYTYuLjg3YjMzYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZXh0X2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvZXh0X2NvbW1vbi5oCkBAIC0xODYsNyArMTg2LDcgQEAKIAlzdHJ1Y3QgZXh0MmZzX25vZGUgZGlyb3BlbjsKIH07CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBhcnRfb2Zmc2V0OworZXh0ZXJuIGxiYWludF90IHBhcnRfb2Zmc2V0OwogCiBpbnQgZG9fZXh0MmxzKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7CiBpbnQgZG9fZXh0MmxvYWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaWRlLmggYi9pbmNsdWRlL2lkZS5oCmluZGV4IDc1NDFjYjguLmY2Zjk2NTQgMTAwNzU1Ci0tLSBhL2luY2x1ZGUvaWRlLmgKKysrIGIvaW5jbHVkZS9pZGUuaApAQCAtNDQsNiArNDQsNyBAQAogI2lmZGVmIENPTkZJR19TWVNfNjRCSVRfTEJBCiB0eXBlZGVmIHVpbnQ2NF90IGxiYWludF90OwogI2RlZmluZSBMQkFGICIlbGx4IgorI2RlZmluZSBMQkFGVSAiJWxsdSIKICNkZWZpbmUgSURFX0JMT0NLX05VTUJFUl9NQVNLIDB4MDAwMGZmZmZmMDAwMDAwMAogI2RlZmluZSBMQkFfTE9XX1JFR19TSElGVAkyNAogI2RlZmluZSBMQkFfTUlEX1JFR19TSElGVAkzMgpAQCAtNTEsNiArNTIsNyBAQAogI2Vsc2UKIHR5cGVkZWYgdWxvbmcgbGJhaW50X3Q7CiAjZGVmaW5lIExCQUYgIiVseCIKKyNkZWZpbmUgTEJBRlUgIiVsdSIKICNkZWZpbmUgSURFX0JMT0NLX05VTUJFUl9NQVNLIDB4ZjAwMDAwMDAKICNkZWZpbmUgTEJBX0xPV19SRUdfU0hJRlQJMjQKICNkZWZpbmUgTEJBX01JRF9SRUdfU0hJRlQJMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wYXJ0LmggYi9pbmNsdWRlL3BhcnQuaAppbmRleCAzNWMxYzViLi44ZTMxZTc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3BhcnQuaAorKysgYi9pbmNsdWRlL3BhcnQuaApAQCAtOTcsOCArOTcsOCBAQAogI2RlZmluZSBERVZfVFlQRV9PUERJU0sJCTB4MDcJLyogb3B0aWNhbCBkaXNrICovCiAKIHR5cGVkZWYgc3RydWN0IGRpc2tfcGFydGl0aW9uIHsKLQl1bG9uZwlzdGFydDsJCS8qICMgb2YgZmlyc3QgYmxvY2sgaW4gcGFydGl0aW9uCSovCi0JdWxvbmcJc2l6ZTsJCS8qIG51bWJlciBvZiBibG9ja3MgaW4gcGFydGl0aW9uCSovCisJbGJhaW50X3QJc3RhcnQ7CS8qICMgb2YgZmlyc3QgYmxvY2sgaW4gcGFydGl0aW9uCSovCisJbGJhaW50X3QJc2l6ZTsJLyogbnVtYmVyIG9mIGJsb2NrcyBpbiBwYXJ0aXRpb24JKi8KIAl1bG9uZwlibGtzejsJCS8qIGJsb2NrIHNpemUgaW4gYnl0ZXMJCQkqLwogCXVjaGFyCW5hbWVbMzJdOwkvKiBwYXJ0aXRpb24gbmFtZQkJCSovCiAJdWNoYXIJdHlwZVszMl07CS8qIHN0cmluZyB0eXBlIGRlc2NyaXB0aW9uCQkqLwpkaWZmIC0tZ2l0IGEvbmV0L2V0aC5jIGIvbmV0L2V0aC5jCmluZGV4IDRlNGE4NDcuLmU5ZDliMDYgMTAwNjQ0Ci0tLSBhL25ldC9ldGguYworKysgYi9uZXQvZXRoLmMKQEAgLTIzMSw3ICsyMzEsNiBAQAogaW50IGV0aF9yZWdpc3RlcihzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBldGhfZGV2aWNlICpkOwotCXN0YXRpYyBpbnQgaW5kZXg7CiAKIAlhc3NlcnQoc3RybGVuKGRldi0+bmFtZSkgPCBzaXplb2YoZGV2LT5uYW1lKSk7CiAKQEAgLTI0Niw3ICsyNDUsNiBAQAogCiAJZGV2LT5zdGF0ZSA9IEVUSF9TVEFURV9JTklUOwogCWRldi0+bmV4dCAgPSBldGhfZGV2aWNlczsKLQlkZXYtPmluZGV4ID0gaW5kZXgrKzsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC8uZ2l0aWdub3JlIGIvdG9vbHMvbWFydmVsbC8uZ2l0aWdub3JlCmluZGV4IDY3MzY2ODguLjg0Y2Q5Y2QgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvLmdpdGlnbm9yZQorKysgYi90b29scy9tYXJ2ZWxsLy5naXRpZ25vcmUKQEAgLTI5LDYgKzI5LDcgQEAKIC9nZGIvZ2RiY29udAogL2dkYi9nZGJzZW5kCiAvYmluX2hkci9zcmNfZGRyL2RkcjNsaWIvCisvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi8KIGRvaW1hZ2UqCiBsaW5rZXIuc2NyCiBsaW5rZXJfc2VjLnNjcgpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL01ha2VmaWxlIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL01ha2VmaWxlCmluZGV4IGYyZTA0MzQuLjdjM2NmYWMgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9NYWtlZmlsZQorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvTWFrZWZpbGUKQEAgLTg1LDYgKzg1LDggQEAKIEFPQkogPSAkKHN1YnN0IC5zLC5vLCQoQVNSQykpCiBDT0JKID0gJChzdWJzdCAuYywubywkKENTUkMpKQogQ1VBUlRfT0JKID0gJChzdWJzdCAuYywudWFydC5vLCQoQ1NSQykpCitDREVCVUdfT0JKID0gJChzdWJzdCAuYywuZGVidWcubywkKENTUkMpKSAjIGRlYnVnIG9iamVjdCBmb3IgbXZkaXNwYXRjaGVyCisKIAogTElCX1BIWSA9IHBoeV8kKEJPQVJEKS5hCiBMSUJfRERSID0gZGRyXyQoQk9BUkQpLmEKQEAgLTk4LDE3ICsxMDAsMjcgQEAKIExJQl9TV1VQX1VBUlQgPSBzdXNwZW5kV1VQLnVhcnQuYQogTElCX0dFTkVSQUxfSU5JVF9VQVJUID0gZ2VuZXJhbEluaXQudWFydC5hCiAKK0xJQl9QTEFUX0RFQlVHID0gcGxhdC5kZWJ1Zy5hICMgc3BlY2lmaWMgcGxhdGZvcm0gbGlicmFyeSB3aXRoIGJpbiBoZWFkZXIgZGVidWcgdG9vbAorCiBMSUJHQ0MgPSAkKE1BSU4pL2xpYmdjYy5saWIKIAogaWZlcSAoJChERFJUWVBFKSwpCiBERFJUWVBFID0gZGRyMwogZW5kaWYKIAoraWZlcSAoJChERFJUWVBFKSxkZHI0KQorCVRMSUJTID0gJChUTElCKSAkKFRERFI0U1VCTElCKQorZWxzZQorCVRMSUJTID0gJChUTElCKQorZW5kaWYKKwogVExJQiA9IC4vc3JjX2Rkci9saWIvJChERFJUWVBFKV90cmFpbmluZ18kKExJQk5BTUUpLmxpYgorVEREUjRTVUJMSUIgPSAuL3NyY19kZHIvbGliLyQoRERSVFlQRSlfdHJhaW5pbmdfJChMSUJOQU1FKXN1Yi5saWIKIAogQ09NUE9ORU5UX1NVQkRJUlMgPSBwbGF0Zm9ybSBzcmNfcGh5IHNyY19kZHIgc3JjX3BtIHNyY19pbml0Ci1IRFJfQ09NUE9ORU5UUyA9ICQoTElCX1BMQVQpICQoTElCX0dFTkVSQUxfSU5JVCkgJChMSUJfUEhZKSAkKExJQl9ERFIpICQoVExJQikgJChMSUJfU1dVUCkKLUhEUl9DT01QT05FTlRTX1VBUlQgPSAkKExJQl9QTEFUX1VBUlQpICQoTElCX0dFTkVSQUxfSU5JVF9VQVJUKSAkKExJQl9QSFlfVUFSVCkgJChMSUJfRERSX1VBUlQpICQoVExJQikgJChMSUJfU1dVUF9VQVJUKQorSERSX0NPTVBPTkVOVFMgPSAkKExJQl9QTEFUKSAkKExJQl9HRU5FUkFMX0lOSVQpICQoTElCX1BIWSkgJChMSUJfRERSKSAkKFRMSUJTKSAkKExJQl9TV1VQKQorSERSX0NPTVBPTkVOVFNfVUFSVCA9ICQoTElCX1BMQVRfVUFSVCkgJChMSUJfR0VORVJBTF9JTklUX1VBUlQpICQoTElCX1BIWV9VQVJUKSAkKExJQl9ERFJfVUFSVCkgJChUTElCUykgJChMSUJfU1dVUF9VQVJUKQorSERSX0NPTVBPTkVOVFNfREVCVUcgPSAkKExJQl9QTEFUX0RFQlVHKSAkKExJQl9HRU5FUkFMX0lOSVQpICQoTElCX1BIWSkgJChMSUJfRERSKSAkKFRMSUJTKSAkKExJQl9TV1VQKQogCiAjaG93IHRvIGFkZCBuZXcgY29tcG9uZW50IHRvIGJpbmFyeSBoZWFkZXI6CiAjRVhBTVBMRV9DT01QT05FTlQ9bm8KQEAgLTEyNSw3ICsxMzcsNyBAQAogJChpbmZvICkKIGVuZGlmCiAKLWFsbDogICBzdWJkaXJzICQoVEdUKS5iaW4gJChUR1QpX3NlYy5iaW4gJChUR1QpLnVhcnQuYmluICAkKFRHVCkuZGlzICQoVEdUKV9zZWMuZGlzICQoVEdUKS51YXJ0LmRpcyAkKFRHVCkuc3JlYyAkKFRHVClfc2VjLnNyZWMgJChUR1QpLnVhcnQuc3JlYworYWxsOiAgIHN1YmRpcnMgJChUR1QpLmJpbiAkKFRHVClfc2VjLmJpbiAkKFRHVCkudWFydC5iaW4gICQoVEdUKS5kaXMgJChUR1QpX3NlYy5kaXMgJChUR1QpLnVhcnQuZGlzICQoVEdUKS5zcmVjICQoVEdUKV9zZWMuc3JlYyAkKFRHVCkudWFydC5zcmVjICQoVEdUKS5kZWJ1Zy5iaW4KIAogJS5vOiAlLmMKIAkkKENDKSAkKENGTEFHUykgJChDUFBGTEFHUykgLWMgLW8gJEAgJDwKQEAgLTEzMyw2ICsxNDUsOSBAQAogJS51YXJ0Lm86ICUuYwogCSQoQ0MpICQoQ0ZMQUdTKSAtRE5PVF9VU0VfVUFSVCAtRE1WX05PX0lOUFVUIC1ETVZfTk9fUFJJTlQgICQoQ1BQRkxBR1MpIC1jIC1vICAkQCAkPAogCislLmRlYnVnLm86ICUuYworCSQoQ0MpICQoQ0ZMQUdTKSAtRE1WX0RFQlVHX01PREUgJChDUFBGTEFHUykgLWMgLW8gICRAICQ8CisKICQoVEdUKS5iaW46ICQoVEdUKS5lbGYKIAkkKE9CSkNPUFkpIC1TIC1PIGJpbmFyeSAkPCAkKGFkZHN1ZmZpeCAudG1wLCAkQCkKIAkkKENBVCkgJChQQVJBTVNGSUxFKS5yYXcgJChhZGRzdWZmaXggLnRtcCwgJEApID4gJEAKQEAgLTE0OCw2ICsxNjMsMTEgQEAKIAkkKENBVCkgJChQQVJBTVNGSUxFKS5yYXcgJChhZGRzdWZmaXggLnRtcCwgJEApID4gJEAKIAkkKFJNKSAkKGFkZHN1ZmZpeCAudG1wLCAkQCkKIAorJChUR1QpLmRlYnVnLmJpbjogJChUR1QpLmRlYnVnLmVsZgorCSQoT0JKQ09QWSkgLVMgLU8gYmluYXJ5ICQ8ICQoYWRkc3VmZml4IC50bXAsICRAKQorCSQoQ0FUKSAkKFBBUkFNU0ZJTEUpLnJhdyAkKGFkZHN1ZmZpeCAudG1wLCAkQCkgPiAkQAorCSQoUk0pICQoYWRkc3VmZml4IC50bXAsICRAKQorCiAkKFRHVCkuc3JlYzogJChUR1QpLmVsZgogCSQoT0JKQ09QWSkgLU8gc3JlYyAkPCAkQAogCkBAIC0xNzUsNiArMTk1LDkgQEAKICQoVEdUKS51YXJ0LmVsZjogJChBT0JKKSAkKENVQVJUX09CSikgc3ViZGlycwogCSQoQ0MpICQoTERGTEFHU0JJTikgJChBT0JKKSAkKENVQVJUX09CSikgJChIRFJfQ09NUE9ORU5UU19VQVJUKSAkKExJQl9QTEFUX1VBUlQpICQoTElCR0NDKSAtbyAkQAogCiskKFRHVCkuZGVidWcuZWxmOiAkKEFPQkopICQoQ0RFQlVHX09CSikgc3ViZGlycworCSQoQ0MpICQoTERGTEFHU0JJTikgJChBT0JKKSAkKENERUJVR19PQkopICQoSERSX0NPTVBPTkVOVFNfREVCVUcpICQoTElCX1BMQVRfREVCVUcpICQoTElCR0NDKSAtbyAkQAorCiAkKExEU0NSSVBUKTogJChTRVRQQVJBTVMpCiAJLi8kKFNFVFBBUkFNUykgLUIgJChCT0FSRCkgLVAgJChQQVJBTVNGSUxFKS50eHQgLVIgJChEUkFNUkVHUykgLWQgJChERUJVR19NT0RFX0ZMQUcpICQoUEFSQU1TRklMRSkucmF3ICRACiAKQEAgLTE5Niw3ICsyMTksNyBAQAogCWRvbmUKIAogY2xlYW46Ci0JJChSTSkgKi5yYXcgKi5lbGYgKi5zcmVjICouZGlzICouYmluICouYSAqLnVhcnQuYmluICoudWFydC5lbGYgLi9zcmMvKi5vICAkKExEU0NSSVBUKSAkKExEU0VDU0NSSVBUKSAkKFNFVFBBUkFNUykKKwkkKFJNKSAqLnJhdyAqLmVsZiAqLnNyZWMgKi5kaXMgKi5iaW4gKi5hICoudWFydC5iaW4gKi51YXJ0LmVsZiAqLmRlYnVnLmJpbiAuL3NyYy8qLm8gICQoTERTQ1JJUFQpICQoTERTRUNTQ1JJUFQpICQoU0VUUEFSQU1TKQogCUBmb3IgZGlyIGluICQoQ09NUE9ORU5UX1NVQkRJUlMpIDsgZG8gXAogCSAgICAkKE1BS0UpIGNsZWFuIC1zIC1DICQkZGlyIHx8IGV4aXQgMSA7IFwKIAlkb25lCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvYmFzZS5tayBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9iYXNlLm1rCmluZGV4IDFlNWRhNjIuLjYwN2IyMzYgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9iYXNlLm1rCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9iYXNlLm1rCkBAIC04Myw2ICs4Myw5IEBACiBpZmVxICIkKENPTkZJR19DVVNUT01FUl9CT0FSRF8xKSIgICJ5IgogICBDRkxBR1MgKz0gLURDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMQogZW5kaWYKK2lmZXEgIiQoQ09ORklHX0NMRUFSRk9HX0JPQVJEKSIgICJ5IgorICBDRkxBR1MgKz0gLURDT05GSUdfQ0xFQVJGT0dfQk9BUkQKK2VuZGlmCiBpZmVxICIkKENPTkZJR19HRkNIMTAwKSIgICJ5IgogICBDRkxBR1MgKz0gLURDT05GSUdfR0ZDSDEwMAogZW5kaWYKQEAgLTIwNiw3ICsyMDksNyBAQAogCiBCSF9ST09UX0RJUiAgPSAkKFRPUERJUikvdG9vbHMvbWFydmVsbC9iaW5faGRyCiBJTkNMVURFICAgICAgPSAtSSQoQkhfUk9PVF9ESVIpL3NyY19kZHIgLUkkKEJIX1JPT1RfRElSKS9zcmNfcGh5LyQoQk9BUkQpIC1JJChCSF9ST09UX0RJUikvaW5jL2NvbW1vbiBcCi0JICAgICAgIC1JJChCSF9ST09UX0RJUikvaW5jL2RkcjNfc29jLyQoSU5DTkFNRSkgIC1JJChCSF9ST09UX0RJUikvaW5jL2RkcjNfc29jLyQoQk9BUkQpIC1JJChCSF9ST09UX0RJUikvcGxhdGZvcm0vc3lzRW52LyQoQk9BUkQpIC1JJChUT1BESVIpL2luY2x1ZGUKKwkgICAgICAgLUkkKEJIX1JPT1RfRElSKS9pbmMvZGRyM19zb2MvJChJTkNOQU1FKSAgLUkkKEJIX1JPT1RfRElSKS9pbmMvZGRyM19zb2MvJChCT0FSRCkgLUkkKEJIX1JPT1RfRElSKS9wbGF0Zm9ybS9zeXNFbnYvJChCT0FSRCkgLUkkKFRPUERJUikvaW5jbHVkZSAtSSQoQkhfUk9PVF9ESVIpL3NyY19pbml0LyQoQk9BUkQpCiBIT1NUQ0ZMQUdTICAgPSAtV2FsbCAkKElOQ0xVREUpCiAKIGlmZXEgKCQoQklOX0hEUl9ERUJVRyksMSkKQEAgLTIyMywxMyArMjI2LDE1IEBACiBlbmRpZgogCiBDRkxBR1MgICArPSAtV2FsbCAkKElOQ0xVREUpICQoREVCVUdfRkxBR1MpICQoQ1BVT1BUUykgLW1zb2Z0LWZsb2F0IC1tYWJpPWFhcGNzCi1pZmVxICgkKEJPQVJEKSxhMzh4KQotQ0ZMQUdTICAgKz0gLWZkYXRhLXNlY3Rpb25zIC1mZnVuY3Rpb24tc2VjdGlvbnMKLUVYVFJBX0xEX0ZMQUdTID0gLVdsLC0tZ2Mtc2VjdGlvbnMgLS1lbnRyeT1fc3RhcnQKLWVsc2UKKworaWZlcSAoJChCT0FSRCksbXN5c19iYzIpCiBDRkxBR1MgICArPSAtZlBJRSAtZm5vLXplcm8taW5pdGlhbGl6ZWQtaW4tYnNzIC1mbm8tdW53aW5kLXRhYmxlcworZWxzZQorQ0ZMQUdTICAgKz0gLWZkYXRhLXNlY3Rpb25zIC1mZnVuY3Rpb24tc2VjdGlvbnMKIGVuZGlmCiAKK0VYVFJBX0xEX0ZMQUdTID0gLVdsLC0tZ2Mtc2VjdGlvbnMgLS1lbnRyeT1fc3RhcnQKKwogaWZlcSAoJChERFJUWVBFKSxkZHI0KQogQ0ZMQUdTICs9IC1EQ09ORklHX0REUjQKIGVsc2UKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2Jpbl9oZHJfdHdzaS5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vYmluX2hkcl90d3NpLmgKaW5kZXggZTA0ZDk5My4uZTgzZTkzZCAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vYmluX2hkcl90d3NpLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vYmluX2hkcl90d3NpLmgKQEAgLTExMCw3ICsxMTAsMTAgQEAKIC8qCiAqKiBCYXNlIGFkZHJlc3MgZm9yIFRXU0kgcmVnaXN0ZXJzLgogKi8KLSNkZWZpbmUgTVZfVFdTSV9TTEFWRV9SRUdTX0JBU0UodW5pdCkgICAgICAgKE1WX1RXU0lfU0xBVkVfUkVHU19PRkZTRVQodW5pdCkpCisjZGVmaW5lIE1WX1RXU0lfU0xBVkVfUkVHU19CQVNFKHVuaXQpCQkoTVZfVFdTSV9TTEFWRV9SRUdTX09GRlNFVCh1bml0KSkKKyNkZWZpbmUgVFdTSV9DT05GSUdfREVCVUdfUkVHCQkJKE1WX1RXU0lfU0xBVkVfUkVHU19CQVNFKDApICsgMHg4YykKKyNkZWZpbmUgVFdTSV9ERUJVR19TTEFWRV9QT1JUMF9FTgkJQklUMTgKKyNkZWZpbmUgVFdTSV9ERUJVR19TTEFWRV9QT1JUMV9FTgkJQklUMTkKIAogLyoKICoqIFNwZWNpZmljIGRlZmluaXRpb24gZm9yIE1haW4gQ1BVIGludGVycnVwdCBjYXVzZSByZWdpc3Rlci4KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2RkcjNfaHdzX2h3X3RyYWluaW5nX2RlZi5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vZGRyM19od3NfaHdfdHJhaW5pbmdfZGVmLmgKaW5kZXggOTg0NTVkNy4uMDUzMTI5NiAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vZGRyM19od3NfaHdfdHJhaW5pbmdfZGVmLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vZGRyM19od3NfaHdfdHJhaW5pbmdfZGVmLmgKQEAgLTQ5LDE2ICs0OSw2IEBACiAjZGVmaW5lIE1WX01BWF9ERFIzX1NUQVRJQ19TSVpFCQkJCQk1MAogI2RlZmluZSBNVl9ERFIzX01PREVTX05VTUJFUgkJCQkJMzAKIAotI2RlZmluZSBSRVNVTUVfUkxfUEFUVEVSTlNfQUREUiAgICAgICAgICAgICAgICAJKDB4RkUwMDAwKQotI2RlZmluZSBSRVNVTUVfUkxfUEFUVEVSTlNfU0laRSAgICAgICAgICAgICAgICAgKDB4MTAwKQotI2RlZmluZSBSRVNVTUVfVFJBSU5JTkdfVkFMVUVTX0FERFIgICAgICAgICAgICAJKFJFU1VNRV9STF9QQVRURVJOU19BRERSICsgUkVTVU1FX1JMX1BBVFRFUk5TX1NJWkUpCi0jZGVmaW5lIFJFU1VNRV9UUkFJTklOR19WQUxVRVNfTUFYICAgICAgICAgICAgIAkoMHhDRDApCi0jZGVmaW5lIEJPT1RfSU5GT19BRERSIAkJCQkJCQkoUkVTVU1FX1JMX1BBVFRFUk5TX0FERFIgKyAweDEwMDApCi0jZGVmaW5lIENIRUNLU1VNX1JFU1VMVF9BRERSICAgICAgICAgICAgICAgICAgICAoQk9PVF9JTkZPX0FERFIgKyAweDEwMDApCi0jZGVmaW5lIE5VTV9PRl9SRUdJU1RFUl9BRERSIAkJCQkJKENIRUNLU1VNX1JFU1VMVF9BRERSICsgNCkKLSNkZWZpbmUgU1VTUEVORF9NQUdJQ19XT1JEIAkJCQkJCSgweERFQURCMDAyKQotI2RlZmluZSBSRUdJU1RFUl9MSVNUX0VORCAJCQkJCQkoMHhGRkZGRkZGRikKLQogLyogTUlTQyAqLwogI2RlZmluZSBJTlRFUl9SRUdTX0JBU0UJCQkJCQkJMHhEMDAwMDAwMAogCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUb3BvbG9neURlZi5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vZGVidWcuaApzaW1pbGFyaXR5IGluZGV4IDYzJQpjb3B5IGZyb20gdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaApjb3B5IHRvIHRvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2RlYnVnLmgKaW5kZXggZGE4MmUyNC4uNjA2OTIyMiAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2NvbW1vbi9kZWJ1Zy5oCkBAIC0xLDQgKzEsMyBAQAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKIApAQCAtNDMsMTIgKzQyLDEyIEBACiAJICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAKICAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLQkJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotCQlkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKwlkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogCiAgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCi0JCXVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLQkJc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCXVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKwlzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECkBAIC02Miw3OSArNjEsNyBAQAogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9NVl9ERFIzX1RPUE9MT0dZX0RFRl9ICi0jZGVmaW5lIF9NVl9ERFIzX1RPUE9MT0dZX0RFRl9ICiAKKyNkZWZpbmUgTVZfVUFSVF9YTU9ERU1fQUNLX0NIQVIgMHg2CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqVE9QT0xPR1kqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIENPTkZJR19ERFIzCi10eXBlZGVmIGVudW0KLXsKLSAgIFNQRUVEX0JJTl9ERFJfODAwRCwKLSAgIFNQRUVEX0JJTl9ERFJfODAwRSwKLSAgIFNQRUVEX0JJTl9ERFJfMTA2NkUsCi0gICBTUEVFRF9CSU5fRERSXzEwNjZGLAotICAgU1BFRURfQklOX0REUl8xMDY2RywKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0YsCi0gICBTUEVFRF9CSU5fRERSXzEzMzNHLAotICAgU1BFRURfQklOX0REUl8xMzMzSCwKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0osCi0gICBTUEVFRF9CSU5fRERSXzE2MDBHLAotICAgU1BFRURfQklOX0REUl8xNjAwSCwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEosCi0gICBTUEVFRF9CSU5fRERSXzE2MDBLLAotICAgU1BFRURfQklOX0REUl8xODY2SiwKLSAgIFNQRUVEX0JJTl9ERFJfMTg2NkssCi0gICBTUEVFRF9CSU5fRERSXzE4NjZMLAotICAgU1BFRURfQklOX0REUl8xODY2TSwKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM0ssCi0gICBTUEVFRF9CSU5fRERSXzIxMzNMLAotICAgU1BFRURfQklOX0REUl8yMTMzTSwKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM04sCi0KLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0hfRVhULAotICAgU1BFRURfQklOX0REUl8xNjAwS19FWFQsCi0gICBTUEVFRF9CSU5fRERSXzE4NjZNX0VYVAotfU1WX0hXU19TUEVFRF9CSU47Ci0KLXR5cGVkZWYgZW51bSAKLXsKLSAgRERSX0ZSRVFfTE9XX0ZSRVEsCi0gIEREUl9GUkVRXzQwMCwKLSAgRERSX0ZSRVFfNTMzLAotICBERFJfRlJFUV82NjcsCi0gIEREUl9GUkVRXzgwMCwKLSAgRERSX0ZSRVFfOTMzLAotICBERFJfRlJFUV8xMDY2LAotICBERFJfRlJFUV8zMTEsCi0gIEREUl9GUkVRXzMzMywKLSAgRERSX0ZSRVFfNDY3LAotICBERFJfRlJFUV84NTAsCi0gIEREUl9GUkVRXzYwMCwKLSAgRERSX0ZSRVFfMzAwLAotICBERFJfRlJFUV85MDAsCi0gIEREUl9GUkVRXzM2MCwKLSAgRERSX0ZSRVFfMTAwMCwKLSAgIEREUl9GUkVRX0xJTUlUCi19TVZfSFdTX0REUl9GUkVROwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJDRCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJQLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkFTLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkMsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkQxSywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJSRDJLLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UEQsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RGQVcxSywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdEZBVzJLLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190V1RSLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlRQLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190V1IsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RNT0QKLX1zcGVlZEJpblRhYmxlRWxlbWVudHM7Ci0jZW5kaWYgLypDT05GSUdfRERSMyAqLwotI2VuZGlmIC8qIF9NVl9ERFIzX1RPUE9MT0dZX0RFRl9IICovCi0KLQorTVZfU1RBVFVTIG12QmluSGVhZGVyRGVidWdQcm9tcHQodm9pZCk7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Pcy9ndE9zL2d0RW52RGVwLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2NvbW1vbi9ndE9zL2d0RW52RGVwLmgKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvT3MvZ3RPcy9ndEVudkRlcC5oCnJlbmFtZSB0byB0b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2NvbW1vbi9ndE9zL2d0RW52RGVwLmgKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL09zL2d0T3MvZ3RHZW5UeXBlcy5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vZ3RPcy9ndEdlblR5cGVzLmgKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvT3MvZ3RPcy9ndEdlblR5cGVzLmgKcmVuYW1lIHRvIHRvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2d0T3MvZ3RHZW5UeXBlcy5oCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Pcy9ndE9zL212WG9yLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2NvbW1vbi9ndE9zL212WG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL09zL2d0T3MvbXZYb3IuaApyZW5hbWUgdG8gdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vZ3RPcy9tdlhvci5oCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Pcy9ndE9zL212WG9yUmVncy5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vZ3RPcy9tdlhvclJlZ3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvT3MvZ3RPcy9tdlhvclJlZ3MuaApyZW5hbWUgdG8gdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vZ3RPcy9tdlhvclJlZ3MuaApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vbXZEZHIzVG9wb2xvZ3lEZWYuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL212RGRyM1RvcG9sb2d5RGVmLmgKaW5kZXggOTU4NDkyZi4uZGJlNjA0YSAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vbXZEZHIzVG9wb2xvZ3lEZWYuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2NvbW1vbi9tdkRkcjNUb3BvbG9neURlZi5oCkBAIC0xNTEsNiArMTUxLDcgQEAKICAgICBERFJfRlJFUV85MzMsCiAgICAgRERSX0ZSRVFfMTA2NiwKIAlERFJfRlJFUV85MDAsCisJRERSX0ZSRVFfMTAwMCwKICAgICBERFJfRlJFUV9MSU1JVAogfU1WX0hXU19ERFJfRlJFUTsKIApAQCAtMjE4LDcgKzIxOSw3IEBACiAgICAvKiBTcGVlZCBCaW4gVGFibGUqLwogICAgTVZfSFdTX1NQRUVEX0JJTiAgICAgIHNwZWVkQmluSW5kZXg7CiAKLSAgIC8qIGJ1cyB3aWR0aCBvZiBtZW1vcnkgKi8KKyAgIC8qIGJ1cyB3aWR0aCBvZiBtZW1vcnkgZGV2aWNlKi8KICAgIE1WX0hXU19CVVNfV0lEVEggICBidXNXaWR0aDsKIAogICAgLyogQnVzIG1lbW9yeSBzaXplIChNQml0KSAqLwpAQCAtMjQ4LDIxICsyNDksMjggQEAKICAgIC8qIENvbnRyb2xsZXIgY29uZmlndXJhdGlvbiBwZXIgaW50ZXJmYWNlICovCiAgICBJbnRlcmZhY2VQYXJhbXMgICAgICBpbnRlcmZhY2VQYXJhbXNbTUFYX0lOVEVSRkFDRV9OVU1dOwogCi0gICAvKiBCVVMgcGVyIGludGVyZmFjZSAoZGVmYXVsdCBpcyA0KSovCi0gICBNVl9VOCAgICAgICAgICAgICAgIG51bU9mQnVzUGVySW50ZXJmYWNlOwotCi0gICAvKiBCaXQgbWFzayBmb3IgYWN0aXZlIGJ1c2VzKi8KKyAgIC8qIEJpdCBtYXNrIGZvciBhY3RpdmUgYnVzZXMgZGVmaW5lZCBpbnRlcmZhY2Ugd2lkdGggYW5kIEVDQyBjb25maWd1cmF0aW9uKi8KICAgIE1WX1U4ICAgICAgICAgICAgICAgYWN0aXZlQnVzTWFzazsKIAogfSBNVl9IV1NfVE9QT0xPR1lfTUFQOwogCiB0eXBlZGVmIHN0cnVjdAogewotICAgTVZfVTMyICAgICAgICAgICAgICBja0RlbGF5OwotICAgTVZfVTMyICAgICAgICAgICAgICBja0RlbGF5XzE2OwotICAgTVZfVTMyICAgICAgICAgICAgICBQZmluZ2VyOwotICAgTVZfVTMyICAgICAgICAgICAgICBOZmluZ2VyOwotICAgTVZfVTMyICAgICAgICAgICAgICBQaHlSZWczVmFsOworCU1WX1UzMglja0RlbGF5OwkvKnRoZSBkZWxheSBiZXR3ZWVuIGNsb2NrIHRvIEMvQSBmb3IgYnk4IGRldmljZXMqLworCU1WX1UzMglQaHlSZWczVmFsOwkvKkluaXRpYWwgdmFsdWUgb2YgUlggY2VudHJhbGl6YXRpb24gcGh5IHJlZyovCisKKwlNVl9VMzIgZ1pwcmlEYXRhOyAJLypDb250cm9sbGVyIERhdGEgUCBkcml2ZSBzdHJlbmd0aCovCisJTVZfVTMyIGdabnJpRGF0YTsgCS8qQ29udHJvbGxlciBEYXRhIE4gZHJpdmUgc3RyZW5ndGgqLworCU1WX1UzMiBnWnByaUN0cmw7IAkvKkNvbnRyb2xsZXIgQy9BIFAgZHJpdmUgc3RyZW5ndGgqLworCU1WX1UzMiBnWm5yaUN0cmw7IAkvKkNvbnRyb2xsZXIgQy9BIE4gZHJpdmUgc3RyZW5ndGgqLworCU1WX1UzMiBnWnBvZHREYXRhOyAJLypDb250cm9sbGVyIERhdGEgUCBPRFQgYXQgdGhlIHJlY2VpdmUqLworCU1WX1UzMiBnWm5vZHREYXRhOyAJLypDb250cm9sbGVyIERhdGEgTiBPRFQgYXQgdGhlIHJlY2VpdmUqLworCU1WX1UzMiBnWnBvZHRDdHJsOyAJLypDb250cm9sbGVyIEMvQSBQIE9EVCBhdCB0aGUgcmVjZWl2ZSovCisJTVZfVTMyIGdabm9kdEN0cmw7IAkvKkNvbnRyb2xsZXIgQy9BIE4gT0RUIGF0IHRoZSByZWNlaXZlKi8KKwlNVl9VMzIgZ0RpYzsgCQkvKk1lbW9yeSBkcml2ZSBzdHJlbmd0aCovCisJTVZfVTMyIHVpT0RUQ29uZmlnOyAvKk9EVCBQaW4gQ29uZmlndXJhdGlvbiovCisJTVZfVTMyIGdSdHROb207IAkvKk1lbW9yeSBPRFQgYXQgdGhlIHJlY2VpdmUqLworCU1WX1UzMiBnUnR0V1I7IAkJLypNZW1vcnkgT0RUIGF0IHRoZSByZWNlaXZlIGR1cmluZyB3cml0ZSovCiB9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TOwogCiAjZW5kaWYgLyogX0REUjNfVE9QT0xPR1lfQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL212RGRyVG9wb2xvZ3lEZWYuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL212RGRyVG9wb2xvZ3lEZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWU0NGIzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vbXZEZHJUb3BvbG9neURlZi5oCkBAIC0wLDAgKzEsMjc2IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5CitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKwkgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorCQlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisJCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKKwkJdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorCQlzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX0REUjNfVE9QT0xPR1lfQ09ORklHX0gKKyNkZWZpbmUgX0REUjNfVE9QT0xPR1lfQ09ORklHX0gKKworI2RlZmluZSAgICAgIEFERFJfU0laRV81MTJNYiAgICAweDA0MDAwMDAwIAorI2RlZmluZSAgICAgIEFERFJfU0laRV8xR2IgICAgICAweDA4MDAwMDAwCisjZGVmaW5lICAgICAgQUREUl9TSVpFXzJHYiAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgICAgICBBRERSX1NJWkVfNEdiICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSAgICAgIEFERFJfU0laRV84R2IgICAgICAweDQwMDAwMDAwCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKipUT1BPTE9HWSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX0REUjMKKwordHlwZWRlZiBlbnVtCit7CisgICBTUEVFRF9CSU5fRERSXzgwMEQsCisgICBTUEVFRF9CSU5fRERSXzgwMEUsCisgICBTUEVFRF9CSU5fRERSXzEwNjZFLAorICAgU1BFRURfQklOX0REUl8xMDY2RiwKKyAgIFNQRUVEX0JJTl9ERFJfMTA2NkcsCisgICBTUEVFRF9CSU5fRERSXzEzMzNGLAorICAgU1BFRURfQklOX0REUl8xMzMzRywKKyAgIFNQRUVEX0JJTl9ERFJfMTMzM0gsCisgICBTUEVFRF9CSU5fRERSXzEzMzNKLAorICAgU1BFRURfQklOX0REUl8xNjAwRywKKyAgIFNQRUVEX0JJTl9ERFJfMTYwMEgsCisgICBTUEVFRF9CSU5fRERSXzE2MDBKLAorICAgU1BFRURfQklOX0REUl8xNjAwSywKKyAgIFNQRUVEX0JJTl9ERFJfMTg2NkosCisgICBTUEVFRF9CSU5fRERSXzE4NjZLLAorICAgU1BFRURfQklOX0REUl8xODY2TCwKKyAgIFNQRUVEX0JJTl9ERFJfMTg2Nk0sCisgICBTUEVFRF9CSU5fRERSXzIxMzNLLAorICAgU1BFRURfQklOX0REUl8yMTMzTCwKKyAgIFNQRUVEX0JJTl9ERFJfMjEzM00sCisgICBTUEVFRF9CSU5fRERSXzIxMzNOLAorCisgICBTUEVFRF9CSU5fRERSXzEzMzNIX0VYVCwKKyAgIFNQRUVEX0JJTl9ERFJfMTYwMEtfRVhULAorICAgU1BFRURfQklOX0REUl8xODY2TV9FWFQKK31NVl9IV1NfU1BFRURfQklOOworCit0eXBlZGVmIGVudW0gCit7CisgIEREUl9GUkVRX0xPV19GUkVRLAorICBERFJfRlJFUV80MDAsCisgIEREUl9GUkVRXzUzMywKKyAgRERSX0ZSRVFfNjY3LAorICBERFJfRlJFUV84MDAsCisgIEREUl9GUkVRXzkzMywKKyAgRERSX0ZSRVFfMTA2NiwKKyAgRERSX0ZSRVFfMzExLAorICBERFJfRlJFUV8zMzMsCisgIEREUl9GUkVRXzQ2NywKKyAgRERSX0ZSRVFfODUwLAorICBERFJfRlJFUV82MDAsCisgIEREUl9GUkVRXzMwMCwKKyAgRERSX0ZSRVFfOTAwLAorICBERFJfRlJFUV8zNjAsCisgIEREUl9GUkVRXzEwMDAsCisgICBERFJfRlJFUV9MSU1JVAorfU1WX0hXU19ERFJfRlJFUTsKKworI2Vsc2UKK3R5cGVkZWYgZW51bQoreworICAgIFNQRUVEX0JJTl9ERFJfMTYwMEosCisgICAgU1BFRURfQklOX0REUl8xNjAwSywKKyAgICBTUEVFRF9CSU5fRERSXzE2MDBMLAorICAgIFNQRUVEX0JJTl9ERFJfMTg2NkwsCisgICAgU1BFRURfQklOX0REUl8xODY2TSwKKyAgICBTUEVFRF9CSU5fRERSXzE4NjZOLAorICAgIFNQRUVEX0JJTl9ERFJfMjEzM04sCisgICAgU1BFRURfQklOX0REUl8yMTMzUCwKKyAgICBTUEVFRF9CSU5fRERSXzIxMzNSLAorICAgIFNQRUVEX0JJTl9ERFJfMjQwMFAsCisgICAgU1BFRURfQklOX0REUl8yNDAwUiwKKyAgICBTUEVFRF9CSU5fRERSXzI0MDBVLAorfU1WX0hXU19TUEVFRF9CSU47CisKK3R5cGVkZWYgZW51bQoreworICAgIEREUl9GUkVRX0xPV19GUkVRLAorICAgIEREUl9GUkVRXzY2NywKKyAgICBERFJfRlJFUV84MDAsCisgICAgRERSX0ZSRVFfOTMzLAorICAgIEREUl9GUkVRXzEwNjYsCisJRERSX0ZSRVFfOTAwLAorICAgIEREUl9GUkVRX0xJTUlUCit9TVZfSFdTX0REUl9GUkVROworCisjZW5kaWYKKwordHlwZWRlZiBlbnVtCit7CisgICBERFJfQk9BUkRfRVRQLAorICAgRERSX0JPQVJEX0ZVTkNUSU9OQUwsCisgICBERFJfQk9BUkRfQ1VTVE9NRVIsCisgICBERFJfQk9BUkRfTUFYCisKK30gTVZfSFdTX0REUl9CT0FSRDsKKworLyogYnVzIHdpZHRoIGluIGJpdHMgKi8KK3R5cGVkZWYgZW51bSAKK3sKKyAgIEJVU19XSURUSF80LAorICAgQlVTX1dJRFRIXzgsCisgICBCVVNfV0lEVEhfMTYsCisgICBCVVNfV0lEVEhfMzIKKworfSBNVl9IV1NfQlVTX1dJRFRIOworCit0eXBlZGVmIGVudW0gCit7CisgICBNRU1fNTEyTSwKKyAgIE1FTV8xRywKKyAgIE1FTV8yRywKKyAgIE1FTV80RywKKyAgIE1FTV84RywKKworICAgTUVNX1NJWkVfTEFTVAorfU1WX0hXU19NRU1fU0laRTsKKwordHlwZWRlZiBlbnVtCit7CisgICBNVl9IV1NfVEVNUF9MT1csCisgICBNVl9IV1NfVEVNUF9OT1JNQUwsCisgICBNVl9IV1NfVEVNUF9ISUdICisKK31NVl9IV1NfVEVNUEVSVFVSRTsKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgICAvKiBDaGlwIFNlbGVjdCAoQ1MpIGJpdG1hc2sgKGJpdHMgMC1DUzAsIGJpdCAxLSBDUzEgLi4uKSAqLworICAgTVZfVTggICAgICBjc0JpdG1hc2s7CisKKyAgIC8qIG1pcnJvciBlbmFibGUvZGlzYWJsZSAoYml0cyAwLUNTMCBtaXJyb3JpbmcsIGJpdCAxLSBDUzEgbWlycm9yaW5nIC4uLikqLworICAgTVZfQk9PTCAgICAgIG1pcnJvckVuYWJsZUJpdG1hc2s7CisKKyAgIC8qIERRUyBTd2FwIChwb2xhcml0eSkgLSB0cnVlIGlmIGVuYWJsZSovCisgICBNVl9CT09MICAgICAgaXNEcXNTd2FwOworCisgICAvKiBDSyBzd2FwIChwb2xhcml0eSkgLSB0cnVlIGlmIGVuYWJsZSovCisgICBNVl9CT09MICAgICAgaXNDa1N3YXA7CisKK30gQnVzUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdAoreworICAgLyogYnVzIGNvbmZpZ3VyYXRpb24gKi8KKyAgIEJ1c1BhcmFtcyAgIGFzQnVzUGFyYW1zW01BWF9CVVNfTlVNXTsKKworICAgLyogU3BlZWQgQmluIFRhYmxlKi8KKyAgIE1WX0hXU19TUEVFRF9CSU4gICAgICBzcGVlZEJpbkluZGV4OworCisgICAvKiBidXMgd2lkdGggb2YgbWVtb3J5IGRldmljZSovCisgICBNVl9IV1NfQlVTX1dJRFRIICAgYnVzV2lkdGg7CisKKyAgIC8qIEJ1cyBtZW1vcnkgc2l6ZSAoTUJpdCkgKi8KKyAgIE1WX0hXU19NRU1fU0laRSAgICAgIG1lbW9yeVNpemU7CisKKyAgIC8qIFRoZSBERFIgZnJlcXVlbmN5IGZvciBlYWNoIGludGVyZmFjZXMgKi8KKyAgIE1WX0hXU19ERFJfRlJFUSAgICAgIG1lbW9yeUZyZXE7CisKKyAgIC8qIGRlbGF5IENBUyBXcml0ZSBMYXRlbmN5IC0gMCBmb3IgdXNpbmcgZGVmYXVsdCB2YWx1ZSAoamVkZWMgc3VnZ2VzdGVkKSAqLworICAgTVZfVTggICAgICBjYXNXTDsKKworICAgLyogZGVsYXkgQ0FTIExhdGVuY3kgLSAwIGZvciB1c2luZyBkZWZhdWx0IHZhbHVlIChqZWRlYyBzdWdnZXN0ZWQpICovCisgICBNVl9VOCAgICAgIGNhc0w7CisKKyAgIC8qIG9wZXJhdGlvbiB0ZW1wZXJhdHVyZSAqLworICAgTVZfSFdTX1RFTVBFUlRVUkUgICBpbnRlcmZhY2VUZW1wOworCit9IEludGVyZmFjZVBhcmFtczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIE51bWJlciBvZiBpbnRlcmZhY2VzIChkZWZhdWx0IGlzIDEyKSovCisgICAgTVZfVTggICAgICAgICAgICAgIGludGVyZmFjZUFjdGl2ZU1hc2s7CisKKyAgIC8qIENvbnRyb2xsZXIgY29uZmlndXJhdGlvbiBwZXIgaW50ZXJmYWNlICovCisgICBJbnRlcmZhY2VQYXJhbXMgICAgICBpbnRlcmZhY2VQYXJhbXNbTUFYX0lOVEVSRkFDRV9OVU1dOworCisgICAvKiBCaXQgbWFzayBmb3IgYWN0aXZlIGJ1c2VzIGRlZmluZWQgaW50ZXJmYWNlIHdpZHRoIGFuZCBFQ0MgY29uZmlndXJhdGlvbiovCisgICBNVl9VOCAgICAgICAgICAgICAgIGFjdGl2ZUJ1c01hc2s7CisKK30gTVZfSFdTX1RPUE9MT0dZX01BUDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKwlNVl9VMzIJY2tEZWxheTsJLyp0aGUgZGVsYXkgYmV0d2VlbiBjbG9jayB0byBDL0EgZm9yIGJ5OCBkZXZpY2VzKi8KKwlNVl9VMzIJUGh5UmVnM1ZhbDsJLypJbml0aWFsIHZhbHVlIG9mIFJYIGNlbnRyYWxpemF0aW9uIHBoeSByZWcqLworCisJTVZfVTMyIGdacHJpRGF0YTsgCS8qQ29udHJvbGxlciBEYXRhIFAgZHJpdmUgc3RyZW5ndGgqLworCU1WX1UzMiBnWm5yaURhdGE7IAkvKkNvbnRyb2xsZXIgRGF0YSBOIGRyaXZlIHN0cmVuZ3RoKi8KKwlNVl9VMzIgZ1pwcmlDdHJsOyAJLypDb250cm9sbGVyIEMvQSBQIGRyaXZlIHN0cmVuZ3RoKi8KKwlNVl9VMzIgZ1pucmlDdHJsOyAJLypDb250cm9sbGVyIEMvQSBOIGRyaXZlIHN0cmVuZ3RoKi8KKwlNVl9VMzIgZ1pwb2R0RGF0YTsgCS8qQ29udHJvbGxlciBEYXRhIFAgT0RUIGF0IHRoZSByZWNlaXZlKi8KKwlNVl9VMzIgZ1pub2R0RGF0YTsgCS8qQ29udHJvbGxlciBEYXRhIE4gT0RUIGF0IHRoZSByZWNlaXZlKi8KKwlNVl9VMzIgZ1pwb2R0Q3RybDsgCS8qQ29udHJvbGxlciBDL0EgUCBPRFQgYXQgdGhlIHJlY2VpdmUqLworCU1WX1UzMiBnWm5vZHRDdHJsOyAJLypDb250cm9sbGVyIEMvQSBOIE9EVCBhdCB0aGUgcmVjZWl2ZSovCisJTVZfVTMyIGdEaWM7IAkJLypNZW1vcnkgZHJpdmUgc3RyZW5ndGgqLworCU1WX1UzMiB1aU9EVENvbmZpZzsgLypPRFQgUGluIENvbmZpZ3VyYXRpb24qLworCU1WX1UzMiBnUnR0Tm9tOyAJLypNZW1vcnkgT0RUIGF0IHRoZSByZWNlaXZlKi8KKwlNVl9VMzIgZ1J0dFdSOyAJCS8qTWVtb3J5IE9EVCBhdCB0aGUgcmVjZWl2ZSBkdXJpbmcgd3JpdGUqLworfSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNUzsKKworI2VuZGlmIC8qIF9ERFIzX1RPUE9MT0dZX0NPTkZJR19IICovCisKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzh4L2RkcjNfYTM4eC5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzh4L2RkcjNfYTM4eC5oCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMjY2MzBjYi4uOTA0YTJkZQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOHgvZGRyM19hMzh4LmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzh4L2RkcjNfYTM4eC5oCkBAIC03MSwyNSArNzEsNTYgQEAKICNpbmNsdWRlICJkZHIzX2h3c19od190cmFpbmluZ19kZWYuaCIKIAogLypBbGxvdyB0b3BvbGd5IHVwZGF0ZSBmcm9tIGJvYXJkIFRXU0kgZGV2aWNlKi8KLSNpZiAhZGVmaW5lZChDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCkKKyNpZiAoICghZGVmaW5lZChDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCkpICYmIGRlZmluZWQoQ09ORklHX0REUjMpICkKKy8qVEJEIC0gQ3VycmVudHJ5IDE2Qml0IG1vZGUgbm90IHN1cHBvcnRlZCBpbiBERFI0LCBvcGVuIHRoaXMgZGVmaW5lIGFmdGVyIDE2Qml0IG1vZGUgdmFsaWRhdGlvbiovCiAjZGVmaW5lIE1WX0REUl9UT1BPTE9HWV9VUERBVEVfRlJPTV9UV1NJCiAjZW5kaWYKIAorI2RlZmluZSBDT05GSUdfQVZTX0ZST01fRUZVU0UgLyogUmVhZCBwcmUtYnVybnQgRUZVU0UgdmFsdWVzLCB0byBkZXJpdmUgcmVxdWVzdGVkIEFWUyB2YWx1ZSBmb3IgY3VycmVudCBjaGlwICovCiAjZGVmaW5lIEVDQ19TVVBQT1JUCiAKIC8qQ29udHJvbGVyIGJ1cyBkaXZpZGVyIDEgZm9yIDMyIGJpdCwgMiBmb3IgNjQgYml0Ki8KICNkZWZpbmUgTVZfRERSX0NPTlRST0xMRVJfQlVTX1dJRFRIX01VTFRJUExJRVIJCTEKIAogLypUdW5lIGludGVybmFsIHRyYWluaW5nIHBhcmFtcyB2YWx1ZXMqLwotI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19DS19ERUxBWSAJCTE2MAotI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19DS19ERUxBWV8xNgkJMTYwCi0jZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BGSU5HRVIJCQk0MQotI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19ORklOR0VSCQkJNDMKLSNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUEhZUkVHM1ZBTAkJMHhBCisjaWZkZWYgQ09ORklHX0NMRUFSRk9HX0JPQVJECisJLyogU29saWRSdW4gQXJtYWRhIDM4eCBNaWNyb1NPTSBoYXMgc2hvcnQgdHJhY2VzIG9uIGl0J3MgRERSIGNsb2NrLgorCSAgIHVzaW5nIGluY3JlYXNlZCBpbnRlcm5hbCBkZWxheSBpbnNpZGUgdGhlIFNvQyB0byBjb21wZW5zYXRlIGZvciB0aGF0ICovCisJI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19DS19ERUxBWSAJMjYwCisjZWxzZQorCSNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfQ0tfREVMQVkgCTE2MAorI2VuZGlmCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BIWVJFRzNWQUwJMHhBCisKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUFJJX0RBVEEJMTIzCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX05SSV9EQVRBCTEyMworI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QUklfQ1RSTAk3NAorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19OUklfQ1RSTAk3NAorCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BfT0RUX0RBVEEJNDUKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfTl9PRFRfREFUQQk0NQorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QX09EVF9DVFJMCTQ1CisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX05fT0RUX0NUUkwJNDUKKworI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19ESUMJCQkJMHgyCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX09EVF9DT05GSUdfMkNTCTB4MTIwMDEyCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX09EVF9DT05GSUdfMUNTCTB4MTAwMDAKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUlRUX05PTQkJCTB4NDQKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUlRUX1dSXzFDUwkJMHgwCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1JUVF9XUl8yQ1MJCTB4MAorCisjaWZkZWYgQ09ORklHX0REUjQKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUF9PRFRfREFUQV9ERFI0CTB4RAorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19ESUNfRERSNAkJMHgwCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX09EVF9DT05GSUdfRERSNAkweDMzMDAxMgorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19SVFRfTk9NX0REUjQJMHg2MDAgLypSWlEvMyA9IDB4NjAwKi8KKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUlRUX1dSCQkJMHg0MDAgLypSWlEvMSA9IDB4NDAwKi8KKyNlbHNlCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1JUVF9XUgkJMHgwIC8qb2ZmKi8KKyNlbmRpZgogCiAjZGVmaW5lIE1BUlZFTExfQk9BUkQgTUFSVkVMTF9CT0FSRF9JRF9CQVNFCiAKLQogI2RlZmluZSBSRUdfREVWSUNFX1NBUjFfQUREUiAgICAgICAgICAgICAgICAgICAgICAgIDB4RTQyMDQKICNkZWZpbmUgUlNUMl9DUFVfRERSX0NMT0NLX1NFTEVDVF9JTl9PRkZTRVQgICAgICAgICAxNwogI2RlZmluZSBSU1QyX0NQVV9ERFJfQ0xPQ0tfU0VMRUNUX0lOX01BU0sgICAgICAgICAgIDB4MUYKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM4eC9kZHIzX2EzOHhfdG9wb2xvZ3kuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM4eC9kZHIzX2EzOHhfdG9wb2xvZ3kuaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDQ2ZWQxMTkuLjNhYzU1ODAKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzh4L2RkcjNfYTM4eF90b3BvbG9neS5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM4eC9kZHIzX2EzOHhfdG9wb2xvZ3kuaApAQCAtNjgsMTUgKzY4LDQxIEBACiAjaW5jbHVkZSAibXZEZHIzTG9nZ2luZ0RlZi5oIgogCiAvKkJ1cyBtYXNrIHZhcmlhbnRzKi8KLSNkZWZpbmUgQlVTX01BU0tfMzJCSVQJCQkJMHhGCi0jZGVmaW5lIEJVU19NQVNLXzMyQklUX0VDQwkJCTB4MUYKLSNkZWZpbmUgQlVTX01BU0tfMTZCSVQJCQkJMHgzCi0jZGVmaW5lIEJVU19NQVNLXzE2QklUX0VDQwkJCTB4MTMKLSNkZWZpbmUgQlVTX01BU0tfMTZCSVRfRUNDX1BVUDMJCTB4QgorI2RlZmluZSBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQJCQkJMHhGCisjZGVmaW5lIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVF9FQ0MJCQkweDFGCisjZGVmaW5lIElOVEVSRkFDRV9CVVNfTUFTS18xNkJJVAkJCQkweDMKKyNkZWZpbmUgSU5URVJGQUNFX0JVU19NQVNLXzE2QklUX0VDQwkJCTB4MTMKKyNkZWZpbmUgSU5URVJGQUNFX0JVU19NQVNLXzE2QklUX0VDQ19QVVAzCQkweEIKIAogI2RlZmluZSAgRFlOQU1JQ19DU19TSVpFX0NPTkZJRwogI2RlZmluZSAgRElTQUJMRV9MMl9GSUxURVJJTkdfRFVSSU5HX0REUl9UUkFJTklORwogCisjaWZkZWYgQ09ORklHX0REUjMKKwkjZGVmaW5lIFNQRUVEX0JJTl9ERFJfQ1VTVF9CT0FSRF8xCVNQRUVEX0JJTl9ERFJfMTg2NkwKKwkjZGVmaW5lIEJVU19XSURUSF9DVVNUX0JPQVJEXzEJCUJVU19XSURUSF84CisJI2RlZmluZSBTUEVFRF9CSU5fRERSX0NVU1RfQk9BUkRfMglTUEVFRF9CSU5fRERSXzE4NjZMCisJI2RlZmluZSBCVVNfV0lEVEhfQ1VTVF9CT0FSRF8yCQlCVVNfV0lEVEhfOAorCSNkZWZpbmUgU1BFRURfQklOX0REUl9DTEVBUkZPR19CT0FSRAlTUEVFRF9CSU5fRERSXzE2MDBLCisJI2RlZmluZSBCVVNfV0lEVEhfQ0xFQVJGT0dfQk9BUkQJQlVTX1dJRFRIXzE2CisKKwkjZGVmaW5lIFNQRUVEX0JJTl9ERFJfREJfNjhYWAkJU1BFRURfQklOX0REUl8xODY2TAorCSNkZWZpbmUgQlVTX1dJRFRIX0RCXzY4WFgJCQlCVVNfV0lEVEhfOAorCSNkZWZpbmUgU1BFRURfQklOX0REUl9EQl9CUF82ODIxCVNQRUVEX0JJTl9ERFJfMTg2NkwKKwkjZGVmaW5lIEJVU19XSURUSF9EQl9CUF82ODIxCQlCVVNfV0lEVEhfOAorI2Vsc2UKKy8qRWxwaWRhIGJ5IDE2IGlzIDI0MDBSIE1pY3JvbiBieSA4IGlzIDIxMzNQIFNhbXN1bmcgYnkgMTYgaXMgMjEzM1AgSHludXggYnkxNiBpcyAyMTMzUCovCisJI2RlZmluZSBTUEVFRF9CSU5fRERSX0NVU1RfQk9BUkRfMQlTUEVFRF9CSU5fRERSXzI0MDBSCisJI2RlZmluZSBCVVNfV0lEVEhfQ1VTVF9CT0FSRF8xCQlCVVNfV0lEVEhfMTYKKwkjZGVmaW5lIFNQRUVEX0JJTl9ERFJfQ1VTVF9CT0FSRF8yCVNQRUVEX0JJTl9ERFJfMjQwMFIKKwkjZGVmaW5lIEJVU19XSURUSF9DVVNUX0JPQVJEXzIJCUJVU19XSURUSF8xNgorCisJI2RlZmluZSBTUEVFRF9CSU5fRERSX0RCXzY4WFgJCVNQRUVEX0JJTl9ERFJfMjQwMFIKKwkjZGVmaW5lIEJVU19XSURUSF9EQl82OFhYCQkJQlVTX1dJRFRIXzE2CisJI2RlZmluZSBTUEVFRF9CSU5fRERSX0RCX0JQXzY4MjEJU1BFRURfQklOX0REUl8yNDAwUgorCSNkZWZpbmUgQlVTX1dJRFRIX0RCX0JQXzY4MjEJCUJVU19XSURUSF8xNgorI2VuZGlmCisKKwogI2lmZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDdXN0b21lciBCb2FyZHMgVG9wb2xvZ3kgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX0hXU19UT1BPTE9HWV9NQVAgVG9wb2xvZ3lNYXBbXSA9CkBAIC04NCwyNiArMTEwLDMwIEBACiAgICAgLyogMXN0IEN1c3RvbWVyIGJvYXJkIC0gcmVmZXJlbmNlIGZyb20gREIgKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCi0Je3t7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKwl7e3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH19LCBTUEVFRF9CSU5fRERSX0NVU1RfQk9BUkRfMSwgQlVTX1dJRFRIX0NVU1RfQk9BUkRfMSAsIE1FTV80RywgRERSX0ZSRVFfODAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKLSAgICAvKiAybmQgQ3VzdG9tZXIgYm9hcmQgKi8KKyAgICAvKiAybmQgQ3VzdG9tZXIgYm9hcmQgIC0gR1AgQm9hcmQqLwogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KLQl7e3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZMLCBCVVNfV0lEVEhfOCAsIE1FTV80RywgRERSX0ZSRVFfODAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICBCVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworCXt7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfQ1VTVF9CT0FSRF8yLCBCVVNfV0lEVEhfQ1VTVF9CT0FSRF8yICwgTUVNXzRHLCBERFJfRlJFUV84MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICB9LAorICAgIC8qIDNyZCBDdXN0b21lciBib2FyZCAgLSAgU29saWRSdW4gQ2xlYXJGb2ctQTEgUkVWMi4wICovCisgICAgeworICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKwl7e3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH19LCBTUEVFRF9CSU5fRERSX0NMRUFSRk9HX0JPQVJELCBCVVNfV0lEVEhfQ0xFQVJGT0dfQk9BUkQgLCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAorICAgIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCiAgICAgLyogR0ZDSDEwMCAqLwogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KIAl7e3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE2MDBLLCBCVVNfV0lEVEhfOCAsIE1FTV8yRywgRERSX0ZSRVFfNDAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICBCVVNfTUFTS18zMkJJVF9FQ0MgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVRfRUNDICAvKiBCdXNlcyBtYXNrICovCiAgICAgfQogfTsKIApAQCAtMTEyLDcyICsxNDIsNTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1hcnZlbGwgQm9hcmRzIFRvcG9sb2d5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9IV1NfVE9QT0xPR1lfTUFQIFRvcG9sb2d5TWFwW10gPQogewotICAgIC8qIDFzdCBNYXJ2ZWxsIGJvYXJkIC0gUkRfTkFTICovCisgICAgLyogTWFydmVsbCBib2FyZCAtIEJvYXJkX0lEID0gUkRfTkFTXzY4WFhfSUQgPSAwKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCiAJe3t7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAotI2lmZGVmIENPTkZJR19ERFIzCi0gICAgLyogMm5kIE1hcnZlbGwgYm9hcmQgLSBEQiAoRERSMykgKi8KKyAgICAvKiBNYXJ2ZWxsIGJvYXJkIC0gQm9hcmRfSUQgPSBEQl82OFhYX0lEID0gMSAoRERSMy80KSovCiAgICAgewogICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwotCXt7e3sweDMsMiwwLDB9LCB7MHgzLDIsMCwwfSwgezB4MywyLDAsMH0sIHsweDMsMiwwLDB9LCB7MHgzLDIsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2NkwsIEJVU19XSURUSF84ICwgTUVNXzRHLCBERFJfRlJFUV84MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKLSAgICA1LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIEJVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisJe3t7ezB4MywyLDAsMH0sIHsweDMsMiwwLDB9LCB7MHgzLDIsMCwwfSwgezB4MywyLDAsMH0sIHsweDMsMiwwLDB9fSwgU1BFRURfQklOX0REUl9EQl82OFhYLCBCVVNfV0lEVEhfREJfNjhYWCAsIE1FTV80RywgRERSX0ZSRVFfODAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKLSNlbHNlCi0gICAgLyogMm5kIE1hcnZlbGwgYm9hcmQgLSBEQiAoRERSNCkgKi8KKyAgICAvKiBNYXJ2ZWxsIGJvYXJkIC0gQm9hcmRfSUQgPSBSRF9BUF82OFhYX0lEID0gMiAqLwogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KLSAgICB7e3t7MHgxLDAsMCwwfSx7IDB4MSwwLDAsMH0seyAweDEsMCwwLDB9LHsgMHgxLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzUCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KLSAgICB9LAotI2VuZGlmCi0gICAgLyogM3JkIE1hcnZlbGwgYm9hcmQgLSBSRF9BUCAqLwotICAgIHsKLSAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KIAl7e3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZMLCBCVVNfV0lEVEhfOCAsIE1FTV80RywgRERSX0ZSRVFfODAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICBCVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLworICAgIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCi0gICAgLyogNHJkIE1hcnZlbGwgYm9hcmQgLSBEQl9BUCAqLworICAgIC8qIE1hcnZlbGwgYm9hcmQgLSBCb2FyZF9JRCA9IERCX0FQXzY4WFhfSUQgPSAzICovCiAgICAgewogICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwogCXt7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2NkwsIEJVU19XSURUSF84ICwgTUVNXzRHLCBERFJfRlJFUV84MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKLSAgICA1LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIEJVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKLSAgICAvKiA1dGggTWFydmVsbCBib2FyZCAtIERCX0dQICovCisgICAgLyogTWFydmVsbCBib2FyZCAtIEJvYXJkX0lEID0gREJfR1BfNjhYWF9JRCA9IDQgKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCiAJe3t7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAotICAgIC8qIDZ0aCBNYXJ2ZWxsIGJvYXJkIC0gQTM4MS8yIERCLUJQICovCisgICAgLyogTWFydmVsbCBib2FyZCAtIEJvYXJkX0lEID0gREJfQlBfNjgyMV9JRCA9IDUgKEREUjMvNCkgKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCi0Je3t7ezB4MSwweDEsMCwwfSwgezB4MSwweDEsMCwwfSwgezB4MSwweDEsMCwwfSwgezB4MSwweDEsMCwwfSwgezB4MSwweDEsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2NkwsIEJVU19XSURUSF84ICwgTUVNXzRHLCBERFJfRlJFUV84MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKLSAgICA1LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIEJVU19NQVNLXzE2QklUICAvKiBCdXNlcyBtYXNrICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisJe3t7ezB4MSwweDEsMCwwfSwgezB4MSwweDEsMCwwfSwgezB4MSwweDEsMCwwfSwgezB4MSwweDEsMCwwfSwgezB4MSwweDEsMCwwfX0sIFNQRUVEX0JJTl9ERFJfREJfQlBfNjgyMSwgQlVTX1dJRFRIX0RCX0JQXzY4MjEsIE1FTV80RywgRERSX0ZSRVFfODAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzE2QklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKLQkvKiA2dGggTWFydmVsbCBib2FyZCAtIERCX0FNQyAqLworCS8qIE1hcnZlbGwgYm9hcmQgLSBCb2FyZF9JRCA9IERCX0FNQ182ODIwX0lEID0gNiAqLwogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KIAl7e3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZMLCBCVVNfV0lEVEhfOCAsIE1FTV80RywgRERSX0ZSRVFfODAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLQlCVVNfTUFTS18zMkJJVF9FQ0MgIC8qIEJ1c2VzIG1hc2sgKi8KKwlJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAogfTsKICNlbmRpZiAvKiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzh4L2RkcjNfYTM4eF92YXJzLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOHgvZGRyM19hMzh4X3ZhcnMuaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDIxZjBmMjYuLjdiNTExMzUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzh4L2RkcjNfYTM4eF92YXJzLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzh4L2RkcjNfYTM4eF92YXJzLmgKQEAgLTY2LDcgKzY2LDEwIEBACiAjZGVmaW5lIF9JTkNfQTM4WF9WQVJTX0gKIAogI2luY2x1ZGUgImRkcjNfYTM4eF9tY19zdGF0aWMuaCIKLSNpbmNsdWRlICJtdkRkcjNUb3BvbG9neURlZi5oIgorI2luY2x1ZGUgIm12RGRyVG9wb2xvZ3lEZWYuaCIKKworLyogdG8gcnVuIEREUiB2aWV3ZXIgdG9vbCAoaW5jbHVkaW5nIEJJU1QpIHVuY29tbWVudCB0aGUgZGVmaW5lCisjZGVmaW5lIE1WX1JVTl9XSU5fVkFMSURBVElPTl9URVNUICovCiAKIHR5cGVkZWYgc3RydWN0IF9fbXZEcmFtTW9kZXMgewogICAgIGNoYXIgKm1vZGVfbmFtZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM4eC9kZHJfYTM4eF9kbGJfY29uZmlnLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOHgvZGRyX2EzOHhfZGxiX2NvbmZpZy5oCmluZGV4IDQ0YTNjNmQuLmIwMzE4MGYgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM4eC9kZHJfYTM4eF9kbGJfY29uZmlnLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzh4L2Rkcl9hMzh4X2RsYl9jb25maWcuaApAQCAtNjUsNjIgKzY1LDQzIEBACiAjZGVmaW5lIF9JTkNfQTM4WF9ETEJfQ09ORklHX0gKIAogI2luY2x1ZGUgImRkcjNfaHdzX2h3X3RyYWluaW5nX2RlZi5oIgorCiAjaWZkZWYgQ09ORklHX0REUjQKLS8qIGZvciBhMzl4IFogYW5kIEEzOHggQTAgKi8KLU1WX0RSQU1fRExCX0NPTkZJRyBkZHIzRGxiQ29uZmlnVGFibGVfQTBbXSA9CitNVl9EUkFNX0RMQl9DT05GSUcgZGRyM0RsYkNvbmZpZ1RhYmxlW10gPQogewotICAgICAge1JFR19TVEFUSUNfRFJBTV9ETEJfQ09OVFJPTCwgCSAJMHgyMDAwMDA1Rn0sCi0gICAgICB7RExCX0JVU19PUFRJTUlaQVRJT05fV0VJR0hUU19SRUcsIAkweDAwODgwMDAwfSwKLQkgIHtETEJfQUdJTkdfUkVHSVNURVIsIAkJCQkJMHgzRjdGMDA3Rn0sCi0JICB7RExCX0VWSUNUSU9OX0NPTlRST0xfUkVHLCAJCQkweDAwMDAxMjlGfSwKLSAgICAgIHtETEJfRVZJQ1RJT05fVElNRVJTX1JFR0lTVEVSX1JFRywgCTB4MDBGRjAwMDB9LAotICAgICAge0RMQl9CVVNfV0VJR0hUU19ESUZGX0NTLCAJCQkweDA0MDMwODAzfSwKLSAgICAgIHtETEJfQlVTX1dFSUdIVFNfRElGRl9CRywJCQkJMHgwMDAwMEEwMn0sCi0gICAgICB7RExCX0JVU19XRUlHSFRTX1NBTUVfQkcsIAkJCTB4MDgwMDA5MDF9LAotICAgICAge0RMQl9CVVNfV0VJR0hUU19SRF9XUiwgIAkJCQkweDAwMDIwMDA1fSwKLSAgICAgIHtETEJfQlVTX1dFSUdIVFNfQVRUUl9TWVNfUFJJTywgCQkweDAwMDYwRjEwfSwKLSAgICAgIHtETEJfTUFJTl9RVUVVRV9NQVAsCQkJCQkweDAwMDAwNTQzfSwKLSAgICAgIHtETEJfTElORV9TUExJVCwgCQkJCQkJMHgwMDAwMDAwRn0sCi0gICAgICB7RExCX1VTRVJfQ09NTUFORF9SRUcsICAJCQkJMHgwMDAwMDAwMH0sCi0gICAgICB7MHgwLCAweDB9CisJe1JFR19TVEFUSUNfRFJBTV9ETEJfQ09OVFJPTCwgCSAJMHgyMDAwMDA1Rn0sCisJe0RMQl9CVVNfT1BUSU1JWkFUSU9OX1dFSUdIVFNfUkVHLCAJMHgwMDg4MDAwMH0sCisJe0RMQl9BR0lOR19SRUdJU1RFUiwgCQkJCTB4M0Y3RjAwN0Z9LAorCXtETEJfRVZJQ1RJT05fQ09OVFJPTF9SRUcsIAkJCTB4MDAwMDEyOUZ9LAorCXtETEJfRVZJQ1RJT05fVElNRVJTX1JFR0lTVEVSX1JFRywgCTB4MDBGRjAwMDB9LAorCXtETEJfQlVTX1dFSUdIVFNfRElGRl9DUywgCQkJMHgwNDAzMDgwM30sCisJe0RMQl9CVVNfV0VJR0hUU19ESUZGX0JHLAkJCTB4MDAwMDBBMDJ9LAorCXtETEJfQlVTX1dFSUdIVFNfU0FNRV9CRywgCQkJMHgwODAwMDkwMX0sCisJe0RMQl9CVVNfV0VJR0hUU19SRF9XUiwgIAkJCTB4MDAwMjAwMDV9LAorCXtETEJfQlVTX1dFSUdIVFNfQVRUUl9TWVNfUFJJTywgCTB4MDAwNjBGMTB9LAorCXtETEJfTUFJTl9RVUVVRV9NQVAsCQkJCTB4MDAwMDA1NDN9LAorCXtETEJfTElORV9TUExJVCwgCQkJCQkweDAwMDAwMDBGfSwKKwl7RExCX1VTRVJfQ09NTUFORF9SRUcsICAJCQkweDAwMDAwMDAwfSwKKyAgICB7MHgwLCAweDB9CiB9OwogI2Vsc2UKIE1WX0RSQU1fRExCX0NPTkZJRyBkZHIzRGxiQ29uZmlnVGFibGVbXSA9CiB7Ci0Je1JFR19TVEFUSUNfRFJBTV9ETEJfQ09OVFJPTCwgMHgyMDAwMDA1Q30sCi0Je0RMQl9CVVNfT1BUSU1JWkFUSU9OX1dFSUdIVFNfUkVHLCAgMHgwMDg4MDAwMH0sCi0Je0RMQl9BR0lOR19SRUdJU1RFUiwgIDB4MEY3RjAwN0Z9LAotCXtETEJfRVZJQ1RJT05fQ09OVFJPTF9SRUcsICAgMHgwMDAwMTI5Rn0sCi0Je0RMQl9FVklDVElPTl9USU1FUlNfUkVHSVNURVJfUkVHLCAgMHgwMEZGMDAwMH0sCi0Je0RMQl9CVVNfV0VJR0hUU19ESUZGX0NTLCAweDA0MDMwODAyfSwKLQl7RExCX0JVU19XRUlHSFRTX0RJRkZfQkcsIDB4MDAwMDBBMDJ9LAotCXtETEJfQlVTX1dFSUdIVFNfU0FNRV9CRywgMHgwOTAwMEEwMX0sCi0Je0RMQl9CVVNfV0VJR0hUU19SRF9XUiwgMHgwMDAyMDAwNX0sCi0Je0RMQl9CVVNfV0VJR0hUU19BVFRSX1NZU19QUklPLDB4MDAwNjBGMTB9LAotCXtETEJfTUFJTl9RVUVVRV9NQVAsIDB4MDAwMDA1NDN9LAotCXtETEJfTElORV9TUExJVCwweDAwMDAwMDAwfSwKLQl7RExCX1VTRVJfQ09NTUFORF9SRUcsIDB4MDAwMDAwMDB9LAotCXsweDAsIDB4MH0KLX07Ci0KLU1WX0RSQU1fRExCX0NPTkZJRyBkZHIzRGxiQ29uZmlnVGFibGVfQTBbXSA9Ci17Ci0Je1JFR19TVEFUSUNfRFJBTV9ETEJfQ09OVFJPTCwgMHgyMDAwMDA1Q30sCi0Je0RMQl9CVVNfT1BUSU1JWkFUSU9OX1dFSUdIVFNfUkVHLCAweDAwODgwMDAwfSwKLQl7RExCX0FHSU5HX1JFR0lTVEVSLDB4MEY3RjAwN0Z9LAotCXtETEJfRVZJQ1RJT05fQ09OVFJPTF9SRUcsMHgwMDAwMTI5Rn0sCi0Je0RMQl9FVklDVElPTl9USU1FUlNfUkVHSVNURVJfUkVHLDB4MDBGRjAwMDB9LAotCXtETEJfQlVTX1dFSUdIVFNfRElGRl9DUywweDA0MDMwODAyfSwKLQl7RExCX0JVU19XRUlHSFRTX0RJRkZfQkcsMHgwMDAwMEEwMn0sCi0Je0RMQl9CVVNfV0VJR0hUU19TQU1FX0JHLDB4MDkwMDBBMDF9LAotCXtETEJfQlVTX1dFSUdIVFNfUkRfV1IsMHgwMDAyMDAwNX0sCi0Je0RMQl9CVVNfV0VJR0hUU19BVFRSX1NZU19QUklPLDB4MDAwNjBGMTB9LAotCXtETEJfTUFJTl9RVUVVRV9NQVAsMHgwMDAwMDU0M30sCi0Je0RMQl9MSU5FX1NQTElULDB4MDAwMDAwMDB9LAotCXtETEJfVVNFUl9DT01NQU5EX1JFRywweDAwMDAwMDAwfSwKKwl7UkVHX1NUQVRJQ19EUkFNX0RMQl9DT05UUk9MLCAJCTB4MjAwMDAwNUN9LAorCXtETEJfQlVTX09QVElNSVpBVElPTl9XRUlHSFRTX1JFRywgCTB4MDA4ODAwMDB9LAorCXtETEJfQUdJTkdfUkVHSVNURVIsCQkJCTB4MEY3RjAwN0Z9LAorCXtETEJfRVZJQ1RJT05fQ09OVFJPTF9SRUcsCQkJMHgwMDAwMTI5Rn0sCisJe0RMQl9FVklDVElPTl9USU1FUlNfUkVHSVNURVJfUkVHLAkweDAwRkYwMDAwfSwKKwl7RExCX0JVU19XRUlHSFRTX0RJRkZfQ1MsCQkJMHgwNDAzMDgwMn0sCisJe0RMQl9CVVNfV0VJR0hUU19ESUZGX0JHLAkJCTB4MDAwMDBBMDJ9LAorCXtETEJfQlVTX1dFSUdIVFNfU0FNRV9CRywJCQkweDA5MDAwQTAxfSwKKwl7RExCX0JVU19XRUlHSFRTX1JEX1dSLAkJCQkweDAwMDIwMDA1fSwKKwl7RExCX0JVU19XRUlHSFRTX0FUVFJfU1lTX1BSSU8sCQkweDAwMDYwRjEwfSwKKwl7RExCX01BSU5fUVVFVUVfTUFQLAkJCQkweDAwMDAwNTQzfSwKKwl7RExCX0xJTkVfU1BMSVQsCQkJCQkweDAwMDAwMDAwfSwKKwl7RExCX1VTRVJfQ09NTUFORF9SRUcsCQkJCTB4MDAwMDAwMDB9LAogCXsweDAsIDB4MH0KIH07CiAjZW5kaWYKIAotCiAjZW5kaWYgLyogX0lOQ19BMzhYX0RMQl9DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzl4L2RkcjNfYTM5eF90b3BvbG9neS5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzl4L2RkcjNfYTM5eF90b3BvbG9neS5oCmluZGV4IDQ1ZjI2NmEuLmU0NTdmZWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM5eC9kZHIzX2EzOXhfdG9wb2xvZ3kuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOXgvZGRyM19hMzl4X3RvcG9sb2d5LmgKQEAgLTY4LDExICs2OCwxMSBAQAogI2luY2x1ZGUgIm12RGRyM0xvZ2dpbmdEZWYuaCIKIAogLypCdXMgbWFzayB2YXJpYW50cyovCi0jZGVmaW5lIEJVU19NQVNLXzMyQklUCQkJCTB4RgotI2RlZmluZSBCVVNfTUFTS18zMkJJVF9FQ0MJCQkweDFGCi0jZGVmaW5lIEJVU19NQVNLXzE2QklUCQkJCTB4MwotI2RlZmluZSBCVVNfTUFTS18xNkJJVF9FQ0MJCQkweDEzCi0jZGVmaW5lIEJVU19NQVNLXzE2QklUX0VDQ19QVVAzCQkweEIKKyNkZWZpbmUgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUCQkJCTB4RgorI2RlZmluZSBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVRfRUNDCQkJMHgxRgorI2RlZmluZSBJTlRFUkZBQ0VfQlVTX01BU0tfMTZCSVQJCQkJMHgzCisjZGVmaW5lIElOVEVSRkFDRV9CVVNfTUFTS18xNkJJVF9FQ0MJCQkweDEzCisjZGVmaW5lIElOVEVSRkFDRV9CVVNfTUFTS18xNkJJVF9FQ0NfUFVQMwkJMHhCCiAKICNkZWZpbmUgIERZTkFNSUNfQ1NfU0laRV9DT05GSUcKICNkZWZpbmUgIERJU0FCTEVfTDJfRklMVEVSSU5HX0RVUklOR19ERFJfVFJBSU5JTkcKQEAgLTg0LDE4ICs4NCwxNiBAQAogICAgIC8qIDFzdCBDdXN0b21lciBib2FyZCAtIHJlZmVyZW5jZSBmcm9tIERCICovCiAgICAgewogICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwogCXt7e3sweDEsMCwwLDB9LHsgMHgxLDAsMCwwfSx7IDB4MiwxLDAsMH0seyAweDIsMSwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZMLCBCVVNfV0lEVEhfOCAsIE1FTV80RywgRERSX0ZSRVFfODAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICBCVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLworICAgIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCiAgICAgLyogMm5kIEN1c3RvbWVyIGJvYXJkICovCiAgICAgewogICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwogCXt7e3sweDEsMCwwLDB9LHsgMHgxLDAsMCwwfSx7IDB4MiwxLDAsMH0seyAweDIsMSwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZMLCBCVVNfV0lEVEhfOCAsIE1FTV80RywgRERSX0ZSRVFfODAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICBCVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLworICAgIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0KIH07CiAKQEAgLTEwNywyMyArMTA1LDIxIEBACiAgICAgLyogMXN0IE1hcnZlbGwgYm9hcmQgLSBSRF9OQVMgKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCiAJe3t7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAogI2Vsc2UKICAgICAvKiAybmQgTWFydmVsbCBib2FyZCAtIERCIChERFI0KSAqLwogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KLS8qRWxwaWRhIGJ5IDE2IGlzIDI0MDBSCi0JTWljcm9uIGJ5IDggaXMgMjEzM1AKLQlzYW1zdW5nIGJ5IDE2IGlzIFhYWAotCUh5bnV4IGJ5MTYgaXMgMjEzM1AqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworLyoJRWxwaWRhIAlieTE2IAlpcyAyNDAwUgorCU1pY3JvbiAJYnk4IAlpcyAyMTMzUAorCXNhbXN1bmcgYnkxNiAJaXMgMjEzM1AKKwlIeW51eCAJYnkxNiAJaXMgMjEzM1AqLwogICAgIHt7e3sweDMsMiwwLDB9LHsgMHgzLDIsMCwwfSx7IDB4MywyLDAsMH0seyAweDMsMiwwLDB9LCB7MHgzLDIgLDAsMH19LCBTUEVFRF9CSU5fRERSXzI0MDBSLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfODAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICBCVVNfTUFTS18zMkJJVF9FQ0MgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVRfRUNDICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKICNlbmRpZgogCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOXgvZGRyM19hMzl4X3ZhcnMuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM5eC9kZHIzX2EzOXhfdmFycy5oCmluZGV4IGJkNTc1ZWUuLmQwNGQxZjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM5eC9kZHIzX2EzOXhfdmFycy5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM5eC9kZHIzX2EzOXhfdmFycy5oCkBAIC02Niw3ICs2Niw3IEBACiAjZGVmaW5lIF9JTkNfQTM5WF9WQVJTX0gKIAogI2luY2x1ZGUgImRkcjNfYTM5eF9tY19zdGF0aWMuaCIKLSNpbmNsdWRlICJtdkRkcjNUb3BvbG9neURlZi5oIgorI2luY2x1ZGUgIm12RGRyVG9wb2xvZ3lEZWYuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgX19tdkRyYW1Nb2RlcyB7CiAgICAgY2hhciAqbW9kZV9uYW1lOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19hYzMuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYWMzLmgKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAyOWZhZmQ3Li5jNTc1M2ZkCi0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYWMzLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19hYzMuaApAQCAtNjQsMTMgKzY0LDEzIEBACiAjaWZuZGVmIF9ERFIzX01TWVNfQUMzX0gKICNkZWZpbmUgX0REUjNfTVNZU19BQzNfSAogCi0jZGVmaW5lIE1BWF9JTlRFUkZBQ0VfTlVNICAJCSgxMikKLSNkZWZpbmUgTUFYX0JVU19OVU0gICAgICAgIAkJKDgpCisjZGVmaW5lIE1BWF9JTlRFUkZBQ0VfTlVNICAJCSgxKQorI2RlZmluZSBNQVhfQlVTX05VTSAgICAgICAgCQkoNSkKIAogI2luY2x1ZGUgImRkcjNfaHdzX2h3X3RyYWluaW5nX2RlZi5oIgogCi0vKkNvbnRyb2xlciBidXMgZGl2aWRlciAxIGZvciAzMiBiaXQsIDIgZm9yIDY0IGJpdCovCi0jZGVmaW5lIE1WX0REUl9DT05UUk9MTEVSX0JVU19XSURUSF9NVUxUSVBMSUVSCQkxCisvKkNvbnRyb2xlciBidXMgZGl2aWRlciAxIGZvciAzMiBiaXQsIDIgZm9yIDY0IGJpdCAqLworI2RlZmluZSBNVl9ERFJfQ09OVFJPTExFUl9CVVNfV0lEVEhfTVVMVElQTElFUiAgICAgICAgIDEKIAogLyogTUlTQyAqLwogI2RlZmluZSBJTlRFUl9SRUdTX0JBU0UJCQkJCQkJCTB4RDAwMDAwMDAKQEAgLTEwMiw3ICsxMDIsNyBAQAogI2RlZmluZQlSRUdfU0FNUExFX1JFU0VUX0NQVV9BUkNIX09GRlMJCQkzMQogI2RlZmluZQlSRUdfU0FNUExFX1JFU0VUX0hJR0hfQ1BVX0ZSRVFfT0ZGUwkJMjAKIAotI2RlZmluZSBNVl9CT0FSRF9SRUZDTEsJCQkyNTAwMDAwMDAKKyNkZWZpbmUgTVZfQk9BUkRfUkVGQ0xLCQkJbXZCb2FyZFRjbGtHZXQoKQogCiAvKiBERFIzIEZyZXF1ZW5jaWVzOiAqLwogI2RlZmluZSBERFJfMTAwCQkJCQkJCQkJMApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19hYzNfY29uZmlnLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2FjM19jb25maWcuaAppbmRleCA1YTkzNzg5Li4zMzE0YjA5IDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2FjM19jb25maWcuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2FjM19jb25maWcuaApAQCAtNjIsMTMgKzYyLDkgQEAKIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KICNpZm5kZWYgX0REUjNfTVNZU19BQzNfQ09ORklHX0gKICNkZWZpbmUgX0REUjNfTVNZU19BQzNfQ09ORklHX0gKIAotI2RlZmluZSBERFIzX0ZBU1RfUEFUSF9FTgkJCTEKLSNkZWZpbmUgU1VQUE9SVF9TVEFUSUNfRFVOSVRfQ09ORklHCi0KICNlbmRpZiAvKiBfRERSM19NU1lTX0FDM19DT05GSUdfSCAqLwogCisKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYWMzX3RvcG9sb2d5LmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2FjM190b3BvbG9neS5oCmluZGV4IDg3MjFmZWYuLjQzZTBiNzkgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYWMzX3RvcG9sb2d5LmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19hYzNfdG9wb2xvZ3kuaApAQCAtNjgsMTUgKzY4LDE2IEBACiAjaW5jbHVkZSAibXZEZHIzTG9nZ2luZ0RlZi5oIgogCiAvKkJ1cyBtYXNrIHZhcmlhbnRzKi8KLSNkZWZpbmUgQlVTX01BU0tfMzJCSVQJCQkJMHhGCi0jZGVmaW5lIEJVU19NQVNLXzMyQklUX0VDQwkJCTB4MUYKLSNkZWZpbmUgQlVTX01BU0tfMTZCSVQJCQkJMHgzCi0jZGVmaW5lIEJVU19NQVNLXzE2QklUX0VDQwkJCTB4MTMKLSNkZWZpbmUgQlVTX01BU0tfMTZCSVRfRUNDX1BVUDMJCTB4QgorI2RlZmluZSBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQJCQkJMHhGCisjZGVmaW5lIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVF9FQ0MJCQkweDFGCisjZGVmaW5lIElOVEVSRkFDRV9CVVNfTUFTS18xNkJJVAkJCQkweDMKKyNkZWZpbmUgSU5URVJGQUNFX0JVU19NQVNLXzE2QklUX0VDQwkJCTB4MTMKKyNkZWZpbmUgSU5URVJGQUNFX0JVU19NQVNLXzE2QklUX0VDQ19QVVAzCQkweEIKIAogI2RlZmluZSAgRFlOQU1JQ19DU19TSVpFX0NPTkZJRwogI2RlZmluZSAgTVZfREVWSUNFX01BWF9EUkFNX0FERFJFU1NfU0laRSAgICAgICAgICBBRERSX1NJWkVfMkdiCiAKKwogI2lmZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDdXN0b21lciBCb2FyZHMgVG9wb2xvZ3kgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX0hXU19UT1BPTE9HWV9NQVAgVG9wb2xvZ3lNYXBbXSA9CkBAIC04NSwxOSArODYsMTcgQEAKICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwogCS8qIEFUVEVOVElPTiAtIGNzX21hc2sgYW5kIG1pcnJvciAgSEFWRSB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIFBVUHMqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCiAJe3t7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgzLDAsMCwwfSwgezB4MywwLDAsMH0sIHsweDAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzQwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMTZCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMTZCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAogICAgIC8qIDJuZCBDdXN0b21lciBib2FyZCAqLwogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCiAJLyogQVRURU5USU9OIC0gY3NfbWFzayBhbmQgbWlycm9yICBIQVZFIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgUFVQcyovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KIAl7e3t7MHgxLDAsMCwwfSx7IDB4MSwwLDAsMH0seyAweDIsMSwwLDB9LHsgMHgyLDEsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzQwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMTZCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMTZCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9CiB9OwogCkBAIC0xMDksNDYgKzEwOCw0MSBAQAogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCiAJLyogQVRURU5USU9OIC0gY3NfbWFzayBhbmQgbWlycm9yICBIQVZFIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgUFVQcyovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgc3BlZWRfYmluICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgIHNwZWVkX2JpbiAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCiAJe3t7ezB4MywyLDAsMH0sIHsweDMsMiwwLDB9LHsweDMsMiwwLDB9LCB7MHgzLDIsMCwwfSwgezB4MywyLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZMLCBCVVNfV0lEVEhfOCAsIE1FTV80RywgRERSX0ZSRVFfNDAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICBCVVNfTUFTS18xNkJJVCAgLyogQnVzZXMgbWFzayAqLworICAgIElOVEVSRkFDRV9CVVNfTUFTS18xNkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCiAJLyogMnJkIE1hcnZlbGwgYm9hcmQgLSBSRF9NVExfNFhHICAoQm9hcmRJZCA9IDB4MSkgKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwogCS8qIEFUVEVOVElPTiAtIGNzX21hc2sgYW5kIG1pcnJvciAgSEFWRSB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIFBVUHMqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KIAl7e3t7MHgxLDAsMCwwfSx7IDB4MSwwLDAsMH0sezB4MSwwLDAsMH0seyAweDEsMCwwLDB9LHsgMHgxLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2NkwsIEJVU19XSURUSF84ICwgTUVNXzRHLCBERFJfRlJFUV80MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKLSAgICA1LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIEJVU19NQVNLXzE2QklUICAvKiBCdXNlcyBtYXNrICovCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzE2QklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKIAkvKiAzcmQgTWFydmVsbCBib2FyZCAtIFJEX01UTF8yWFhHXzJYRzogTm8gRUNDIChCb2FyZElkID0gMHgyKSAqLwogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCiAJLyogQVRURU5USU9OIC0gY3NfbWFzayBhbmQgbWlycm9yICBIQVZFIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgUFVQcyovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwogCXt7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2NkwsIEJVU19XSURUSF84ICwgTUVNXzRHLCBERFJfRlJFUV80MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKLSAgICA1LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIEJVU19NQVNLXzE2QklUICAvKiBCdXNlcyBtYXNrICovCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzE2QklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKICAgICAvKiA0dGggTWFydmVsbCBib2FyZCAtIERCX01JU0xfMjRHNEcgLSBObyBFQ0MgKEJvYXJkSWQgPSAweDMpICovCiAgICAgewogICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KIAkvKiBBVFRFTlRJT04gLSBjc19tYXNrIGFuZCBtaXJyb3IgIEhBVkUgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBQVVBzKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICBzcGVlZF9iaW4gICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgc3BlZWRfYmluICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KIAl7e3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZMLCBCVVNfV0lEVEhfOCAsIE1FTV80RywgRERSX0ZSRVFfNDAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICBCVVNfTUFTS18xNkJJVCAgLyogQnVzZXMgbWFzayAqLworICAgIElOVEVSRkFDRV9CVVNfTUFTS18xNkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCiAgICAgLyogNXRoIE1hcnZlbGwgYm9hcmQgLSBSRF9NVExfMjRHIC0gTm8gRUNDIChCb2FyZElkID0gMHg0KSAqLwogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCiAJLyogQVRURU5USU9OIC0gY3NfbWFzayBhbmQgbWlycm9yICBIQVZFIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgUFVQcyovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgc3BlZWRfYmluICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgIHNwZWVkX2JpbiAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCiAJe3t7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzQwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMTZCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMTZCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAogfTsKICNlbmRpZiAvKiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19hYzNfdmFycy5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19hYzNfdmFycy5oCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYWZkMWJkMy4uZjhkZDE4NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2FjM192YXJzLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19hYzNfdmFycy5oCkBAIC02Nyw3ICs2Nyw3IEBACiAKICNpbmNsdWRlICJkZHIzX21zeXNfYWMzX2NvbmZpZy5oIgogI2luY2x1ZGUgImRkcjNfbXN5c19hYzNfbWNfc3RhdGljLmgiCi0jaW5jbHVkZSAibXZEZHIzVG9wb2xvZ3lEZWYuaCIKKyNpbmNsdWRlICJtdkRkclRvcG9sb2d5RGVmLmgiCiAKICNpZiAhZGVmaW5lZChDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCkKICNkZWZpbmUgTVZfRERSX1RPUE9MT0dZX1VQREFURV9GUk9NX1RXU0kKQEAgLTc3LDExICs3NywyNSBAQAogCiAvKlR1bmUgaW50ZXJuYWwgdHJhaW5pbmcgcGFyYW1zIHZhbHVlcyovCiAjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX0NLX0RFTEFZIAkJMjAwCi0jZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX0NLX0RFTEFZXzE2CQkyMDAKLSNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUEZJTkdFUgkJCTQxCi0jZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX05GSU5HRVIJCQk0MwogI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QSFlSRUczVkFMCQkweEEKIAorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QUklfREFUQQkxMjMKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfTlJJX0RBVEEJMTIzCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BSSV9DVFJMCTc0CisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX05SSV9DVFJMCTc0CisKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUF9PRFRfREFUQQk0NQorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19OX09EVF9EQVRBCTQ1CisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BfT0RUX0NUUkwJNDUKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfTl9PRFRfQ1RSTAk0NQorCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX0RJQwkJCQkweDIKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfT0RUX0NPTkZJR18yQ1MJMHgxMjAwMTIKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfT0RUX0NPTkZJR18xQ1MJMHgxMDAwMAorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19SVFRfTk9NCQkJMHg0NAorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19SVFRfV1JfMUNTCQkweDAgLyogb2ZmICovCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1JUVF9XUl8yQ1MJCTB4MCAvKiBvZmYgKi8KKwogdHlwZWRlZiBzdHJ1Y3QgX19tdkRyYW1Nb2RlcyB7CiAgICAgY2hhciAqbW9kZV9uYW1lOwogICAgIE1WX1U4IGNwdUZyZXE7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2JjMi5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19iYzIuaAppbmRleCBiZmMzY2M2Li40MzI3NjExIDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2JjMi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYmMyLmgKQEAgLTY1LDEzICs2NSwxMyBAQAogI2lmbmRlZiBfRERSM19NU1lTX0JDMl9ICiAjZGVmaW5lIF9ERFIzX01TWVNfQkMyX0gKIAotI2RlZmluZSBNQVhfSU5URVJGQUNFX05VTSAgCQkoMTIpCi0jZGVmaW5lIE1BWF9CVVNfTlVNICAgICAgICAJCSg4KQorI2RlZmluZSBNQVhfSU5URVJGQUNFX05VTSAgCQkoNSkKKyNkZWZpbmUgTUFYX0JVU19OVU0gICAgICAgIAkJKDUpCiAKICNpbmNsdWRlICJkZHIzX2h3c19od190cmFpbmluZ19kZWYuaCIKIAotLypDb250cm9sZXIgYnVzIGRpdmlkZXIgMSBmb3IgMzIgYml0LCAyIGZvciA2NCBiaXQqLwotI2RlZmluZSBNVl9ERFJfQ09OVFJPTExFUl9CVVNfV0lEVEhfTVVMVElQTElFUgkJMgorLypDb250cm9sZXIgYnVzIGRpdmlkZXIgMSBmb3IgMzIgYml0LCAyIGZvciA2NCAgYml0ICovCisjZGVmaW5lIE1WX0REUl9DT05UUk9MTEVSX0JVU19XSURUSF9NVUxUSVBMSUVSICAgICAgICAgMgogCiAvKiBNSVNDICovCiAjZGVmaW5lIElOVEVSX1JFR1NfQkFTRQkJCQkJCQkJMHhEMDAwMDAwMApAQCAtMTA0LDcgKzEwNCw3IEBACiAjZGVmaW5lCVJFR19TQU1QTEVfUkVTRVRfQ1BVX0FSQ0hfT0ZGUwkJCTMxCiAjZGVmaW5lCVJFR19TQU1QTEVfUkVTRVRfSElHSF9DUFVfRlJFUV9PRkZTCQkyMAogCi0jZGVmaW5lIE1WX0JPQVJEX1JFRkNMSwkJCTI1MDAwMDAwMAorI2RlZmluZSBNVl9CT0FSRF9SRUZDTEsJCQltdkJvYXJkVGNsa0dldCgpCiAKIC8qIEREUjMgRnJlcXVlbmNpZXM6ICovCiAjZGVmaW5lIEREUl8xMDAJCQkJCQkJCQkwCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2JjMl90b3BvbG9neS5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19iYzJfdG9wb2xvZ3kuaAppbmRleCA4YzlmNDRjLi4wNDlmZTgwIDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2JjMl90b3BvbG9neS5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYmMyX3RvcG9sb2d5LmgKQEAgLTY4LDQ3ICs2OCwzNCBAQAogI2luY2x1ZGUgImRkcjNfbXN5c19iYzJfY29uZmlnLmgiCiAjaW5jbHVkZSAibXZEZHIzTG9nZ2luZ0RlZi5oIgogCi0jZGVmaW5lIEFDVFVBTF9CVVNfV0lEVEgJQlVTX1dJRFRIXzMyCisjZGVmaW5lIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVCAgICAgICAweEYKKyNkZWZpbmUgRFlOQU1JQ19DU19TSVpFX0NPTkZJRwogCiAjaWZkZWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEN1c3RvbWVyIEJvYXJkcyBUb3BvbG9neSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfSFdTX1RPUE9MT0dZX01BUCBUb3BvbG9neU1hcFtdID0gIHt7CiAgICAgLyogMXN0IEN1c3RvbWVyIGJvYXJkICByZWZlcmVuY2VkIGZyb20gTUFydmVsbCBEQiBib2FyZCovCiAgICAgMHgxMCwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwotIHsgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwLCAgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH19ICwKLSAgICA0LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIDB4RiAgLyogQnVzZXMgbWFzayAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyB7ICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIH0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgfSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIH0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorIH0gLAorICAgIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCiAgICAgLyogMm5kIEN1c3RvbWVyIGJvYXJkICByZWZlcmVuY2UgZnJvbSBNQXJ2ZWxsIFJEIGJvYXJkKi8KIHsKICAgICAweDEwLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAjMSovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KLSB7ICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCwgICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9fSAsCi0gICAgNCwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICAweEYgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgeyAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgfSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIH0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgfSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKK30gLAorICAgIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCiB9OwogCkBAIC0xMTcsNDEgKzEwNCwzOCBAQAogTVZfSFdTX1RPUE9MT0dZX01BUCBUb3BvbG9neU1hcFtdID0gIHt7CiAgICAgLyogMXN0IE1hcnZlbGwgYm9hcmQgKi8KICAgICAweDEwLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCi0geyAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAsICAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfX0gLAotICAgIDQsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgMHhGICAvKiBCdXNlcyBtYXNrICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworIHsgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgfSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIH0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgfSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIH0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCit9ICwKKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAogICAgIC8qIDJuZCBNYXJ2ZWxsIGJvYXJkICovCiB7CiAgICAgMHgxMCwgLyogYWN0aXZlIGludGVyZmFjZXMgIzEqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCi0geyAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAsICAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfX0gLAotICAgIDQsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgMHhGICAvKiBCdXNlcyBtYXNrICovCi0gICAgfQorICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyB7ICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIH0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgfSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIH0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorIH0gLAorICAgIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLworICAgIH0sCisgICAgLyogM3JkIE1hcnZlbGwgYm9hcmQgKi8KK3sKKyAgICAweDEwLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAjMSovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgeyAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH19ICwKKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICB9LAogfTsKIAogI2VuZGlmIC8qIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUICovCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2JjMl92YXJzLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2JjMl92YXJzLmgKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBkMTQxN2RhLi42MzRhNjcxCi0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYmMyX3ZhcnMuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2JjMl92YXJzLmgKQEAgLTY2LDE1ICs2NiwyOSBAQAogI2RlZmluZSBfSU5DX01TWVNfQkMyX1ZBUlNfSAogCiAjaW5jbHVkZSAiZGRyM19tc3lzX2JjMl9jb25maWcuaCIKLSNpbmNsdWRlICJtdkRkcjNUb3BvbG9neURlZi5oIgorI2luY2x1ZGUgIm12RGRyVG9wb2xvZ3lEZWYuaCIKIAogLypUdW5lIGludGVybmFsIHRyYWluaW5nIHBhcmFtcyB2YWx1ZXMqLwogI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19DS19ERUxBWSAJCTE1MAotI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19DS19ERUxBWV8xNgkJMTUwCi0jZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BGSU5HRVIJCQk0MQotI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19ORklOR0VSCQkJNDMKICNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUEhZUkVHM1ZBTAkJMHhBCiAKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUFJJX0RBVEEJMTIzCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX05SSV9EQVRBCTEyMworI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QUklfQ1RSTAk3NAorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19OUklfQ1RSTAk3NAorCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BfT0RUX0RBVEEJNDUKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfTl9PRFRfREFUQQk0NQorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QX09EVF9DVFJMCTQ1CisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX05fT0RUX0NUUkwJNDUKKworI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19ESUMJCQkJMHgyCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX09EVF9DT05GSUdfMkNTCTB4MTIwMDEyCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX09EVF9DT05GSUdfMUNTCTB4MTAwMDAKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUlRUX05PTQkJCTB4NDQKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUlRUX1dSXzFDUwkJMHgyMDAgLypSWlEvNCovCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1JUVF9XUl8yQ1MJCTB4MjAwIC8qUlpRLzQqLworCiB0eXBlZGVmIHN0cnVjdCBfX212RHJhbU1jSW5pdCB7CiAJTVZfVTMyIHJlZ19hZGRyOwogCU1WX1UzMiByZWdfdmFsdWU7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvbWFpbi9tdmRpc3BhY2hlci5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL21haW4vbXZkaXNwYWNoZXIuYwppbmRleCA0NmMxZjhiLi5kMjIwMTNkIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvbWFpbi9tdmRpc3BhY2hlci5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9tYWluL212ZGlzcGFjaGVyLmMKQEAgLTY1LDE0ICs2NSwzNSBAQAogI2luY2x1ZGUgIm12X29zLmgiCiAjaW5jbHVkZSAibXZVYXJ0LmgiCiAjaW5jbHVkZSAibXZCaW5IZHJDb21wb25lbnRzLmgiCisjaW5jbHVkZSAicHJpbnRmLmgiCisKKyNpZmRlZiBNVl9ERUJVR19NT0RFCisjaW5jbHVkZSAiZGVidWcuaCIKKyNlbmRpZgogCiBNVl9CSU5BUllfSEVBREVSX0NPTVBPTkVOVFMgY29tcG9uZW50VGFibGVbXT17IEJJTl9IRUFERVJfQ09NUE9ORU5UX1RBQkxFfTsKIAorI2lmZGVmIE1WX0RFQlVHX01PREUKK3N0YXRpYyB2b2lkIHByaW50X21lbnUoKSB7CisJbXZQcmludGYoIlxuUGxlYXNlIGNob29zZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb21tYW5kczpcbiIpOworCW12UHJpbnRmKCJcdDEuU0VSREVTIGluaXRpYWxpemF0aW9uXG4iKTsKKwltdlByaW50ZigiXHQyLkRSQU0gaW5pdGlhbGl6YXRpb25cbiIpOworCW12UHJpbnRmKCJcdDMuU3VzcGVuZCB3YWtlIHVwXG4iKTsKKwltdlByaW50ZigiXHQ0LlByb21wdCBtb2RlXG4iKTsKKwltdlByaW50ZigiXHRcdFNlbGVjdGVkIGNvbW1hbmQgbnVtYmVyOiIpOworfQorI2VuZGlmCisKIGludCBtdkJpbkhkckRpc3BhdGNoZXIodm9pZCkKIHsKLQlNVl9TVEFUVVMgcmM7CiAJTVZfQklOQVJZX0hFQURFUl9DT01QT05FTlRTICpwQ29tcG9uZW50PSBjb21wb25lbnRUYWJsZTsKKwlNVl9TVEFUVVMgcmM7CisjaWZkZWYgTVZfREVCVUdfTU9ERQorCWludCBpOworCWNoYXIgYzsKKyNlbmRpZgogCisjaWZuZGVmIE1WX0RFQlVHX01PREUKICAgICB3aGlsZSAocENvbXBvbmVudC0+Q29tcG9uZW50RnVuYyl7CiAJCXJjID0gcENvbXBvbmVudC0+Q29tcG9uZW50RnVuYygpOwogCQlpZiAocmMgIT0gTVZfT0spCkBAIC04NSw1ICsxMDYsMzcgQEAKIAkJfQogCQlwQ29tcG9uZW50Kys7CiAJfQorI2Vsc2UKKwkvKiBSdW4gR2VuZXJhbEluaXQgY29tcG9uZW50CisJICogbmVlZGVkIGZvciBnZW5lcmVhbCBNUFAncyAoaS5lIFVBUlQsIEkyQywgZXRjLikgKi8KKwlpZiAocENvbXBvbmVudC0+Q29tcG9uZW50RnVuYykKKwkJcENvbXBvbmVudC0+Q29tcG9uZW50RnVuYygpOworCS8qIHNlbmQgQUNLcyB0byB0aGUgc2VuZGVyIHRvIGZpbmlzaCBzeC1hdDkxIHByb3RvY29sIHJ1bm5pbmcKKwkgKiBhbmQgc3RhcnQgdXNpbmcgVUFSVCBmb3IgcHJpbnRzCisJICogMyBBQ0tTIGFyZSByZXF1aXJlZCB0byBmaW5pc2ggdHJhbnNhY3Rpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKQorCQltdlVhcnRQdXRjKE1WX1VBUlRfWE1PREVNX0FDS19DSEFSKTsKKwkvKiBnZXQgdGhlIGxhc3QgY2hhciBzZW50IGJ5IHRoZSBwcm90b2NvbCAoRU9UKSAqLworCW12VWFydEdldGMoKTsKKworCXdoaWxlICgxKSB7CisJCXByaW50X21lbnUoKTsKKwkJYyA9IG12VWFydEdldGMoKTsKKworCQlpZiAoYyA+PSAnMScgJiYgYyA8PSAnMycpIHsKKwkJCXBDb21wb25lbnQgPSBjb21wb25lbnRUYWJsZSArIChjIC0gJzAnKTsKKwkJCWlmIChwQ29tcG9uZW50LT5Db21wb25lbnRGdW5jKSB7CisJCQkJcmMgPSBwQ29tcG9uZW50LT5Db21wb25lbnRGdW5jKCk7CisJCQkJaWYgKHJjICE9IE1WX09LKQorCQkJCQltdlByaW50ZigiXG5cbiAqKioqKioqKioqICVzIGZhaWxlZCEgKioqKioqKioqKiIsIHBDb21wb25lbnQtPkNvbXBvbmVudE5hbWUpOworCQkJfQorCQl9IGVsc2UgaWYgKGMgPT0gJzQnKSB7CisJCQlyYyA9IG12QmluSGVhZGVyRGVidWdQcm9tcHQoKTsKKwkJCWlmIChyYyAhPSBNVl9PSykKKwkJCQltdlByaW50ZigiXG5cbiAqKioqKioqKioqIEJpbmFyeSBIZWFkZXIgRGVidWcgUHJvbXB0IGZhaWxlZCEgKioqKioqKioqKiIpOworCQl9IGVsc2UKKwkJCW12UHJpbnRmKCJcblxuSW52YWxpZCBjb21tYW5kIG51bWJlclxuIik7CisJfQorI2VuZGlmCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vTWFrZWZpbGUgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vTWFrZWZpbGUKaW5kZXggOWJhMWViMC4uYzE5NmJlZiAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL01ha2VmaWxlCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9NYWtlZmlsZQpAQCAtNzAsMTQgKzcwLDE3IEBACiAKIFRHVCA9IHBsYXQuYQogVEdUX1VBUlQgPSBwbGF0LnVhcnQuYQorVEdUX0RFQlVHID0gcGxhdC5kZWJ1Zy5hCiAKIERSViA9IGRyaXZlcnMKIFVUSUxTID0gdXRpbHMKIFNZU19FTlYgPSBzeXNFbnYvJChCT0FSRCkKK0JJTl9IRFJfREVCVUcgPSAkKFVUSUxTKS9kZWJ1ZwogCiBDU1JDX0RSViA9ICQoRFJWKS9tdl91YXJ0LmMgJChEUlYpL212X3R3c2kuYyAkKERSVikvbXZfdGltZS5jCiBDU1JDX1VUSUxTID0gJChVVElMUykvdXRpbHMuYyAkKFVUSUxTKS9wcmludGYuYyAkKFVUSUxTKS9tdkh3c1NpbGljb25JZi5jCiBDU1JDX1NZU19FTlYgPSAkKFNZU19FTlYpL212U3lzRW52TGliLmMKK0NTUkNfQklOX0hEUl9ERUJVRyA9ICQoQklOX0hEUl9ERUJVRykvZGVidWcuYyAkKEJJTl9IRFJfREVCVUcpL2xpYl91dGlscy5jICQoQklOX0hEUl9ERUJVRykvY29tbWFuZC5jICQoQklOX0hEUl9ERUJVRykvbWVtLmMgJChCSU5fSERSX0RFQlVHKS94b3JfbWVtdGVzdC5jCiAKIGlmZXEgIiQoQ09ORklHX0FMTEVZQ0FUMykiICAieSIKICAgQ1NSQ19VVElMUyArPSAkKFVUSUxTKS9tdl9zZXFfZXhlY19leHQuYwpAQCAtOTgsMTEgKzEwMSwxNCBAQAogZW5kaWYKIAogQ1NSQyA9ICQoQ1NSQ19EUlYpICQoQ1NSQ19VVElMUykgJChDU1JDX1NZU19FTlYpCitDU1JDX0RFQlVHID0gJChDU1JDKSAkKENTUkNfQklOX0hEUl9ERUJVRykKIAogQ09CSiA9ICQoc3Vic3QgLmMsLm8sJChDU1JDKSkKIENVQVJUX09CSiA9ICQoc3Vic3QgLmMsLnVhcnQubywkKENTUkMpKQorQ0RFQlVHX09CSiA9ICQoc3Vic3QgLmMsLmRlYnVnLm8sJChDU1JDX0RFQlVHKSkKIAotYWxsOiAgICQoVEdUKSAkKFRHVF9VQVJUKQorCithbGw6ICAgJChUR1QpICQoVEdUX1VBUlQpICQoVEdUX0RFQlVHKQogCiAlLm86ICUuYwogCSQoQ0MpICQoQ0ZMQUdTKSAkKENQUEZMQUdTKSAtYyAtbyAkQCAkPApAQCAtMTEwLDYgKzExNiw5IEBACiAlLnVhcnQubzogJS5jCiAJJChDQykgJChDRkxBR1MpIC1ETk9UX1VTRV9VQVJUIC1ETVZfTk9fSU5QVVQgLURNVl9OT19QUklOVCAgJChDUFBGTEFHUykgLWMgLW8gICRAICQ8CiAKKyUuZGVidWcubzogJS5jCisJJChDQykgJChDRkxBR1MpICQoQ1BQRkxBR1MpIC1jIC1vICAkQCAkPAorCiAkKFRHVCk6ICQoQ09CSikKIAlhciByY3MgJChUR1QpICAkKENPQkopCiAJJChDUCkgLi8kQCAuLi8KQEAgLTExOCw2ICsxMjcsMTAgQEAKIAlhciByY3MgJChUR1RfVUFSVCkgICQoQ1VBUlRfT0JKKQogCSQoQ1ApIC4vJEAgLi4vCiAKKyQoVEdUX0RFQlVHKTogJChDREVCVUdfT0JKKQorCWFyIHJjcyAkKFRHVF9ERUJVRykgICQoQ0RFQlVHX09CSikKKwkkKENQKSAuLyRAIC4uLworCiBzZXRwYXJhbXM6CiAJJChIT1NUQ0MpICQoQk9BUkRGTEFHKSAtV2FsbCAkKElOQ0xVREUpICQoQ1BQRkxBR1MpIC1vICRAICAkKGFkZHN1ZmZpeCAuYywgJChVVElMUykvJEApCiAJJChDUCkgJEAgLi4vCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vZHJpdmVycy9tdl90aW1lLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vZHJpdmVycy9tdl90aW1lLmMKaW5kZXggNzJmY2E0NS4uNzY1NjQ3YiAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL2RyaXZlcnMvbXZfdGltZS5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9kcml2ZXJzL212X3RpbWUuYwpAQCAtNjMsNiArNjMsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlICJjb25maWdfbWFydmVsbC5oIiAgICAgLyogUmVxdWlyZWQgdG8gaWRlbnRpZnkgU09DIGFuZCBCb2FyZCAqLwogI2luY2x1ZGUgIm12X29zLmgiCisjaW5jbHVkZSAibXZTeXNFbnZMaWIuaCIKICNpZiBkZWZpbmVkKE1WODhGNzhYNjApCiAjaW5jbHVkZSAiZGRyM19heHAuaCIKICNlbGlmIGRlZmluZWQoTVY4OEY2NzEwKQpAQCAtODcsNyArODgsNiBAQAogI2VuZGlmCiAjZGVmaW5lIFVCT09UX0NOVFIgICAgICAgICAgICAgIDAgICAgICAgLyogY291bnRlciB0byB1c2UgZm9yIHVib290IHRpbWVyICAwLDEgKi8KIAotCiB2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlYykKIHsKICAgICB1bnNpZ25lZCBsb25nIGRlbGF5dGlja3M7CkBAIC0xMDQsNyArMTA0LDExIEBACiAgICAgY250bXJDdHJsID0gTVZfUkVHX1JFQUQoQ05UTVJfQ1RSTF9SRUcoVUJPT1RfQ05UUikpOwogICAgIGNudG1yQ3RybCAmPSB+Q1RDUl9BUk1fVElNRVJfQVVUT19FTihVQk9PVF9DTlRSKTsKICAgICBjbnRtckN0cmwgfD0gQ1RDUl9BUk1fVElNRVJfRU4oVUJPT1RfQ05UUik7Ci0gICAgY250bXJDdHJsIHw9IENUQ1JfQVJNX1RJTUVSXzI1TWh6RlJRX0VOKFVCT09UX0NOVFIpOworCisJLyogY2hlY2sgaWYgMjVNaHogYXMgcmVmIGNsb2NrIGlzIHN1cHBvcnRlZCBieSBTb0MgKi8KKwlpZiAobXZTeXNFbnZUaW1lcklzUmVmQ2xrMjVNaHooKSkKKwkJY250bXJDdHJsIHw9IENUQ1JfQVJNX1RJTUVSXzI1TWh6RlJRX0VOKFVCT09UX0NOVFIpOworCiAgICAgTVZfUkVHX1dSSVRFKENOVE1SX0NUUkxfUkVHKFVCT09UX0NOVFIpLGNudG1yQ3RybCk7CiAKICAgICB3aGlsZShNVl9SRUdfUkVBRChDTlRNUl9WQUxfUkVHKFVCT09UX0NOVFIpKSk7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2EzNzAvbXZTeXNFbnZMaWIuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM3MC9tdlN5c0VudkxpYi5jCmluZGV4IDc0Mzc0NjcuLjIwNmE4NWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM3MC9tdlN5c0VudkxpYi5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM3MC9tdlN5c0VudkxpYi5jCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM3NS9tdlN5c0VudkxpYi5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hMzc1L212U3lzRW52TGliLmMKaW5kZXggMWEwZGFmMC4uOWEyMTNhNiAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hMzc1L212U3lzRW52TGliLmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hMzc1L212U3lzRW52TGliLmMKQEAgLTMwNywzICszMDcsMTEgQEAKIAl2YWx1ZSA9IE1WX1JFR19SRUFEKERFVl9WRVJTSU9OX0lEX1JFRyk7CiAJcmV0dXJuICAoKHZhbHVlICYgKFJFVklTT05fSURfTUFTSykgKSA+PiBSRVZJU09OX0lEX09GRlMpOwogfQorCisvKiBtdlN5c0VudlRpbWVySXNSZWZDbGsyNU1oejoKKyAqIEEzNzUgc3VwcG9ydCAyNU1oeiBhcyByZWYuY2xvY2sgZm9yIHRpbWVyCisgKi8KK01WX0JPT0wgbXZTeXNFbnZUaW1lcklzUmVmQ2xrMjVNaHoodm9pZCkKK3sKKwlyZXR1cm4gTVZfVFJVRTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM3NS9tdlN5c0VudkxpYi5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hMzc1L212U3lzRW52TGliLmgKaW5kZXggMWVjM2I5ZC4uMjk4NDUyOSAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hMzc1L212U3lzRW52TGliLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hMzc1L212U3lzRW52TGliLmgKQEAgLTI3Nyw1ICsyNzcsMTUgQEAKIE1WX1NUQVRVUyBtdkJvYXJkVHdzaUdldChNVl9VMzIgYWRkcmVzcywgTVZfVTggZGV2TnVtLCBNVl9VOCByZWdOdW0sIE1WX1U4ICpwRGF0YSk7CiBNVl9VMzIgbXZCb2FyZElkSW5kZXhHZXQoTVZfVTMyIGJvYXJkSWQpOwogTVZfVTMyIG12Qm9hcmRJZEdldChNVl9WT0lEKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbXZTeXNFbnZUaW1lcklzUmVmQ2xrMjVNaHogLQorICoKKyAqIERFU0NSSVBUSU9OOiAgICAgICAgICBSb3V0aW5lIHRvIGluZGljYXRlIGlmIDI1TWh6IHJlZiBjbG9jayBmb3IgdGltZXIgaXMgc3VwcG9ydGVkCisgKiBJTlBVVDogICAgICAgICAgICAgICAgTm9uZS4KKyAqIE9VVFBVVDogICAgICAgICAgICAgICBOb25lLgorICogUkVUVVJOUzogICAgICAgICAgICAgIE5vbmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIG12U3lzRW52VGltZXJJc1JlZkNsazI1TWh6KE1WX1ZPSUQpOwogCiAjZW5kaWYgLyogX19JTkNtdkJIYm9hcmRFbnZTcGVjaCAqLworCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2EzOHgvbXZTeXNFbnZMaWIuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM4eC9tdlN5c0VudkxpYi5jCmluZGV4IGMzMmViMDguLjBiNmE2ZDMgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM4eC9tdlN5c0VudkxpYi5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM4eC9tdlN5c0VudkxpYi5jCkBAIC02OCw2ICs2OCw4IEBACiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgIm12X3NlcV9leGVjLmgiCiAjaW5jbHVkZSAicHJpbnRmLmgiCisjaW5jbHVkZSAiZ2VuZXJhbEluaXQuaCIKKwogI2lmZGVmIE1WODhGNjlYWAogICAgICAgICNpbmNsdWRlICJkZHIzX2EzOXguaCIKICNlbHNlCkBAIC04MCwzMSArODIsMjQxIEBACiAKICNpZmRlZiBDT05GSUdfQVJNQURBXzM4WAogTVZfVU5JVF9JRCBtdlN5c0VudlNvY1VuaXROdW1zW01BWF9VTklUU19JRF1bTUFYX0RFVl9JRF9OVU1dID0gewotLyogICAgICAgICAgICAgICAgICAgICA2ODIwICAgIDY4MTAgICAgIDY4MTEgICAgIDY4MjggICAgICovCi0vKiBQRVhfVU5JVF9JRCAgICAgICovIHsgNCwgICAgIDMsICAgICAgIDMsICAgICAgIDR9LAotLyogRVRIX0dJR19VTklUX0lEICAqLyB7IDMsCQkyLCAgICAgICAzLCAgICAgICAzfSwKLS8qIFVTQjNIX1VOSVRfSUQgICAgKi8geyAyLCAgICAgMiwgICAgICAgMiwgICAgICAgMn0sCi0vKiBVU0IzRF9VTklUX0lEICAgICovIHsgMSwgICAgIDEsICAgICAgIDEsICAgICAgIDF9LAotLyogU0FUQV9VTklUX0lEICAgICAqLyB7IDIsICAgICAyLCAgICAgICAyLCAgICAgICA0fSwKLS8qIFFTR01JSV9VTklUX0lEICAgKi8geyAxLCAgICAgMCwgICAgICAgMCwgICAgICAgMX0sCi0vKiBYQVVJX1VOSVRfSUQgICAgICovIHsgMCwgICAgIDAsICAgICAgIDAsICAgICAgIDB9LAotLyogUlhBVUlfVU5JVF9JRCAgICAqLyB7IDAsICAgICAwLCAgICAgICAwLCAgICAgICAwfQorLyogICAgICAgICAgICAgICAgICAgICA2ODIwICAgIDY4MTAgICAgIDY4MTEgICAgIDY4MjggICA2VzIyICAgIDZXMjMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgQTM4NSAgICBBMzgwICAgICBBMzgxLzIgICBBMzg4ICAgQTM4MyAgICBBMzg0ICovCisvKiAgICAgICAgICAgICAgICAgICAgID09PT09PT09PSBIVyBGbGF2b3JzID09PT09PT09PSAgID09IFZpcnR1YWwgPT0qLworLyogUEVYX1VOSVRfSUQgICAgICAqLyB7IDQsICAgICAzLCAgICAgICAzLCAgICAgICA0LAkyLAkyfSwKKy8qIFNHTUlJX1VOSVRfSUQqLyAgICAgeyAzLAkyLCAgICAgICAzLCAgICAgICAzLAkyLAkyfSwKKy8qIFVTQjNIX1VOSVRfSUQgICAgKi8geyAyLCAgICAgMiwgICAgICAgMiwgICAgICAgMiwJMSwJMX0sCisvKiBVU0IzRF9VTklUX0lEICAgICovIHsgMSwgICAgIDEsICAgICAgIDEsICAgICAgIDEsCTAsCTB9LAorLyogU0FUQV9VTklUX0lEICAgICAqLyB7IDIsICAgICAyLCAgICAgICAyLCAgICAgICA0LAkxLAkxfSwKKy8qIFFTR01JSV9VTklUX0lEICAgKi8geyAxLCAgICAgMCwgICAgICAgMCwgICAgICAgMSwJMCwJMH0sCisvKiBYQVVJX1VOSVRfSUQgICAgICovIHsgMCwgICAgIDAsICAgICAgIDAsICAgICAgIDAsCTAsCTB9LAorLyogUlhBVUlfVU5JVF9JRCAgICAqLyB7IDAsICAgICAwLCAgICAgICAwLCAgICAgICAwLAkwLAkwfQogfTsKICNlbHNlICAvKiBpZiAoQ09ORklHX0FSTUFEQV8zOVgpICovCiBNVl9VTklUX0lEIG12U3lzRW52U29jVW5pdE51bXNbTUFYX1VOSVRTX0lEXVtNQVhfREVWX0lEX05VTV0gPSB7Ci0vKiAgICAgICAgICAgICAgICAgICAgICA2OTIwICAgICA2OTI4ICAgICAqLwotLyogUEVYX1VOSVRfSUQgICAgICAqLyB7IDQsICAgICAgIDR9LAotLyogRVRIX0dJR19VTklUX0lEICAqLyB7IDMsICAgICAgIDR9LAotLyogVVNCM0hfVU5JVF9JRCAgICAqLyB7IDEsICAgICAgIDJ9LAotLyogVVNCM0RfVU5JVF9JRCAgICAqLyB7IDAsICAgICAgIDF9LAotLyogU0FUQV9VTklUX0lEICAgICAqLyB7IDAsICAgICAgIDR9LAotLyogUVNHTUlJX1VOSVRfSUQgICAqLyB7IDAsICAgICAgIDF9LAotLyogWEFVSV9VTklUX0lEICAgICAqLyB7IDEsICAgICAgIDF9LAotLyogUlhBVUlfVU5JVF9JRCAgICAqLyB7IDEsCQkgIDF9CisvKgkJCQk2OTIwICAgICA2OTI4ICAgICAqLworLyogUEVYX1VOSVRfSUQgICAgICAqLwkJeyA0LCAgICAgICA0fSwKKy8qIFNHTUlJX1VOSVRfSUQgICAgKi8JCXsgMywgICAgICAgNH0sCisvKiBVU0IzSF9VTklUX0lEICAgICovCQl7IDEsICAgICAgIDJ9LAorLyogVVNCM0RfVU5JVF9JRCAgICAqLwkJeyAwLCAgICAgICAxfSwKKy8qIFNBVEFfVU5JVF9JRCAgICAgKi8JCXsgMCwgICAgICAgNH0sCisvKiBRU0dNSUlfVU5JVF9JRCAgICovCQl7IDAsICAgICAgIDF9LAorLyogWEFVSV9VTklUX0lEICAgICAqLwkJeyAxLCAgICAgICAxfSwKKy8qIFJYQVVJX1VOSVRfSUQgICAgKi8JCXsgMSwJICAgMX0KIH07CiAjZW5kaWYKIAorc3RhdGljIE1WX1ZPSUQgZ3BwUmVnU2V0KE1WX1UzMiBncm91cCwgTVZfVTMyIHJlZ09mZnMsIE1WX1UzMiBtYXNrLCBNVl9VMzIgdmFsdWUpCit7CisJTVZfVTMyIGdwcERhdGE7CiAKKwlncHBEYXRhID0gTVZfUkVHX1JFQUQocmVnT2Zmcyk7CisKKwlncHBEYXRhICY9IH5tYXNrOworCisJZ3BwRGF0YSB8PSAodmFsdWUgJiBtYXNrKTsKKworCU1WX1JFR19XUklURShyZWdPZmZzLCBncHBEYXRhKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12U3lzRW52SW9FeHBWYWxTZXQgLSBTZXQgVVNCIFZCVVMgc2lnbmFsIHZpYSBHUElPCisqCisqKiBJTlBVVDoJZ3BwTm8gLSBHUElPIHBpbiBudW1iZXIuCisqKiBPVVRQVVQ6CU5vbmUuCisqKiBSRVRVUk46CU5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVk9JRCBtdlN5c0VudlVzYlZidXNHcHBSZXNldChpbnQgZ3BwTm8pCit7CisJTVZfVTMyIHJlZ1ZhbDsKKworCS8qIE1QUCBDb250cm9sIFJlZ2lzdGVyIC0gc2V0IG1wcCBhcyBHUFAgKHZhbHVlID0gMCkqLworCXJlZ1ZhbCA9IE1WX1JFR19SRUFEKE1QUF9DT05UUk9MX1JFRygodW5zaWduZWQgaW50KShncHBObyAvIDgpKSk7CisJcmVnVmFsICY9IH4oMHhmIDw8ICgoZ3BwTm8gJSA4KSAqIDQpKTsKKwlNVl9SRUdfV1JJVEUoTVBQX0NPTlRST0xfUkVHKCh1bnNpZ25lZCBpbnQpKGdwcE5vIC8gOCkpLCByZWdWYWwpOworCisJaWYgKGdwcE5vIDwgMzIpIHsKKwkJLyogR1BJTyBEYXRhIE91dCBFbmFibGUgQ29udHJvbCBSZWdpc3RlciAtIHNldCB0byBvdXRwdXQgKi8KKwkJTVZfUkVHX1dSSVRFKEdQUF9EQVRBX09VVF9FTl9SRUcoMCksIDApOworCQkvKiBHUElPIG91dHB1dCBEYXRhIFZhbHVlIFJlZ2lzdGVyIC0gc2V0IGFzIGxvdyAqLworCQlNVl9SRUdfV1JJVEUoR1BQX0RBVEFfT1VUX1JFRygwKSwgMCk7CisJfSBlbHNlIHsKKwkJLyogR1BJTyBEYXRhIE91dCBFbmFibGUgQ29udHJvbCBSZWdpc3RlciAtIHNldCB0byBvdXRwdXQgKi8KKwkJTVZfUkVHX1dSSVRFKEdQUF9EQVRBX09VVF9FTl9SRUcoMSksIDApOworCQkvKiBHUElPIG91dHB1dCBEYXRhIFZhbHVlIFJlZ2lzdGVyIC0gc2V0IGFzIGxvdyAqLworCQlNVl9SRUdfV1JJVEUoR1BQX0RBVEFfT1VUX1JFRygxKSwgMCk7CisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZTeXNFbnZJb0V4cFZhbFNldCAtIFNldCBVU0IgVkJVUyBzaWduYWwgZm9yIERCLUdQIGJvYXJkIHZpYSBJTyBleHBhbmRlcgorKgorKiogSU5QVVQ6CU5vbmUuCisqKiBPVVRQVVQ6CU5vbmUuCisqKiBSRVRVUk46CU5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIG12U3lzRW52SW9FeHBVc2JWYnVzU2V0KE1WX1U4IHZhbHVlKQoreworCU1WX1U4IHJlYWRWYWwsIGNvbmZpZ1ZhbCwgb2Zmc2V0ID0gNzsgLyogSW8gRXhwYW5kZXIjMSAoMHgyMSksIHJlZ2lzdGVyIzEsIGJpdCA3ICovCisJTVZfVFdTSV9TTEFWRSB0d3NpU2xhdmU7CisKKwkvKiBSZWFkIGJpdFs0XSBpbiBCQzIgYmlvczAgU1cgU2F0UiAocmVnaXN0ZXIgMSkgKi8KKwl0d3NpU2xhdmUuc2xhdmVBZGRyLnR5cGUgPSBBRERSN19CSVQ7CisJdHdzaVNsYXZlLnNsYXZlQWRkci5hZGRyZXNzID0gTVZfQk9BUkRfSU9fRVhQQU5ERVIxX0FERFI7CisJdHdzaVNsYXZlLnZhbGlkT2Zmc2V0ID0gTVZfVFJVRTsKKwl0d3NpU2xhdmUubW9yZVRoZW4yNTYgPSBNVl9GQUxTRTsKKworCXR3c2lTbGF2ZS5vZmZzZXQgPSA3OwkvKiBkaXJlY3Rpb24gcmVnICMxIChyZWdpc3RlciA3KSBmb3Igb3V0cHV0L2lucHV0IHNldHRpbmcgKi8KKwlpZiAoTVZfT0sgIT0gbXZUd3NpUmVhZChUV1NJX0NIQU5ORUxfQTNYWCwgJnR3c2lTbGF2ZSwgJmNvbmZpZ1ZhbCwgMSkpIHsKKwkJbXZQcmludGYoIiVzOiBFcnJvcjogUmVhZCBDb25maWd1cmF0aW9uIGZyb20gSU8gRXhwYW5kZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBNVl9FUlJPUjsKKwl9CisKKwkvKiBNb2RpZnkgZGlyZWN0aW9uIChvdXRwdXQvaW5wdXQpIHZhbHVlIG9mIHJlcXVlc3RlZCBwaW4gKi8KKwljb25maWdWYWwgJj0gfigxIDw8IG9mZnNldCk7CS8qIG91dHB1dCBtYXJrZWQgYXMgMDogY2xlYW4gYml0IG9mIG9sZCB2YWx1ZSAgKi8KKworCWlmIChtdlR3c2lXcml0ZShUV1NJX0NIQU5ORUxfQTNYWCwgJnR3c2lTbGF2ZSwgJmNvbmZpZ1ZhbCwgMSkgIT0gTVZfT0spIHsKKwkJLyogV3JpdGUgYWdhaW4gaW4gY2FzZSB0aGUgY29udHJvbGxlciBpcyBidXN5ICovCisJCWlmIChtdlR3c2lXcml0ZShUV1NJX0NIQU5ORUxfQTNYWCwgJnR3c2lTbGF2ZSwgJmNvbmZpZ1ZhbCwgMSkgIT0gTVZfT0spIHsKKwkJCW12UHJpbnRmKCIlczogRXJyb3I6IGRpcmVjdGlvbiBXcml0ZSB0byBJTyBFeHBhbmRlciBhdCAweCV4IGZhaWxlZFxuIiwgX19mdW5jX18KKwkJCSAgICwgTVZfQk9BUkRfSU9fRVhQQU5ERVIxX0FERFIpOworCQkJcmV0dXJuIE1WX0VSUk9SOworCQl9CisJfQorCisJdHdzaVNsYXZlLm9mZnNldCA9IDM7IAkvKiBSZWFkIE91dHB1dCBWYWx1ZSAqLworCWlmIChNVl9PSyAhPSBtdlR3c2lSZWFkKFRXU0lfQ0hBTk5FTF9BM1hYLCAmdHdzaVNsYXZlLCAmcmVhZFZhbCwgMSkpIHsKKwkJbXZQcmludGYoIiVzOiBFcnJvcjogUmVhZCBDb25maWd1cmF0aW9uIGZyb20gSU8gRXhwYW5kZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBNVl9FUlJPUjsKKwl9CisKKwkvKiBNb2RpZnkgKi8KKwlyZWFkVmFsICY9IH4oMSA8PCBvZmZzZXQpOwkvKiBjbGVhbiBiaXQgb2Ygb2xkIHZhbHVlICAqLworCXJlYWRWYWwgfD0gKHZhbHVlIDw8IG9mZnNldCk7CisKKwlpZiAobXZUd3NpV3JpdGUoVFdTSV9DSEFOTkVMX0EzWFgsICZ0d3NpU2xhdmUsICZyZWFkVmFsLCAxKSAhPSBNVl9PSykgeworCQkvKiBXcml0ZSBhZ2FpbiBpbiBjYXNlIHRoZSBjb250cm9sbGVyIGlzIGJ1c3kgKi8KKwkJaWYgKG12VHdzaVdyaXRlKFRXU0lfQ0hBTk5FTF9BM1hYLCAmdHdzaVNsYXZlLCAmcmVhZFZhbCwgMSkgIT0gTVZfT0spIHsKKwkJbXZQcmludGYoIiVzOiBFcnJvcjogZGlyZWN0aW9uIFdyaXRlIHRvIElPIEV4cGFuZGVyIGF0IDB4JXggZmFpbGVkXG4iLCBfX2Z1bmNfXworCQkJICAgLCBNVl9CT0FSRF9JT19FWFBBTkRFUjFfQUREUik7CisJCQlyZXR1cm4gTVZfRVJST1I7CisJCX0KKwl9CisKKwlyZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12U3lzRW52VXNiVmJ1c1Jlc2V0IC0gU2V0IFVTQiBWQlVTIHNpZ25hbCBiZWZvcmUgZGV0ZWN0aW9uCisqCisqIERFU0NSSVBUSU9OOgorKiB0aGlzIHJvdXRpbmUgc2V0cyBWQlVTIHNpZ25hbCB2aWEgR1BJTyBvciB2aWEgSTJDIElPIGV4cGFuZGVyCisqCisqKiBJTlBVVDoJaW50ICBkZXYgLSBVU0IgSG9zdCBudW1iZXIKKyoqIE9VVFBVVDoJTm9uZS4KKyoqIFJFVFVSTjoJTm9uZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9WT0lEIG12U3lzRW52VXNiVmJ1c1Jlc2V0KE1WX1ZPSUQpCit7CisJTVZfMzIgaSwgZ3BwTm87CisJTVZfQk9BUkRfVVNCX1ZCVVNfR1BJTyBib2FyZFVzYlZidXNHcGlvW10gPSBNVl9CT0FSRF9VU0JfVkJVU19HUElPX0lORk87CisJTVZfVTMyIGJvYXJkSWRJbmRleDsKKworCS8qIFNvbWUgb2YgTWFydmVsbCBib2FyZHMgY29udHJvbCBWQlVTIHNpZ25hbCB2aWEgSTJDIElPIGV4cGFuZGVyIHVuaXQgKi8KKyNpZm5kZWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQKKwkvKiBpZiBWQlVTIHNpZ25hbCBpcyBDb250cm9sbGVkIHZpYSBJMkMgSU8gRXhwYW5kZXIgb24gYm9hcmQqLworCWlmIChtdkJvYXJkSWRHZXQoKSA9PSBEQl9HUF82OFhYX0lEKSB7CisJCW12U3lzRW52SW9FeHBVc2JWYnVzU2V0KDApOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwlib2FyZElkSW5kZXggPSBtdkJvYXJkSWRJbmRleEdldChtdkJvYXJkSWRHZXQoKSk7CisJaWYgKCEoc2l6ZW9mKGJvYXJkVXNiVmJ1c0dwaW8pL3NpemVvZihNVl9CT0FSRF9VU0JfVkJVU19HUElPKSA+IGJvYXJkSWRJbmRleCkpIHsKKwkJbXZQcmludGYoIlxuRmFpbGVkIGxvYWRpbmcgVVNCIFZCVVMgR1BJTyBpbmZvcm1hdGlvbiAoaW52YWxpZCBib2FyZCBJRClcbiIpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IG12U3lzRW52VW5pdE1heE51bUdldChVU0IzSF9VTklUX0lEKTsgaSsrKSB7CisJCWdwcE5vID0gYm9hcmRVc2JWYnVzR3Bpb1tib2FyZElkSW5kZXhdLnVzYlZidXNHcGlvW2ldOworCQkvKiBpZiBWQlVTIHNpZ25hbCBpcyBDb250cm9sbGVkIHZpYSBHUElPIG9uIGJvYXJkICovCisJCWlmIChncHBObyAhPSBNVl9FUlJPUikgeworCQkJbXZTeXNFbnZVc2JWYnVzR3BwUmVzZXQoZ3BwTm8pOworCQkJY29udGludWU7CisJCX0KKwl9Cit9CisKKy8qIG12Qm9hcmREYjY4MjBBbWNUd3NpQ29uZmlnOgorICogZm9yIEFNQyBib2FyZCwgdG8gYWxsb3cgZGV0ZWN0aW9uIG9mIHJlbW90ZSBQQ0llIEdFTjEvR0VOMiBlbmZvcmNlbWVudCBzZXR0aW5nczoKKyAqIDEuIEVuYWJsZSBleHRlcm5hbCBpMmMgY2hhbm5lbCBmb3IgdmlhIEdQSU8KKyAqIDIuIERpc2FibGUgSTJDIFNsYXZlIFBvcnQwIG9mIGxvY2FsIEFNQyBkZXZpY2UsIHRvIGF2b2lkIGJ1cyBhZGRyZXNzIGNvbnRlbnRpb24KKyAqLworc3RhdGljIE1WX1ZPSUQgbXZCb2FyZERiNjgyMEFtY1R3c2lDb25maWcoTVZfVk9JRCkKK3sKKwkvKiBEaXNhYmxlIEkyQyBTbGF2ZSBQb3J0cyBvZiBsb2NhbCBBTUMgZGV2aWNlLCB0byBhdm9pZCBidXMgYWRkcmVzcyBjb250ZW50aW9uKi8KKwlNVl9SRUdfQklUX1JFU0VUKFRXU0lfQ09ORklHX0RFQlVHX1JFRywgVFdTSV9ERUJVR19TTEFWRV9QT1JUMF9FTik7CisJTVZfUkVHX0JJVF9SRVNFVChUV1NJX0NPTkZJR19ERUJVR19SRUcsIFRXU0lfREVCVUdfU0xBVkVfUE9SVDFfRU4pOworCisJLyogR1BQIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQgZm9yIGRpc2FibGluZyBhY2Nlc3MgdG8gaTJjIGNoYW5uZWwgMQorCSAgIE91dHB1dCBmcm9tIEdQUC00NCBzaG91bGQgc2V0IHRvIGJlIEhJR0ggZm9yIGRpc2FibGluZyBleHRlcm5hbAorCSAgIGkyYyBjaGFubmVsIDEgYnVmZmVyIGNpcmN1aXQKKwkgICBUaGUgZW50aXJlIEdQUHMgY29uZmlndXJhdGlvbiBpcyB0aGUgc2FtZSBhcyBpbiB1LWJvb3QgKi8KKwkvKiBTZXQgR1BQIE91dCB2YWx1ZSAqLworCU1WX1JFR19XUklURShHUFBfREFUQV9PVVRfUkVHKDApLCBCSVQyOSk7IC8qIEdQSU8yOTogUVNfU01JX0VOQSA9IE9VVCBWQUwgSGlnaCAqLworCU1WX1JFR19XUklURShHUFBfREFUQV9PVVRfUkVHKDEpLCBCSVQxMik7IC8qIEdQSU80NCAoQklUMTIpIDogSTJDX0VYVF9FTiA9IEZBTFNFIChGYWxzZSA9IE9VVCBWQUwgSGlnaCkgKi8KKwlNVl9SRUdfV1JJVEUoR1BQX0RBVEFfT1VUX1JFRygyKSwgMCk7CisKKwkvKiBzZXQgR1BQIHBvbGFyaXR5ICovCisJZ3BwUmVnU2V0KDAsIEdQUF9EQVRBX0lOX1BPTF9SRUcoMCksIDB4RkZGRkZGRkYsIDB4MCk7CisJZ3BwUmVnU2V0KDEsIEdQUF9EQVRBX0lOX1BPTF9SRUcoMSksIDB4RkZGRkZGRkYsIDB4MCk7CisJZ3BwUmVnU2V0KDIsIEdQUF9EQVRBX0lOX1BPTF9SRUcoMiksIDB4RkZGRkZGRkYsIDB4MCk7CisKKwkvKiBTZXQgR1BQIE91dCBFbmFibGUgKi8KKwkvKiBHUElPMjk6IFFTX1NNSV9FTkEgKi8KKwlncHBSZWdTZXQoMCwgR1BQX0RBVEFfT1VUX0VOX1JFRygwKSwgMHhGRkZGRkZGRiwgfihCSVQyOSkpOworCS8qIDQ0OkkyQ19FWFRfRU4sIDQ5LDUwLDUyLDUzOkxlZHMqLworCWdwcFJlZ1NldCgxLCBHUFBfREFUQV9PVVRfRU5fUkVHKDEpLCAweEZGRkZGRkZGLCB+KEJJVDEyIHwgQklUMTcgfCBCSVQxOCB8IEJJVDIwIHwgQklUMjEpKTsKKwlncHBSZWdTZXQoMiwgR1BQX0RBVEFfT1VUX0VOX1JFRygyKSwgMHhGRkZGRkZGRiwgfigweDApKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZEZvcmNlUGNpZUdlbjFHZXQgLSByZWFkIE1TWVMgQkMyL0FDMyBTYXRSIGJpb3MwIGJpdFs0XSBmb3IgUENJZSBHRU4xL0dFTjIgbW9kZQorKgorKiBERVNDUklQVElPTjoKKyoKKyogSU5QVVQ6CisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOiBUUlVFIGlmIEdFTjEgY29ubmVjdGlvbiBpcyBlbmZvcmNlZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0JPT0wgbXZCb2FyZEZvcmNlUGNpZUdlbjFHZXQoTVZfVk9JRCkKK3sKKwlNVl9UV1NJX1NMQVZFIHR3c2lTbGF2ZTsKKwlNVl9UV1NJX0FERFIgc2xhdmU7CisJTVZfVTggZGF0YTsKKworCS8qIFRXU0kgaW5pdCAqLworCXNsYXZlLmFkZHJlc3MgPSBNVl9CT0FSRF9DVFJMX0kyQ19BRERSX0JDMjsKKwlzbGF2ZS50eXBlICAgID0gQUREUjdfQklUOworCW12VHdzaUluaXQoVFdTSV9DSEFOTkVMX0EzWFgsIFRXU0lfU1BFRURfQkMyLCBtdkJvYXJkVGNsa0dldCgpLCAmc2xhdmUsIDApOworCisJLyogUmVhZCBiaXRbNF0gaW4gQkMyIGJpb3MwIFNXIFNhdFIgKHJlZ2lzdGVyIDEpICovCisJdHdzaVNsYXZlLnNsYXZlQWRkci50eXBlID0gQUREUjdfQklUOworCXR3c2lTbGF2ZS5zbGF2ZUFkZHIuYWRkcmVzcyA9IE1WX0JPQVJEX0JJT1MwX0FERFI7CisJdHdzaVNsYXZlLm9mZnNldCA9IDE7IC8qIHJlZ2lzdGVyIDEsIFNXIFNhdFIgZmllbGRzICovCisJdHdzaVNsYXZlLnZhbGlkT2Zmc2V0ID0gTVZfVFJVRTsKKwl0d3NpU2xhdmUubW9yZVRoZW4yNTYgPSBNVl9GQUxTRTsKKworCWlmIChNVl9PSyA9PSBtdlR3c2lSZWFkKFRXU0lfQ0hBTk5FTF9BM1hYLCAmdHdzaVNsYXZlLCAmZGF0YSwgMSkpIHsKKwkJaWYgKChkYXRhID4+IDQpICYgMHgxKQorCQkJcmV0dXJuIE1WX1RSVUU7CisJfQorCisJcmV0dXJuIE1WX0ZBTFNFOworfQogCiBNVl9VMzIgZ0JvYXJkSWQgPSAtMTsKIE1WX1UzMiBtdkJvYXJkSWRHZXQoTVZfVk9JRCkKQEAgLTExNyw2ICszMjksOCBAQAogCQlnQm9hcmRJZCA9IENVU1RPTUVSX0JPQVJEX0lEMDsKIAkjZWxpZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMQogCQlnQm9hcmRJZCA9IENVU1RPTUVSX0JPQVJEX0lEMTsKKwkjZWxpZiBDT05GSUdfQ0xFQVJGT0dfQk9BUkQKKwkJZ0JvYXJkSWQgPSBBMzhYX0NMRUFSRk9HX0JPQVJEX0lEOwogCSNlbGlmIENPTkZJR19HRkNIMTAwCiAJCWdCb2FyZElkID0gR0ZDSDEwMF9JRDsKIAkjZW5kaWYKQEAgLTE2MiwxMyArMzc2LDIxIEBACiAKIE1WX1UzMiBtdkJvYXJkVGNsa0dldChNVl9WT0lEKQogewotCU1WX1UzMiB2YWx1ZTsKKwlNVl9VMzIgdmFsdWUsIGRldklkOwogCiAJdmFsdWUgPSAoTVZfTUVNSU9fTEUzMl9SRUFEKElOVEVSX1JFR1NfQkFTRSB8IERFVklDRV9TQU1QTEVfQVRfUkVTRVQxX1JFRykgPj4gMTUpICYgMHgxOwogCiAJc3dpdGNoICh2YWx1ZSkgewogCWNhc2UgKDB4MCk6Ci0JCXJldHVybiBNVl9CT0FSRF9UQ0xLXzI1ME1IWjsKKwkJLyogUmVhZCBIVyBkZXZpY2UgSUQgZnJvbSBTQFI6CisJCSAqIG5vdGU6IGF2b2lkaW5nIHJlYWRpbmcgZGV2aWNlIElEIGhlcmUgd2l0aCBtdlN5c0VudkRldmljZUlkR2V0KCksIHNpbmNlIGl0IGluY2x1ZGUKKwkJICogcHJpbnRzLCBhbmQgVFdTSSByZWFkcywgd2hpY2ggcmVxdWlyZSBUY2xrIHZhbHVlLS0+IHJlYWRpbmcgVGNsayB2YWx1ZSBzdHJhaWdodCBmcm9tIHJlZ2lzdGVyICovCisJCWRldklkID0gTVZfUkVHX1JFQUQoREVWSUNFX1NBTVBMRV9BVF9SRVNFVDFfUkVHKTsKKwkJZGV2SWQgPSBkZXZJZCA+PiBTQVJfREVWX0lEX09GRlMgJiBTQVJfREVWX0lEX01BU0s7CisJCWlmIChkZXZJZCA9PSBNVl82ODExKQorCQkJcmV0dXJuIE1WX0JPQVJEX1RDTEtfMTY2TUhaOwkvKiBkZXZpY2UgMzgxLzIgKDY4MTEvMjEpIHVzZSAxNjZNSHogaW5zdGVhZCBvZiAyNTBNSHogKi8KKwkJZWxzZQorCQkJcmV0dXJuIE1WX0JPQVJEX1RDTEtfMjUwTUhaOwogCWNhc2UgKDB4MSk6CiAJCXJldHVybiBNVl9CT0FSRF9UQ0xLXzIwME1IWjsKIAlkZWZhdWx0OgpAQCAtMTg4LDYgKzQxMCw3IEBACiB7CiAJTVZfVFdTSV9BRERSIHNsYXZlOwogCU1WX1UzMiB0Q2xvY2s7CisKIAlpZiAoZmxhZ1R3c2lJbml0ID09IC0xKSB7CiAJCURFQlVHX0lOSVRfRlVMTF9TKCJcbiMjIyBtdkh3c1R3c2lJbml0V3JhcHBlciAjIyNcbiIpOwogCQlzbGF2ZS50eXBlID0gQUREUjdfQklUOwpAQCAtMjAwLDYgKzQyMywxMiBAQAogCiAJCW12VHdzaUluaXQoMCwgVFdTSV9TUEVFRCwgdENsb2NrLCAmc2xhdmUsIDApOwogCQlmbGFnVHdzaUluaXQgPSAxOworCisJCS8qIGZvciBBTUMgYm9hcmQsIHRvIGFsbG93IGRldGVjdGlvbiBvZiByZW1vdGUgUENJZSBHRU4xL0dFTjIgZW5mb3JjZW1lbnQgc2V0dGluZ3M6CisJCSAgIDEuIEVuYWJsZSBleHRlcm5hbCBpMmMgY2hhbm5lbCBmb3IgdmlhIEdQSU8KKwkJICAgMi4gRGlzYWJsZSBJMkMgU2xhdmUgUG9ydDAgb2YgbG9jYWwgQU1DIGRldmljZSwgdG8gYXZvaWQgYnVzIGFkZHJlc3MgY29udGVudGlvbiAqLworCQlpZiAobXZCb2FyZElkR2V0KCkgPT0gREJfQU1DXzY4MjBfSUQpCisJCQltdkJvYXJkRGI2ODIwQW1jVHdzaUNvbmZpZygpOwogCX0KIAlyZXR1cm4gTVZfT0s7CiB9CkBAIC0yNTAsNiArNDc5LDM0IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12U3lzRW52Q2hlY2tXYWtldXBEcmFtRW5hYmxlCisqCisqIERFU0NSSVBUSU9OOiBDaGVjayB0aGUgbWFnaWMgd2FrZXVwIGVuYWJsZWQKKyoKKyogSU5QVVQ6IE5vbmUKKyoKKyogT1VUUFVUOiBOb25lCisqCisqIFJFVFVSTjoKKyogICAgICAgTVZfU1VTUEVORF9XQUtFVVBfRU5BQkxFRF9NRU1fREVURUNURUQgb3IgTVZfU1VTUEVORF9XQUtFVVBfRElTQUJMRUQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVVNQRU5EX1dBS0VVUF9TVEFUVVMgbXZTeXNFbnZDaGVja1dha2V1cERyYW1FbmFibGUodm9pZCkKK3sKKwlpbnQgKmJvb3RfaW5mbyA9IChpbnQqKShCT09UX0lORk9fQUREUik7CisJaW50ICBtYWdpY193b3JkOworCisJbWFnaWNfd29yZCA9ICAqKGJvb3RfaW5mbyk7CisKKwlpZihtYWdpY193b3JkID09IFNVU1BFTkRfTUFHSUNfV09SRCkgeworCQlyZXR1cm4gTVZfU1VTUEVORF9XQUtFVVBfRU5BQkxFRF9NRU1fREVURUNURUQ7CisJfQorCWVsc2V7CisJCXJldHVybiBNVl9TVVNQRU5EX1dBS0VVUF9ESVNBQkxFRDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12Q3RybERldklkSW5kZXhHZXQKICoKICogREVTQ1JJUFRJT046IHJldHVybiBTT0MgZGV2aWNlIGluZGV4CkBAIC0yNjUsNiArNTIyLDcgQEAKIE1WX1UzMiBtdlN5c0VudklkSW5kZXhHZXQoTVZfVTMyIGN0cmxNb2RlbCkKIHsKIAlzd2l0Y2ggKGN0cmxNb2RlbCkgeworCS8qIEhXIGZsYXZvcnMgLSByZXByZXNlbnRlZCBieSBkZXZpZCBiaXRzIGluIFNAUiBAIDB4MTg2MDAgKi8KIAljYXNlIE1WXzY4MjBfREVWX0lEOgogCQlyZXR1cm4gTVZfNjgyMF9JTkRFWDsKIAljYXNlIE1WXzY4MTBfREVWX0lEOgpAQCAtMjc3LDYgKzUzNSwxMSBAQAogCQlyZXR1cm4gTVZfNjkyMF9JTkRFWDsKIAljYXNlIE1WXzY5MjhfREVWX0lEOgogCQlyZXR1cm4gTVZfNjkyOF9JTkRFWDsKKwkvKiBWaXJ0dWFsIGZsYXZvcnMgLSBub3QgcmVwcmVzZW50ZWQgYnkgZGV2IElEIGJpdHMgaW4gU0BSIEAgMHgxODYwMCAqLworCWNhc2UgTVZfNlcyMl9ERVZfSUQ6IC8qIDZXMjI9QTM4MyAqLworCQlyZXR1cm4gTVZfNlcyMl9JTkRFWDsKKwljYXNlIE1WXzZXMjNfREVWX0lEOiAvKiA2VzIzPUEzODQgKi8KKwkJcmV0dXJuIE1WXzZXMjNfSU5ERVg7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIE1WXzY4MjBfSU5ERVg7CiAJfQpAQCAtMzA2LDEyICs1NjksMTYgQEAKIAljdHJsSWQgPSAoY3RybElkICYgKERFVl9JRF9SRUdfREVWSUNFX0lEX01BU0spKSA+PiBERVZfSURfUkVHX0RFVklDRV9JRF9PRkZTOwogCiAJc3dpdGNoIChjdHJsSWQpIHsKKwkvKiBIVyBmbGF2b3JzIC0gcmVwcmVzZW50ZWQgYnkgZGV2aWQgYml0cyBpbiBTQFIgQCAweDE4NjAwICovCiAJY2FzZSBNVl82ODIwX0RFVl9JRDoKIAljYXNlIE1WXzY4MTBfREVWX0lEOgogCWNhc2UgTVZfNjgxMV9ERVZfSUQ6CiAJY2FzZSBNVl82ODI4X0RFVl9JRDoKIAljYXNlIE1WXzY5MjBfREVWX0lEOgogCWNhc2UgTVZfNjkyOF9ERVZfSUQ6CisJLyogVmlydHVhbCBmbGF2b3JzIC0gbm90IHJlcHJlc2VudGVkIGJ5IGRldiBJRCBiaXRzIGluIFNAUiBAIDB4MTg2MDAgKi8KKwljYXNlIE1WXzZXMjJfREVWX0lEOiAvKiA2VzIyPUEzODMgKi8KKwljYXNlIE1WXzZXMjNfREVWX0lEOiAvKiA2VzIzPUEzODQgKi8KIAkJcmV0dXJuIGN0cmxJZDsKIAlkZWZhdWx0OiAvKkRldmljZSBJRCBEZWZhdWx0IGZvciBBMzh4OiA2ODIwICwgZm9yIEEzOXg6IDY5MjAgKi8KIAkjaWZkZWYgTVY4OEY2OFhYCkBAIC0zMjMsMjYgKzU5MCw5NCBAQAogCQlyZXR1cm4gZGVmYXVsdEN0cmxJZDsKIAl9CiB9CisjaWZuZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12U3lzRW52SXNGbGF2b3VyUmVkdWNlZAorKiBERVNDUklQVElPTjoJCVJlZHVjZWQgRmxhdm9yIEEzODMvQTM4NCBpcyBzaW11bGF0ZWQgb24KKyoJCQlEQi1HUC9EQi0zODEvMi4gY29uZmlndXJlZCBieSBTYXRSIGZpZWxkICdmbGF2b3InCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfMTYgaXNGbGF2b3JSZWR1Y2VkID0gLTE7CitzdGF0aWMgTVZfMTYgbXZTeXNFbnZJc0ZsYXZvdXJSZWR1Y2VkKE1WX1ZPSUQpCit7CisJTVZfVFdTSV9TTEFWRSB0d3NpU2xhdmU7CisJTVZfVTggcmVkdWNlZFZhbDsKIAorCWlmIChpc0ZsYXZvclJlZHVjZWQgIT0gLTEpCisJCXJldHVybiBpc0ZsYXZvclJlZHVjZWQ7IC8qIHJlYWQgbGFzdCB2YWx1ZSBpZiBhbHJlYWR5IHJlYWQgZnJvbSBFRVBST00gKi8KKworCXR3c2lTbGF2ZS5zbGF2ZUFkZHIuYWRkcmVzcyA9IEVFUFJPTV9JMkNfQUREUjsKKwl0d3NpU2xhdmUuc2xhdmVBZGRyLnR5cGUgPSBBRERSN19CSVQ7CisJdHdzaVNsYXZlLnZhbGlkT2Zmc2V0ID0gTVZfVFJVRTsKKwl0d3NpU2xhdmUubW9yZVRoZW4yNTYgPSBNVl9UUlVFOworCXR3c2lTbGF2ZS5vZmZzZXQgPSAyOwkJLyogU1cgRUVQUk9NLCByZWdpc3RlciAyLCBiaXQgNCAqLworCisJaWYgKG12VHdzaVJlYWQoMCwgJnR3c2lTbGF2ZSwgJnJlZHVjZWRWYWwsIDEpICE9IE1WX09LKSB7CisJCW12UHJpbnRmKCIlczogVFdTSSBSZWFkIG9mICdmbGF2b3InIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJaXNGbGF2b3JSZWR1Y2VkID0gISgocmVkdWNlZFZhbCAmIFNBVFJfREVWSUNFX0ZMQVZPUl9NQVNLKSA+PiBTQVRSX0RFVklDRV9GTEFWT1JfT0ZGU0VUKTsKKworCisJcmV0dXJuIGlzRmxhdm9yUmVkdWNlZDsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdlN5c0VudkRldmljZUlkR2V0Ci0qIERFU0NSSVBUSU9OOgkgCVJldHVybnMgZW51bSAoMC4uNykgaW5kZXggb2YgdGhlIGRldmljZSBtb2RlbCAoSUQpCisqIERFU0NSSVBUSU9OOglSZXR1cm5zIGVudW06CisqCQkJKDAuLjcpIGluZGV4IG9mIHRoZSBkZXZpY2UgbW9kZWwgKElEKQorKgkJCSg4Li4pIGluZGV4IG9mIHRoZSB2aXJ0dWFsIGRldmljZSBtb2RlbCAoSUQpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfVTMyIGdEZXZJZCA9IC0xOwogTVZfVTMyIG12U3lzRW52RGV2aWNlSWRHZXQoTVZfVk9JRCkKIHsKLQljaGFyICpkZXZpY2VJZFN0cls3XSA9IHsgIjY4MTAiLCAiNjgyMCIsICI2ODExIiwgIjY4MjgiLAotCQkJCSJOT05FIiwgIjY5MjAiLCAiNjkyOCIgfTsKKwljaGFyICpkZXZpY2VJZFN0clsxMF0gPSB7ICI2ODEwIiwgIjY4MjAiLCAiNjgxMSIsICI2ODI4IiwKKwkJCQkiTk9ORSIsICI2OTIwIiwgIjY5MjgiLCAiTUFYX0hXX0RFVl9JRCIsCisJCQkJIjZXMjIiLCAiNlcyMyJ9OyAvKiA2VzIyPUEzODMsIDZXMjM9QTM4NCAqLworI2lmbmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVAorCU1WX1UzMiBib2FyZElkID0gbXZCb2FyZElkR2V0KCk7CisjZW5kaWYKIAogCWlmIChnRGV2SWQgIT0gLTEpCiAJCXJldHVybiBnRGV2SWQ7CiAKKwkvKiByZWFkIEhXIGRldmljZSBJRCB2YWx1ZSAqLwogCWdEZXZJZCA9IE1WX1JFR19SRUFEKERFVklDRV9TQU1QTEVfQVRfUkVTRVQxX1JFRyk7CiAJZ0RldklkID0gZ0RldklkID4+IFNBUl9ERVZfSURfT0ZGUyAmIFNBUl9ERVZfSURfTUFTSzsKKwkvKiBWaXJ0dWFsIFJlZHVjZWQgZmxhdm9yIERldmljZSBJRHMgOgorCQktIEhhcmR3YXJlIERldmljZSBJRCdzIHJlcHJlc2VudGVkIGJ5IGluZGV4IDAuLjcKKwkJLSBWaXJ0dWFsIERldmljZSBJRCdzIHJlcHJlc2VudGVkIGJ5IGluZGV4IDguLgorCQktIEN1c3RvbWVyIGJvYXJkczogcmVkdWNlZCBmbGF2b3IgSUQgZGVmaW5lZCBieSBSRURVQ0VEX0ZMQVZPUiB2YWx1ZS4KKwkJLSBNYXJ2ZWxsIGJvYXJkczogUmVkdWNlZCBGbGF2b3IgQTM4My9BMzg0IGlzIHNpbXVsYXRlZCBvbiBEQi1HUC9EQi0zODEvMgorCQkgIG9ubHkgKGNvbmZpZ3VyZWQgYnkgU2F0UiBmaWVsZCAnZmxhdm9yJykuCisJICovCisjaWYgZGVmaW5lZChDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCkKKyNpZmRlZiBSRURVQ0VEX0ZMQVZPUgorCWlmIChSRURVQ0VEX0ZMQVZPUiA9PSAweDM4MykKKwkJZ0RldklkID0gTVZfNlcyMjsKKwllbHNlIGlmIChSRURVQ0VEX0ZMQVZPUiA9PSAweDM4NCkKKwkJZ0RldklkID0gTVZfNlcyMzsKKyNlbmRpZgorI2Vsc2UKKwlpZiAobXZTeXNFbnZJc0ZsYXZvdXJSZWR1Y2VkKCkgPT0gMSkgeworCQlpZiAoYm9hcmRJZCA9PSBEQl9HUF82OFhYX0lEIHx8IGJvYXJkSWQgPT0gREJfNjhYWF9JRAorCQkJCXx8IGJvYXJkSWQgPT0gREJfQVBfNjhYWF9JRCkgeworCQkJaWYgKGdEZXZJZCAhPSBNVl82ODEwKSAvKiBzaW11bGF0ZSA2VzIzKEEzODQpIG9ubHkgb24gNjgyMChBMzg1KSBvciA2ODI4KEEzODgpICovCisJCQkJZ0RldklkID0gTVZfNlcyMzsKKwkJCWVsc2UgeworCQkJCW12UHJpbnRmKCIlczogRXJyb3I6IEEzODQgKDZXMjMpIGNhbiBub3QgcnVuIHdpdGggZGV2aWNlICIsIF9fZnVuY19fKTsKKwkJCQltdlByaW50ZigiaWQgQTM4MCAoNjgxMClcbnRvIHNldCBBMzg0LHJ1biAnU2F0UiAiKTsKKwkJCQltdlByaW50Zigid3JpdGUgZGV2aWQgMycgT1IgJ1NhdFIgd3JpdGUgZGV2aWQgMSdcbiIpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKGJvYXJkSWQgPT0gREJfQlBfNjgyMV9JRCkKKwkJCWdEZXZJZCA9IE1WXzZXMjI7CisJfQorI2VuZGlmCiAJbXZQcmludGYoIkRldGVjdGVkIERldmljZSBJRCAlc1xuIiAsZGV2aWNlSWRTdHJbZ0RldklkXSk7CiAJcmV0dXJuIGdEZXZJZDsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdlN5c0VudkRldmljZVJldkdldCAtIEdldCBNYXJ2ZWxsIGNvbnRyb2xsZXIgZGV2aWNlIHJldmlzaW9uIG51bWJlcgogKgpAQCAtMzgyLDE3ICs3MTcsOSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX0RSQU1fRExCX0NPTkZJRyAgKm12U3lzRW52RGxiQ29uZmlnUHRyR2V0KE1WX1ZPSUQpCiB7Ci0jaWZkZWYgTVY4OEY2OVhYCi0JcmV0dXJuICgmZGRyM0RsYkNvbmZpZ1RhYmxlX0EwWzBdKTsKLSNlbHNlCi0JaWYgKG12U3lzRW52RGV2aWNlUmV2R2V0KCkgPT0gTVZfODhGNjhYWF9BMF9JRCkKLQkJcmV0dXJuICgmZGRyM0RsYkNvbmZpZ1RhYmxlX0EwWzBdKTsKLQllbHNlCi0JCXJldHVybiAoJmRkcjNEbGJDb25maWdUYWJsZVswXSk7Ci0jZW5kaWYKKwlyZXR1cm4gKCZkZHIzRGxiQ29uZmlnVGFibGVbMF0pOwogfQogCi0KICNpZmRlZiBDT05GSUdfQ01EX0JPQVJEQ0ZHCiBNVl9CT0FSRF9DT05GSUdfVFlQRV9JTkZPIGJvYXJkQ29uZmlnVHlwZXNJbmZvW10gPSBNVl9FRVBST01fQ09ORklHX0lORk87CiBNVl9VOCBib2FyZE9wdGlvbnNDb25maWdbTVZfQ09ORklHX1RZUEVfTUFYX09QVElPTl07CkBAIC04MzEsNyArMTE1OCw3IEBACiB7CiAJTVZfQk9BUkRfQ09ORklHX1RZUEVfSU5GTyBjb25maWdJbmZvOwogCi0JaWYgKGNvbmZpZ0ZpZWxkIDwgTVZfQ09ORklHX1RZUEVfTUFYX09QVElPTiAmJgorCWlmIChjb25maWdGaWVsZCA+PU1WX0NPTkZJR19UWVBFX01BWF9PUFRJT04gfHwKIAkJbXZTeXNFbnZDb25maWdUeXBlR2V0KGNvbmZpZ0ZpZWxkLCAmY29uZmlnSW5mbykgIT0gTVZfVFJVRSkgewogCQlERUJVR19JTklUX1MoIm12U3lzRW52Q29uZmlnR2V0OiBFcnJvcjogUmVxdWVzdGVkIGJvYXJkIGNvbmZpZyBpcyBpbnZhbGlkIGZvciB0aGlzIGJvYXJkXG4iKTsKIAkJcmV0dXJuIE1WX0VSUk9SOwpAQCAtMTAxMiwzICsxMzM5LDExIEBACiB7CiAJcmV0dXJuIE1WX1JFR19SRUFEKFJFR19ERFIzX1JBTktfQ1RSTF9BRERSKSAmIFJFR19ERFIzX1JBTktfQ1RSTF9DU19FTkFfTUFTSzsKIH0KKworLyogbXZTeXNFbnZUaW1lcklzUmVmQ2xrMjVNaHo6CisgKiBBMzh4L0EzOXggc3VwcG9ydCAyNU1oeiBhcyByZWYuY2xvY2sgZm9yIHRpbWVyCisgKi8KK01WX0JPT0wgbXZTeXNFbnZUaW1lcklzUmVmQ2xrMjVNaHoodm9pZCkKK3sKKwlyZXR1cm4gTVZfVFJVRTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM4eC9tdlN5c0VudkxpYi5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hMzh4L212U3lzRW52TGliLmgKaW5kZXggNzc5ODJkNS4uNTgyOWUzMiAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hMzh4L212U3lzRW52TGliLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hMzh4L212U3lzRW52TGliLmgKQEAgLTg2LDE1ICs4NiwyNSBAQAogI2RlZmluZSBERVZJQ0VfU0FNUExFX0FUX1JFU0VUMl9SRUcgICAgICAgICAgICAgMHgxODYwNAogI2RlZmluZSBERVZfSURfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODIzOAogCisjZGVmaW5lIERFVklDRV9TQU1QTEVfQVRfUkVTRVQyX1JFR19SRUZDTEtfT0ZGU0VUCTAKKyNkZWZpbmUgREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHX1JFRkNMS18yNU1IWgkwCisjZGVmaW5lIERFVklDRV9TQU1QTEVfQVRfUkVTRVQyX1JFR19SRUZDTEtfNDBNSFoJMQorCiAjZGVmaW5lIENPUkVfUExMX1BBUkFNRVRFUlNfUkVHICAgICAgICAgICAgICAgICAweEU0MkUwCiAjZGVmaW5lIENPUkVfUExMX0NPTkZJR19SRUcgICAgICAgICAgICAgICAgICAgICAweEU0MkU0CiAKICNkZWZpbmUgUVNHTUlJX0NPTlRST0xfUkVHMSAgICAgICAgICAgICAgICAgICAgIDB4MTg0OTQKIAorI2RlZmluZSBVU0IzX0NPTkZJR19SRUcJCQkJMHgxODQyMAorCisjZGVmaW5lIERCR19QT1JUX0NPTkZJR19SRUcJCQkweDE4NmMwCisjZGVmaW5lIERCR19QT1JUX0NPTkZJRzJfUkVHCQkJMHgxODZjNAorCiAjZGVmaW5lIERFVl9JRF9SRUdfREVWSUNFX0lEX09GRlMgICAgICAgICAgICAgICAxNgogI2RlZmluZSBERVZfSURfUkVHX0RFVklDRV9JRF9NQVNLICAgICAgICAgICAgICAgMHhGRkZGMDAwMAogCi0KKyNkZWZpbmUgU0FSX0ZSRVFfT0ZGU0VUIAkJCQkJCTEwCisjZGVmaW5lIFNBUl9GUkVRX01BU0sgIAkJCQkJCQkweDFGCiAjZGVmaW5lIFNBUl9ERVZfSURfT0ZGUyAgICAgICAgICAgICAgICAgICAgICAgICAyNwogI2RlZmluZSBTQVJfREVWX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHg3CiAKQEAgLTExMCw2ICsxMjAsNyBAQAogI2RlZmluZSBNSVNDX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhMDEzQwogI2RlZmluZSBHTFVFX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhMDE0MAogI2RlZmluZSBHRU5FUkFUSU9OX0RJVklERVJfRk9SQ0VfUkVHICAgICAgICAgICAgMHhhMDE0NAorI2RlZmluZSBQTExJTlRQX1JFRzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhMDE1MAogI2RlZmluZSBQQ0lFX1JFRzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhMDEyMAogI2RlZmluZSBMQU5FX0FMSUdOX1JFRzAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhMDEyNAogI2RlZmluZSBTUVVFTENIX0ZGRV9TRVRUSU5HX1JFRyAgICAgICAgICAgICAgICAgMHhhMDAxOApAQCAtMTMzLDEwICsxNDQsMTIgQEAKICNkZWZpbmUgUlhfUkVHMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTAxODgKICNkZWZpbmUgUENJRV9SRUcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTAyODgKICNkZWZpbmUgUENJRV9SRUczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTAyOTAKKyNkZWZpbmUgTEFORV9DRkcwX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTA2MDAKICNkZWZpbmUgTEFORV9DRkcxX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTA2MDQKICNkZWZpbmUgTEFORV9DRkc0X1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTA2MjAKICNkZWZpbmUgTEFORV9DRkc1X1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTA2MjQKICNkZWZpbmUgR0xPQkFMX0NMS19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTA3MDQKKyNkZWZpbmUgR0xPQkFMX1RFU1RfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4YTA3MDgKICNkZWZpbmUgR0xPQkFMX01JU0NfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4YTA3MTgKICNkZWZpbmUgR0xPQkFMX0NMS19TUkNfSEkgICAgICAgICAgICAgICAgICAgICAgIDB4YTA3MTAKIApAQCAtMTc0LDcgKzE4Nyw2IEBACiAjZGVmaW5lIFJFRl9DTEtfU0VMRUNUT1JfVkFMKHJlZ1ZhbCkgICAgICAgICAgICAocmVnVmFsICYgMHgxKQogCiAjZGVmaW5lIE1BWF9TRUxFQ1RPUl9WQUwgICAgICAgICAgICAgICAgICAgICAgICAxMAotCiAvKiBUV1NJIGFkZHJlc3NlcyAqLwogLyogc3RhcnRpbmcgZnJvbSBBMzh4IEEwLCBpMmMgYWRkcmVzcyBvZiBFRVBST00gaXMgMHg1NyAqLwogI2lmZGVmIE1WODhGNjlYWApAQCAtMTg3LDYgKzE5OSw5IEBACiAjZGVmaW5lIERCX0dFVF9NT0RFX1NMTTEzNjRfQUREUiAgICAgICAgICAgICAgICAweDI0CiAjZGVmaW5lIERCMzgxX0dFVF9NT0RFX1NMTTE0MjZfMTQyN19BRERSCTB4NTYKIAorI2RlZmluZSBTQVRSX0RFVklDRV9GTEFWT1JfTUFTSwkJCTB4MTAgLyogREItR1AgJiBEQi0zODEvMiBib2FyZHMgOiBTYXRSIGZpZWxkICdmbGF2b3InKi8KKyNkZWZpbmUgU0FUUl9ERVZJQ0VfRkxBVk9SX09GRlNFVAkJNAorCiAvKiBEQi1CUCBCb2FyZCAnU2F0UicgbWFwcGluZyAqLwogI2RlZmluZSBTQVRSX0RCX0xBTkUxX01BWF9PUFRJT05TCQk3CiAjZGVmaW5lIFNBVFJfREJfTEFORTFfQ0ZHX01BU0sJCQkweDcKQEAgLTIxMywxNCArMjI4LDY4IEBACiAjZGVmaW5lIEFWU19ERUJVR19DTlRSX1JFRyAgICAgICAgICAgICAgMHhFNDEyNAogI2RlZmluZSBBVlNfREVCVUdfQ05UUl9ERUZBVUxUX1ZBTFVFICAgIDB4MDgwMDgwNzMKIAorI2lmZGVmIENPTkZJR19BUk1BREFfMzhYCisJI2RlZmluZSBBVlNfTElNSVRfVkFMX1NMT1cJCTB4MjMJLyoxLjE1ViovCisJI2RlZmluZSBFRlVTRV9XSU5fQ1RSTF9WQUwJCSgoMHhGIDw8IDE2KSB8ICgweDBBIDw8IDgpIHwgKDB4RSA8PCA0KSB8IDB4MSkKKwkjZGVmaW5lIEVGVVNFX1dJTl9CQVNFX1ZBTAkJMHhCMDAwMDAwMAorCSNkZWZpbmUgTVZfRUZVU0VfUkVHX1JFQUQob2Zmc2V0KQlcCisJCU1WX01FTUlPX0xFMzJfUkVBRChFRlVTRV9XSU5fQkFTRV9WQUwgfCAob2Zmc2V0KSkKKwkjZGVmaW5lIEVGVVNFX1dJTl9JRAkJCQk1CisKKwkjZGVmaW5lIEVGVVNFX1JFR19CQVNFCQkJMHhGOEYwMAorCSNkZWZpbmUgRUZVU0VfQVZTX0FORF9CSU5fUkVHCQkoRUZVU0VfUkVHX0JBU0UgKyAweEMpCisJI2RlZmluZSBFRlVTRV9BVlNfVkFMX0JBU0UJCTYKKwkjZGVmaW5lIEVGVVNFX0FWU19WQUxfT0ZGU0VUCQk4CisJI2RlZmluZSBFRlVTRV9BVlNfVkFMX01BU0sJCTB4RkYKKwkjZGVmaW5lIEVGVVNFX0FWU19WRVJTSU9OX1JFRwkJKEVGVVNFX1JFR19CQVNFICsgMHg4KQorCSNkZWZpbmUgRUZVU0VfQVZTX1ZFUlNJT05fT0ZGU0VUCTI0CisJI2RlZmluZSBFRlVTRV9BVlNfVkVSU0lPTl9NQVNLCQkweEYKKwkjZGVmaW5lIEVGVVNFX0FWU19CSU5fT0ZGU0VUCQk0CisJI2RlZmluZSBFRlVTRV9BVlNfQklOX01BU0sJCTB4MworCSNkZWZpbmUgTVZfQVZTX0RFRkFVTFRfVkFMVUUJCTB4MjcJLyogMS4yNVYgKi8KKwl0eXBlZGVmIHN0cnVjdCBib2FyZEF2c0Zyb21FZnVzZU1hcCB7CisJCU1WXzMyIGNwdV9mcmVxX21vZGU7CisJCU1WXzMyIGNwdV9mcmVxOworCQlNVl8zMiBhdnNfYmluX3ZhbHVlOworCX0gTVZfQk9BUkRfQVZTX0VGVVNFX01BUDsKKwkvKiBwcmVkZWZpbmVkIHZhbHVlcyBmb3IgRlVOQ1RJT05fRU5BQkxFX0NPTlRST0wgcGVyIGZsYXZvdXIgKi8KKwkjZGVmaW5lIEVGVVNFX0ZSRVFfVkFMX1NJWkUJCTMKKwkjZGVmaW5lIEVGVVNFX0FWU19WQUxfT0ZGU0VUX0FUX0lORChpbmRleCkgKEVGVVNFX0FWU19WQUxfQkFTRSArIFwKKwkJCQkJCSAgIChFRlVTRV9GUkVRX1ZBTF9TSVpFIC0gKGluZGV4KzEpKSpFRlVTRV9BVlNfVkFMX09GRlNFVCkKKwkjZGVmaW5lIEVGVVNFX0ZSRVFfVkFMX0lORk8ge1wKKwkvKgkJQ1BVIGZyZXF1ZW5jeSBtb2RlLAlDUFUgRnJlcXVlY255LAlBVlNfQklOX1ZBTFVFICovXAorCS8qIDE2MDBNSHogKi8JezB4QywJCQkxNjAwLAkJMHgzfSxcCisJLyogMTg2Nk1IWiAqLwl7MHgxMCwJCQkxODY2LAkJMHgyfSxcCisJLyogMjAwME1IWiAqLwl7MHgxMywJCQkyMDAwLAkJMHgxfSxcCisJfTsKKyNlbHNlCisJI2RlZmluZSBBVlNfTElNSVRfVkFMCQkJMHgyNworI2VuZGlmCisvKiBERlggU2VydmVyIGdlbmVyYWwgcmVnaXN0ZXJzIG1hcHBpbmcgKG9uIHRvcCBvZiBpbnRlcm5hbCByZWdpc3RlcnMpICovCisjZGVmaW5lIERGWF9SRUdfQkFTRQkJCQkweEU0MDAwCisjZGVmaW5lIERGWF9QSVBFX1NFTEVDVF9QSVBFMF9BQ1RJVkVfT0ZGUwkwCisvKiBERlhfUElQRV9TRUxFQ1RfWEJBUl9DTElFTlRfU0VMX09GRlM6CisgKiBTaW5jZSBhZGRyZXNzIGNvbXBsZXRpb24gaW4gMTRiaXQgYWRkcmVzcyBtb2RlLCBhbmQgZ2l2ZW4gdGhhdCBbMTQ6OF0gPT4gWzE5OjEzXSwKKyAqIHRoZSAyIGxvd2VyIGJpdHMgWzk6OF0gPT4gWzE0OjEzXSBhcmUgZGlzbWlzc2VkLiBoZW5jZSBmaWVsZCBvZmZzZXQgaXMgYWxzbyBzaGlmdGVkIHRvIDEwICovCisjZGVmaW5lIERGWF9QSVBFX1NFTEVDVF9YQkFSX0NMSUVOVF9TRUxfT0ZGUwkxMAorI2RlZmluZSBERlhfUElQRV9TRUxFQ1RfVkFMCSAgICAgICAgCSgweDEgPDwgREZYX1BJUEVfU0VMRUNUX1BJUEUwX0FDVElWRV9PRkZTIFwKKwkJCQkJCQl8IDB4MSA8PCBERlhfUElQRV9TRUxFQ1RfWEJBUl9DTElFTlRfU0VMX09GRlMpCisKKyNkZWZpbmUgUlRDX01FTU9SWV9DVFJMX1JFR19CQVNFCQkweEU2MDAwCisjZGVmaW5lIFJUQ19NRU1PUllfV1JBUFBFUl9DT1VOVAkJOAorI2RlZmluZSBSVENfTUVNT1JZX1dSQVBQRVJfUkVHKGkpCQkoUlRDX01FTU9SWV9DVFJMX1JFR19CQVNFICsgKGkgKiAweDQwKSkKKyNkZWZpbmUgUlRDX01FTU9SWV9DVFJMX1JUQ19GSUVMRF9PRkZTCQkzCisjZGVmaW5lIFJUQ19NRU1PUllfQ1RSTF9QRExWTUNfRklFTERfT0ZGUwk2CisjZGVmaW5lIFJUQ19NRU1PUllfV1JBUFBFUl9DVFJMX1ZBTAkgICAgICAgICgweDEgPDwgUlRDX01FTU9SWV9DVFJMX1JUQ19GSUVMRF9PRkZTIFwKKwkJCQkJCQl8IDB4MSA8PCBSVENfTUVNT1JZX0NUUkxfUERMVk1DX0ZJRUxEX09GRlMpCisKICNkZWZpbmUgQVZTX0VOQUJMRURfQ09OVFJPTCAgICAgICAgICAgICAweEU0MTMwCiAjZGVmaW5lIEFWU19MT1dfVkREX0xJTUlUX09GRlMgICAgICAgICAgNAogI2RlZmluZSBBVlNfTE9XX1ZERF9MSU1JVF9NQVNLICAgICAgICAgICgweGZmIDw8IEFWU19MT1dfVkREX0xJTUlUX09GRlMpCi0jZGVmaW5lIEFWU19MT1dfVkREX0xJTUlUX1ZBTCAgICAgICAgICAgKDB4MjcgPDwgQVZTX0xPV19WRERfTElNSVRfT0ZGUykKIAogI2RlZmluZSBBVlNfSElHSF9WRERfTElNSVRfT0ZGUyAgICAgICAgIDEyCiAjZGVmaW5lIEFWU19ISUdIX1ZERF9MSU1JVF9NQVNLICAgICAgICAgKDB4ZmYgPDwgQVZTX0hJR0hfVkREX0xJTUlUX09GRlMpCi0jZGVmaW5lIEFWU19ISUdIX1ZERF9MSU1JVF9WQUwgICAgICAgICAgKDB4MjcgPDwgQVZTX0hJR0hfVkREX0xJTUlUX09GRlMpCisKIAogLyogQm9hcmQgSUQgbnVtYmVycyAqLwogI2RlZmluZSBNQVJWRUxMX0JPQVJEX0lEX01BU0sJCQkweDEwCkBAIC0yMjgsOCArMjk3LDkgQEAKICNkZWZpbmUgQTM4WF9DVVNUT01FUl9CT0FSRF9JRF9CQVNFCQkweDAKICNkZWZpbmUgQTM4WF9DVVNUT01FUl9CT0FSRF9JRDAJCQkoQTM4WF9DVVNUT01FUl9CT0FSRF9JRF9CQVNFICsgMCkKICNkZWZpbmUgQTM4WF9DVVNUT01FUl9CT0FSRF9JRDEJCQkoQTM4WF9DVVNUT01FUl9CT0FSRF9JRF9CQVNFICsgMSkKLSNkZWZpbmUgQTM4WF9HRkNIMTAwX0lECQkJCShBMzhYX0NVU1RPTUVSX0JPQVJEX0lEX0JBU0UgKyAyKQotI2RlZmluZSBBMzhYX01WX01BWF9DVVNUT01FUl9CT0FSRF9JRAkJKEEzOFhfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRSArIDMpCisjZGVmaW5lIEEzOFhfQ0xFQVJGT0dfQk9BUkRfSUQJCQkoQTM4WF9DVVNUT01FUl9CT0FSRF9JRF9CQVNFICsgMikKKyNkZWZpbmUgQTM4WF9HRkNIMTAwX0lECQkJCShBMzhYX0NVU1RPTUVSX0JPQVJEX0lEX0JBU0UgKyAzKQorI2RlZmluZSBBMzhYX01WX01BWF9DVVNUT01FUl9CT0FSRF9JRAkJKEEzOFhfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRSArIDQpCiAjZGVmaW5lIEEzOFhfTVZfQ1VTVE9NRVJfQk9BUkRfTlVNCQkoQTM4WF9NVl9NQVhfQ1VTVE9NRVJfQk9BUkRfSUQgLSBBMzhYX0NVU1RPTUVSX0JPQVJEX0lEX0JBU0UpCiAKIC8qIE1hcnZlbGwgYm9hcmRzIGZvciBBMzh4Ki8KQEAgLTI5OSw2ICszNjksNyBAQAogI2RlZmluZSBNUFBfQ09OVFJPTF9SRUcoaWQpICAgICAgICAgICAgICAgICAgICAgKDB4MTgwMDAgKyAoaWQgKiA0KSkKICNkZWZpbmUgR1BQX0RBVEFfT1VUX1JFRyhncnApCQkJKE1WX0dQUF9SRUdTX0JBU0UoZ3JwKSArIDB4MDApCiAjZGVmaW5lIEdQUF9EQVRBX09VVF9FTl9SRUcoZ3JwKQkJKE1WX0dQUF9SRUdTX0JBU0UoZ3JwKSArIDB4MDQpCisjZGVmaW5lIEdQUF9EQVRBX0lOX1BPTF9SRUcoZ3JwKQkJKE1WX0dQUF9SRUdTX0JBU0UoZ3JwKSArIDB4MEMpCiAjZGVmaW5lIEdQUF9EQVRBX0lOX1JFRyhncnApCQkJKE1WX0dQUF9SRUdTX0JBU0UoZ3JwKSArIDB4MTApCiAjZGVmaW5lIE1WX0dQUF9SRUdTX0JBU0UodW5pdCkgCQkJKDB4MTgxMDAgKyAoKHVuaXQpICogMHg0MCkpCiAKQEAgLTMxMywzMSArMzg0LDM4IEBACiAjZGVmaW5lIE1WXzY4MTFfREVWX0lECQkweDY4MTEKICNkZWZpbmUgTVZfNjgyMF9ERVZfSUQJCTB4NjgyMAogI2RlZmluZSBNVl82ODI4X0RFVl9JRAkJMHg2ODI4CisjZGVmaW5lIE1WXzZXMjJfREVWX0lECQkweDY4MjMgLyogNlcyMiAtIEEzODM6IHVzaW5nIGRldmljZSBJRCB2YWx1ZSAwZiAweDY4MjMgKi8KKyNkZWZpbmUgTVZfNlcyM19ERVZfSUQJCTB4NjgyNCAvKiA2VzIzIC0gQTM4NDogdXNpbmcgZGV2aWNlIElEIHZhbHVlIDBmIDB4NjgyNCAqLwogLyogQXJtYWRhIDM5eCBGYW1pbHkgKi8KICNkZWZpbmUgTVZfNjkyMF9ERVZfSUQJCTB4NjkyMAogI2RlZmluZSBNVl82OTI4X0RFVl9JRAkJMHg2OTI4CiAKIHR5cGVkZWYgZW51bSBfbXZEZXZpY2VJZCB7Ci0JTVZfNjgxMCwKLQlNVl82ODIwLAotCU1WXzY4MTEsCi0JTVZfNjgyOCwKLQlNVl9OT05FLAotCU1WXzY5MjAsCi0JTVZfNjkyOCwKLQlNVl9NQVhfREVWX0lELAorLyogMCAqLwlNVl82ODEwLAorLyogMSAqLwlNVl82ODIwLAorLyogMiAqLwlNVl82ODExLAorLyogMyAqLwlNVl82ODI4LAorLyogNCAqLwlNVl9OT05FLAorLyogNSAqLwlNVl82OTIwLAorLyogNiAqLwlNVl82OTI4LAorLyogNyAqLwlNVl9NQVhfSFdfREVWX0lELAkvKiBEdW1teSBlbnRyeSB0byBpbmRpY2F0ZSBlbmQgb2YgSFcgZGV2aWNlIElEJ3MgKi8KKy8qIDggKi8JTVZfNlcyMiwJCS8qIEEzODM6IFZpcnR1YWwgRGV2aWNlIElEIC0gbm90IHJlcHJlc2VudGVkIGJ5IGRldiBpZCBpbiBTQFIgQCAweDE4NjAwICovCisvKiA5ICovCU1WXzZXMjMsCQkvKiBBMzg0OiBWaXJ0dWFsIERldmljZSBJRCAtIG5vdCByZXByZXNlbnRlZCBieSBkZXYgaWQgaW4gU0BSIEAgMHgxODYwMCAqLworLyogMTAqLwlNVl9NQVhfREVWX0lELAogfSBNVl9ERVZJQ0VfSUQ7CiAKICNkZWZpbmUgTVZfNjgyMF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIE1WXzY4MTBfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBNVl82ODExX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgIDIKICNkZWZpbmUgTVZfNjgyOF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1WXzZXMjJfSU5ERVgJCQkgICAgICA0IC8qIDZXMjI9QTM4MyAqLworI2RlZmluZSBNVl82VzIzX0lOREVYCQkJICAgICAgNSAvKiA2VzIzPUEzODQgKi8KIAogI2RlZmluZSBNVl82OTIwX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgTVZfNjkyOF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAxCiAKICNpZmRlZiBDT05GSUdfQVJNQURBXzM4WAotI2RlZmluZSBNQVhfREVWX0lEX05VTSAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX0RFVl9JRF9OVU0gICAgICAgICAgICAgICAgICAgICAgICA2CiAjZWxzZQogI2RlZmluZSBNQVhfREVWX0lEX05VTSAgICAgICAgICAgICAgICAgICAgICAgIDIKICNlbmRpZgpAQCAtMzUwLDEyICs0MjgsMTIgQEAKICNkZWZpbmUgTVZfNjkyOF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAxCiAKIHR5cGVkZWYgZW51bSBfbXZVbml0SWQgewotICAgICAgICAgICAgUEVYX1VOSVRfSUQgLAotICAgICAgICAgICAgRVRIX0dJR19VTklUX0lELAorCQkJUEVYX1VOSVRfSUQgLAorCQkJU0dNSUlfVU5JVF9JRCwKIAkJCVVTQjNIX1VOSVRfSUQsCiAJCQlVU0IzRF9VTklUX0lELAogCQkJU0FUQV9VTklUX0lELAotICAgICAgICAgICAgUVNHTUlJX1VOSVRfSUQsCisJCQlRU0dNSUlfVU5JVF9JRCwKIAkJCVhBVUlfVU5JVF9JRCwKIAkJCVJYQVVJX1VOSVRfSUQsCiAJCQlNQVhfVU5JVFNfSUQKQEAgLTM3NCwxMSArNDUyLDE0IEBACiAvKiAJCWRldiwJY3RybE1vZGVsLAkJV09fVkFMMCwJV09fVkFMMSAqL1wKIC8qIEEzODAgKi8ge01WXzY4MTAsCU1WXzY4MTBfREVWX0lELAkJMHg3MWZkN2YzLAkweDAwIH0sXAogLyogQTM4MSAqLyB7TVZfNjgyMCwJTVZfNjgyMF9ERVZfSUQsCQkweDc3ZmRmZmYsCTB4MDAgfSxcCi0vKiBBMzg1ICovIHtNVl82ODExLAlNVl82ODExX0RFVl9JRCwJCTB4NzdmZmZmZiwJMHgwMCB9LFwKKy8qIEEzODUgKi8ge01WXzY4MTEsCU1WXzY4MTFfREVWX0lELAkJMHg3N2ZkZmZmLAkweDAwIH0sXAogLyogQTM4OCAqLyB7TVZfNjgyOCwJTVZfNjgyOF9ERVZfSUQsCQkweDc3ZmZmZmYsCTB4MDAgfSxcCiAvKiBOT05FICovIHtNVl9OT05FLAkweDAsCQkJMHgwLAkJMHgwICB9LFwKLS8qIEEzOTUgKi8ge01WXzY5MjAsCU1WXzY5MjBfREVWX0lELAkJMHgxN2ZjZmY3LAkweDAwIH0sXAotLyogQTM5OCAqLyB7TVZfNjkyOCwJTVZfNjkyOF9ERVZfSUQsCQkweDc3ZmZmZjMsCTB4MDAgfSxcCisvKiBBMzk1ICovIHtNVl82OTIwLAlNVl82OTIwX0RFVl9JRCwJCTB4MTdmY2ZmZiwJMHgwMCB9LFwKKy8qIEEzOTggKi8ge01WXzY5MjgsCU1WXzY5MjhfREVWX0lELAkJMHg3N2ZmZmZmLAkweDAwIH0sXAorLypNQVhfSFdfREVWX0lEKi8ge01WX01BWF9IV19ERVZfSUQsCTB4MCwJCQkweDAsCQkweDAgIH0sXAorLyogQTM4MyAqLyB7TVZfNlcyMiwJTVZfNlcyMl9ERVZfSUQsCQkweDc3ZmZmZmYsCTB4MDAgfSxcCisvKiBBMzg0ICovIHtNVl82VzIzLAlNVl82VzIzX0RFVl9JRCwJCTB4NzdmZmZmZiwJMHgwMCB9LFwKIH07CiAKIHR5cGVkZWYgc3RydWN0IGJvYXJkV2FrZXVwR1BJTyB7CkBAIC0zODYsMTIgKzQ2NywyMyBAQAogCU1WXzMyIGdwaW9OdW07CiB9IE1WX0JPQVJEX1dBS0VVUF9HUElPOwogCisKK3R5cGVkZWYgc3RydWN0IGJvYXJkVXNiVmJ1c0dQSU8geworCU1WX1UzMiBib2FyZElkOworCU1WXzMyIHVzYlZidXNHcGlvWzJdOworfSBNVl9CT0FSRF9VU0JfVkJVU19HUElPOworCiB0eXBlZGVmIGVudW0gX212U3VzcGVuZFdha2V1cFN0YXR1cyB7CiAJTVZfU1VTUEVORF9XQUtFVVBfRElTQUJMRUQsCiAJTVZfU1VTUEVORF9XQUtFVVBfRU5BQkxFRCwKIAlNVl9TVVNQRU5EX1dBS0VVUF9FTkFCTEVEX0dQSU9fREVURUNURUQsCisJTVZfU1VTUEVORF9XQUtFVVBfRU5BQkxFRF9NRU1fREVURUNURUQsCiB9IE1WX1NVU1BFTkRfV0FLRVVQX1NUQVRVUzsKIAorI2RlZmluZSBCT09UX0lORk9fQUREUgkJCQkoMHgzMDAwKQorI2RlZmluZSBTVVNQRU5EX01BR0lDX1dPUkQJCQkoMHhERUFEQjAwMikKKyNkZWZpbmUgUkVHSVNURVJfTElTVF9FTkQJCQkoMHhGRkZGRkZGRikKKwogCiAvKiBHUElPIHN0YXR1cyBpbmRpY2F0aW9uIGZvciBTdXNwZW5kIFdha2V1cDoKICAqIGlmIHN1c3BlbmQgdG8gUkFNIGlzIHN1cHBvcnRlZCBhbmQgR1BJTyBpbmlkY2F0aW9uIGlzIGltcGxlbWVudGVkLCBzZXQgdGhlIGdwaW8gbnVtYmVyCkBAIC00MDMsMTMgKzQ5NSwyNiBAQAogI2RlZmluZSBNVl9CT0FSRF9XQUtFVVBfR1BJT19JTkZPIHtcCiB7QTM4WF9DVVNUT01FUl9CT0FSRF9JRDAsCS0xIH0sXAoge0EzOFhfQ1VTVE9NRVJfQk9BUkRfSUQwLAktMSB9LFwKK3tBMzhYX0NMRUFSRk9HX0JPQVJEX0lELAktMSB9LFwKIHtBMzhYX0dGQ0gxMDBfSUQsCQktMSB9LFwKIH07CisKKyNkZWZpbmUgTVZfQk9BUkRfVVNCX1ZCVVNfR1BJT19JTkZPIHtcCit7QTM4WF9DVVNUT01FUl9CT0FSRF9JRDAsIHstMSwgLTF9IH0sXAore0EzOFhfQ1VTVE9NRVJfQk9BUkRfSUQwLCB7LTEsIC0xfSB9LFwKK3tBMzhYX0NMRUFSRk9HX0JPQVJEX0lELCB7LTEsIC0xfSB9LFwKK3tBMzhYX0dGQ0gxMDBfSUQsIHstMSwgLTF9IH0sXAorfTsKICNlbHNlCiAjZGVmaW5lIE1WX0JPQVJEX1dBS0VVUF9HUElPX0lORk8ge1wKIHtBMzlYX0NVU1RPTUVSX0JPQVJEX0lEMCwJLTEgfSxcCiB7QTM5WF9DVVNUT01FUl9CT0FSRF9JRDAsCS0xIH0sXAogfTsKKworI2RlZmluZSBNVl9CT0FSRF9VU0JfVkJVU19HUElPX0lORk8ge1wKK3tBMzlYX0NVU1RPTUVSX0JPQVJEX0lEMCwgey0xLCAtMX0gfSxcCit7QTM5WF9DVVNUT01FUl9CT0FSRF9JRDAsIHstMSwgLTF9IH0sXAorfTsKICNlbmRpZiAvKiBNVjg4RjY4WFggKi8KIAogI2Vsc2UKQEAgLTQyNCwxMSArNTI5LDI2IEBACiB7REJfQlBfNjgyMV9JRCwJIC0yIH0sXAoge0RCX0FNQ182ODIwX0lELCAtMiB9LFwKIH07CisKKyNkZWZpbmUgTVZfQk9BUkRfVVNCX1ZCVVNfR1BJT19JTkZPIHtcCit7UkRfTkFTXzY4WFhfSUQsIHstMSwgLTF9IH0sXAore0RCXzY4WFhfSUQsCSB7LTEsIC0xfSB9LFwKK3tSRF9BUF82OFhYX0lELAkgey0xLCAtMX0gfSxcCit7REJfQVBfNjhYWF9JRCwJIHs0NCwgLTF9IH0sXAore0RCX0dQXzY4WFhfSUQsCSB7LTEsIC0xfSB9LFwKK3tEQl9CUF82ODIxX0lELAkgey0xLCAtMX0gfSxcCit7REJfQU1DXzY4MjBfSUQsIHstMSwgLTF9IH0sXAorfTsKICNlbHNlCiAjZGVmaW5lIE1WX0JPQVJEX1dBS0VVUF9HUElPX0lORk8ge1wKIHtBMzlYX1JEXzY5WFhfSUQsIC0xIH0sXAoge0EzOVhfREJfNjlYWF9JRCwgLTEgfSxcCiB9OworCisjZGVmaW5lIE1WX0JPQVJEX1VTQl9WQlVTX0dQSU9fSU5GTyB7XAore0EzOVhfUkRfNjlYWF9JRCwgey0xLCAtMX0gfSxcCit7QTM5WF9EQl82OVhYX0lELCB7LTEsIC0xfSB9LFwKK307CiAjZW5kaWYgLyogTVY4OEY2OFhYICovCiAjZW5kaWYgLyogQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQgKi8KIGV4dGVybiBNVl9EUkFNX0RMQl9DT05GSUcgZGRyM0RsYkNvbmZpZ1RhYmxlW107CkBAIC01NTAsMTIgKzY3MCwxOSBAQAogKiBtdlN5c0VudkRsYkNvbmZpZ1B0ckdldAogKiBERVNDUklQVElPTjogZGVmaW5lcyBwb2ludGVyIHRvIHRvIERMQiBDT25maWd1cmF0aW9uIHRhYmxlCiAqIElOUFVUOiBub25lCi0qIE9VVFBVVDogCisqIE9VVFBVVDoKICogUkVUVVJOOgogKiAgICAgICByZXR1cm5zIHBvaW50ZXIgdG8gRExCIENPbmZpZ3VyYXRpb24gdGFibGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9EUkFNX0RMQl9DT05GSUcgICptdlN5c0VudkRsYkNvbmZpZ1B0ckdldChNVl9WT0lEKTsKIAorI2RlZmluZSBNVl9CT0FSRF9CSU9TMF9BRERSCQkJCTB4NEMKKyNkZWZpbmUgTVZfQk9BUkRfSU9fRVhQQU5ERVIxX0FERFIJCQkweDIxCisjZGVmaW5lIFRXU0lfQ0hBTk5FTF9BM1hYCQkJCTAKKyNkZWZpbmUgTVZfQk9BUkRfQ1RSTF9JMkNfQUREUl9CQzIJCTB4MAorLyogV0EgZm9yIGJpdHMgMSwyIGluIDB4NGMuIE11c3QgYmUgbG93ZXIgdGhhbiAxMDAwMDAgLT4gMjAwMDAgKi8KKyNkZWZpbmUgVFdTSV9TUEVFRF9CQzIJCQkJCTIwMDAwCisKICNpZmRlZiBDT05GSUdfQ01EX0JPQVJEQ0ZHCiAKICNkZWZpbmUgTVZfQk9BUkRfQ09ORklHX01BWF9CWVRFX0NPVU5UCQk4CkBAIC02NDgsNiArNzc1LDIwIEBACiAjZW5kaWYgLyogQ09ORklHX0NNRF9CT0FSRENGRyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkRm9yY2VQY2llR2VuMUdldCAtIHJlYWQgQkMyIFNhdFIgYmlvczAgYml0WzRdIGZvciBQQ0llIEdFTjEvR0VOMiBtb2RlCisqCisqIERFU0NSSVBUSU9OOgorKgorKiBJTlBVVDoKKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk46IFRSVUUgaWYgY29ubmVjdGVkIHRvIEJDMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0JPT0wgbXZCb2FyZEZvcmNlUGNpZUdlbjFHZXQoTVZfVk9JRCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12U3lzRW52R2V0VG9wb2xvZ3lVcGRhdGVJbmZvCiAqCiAqIERFU0NSSVBUSU9OOiBSZWFkIFRXU0kgZmllbGRzIHRvIHVwZGF0ZSBERFIgdG9wb2xvZ3kgc3RydWN0dXJlCkBAIC02NzYsNSArODE3LDM4IEBACiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfVTMyIG12U3lzRW52R2V0Q1NFbmFGcm9tUmVnKHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdlN5c0VudkNoZWNrV2FrZXVwRHJhbUVuYWJsZQorKgorKiBERVNDUklQVElPTjogQ2hlY2sgdGhlIG1hZ2ljIHdha2V1cCBlbmFibGVkCisqCisqIElOUFVUOiBOb25lCisqCisqIE9VVFBVVDogTm9uZQorKgorKiBSRVRVUk46CisqICAgICAgIE1WX1NVU1BFTkRfV0FLRVVQX0VOQUJMRURfTUVNX0RFVEVDVEVEIG9yIE1WX1NVU1BFTkRfV0FLRVVQX0RJU0FCTEVECisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1VTUEVORF9XQUtFVVBfU1RBVFVTIG12U3lzRW52Q2hlY2tXYWtldXBEcmFtRW5hYmxlKHZvaWQpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtdlN5c0VudlRpbWVySXNSZWZDbGsyNU1oeiAtCisgKgorICogREVTQ1JJUFRJT046ICAgICAgICAgIFJvdXRpbmUgdG8gaW5kaWNhdGUgaWYgMjVNaHogcmVmIGNsb2NrIGZvciB0aW1lciBpcyBzdXBwb3J0ZWQKKyAqIElOUFVUOiAgICAgICAgICAgICAgICBOb25lLgorICogT1VUUFVUOiAgICAgICAgICAgICAgIE5vbmUuCisgKiBSRVRVUk5TOiAgICAgICAgICAgICAgTm9uZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgbXZTeXNFbnZUaW1lcklzUmVmQ2xrMjVNaHooTVZfVk9JRCk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG12Qm9hcmRVc2JWYnVzUmVzZXQgLQorICoKKyAqIERFU0NSSVBUSU9OOiAgICAgICAgICBSb3V0aW5lIHRvIHJlc2V0IFVTQiBWQlVTICh2aWEgR1BJTyBvciBJMkMgSU8gZXhwYW5kZXIpCisgKiBJTlBVVDogICAgICAgICAgICAgICAgTm9uZS4KKyAqIE9VVFBVVDogICAgICAgICAgICAgICBOb25lLgorICogUkVUVVJOUzogICAgICAgICAgICAgIE5vbmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVk9JRCBtdlN5c0VudlVzYlZidXNSZXNldChNVl9WT0lEKTsKICNlbmRpZiAvKiBfX0lOQ212U3lzRW52TGliaCAqLwogCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2FscC9tdlN5c0VudkxpYi5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hbHAvbXZTeXNFbnZMaWIuYwppbmRleCA1YWIxYzkwLi40YjY5OGViIDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2FscC9tdlN5c0VudkxpYi5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYWxwL212U3lzRW52TGliLmMKQEAgLTM3MCwzICszNzAsMTEgQEAKIC8qIE1hcnZlbGwgQm9hcmRzIHVzZSAweDEwIGFzIGJhc2UgZm9yIEJvYXJkIElEOiBtYXNrIE1TQiB0byByZWNlaXZlIGluZGV4IGZvciBib2FyZCBJRCovCiAJcmV0dXJuIGJvYXJkSWQgJiAoTUFSVkVMTF9CT0FSRF9JRF9CQVNFIC0gMSk7CiB9CisKKy8qIG12U3lzRW52VGltZXJJc1JlZkNsazI1TWh6OgorICogQUxQIHN1cHBvcnQgMjVNaHogYXMgcmVmLmNsb2NrIGZvciB0aW1lcgorICovCitNVl9CT09MIG12U3lzRW52VGltZXJJc1JlZkNsazI1TWh6KHZvaWQpCit7CisJcmV0dXJuIE1WX1RSVUU7Cit9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2FscC9tdlN5c0VudkxpYi5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hbHAvbXZTeXNFbnZMaWIuaAppbmRleCAwYmQwMGQ3Li5lYTFlNzAyIDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2FscC9tdlN5c0VudkxpYi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYWxwL212U3lzRW52TGliLmgKQEAgLTI5OCw1ICsyOTgsNyBAQAogTVZfVTMyIG12Q3B1TDJDbGtHZXQoTVZfVk9JRCk7CiBNVl9VMzIgbXZCb2FyZEZyZXFNb2Rlc051bUdldChNVl9WT0lEKTsKIE1WX1UzMiBtdkJvYXJkSWRJbmRleEdldChNVl9VMzIgYm9hcmRJZCk7CitNVl9TVEFUVVMgbXZTeXNFbnZUaW1lcklzUmVmQ2xrMjVNaHooTVZfVk9JRCk7CiAKICNlbmRpZiAvKiBfX0lOQ212Qkhib2FyZEVudlNwZWNoICovCisKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYXhwL212U3lzRW52TGliLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2F4cC9tdlN5c0VudkxpYi5jCmluZGV4IDg5ZDRjZGMuLjI4ZTcyNDYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYXhwL212U3lzRW52TGliLmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9heHAvbXZTeXNFbnZMaWIuYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L21zeXMvbXZTeXNFbnZMaWIuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvbXN5cy9tdlN5c0VudkxpYi5jCmluZGV4IDAwYjI4NjIuLjA1MzQyNjEgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvbXN5cy9tdlN5c0VudkxpYi5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvbXN5cy9tdlN5c0VudkxpYi5jCkBAIC04Nyw0MSArODcsNDAgQEAKIAlpZiAoZ0JvYXJkSWQgIT0gLTEpCiAJCXJldHVybiBnQm9hcmRJZDsKIAotLyogQ3VzdG9tZXIgYm9hcmQgSUQncyAqLwogI2lmZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCi0JI2lmZGVmIENPTkZJR19CT0JDQVQyCi0JI2lmZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF8wCi0JCQlnQm9hcmRJZCA9IEJDMl9DVVNUT01FUl9CT0FSRF9JRDA7Ci0JCSNlbGlmIENPTkZJR19DVVNUT01FUl9CT0FSRF8xCi0JCQlnQm9hcmRJZCA9IEJDMl9DVVNUT01FUl9CT0FSRF9JRDE7Ci0JCSNlbmRpZgotCSNlbGlmIGRlZmluZWQgQ09ORklHX0FMTEVZQ0FUMworCisJI2lmIGRlZmluZWQgQ09ORklHX0FMTEVZQ0FUMwogCQkjaWZkZWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEXzAKIAkJCWdCb2FyZElkID0gQUMzX0NVU1RPTUVSX0JPQVJEX0lEMDsKIAkJI2VsaWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEXzEKIAkJCWdCb2FyZElkID0gQUMzX0NVU1RPTUVSX0JPQVJEX0lEMTsKIAkJI2VuZGlmCisJI2Vsc2UgLyogQkMyICovCisJCSNpZmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMAorCQkJZ0JvYXJkSWQgPSBCQzJfQ1VTVE9NRVJfQk9BUkRfSUQwOworCQkjZWxpZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMQorCQkJZ0JvYXJkSWQgPSBCQzJfQ1VTVE9NRVJfQk9BUkRfSUQxOworCQkjZW5kaWYKIAkjZW5kaWYKLSNlbHNlCi0vKiBCb2JDYXQyIEJvYXJkIElEJ3MgKi8KLQkjaWYgZGVmaW5lZChEQl9CT0JDQVQyKQotCQlnQm9hcmRJZCA9IERCX0RYX0JDMl9JRDsKLQkjZWxpZiBkZWZpbmVkKFJEX0JPQkNBVDIpCi0JCWdCb2FyZElkID0gUkRfRFhfQkMyX0lEOwotCSNlbGlmIGRlZmluZWQoUkRfTVRMX0JPQkNBVDIpCi0JCWdCb2FyZElkID0gUkRfTVRMX0JDMjsKLQkjZWxzZQotCQlNVl9VOCByZWFkVmFsdWUgPSAwOwotCQkvKiBBbGxleUNhdDMgQm9hcmQgSUQncyAqLwotCQlpZiAobXZCb2FyZFNhckJvYXJkSWRHZXQoJnJlYWRWYWx1ZSkgIT0gTVZfT0sgfHwgcmVhZFZhbHVlID49IEFDM19NQVJWRUxMX0JPQVJEX05VTSkgewotCQkJbXZQcmludGYoIiVzOiBFcnJvciBvYnRhaW5pbmcgQm9hcmQgSUQgZnJvbSBFRVBST00gKCVkKVxuIiwgX19mdW5jX18sIHJlYWRWYWx1ZSk7Ci0JCQltdlByaW50ZigiJXM6IFNldHRpbmcgZGVmYXVsdCBib2FyZDogREItRFhBQzMtTU1cbiIsIF9fZnVuY19fKTsKLQkJCXJlYWRWYWx1ZSA9IERCX0FDM19JRCAtIEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0U7Ci0JCX0KIAotCQlnQm9hcmRJZCA9IEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyByZWFkVmFsdWU7Ci0JI2VuZGlmCi0jZW5kaWYKKyNlbHNlCS8qICFDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCAqLworCisJTVZfVTggcmVhZFZhbHVlOworCisJaWYgKG12Qm9hcmRTYXJCb2FyZElkR2V0KCZyZWFkVmFsdWUpICE9IE1WX09LKSB7CisJCW12UHJpbnRmKCIlczogRXJyb3Igb2J0YWluaW5nIEJvYXJkIElEIGZyb20gRUVQUk9NICglZClcbiIsIF9fZnVuY19fLCByZWFkVmFsdWUpOworCQltdlByaW50ZigiJXM6IFNldHRpbmcgZGVmYXVsdCBib2FyZCB0bzogJWRcbiIsIF9fZnVuY19fLCBNVl9ERUZBVUxUX0JPQVJEX0lEKTsKKwkJcmVhZFZhbHVlID0gTVZfREVGQVVMVF9CT0FSRF9JRDsKKwl9CisJcmVhZFZhbHVlID0gcmVhZFZhbHVlICYgKEJPQVJEX0lEX0lOREVYX01BU0sgLSAxKTsKKworCWlmIChyZWFkVmFsdWUgPj0gTVZfTUFSVkVMTF9CT0FSRF9OVU0pIHsKKwkJbXZQcmludGYoIiVzOiBFcnJvcjogcmVhZCB3cm9uZyBib2FyZCBJRCAoJWQpXG4iLCBfX2Z1bmNfXywgcmVhZFZhbHVlKTsKKwkJcmV0dXJuIElOVkFMSURfQk9BUkRfSUQ7CisJfQorCWdCb2FyZElkID0gTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgcmVhZFZhbHVlOworCisjZW5kaWYgLyogQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQgKi8KIAogCXJldHVybiBnQm9hcmRJZDsKIH0KQEAgLTE1NSw2ICsxNTQsMjIgQEAKIAlyZXR1cm4gTVZfQk9BUkRfVENMS18yMDBNSFo7CiB9CiAKKy8qIFVzZSBmbGFnVHdzaUluaXQgZ2xvYmFsIGZsYWcgdG8gaW5pdCB0aGUgVHdzaSBvbmNlICovCitzdGF0aWMgaW50IGZsYWdUd3NpSW5pdCA9IC0xOworTVZfU1RBVFVTIG12SHdzVHdzaUluaXRXcmFwcGVyKE1WX1ZPSUQpCit7CisJTVZfVFdTSV9BRERSIHNsYXZlOworCisJaWYgKGZsYWdUd3NpSW5pdCA9PSAtMSkgeworCQlzbGF2ZS50eXBlID0gQUREUjdfQklUOworCQlzbGF2ZS5hZGRyZXNzID0gMDsKKwkJbXZUd3NpSW5pdCgwLCBUV1NJX1NQRUVELCBtdkJvYXJkVGNsa0dldCgpLCAmc2xhdmUsIDApOworCQlmbGFnVHdzaUluaXQgPSAxOworCisJfQorCXJldHVybiBNVl9PSzsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBUaGUgQm9hcmQgSWQgaXMgdGFrZW4gZnJvbSB0aGUgZmlyc3QgYWRkcmVzcy12YWx1ZSBwYWlyIG9mIHRoZSBFRVBST00gaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UKICAqIEluIG9yZGVyIHRvIHN1cHBvcnQgbm9ybWFsIFRXU0kgaW5pdCBzZXF1ZW5jZSBmbG93LCB0aGUgZmlyc3QgcGFpciBvZiBEV09SRFMgb24gRUVQUk9NCkBAIC0yMzEsNiArMjQ2LDI1IEBACiAJLyogVEJEICovCiAJcmV0dXJuIE1WX1NVU1BFTkRfV0FLRVVQX0RJU0FCTEVEOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdlN5c0VudkNoZWNrV2FrZXVwRHJhbUVuYWJsZQorKgorKiBERVNDUklQVElPTjogQ2hlY2sgdGhlIG1hZ2ljIHdha2V1cCBlbmFibGVkCisqCisqIElOUFVUOiBOb25lCisqCisqIE9VVFBVVDogTm9uZQorKgorKiBSRVRVUk46CisqICAgICAgIE1WX1NVU1BFTkRfV0FLRVVQX0VOQUJMRURfTUVNX0RFVEVDVEVEIG9yIE1WX1NVU1BFTkRfV0FLRVVQX0RJU0FCTEVECisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1VTUEVORF9XQUtFVVBfU1RBVFVTIG12U3lzRW52Q2hlY2tXYWtldXBEcmFtRW5hYmxlKHZvaWQpCit7CisJcmV0dXJuIE1WX1NVU1BFTkRfV0FLRVVQX0RJU0FCTEVEOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdlN5c0VudkRsYkNvbmZpZ1B0ckdldAogKiBERVNDUklQVElPTjogZGVmaW5lcyBwb2ludGVyIHRvIHRvIERMQiBDT25maWd1cmF0aW9uIHRhYmxlCkBAIC0yNjMsMTYgKzI5NywyNCBAQAogCU1WX1U4CWNvbmZpZ1ZhbDsKIAlNVl9UV1NJX1NMQVZFIHR3c2lTbGF2ZTsKIAotCS8qRml4IHRoZSB0b3BvbG9neSBmb3IgQTM4MCBieSBTYXRSIHZhbHVlcyovCisJLyogb24gQUMzLCBERFIgY29uZmlndXJhdGlvbiAoaS5lIEVDQykgc3VwcG9ydGVkIG9ubHkgZm9yIERCIGJvYXJkICovCisjaWYgZGVmaW5lZCBDT05GSUdfQUxMRVlDQVQzCisJaWYgKG12Qm9hcmRJZEdldCgpICE9IERCX0FDM19JRCkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworCS8qRml4IHRoZSB0b3BvbG9neSBmb3IgbXN5cyBieSBTYXRSIHZhbHVlcyovCiAJdHdzaVNsYXZlLnNsYXZlQWRkci5hZGRyZXNzID0gMHg0RDsKIAl0d3NpU2xhdmUuc2xhdmVBZGRyLnR5cGUgPSBBRERSN19CSVQ7CiAJdHdzaVNsYXZlLnZhbGlkT2Zmc2V0ID0gTVZfVFJVRTsKIAl0d3NpU2xhdmUub2Zmc2V0ID0gMDsKIAl0d3NpU2xhdmUubW9yZVRoZW4yNTYgPSBNVl9UUlVFOwogCi0JLyogUmVhZGluZyBib2FyZCBpZCAqLworCS8qIFJlYWRpbmcgdXBkYXRlIEREUiBFQ0MgRW5hYmxlIGZyb20gZGV2aWNlCisJICogYWRkcmVzczogMHg0RCwgcmVnaXN0ZXI6IDAgYml0c1swOjFdCisJICovCiAJaWYgKG12VHdzaVJlYWQoMCwgJnR3c2lTbGF2ZSwgJmNvbmZpZ1ZhbCwgMSkgIT0gTVZfT0spIHsKLQkJREVCVUdfSU5JVF9TKCJtdkh3c0JvYXJkSWRHZXQ6IFRXU0kgUmVhZCBmYWlsZWRcbiIpOworCQltdlByaW50ZigiJXM6IFR3c2kgZmFpbGVkIHRvIHJlYWQgZW5hYmxlIEREUiBFQ0MgdXBkYXRlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzEzLDQgKzM1NSwxMCBAQAogCXJldHVybiAxOwogI2VuZGlmCiB9Ci0KKy8qIG12U3lzRW52VGltZXJJc1JlZkNsazI1TWh6OgorICogTVNZUyBCb2JjYXQyIGFuZCBBbGxleUNhdDMgZG9lc24ndCBzdXBwb3J0IDI1TWh6IGFzIHJlZi5jbG9jayBmb3IgdGltZXIKKyAqLworTVZfQk9PTCBtdlN5c0VudlRpbWVySXNSZWZDbGsyNU1oeih2b2lkKQoreworCXJldHVybiBNVl9GQUxTRTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvbXN5cy9tdlN5c0VudkxpYi5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9tc3lzL212U3lzRW52TGliLmgKaW5kZXggN2RmOGMwOC4uYTdhMTg2NyAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9tc3lzL212U3lzRW52TGliLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9tc3lzL212U3lzRW52TGliLmgKQEAgLTEwNCw2ICsxMDQsMTggQEAKICNkZWZpbmUgSU5WQUxJRF9CT0FSRF9JRAkJCTB4RkZGRgogI2RlZmluZSBCT0FSRF9JRF9JTkRFWF9NQVNLCQkJMHgxMAkvKiBNYXNrIHVzZWQgdG8gcmV0dXJuIGJvYXJkIGluZGV4IHZpYSBib2FyZCBJZCAqLwogCisjaWYgZGVmaW5lZCBDT05GSUdfQUxMRVlDQVQzCisJI2RlZmluZSBNQVJWRUxMX0JPQVJEX0lEX0JBU0UJCUFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UKKwkjZGVmaW5lIE1WX01BWF9NQVJWRUxMX0JPQVJEX0lECQlBQzNfTUFSVkVMTF9NQVhfQk9BUkRfSUQKKwkjZGVmaW5lIE1WX01BUlZFTExfQk9BUkRfTlVNCQlBQzNfTUFSVkVMTF9CT0FSRF9OVU0KKwkjZGVmaW5lIE1WX0RFRkFVTFRfQk9BUkRfSUQJCQlEQl9BQzNfSUQKKyNlbHNlCisJI2RlZmluZSBNQVJWRUxMX0JPQVJEX0lEX0JBU0UJCUJDMl9NQVJWRUxMX0JPQVJEX0lEX0JBU0UKKwkjZGVmaW5lIE1WX01BWF9NQVJWRUxMX0JPQVJEX0lECQlCQzJfTUFSVkVMTF9NQVhfQk9BUkRfSUQKKwkjZGVmaW5lIE1WX01BUlZFTExfQk9BUkRfTlVNCQlCQzJfTUFSVkVMTF9CT0FSRF9OVU0KKwkjZGVmaW5lIE1WX0RFRkFVTFRfQk9BUkRfSUQJCQlEQl9EWF9CQzJfSUQKKyNlbmRpZgorCiAKIC8qIEJvYmNhdDIgZGV2aWNlIHJldmlzaW9uICovCiAjZGVmaW5lIEJDMl9ERVZfVkVSU0lPTl9JRF9SRUcJCSAgICAgICAgICAgMHhGODI0MAkvKiB1bmRlciBzZXJ2ZXIgc3BhY2UgKi8KQEAgLTEyMSw2ICsxMzMsNyBAQAogCU1WX1NVU1BFTkRfV0FLRVVQX0RJU0FCTEVELAogCU1WX1NVU1BFTkRfV0FLRVVQX0VOQUJMRUQsCiAJTVZfU1VTUEVORF9XQUtFVVBfRU5BQkxFRF9HUElPX0RFVEVDVEVELAorCU1WX1NVU1BFTkRfV0FLRVVQX0VOQUJMRURfTUVNX0RFVEVDVEVELAogfSBNVl9TVVNQRU5EX1dBS0VVUF9TVEFUVVM7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogR2xvYmFscyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNzAsNSArMjgzLDM4IEBACiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfVTMyIG12U3lzRW52R2V0Q1NFbmFGcm9tUmVnKHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdlN5c0VudkNoZWNrV2FrZXVwRHJhbUVuYWJsZQorKgorKiBERVNDUklQVElPTjogQ2hlY2sgdGhlIG1hZ2ljIHdha2V1cCBlbmFibGVkCisqCisqIElOUFVUOiBOb25lCisqCisqIE9VVFBVVDogTm9uZQorKgorKiBSRVRVUk46CisqICAgICAgIE1WX1NVU1BFTkRfV0FLRVVQX0VOQUJMRURfTUVNX0RFVEVDVEVEIG9yIE1WX1NVU1BFTkRfV0FLRVVQX0RJU0FCTEVECisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1VTUEVORF9XQUtFVVBfU1RBVFVTIG12U3lzRW52Q2hlY2tXYWtldXBEcmFtRW5hYmxlKHZvaWQpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtdlN5c0VudlRpbWVySXNSZWZDbGsyNU1oeiAtCisgKgorICogREVTQ1JJUFRJT046ICAgICAgICAgIFJvdXRpbmUgdG8gaW5kaWNhdGUgaWYgMjVNaHogcmVmIGNsb2NrIGZvciB0aW1lciBpcyBzdXBwb3J0ZWQKKyAqIElOUFVUOiAgICAgICAgICAgICAgICBOb25lLgorICogT1VUUFVUOiAgICAgICAgICAgICAgIE5vbmUuCisgKiBSRVRVUk5TOiAgICAgICAgICAgICAgTm9uZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgbXZTeXNFbnZUaW1lcklzUmVmQ2xrMjVNaHooTVZfVk9JRCk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG12SHdzVHdzaUluaXRXcmFwcGVyIC0KKyAqCisgKiBERVNDUklQVElPTjogICAgICAgICAgV3JhcHBlciBmb3IgaW5pdGlhbGl6aW5nIHRoZSBUV1NJIHVuaXQKKyAqIElOUFVUOiAgICAgICAgICAgICAgICBOb25lLgorICogT1VUUFVUOiAgICAgICAgICAgICAgIE5vbmUuCisgKiBSRVRVUk5TOiAgICAgICAgICAgICAgTm9uZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgbXZId3NUd3NpSW5pdFdyYXBwZXIoTVZfVk9JRCk7CiAjZW5kaWYgLyogX19JTkNtdkJIYm9hcmRFbnZTcGVjaCAqLwogCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvY29tbWFuZC5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL2NvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjEzZjRhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL2NvbW1hbmQuYwpAQCAtMCwwICsxLDQzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcworYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvcgorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4KK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorCSAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKKwl1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisJc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBpbmNsdWRlcyAqLworCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgIm12VWFydC5oIgorI2luY2x1ZGUgImxpYl91dGlscy5oIgorI2luY2x1ZGUgInByaW50Zi5oIgorCitpbnQgZG9faGVscChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pOworaW50IGRvX21lbV9tZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pOworaW50IGRvX21lbV9tdyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pOworaW50IGRvX21lbV9tbShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pOworaW50IGRvX21lbV9jbXAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBkb19tZW1fY3AoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBpcl9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCB0cmFpbmluZ19jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBkb19tZW1fbXRlc3QoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBkb194b3JNZW1UZXN0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7CisKKy8qIENvbW1hbmRzIFRhYmxlCisgKiBFdmVyeSBuZXcgY29tbWFuZCBpcyBhZGRlZCBoZXJlLCBUaHVzIGl0IG11c3QgYmUgZGVjbGFyZWQgaW4KKyAqIHRoaXMgZmlsZSwgb3IgaW5jbHVkZSB0aGUgZmlsZSBkZWNsYXJpbmcgaXQKKyAqIEZvciBleGFtcGxlLCBUbyBhZGQgbmV3IGNvbW1hbmQgdGhhdCBpcyBpbXBsZW1lbnRlZCBpbiAnaGVsbG9fd29ybGQnIGZ1bmN0aW9uCisgKiB0aGlzIGxpbmUgaXMgYWRkZWQgdG8gdGhlIGRlY2xhcmF0aW9uOgorICoJeyAiaGVsbG8iLCAyLCBoZWxsb193b3JsZCwgInByaW50cyBoZWxsbyB3b3JsZCIsICIifQorICovCitjbWRfdGJsX3QgY29tbWFuZHNbXSA9IHsKKwl7ICI/IiwgMiwgZG9faGVscCwgInByaW50cyBoZWxwIG1lc3NhZ2Ugb2YgY29tbWFuZCIsICJjb21tYW5kLW5hbWUifSwKKwl7ICJtZCIsIDMsIGRvX21lbV9tZCwgIm1lbW9yeSBkaXNwbGF5IiwgIlsuYiwgLncsIC5sXSBhZGRyZXNzIFsjIG9mIG9iamVjdHNdIn0sCisJeyAibXciLAk0LCBkb19tZW1fbXcsICJtZW1vcnkgd3JpdGUgKGZpbGwpIiwgIlsuYiwgLncsIC5sXSBhZGRyZXNzIHZhbHVlIFtjb3VudF0ifSwKKwl7ICJtbSIsCTIsIGRvX21lbV9tbSwgIm1lbW9yeSBtb2RpZnkgKGF1dG8taW5jcmVtZW50aW5nIGFkZHJlc3MpIiwgIlsuYiwgLncsIC5sXSBhZGRyZXNzIn0sCisJeyAiY21wIiwgNCwgZG9fbWVtX2NtcCwgIm1lbW9yeSBjb21wYXJlIiwgIlsuYiwgLncsIC5sXSBhZGRyMSBhZGRyMiBjb3VudCJ9LAorCXsgImNwIiwgNCwgZG9fbWVtX2NwLCAibWVtb3J5IGNvcHkiLCAiWy5iLCAudywgLmxdIHNvdXJjZSB0YXJnZXQgY291bnQifSwKKwl7ICJpciIsIDIsIGlyX2NtZCwgImlyCS0gcmVhZGluZyBhbmQgY2hhbmdpbmcgTVYgaW50ZXJuYWwgcmVnaXN0ZXIgdmFsdWVzLlxuIiwgImFkZHJlc3MifSwKKwl7ICJ0cmFpbmluZyIsIDEsIHRyYWluaW5nX2NtZCwgInRyYWluaW5nCS0gcHJpbnRzIHRoZSByZXN1bHRzIG9mIHRoZSBERFIzIFRyYWluaW5nLlxuIn0sCisJeyAibXRlc3QiLCA1LCBkb19tZW1fbXRlc3QsICJzaW1wbGUgUkFNIHJlYWQvd3JpdGUgdGVzdCIsICJbc3RhcnQgW2VuZCBbcGF0dGVybiBbaXRlcmF0aW9uc11dXV0ifSwKKwl7ICJ4b3JtdGVzdCIsIDQsIGRvX3hvck1lbVRlc3QsICJydW4gbWVtb3J5IHRlc3QgYmFzZWQgb24gWE9SIGVuZ2luZSIsCisJCSJbc291cmNlIFtkZXN0aW5hdGlvbiBbc2l6ZShieXRlcykgW2l0ZXJhdGlvbnNdXV1dIn0KK307CisKKy8qIGxvY2FsIGZ1bmN0aW9ucyBkZWZpbml0aW9ucyAqLworY21kX3RibF90ICpmaW5kX2NtZChjb25zdCBjaGFyICpjbWQpOwordm9pZCBjbWRfdXNhZ2UoY29uc3QgY21kX3RibF90ICpjbWR0cCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGRvX2hlbHAKKyoKKyogREVTQ1JJUFRJT046CisqIENvbW1hbmQgdGhhdCBwcmludHMgdGhlIGhlbHAgbWVzc2FnZSBvZiBjb21tYW5kcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkb19oZWxwKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK3sKKwljbWRfdGJsX3QgKmNtZDsKKworCWlmIChhcmdjIDw9IDEpCisJCXJldHVybiAwOworCisJY21kID0gZmluZF9jbWQoYXJndlsxXSk7CisJaWYgKGNtZCA9PSBOVUxMKSB7CisJCW12UHJpbnRmKCJDb21tYW5kIG5vdCBmb3VuZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbWRfdXNhZ2UoY21kKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRvX21lbV9tZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pOworaW50IGRvX21lbV9tdyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pOworaW50IGRvX21lbV9tbShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pOworaW50IGRvX21lbV9jbXAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBkb19tZW1fY3AoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBpcl9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCB0cmFpbmluZ19jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBkb19tZW1fbXRlc3QoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY21kX2dldF9kYXRhX3NpemUKKyoKKyogREVTQ1JJUFRJT046CisqIENoZWNrIGZvciBhIHNpemUgc3BlY2lmaWNhdGlvbiAuYiwgLncgb3IgLmwuCisqCisqIElOUFVUOgorKglhcmcJCS0gY29tbWFuZCAoZS5nLiAibXcubCIpCisqCWRlZmF1bHRfc2l6ZQktIGRlZmF1bHQgc2l6ZSB0byByZXR1cm4gaWYgbm8gc2l6ZSB3YXMgc3BlY2lmaWVkCisqCisqIFJFVFVSTjoKKyoJaWYgc2l6ZSB3YXMgc3BlY2lmaWVkLCByZXR1cm4gY29ycmVzcG9uZGluZyBzaXplCisqCQkoLmIgPSAxLCAudyA9IDIsIC5sID0gNCkKKyoJb3RoZXJ3aXNlLCByZXR1cm4gZGVmYXVsdF9zaXplCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGNtZF9nZXRfZGF0YV9zaXplKGNoYXIgKmFyZywgaW50IGRlZmF1bHRfc2l6ZSkKK3sKKwlpbnQgbGVuID0gc3RybGVuKGFyZyk7CisJaWYgKGxlbiA+IDIgJiYgYXJnW2xlbi0yXSA9PSAnLicpIHsKKwkJc3dpdGNoIChhcmdbbGVuLTFdKSB7CisJCWNhc2UgJ2InOgorCQkJcmV0dXJuIDE7CisJCWNhc2UgJ3cnOgorCQkJcmV0dXJuIDI7CisJCWNhc2UgJ2wnOgorCQkJcmV0dXJuIDQ7CisJCWNhc2UgJ3MnOgorCQkJcmV0dXJuIC0yOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiBkZWZhdWx0X3NpemU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGZpbmRfY21kX3RibAorKgorKiBERVNDUklQVElPTjoKKyogc2VhcmNoIGZvciBjb21tYW5kIGluIGNvbW1hbmQgdGFibGUKKyoKKyogSU5QVVQ6CisqCWNtZAkJLSBjb21tYW5kIChlLmcuICJpciIpCisqCXRhYmxlCQktIGNvbW1hbmRzIHRhYmxlCisqCXRhYmxlX2xlbgktIGNvbW1hbmRzIHRhYmxlIGxlbmd0aAorKgorKiBSRVRVUk46CisqCWlmIGNvbW1hbmQgd2FzIGZvdW5kLCBjbWRfdGJsX3QgZW50cnkgY29ycmVzcG9uZGluZyB0aGUgY29tbWFuZAorKglvdGhlcndpc2UsIE5VTEwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbWRfdGJsX3QgKmZpbmRfY21kX3RibChjb25zdCBjaGFyICpjbWQsIGNtZF90YmxfdCAqdGFibGUsIGludCB0YWJsZV9sZW4pCit7CisJY21kX3RibF90ICpjbWR0cDsKKwljbWRfdGJsX3QgKmNtZHRwX3RlbXAgPSB0YWJsZTsJLypJbml0IHZhbHVlICovCisJY29uc3QgY2hhciAqcDsKKwlpbnQgbGVuOworCWludCBuX2ZvdW5kID0gMDsKKworCWlmICghY21kKQorCQlyZXR1cm4gTlVMTDsKKwkvKgorCSAqIFNvbWUgY29tbWFuZHMgYWxsb3cgbGVuZ3RoIG1vZGlmaWVycyAobGlrZSAiY3AuYiIpOworCSAqIGNvbXBhcmUgY29tbWFuZCBuYW1lIG9ubHkgdW50aWwgZmlyc3QgZG90LgorCSAqLworCWxlbiA9ICgocCA9IHN0cmNocihjbWQsICcuJykpID09IE5VTEwpID8gc3RybGVuKGNtZCkgOiAocCAtIGNtZCk7CisKKwlmb3IgKGNtZHRwID0gdGFibGU7CisJICAgICBjbWR0cCAhPSB0YWJsZSArIHRhYmxlX2xlbjsKKwkgICAgIGNtZHRwKyspIHsKKwkJaWYgKHN0cm5jbXAoY21kLCBjbWR0cC0+bmFtZSwgbGVuKSA9PSAwKSB7CisJCQlpZiAobGVuID09IHN0cmxlbihjbWR0cC0+bmFtZSkpCisJCQkJcmV0dXJuIGNtZHRwOwkvKiBmdWxsIG1hdGNoICovCisKKwkJCWNtZHRwX3RlbXAgPSBjbWR0cDsJLyogYWJicmV2aWF0ZWQgY29tbWFuZCA/ICovCisJCQluX2ZvdW5kKys7CisJCX0KKwl9CisJaWYgKG5fZm91bmQgPT0gMSkgewkJCS8qIGV4YWN0bHkgb25lIG1hdGNoICovCisJCXJldHVybiBjbWR0cF90ZW1wOworCX0KKworCXJldHVybiBOVUxMOwkvKiBub3QgZm91bmQgb3IgYW1iaWd1b3VzIGNvbW1hbmQgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZmluZF9jbWQKKyoKKyogREVTQ1JJUFRJT046CisqIHdyYXBwZXIgZnVuY3Rpb24gZm9yICdmaW5kX2NtZF90YmwnCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY21kX3RibF90ICpmaW5kX2NtZChjb25zdCBjaGFyICpjbWQpCit7CisJcmV0dXJuIGZpbmRfY21kX3RibChjbWQsIGNvbW1hbmRzLCBzaXplb2YoY29tbWFuZHMpL3NpemVvZihzdHJ1Y3QgY21kX3RibF9zKSk7Cit9CisKK3N0YXRpYyBpbnQgY21kX2NhbGwoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSAoY21kdHAtPmNtZCkoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNtZF91c2FnZQorKgorKiBERVNDUklQVElPTjoKKyogcHJpbnRzIHRoZSBoZWxwIG1lc3NhZ2Ugb2YgdGhlIGNvbW1hbmQKKyoKKyogSU5QVVQ6CisqCWNtZHRwCS0gY29tbWFuZCBlbnRyeSBwb2ludGVyCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjbWRfdXNhZ2UoY29uc3QgY21kX3RibF90ICpjbWR0cCkKK3sKKwltdlByaW50ZigiJXMgLSAlc1xuXG4iLCBjbWR0cC0+bmFtZSwgY21kdHAtPnVzYWdlKTsKKwltdlByaW50ZigiVXNhZ2U6XG4lcyAiLCBjbWR0cC0+bmFtZSk7CisKKwlpZiAoIWNtZHRwLT5oZWxwKQorCQlyZXR1cm47CisKKwltdlByaW50ZigiJXNcbiIsIGNtZHRwLT5oZWxwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY21kX3Byb2Nlc3MKKyoKKyogREVTQ1JJUFRJT046CisqIHNlYXJjaCBmb3IgY29tbWFuZCBpbiBjb21tYW5kIHRhYmxlIGFuZCBydW4gaXQKKyoKKyogSU5QVVQ6CisqCWZsYWcJLSBjb21tYW5kIGZsYWcKKyoJYXJnYwktIG51bWJlciBvZiBhcmd1bWVudHMKKyoJYXJndgktIGFyZ3VtZW50cyBhcnJheQorKgorKiBSRVRVUk46CisqCUNNRF9SRVRfU1VDQ0VTUygwKSwgaWYgY29tbWFuZCB3YXMgcmFuIHN1Y2Nlc3NmdWxseQorKglDTURfUkVUX0ZBSUxVUkUoMSksIG9uIGZhaWx1cmUKKyoJQ01EX1JFVF9VU0FHRSgtMSksIG9uIGZhaWx1cmUgYW5kIG5lZWQgdG8gcHJpbnQgaGVscCBtZXNzYWdlIChmdXR1cmUgdXNlKQorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VudW0gY29tbWFuZF9yZXRfdCBjbWRfcHJvY2VzcyhpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCit7CisJZW51bSBjb21tYW5kX3JldF90IHJjID0gQ01EX1JFVF9TVUNDRVNTOworCWNtZF90YmxfdCAqY21kdHA7CisKKwkvKiBMb29rIHVwIGNvbW1hbmQgaW4gY29tbWFuZCB0YWJsZSAqLworCWNtZHRwID0gZmluZF9jbWQoYXJndlswXSk7CisJaWYgKGNtZHRwID09IE5VTEwpIHsKKwkJcHV0c3RyaW5nKCJVbmtub3duIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBmb3VuZCAtIGNoZWNrIG1heCBhcmdzICovCisJaWYgKGFyZ2MgPiBjbWR0cC0+bWF4YXJncykKKwkJcmMgPSBDTURfUkVUX1VTQUdFOworCisKKwkvKiBJZiBPSyBzbyBmYXIsIHRoZW4gZG8gdGhlIGNvbW1hbmQgKi8KKwlpZiAoIXJjKQorCQlyYyA9IGNtZF9jYWxsKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKworCWlmIChyYyA9PSBDTURfUkVUX1VTQUdFKQorCQljbWRfdXNhZ2UoY21kdHApOworCisJcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwYXJzZV9saW5lCisqCisqIERFU0NSSVBUSU9OOgorKiBwYXJzZSBjb21tYW5kIGFuZCBzdG9yZSBhcmd1bWVudHMgaW4gYXJndgorKgorKiBJTlBVVDoKKyoJbGluZQktIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29tbWFuZCBzdHJpbmcKKyoKKyogT1VUUFVUOgorKglhcmd2CS0gb3V0cHV0IGFycmF5IG9mIHRoZSBwYXJzZWQgYXJndW1lbnRzCisqCisqIFJFVFVSTjoKKyoJbnVtYmVyIG9mIGFyZ3VtZW50cworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBwYXJzZV9saW5lKGNoYXIgKmxpbmUsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgbmFyZ3MgPSAwOworCisJd2hpbGUgKG5hcmdzIDwgQ09ORklHX1NZU19NQVhBUkdTKSB7CisKKwkJLyogc2tpcCBhbnkgd2hpdGUgc3BhY2UgKi8KKwkJd2hpbGUgKGlzYmxhbmsxKCpsaW5lKSkKKwkJCSsrbGluZTsKKworCQlpZiAoKmxpbmUgPT0gJ1wwJykgewkvKiBlbmQgb2YgbGluZSwgbm8gbW9yZSBhcmdzCSovCisJCQlhcmd2W25hcmdzXSA9IE5VTEw7CisJCQlyZXR1cm4gbmFyZ3M7CisJCX0KKworCQlhcmd2W25hcmdzKytdID0gbGluZTsJLyogYmVnaW4gb2YgYXJndW1lbnQgc3RyaW5nCSovCisKKwkJLyogZmluZCBlbmQgb2Ygc3RyaW5nICovCisJCXdoaWxlICgqbGluZSAmJiAhaXNibGFuazEoKmxpbmUpKQorCQkJKytsaW5lOworCisJCWlmICgqbGluZSA9PSAnXDAnKSB7CS8qIGVuZCBvZiBsaW5lLCBubyBtb3JlIGFyZ3MJKi8KKwkJCWFyZ3ZbbmFyZ3NdID0gTlVMTDsKKwkJCXJldHVybiBuYXJnczsKKwkJfQorCisJCSpsaW5lKysgPSAnXDAnOwkJLyogdGVybWluYXRlIGN1cnJlbnQgYXJnCSAqLworCX0KKworCXB1dHN0cmluZygiKiogVG9vIG1hbnkgYXJncyAqKlxuIik7CisKKwlyZXR1cm4gbmFyZ3M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHJ1bl9jb21tYW5kCisqCisqIERFU0NSSVBUSU9OOgorKiBydW5zIGlucHV0IGNvbW1hbmQKKyoKKyogSU5QVVQ6CisqCWNtZAktIGlucHV0IGNvbW1hbmQgc3RyaW5nIHRvIHJ1biAoaW5jbHVkaW5nIHBhcmFtZXRlcnMpLgorKglmbGFnCS0gY29tbWFuZCBmbGFnCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydW5fY29tbWFuZChjb25zdCBjaGFyICpjbWQsIGludCBmbGFnKQoreworCWNoYXIgY21kYnVmW0NPTkZJR19TWVNfQ0JTSVpFXTsJLyogd29ya2luZyBjb3B5IG9mIGNtZAkJKi8KKwljaGFyICp0b2tlbjsJCQkvKiBzdGFydCBvZiB0b2tlbiBpbiBjbWRidWYJKi8KKwljaGFyICpzZXA7CQkJLyogZW5kIG9mIHRva2VuIChzZXBhcmF0b3IpIGluIGNtZGJ1ZiAqLworCWNoYXIgKnN0ciA9IGNtZGJ1ZjsKKwljaGFyICphcmd2W0NPTkZJR19TWVNfTUFYQVJHUyArIDFdOwkvKiBOVUxMIHRlcm1pbmF0ZWQJKi8KKwlpbnQgYXJnYywgaW5xdW90ZXM7CisKKwlpZiAoIWNtZCB8fCAhKmNtZCkKKwkJcmV0dXJuOwkvKiBlbXB0eSBjb21tYW5kICovCisKKwlpZiAoc3RybGVuKGNtZCkgPj0gQ09ORklHX1NZU19DQlNJWkUpIHsKKwkJcHV0c3RyaW5nKCIjIyBDb21tYW5kIHRvbyBsb25nIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlzdHJjcHkoY21kYnVmLCBjbWQpOworCisJLyogUHJvY2VzcyBzZXBhcmF0b3JzICovCisKKwl3aGlsZSAoKnN0cikgeworCisJCS8qCisJCSAqIEZpbmQgc2VwYXJhdG9yLCBvciBzdHJpbmcgZW5kCisJCSAqIEFsbG93IHNpbXBsZSBlc2NhcGUgb2YgJzsnIGJ5IHdyaXRpbmcgIlw7IgorCQkgKi8KKwkJZm9yIChpbnF1b3RlcyA9IDAsIHNlcCA9IHN0cjsgKnNlcDsgc2VwKyspIHsKKwkJCWlmICgoKnNlcCA9PSAnXCcnKSAmJgorCQkJICAgICgqKHNlcCAtIDEpICE9ICdcXCcpKQorCQkJCWlucXVvdGVzID0gIWlucXVvdGVzOworCisJCQlpZiAoIWlucXVvdGVzICYmCisJCQkgICAgKCpzZXAgPT0gJzsnKSAmJgkvKiBzZXBhcmF0b3IJCSovCisJCQkgICAgKHNlcCAhPSBzdHIpICYmCS8qIHBhc3Qgc3RyaW5nIHN0YXJ0CSovCisJCQkgICAgKCooc2VwLTEpICE9ICdcXCcpKQkvKiBhbmQgTk9UIGVzY2FwZWQJKi8KKwkJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIExpbWl0IHRoZSB0b2tlbiB0byBkYXRhIGJldHdlZW4gc2VwYXJhdG9ycworCQkgKi8KKwkJdG9rZW4gPSBzdHI7CisJCWlmICgqc2VwKSB7CisJCQlzdHIgPSBzZXAgKyAxOwkvKiBzdGFydCBvZiBjb21tYW5kIGZvciBuZXh0IHBhc3MgKi8KKwkJCSpzZXAgPSAnXDAnOworCQl9IGVsc2UKKwkJCXN0ciA9IHNlcDsJLyogbm8gbW9yZSBjb21tYW5kcyBmb3IgbmV4dCBwYXNzICovCisKKwkJLyogRXh0cmFjdCBhcmd1bWVudHMgKi8KKwkJYXJnYyA9IHBhcnNlX2xpbmUodG9rZW4sIGFyZ3YpOworCQlpZiAoYXJnYyA9PSAwKQorCQkJY29udGludWU7CisKKwkJY21kX3Byb2Nlc3MoZmxhZywgYXJnYywgYXJndik7CisJfQorfQorCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUb3BvbG9neURlZi5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL2NvbW1hbmQuaApzaW1pbGFyaXR5IGluZGV4IDYzJQpjb3B5IGZyb20gdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaApjb3B5IHRvIHRvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS91dGlscy9kZWJ1Zy9jb21tYW5kLmgKaW5kZXggZGE4MmUyNC4uMThmN2I5YiAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvY29tbWFuZC5oCkBAIC0xLDQgKzEsMyBAQAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKIApAQCAtNDMsMTIgKzQyLDEyIEBACiAJICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAKICAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLQkJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotCQlkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKwlkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogCiAgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCi0JCXVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLQkJc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCXVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKwlzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECkBAIC02Miw3OSArNjEsMzIgQEAKIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfTVZfRERSM19UT1BPTE9HWV9ERUZfSAotI2RlZmluZSBfTVZfRERSM19UT1BPTE9HWV9ERUZfSAogCisjaW5jbHVkZSAibXZfb3MuaCIKKyNpbmNsdWRlICJtdlVhcnQuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKipUT1BPTE9HWSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQ09ORklHX0REUjMKLXR5cGVkZWYgZW51bQotewotICAgU1BFRURfQklOX0REUl84MDBELAotICAgU1BFRURfQklOX0REUl84MDBFLAotICAgU1BFRURfQklOX0REUl8xMDY2RSwKLSAgIFNQRUVEX0JJTl9ERFJfMTA2NkYsCi0gICBTUEVFRF9CSU5fRERSXzEwNjZHLAotICAgU1BFRURfQklOX0REUl8xMzMzRiwKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0csCi0gICBTUEVFRF9CSU5fRERSXzEzMzNILAotICAgU1BFRURfQklOX0REUl8xMzMzSiwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEcsCi0gICBTUEVFRF9CSU5fRERSXzE2MDBILAotICAgU1BFRURfQklOX0REUl8xNjAwSiwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEssCi0gICBTUEVFRF9CSU5fRERSXzE4NjZKLAotICAgU1BFRURfQklOX0REUl8xODY2SywKLSAgIFNQRUVEX0JJTl9ERFJfMTg2NkwsCi0gICBTUEVFRF9CSU5fRERSXzE4NjZNLAotICAgU1BFRURfQklOX0REUl8yMTMzSywKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM0wsCi0gICBTUEVFRF9CSU5fRERSXzIxMzNNLAotICAgU1BFRURfQklOX0REUl8yMTMzTiwKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhBUkdTIDgKKyNkZWZpbmUgQ01EX0ZMQUdfUkVQRUFUIDB4MDAwMQogCi0gICBTUEVFRF9CSU5fRERSXzEzMzNIX0VYVCwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEtfRVhULAotICAgU1BFRURfQklOX0REUl8xODY2TV9FWFQKLX1NVl9IV1NfU1BFRURfQklOOworc3RydWN0IGNtZF90YmxfcyB7CisJY2hhcgkJKm5hbWU7CQkvKiBDb21tYW5kIE5hbWUJCQkqLworCWludAkJbWF4YXJnczsJLyogbWF4aW11bSBudW1iZXIgb2YgYXJndW1lbnRzCSovCisJCQkJCS8qIEltcGxlbWVudGF0aW9uIGZ1bmN0aW9uCSovCisJaW50CQkoKmNtZCkoc3RydWN0IGNtZF90YmxfcyAqLCBpbnQsIGludCwgY2hhciAqIGNvbnN0IFtdKTsKKwljaGFyCQkqdXNhZ2U7CQkvKiBVc2FnZSBtZXNzYWdlCShzaG9ydCkJKi8KKwljaGFyCQkqaGVscDsJCS8qIFVzYWdlIG1lc3NhZ2UJKGxvbmcpCSovCit9OwogCi10eXBlZGVmIGVudW0gCi17Ci0gIEREUl9GUkVRX0xPV19GUkVRLAotICBERFJfRlJFUV80MDAsCi0gIEREUl9GUkVRXzUzMywKLSAgRERSX0ZSRVFfNjY3LAotICBERFJfRlJFUV84MDAsCi0gIEREUl9GUkVRXzkzMywKLSAgRERSX0ZSRVFfMTA2NiwKLSAgRERSX0ZSRVFfMzExLAotICBERFJfRlJFUV8zMzMsCi0gIEREUl9GUkVRXzQ2NywKLSAgRERSX0ZSRVFfODUwLAotICBERFJfRlJFUV82MDAsCi0gIEREUl9GUkVRXzMwMCwKLSAgRERSX0ZSRVFfOTAwLAotICBERFJfRlJFUV8zNjAsCi0gIEREUl9GUkVRXzEwMDAsCi0gICBERFJfRlJFUV9MSU1JVAotfU1WX0hXU19ERFJfRlJFUTsKK2VudW0gY29tbWFuZF9yZXRfdCB7CisJQ01EX1JFVF9TVUNDRVNTLAkvKiAwID0gU3VjY2VzcyAqLworCUNNRF9SRVRfRkFJTFVSRSwJLyogMSA9IEZhaWx1cmUgKi8KKwlDTURfUkVUX1VTQUdFID0gLTEsCS8qIEZhaWx1cmUsIHBsZWFzZSByZXBvcnQgJ3VzYWdlJyBlcnJvciAqLworfTsKIAotdHlwZWRlZiBlbnVtCi17Ci0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSQ0QsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJBUywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJDLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlJEMUssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkQySywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFBELAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190RkFXMUssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RGQVcySywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdUUiwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJUUCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdSLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190TU9ECi19c3BlZWRCaW5UYWJsZUVsZW1lbnRzOwotI2VuZGlmIC8qQ09ORklHX0REUjMgKi8KLSNlbmRpZiAvKiBfTVZfRERSM19UT1BPTE9HWV9ERUZfSCAqLwordHlwZWRlZiBzdHJ1Y3QgY21kX3RibF9zIGNtZF90YmxfdDsKKworaW50IGNtZF9nZXRfZGF0YV9zaXplKGNoYXIgKmFyZywgaW50IGRlZmF1bHRfc2l6ZSk7CisKK3ZvaWQgcnVuX2NvbW1hbmQoY29uc3QgY2hhciAqY21kLCBpbnQgZmxhZyk7CiAKIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS91dGlscy9kZWJ1Zy9kZWJ1Zy5jCnNpbWlsYXJpdHkgaW5kZXggNjMlCmNvcHkgZnJvbSB0b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUb3BvbG9neURlZi5oCmNvcHkgdG8gdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL2RlYnVnLmMKaW5kZXggZGE4MmUyNC4uNDc4MzBjZiAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvZGVidWcuYwpAQCAtMSw0ICsxLDMgQEAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIENvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCiAKQEAgLTQzLDEyICs0MiwxMiBAQAogCSAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogCiAgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0JCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLQkJZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKwlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisJZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KIAogICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQotCQl1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0JCXNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKwl1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisJc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRApAQCAtNjIsNzkgKzYxLDI2IEBACiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX01WX0REUjNfVE9QT0xPR1lfREVGX0gKLSNkZWZpbmUgX01WX0REUjNfVE9QT0xPR1lfREVGX0gKIAorLyogaW5jbHVkZXMgKi8KKyNpbmNsdWRlICJtdl9vcy5oIgorI2luY2x1ZGUgImNvbmZpZ19tYXJ2ZWxsLmgiICAJLyogUmVxdWlyZWQgdG8gaWRlbnRpZnkgU09DIGFuZCBCb2FyZCAqLworI2luY2x1ZGUgIm12VWFydC5oIgorI2luY2x1ZGUgInByaW50Zi5oIgorI2luY2x1ZGUgIm12U3lzRW52TGliLmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgImxpYl91dGlscy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKlRPUE9MT0dZKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBDT05GSUdfRERSMwotdHlwZWRlZiBlbnVtCitNVl9TVEFUVVMgbXZCaW5IZWFkZXJEZWJ1Z1Byb21wdCh2b2lkKQogewotICAgU1BFRURfQklOX0REUl84MDBELAotICAgU1BFRURfQklOX0REUl84MDBFLAotICAgU1BFRURfQklOX0REUl8xMDY2RSwKLSAgIFNQRUVEX0JJTl9ERFJfMTA2NkYsCi0gICBTUEVFRF9CSU5fRERSXzEwNjZHLAotICAgU1BFRURfQklOX0REUl8xMzMzRiwKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0csCi0gICBTUEVFRF9CSU5fRERSXzEzMzNILAotICAgU1BFRURfQklOX0REUl8xMzMzSiwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEcsCi0gICBTUEVFRF9CSU5fRERSXzE2MDBILAotICAgU1BFRURfQklOX0REUl8xNjAwSiwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEssCi0gICBTUEVFRF9CSU5fRERSXzE4NjZKLAotICAgU1BFRURfQklOX0REUl8xODY2SywKLSAgIFNQRUVEX0JJTl9ERFJfMTg2NkwsCi0gICBTUEVFRF9CSU5fRERSXzE4NjZNLAotICAgU1BFRURfQklOX0REUl8yMTMzSywKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM0wsCi0gICBTUEVFRF9CSU5fRERSXzIxMzNNLAotICAgU1BFRURfQklOX0REUl8yMTMzTiwKKwlwdXRzdHJpbmcoIlxuUHJvbXB0IG1vZGVcbiIpOworCXdoaWxlICgxKSB7CisJCXJlYWRsaW5lKCJNYXJ2ZWxsX0RlYnVnPj4gIik7CisJCWlmIChzdHJjbXAoY29uc29sZV9idWZmZXIsICJxIikgPT0gMCkKKwkJCWJyZWFrOwogCi0gICBTUEVFRF9CSU5fRERSXzEzMzNIX0VYVCwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEtfRVhULAotICAgU1BFRURfQklOX0REUl8xODY2TV9FWFQKLX1NVl9IV1NfU1BFRURfQklOOwotCi10eXBlZGVmIGVudW0gCi17Ci0gIEREUl9GUkVRX0xPV19GUkVRLAotICBERFJfRlJFUV80MDAsCi0gIEREUl9GUkVRXzUzMywKLSAgRERSX0ZSRVFfNjY3LAotICBERFJfRlJFUV84MDAsCi0gIEREUl9GUkVRXzkzMywKLSAgRERSX0ZSRVFfMTA2NiwKLSAgRERSX0ZSRVFfMzExLAotICBERFJfRlJFUV8zMzMsCi0gIEREUl9GUkVRXzQ2NywKLSAgRERSX0ZSRVFfODUwLAotICBERFJfRlJFUV82MDAsCi0gIEREUl9GUkVRXzMwMCwKLSAgRERSX0ZSRVFfOTAwLAotICBERFJfRlJFUV8zNjAsCi0gIEREUl9GUkVRXzEwMDAsCi0gICBERFJfRlJFUV9MSU1JVAotfU1WX0hXU19ERFJfRlJFUTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSQ0QsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJBUywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJDLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlJEMUssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkQySywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFBELAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190RkFXMUssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RGQVcySywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdUUiwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJUUCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdSLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190TU9ECi19c3BlZWRCaW5UYWJsZUVsZW1lbnRzOwotI2VuZGlmIC8qQ09ORklHX0REUjMgKi8KLSNlbmRpZiAvKiBfTVZfRERSM19UT1BPTE9HWV9ERUZfSCAqLwotCisJCXJ1bl9jb21tYW5kKGNvbnNvbGVfYnVmZmVyLCAwKTsKKwl9CisJcmV0dXJuIE1WX09LOworfQogCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvbGliX3V0aWxzLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvbGliX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwZmNlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS91dGlscy9kZWJ1Zy9saWJfdXRpbHMuYwpAQCAtMCwwICsxLDMwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcworYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvcgorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4KK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorCSAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKKwl1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisJc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJsaWJfdXRpbHMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJtdl9vcy5oIgorI2luY2x1ZGUgIm12VWFydC5oIgorI2luY2x1ZGUgInByaW50Zi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW1wbGVtZW50YXRpb24gb2YgdXNlZCBjdHlwZSBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBpc3ByaW50CisqCisqIERFU0NSSVBUSU9OOgorKiBDaGVja3Mgd2hldGhlciBjIGlzIGEgcHJpbnRhYmxlIGNoYXJhY3RlcgorKiBBIHByaW50YWJsZSBjaGFyYWN0ZXIgaXMgYSBjaGFyYWN0ZXIgdGhhdCBvY2N1cGllcyBhIHByaW50aW5nIHBvc2l0aW9uIG9uIGEgZGlzcGxheQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpc3ByaW50KGludCBjKQoreworCXJldHVybiBjID49ICcgJyAmJiBjIDw9ICd+JzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogaXNibGFuazEKKyoKKyogREVTQ1JJUFRJT046CisqIENoZWNrcyB3aGV0aGVyIGMgaXMgYSBibGFuayBjaGFyYWN0ZXIKKyogdGhlIGJsYW5rIGNoYXJhY3RlcnMgYXJlIHNwYWNlIGFuZCBob3Jpem9udGFsIHRhYgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpc2JsYW5rMShjaGFyIGMpCit7CisJcmV0dXJuIChjID49IDkgJiYgYyA8PSAxMykgfHwgYyA9PSAzMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogaXN4ZGlnaXQKKyoKKyogREVTQ1JJUFRJT046CisqIENoZWNrcyB3aGV0aGVyIGMgaXMgYSBoZXhkZWNpbWFsIGRpZ2l0IGNoYXJhY3RlcgorKiBIZXhhZGVjaW1hbCBkaWdpdHMgYXJlIGFueSBvZjogMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiBBIEIgQyBEIEUgRgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpc3hkaWdpdChpbnQgYykKK3sKKwlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJCXJldHVybiAxOworCisJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorCQlyZXR1cm4gMTsKKworCWlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogaXNkaWdpdAorKgorKiBERVNDUklQVElPTjoKKyogQ2hlY2tzIHdoZXRoZXIgYyBpcyBhIGRlY2ltYWwgZGlnaXQgY2hhcmFjdGVyCisqIERlY2ltYWwgZGlnaXRzIGFyZSBhbnkgb2Y6IDAgMSAyIDMgNCA1IDYgNyA4IDkKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgaXNkaWdpdChpbnQgYykKK3sKKwlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGlzbG93ZXIKKyoKKyogREVTQ1JJUFRJT046CisqIENoZWNrcyB3aGV0aGVyIGMgaXMgYSBsb3dlcmNhc2UgbGV0dGVyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGlzbG93ZXIoaW50IGMpCit7CisJaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB0b3VwcGVyCisqCisqIERFU0NSSVBUSU9OOgorKiBSZXR1cm5zIHRoZSB1cHBlcmNhc2UgZXF1aXZhbGVudCBvZiBjCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHRvdXBwZXIoaW50IGMpCit7CisJaWYgKGlzbG93ZXIoYykpCisJCXJldHVybiAnQScgKyAoYyAtICdhJyk7CisJZWxzZQorCQlyZXR1cm4gYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGltcGxlbWVudGF0aW9uIG9mIHVzZWQgc3RyaW5nIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHN0cmNociAqLworY2hhciAqc3RyY2hyKGNvbnN0IGNoYXIgKnMsIGludCBjKQoreworLyogU2NhbiBzIGZvciB0aGUgY2hhcmFjdGVyLiAgV2hlbiB0aGlzIGxvb3AgaXMgZmluaXNoZWQsCisgcyB3aWxsIGVpdGhlciBwb2ludCB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgb3IgdGhlCisgY2hhcmFjdGVyIHdlIHdlcmUgbG9va2luZyBmb3IuICAqLworCXdoaWxlICgqcyAhPSAnXDAnICYmICpzICE9IChjaGFyKWMpCisJCXMrKzsKKwlyZXR1cm4gKCpzID09IChjaGFyKWMpID8gKGNoYXIgKikgcyA6IE5VTEw7Cit9CisKKy8qIHN0cmxlbiAqLworaW50IHN0cmxlbihjb25zdCBjaGFyICpzKQoreworCWNvbnN0IGNoYXIgKnAgPSBzOworCS8qIExvb3Agb3ZlciB0aGUgZGF0YSBpbiBzLiAgKi8KKwl3aGlsZSAoKnAgIT0gJ1wwJykKKwkJcCsrOworCXJldHVybiAoaW50KShwIC0gcyk7Cit9CisKKy8qIHN0cmNtcCAqLworaW50IHN0cmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisJaW50IF9fcmVzOworCXdoaWxlICgxKSB7CisJCV9fcmVzID0gKnMxIC0gKnMyKys7CisJCWlmIChfX3JlcyAhPSAwIHx8ICEqczErKykKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBfX3JlczsKK30KKworLyogc3RybmNtcCAqLworaW50IHN0cm5jbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBpbnQgbikKK3sKKwl1bnNpZ25lZCBjaGFyIHVjMSwgdWMyOworCS8qIE5vdGhpbmcgdG8gY29tcGFyZT8gIFJldHVybiB6ZXJvLiAgKi8KKwlpZiAobiA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIExvb3AsIGNvbXBhcmluZyBieXRlcy4gICovCisJd2hpbGUgKG4tLSA+IDAgJiYgKnMxID09ICpzMikgeworCQkvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGJ5dGVzIG9yIGhpdCBhIG51bGwsIHJldHVybiB6ZXJvCisJCXNpbmNlIHdlIGFscmVhZHkga25vdyAqczEgPT0gKnMyLiAgKi8KKwkJaWYgKG4gPT0gMCB8fCAqczEgPT0gJ1wwJykKKwkJCXJldHVybiAwOworCisJCXMxKys7CisJCXMyKys7CisJfQorCXVjMSA9ICgqKHVuc2lnbmVkIGNoYXIgKikgczEpOworCXVjMiA9ICgqKHVuc2lnbmVkIGNoYXIgKikgczIpOworCXJldHVybiAoKHVjMSA8IHVjMikgPyAtMSA6ICh1YzEgPiB1YzIpKTsKK30KKy8qIHN0cmNweSAqLworY2hhciAqc3RyY3B5KGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sKKwljaGFyICpkc3QgPSBzMTsKKwljb25zdCBjaGFyICpzcmMgPSBzMjsKKwkvKiBEbyB0aGUgY29weWluZyBpbiBhIGxvb3AuICAqLworCXdoaWxlICgoKmRzdCsrID0gKnNyYysrKSAhPSAnXDAnKQorCQk7ICAgICAgICAgICAgICAgLyogVGhlIGJvZHkgb2YgdGhpcyBsb29wIGlzIGxlZnQgZW1wdHkuICovCisJLyogUmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcuICAqLworCXJldHVybiBzMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGltcGxlbWVudGF0aW9uIG9mIG90aGVyIHV0aWxzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGxvbmcgc2ltcGxlX3N0cnRvdWwoY29uc3QgY2hhciAqY3AsIGNoYXIgKiplbmRwLCB1bnNpZ25lZCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDAsIHZhbHVlOworCisJaWYgKCpjcCA9PSAnMCcpIHsKKwkJY3ArKzsKKwkJaWYgKCgqY3AgPT0gJ3gnKSAmJiBpc3hkaWdpdChjcFsxXSkpIHsKKwkJCWJhc2UgPSAxNjsKKwkJCWNwKys7CisJCX0KKwkJaWYgKCFiYXNlKQorCQkJYmFzZSA9IDg7CisJfQorCWlmICghYmFzZSkKKwkJYmFzZSA9IDEwOworCisJd2hpbGUgKGlzeGRpZ2l0KCpjcCkgJiYgKHZhbHVlID0gaXNkaWdpdCgqY3ApID8gKmNwLScwJyA6IChpc2xvd2VyKCpjcCkKKwkgICAgPyB0b3VwcGVyKCpjcCkgOiAqY3ApLSdBJysxMCkgPCBiYXNlKSB7CisJCXJlc3VsdCA9IHJlc3VsdCpiYXNlICsgdmFsdWU7CisJCWNwKys7CisJfQorCWlmIChlbmRwKQorCQkqZW5kcCA9IChjaGFyICopY3A7CisJcmV0dXJuIHJlc3VsdDsKK30KKworY2hhciBjb25zb2xlX2J1ZmZlcltDT05GSUdfU1lTX0NCU0laRSArIDFdOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcmVhZGxpbmUKKyoKKyogREVTQ1JJUFRJT046CisqIHByaW50cyAnZGlzcCcgYW5kIHJlYWRzIGNoYXJhY3RlcnMgZnJvbSBVQVJUIHVudGlsIG5ld2xpbmUgY2hhcmFjdGVyKEFDU0lJIDEzKQorKiByZWNlaXZlZCBhbmQgd3JpdGVzIHRoZSBjaGFyYWN0ZXJzIHRvICdjb25zb2xlX2J1ZmZlcicKKyoKKyogSU5QVVQ6CisqCWRpc3AJLSBzdHJpbmcgdG8gZGlzcGxheS4KKyoKKyogUkVUVVJOOgorKglOdW1iZXIgb2YgcmVhZCBjaGFyYWN0ZXJzLCBub3QgaW5jbHVkaW5nIG5ld2xpbmUgY2hhcmFjdGVyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHJlYWRsaW5lKGNvbnN0IGNoYXIgKmRpc3ApCit7CisJY2hhciBjOworCWludCBjdXJyID0gMDsKKwltdlByaW50ZihkaXNwKTsKKworCXdoaWxlIChjdXJyIDw9IENPTkZJR19TWVNfQ0JTSVpFKSB7CisJCWMgPSBtdlVhcnRHZXRjKCk7CisJCWlmIChjID09IDEzKSB7CisJCQljb25zb2xlX2J1ZmZlcltjdXJyXSA9IDA7CisJCQlwdXRzdHJpbmcoIlxuIik7CisJCQlyZXR1cm4gY3VycjsKKwkJfQorCQltdlVhcnRQdXRjKGMpOworCQljb25zb2xlX2J1ZmZlcltjdXJyKytdID0gYzsKKwl9CisJY29uc29sZV9idWZmZXJbQ09ORklHX1NZU19DQlNJWkVdID0gMDsKKwlyZXR1cm4gY3VycjsKK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS91dGlscy9kZWJ1Zy9saWJfdXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDYzJQpjb3B5IGZyb20gdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaApjb3B5IHRvIHRvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS91dGlscy9kZWJ1Zy9saWJfdXRpbHMuaAppbmRleCBkYTgyZTI0Li5mNDQ1ZWUwIDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUb3BvbG9neURlZi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS91dGlscy9kZWJ1Zy9saWJfdXRpbHMuaApAQCAtMSw0ICsxLDMgQEAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIENvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCiAKQEAgLTQzLDEyICs0MiwxMiBAQAogCSAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogCiAgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0JCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLQkJZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKwlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisJZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KIAogICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQotCQl1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0JCXNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKwl1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisJc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRApAQCAtNjIsNzkgKzYxLDIxIEBACiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX01WX0REUjNfVE9QT0xPR1lfREVGX0gKLSNkZWZpbmUgX01WX0REUjNfVE9QT0xPR1lfREVGX0gKIAorI2RlZmluZSBDT05GSUdfU1lTX0NCU0laRSAxMDI0CitleHRlcm4gY2hhciBjb25zb2xlX2J1ZmZlcltDT05GSUdfU1lTX0NCU0laRSArIDFdOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKlRPUE9MT0dZKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBDT05GSUdfRERSMwotdHlwZWRlZiBlbnVtCi17Ci0gICBTUEVFRF9CSU5fRERSXzgwMEQsCi0gICBTUEVFRF9CSU5fRERSXzgwMEUsCi0gICBTUEVFRF9CSU5fRERSXzEwNjZFLAotICAgU1BFRURfQklOX0REUl8xMDY2RiwKLSAgIFNQRUVEX0JJTl9ERFJfMTA2NkcsCi0gICBTUEVFRF9CSU5fRERSXzEzMzNGLAotICAgU1BFRURfQklOX0REUl8xMzMzRywKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0gsCi0gICBTUEVFRF9CSU5fRERSXzEzMzNKLAotICAgU1BFRURfQklOX0REUl8xNjAwRywKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEgsCi0gICBTUEVFRF9CSU5fRERSXzE2MDBKLAotICAgU1BFRURfQklOX0REUl8xNjAwSywKLSAgIFNQRUVEX0JJTl9ERFJfMTg2NkosCi0gICBTUEVFRF9CSU5fRERSXzE4NjZLLAotICAgU1BFRURfQklOX0REUl8xODY2TCwKLSAgIFNQRUVEX0JJTl9ERFJfMTg2Nk0sCi0gICBTUEVFRF9CSU5fRERSXzIxMzNLLAotICAgU1BFRURfQklOX0REUl8yMTMzTCwKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM00sCi0gICBTUEVFRF9CSU5fRERSXzIxMzNOLAorLyogY3R5cGUgKi8KK2ludCBpc2JsYW5rMShjaGFyIGMpOworaW50IGlzcHJpbnQoaW50IGMpOwogCi0gICBTUEVFRF9CSU5fRERSXzEzMzNIX0VYVCwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEtfRVhULAotICAgU1BFRURfQklOX0REUl8xODY2TV9FWFQKLX1NVl9IV1NfU1BFRURfQklOOworLyogc3RyaW5nICovCitjaGFyICpzdHJjaHIoY29uc3QgY2hhciAqcywgaW50IGMpOworaW50IHN0cmxlbihjb25zdCBjaGFyICpzKTsKK2ludCBzdHJjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK2ludCBzdHJuY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgaW50IG4pOworY2hhciAqc3RyY3B5KGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CiAKLXR5cGVkZWYgZW51bSAKLXsKLSAgRERSX0ZSRVFfTE9XX0ZSRVEsCi0gIEREUl9GUkVRXzQwMCwKLSAgRERSX0ZSRVFfNTMzLAotICBERFJfRlJFUV82NjcsCi0gIEREUl9GUkVRXzgwMCwKLSAgRERSX0ZSRVFfOTMzLAotICBERFJfRlJFUV8xMDY2LAotICBERFJfRlJFUV8zMTEsCi0gIEREUl9GUkVRXzMzMywKLSAgRERSX0ZSRVFfNDY3LAotICBERFJfRlJFUV84NTAsCi0gIEREUl9GUkVRXzYwMCwKLSAgRERSX0ZSRVFfMzAwLAotICBERFJfRlJFUV85MDAsCi0gIEREUl9GUkVRXzM2MCwKLSAgRERSX0ZSRVFfMTAwMCwKLSAgIEREUl9GUkVRX0xJTUlUCi19TVZfSFdTX0REUl9GUkVROwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJDRCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJQLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkFTLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkMsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkQxSywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJSRDJLLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UEQsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RGQVcxSywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdEZBVzJLLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190V1RSLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlRQLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190V1IsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RNT0QKLX1zcGVlZEJpblRhYmxlRWxlbWVudHM7Ci0jZW5kaWYgLypDT05GSUdfRERSMyAqLwotI2VuZGlmIC8qIF9NVl9ERFIzX1RPUE9MT0dZX0RFRl9IICovCi0KLQorLyogb3RoZXIgdXRpbHMgKi8KK3Vuc2lnbmVkIGxvbmcgc2ltcGxlX3N0cnRvdWwoY29uc3QgY2hhciAqY3AsIGNoYXIgKiplbmRwLCB1bnNpZ25lZCBpbnQgYmFzZSk7CitpbnQgcmVhZGxpbmUoY29uc3QgY2hhciAqZGlzcCk7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvbWVtLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2NjUxZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS91dGlscy9kZWJ1Zy9tZW0uYwpAQCAtMCwwICsxLDcwMyBAQAorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJwcmludGYuaCIKKyNpbmNsdWRlICJtdlVhcnQuaCIKKyNpbmNsdWRlICJsaWJfdXRpbHMuaCIKKyNpbmNsdWRlICJtdl9vcy5oIgorI2luY2x1ZGUgInNvY19zcGVjLmgiCisjaW5jbHVkZSAiZGRyM19od3NfaHdfdHJhaW5pbmdfZGVmLmgiCisjaW5jbHVkZSAic3RkaW50LmgiCisKKworI2RlZmluZSBESVNQX0xJTkVfTEVOIDE2CisjZGVmaW5lIE1BWF9MSU5FX0xFTkdUSF9CWVRFUyAoNjQpCisjZGVmaW5lIERFRkFVTFRfTElORV9MRU5HVEhfQllURVMgKDE2KQorI2RlZmluZSBSRUdfUEhZX0RBVEEJCTAKKyNkZWZpbmUgQ09ORklHX1NZU19NRU1URVNUX1NUQVJUICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIENPTkZJR19TWVNfTUVNVEVTVF9FTkQgICAgICAgICAgMHgwMDdmZmZmZgorCitzdGF0aWMgdW5zaWduZWQgaW50IGRwX2xhc3RfYWRkciwgZHBfbGFzdF9zaXplOworc3RhdGljIHVuc2lnbmVkIGludCBkcF9sYXN0X2xlbmd0aCA9IDB4NDA7CitzdGF0aWMgdW5zaWduZWQgaW50IG1tX2xhc3RfYWRkciwgbW1fbGFzdF9zaXplOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwcmludEhleAorKgorKiBERVNDUklQVElPTjoKKyogUHJpbnRzIHVuc2lnbmVkIHZhbHVlIGluIGhleCB3aXRoIHNwZWNpZmllZCB3aWR0aAorKgorKiBJTlBVVDoKKyoJeAkJLSB2YWx1ZSB0byBwcmludAorKgl3aWR0aAkJLSBkYXRhIHZhbHVlIHdpZHRoLiAgTWF5IGJlIDIsIDQsIG9yIDguCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcHJpbnRIZXgoTVZfVTMyIHgsIHVuc2lnbmVkIGludCB3aWR0aCkKK3sKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSA4OgorCQltdlByaW50ZigiICUwOHgiLCB4KTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQltdlByaW50ZigiICUwNHgiLCB4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXZQcmludGYoIiAlMDJ4IiwgeCk7CisJCWJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcHJpbnRfYnVmZmVyCisqCisqIERFU0NSSVBUSU9OOgorKiBQcmludCBkYXRhIGJ1ZmZlciBpbiBoZXggYW5kIGFzY2lpIGZvcm0gdG8gdGhlIHRlcm1pbmFsLgorKiBkYXRhIHJlYWRzIGFyZSBidWZmZXJlZCBzbyB0aGF0IGVhY2ggbWVtb3J5IGFkZHJlc3MgaXMgb25seSByZWFkIG9uY2UuCisqIFVzZWZ1bCB3aGVuIGRpc3BsYXlpbmcgdGhlIGNvbnRlbnRzIG9mIHZvbGF0aWxlIHJlZ2lzdGVycy4KKyoKKyogSU5QVVQ6CisqCWFkZHIJCS0gU3RhcnRpbmcgYWRkcmVzcyB0byBkaXNwbGF5IGF0IHN0YXJ0IG9mIGxpbmUKKyoJZGF0YQkJLSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisqCXdpZHRoCQktIGRhdGEgdmFsdWUgd2lkdGguICBNYXkgYmUgMSwgMiwgb3IgNC4KKyoJY291bnQJCS0gbnVtYmVyIG9mIHZhbHVlcyB0byBkaXNwbGF5CisqCWxpbmVsZW4JCS0gTnVtYmVyIG9mIHZhbHVlcyB0byBwcmludCBwZXIgbGluZQorKgkJCQlzcGVjaWZ5IDAgZm9yIGRlZmF1bHQgbGVuZ3RoCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmludF9idWZmZXIodW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50IGxpbmVsZW4pCit7CisJLyogbGluZWJ1ZiBhcyBhIHVuaW9uIGNhdXNlcyBwcm9wZXIgYWxpZ25tZW50ICovCisJdW5pb24gbGluZWJ1ZiB7CisJCU1WX1UzMiB1aVtNQVhfTElORV9MRU5HVEhfQllURVMvc2l6ZW9mKE1WX1UzMikgKyAxXTsKKwkJTVZfVTE2IHVzW01BWF9MSU5FX0xFTkdUSF9CWVRFUy9zaXplb2YoTVZfVTE2KSArIDFdOworCQlNVl9VOCAgdWNbTUFYX0xJTkVfTEVOR1RIX0JZVEVTL3NpemVvZihNVl9VOCkgKyAxXTsKKwl9IGxiOworCWludCBpOworCisJaWYgKGxpbmVsZW4qd2lkdGggPiBNQVhfTElORV9MRU5HVEhfQllURVMpCisJCWxpbmVsZW4gPSBNQVhfTElORV9MRU5HVEhfQllURVMgLyB3aWR0aDsKKwlpZiAobGluZWxlbiA8IDEpCisJCWxpbmVsZW4gPSBERUZBVUxUX0xJTkVfTEVOR1RIX0JZVEVTIC8gd2lkdGg7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJbXZQcmludGYoIiUwOGx4OiIsIGFkZHIpOworCisJCS8qIGNoZWNrIGZvciBvdmVyZmxvdyBjb25kaXRpb24gKi8KKwkJaWYgKGNvdW50IDwgbGluZWxlbikKKwkJCWxpbmVsZW4gPSBjb3VudDsKKworCQkvKiBDb3B5IGZyb20gbWVtb3J5IGludG8gbGluZWJ1ZiBhbmQgcHJpbnQgaGV4IHZhbHVlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgbGluZWxlbjsgaSsrKSB7CisJCQlNVl9VMzIgeDsKKwkJCWlmICh3aWR0aCA9PSA0KQorCQkJCXggPSBsYi51aVtpXSA9ICoodm9sYXRpbGUgTVZfVTMyKilkYXRhOworCQkJZWxzZSBpZiAod2lkdGggPT0gMikKKwkJCQl4ID0gbGIudXNbaV0gPSAqKHZvbGF0aWxlIE1WX1UxNiopZGF0YTsKKwkJCWVsc2UKKwkJCQl4ID0gbGIudWNbaV0gPSAqKHZvbGF0aWxlIE1WX1U4KilkYXRhOworCQkJcHJpbnRIZXgoeCwgd2lkdGgqMik7CisJCQlkYXRhICs9IHdpZHRoOworCQl9CisKKwkJLyogUHJpbnQgZGF0YSBpbiBBU0NJSSBjaGFyYWN0ZXJzICovCisJCWZvciAoaSA9IDA7IGkgPCBsaW5lbGVuICogd2lkdGg7IGkrKykgeworCQkJaWYgKCFpc3ByaW50KGxiLnVjW2ldKSB8fCBsYi51Y1tpXSA+PSAweDgwKQorCQkJCWxiLnVjW2ldID0gJy4nOworCQl9CisJCWxiLnVjW2ldID0gJ1wwJzsKKwkJbXZQcmludGYoIiAgICAlc1xuIiwgbGIudWMpOworCisJCS8qIHVwZGF0ZSByZWZlcmVuY2VzICovCisJCWFkZHIgKz0gbGluZWxlbiAqIHdpZHRoOworCQljb3VudCAtPSBsaW5lbGVuOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogYWxpZ25fYWRkcmVzcworKgorKiBERVNDUklQVElPTjoKKyogVW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgV29ya2Fyb3VuZDoKKyogaWYgc2l6ZSA9IGxvbmcvd29yZCwgJiBhZGRyZXNzIG5vdCBhbGlnbmVkIHRvIGxvbmcvd29yZCAocmVzcGVjdGl2ZWx5KQorKiBhbGlnbiBhZGRyZXNzIHRvIG1lZXQgcmVxdWVzdGVkIHNpemUKKyoKKyogSU5QVVQ6CisqCWFkZHIJCS0gYWRkcmVzcyBpbiBtZW1vcnkgdG8gYWxpZ24gKDEvMi80KQorKglzaXplCQktIHNpemUgaW4gYnl0ZXMKKyoKKyogUkVUVVJOOgorKgl0aGUgYWxpZ25lZCBhZGRyZXNzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxpZ25fYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBzaXplKQoreworCisJaWYgKChzaXplID4gMSkgJiYgKGFkZHIgJSBzaXplID4gMCkpIHsKKwkJbXZQcmludGYoIkVycm9yOiBSZXF1ZXN0ZWQgdW5hbGlnbmVkIG1lbW9yeSBhZGRyZXNzICgweCV4KVxuIiwgKHVuc2lnbmVkIGludClhZGRyKTsKKwkJYWRkciAmPSB+KHNpemUgLSAxKTsKKwkJbXZQcmludGYoIlVzaW5nIGFsaWduZWQgYWRkcmVzcyAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpYWRkcik7CisJfQorCXJldHVybiBhZGRyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBkb19tZW1fbWQKKyoKKyogREVTQ1JJUFRJT046CisqIFRoZSBjb21tYW5kIGFsbG93cyB0aGUgdXNlciB0byBkaXNwbGF5IG1lbW9yeSB2YWx1ZXMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZG9fbWVtX21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGxlbmd0aDsKKwlpbnQgc2l6ZTsKKwlpbnQgcmMgPSAwOworCS8qIFdlIHVzZSB0aGUgbGFzdCBzcGVjaWZpZWQgcGFyYW1ldGVycywgdW5sZXNzIG5ldyBvbmVzIGFyZQorCSAqIGVudGVyZWQuCisJICovCisJYWRkciA9IGRwX2xhc3RfYWRkcjsKKwlzaXplID0gZHBfbGFzdF9zaXplOworCWxlbmd0aCA9IGRwX2xhc3RfbGVuZ3RoOworCisJaWYgKGFyZ2MgPCAyKQorCQlyZXR1cm4gQ01EX1JFVF9VU0FHRTsKKworCWlmICgoZmxhZyAmIENNRF9GTEFHX1JFUEVBVCkgPT0gMCkgeworCQkvKiBOZXcgY29tbWFuZCBzcGVjaWZpZWQuICBDaGVjayBmb3IgYSBzaXplIHNwZWNpZmljYXRpb24uCisJCSAqIERlZmF1bHRzIHRvIGxvbmcgaWYgbm8gb3IgaW5jb3JyZWN0IHNwZWNpZmljYXRpb24uCisJCSAqLworCQlzaXplID0gY21kX2dldF9kYXRhX3NpemUoYXJndlswXSwgNCk7CisJCWlmIChzaXplIDwgMCkKKwkJCXJldHVybiAxOworCisJCS8qIEFkZHJlc3MgaXMgc3BlY2lmaWVkIHNpbmNlIGFyZ2MgPiAxCisJCSovCisJCWFkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CisKKwkJLyogSWYgYW5vdGhlciBwYXJhbWV0ZXIsIGl0IGlzIHRoZSBsZW5ndGggdG8gZGlzcGxheS4KKwkJICogTGVuZ3RoIGlzIHRoZSBudW1iZXIgb2Ygb2JqZWN0cywgbm90IG51bWJlciBvZiBieXRlcy4KKwkJICovCisJCWlmIChhcmdjID4gMikKKwkJCWxlbmd0aCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKwl9CisKKwlhZGRyID0gYWxpZ25fYWRkcmVzcyhhZGRyLCBzaXplKTsKKwkvKiBQcmludCB0aGUgbGluZXMuICovCisJcHJpbnRfYnVmZmVyKGFkZHIsICh2b2lkICopYWRkciwgc2l6ZSwgbGVuZ3RoLCBESVNQX0xJTkVfTEVOL3NpemUpOworCWFkZHIgKz0gc2l6ZSpsZW5ndGg7CisKKworCWRwX2xhc3RfYWRkciA9IGFkZHI7CisJZHBfbGFzdF9sZW5ndGggPSBsZW5ndGg7CisJZHBfbGFzdF9zaXplID0gc2l6ZTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGRvX21lbV9tdworKgorKiBERVNDUklQVElPTjoKKyogVGhlIGNvbW1hbmQgYWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlIHRvIG1lbW9yeQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkb19tZW1fbXcoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciwgd3JpdGV2YWwsIGNvdW50OworCWludCBzaXplOworCisJaWYgKChhcmdjIDwgMykgfHwgKGFyZ2MgPiA0KSkKKwkJcmV0dXJuIENNRF9SRVRfVVNBR0U7CisKKwkvKiBDaGVjayBmb3Igc2l6ZSBzcGVjaWZpY2F0aW9uLgorCSovCisJc2l6ZSA9IGNtZF9nZXRfZGF0YV9zaXplKGFyZ3ZbMF0sIDQpOworCWlmIChzaXplIDwgMSkKKwkJcmV0dXJuIDE7CisKKwkvKiBBZGRyZXNzIGlzIHNwZWNpZmllZCBzaW5jZSBhcmdjID4gMQorCSovCisJYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKworCWFkZHIgPSBhbGlnbl9hZGRyZXNzKGFkZHIsIHNpemUpOworCisJLyogR2V0IHRoZSB2YWx1ZSB0byB3cml0ZS4KKwkqLworCXdyaXRldmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOworCisJLyogQ291bnQgPyAqLworCWlmIChhcmdjID09IDQpCisJCWNvdW50ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCWVsc2UKKwkJY291bnQgPSAxOworCisJd2hpbGUgKGNvdW50LS0gPiAwKSB7CisJCWlmIChzaXplID09IDQpCisJCQkqKCh1bnNpZ25lZCBsb25nICopYWRkcikgPSAodW5zaWduZWQgbG9uZyl3cml0ZXZhbDsKKwkJZWxzZSBpZiAoc2l6ZSA9PSAyKQorCQkJKigodW5zaWduZWQgc2hvcnQgKilhZGRyKSA9ICh1bnNpZ25lZCBzaG9ydCl3cml0ZXZhbDsKKwkJZWxzZQorCQkJKigodW5zaWduZWQgY2hhciAqKWFkZHIpID0gKHVuc2lnbmVkIGNoYXIpd3JpdGV2YWw7CisJCWFkZHIgKz0gc2l6ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW9kX21lbShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgaW5jcmZsYWcsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGk7CisJaW50IG5ieXRlcywgc2l6ZTsKKworCWlmIChhcmdjICE9IDIpCisJCXJldHVybiBDTURfUkVUX1VTQUdFOworCisJLyogV2UgdXNlIHRoZSBsYXN0IHNwZWNpZmllZCBwYXJhbWV0ZXJzLCB1bmxlc3MgbmV3IG9uZXMgYXJlCisJICogZW50ZXJlZC4KKwkgKi8KKwlhZGRyID0gbW1fbGFzdF9hZGRyOworCXNpemUgPSBtbV9sYXN0X3NpemU7CisKKwlpZiAoKGZsYWcgJiBDTURfRkxBR19SRVBFQVQpID09IDApIHsKKwkJLyogTmV3IGNvbW1hbmQgc3BlY2lmaWVkLiAgQ2hlY2sgZm9yIGEgc2l6ZSBzcGVjaWZpY2F0aW9uLgorCQkgKiBEZWZhdWx0cyB0byBsb25nIGlmIG5vIG9yIGluY29ycmVjdCBzcGVjaWZpY2F0aW9uLgorCQkgKi8KKwkJc2l6ZSA9IGNtZF9nZXRfZGF0YV9zaXplKGFyZ3ZbMF0sIDQpOworCQlpZiAoc2l6ZSA8IDApCisJCQlyZXR1cm4gMTsKKworCQkvKiBBZGRyZXNzIGlzIHNwZWNpZmllZCBzaW5jZSBhcmdjID4gMQorCQkqLworCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOworCX0KKworCisJYWRkciA9IGFsaWduX2FkZHJlc3MoYWRkciwgc2l6ZSk7CisKKwkvKiBQcmludCB0aGUgYWRkcmVzcywgZm9sbG93ZWQgYnkgdmFsdWUuICBUaGVuIGFjY2VwdCBpbnB1dCBmb3IKKwkgKiB0aGUgbmV4dCB2YWx1ZS4gIEEgbm9uLWNvbnZlcnRlZCB2YWx1ZSBleGl0cy4KKwkgKi8KKwlkbyB7CisJCW12UHJpbnRmKCIlMDhseDoiLCBhZGRyKTsKKwkJaWYgKHNpemUgPT0gNCkKKwkJCW12UHJpbnRmKCIgJTA4eCIsICooKHVuc2lnbmVkIGludCAqKWFkZHIpKTsKKwkJZWxzZSBpZiAoc2l6ZSA9PSAyKQorCQkJbXZQcmludGYoIiAlMDR4IiwgKigodW5zaWduZWQgc2hvcnQgKilhZGRyKSk7CisJCWVsc2UKKwkJCW12UHJpbnRmKCIgJTAyeCIsICooKHVuc2lnbmVkIGNoYXIgKilhZGRyKSk7CisKKwkJbmJ5dGVzID0gcmVhZGxpbmUoIiA/ICIpOworCQlpZiAobmJ5dGVzID09IDAgfHwgKG5ieXRlcyA9PSAxICYmIGNvbnNvbGVfYnVmZmVyWzBdID09ICctJykpIHsKKwkJCS8qIDxDUj4gcHJlc3NlZCBhcyBvbmx5IGlucHV0LCBkb24ndCBtb2RpZnkgY3VycmVudAorCQkJICogbG9jYXRpb24gYW5kIG1vdmUgdG8gbmV4dC4gIi0iIHByZXNzZWQgd2lsbCBnbyBiYWNrLgorCQkJICovCisJCQlpZiAoaW5jcmZsYWcpCisJCQkJYWRkciArPSBuYnl0ZXMgPyAtc2l6ZSA6IHNpemU7CisJCQluYnl0ZXMgPSAxOworCQl9IGVsc2UgeworCQkJY2hhciAqZW5kcDsKKwkJCWkgPSBzaW1wbGVfc3RydG91bChjb25zb2xlX2J1ZmZlciwgJmVuZHAsIDE2KTsKKwkJCW5ieXRlcyA9IGVuZHAgLSBjb25zb2xlX2J1ZmZlcjsKKwkJCWlmIChuYnl0ZXMpIHsKKwkJCQlpZiAoc2l6ZSA9PSA0KQorCQkJCQkqKCh1bnNpZ25lZCBpbnQgKilhZGRyKSA9IGk7CisJCQkJZWxzZSBpZiAoc2l6ZSA9PSAyKQorCQkJCQkqKCh1bnNpZ25lZCBzaG9ydCAqKWFkZHIpID0gaTsKKwkJCQllbHNlCisJCQkJCSooKHVuc2lnbmVkIGNoYXIgKilhZGRyKSA9IGk7CisJCQkJaWYgKGluY3JmbGFnKQorCQkJCQlhZGRyICs9IHNpemU7CisJCQl9CisJCX0KKwl9IHdoaWxlIChuYnl0ZXMpOworCisJbW1fbGFzdF9hZGRyID0gYWRkcjsKKwltbV9sYXN0X3NpemUgPSBzaXplOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBkb19tZW1fbW0KKyoKKyogREVTQ1JJUFRJT046CisqIFRoZSBjb21tYW5kIGFsbG93cyB0aGUgdXNlciB0byBtb2RpZnkgYnl0ZXMgaW4gbWVtb3J5CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRvX21lbV9tbShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCit7CisJcmV0dXJuIG1vZF9tZW0oY21kdHAsIDEsIGZsYWcsIGFyZ2MsIGFyZ3YpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBkb19tZW1fY21wCisqCisqIERFU0NSSVBUSU9OOgorKiBUaGUgY29tbWFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gY29tcGFyZSBieXRlcyBpbiBtZW1vcnkKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZG9fbWVtX2NtcChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCit7CisJdW5zaWduZWQgbG9uZyBhZGRyMSwgYWRkcjIsIGNvdW50LCBuZ29vZDsKKwlpbnQgc2l6ZTsKKwlpbnQgcmNvZGUgPSAwOworCWNvbnN0IGNoYXIgKnR5cGU7CisKKwlpZiAoYXJnYyAhPSA0KQorCQlyZXR1cm4gQ01EX1JFVF9VU0FHRTsKKworCS8qIENoZWNrIGZvciBzaXplIHNwZWNpZmljYXRpb24uCisJKi8KKwlzaXplID0gY21kX2dldF9kYXRhX3NpemUoYXJndlswXSwgNCk7CisJaWYgKHNpemUgPCAwKQorCQlyZXR1cm4gMTsKKworCXR5cGUgPSBzaXplID09IDQgPyAid29yZCIgOiBzaXplID09IDIgPyAiaGFsZndvcmQiIDogImJ5dGUiOworCisJYWRkcjEgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CisKKwlhZGRyMiA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKworCWFkZHIxID0gYWxpZ25fYWRkcmVzcyhhZGRyMSwgc2l6ZSk7CisJYWRkcjIgPSBhbGlnbl9hZGRyZXNzKGFkZHIyLCBzaXplKTsKKworCWNvdW50ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCisJZm9yIChuZ29vZCA9IDA7IG5nb29kIDwgY291bnQ7ICsrbmdvb2QpIHsKKwkJdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7CisJCWlmIChzaXplID09IDQpIHsKKwkJCXdvcmQxID0gKih1bnNpZ25lZCBsb25nICopYWRkcjE7CisJCQl3b3JkMiA9ICoodW5zaWduZWQgbG9uZyAqKWFkZHIyOworCQl9IGVsc2UgaWYgKHNpemUgPT0gMikgeworCQkJd29yZDEgPSAqKHVuc2lnbmVkIHNob3J0ICopYWRkcjE7CisJCQl3b3JkMiA9ICoodW5zaWduZWQgc2hvcnQgKilhZGRyMjsKKwkJfSBlbHNlIHsKKwkJCXdvcmQxID0gKih1bnNpZ25lZCBjaGFyICopYWRkcjE7CisJCQl3b3JkMiA9ICoodW5zaWduZWQgY2hhciAqKWFkZHIyOworCQl9CisJCWlmICh3b3JkMSAhPSB3b3JkMikgeworCQkJbXZQcmludGYoIiVzIGF0IDB4JTA4bHggKCUjMCpseCkgIT0gJXMgYXQgMHglMDhseCAoJSMwKmx4KVxuIiwKKwkJCQl0eXBlLCBhZGRyMSwgc2l6ZSwgd29yZDEsCisJCQkJdHlwZSwgYWRkcjIsIHNpemUsIHdvcmQyKTsKKwkJCXJjb2RlID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJYWRkcjEgKz0gc2l6ZTsKKwkJYWRkcjIgKz0gc2l6ZTsKKwl9CisKKwltdlByaW50ZigiVG90YWwgb2YgJWxkICVzKHMpIHdlcmUgdGhlIHNhbWVcbiIsIG5nb29kLCB0eXBlKTsKKwlyZXR1cm4gcmNvZGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGRvX21lbV9jcAorKgorKiBERVNDUklQVElPTjoKKyogVGhlIGNvbW1hbmQgYWxsb3dzIHRoZSB1c2VyIHRvIGNvcHkgYnl0ZXMgZnJvbS90byBtZW1vcnkKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZG9fbWVtX2NwKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGRlc3QsIGNvdW50OworCWludCBzaXplOworCisJaWYgKGFyZ2MgIT0gNCkKKwkJcmV0dXJuIENNRF9SRVRfVVNBR0U7CisKKwkvKiBDaGVjayBmb3Igc2l6ZSBzcGVjaWZpY2F0aW9uLgorCSovCisJc2l6ZSA9IGNtZF9nZXRfZGF0YV9zaXplKGFyZ3ZbMF0sIDQpOworCWlmIChzaXplIDwgMCkKKwkJcmV0dXJuIDE7CisKKwlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOworCisJZGVzdCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKworCWFkZHIgPSBhbGlnbl9hZGRyZXNzKGFkZHIsIHNpemUpOworCWRlc3QgPSBhbGlnbl9hZGRyZXNzKGRlc3QsIHNpemUpOworCisJY291bnQgPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCBOVUxMLCAxNik7CisKKwlpZiAoY291bnQgPT0gMCkgeworCQltdlByaW50ZigiWmVybyBsZW5ndGggPz8/XG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXdoaWxlIChjb3VudC0tID4gMCkgeworCQlpZiAoc2l6ZSA9PSA0KQorCQkJKigodW5zaWduZWQgbG9uZyAqKWRlc3QpID0gKigodW5zaWduZWQgbG9uZyAqKWFkZHIpOworCQllbHNlIGlmIChzaXplID09IDIpCisJCQkqKCh1bnNpZ25lZCBzaG9ydCAqKWRlc3QpID0gKigodW5zaWduZWQgc2hvcnQgKilhZGRyKTsKKwkJZWxzZQorCQkJKigodW5zaWduZWQgY2hhciAqKWRlc3QpID0gKigodW5zaWduZWQgY2hhciAqKWFkZHIpOworCQlhZGRyICs9IHNpemU7CisJCWRlc3QgKz0gc2l6ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGlyX2NtZAorKgorKiBERVNDUklQVElPTjoKKyogVGhlIGNvbW1hbmQgYWxsb3dzIHRoZSB1c2VyIHRvIHZpZXcgdGhlIGNvbnRlbnRzIG9mIHRoZSBNVgorKiAgICAgICAgICAgICAgICBpbnRlcm5hbCByZWdpc3RlcnMgYW5kIG1vZGlmeSB0aGVtLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpcl9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoreworCU1WX1UzMiByZWdOdW0gPSAweDAsIHJlZ1ZhbCwgcmVnVmFsVG1wLCByZXM7CisJTVZfOCByZWdWYWxCaW5bNDBdOworCU1WXzggY21kWzQwXTsKKwlpbnQgaTsKKwlpbnQgaiA9IDAsIGZsYWdtID0gMDsKKworCWlmIChhcmdjID09IDIpCisJCXJlZ051bSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKwllbHNlIHsKKwkJbXZQcmludGYoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJCXJldHVybiAwOworCX0KKworCXJlZ1ZhbCA9IE1WX1JFR19SRUFEKHJlZ051bSArIElOVEVSX1JFR1NfQkFTRSk7CisJcmVnVmFsVG1wID0gcmVnVmFsOworCW12UHJpbnRmKCJJbnRlcm5hbCByZWdpc3RlciAweCV4IHZhbHVlIDogMHgleFxuICIsIHJlZ051bSwgcmVnVmFsKTsKKwltdlByaW50ZigiXG4gICAgMzEgICAgICAyNCAgICAgICAgMTYgICAgICAgICA4ICAgICAgICAgMCIpOworCW12UHJpbnRmKCJcbiAgICAgfCAgICAgICB8ICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICB8XG5PTEQ6ICIpOworCisJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChyZWdWYWxUbXAgPiAwKSB7CisJCQlyZXMgPSByZWdWYWxUbXAgJSAyOworCQkJcmVnVmFsVG1wID0gKHJlZ1ZhbFRtcCAtIHJlcykgLyAyOworCQkJaWYgKHJlcyA9PSAwKQorCQkJCXJlZ1ZhbEJpbltpXSA9ICcwJzsKKwkJCWVsc2UKKwkJCQlyZWdWYWxCaW5baV0gPSAnMSc7CisJCX0gZWxzZQorCQkJcmVnVmFsQmluW2ldID0gJzAnOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCW12UHJpbnRmKCIlYyIsIHJlZ1ZhbEJpbltpXSk7CisJCWlmICgoKChpKzEpICUgNCkgPT0gMCkgJiYgKGkgPiAxKSAmJiAoaSA8IDMxKSkKKwkJCW12UHJpbnRmKCItIik7CisJfQorCisJcmVhZGxpbmUoIlxuTkVXOiAiKTsKKwlzdHJjcHkoY21kLCBjb25zb2xlX2J1ZmZlcik7CisJaWYgKChjbWRbMF0gPT0gJzAnKSAmJiAoY21kWzFdID09ICd4JykpIHsKKwkJcmVnVmFsID0gc2ltcGxlX3N0cnRvdWwoY21kLCBOVUxMLCAxNik7CisJCWZsYWdtID0gMTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgNDA7IGkrKykgeworCQkJaWYgKGNtZFtpXSA9PSAnXDAnKQorCQkJCWJyZWFrOworCQkJaWYgKGkgPT0gNCB8fCBpID09IDkgfHwgaSA9PSAxNCB8fCBpID09IDE5IHx8IGkgPT0gMjQgfHwgaSA9PSAyOSB8fCBpID09IDM0KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNtZFtpXSA9PSAnMScpIHsKKwkJCQlyZWdWYWwgPSByZWdWYWwgfCAoMHg4MDAwMDAwMCA+PiBqKTsKKwkJCQlmbGFnbSA9IDE7CisJCQl9IGVsc2UgaWYgKGNtZFtpXSA9PSAnMCcpIHsKKwkJCQlyZWdWYWwgPSByZWdWYWwgJiAofigweDgwMDAwMDAwID4+IGopKTsKKwkJCQlmbGFnbSA9IDE7CisJCQl9CisJCQlqKys7CisJCX0KKwl9CisKKwlpZiAoZmxhZ20gPT0gMSkgeworCQlNVl9SRUdfV1JJVEUocmVnTnVtICsgSU5URVJfUkVHU19CQVNFLCByZWdWYWwpOworCQltdlByaW50ZigiXG5OZXcgdmFsdWUgPSAweCV4XG5cbiIsIE1WX1JFR19SRUFEKHJlZ051bSArCisJCQkJCUlOVEVSX1JFR1NfQkFTRSkpOworCX0KKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgaW50IHRyYWluaW5nUmVhZFBoeVJlZyhpbnQgdWlSZWdBZGRyLCBpbnQgdWlQdXAsIGludCB0eXBlKQoreworCXVuc2lnbmVkIGludCB1aVJlZzsKKwl1bnNpZ25lZCBpbnQgYWRkckxvdyA9IDB4M0YgJiB1aVJlZ0FkZHI7CisJdW5zaWduZWQgaW50IGFkZHJIaSA9ICgoMHhDMCAmIHVpUmVnQWRkcikgPj4gNik7CisKKwl1aVJlZyA9ICgxIDw8IDMxKSArICh1aVB1cCA8PCAyMikgKyAodHlwZSA8PCAyNikgKyAoYWRkckhpIDw8IDI4KSArIChhZGRyTG93IDw8IDE2KTsKKwlNVl9SRUdfV1JJVEUoUkVHX1BIWV9SRUdJU1RSWV9GSUxFX0FDQ0VTU19BRERSLCB1aVJlZyAmIDB4N0ZGRkZGRkYpOworCU1WX1JFR19XUklURShSRUdfUEhZX1JFR0lTVFJZX0ZJTEVfQUNDRVNTX0FERFIsIHVpUmVnKTsKKworCWRvIHsKKwkJdWlSZWcgPSAoKE1WX1JFR19SRUFEKFJFR19QSFlfUkVHSVNUUllfRklMRV9BQ0NFU1NfQUREUikpICYgKDEgPDwgMzEpKTsKKwl9IHdoaWxlICh1aVJlZyk7CS8qIFdhaXQgZm9yICcwJyB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisKKwl1aVJlZyA9IE1WX1JFR19SRUFEKFJFR19QSFlfUkVHSVNUUllfRklMRV9BQ0NFU1NfQUREUik7CisJdWlSZWcgPSB1aVJlZyAmIDB4RkZGRjsKKworCXJldHVybiB1aVJlZzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogdHJhaW5pbmdfY21kCisqCisqIERFU0NSSVBUSU9OOgorKiBUaGUgY29tbWFuZCBwcmludHMgdGhlIHJlc3VsdHMgb2YgdGhlIEREUjMgVHJhaW5pbmcKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHJhaW5pbmdfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK3sKKwlNVl9VMzIgdWlDc0VuYSwgdWlDcywgdWlSZWcsIHVpUHVwLCB1aVBoYXNlLCB1aURlbGF5OworCU1WX1UzMiB1aVJkUmR5RGx5LCB1aVJkU21wbERseSwgdWlEcSwgdWlDZW50cmFsVHhSZXMsIHVpQ2VudHJhbFJ4UmVzOworCU1WX1UzMiB1aVB1cE51bTsKKworCXVpQ3NFbmEgPSBNVl9SRUdfUkVBRChSRUdfRERSM19SQU5LX0NUUkxfQUREUikgJiAweEY7CisJbXZQcmludGYoIkREUjMgVHJhaW5pbmcgcmVzdWx0czpcbiIpOworCisJdWlQdXBOdW0gPSA1OworCisJZm9yICh1aUNzID0gMDsgdWlDcyA8IDQ7IHVpQ3MrKykgeworCQlpZiAodWlDc0VuYSAmICgxIDw8IHVpQ3MpKSB7CisJCQltdlByaW50ZigiQ1M6ICVkXG4iLCB1aUNzKTsKKwkJCWZvciAodWlQdXAgPSAwOyB1aVB1cCA8IHVpUHVwTnVtOyB1aVB1cCsrKSB7CisJCQkJdWlSZWcgPSB0cmFpbmluZ1JlYWRQaHlSZWcoMCArIHVpQ3MqNCwgdWlQdXAsIFJFR19QSFlfREFUQSk7CisJCQkJdWlQaGFzZSA9ICh1aVJlZyA+PiA2KSAmIDB4NzsKKwkJCQl1aURlbGF5ID0gdWlSZWcgJiAweDFGOworCQkJCW12UHJpbnRmKCJXcml0ZSBMZXZlbGluZzogUFVQOiAlZCwgUGhhc2U6ICVkLCBEZWxheTogJWRcbiIsIHVpUHVwLCB1aVBoYXNlLCB1aURlbGF5KTsKKwkJCX0KKworCQkJZm9yICh1aVB1cCA9IDA7IHVpUHVwIDwgdWlQdXBOdW07IHVpUHVwKyspIHsKKwkJCQl1aVJlZyA9IHRyYWluaW5nUmVhZFBoeVJlZygyICsgdWlDcyo0LCB1aVB1cCwgUkVHX1BIWV9EQVRBKTsKKwkJCQl1aVBoYXNlID0gKHVpUmVnID4+IDYpICYgMHg3OworCQkJCXVpRGVsYXkgPSB1aVJlZyAmIDB4MUY7CisJCQkJbXZQcmludGYoIlJlYWQgTGV2ZWxpbmc6IFBVUDogJWQsIFBoYXNlOiAlZCwgRGVsYXk6ICVkXG4iLCB1aVB1cCwgdWlQaGFzZSwgdWlEZWxheSk7CisJCQl9CisKKwkJCXVpUmRSZHlEbHkgPSAoKE1WX1JFR19SRUFEKFJFR19SRUFEX0RBVEFfUkVBRFlfREVMQVlTX0FERFIpID4+ICg4KnVpQ3MpKSAmIDB4MUYpOworCQkJdWlSZFNtcGxEbHkgPSAoKE1WX1JFR19SRUFEKFJFR19SRUFEX0RBVEFfU0FNUExFX0RFTEFZU19BRERSKSA+PiAoOCp1aUNzKSkgJiAweDFGKTsKKwkJCW12UHJpbnRmKCJSZWFkIFNhbXBsZSBEZWxheTpcdCVkXG4iLCB1aVJkU21wbERseSk7CisJCQltdlByaW50ZigiUmVhZCBSZWFkeSBEZWxheTpcdCVkXG4iLCB1aVJkUmR5RGx5KTsKKworCQkJLyogUEJTICovCisJCQlpZiAodWlDcyA9PSAwKSB7CisJCQkJZm9yICh1aVB1cCA9IDA7IHVpUHVwIDwgdWlQdXBOdW07IHVpUHVwKyspIHsKKwkJCQkJZm9yICh1aURxID0gMDsgdWlEcSA8IDEwOyB1aURxKyspIHsKKwkJCQkJCWlmICh1aURxID09IDkpCisJCQkJCQkJdWlEcSsrOworCisJCQkJCQl1aVJlZyA9IHRyYWluaW5nUmVhZFBoeVJlZygweDEwK3VpRHErdWlDcyoweDEyLCB1aVB1cCwgUkVHX1BIWV9EQVRBKTsKKwkJCQkJCXVpRGVsYXkgPSB1aVJlZyAmIDB4MUY7CisKKwkJCQkJCWlmICh1aURxID09IDApCisJCQkJCQkJbXZQcmludGYoIlBCUyBUWDogUFVQOiAlZDogIiwgdWlQdXApOworCQkJCQkJbXZQcmludGYoIiVkICIsIHVpRGVsYXkpOworCQkJCQl9CisJCQkJCW12UHJpbnRmKCJcbiIpOworCQkJCX0KKwkJCQlmb3IgKHVpUHVwID0gMDsgdWlQdXAgPCB1aVB1cE51bTsgdWlQdXArKykgeworCQkJCQlmb3IgKHVpRHEgPSAwOyB1aURxIDwgOTsgdWlEcSsrKSB7CisJCQkJCQl1aVJlZyA9IHRyYWluaW5nUmVhZFBoeVJlZygweDUwICsgdWlEcSArIHVpQ3MqMHgxMiwKKwkJCQkJCQkJCSAgIHVpUHVwLCBSRUdfUEhZX0RBVEEpOworCQkJCQkJdWlEZWxheSA9IHVpUmVnICYgMHgxRjsKKworCQkJCQkJaWYgKHVpRHEgPT0gMCkKKwkJCQkJCQltdlByaW50ZigiUEJTIFJYOiBQVVA6ICVkOiAiLCB1aVB1cCk7CisJCQkJCQltdlByaW50ZigiJWQgIiwgdWlEZWxheSk7CisJCQkJCX0KKwkJCQkJbXZQcmludGYoIlxuIik7CisJCQkJfQorCQkJfQorCisJCQkvKlJlYWQgQ2VudHJhbGl6YXRpb24gd2luZG93cyBzaXplcyBmb3IgU2NyYXRjaCBQSFkgcmVnaXN0ZXJzKi8KKwkJCWZvciAodWlQdXAgPSAwOyB1aVB1cCA8IHVpUHVwTnVtOyB1aVB1cCsrKSB7CisJCQkJdWlSZWcgPSB0cmFpbmluZ1JlYWRQaHlSZWcoMHhDMCArIHVpQ3MsIHVpUHVwLCBSRUdfUEhZX0RBVEEpOworCQkJCXVpQ2VudHJhbFJ4UmVzID0gdWlSZWcgPj4gNTsKKwkJCQl1aUNlbnRyYWxUeFJlcyA9IHVpUmVnICYgMHgxRjsKKwkJCQltdlByaW50ZigiQ2VudHJhbCB3aW5kb3cgc2l6ZSBmb3IgUFVQICVkIGlzICVkKFJYKSBhbmQgJWQoVFgpXG4iLAorCQkJCQkJdWlQdXAsIHVpQ2VudHJhbFJ4UmVzLCB1aUNlbnRyYWxUeFJlcyk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGRvX21lbV9tdGVzdAorKgorKiBERVNDUklQVElPTjoKKyogUGVyZm9ybSBhIG1lbW9yeSB0ZXN0LiBBIG1vcmUgY29tcGxldGUgYWx0ZXJuYXRpdmUgdGVzdCBjYW4gYmUKKyogY29uZmlndXJlZCB1c2luZyBDT05GSUdfU1lTX0FMVF9NRU1URVNULgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkb19tZW1fbXRlc3QoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcJKmFkZHIsICpzdGFydCwgKmVuZDsKKwl1bnNpZ25lZCBsb25nCXZhbDsKKwl1bnNpZ25lZCBsb25nCXJlYWRiYWNrOworCXVuc2lnbmVkIGxvbmcJZXJycyA9IDA7CisJaW50IGl0ZXJhdGlvbnMgPSAxOworCWludCBpdGVyYXRpb25fbGltaXQ7CisJdW5zaWduZWQgbG9uZwlpbmNyOworCXVuc2lnbmVkIGxvbmcJcGF0dGVybjsKKworCWlmIChhcmdjID4gMSkKKwkJc3RhcnQgPSAodW5zaWduZWQgbG9uZyAqKXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKwllbHNlCisJCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcgKilDT05GSUdfU1lTX01FTVRFU1RfU1RBUlQ7CisKKwlpZiAoYXJnYyA+IDIpCisJCWVuZCA9ICh1bnNpZ25lZCBsb25nICopc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOworCWVsc2UKKwkJZW5kID0gKHVuc2lnbmVkIGxvbmcgKikoQ09ORklHX1NZU19NRU1URVNUX0VORCk7CisKKwlzdGFydCA9ICh1bnNpZ25lZCBsb25nICopYWxpZ25fYWRkcmVzcygodW5zaWduZWQgbG9uZylzdGFydCwgNCk7CisJZW5kID0gKHVuc2lnbmVkIGxvbmcgKilhbGlnbl9hZGRyZXNzKCh1bnNpZ25lZCBsb25nKWVuZCwgNCk7CisKKwlpZiAoYXJnYyA+IDMpCisJCXBhdHRlcm4gPSAodW5zaWduZWQgbG9uZylzaW1wbGVfc3RydG91bChhcmd2WzNdLCBOVUxMLCAxNik7CisJZWxzZQorCQlwYXR0ZXJuID0gMDsKKworCWlmIChhcmdjID4gNCkKKwkJaXRlcmF0aW9uX2xpbWl0ID0gKHVuc2lnbmVkIGxvbmcpc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgTlVMTCwgMTYpOworCWVsc2UKKwkJaXRlcmF0aW9uX2xpbWl0ID0gMDsKKworCWluY3IgPSAxOworCWZvciAoOzspIHsKKwkJaWYgKGl0ZXJhdGlvbl9saW1pdCAmJiBpdGVyYXRpb25zID4gaXRlcmF0aW9uX2xpbWl0KSB7CisJCQltdlByaW50ZigiVGVzdGVkICVkIGl0ZXJhdGlvbihzKSB3aXRoICVsdSBlcnJvcnMuXG4iLAorCQkJCWl0ZXJhdGlvbnMtMSwgZXJycyk7CisJCQlyZXR1cm4gZXJycyAhPSAwOworCQl9CisJCSsraXRlcmF0aW9uczsKKworCQltdlByaW50ZigiXHJQYXR0ZXJuICUwOGxYICBXcml0aW5nLi4uIiwgcGF0dGVybik7CisJCW12UHJpbnRmKCIlMTJzIiwgIiIpOworCQltdlByaW50ZigiXGJcYlxiXGJcYlxiXGJcYlxiXGIiKTsKKworCQlmb3IgKGFkZHIgPSBzdGFydCwgdmFsID0gcGF0dGVybjsgYWRkciA8IGVuZDsgYWRkcisrKSB7CisJCQkqYWRkciA9IHZhbDsKKwkJCXZhbCArPSBpbmNyOworCQl9CisKKwkJbXZQcmludGYoIlJlYWRpbmcuLi4iKTsKKworCQlmb3IgKGFkZHIgPSBzdGFydCwgdmFsID0gcGF0dGVybjsgYWRkciA8IGVuZDsgYWRkcisrKSB7CisJCQlyZWFkYmFjayA9ICphZGRyOworCQkJaWYgKHJlYWRiYWNrICE9IHZhbCkgeworCQkJCW12UHJpbnRmKCJcbk1lbSBlcnJvciBAIik7CisJCQkJbXZQcmludGYoIiAweCUwOFg6IGZvdW5kICUwOGxYLCBleHBlY3RlZCAlMDhsWFxuIiwKKwkJCQkJKHVuc2lnbmVkIGludCkodWludHB0cl90KWFkZHIsIHJlYWRiYWNrLCB2YWwpOworCQkJCWVycnMrKzsKKwkJCX0KKwkJCXZhbCArPSBpbmNyOworCQl9CisKKwkJLyoKKwkJICogRmxpcCB0aGUgcGF0dGVybiBlYWNoIHRpbWUgdG8gbWFrZSBsb3RzIG9mIHplcm9zIGFuZAorCQkgKiB0aGVuLCB0aGUgbmV4dCB0aW1lLCBsb3RzIG9mIG9uZXMuICBXZSBkZWNyZW1lbnQKKwkJICogdGhlICJuZWdhdGl2ZSIgcGF0dGVybnMgYW5kIGluY3JlbWVudCB0aGUgInBvc2l0aXZlIgorCQkgKiBwYXR0ZXJucyB0byBwcmVzZXJ2ZSB0aGlzIGZlYXR1cmUuCisJCSAqLworCQlpZiAocGF0dGVybiAmIDB4ODAwMDAwMDApCisJCQlwYXR0ZXJuID0gLXBhdHRlcm47CS8qIGNvbXBsZW1lbnQgJiBpbmNyZW1lbnQgKi8KKwkJZWxzZQorCQkJcGF0dGVybiA9IH5wYXR0ZXJuOworCisJCWluY3IgPSAtaW5jcjsKKwl9CisJcmV0dXJuIDA7CS8qIG5vdCByZWFjaGVkICovCit9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcveG9yX21lbXRlc3QuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS91dGlscy9kZWJ1Zy94b3JfbWVtdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjg5YzYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcveG9yX21lbXRlc3QuYwpAQCAtMCwwICsxLDMxNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcworYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvcgorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4KK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorCSAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisJCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKwkJZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQorCQl1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisJCXNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgInByaW50Zi5oIgorI2luY2x1ZGUgIm12VWFydC5oIgorI2luY2x1ZGUgImxpYl91dGlscy5oIgorI2luY2x1ZGUgIm12X29zLmgiCisjaW5jbHVkZSAic29jX3NwZWMuaCIKKyNpbmNsdWRlICJkZHIzX2h3c19od190cmFpbmluZ19kZWYuaCIKKyNpbmNsdWRlICJzdGRpbnQuaCIKKyNpbmNsdWRlICJndE9zL212WG9yLmgiCisjaW5jbHVkZSAiZ3RPcy9tdlhvclJlZ3MuaCIKKyNpbmNsdWRlICJzdGRsaWIuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAieG9yX21lbXRlc3QuaCIKKworZXh0ZXJuIEdUX1UzMiBtdkh3c0RkcjNUaXBNYXhDU0dldChHVF9VMzIgZGV2TnVtKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZmlsbEtpbGxlclBhdHRlcm4KKyoKKyogREVTQ1JJUFRJT046CisqIFdyaXRlcyB0aGUga2lsbGVyIHBhdHRlcm4gaW4gdGhlIHNwZWNpZmllZCBzb3VyY2UgYWRkcmVzcyBpbiBEUkFNCisqCisqIElOUFVUOgorKgluQmFzZQkJLSBiYXNlIGFkZHJlc3MgdG8gc3RhcnQgd3JpdGluZyB0bworKgluU2l6ZQkJLSBzaXplIG9mIHRoZSBibG9jayBpbiBieXRlcworKgluYnVzV2lkdGgJLSBidXMgd2lkdGgsIG11c3QgYmUgbXVsdGlwbHkgb2YgMzIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGZpbGxLaWxsZXJQYXR0ZXJuKE1WX1UzMiBuQmFzZSwgTVZfVTMyIG5TaXplLCBNVl9VMzIgbmJ1c1dpZHRoKQoreworCU1WX1U4IGtpbGxlclBhdHRlcm5CdXNTdGF0ZVtTVF9LUF9MRU5dID0gS0lMTEVSX1BBVFRFUk5fQlVTX1NUQVRFOworCU1WX1U4IGtpbGxlclBhdHRlcm5CaXRTdGF0ZVtTVF9LUF9MRU5dID0gS0lMTEVSX1BBVFRFUk5fQklUX1NUQVRFOworCU1WX1UzMiBuT2Zmc2V0ID0gMDsKKwlNVl9VMzIgbk51bU9mV29yZCA9IG5idXNXaWR0aCAvIDMyOworCU1WX1UzMiBuUGF0dGVybjsKKwlNVl9VMzIgbkluZGV4ICAgPSAwOworCU1WX1UzMiBuVmljQml0ICA9IEJJVDA7CisJTVZfVTMyIG5WaWNXb3JkID0gMDsKKwlNVl9VMzIgbldvcmQ7CisKKwl3aGlsZSAobk9mZnNldCA8IG5TaXplKSB7CisJCWlmIChuSW5kZXggPT0gU1RfS1BfTEVOKSB7CisJCQluSW5kZXggPSAwOworCQkJblZpY0JpdCA8PD0gMTsKKwkJCWlmIChuVmljQml0ID09IDApIHsKKwkJCQluVmljQml0ID0gQklUMDsKKwkJCQluVmljV29yZCsrOworCQkJCWlmIChuVmljV29yZCA9PSBuTnVtT2ZXb3JkKQorCQkJCQluVmljV29yZCA9IDA7CisJCQl9CisJCX0KKwkJZm9yIChuV29yZCA9IDA7ICgobldvcmQgPCBuTnVtT2ZXb3JkKSAmJiAobk9mZnNldCA8IG5TaXplKSk7IG5Xb3JkKyssIG5PZmZzZXQgKz0gMHg0KSB7CisJCQluUGF0dGVybiA9IEJVU19TVEFUVVMoa2lsbGVyUGF0dGVybkJ1c1N0YXRlW25JbmRleF0pOworCQkJaWYgKG5Xb3JkID09IG5WaWNXb3JkKQorCQkJCW5QYXR0ZXJuID0gKChraWxsZXJQYXR0ZXJuQml0U3RhdGVbbkluZGV4XSkgPworCQkJCQkJKG5QYXR0ZXJuIHwgblZpY0JpdCkgOiAoblBhdHRlcm4gJiB+blZpY0JpdCkpOworCisJCQlNVl9NRU1JT19MRTMyX1dSSVRFKG5CYXNlICsgbk9mZnNldCwgblBhdHRlcm4pOworCQl9CisJCW5JbmRleCsrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY29uZmlndXJlTWVtb3J5TWFwcGluZworKgorKiBERVNDUklQVElPTjoKKyogT3BlbnMgbWVtb3J5IHdpbmRvd3MgaW4gdGhlIFhPUiBFbmdpbmUgdG8gdGhlIERSQU0gYW5kIFNSQU0KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNvbmZpZ3VyZU1lbW9yeU1hcHBpbmcoKQoreworCU1WX1UzMiBtYXhfY3M7CisJTVZfVTMyIHVpQ3NFbmEgPSAwLCBjc19jOworI2lmbmRlZiBNVjg4RjY3MlgKKwltYXhfY3MgPSBtdkh3c0RkcjNUaXBNYXhDU0dldCgwKTsKKyNlbHNlCisJbWF4X2NzID0gMjsKKyNlbmRpZgorCWZvciAoY3NfYyA9IDA7IGNzX2MgPCBtYXhfY3M7IGNzX2MrKykKKwkJdWlDc0VuYSB8PSAxIDw8IGNzX2M7CisKKwkvKiBlbmFibGUgU1JBTSB3aW5kb3cgKi8KKwl1aUNzRW5hIHw9IDEgPDwgU1JBTV9XSU5fSUQ7CisJbWF4X2NzKys7CisJLyogY29uZmlndXJlIFhPUiBlbmdpbmUgd2luZG93cyAqLworCW12U3lzWG9ySW5pdChtYXhfY3MsIHVpQ3NFbmEsIDB4ODAwMDAwMDAsIDApOworCisJLyogc2hyaW5rIGZpcnN0IERSQU0oQ1MwKSB3aW5kb3cgdG8gMHg0MDAwMDAwMCAoYnl0ZXMpCisJICogdG8gYXZvaWQgbWVtb3J5IG1hcHBpbmcgY29uZmxpY3Q6CisJICogRmlyc3QgRFJBTShDUzApIHdpbmRvdyBzdGFydHMgaW4gMHgwIGFuZCBlbmRzIGluIDB4ODAwMDAwMDAKKwkgKiBTUkFNIHdpbmRvdyBzdGFydHMgaW4gMHg0MDAwMDAwMAorCSAqIEhlbmNlLCB0aGVyZSBpcyBhIGNvbmZsaWN0ICovCisJTVZfUkVHX1dSSVRFKFhPUl9TSVpFX01BU0tfUkVHKDAsIDApLCAweDNGRkYwMDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogWE9SQ2FsY3VsYXRlQ1JDCisqCisqIERFU0NSSVBUSU9OOgorKiBDYWxjdWxhdGVzIGNyYzMyYyB1c2luZyB0aGUgWE9SIGVuZ2luZQorKgorKiBJTlBVVDoKKyoJbkNoYW5uZWwJLSBjaGFubmVsIG51bWJlciAoMC4uMykKKyoJblNyY0FkZHIJLSBzb3VyY2UgYWRkcmVzcworKgluQnl0ZUNudAktIHNpemUgb2YgdGhlIGJsb2NrIGluIGJ5dGVzCisqCisqIE9VVFBVVDoKKyoJcmVzCQktIGNyYzMyYyByZXN1bHQKKyoKKyogUkVUVVJOOgorKglNVl9FUlJPUiwgaW4gY2FzZSBvZiBhbnkgZXJyb3IgaW4gY2FsY3VsYXRpb24KKyoJTVZfT0ssIG90aGVyd2lzZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBYT1JDYWxjdWxhdGVDUkMoTVZfVTMyIG5DaGFubmVsLCBNVl9VMzIgblNyY0FkZHIsIE1WX1UzMiBuQnl0ZUNudCwgTVZfVTMyICpyZXMpCit7CisKKwlNVl9VMzIgblRpbWVvdXQgPSBYT1JfRU5HSU5FX1RJTUVPVVQ7CisJTVZfWE9SX0RFU0MgWG9yRGVzYzsKKwlNVl9YT1JfREVTQyAqcFhvckRlc2MgPSAmWG9yRGVzYzsKKwlNVl9VMzIgblhvckNoYW5uZWwgPSBYT1JfQ0hBTihuQ2hhbm5lbCk7CisKKwkvKiBhbGlnbiBwb2ludGVyIGFkZHJlc3MgdG8gYmUgbXVsdGlwbGUgb2YgMzIgKi8KKwlwWG9yRGVzYyA9IChNVl9YT1JfREVTQyAqKSgoKE1WX1UzMikoKHZvaWQgKilwWG9yRGVzYyArIDMyKSkgJiB+KDMyIC0gMSkpOworCisJbWVtc2V0KCh2b2lkICopcFhvckRlc2MsIDAsIHNpemVvZihNVl9DUkNfRE1BX0RFU0MpKTsKKworCS8qIGNsZWFuIHByZXZpb3VzIGluZGljYXRpb24gZnJvbSBlbmdpbmUgKi8KKwlNVl9SRUdfV1JJVEUoWE9SX0NBVVNFX1JFRyhYT1JfVU5JVChuQ2hhbm5lbCkpLCAwKTsKKworCW1lbXNldCgodm9pZCAqKXBYb3JEZXNjLCAwLCBzaXplb2YoTVZfQ1JDX0RNQV9ERVNDKSk7CisJcFhvckRlc2MtPnNyY0FkZDAJCT0gblNyY0FkZHI7CisJcFhvckRlc2MtPmJ5dGVDbnQJCT0gbkJ5dGVDbnQ7CisJcFhvckRlc2MtPmRlc2NDb21tYW5kCQk9IEJJVDMwOworCXBYb3JEZXNjLT5waHlOZXh0RGVzY1B0cgk9IDA7CisJcFhvckRlc2MtPnN0YXR1cwkJPSBCSVQzMTsKKwlwWG9yRGVzYy0+Y3JjMzJSZXN1bHQJCT0gMDsKKworCS8qIHdhaXQgZm9yIHByZXZpb3VzIHRyYW5zZmVyIHRvIGZpbm5pc2ggKi8KKwl3aGlsZSAobXZYb3JTdGF0ZUdldChuQ2hhbm5lbCkgIT0gTVZfSURMRSkKKwkJOworCisJLyogZGlzYWJsZSBhZGRyZXNzIG92ZXJyaWRlICovCisJTVZfUkVHX1dSSVRFKFhPUl9PVkVSUklERV9DVFJMX1JFRyhuQ2hhbm5lbCksIDB4MCk7CisKKwlpZiAobXZYb3JUcmFuc2ZlcihuQ2hhbm5lbCwgTVZfQ1JDMzIsIChNVl9VMzIpcFhvckRlc2MpICE9IE1WX09LKSB7CisJCW12UHJpbnRmKCIlczogRXJyb3IgZHVyaW5nIFhPUiBDUkMuLi4hXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBNVl9FUlJPUjsKKwl9CisKKwkvKiB3YWl0IGZvciB0aGUgZW5naW5lIHRvIGZpbmlzaCAqLworCXdoaWxlICgoTVZfUkVHX1JFQUQoWE9SX0NBVVNFX1JFRyhYT1JfVU5JVChuQ2hhbm5lbCkpKSAmICgoQklUMXxCSVQwKSA8PCAoMTYqblhvckNoYW5uZWwpKSkgPT0gMCkgeworCQlpZiAoblRpbWVvdXQtLSA9PSAwKSB7CisJCQltdlByaW50ZigiJXM6IFhPUiBDUkMgdGltZW91dCEhXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gTVZfRVJST1I7CisJCX0KKwl9CisKKwluVGltZW91dCA9IFhPUl9FTkdJTkVfVElNRU9VVDsKKwl3aGlsZSAobXZYb3JTdGF0ZUdldChuQ2hhbm5lbCkgIT0gTVZfSURMRSkgeworCQlpZiAoblRpbWVvdXQtLSA9PSAwKSB7CisJCQltdlByaW50ZigiJXM6IFhPUiBDUkMgdGltZW91dCAwISFcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBNVl9FUlJPUjsKKwkJfQorCX0KKworCSpyZXMgPSBwWG9yRGVzYy0+Y3JjMzJSZXN1bHQ7CisJcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBkb194b3JNZW1UZXN0CisqCisqIERFU0NSSVBUSU9OOgorKiBUaGUgY29tbWFuZCBydW4gbWVtb3J5IHRlc3QgdGhhdCBpcyBiYXNlZCBvbiB0aGUgWE9SIGVuZ2luZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkb194b3JNZW1UZXN0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK3sKKwlNVl9TVEFUVVMgc3RhdHVzOworCU1WX1UzMiBuQmxvY2tDUkMsIG5PZmZzZXRJbkRlc3QsIG5PZmZzZXQsIG5DUkMsIGksIG5Tb3VyY2VBZGRyLCBuRGVzdEFkZHI7CisJTVZfVTMyIHNvdXJjZUJhc2UgPSBTT1VSQ0VfQUREUkVTU19CQVNFOworCU1WX1UzMiBkZXN0QmFzZSA9IERFU1RBTlRJT05fQUREUkVTU19CQVNFOworCU1WX1UzMiBkZXN0U2l6ZSA9IERFU1RBTlRJT05fU0laRTsKKwlNVl9VMzIgaXRlcmF0aW9ucyA9IDE7CisKKwlpZiAoYXJnYyA+IDEpCisJCW5Tb3VyY2VBZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOworCisJaWYgKGFyZ2MgPiAyKQorCQluRGVzdEFkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7CisKKwlpZiAoYXJnYyA+IDMpCisJCWRlc3RTaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCisJaWYgKGFyZ2MgPiA0KQorCQlpdGVyYXRpb25zID0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgTlVMTCwgMTYpOworCisJLyogY2hlY2sgZGVzdFNpemUsIG11c3QgYmUgbXVsdGlwbHkgb2YgMU1CICovCisJaWYgKGRlc3RTaXplICYgKF8xTSAtIDEpKSB7CisJCW12UHJpbnRmKCJFcnJvcjogRGVzdGluYXRpb24gc2l6ZSBtdXN0IGJlIG11bHRpcGx5IG9mIDB4JVgoMU1CKVxuIiwgXzFNKTsKKwkJbXZTeXNYb3JGaW5pc2goKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNvbmZpZ3VyZU1lbW9yeU1hcHBpbmcoKTsKKworCS8qIHdyaXRlIHRoZSBraWxsZXIgcGF0dGVybiBpbiB0aGUgc291cmNlIGJsb2NrICovCisJZmlsbEtpbGxlclBhdHRlcm4oc291cmNlQmFzZSwgQkxPQ0tfU0laRSwgNjQpOworCWZpbGxLaWxsZXJQYXR0ZXJuKHNvdXJjZUJhc2UgKyBCTE9DS19TSVpFLCBCTE9DS19TSVpFLCAxMjgpOworCisJc3RhdHVzID0gWE9SQ2FsY3VsYXRlQ1JDKDIsIHNvdXJjZUJhc2UsIFRPVEFMX0JMT0NLX1NJWkUsICZuQmxvY2tDUkMpOworCUNIRUNLX0NSQ19TVEFUVVMoc3RhdHVzKTsKKwltdlByaW50ZigibkJsb2NrQ1JDICV4XG4iLCBuQmxvY2tDUkMpOworCisJLyogU3RhcnQgY29weWluZyBibG9ja3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7CisJCWZvciAobk9mZnNldEluRGVzdCA9IDA7IG5PZmZzZXRJbkRlc3QgPCBkZXN0U2l6ZTsgbk9mZnNldEluRGVzdCArPSBUT1RBTF9CTE9DS19TSVpFKSB7CisKKwkJCS8qIENvcHkgYmxvY2sgdG8gdGhlIGN1cnJlbnQgZGVzdGluYXRpb24gYWRkcmVzcyovCisJCQlmb3IgKG5PZmZzZXQgPSAwOyBuT2Zmc2V0IDwgVE9UQUxfQkxPQ0tfU0laRTsgbk9mZnNldCArPSBDUFVfQlVSU1RfU0laRSkgeworCQkJCW5Tb3VyY2VBZGRyID0gc291cmNlQmFzZSArIG5PZmZzZXQ7CisJCQkJbkRlc3RBZGRyID0gZGVzdEJhc2UgKyBuT2Zmc2V0SW5EZXN0ICsgbk9mZnNldDsKKwkJCQlNVl9QTERfUkFOR0UobkRlc3RBZGRyLCBuRGVzdEFkZHIgKyBDUFVfQlVSU1RfU0laRSk7CisJCQkJbWVtY3B5KCh2b2lkICopbkRlc3RBZGRyLCAodm9pZCAqKW5Tb3VyY2VBZGRyLCBDUFVfQlVSU1RfU0laRSk7CisJCQkJTVZfRkxVU0hfQ0FDSEVfTDEobkRlc3RBZGRyLCBuRGVzdEFkZHIgKyBDUFVfQlVSU1RfU0laRSk7CisJCQl9CisJCX0KKworCQkvKiBDaGVjayB0aGUgY29waWVkIGJsb2NrcyBpbiBkZXN0aW5hdGlvbiAqLworCQlmb3IgKG5PZmZzZXRJbkRlc3QgPSAwOyBuT2Zmc2V0SW5EZXN0IDwgZGVzdFNpemU7IG5PZmZzZXRJbkRlc3QgKz0gVE9UQUxfQkxPQ0tfU0laRSkgeworCQkJbkRlc3RBZGRyID0gZGVzdEJhc2UgKyBuT2Zmc2V0SW5EZXN0OworCQkJc3RhdHVzID0gWE9SQ2FsY3VsYXRlQ1JDKDIsIG5EZXN0QWRkciwgVE9UQUxfQkxPQ0tfU0laRSwgJm5DUkMpOworCQkJQ0hFQ0tfQ1JDX1NUQVRVUyhzdGF0dXMpOworCQkJaWYgKG5DUkMgIT0gbkJsb2NrQ1JDKSB7CisJCQkJbXZQcmludGYoIkVycm9yIGF0IEJsb2NrIHN0YXJ0IGFkZHJlc3MgJVhcbiIsIG5EZXN0QWRkcik7CisJCQkJbXZQcmludGYoIkNSQyB3YXMgJVggZXhwZWN0ZWQgJVhcbiIsIG5DUkMsIG5CbG9ja0NSQyk7CisJCQkJbXZTeXNYb3JGaW5pc2goKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJbXZQcmludGYoIlxiXGJcYlxiJTRkIiwgaSk7CisJfQorCW12UHJpbnRmKCJcYlxiXGJcYiIpOworCW12UHJpbnRmKCJNZW1UZXN0IGVuZCBzdWNjZXNzZnVsbHlcbiIpOworCW12U3lzWG9yRmluaXNoKCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RvcG9sb2d5RGVmLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcveG9yX21lbXRlc3QuaApzaW1pbGFyaXR5IGluZGV4IDY0JQpyZW5hbWUgZnJvbSB0b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUb3BvbG9neURlZi5oCnJlbmFtZSB0byB0b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcveG9yX21lbXRlc3QuaAppbmRleCBkYTgyZTI0Li45MWQ3YWI3IDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUb3BvbG9neURlZi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS91dGlscy9kZWJ1Zy94b3JfbWVtdGVzdC5oCkBAIC0xLDQgKzEsMyBAQAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKIApAQCAtNjIsNzkgKzYxLDg1IEBACiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX01WX0REUjNfVE9QT0xPR1lfREVGX0gKLSNkZWZpbmUgX01WX0REUjNfVE9QT0xPR1lfREVGX0gKIAorI2RlZmluZSBTUkFNX1dJTl9JRAkJMHg0CisjZGVmaW5lIFNSQU1fV0lOX0JBU0UJCTB4NDAwMDAwMDAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKipUT1BPTE9HWSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQ09ORklHX0REUjMKLXR5cGVkZWYgZW51bQotewotICAgU1BFRURfQklOX0REUl84MDBELAotICAgU1BFRURfQklOX0REUl84MDBFLAotICAgU1BFRURfQklOX0REUl8xMDY2RSwKLSAgIFNQRUVEX0JJTl9ERFJfMTA2NkYsCi0gICBTUEVFRF9CSU5fRERSXzEwNjZHLAotICAgU1BFRURfQklOX0REUl8xMzMzRiwKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0csCi0gICBTUEVFRF9CSU5fRERSXzEzMzNILAotICAgU1BFRURfQklOX0REUl8xMzMzSiwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEcsCi0gICBTUEVFRF9CSU5fRERSXzE2MDBILAotICAgU1BFRURfQklOX0REUl8xNjAwSiwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEssCi0gICBTUEVFRF9CSU5fRERSXzE4NjZKLAotICAgU1BFRURfQklOX0REUl8xODY2SywKLSAgIFNQRUVEX0JJTl9ERFJfMTg2NkwsCi0gICBTUEVFRF9CSU5fRERSXzE4NjZNLAotICAgU1BFRURfQklOX0REUl8yMTMzSywKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM0wsCi0gICBTUEVFRF9CSU5fRERSXzIxMzNNLAotICAgU1BFRURfQklOX0REUl8yMTMzTiwKKyNkZWZpbmUgWE9SX0VOR0lORV9USU1FT1VUCTB4NTAwMDAwMAogCi0gICBTUEVFRF9CSU5fRERSXzEzMzNIX0VYVCwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEtfRVhULAotICAgU1BFRURfQklOX0REUl8xODY2TV9FWFQKLX1NVl9IV1NfU1BFRURfQklOOworI2RlZmluZSBTVF9LUF9MRU4JCTU5CisjZGVmaW5lIE9ORQkJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgWkVSTwkJCTAKKyNkZWZpbmUgQlVTX1NUQVRVUyhuVmFsdWUpCSgoblZhbHVlKSA/IE9ORSA6IFpFUk8pCisjZGVmaW5lIEJJVChYKQkJCSgweDEgPDwgWCkKIAotdHlwZWRlZiBlbnVtIAotewotICBERFJfRlJFUV9MT1dfRlJFUSwKLSAgRERSX0ZSRVFfNDAwLAotICBERFJfRlJFUV81MzMsCi0gIEREUl9GUkVRXzY2NywKLSAgRERSX0ZSRVFfODAwLAotICBERFJfRlJFUV85MzMsCi0gIEREUl9GUkVRXzEwNjYsCi0gIEREUl9GUkVRXzMxMSwKLSAgRERSX0ZSRVFfMzMzLAotICBERFJfRlJFUV80NjcsCi0gIEREUl9GUkVRXzg1MCwKLSAgRERSX0ZSRVFfNjAwLAotICBERFJfRlJFUV8zMDAsCi0gIEREUl9GUkVRXzkwMCwKLSAgRERSX0ZSRVFfMzYwLAotICBERFJfRlJFUV8xMDAwLAotICAgRERSX0ZSRVFfTElNSVQKLX1NVl9IV1NfRERSX0ZSRVE7CisjZGVmaW5lIE5VTV9PRl9ERVNDCQk4CisjZGVmaW5lIERFU0NfU0laRQkJXzhNCiAKLXR5cGVkZWYgZW51bQotewotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkNELAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlAsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSQVMsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSQywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJSRDFLLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlJEMkssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RQRCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdEZBVzFLLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190RkFXMkssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RXVFIsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSVFAsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RXUiwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdE1PRAotfXNwZWVkQmluVGFibGVFbGVtZW50czsKLSNlbmRpZiAvKkNPTkZJR19ERFIzICovCi0jZW5kaWYgLyogX01WX0REUjNfVE9QT0xPR1lfREVGX0ggKi8KKyNkZWZpbmUgU09VUkNFX0FERFJFU1NfQkFTRSAgICAweDgzMDAwMDAwCisjZGVmaW5lIEJMT0NLX1NJWkUgICAgICAgICAgICAgXzFNCisjZGVmaW5lIFRPVEFMX0JMT0NLX1NJWkUgICAgICAgKEJMT0NLX1NJWkUqMikKKyNkZWZpbmUgS0lMTEVSXzY0QklUX0JBU0UgICAgICBTT1VSQ0VfQUREUkVTU19CQVNFCisjZGVmaW5lIEtJTExFUl8xMjhCSVRfQkFTRSAgICAgKEtJTExFUl82NEJJVF9CQVNFICsgQkxPQ0tfU0laRSkKKyNkZWZpbmUgQ1BVX0JVUlNUX1NJWkUgICAgICAgICBfMUsKIAorI2RlZmluZSBERVNUQU5USU9OX0FERFJFU1NfQkFTRSAweDg0MDAwMDAwCisjZGVmaW5lIERFU1RBTlRJT05fU0laRSAgICAgICAgIF8xMjhNCiAKKyNkZWZpbmUgTlVNX09GX1hPUl9FTkdJTkUgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWE9SX0JMT0NLX1NJWkUgICAgICAgICAgICAgICAgIChfMTZNIC0gMSkKKyNkZWZpbmUgWE9SX1NPVVJDRV9BRERSRVNTKG5Yb3JOdW0pICAgICgweDEwMDAwMDAwICsgXzEyOE0qblhvck51bSkKKyNkZWZpbmUgWE9SX0RFU1RfQUREUkVTUyhuWG9yTnVtKSAgICAgIChYT1JfU09VUkNFX0FERFJFU1Moblhvck51bSkgKyAoREVTQ19TSVpFKk5VTV9PRl9ERVNDKSkKKworI2RlZmluZSBNVl9QTEQoQWRkcmVzcylcCit7XAorCV9fYXNtX18gX192b2xhdGlsZV9fKCJwbGQgWyUwXSIgOiA6ICJyIiAoQWRkcmVzcykpO1wKK30KKworI2RlZmluZSBNVl9QTERfUkFOR0UoZnJvbSwgdG8pXAore1wKKwlNVl9VMzIgYWRkcjtcCisJZm9yIChhZGRyID0gZnJvbTsgYWRkciA8IHRvOyBhZGRyICs9IDMyKSB7XAorCQlNVl9QTEQoYWRkcik7XAorCX0gXAorfQorCisjZGVmaW5lIENIRUNLX0NSQ19TVEFUVVMoc3RhdHVzKVwKK3tcCisJaWYgKHN0YXR1cyAhPSBNVl9PSykge1wKKwkJbXZQcmludGYoIkZhaWxlZCB0byBjYWxjdWxhdGUgQ1JDMzJcbiIpO1wKKwkJcmV0dXJuIDE7XAorCX0gXAorfQorCit2b2lkIGNhY2hlX2ludihNVl9VMzIgZGVzdCk7Cit2b2lkIGZsdXNoX2wxX3Y3KE1WX1UzMiBkZXN0KTsKKworI2RlZmluZSBNVl9GTFVTSF9DQUNIRV9MMShmcm9tLCB0bylcCit7XAorCU1WX1UzMiBhZGRyO1wKKwlmb3IgKGFkZHIgPSBmcm9tOyBhZGRyIDwgdG87IGFkZHIgKz0gMzIpIHtcCisJCWNhY2hlX2ludihhZGRyKTtcCisJCWZsdXNoX2wxX3Y3KGFkZHIpO1wKKwl9IFwKK30KKworI2RlZmluZSBLSUxMRVJfUEFUVEVSTl9CVVNfU1RBVEVcCisJe1wKKwkJMCwgMCwgMCwgMSwgMSwgMSwgMCwgMSwgMCwgMSxcCisJCTAsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsXAorCQkxLCAwLCAxLCAwLCAwLCAxLCAwLCAxLCAwLCAwLFwKKwkJMCwgMSwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMSxcCisJCTAsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDAsXAorCQkxLCAxLCAwLCAxLCAxLCAwLCAwXAorCX0KKworI2RlZmluZSBLSUxMRVJfUEFUVEVSTl9CSVRfU1RBVEVcCisJe1wKKwkJMSwgMCwgMSwgMSwgMCwgMCwgMSwgMCwgMSwgMCxcCisJCTEsIDEsIDAsIDEsIDAsIDAsIDEsIDAsIDEsIDAsXAorCQkxLCAwLCAxLCAxLCAwLCAxLCAwLCAxLCAwLCAwLFwKKwkJMCwgMCwgMCwgMSwgMCwgMCwgMSwgMSwgMCwgMSxcCisJCTAsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDAsIDAsXAorCQkwLCAwLCAwLCAxLCAxLCAxLCAxXAorCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNfaW5pdF90aXB2Mi5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM19pbml0X3RpcHYyLmMKaW5kZXggNjZkMWRhNi4uMDI1NWY3NyAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM19pbml0X3RpcHYyLmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM19pbml0X3RpcHYyLmMKQEAgLTEyMCw2ICsxMjAsMjAgQEAKICAgICBNVl9IV1NfVE9QT0xPR1lfTUFQICAgICAqdG9wb2xvZ3kKICk7CiAKK2V4dGVybiBNVl9TVEFUVVMgZGRyM1RpcEdldEZpcnN0QWN0aXZlSWYKKygKKyAgICBNVl9VOCAgIGRldk51bSwKKyAgICBNVl9VMzIgIGludGVyZmFjZU1hc2ssCisgICAgTVZfVTMyICAqaWZJZAorKTsKKworZXh0ZXJuIE1WX1NUQVRVUyAgICBtdkNhbGNDc051bQorKAorICAgIE1WX1UzMiAgICAgICAgICBkZXZOdW0sCisJTVZfVTMyICAgICAgICAgIGludGVyZmFjZUlkLAorCU1WX1UzMiAgICAgICAgICAqY3NOdW0KKyk7CisKIGV4dGVybiBNVl9VMzIgZGRyM1RpcEdldEluaXRGcmVxKCk7CiAKIGV4dGVybiBNVl9WT0lEIGRkcjNId3NTZXRMb2dMZXZlbCgKQEAgLTEzNyw2ICsxNTEsOSBAQAogc3RhdGljIE1WX1UzMiBkZHIzR2V0U3RhdGljRGRyTW9kZSh2b2lkKTsKICNlbmRpZgogCisvKiBnbG9iYWwgcGFyYW1ldGVyIChkZWZpbmVkIGluIFRJUCBsaWIgd2hpY2ggaG9sZHMgdGhlIEREUiB0b3BvbG9neSAqLworZXh0ZXJuIE1WX0hXU19UT1BPTE9HWV9NQVAgKnRvcG9sb2d5TWFwOworCiAvKlNldCAxIHRvIHVzZSBkeW5hbWljIERVTklUIGNvbmZpZ3VyYXRpb24sCiAJc2V0IDAoc3VwcG9ydGVkIGZvciBBMzgwIGFuZCBBQzMpIHRvIGNvbmZpZ3VyZSBEVU5JVCBpbiB2YWx1ZXMgc2V0IGJ5IGRkcjNUaXBJbml0U3BlY2lmaWNSZWdDb25maWcqLwogTVZfVTggZ2VuZXJpY0luaXRDb250cm9sbGVyID0gMTsKQEAgLTE0OCw3ICsxNjUsOSBAQAogTVZfVTMyIAltdkJvYXJkSWRJbmRleEdldChNVl9VMzIgYm9hcmRJZCk7CiBNVl9VMzIgbXZCb2FyZElkR2V0KE1WX1ZPSUQpOwogTVZfVTMyIGRkcjNHZXRCdXNXaWR0aCh2b2lkKTsKLQorI2lmZGVmIE1WX1JVTl9XSU5fVkFMSURBVElPTl9URVNUCitleHRlcm4gTVZfVk9JRCBtdkh3c0RkcjNUaXBTd2VlcFRlc3QoTVZfQk9PTCBlbmFibGUpOworI2VuZGlmCiBleHRlcm4gTVZfVk9JRCBkZHIzU2V0TG9nTGV2ZWwoTVZfVTMyIG5Mb2dMZXZlbCk7CiBzdGF0aWMgTVZfVTMyIGdMb2dMZXZlbCA9IDA7CiBzdGF0aWMgTVZfU1RBVFVTIGRkcjNId3NUdW5lVHJhaW5pbmdQYXJhbXMoTVZfVTggZGV2TnVtKTsKQEAgLTQwOSw2ICs0MjgsMTEgQEAKIAogCS8qU2V0IGxvZyBsZXZlbCBmb3IgdHJhaW5pbmcgbGliKi8KIAlkZHIzSHdzU2V0TG9nTGV2ZWwoTVZfREVCVUdfQkxPQ0tfQUxMLCBERUJVR19MRVZFTF9FUlJPUik7CisJLypkZHIzSHdzU2V0TG9nTGV2ZWwoTVZfREVCVUdfVFJBSU5JTkdfTUFJTiwgREVCVUdfTEVWRUxfVFJBQ0UpOyovCisKKyNpZmRlZiBNVl9SVU5fV0lOX1ZBTElEQVRJT05fVEVTVCAvKiB0byBydW4gRERSIHZpZXdlciB0b29sICh0byBkaXNwbGF5IEREUiB0cmFpbmluZyByZXN1bHRzKSAqLworCW12SHdzRGRyM1RpcFN3ZWVwVGVzdChNVl9UUlVFKTsKKyNlbmRpZgogCiAJLypTdGFydCBOZXcgVHJhaW5pbmcgSVAqLwogCXN0YXR1cyA9IGRkcjNId3NId1RyYWluaW5nKCk7CkBAIC00MzEsNyArNDU1LDExIEBACiAJZGRyM05ld1RpcERsYkNvbmZpZygpOwogCiAjaWYgZGVmaW5lZChFQ0NfU1VQUE9SVCkKLQlpZiggTVZfVFJVRSA9PSBkZHIzSWZFY2NFbmFibGVkKCkpeworCWlmKCAoTVZfVFJVRSA9PSBkZHIzSWZFY2NFbmFibGVkKCkpLyogJiYKKwkJKG12U3lzRW52U3VzcGVuZFdha2V1cENoZWNrKCkgIT0gTVZfU1VTUEVORF9XQUtFVVBfRU5BQkxFRF9HUElPX0RFVEVDVEVEKSAmJgorCQkobXZTeXNFbnZDaGVja1dha2V1cERyYW1FbmFibGUoKSAhPSBNVl9TVVNQRU5EX1dBS0VVUF9FTkFCTEVEX01FTV9ERVRFQ1RFRCkgKi8peworCQkvKlNjcnViIGFsbCBEUkFNIGFyZWEgaWYgRUNDIGVuYWJsZWQgKGFuZCBTdXNwZW5kIHdha2V1cCBzdGF0ZSBub3QgZGV0ZWN0ZWQgLSBUQkQpKi8KKwkJLyogRGlzYWJsZWQgU3VzcGVuZFdha2V1cCBzdXBwb3J0IHVudGlsIGRlYnVnKi8KIAkJZGRyM05ld1RpcEVjY1NjcnViKCk7CiAJfQogI2VuZGlmCkBAIC03NjksNiArNzk3LDExIEBACiB7CiAJTVZfVE9QT0xPR1lfVVBEQVRFX0lORk8gdG9wb2xvZ3lVcGRhdGVJbmZvOwogCisvKiB3aGVuIGJvb3RpbmcgZnJvbSBVQVJUICwgc2tpcCByZWFkaW5nIEREUiBjb25maWd1cmF0aW9uIGZyb20gU1cgRUVQUk9NLCBzaW5jZSBFRVBST00gaXMgbm90IGNvbmZpZ3VyZWQgYXQgMXN0IGJvb3QgKi8KKyNpZiBkZWZpbmVkKE1WX05PX1BSSU5UKQorCXJldHVybiBNVl9PSzsKKyNlbmRpZgorCiAJdG9wb2xvZ3lVcGRhdGVJbmZvLm12VXBkYXRlV2lkdGggPSBNVl9GQUxTRTsKIAl0b3BvbG9neVVwZGF0ZUluZm8ubXZVcGRhdGVFQ0MgPSBNVl9GQUxTRTsKIAl0b3BvbG9neVVwZGF0ZUluZm8ubXZVcGRhdGVFQ0NQdXAzTW9kZSA9IE1WX0ZBTFNFOwpAQCAtODA3LDE1ICs4NDAsNTIgQEAKIHN0YXRpYyBNVl9TVEFUVVMgZGRyM0h3c1R1bmVUcmFpbmluZ1BhcmFtcyhNVl9VOCBkZXZOdW0pCiB7CiAJTVZfVFVORV9UUkFJTklOR19QQVJBTVMgcGFyYW1zOworCU1WX1UzMiBpbnRlcmZhY2VJZDsKKwlNVl9VMzIgY3NOdW07CiAJTVZfU1RBVFVTIHN0YXR1czsKIAorCS8qIGluaXRpbGFpemUgdGhlIGdsb2JhbCBkZHIgdG9wb2xvZ3kgKi8KKwlDSEVDS19TVEFUVVMoZGRyM0dldFRvcG9sb2d5TWFwKCZ0b3BvbG9neU1hcCkpOworCisJLyogZ2V0IGZpcnN0IGFjdGl2ZSBpbnRlcmZhY2UgKi8KKwlDSEVDS19TVEFUVVMoZGRyM1RpcEdldEZpcnN0QWN0aXZlSWYoZGV2TnVtLCB0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgJmludGVyZmFjZUlkKSk7CisKKwlDSEVDS19TVEFUVVMobXZDYWxjQ3NOdW0oZGV2TnVtLCBpbnRlcmZhY2VJZCwgJmNzTnVtKSk7CisKIAkvKk5PVEU6IGRvIG5vdCByZW1vdmUgYW55IGZpZWxkIGluaXRpbGl6YXRpb24qLwogCXBhcmFtcy5ja0RlbGF5ID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfQ0tfREVMQVk7Ci0JcGFyYW1zLmNrRGVsYXlfMTYgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19DS19ERUxBWV8xNjsKLQlwYXJhbXMuUGZpbmdlciA9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BGSU5HRVI7Ci0JcGFyYW1zLk5maW5nZXIgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19ORklOR0VSOwogCXBhcmFtcy5QaHlSZWczVmFsID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUEhZUkVHM1ZBTDsKIAorCXBhcmFtcy5nWnByaURhdGEgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QUklfREFUQTsKKwlwYXJhbXMuZ1pucmlEYXRhID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfTlJJX0RBVEE7CisJcGFyYW1zLmdacHJpQ3RybCA9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BSSV9DVFJMOworCXBhcmFtcy5nWm5yaUN0cmwgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19OUklfQ1RSTDsKKworCXBhcmFtcy5nWnBvZHREYXRhID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUF9PRFRfREFUQTsKKwlwYXJhbXMuZ1pub2R0RGF0YSA9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX05fT0RUX0RBVEE7CisJcGFyYW1zLmdacG9kdEN0cmwgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QX09EVF9DVFJMOworCXBhcmFtcy5nWm5vZHRDdHJsID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfTl9PRFRfQ1RSTDsKKworCXBhcmFtcy5nRGljID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfRElDOworCXBhcmFtcy5nUnR0Tm9tID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUlRUX05PTTsKKworI2lmZGVmIENPTkZJR19ERFIzCisJaWYgKGNzTnVtID09IDEpIHsKKwkJcGFyYW1zLmdSdHRXUiA9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1JUVF9XUl8xQ1M7CisJCXBhcmFtcy51aU9EVENvbmZpZyA9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX09EVF9DT05GSUdfMUNTOworCX0gZWxzZSB7CisJCXBhcmFtcy5nUnR0V1IgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19SVFRfV1JfMkNTOworCQlwYXJhbXMudWlPRFRDb25maWcgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19PRFRfQ09ORklHXzJDUzsKKwl9CisjZWxzZSAvKiBDT05GSUdfRERSMyAqLworCS8qIEREUjQgKi8KKwlwYXJhbXMuZ1pwb2R0RGF0YSA9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BfT0RUX0RBVEFfRERSNDsKKwlwYXJhbXMudWlPRFRDb25maWcgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19PRFRfQ09ORklHX0REUjQ7CisJcGFyYW1zLmdSdHROb20gPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19SVFRfTk9NX0REUjQ7CisJcGFyYW1zLmdSdHRXUiA9ICBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19SVFRfV1I7CisJcGFyYW1zLmdEaWMgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19ESUNfRERSNDsKKyNlbmRpZgorCiAJc3RhdHVzID0gZGRyM1RpcFR1bmVUcmFpbmluZ1BhcmFtcyhkZXZOdW0sICZwYXJhbXMpOwogCWlmIChNVl9PSyAhPSBzdGF0dXMpIHsKIAkJbXZQcmludGYoIiVzIFRyYWluaW5nIFNlcXVlbmNlIC0gRkFJTEVEXG4iLCBkZHJUeXBlKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi8uZ2l0aWdub3JlIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyLy5naXRpZ25vcmUKaW5kZXggYTQzZmFmYy4uNjNkYWIxMiAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyLy5naXRpZ25vcmUKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyLy5naXRpZ25vcmUKQEAgLTEsMiArMSwzIEBACiAqLnJlagotCisqLm8KK3NyYy9Ecml2ZXIvZGRyNC8KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9NYWtlZmlsZSBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNDNjOTgxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTU1IEBACisjOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjO0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisjOworIztUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsCisjO0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworIzthbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKKyM7RmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworIztpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworIztsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCisjO01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKyM7CisjOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjO01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorIzsKKyM7SWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKKyM7bGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKKyM7dG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisjOworIzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIztNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorIzsKKyM7SWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgorIzttb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwKKyM7UHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzCisjO2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKKyM7U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvcgorIztvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KKyM7CisjO1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQKKyM7V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWQorIztESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5CisjO2Rpc2NsYWltZXIuCisjOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjO01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisjOworIztJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCisjO21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuCisjO1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisjO2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyM7CisjOyAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisjOwkgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyM7CisjOyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyM7ICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjOyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyM7CisjOyAgICA7KiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCisjOyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorIzsgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyM7CisjO1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyM7QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyM7V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIztESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisjO0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIzsoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjO0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIztBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIzsoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIztTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyM7CisjOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjLlNFQ09OREFSWToKKworaW5jbHVkZSAuLi8uLi9iYXNlLm1rCisKK1RJUF9JTkMgPSAkKEJIX1JPT1RfRElSKS9zcmNfZGRyL2RkcjNsaWJ2Mi9oCisKK0lOQ0xVREUgPSAtSSQoVElQX0lOQykvT3MgLUkkKFRJUF9JTkMpL09zL2d0T3MgLUkkKFRJUF9JTkMpL09zL2NvbW1vbi9zaWxpY29uSWYgXAorCSAgLUkkKFRJUF9JTkMpL1NvQyAtSSQoVElQX0lOQykvU2lsaWNvbiAtSSQoVElQX0lOQykvT3MvY29tbW9uL2NvbmZpZ0VsZW1lbnREYiBcCisJICAtSSQoVElQX0lOQykvRHJpdmVyIC1JJChUSVBfSU5DKS9Ecml2ZXIvZGRyMyAgLUkkKEJIX1JPT1RfRElSKS9pbmMvY29tbW9uIC1JJChCSF9ST09UX0RJUikvaW5jL2NvbW1vbi9ndE9zXAorCSAgLUkkKEJIX1JPT1RfRElSKS9pbmMvZGRyM19zb2MvJChCT0FSRCkgLUkkKEJIX1JPT1RfRElSKS9pbmMvZGRyM19zb2MvJChJTkNOQU1FKSBcCisJICAtSSQoQkhfUk9PVF9ESVIpL3NyY19kZHIgIC1JJChCSF9ST09UX0RJUikvcGxhdGZvcm0vc3lzRW52LyQoQk9BUkQpCisKK2lmZXEgKCQoRERSVFlQRSksZGRyNCkKKwlJTkNMVURFICs9IC1JJChCSF9ST09UX0RJUikvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHI0L2gKK2VuZGlmCisKK1RHVCA9IGRkcl8kKExJQk5BTUUpLmEKK1RHVF9VQVJUID0gZGRyXyQoTElCTkFNRSkudWFydC5hCisKK1RMSUIgPSAuLyQoRERSVFlQRSlfdHJhaW5pbmdfJChMSUJOQU1FKS5saWIKKworVEREUjRTVUJMSUIgPSAuLyQoRERSVFlQRSlfdHJhaW5pbmdfJChMSUJOQU1FKXN1Yi5saWIKKworVFNSQyA9ICQod2lsZGNhcmQgLi9zcmMvRHJpdmVyL2RkcjMvKi5jKQorVFNSQyArPSAuL3NyYy9TaWxpY29uL212SHdzRGRyMyQoU0lMTkFNRSkuYworaWZlcSAiJChCT0FSRCkiICAibXN5cyIKKwlUU1JDICs9IC4vc3JjL1NpbGljb24vbXZId3NEZHIzTXN5cy5jCitlbmRpZgorVFNSQyArPSAuL3NyYy9Tb2MvZGRyM18kKEJPQVJETkFNRSlfdHJhaW5pbmcuYworVFNSQyArPSAuL3NyYy9Tb2MvZGRyM19od3NfaHdfdHJhaW5pbmcuYworVFNSQyArPSAuL3NyYy9Pcy9ndE9zL212WG9yLmMKKworCitUU1JDRERSNCA9ICQod2lsZGNhcmQgLi9zcmMvRHJpdmVyL2RkcjQvc3JjLyouYykKKworVE9CSiA9ICQoVFNSQzouYz0ubykKK1RPQkpERFI0ID0gJChUU1JDRERSNDouYz0ubykKKworaWZlcSAoJChERFI0U1VCTElCKSx5ZXMpCisJVEFSR0VUUyA9ICQoVExJQikgJChURERSNFNVQkxJQikKK2Vsc2UKKwlUQVJHRVRTID0gJChUTElCKQorZW5kaWYKKworCisjIyMjIyMjIyMjIyMjZ2xvYmFsIGZsYWdzIGVuYWJsZS9kaXNhYmxlIGZlYXR1cmVzIHRvIHNhdmUgZm9vdHByaW50IyMjIyMjIyMjIyMKKyMgZXhjbHVkZSBkZWJ1ZyBmdW5jdGlvbiBub3QgcmVsZXZlbnQgZm9yIFNvQyggc2V0IGJ5IGRlZmF1bHQpCitDRkxBR1MgKz0gLURFWENMVURFX1NXSVRDSF9ERUJVRyAtREREUl9WSUVXRVJfVE9PTAoraWZlcSAiJChDT05GSUdfQk9CQ0FUMikiICAieSIKK0NGTEFHUyArPSAtRE1WX0hXU19FWENMVURFX0RFQlVHX1BSSU5UUworZW5kaWYKKyNyZW1vdmUgYWxsIGRlYnVnIHByaW50cyBmcm9tIHRyYWluaW5nKCB1bnNldCBieSBkZWZhdWx0KQorI0NGTEFHUyArPSAtRFNJTEVOVF9MSUIKK0NGTEFHUyArPSAtRExJQl9GVU5DVElPTkFMX0RFQlVHX09OTFkKKworI0ZsYWcgdG8gc3VwcG9ydCBzdGF0aWMgdHJhaW5pbmcgYWxnbyBmdW5jdGlvbnMoIHVuc2V0IGJ5IGRlZmF1bHQpCitpZmVxICgkKEJPQVJEKSxhMzh4KQorICNDRkxBR1MgKz0gLURTVEFUSUNfQUxHT19TVVBQT1JUCitlbHNlCitDRkxBR1MgKz0gLURTVEFUSUNfQUxHT19TVVBQT1JUCitlbmRpZgorI2ZsYWcgdG8gc3VwcG9ydCBPRFQgdGVzdCBkZWJ1ZyBmdW5jdGlvbiggdW5zZXQgYnkgZGVmYXVsdCkKKyNDRkxBR1MgKz0gLURPRFRfVEVTVF9TVVBQT1JUCisKKyMgRmxhZyB0byBlbmFibGUgUlggSU8gQklTVCBUZXN0CisjIENGTEFHUyArPSAtRE1WX0hXU19SWF9JT19CSVNUCisjIEZsYWcgZW5hYmxlIElPIEJJU1Qgb2YgQ01EL0FERFIgVGVzdCAoaW4gYWRkaXRpb24gdG8gTVZfSFdTX1JYX0lPX0JJU1QpCisjIENGTEFHUyArPSAtRE1WX0hXU19SWF9JT19CSVNUX0VUUAorCisjIyMjIyMjIyMjIyMjZW5kIG9mIGdsb2JhbCBmbGFncyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCithbGw6ICAgJChUQVJHRVRTKQorCislLm86ICUuYworCSQoQ0MpICQoQ0ZMQUdTKSAkKENQUEZMQUdTKSAtYyAtbyAkQCAkPAorCislLnVhcnQubzogJS5jCisJJChDQykgJChDRkxBR1MpIC1ETk9UX1VTRV9VQVJUIC1ETVZfTk9fSU5QVVQgLURNVl9OT19QUklOVCAgJChDUFBGTEFHUykgLWMgLW8gICRAICQ8CisKKyQoVEREUjRTVUJMSUIpOiAkKFRPQkpERFI0KQorCSQoUk0pIC4vJEAKKwlhciByY3MgJChURERSNFNVQkxJQikgJChUT0JKRERSNCkKKwkkKENQKSAuLyRAIC4uL2xpYgorCiskKFRMSUIpOiAkKFRPQkopCisJJChSTSkgLi8kQAorCWFyIHJjcyAkKFRMSUIpICQoVE9CSikKKwkkKENQKSAuLyRAIC4uL2xpYgorCitjbGVhbjoKKwkkKFJNKSAuLyoubyAgLi8qLmEKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9ndEJ1aWxkIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2d0QnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTY1NjI0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9ndEJ1aWxkCkBAIC0wLDAgKzEsMzEgQEAKKworIyMgVklQUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCAjIyMjIyMjIyMjIyMjIyMjIworaWZlcSAoVklQUywgJChIT01FX0VOVikpCisKKyNJTkNMVURFX1BBVEggPQorI0NfRklMRV9MSVNUICA9CisjU1VCRElSUyAgICAgID0KKyNDX0VYQ0xVREVfRklMRV9MSVNUID0KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1JPT1RfRElSID0gJChzdWJzdCBcLC8sJChTV19ST09UKSkKK2luY2x1ZGUgJChST09UX0RJUikvbWFpbkxhYlNlcnZpY2VzL2d0QnVpbGQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZWxzZQorCisjIyBDUFNTIGNvbXBpbGF0aW9uIGVudmlyb25tZW50ICMjIyMjIyMjIyMjIyMjIyMjCisjSU5DTFVERV9QQVRIID0KKyNDX0ZJTEVfTElTVCAgPQorI1NVQkRJUlMgICAgICA9CisjQ19FWENMVURFX0ZJTEVfTElTVCA9CisKK0NGTEFHUyArPSAtRENPTkZJR19ERFIzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaW5jbHVkZSAkKFBST0pfQkFTRSkvZ3RUb3BNYWtlCitlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcC5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcC5oCmluZGV4IDRjZGZjZjIuLmViYTg4YjcgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXAuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwLmgKQEAgLTUyLDkgKzUyLDkgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0REUjQKLSNkZWZpbmUgRERSM19USVBfVkVSU0lPTl9TVFJJTkcgIkREUjQgVHJhaW5pbmcgU2VxdWVuY2UgLSBWZXIgVElQLTAuNy4iCisjZGVmaW5lIEREUjNfVElQX1ZFUlNJT05fU1RSSU5HICJERFI0IFRyYWluaW5nIFNlcXVlbmNlIC0gVmVyIFRJUC0wLjIyLiIKICNlbHNlCi0jZGVmaW5lIEREUjNfVElQX1ZFUlNJT05fU1RSSU5HICJERFIzIFRyYWluaW5nIFNlcXVlbmNlIC0gVmVyIFRJUC0xLjI5LiIKKyNkZWZpbmUgRERSM19USVBfVkVSU0lPTl9TVFJJTkcgIkREUjMgVHJhaW5pbmcgU2VxdWVuY2UgLSBWZXIgVElQLTEuNDYuIgogI2VuZGlmCiAKICNkZWZpbmUgTUFYX0NTX05VTSAgICAgICAgICg0KQpAQCAtMzIwLDE5ICszMjAsMzIgQEAKICovCiAKIEdUX1NUQVRVUyAgICBtdkh3c0RkcjNUaXBSdW5BbGcKLSggCisoCiAgICAgR1RfVTMyICAgICAgICAgICAgICBkZXZOdW0sCiAgICAgTVZfSFdTX0FMR09fVFlQRSAgICBhbGdvVHlwZQogKTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitHZXQgRERSIHZlcnNpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIG12SHdzRGRyM1RpcFZlcnNpb25HZXQKKyogRGVzYzogICAgIFJldHVybiBERFIgdmVyc2lvbiBzdHJpbmcKKyogQXJnczoKKyoKKyoKKyogTm90ZXM6CisqIFJldHVybnM6ICBPSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworY29uc3QgR1RfQ0hBUiogbXZId3NEZHIzVGlwVmVyc2lvbkdldCh2b2lkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOYW1lOiAgICAgbXZId3NEZHIzVGlwTW9kZVJlYWQuCiAqIERlc2M6ICAgICByZWFkIE1vZGUgcmVnaXN0ZXJzCi0qIEFyZ3M6ICAgICBkZXZOdW0gLSBjaGFubmVsIElEIAorKiBBcmdzOiAgICAgZGV2TnVtIC0gRGV2aWNlIG51bWJlcgogKiAgICAgICAgICAgbW9kZUluZm8gLSBwb2ludGVyIHRvIG1vZGUgaW5mbyBzdHJ1Y3QKICoKLSogTm90ZXM6ICAgIAorKiBOb3RlczoKICogUmV0dXJuczogIE9LIGlmIHN1Y2Nlc3MsIG90aGVyIGVycm9yIGNvZGUgaWYgZmFpbC4KICovCiBHVF9TVEFUVVMgICAgbXZId3NEZHIzVGlwTW9kZVJlYWQKQEAgLTM0Nyw3ICszNjAsNyBAQAogKiBBcmdzOiAgICAgZGV2TnVtCiAqICAgICAgICAgICByZXN1bHQKICoKLSogTm90ZXM6ICAgIAorKiBOb3RlczoKICogUmV0dXJuczogIE9LIGlmIHN1Y2Nlc3MsIG90aGVyIGVycm9yIGNvZGUgaWYgZmFpbC4KICovCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBCaXN0LmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwQmlzdC5oCmluZGV4IGYzZDVmZmEuLmRiNWM4YWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBCaXN0LmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcEJpc3QuaApAQCAtMTU4LDYgKzE1OCwxMyBAQAogICAgIEdUX1UzMiBtb2RlCiApOwogCitHVF9CT09MIGRkcjNUaXBSdW5MZXZlbGluZ1N3ZWVwVGVzdAorKAorICAgIEdUXzMyIGRldk51bSwKKyAgICBHVF9VMzIgUmVwZWF0TnVtLAorICAgIEdUX1UzMiBkaXJlY3Rpb24sCisgICAgR1RfVTMyIG1vZGUKKyk7CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5hbWU6ICAgICBkZHIzVGlwUHJpbnRSZWdzLgogKiBEZXNjOiAgICAgUHJpbnQgU3BlY2lmaWVkIER1bml0L1B1cCBSZWdpc3RlcnMKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBEYi5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcERiLmgKaW5kZXggY2JhM2QyYS4uMTM5NTk3ZiAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcERiLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcERiLmgKQEAgLTEsODEgKzEsMiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKLSoKLSogVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbAotKiBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKLSogYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLgotKiBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUKLSogYW5kL29yIG1vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSogIC0gICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0qICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0qICAtICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotKiAgLSAgICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQotKiAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0qICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi0qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci0qIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotKiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0qIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdkRkcjNUcmFpbmluZ0lwRGIuaAotKgotKiBERVNDUklQVElPTjoKLSoKLSoKLSogRklMRSBSRVZJU0lPTiBOVU1CRVI6Ci0qICAgICAgICRSZXZpc2lvbjogMyAkCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9NVl9ERFIzX1RSQUlOSU5HSVBfREJfSF8KLSNkZWZpbmUgX01WX0REUjNfVFJBSU5JTkdJUF9EQl9IXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSAgIGV4dGVybiAiQyIKLSAgIHsKLSNlbmRpZgotCi10eXBlZGVmIGVudW0KLXsKLSAgIFBBVFRFUk5fUEJTMSwKLSAgIFBBVFRFUk5fUEJTMiwKLSAgIFBBVFRFUk5fUkwsCi0gICBQQVRURVJOX1NUQVRJQ19QQlMsCi0gICBQQVRURVJOX0tJTExFUl9EUTAsCi0gICBQQVRURVJOX0tJTExFUl9EUTEsCi0gICBQQVRURVJOX0tJTExFUl9EUTIsCi0gICBQQVRURVJOX0tJTExFUl9EUTMsCi0gICBQQVRURVJOX0tJTExFUl9EUTQsCi0gICBQQVRURVJOX0tJTExFUl9EUTUsCi0gICBQQVRURVJOX0tJTExFUl9EUTYsCi0gICBQQVRURVJOX0tJTExFUl9EUTcsCi0gICBQQVRURVJOX1BCUzMsCi0gICBQQVRURVJOX1JMMiwKLSAgIFBBVFRFUk5fVEVTVCwKLSAgIFBBVFRFUk5fRlVMTF9TU08wLAotICAgUEFUVEVSTl9GVUxMX1NTTzEsCi0gICBQQVRURVJOX0ZVTExfU1NPMiwKLSAgIFBBVFRFUk5fRlVMTF9TU08zLAotICAgUEFUVEVSTl9WUkVGLAotICAgUEFUVEVSTl9MSU1JVAotfU1WX0hXU19QQVRURVJOOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSAgIH0KLSNlbmRpZgotCi0jZW5kaWYgLyogX01WX0REUjNfVFJBSU5JTkdJUF9EQl9IXyAqLwogCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBEZWYuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBEZWYuaAppbmRleCBiZTUzYWY4Li4yNzQ2ZmFkIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwRGVmLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcERlZi5oCkBAIC00Niw2ICs0NiwxMCBAQAogI2luY2x1ZGUgImNvbW1vbi9zaWxpY29uSWYvbXZTaWxpY29uSWYuaCIKIAogI2lmIGRlZmluZWQoQ0hYX0ZBTUlMWSkgfHwgZGVmaW5lZChFWE1YUE1fRkFNSUxZKQorI2RlZmluZSBDUFNTX0JVSUxECisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0hYX0ZBTUlMWSkgfHwgZGVmaW5lZChFWE1YUE1fRkFNSUxZKQogI2RlZmluZSBvc01lbUNweQlod3NPc01lbUNvcHlGdW5jUHRyCiAjZWxzZQogI2luY2x1ZGUgPGd0T3MvZ3RPc01lbS5oPgpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcEVuZ2luZS5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcEVuZ2luZS5oCmluZGV4IDc2NjM1MTcuLjQ1ODMyM2UgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBFbmdpbmUuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwRW5naW5lLmgKQEAgLTEyMSwyMSArMTIxLDYgQEAKICk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTmFtZTogICAgIGRkcjNUaXBMb2FkUGF0dGVyblRvTWVtQnlDcHUuCi0qIERlc2M6ICAgICBMb2FkIGV4cGVjdGVkIFBhdHRlcm4gdG8gZXh0ZXJuYWwgbWVtb3J5Ci0qIEFyZ3M6Ci0qIE5vdGVzOgotKiBSZXR1cm5zOiAgT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgotKi8KLUdUX1NUQVRVUyAgICBkZHIzVGlwTG9hZFBhdHRlcm5Ub01lbUJ5Q3B1Ci0oCi0gICAgR1RfVTMyICAgICAgICAgIGRldk51bSwKLSAgICBNVl9IV1NfUEFUVEVSTiAgcGF0dGVybiwKLSAgICBHVF9VMzIgICAgICAgICAgb2Zmc2V0Ci0pOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbG9hZCBwYXR0ZXJuIHRvIG1lbW9yeSB1c2luZyBPRFBHCiAqLwogR1RfU1RBVFVTICAgIGRkcjNUaXBMb2FkQWxsUGF0dGVyblRvTWVtCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwRmxvdy5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcEZsb3cuaAppbmRleCAzZGRmNzZlLi5jZWM3NzEyIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwRmxvdy5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBGbG93LmgKQEAgLTQ3LDkgKzQ3LDYgQEAKIAogI2luY2x1ZGUgIm12RGRyM1RyYWluaW5nSXAuaCIKICNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwUGJzLmgiCi0jaWZkZWYgQ09ORklHX0REUjQKLSNpbmNsdWRlICJtdkRkcjRUcmFpbmluZ0lwRmxvdy5oIgotI2VuZGlmCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogICAgZXh0ZXJuICJDIgpAQCAtODYsMTAgKzgzLDkgQEAKICNkZWZpbmUgUEFUVEVSTl9NQVhJTVVNX0xFTkdUSCAoNjQpCiAjZGVmaW5lIEVYVF9BQ0NFU1NfQlVSU1RfTEVOR1RIICg4KQogI2RlZmluZSAgQ0hJUF9JRCAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIElTX0lOVEVSRkFDRV9BQ1RJVkUoIF91aUludGVyZmFjZU1hc2tfICwgX3VpSW50ZXJmYWNlSWRfICkgICAoIF91aUludGVyZmFjZU1hc2tfICYgKCAxIDw8IF91aUludGVyZmFjZUlkXyApICkgCi0jZGVmaW5lIElTX0JVU19BQ1RJVkUoIF91aUludGVyZmFjZU1hc2tfICwgX3VpSW50ZXJmYWNlSWRfICkgICAoIF91aUludGVyZmFjZU1hc2tfICYgKCAxIDw8IF91aUludGVyZmFjZUlkXyApICkgCi0jZGVmaW5lIEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKSAgIChkZHIzVGlwR2V0VG9wb2xvZ3lNYXAoZGV2TnVtKS0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UpCi0KKyNkZWZpbmUgSVNfSU5URVJGQUNFX0FDVElWRSggX3VpSW50ZXJmYWNlTWFza18gLCBfdWlJbnRlcmZhY2VJZF8gKSAgICggX3VpSW50ZXJmYWNlTWFza18gJiAoIDEgPDwgX3VpSW50ZXJmYWNlSWRfICkgKQorI2RlZmluZSBJU19CVVNfQUNUSVZFKCBfdWlJbnRlcmZhY2VNYXNrXyAsIF91aUludGVyZmFjZUlkXyApICAgKCAoX3VpSW50ZXJmYWNlTWFza18gPj4gX3VpSW50ZXJmYWNlSWRfKSAmIDEgKQorICAgICAgIC8qSGFpbSAoIF91aUludGVyZmFjZU1hc2tfICYgKCAxIDw8IF91aUludGVyZmFjZUlkXyApICkqLyAgCiAjZGVmaW5lIEREUjNfSVNfRUNDX1BVUDNfTU9ERShfdWlJbnRlcmZhY2VNYXNrXykJKChfdWlJbnRlcmZhY2VNYXNrXyA9PSAweEIpPyhHVF9UUlVFKTooR1RfRkFMU0UpKQogI2RlZmluZSBERFIzX0lTX0VDQ19QVVA0X01PREUoX3VpSW50ZXJmYWNlTWFza18pCSgoKChfdWlJbnRlcmZhY2VNYXNrXyAmIDB4MTApID09IDApKT8oR1RfRkFMU0UpOihHVF9UUlVFKSkKICNkZWZpbmUgRERSM19JU18xNkJJVF9EUkFNX01PREUoX2FjdGl2ZUJ1c01hc2tfKQkoKCgoX2FjdGl2ZUJ1c01hc2tfICYgMHg0KSA9PSAwKSk/KEdUX1RSVUUpOihHVF9GQUxTRSkpCkBAIC0xMzUsMTcgKzEzMSwxNiBAQAogI2RlZmluZSAgRElTQUJMRV9ERFJfVFVOSU5HX0RBVEEgICAgICAgICAgKDB4MDIyOTQyODUpCiAjZGVmaW5lICBFTkFCTEVfRERSX1RVTklOR19EQVRBICAgICAgICAgICAoMHgxMjI5NDI4NSkKIAotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZCAoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZCAoQ09ORklHX0FSTUFEQV8zOVgpCisjaWYgIWRlZmluZWQoQ1BTU19CVUlMRCkgJiYgIWRlZmluZWQoQ09ORklHX0JPQkNBVDIpCiAjZGVmaW5lIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRyAgICAgICAgICAoMHgxODQ4OCkKLSNkZWZpbmUgT0RQR19UUkFJTklOR19UUklHR0VSX1JFRyAgICAgICAgICgweDEwMzApCi0jZGVmaW5lIE9EUEdfU1RBVFVTX0RPTkVfUkVHICAgICAgICAgCSAgKDB4MTZGQykKLSNkZWZpbmUgT0RQR19FTkFCTEVfUkVHICAgICAgICAgICAgICAgICAgICgweDE4NkQ0KS8vS1cyOAotI2RlZmluZSBPRFBHX0VOQUJMRV9PRkZTICAgICAgICAgICAgICAgICAgKDApCi0jZGVmaW5lIE9EUEdfRElTQUJMRV9PRkZTICAgICAgICAgICAgICAgICAoOCkKICNlbHNlCiAjZGVmaW5lIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRyAgICAgICAgICAoMHgxMDMwKQogI2VuZGlmCisjZGVmaW5lIE9EUEdfVFJBSU5JTkdfVFJJR0dFUl9SRUcgICAgICAgICAoMHgxMDMwKQorI2RlZmluZSBPRFBHX1NUQVRVU19ET05FX1JFRyAgICAgICAgIAkgICgweDE2RkMpCisjZGVmaW5lIE9EUEdfRU5BQkxFX1JFRyAgICAgICAgICAgICAgICAgICAoMHgxODZENCkKKyNkZWZpbmUgT0RQR19FTkFCTEVfT0ZGUyAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBPRFBHX0RJU0FCTEVfT0ZGUyAgICAgICAgICAgICAgICAgKDgpCiAKICNkZWZpbmUgT0RQR19UUkFJTklOR19DT05UUk9MX1JFRyAgICAgICAgICgweDEwMzQpCiAjZGVmaW5lIE9EUEdfT0JKMV9PUENPREVfUkVHICAgICAgICAgICAgICAoMHgxMDNDKQpAQCAtMjEwLDIxICsyMDUsMjIgQEAKICNkZWZpbmUgQ1NfRU5BQkxFX1JFRyAgICAgICAgICAgICAgICAgICAgICgweDE2RDgpCiAjZGVmaW5lIFdSX0xFVkVMSU5HX0RRU19QQVRURVJOX1JFRyAgICAgICAoMHgxNkRDKQogCi0jaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZCAoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZCAoQ09ORklHX0FSTUFEQV8zOVgpCisjaWYgIWRlZmluZWQoQ1BTU19CVUlMRCkgJiYgIWRlZmluZWQoQ09ORklHX0JPQkNBVDIpCiAjZGVmaW5lIE9EUEdfQklTVF9ET05FICAgICAgICAgICAgICAgICAgICAoMHgxODZENCkKLSNkZWZpbmUgT0RQR19CSVNUX0RPTkVfQklUX09GRlMgICAgICAgICAgICgwKQotI2RlZmluZSBPRFBHX0JJU1RfRE9ORV9CSVRfVkFMVUUgICAgICAgICAgKDApCiAjZWxzZQogI2RlZmluZSBPRFBHX0JJU1RfRE9ORSAgICAgICAgICAgICAgICAgICAgKDB4MTZGQykKICNlbmRpZgorI2RlZmluZSBPRFBHX0JJU1RfRE9ORV9CSVRfT0ZGUyAgICAgICAgICAgKDApCisjZGVmaW5lIE9EUEdfQklTVF9ET05FX0JJVF9WQUxVRV9SRVYyICAgICAgICAgICgxKQorI2RlZmluZSBPRFBHX0JJU1RfRE9ORV9CSVRfVkFMVUVfUkVWMyAgICAgICAgICAoMCkKIAotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQgKENPTkZJR19BTExFWUNBVDMpIHx8IGRlZmluZWQgKENPTkZJR19BUk1BREFfMzlYKQorI2lmICFkZWZpbmVkKENQU1NfQlVJTEQpICYmICFkZWZpbmVkKENPTkZJR19CT0JDQVQyKQogI2RlZmluZSBSRVNVTFRfQ09OVFJPTF9CWVRFX1BVUF8wX1JFRyAgICAgKDB4MTgzMCkKICNkZWZpbmUgUkVTVUxUX0NPTlRST0xfQllURV9QVVBfMV9SRUcgICAgICgweDE4MzQpCiAjZGVmaW5lIFJFU1VMVF9DT05UUk9MX0JZVEVfUFVQXzJfUkVHICAgICAoMHgxODM4KQogI2RlZmluZSBSRVNVTFRfQ09OVFJPTF9CWVRFX1BVUF8zX1JFRyAgICAgKDB4MTgzQykKICNkZWZpbmUgUkVTVUxUX0NPTlRST0xfQllURV9QVVBfNF9SRUcgICAgICgweDE4QjApCi0JCQkJCQkJCQkJICAKKwogI2RlZmluZSBSRVNVTFRfQ09OVFJPTF9QVVBfMF9CSVRfMF9SRUcgICAgKDB4MThCNCkKICNkZWZpbmUgUkVTVUxUX0NPTlRST0xfUFVQXzBfQklUXzFfUkVHICAgICgweDE4QjgpCiAjZGVmaW5lIFJFU1VMVF9DT05UUk9MX1BVUF8wX0JJVF8yX1JFRyAgICAoMHgxOEJDKQpAQCAtMzc3LDEyICszNzMsMjcgQEAKICNkZWZpbmUgUEhBU0VfUkVHX09GRlNFVCAgICgzMikKICNkZWZpbmUgTlVNX0JZVEVTX0lOX0JVUlNUICgzMSkKICNkZWZpbmUgTlVNX09GX0NTICAgICAgICAgICg0KQotI2RlZmluZSBDU19SRUdfVkFMVUUoY3NOdW0pICAgKGNzTWFza1JlZ1tjc051bV0pCisjZGVmaW5lIENTX0JZVEVfR0FQKGNzTnVtKSAgIChjc051bSoweDQpCisjZGVmaW5lIENTX1BCU19HQVAoY3NOdW0pICAgKGNzTnVtKjB4MTApCiAjZGVmaW5lIEFETExfTEVOR1RIICgzMikKIAorI2lmZGVmIENPTkZJR19ERFI0CisvKiBERFI0IE1SUyAqLworI2RlZmluZSBNUlM0X0NNRCAoMHgxMCkKKyNkZWZpbmUgTVJTNV9DTUQgKDBYMTEpCisjZGVmaW5lIE1SUzZfQ01EICgwWDEyKQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBFbnVtcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorLyogRERSNCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRERSNF9NUjBfUkVHICAgICAgICAgICAgICAgICAgICAgICgweDE5MDApCisjZGVmaW5lIEREUjRfTVIxX1JFRyAgICAgICAgICAgICAgICAgICAgICAoMHgxOTA0KQorI2RlZmluZSBERFI0X01SMl9SRUcgICAgICAgICAgICAgICAgICAgICAgKDB4MTkwOCkKKyNkZWZpbmUgRERSNF9NUjNfUkVHICAgICAgICAgICAgICAgICAgICAgICgweDE5MEMpCisjZGVmaW5lIEREUjRfTVI0X1JFRyAgICAgICAgICAgICAgICAgICAgICAoMHgxOTEwKQorI2RlZmluZSBERFI0X01SNV9SRUcgICAgICAgICAgICAgICAgICAgICAgKDB4MTkxNCkKKyNkZWZpbmUgRERSNF9NUjZfUkVHICAgICAgICAgICAgICAgICAgICAgICgweDE5MTgpCisjZGVmaW5lIEREUjRfTVBSX1dSX1JFRyAgICAgICAgICAgICAgICAgICAoMHgxOUQwKQorI2RlZmluZSBEUkFNX1BJTlNfTVVYX1JFRyAgICAgICAgICAgICAgICAgKDB4MTlENCkKKyNlbmRpZgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqIFN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MDMsNiArNDE0LDU2IEBACiAgICAgICAvKiBNYXNrIHVzZWQgaW4gcmVnaXN0ZXIgKi8KIH1QYWdlRWxlbWVudDsKIAorI2lmZGVmIENPTkZJR19ERFI0CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBkZHI0VGlwRHluYW1pY1dyaXRlTGV2ZWxpbmdTdXBwCisqIERlc2M6ICAgICBXcml0ZSBsZXZlbGluZyBwaGFzZSBjb3JyZWN0aW9uCisqIEFyZ3M6ICAgICBkZXZOdW0gLSBkZXZpY2UgbnVtYmVyCisqCisqIE5vdGVzOgorKiBSZXR1cm5zOiAgT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK0dUX1NUQVRVUyBkZHI0VGlwRHluYW1pY1dyaXRlTGV2ZWxpbmdTdXBwCisoCisJR1RfVTMyIGRldk51bQorKTsKKworR1RfU1RBVFVTICAgIGRkcjRUaXBDb25maWd1cmVQaHkKKygKKyAgICBHVF9VMzIgICAgZGV2TnVtCispOworCitHVF9TVEFUVVMgZGRyNFRpcFNldFRpbWluZworKAorICAgIEdUX1UzMgkJCQkgICAgZGV2TnVtLAorICAgIE1WX0hXU19BQ0NFU1NfVFlQRSAgICAgIGFjY2Vzc1R5cGUsCisgICAgR1RfVTMyCQkJCQlpbnRlcmZhY2VJZCwKKyAgICBNVl9IV1NfRERSX0ZSRVEJCQlmcmVxdWVuY3kKKyk7CisKK0dUX1NUQVRVUyBkZHI0TW9kZVJlZ3NJbml0CisoCisgICAgR1RfVTggZGV2TnVtCispOworCitHVF9TVEFUVVMgZGRyNFNkcmFtQ29uZmlnCisoCisgICAgR1RfVTMyIGRldk51bQorKTsKKworR1RfU1RBVFVTICAgIGRkcjRUaXBDYWxpYnJhdGlvbkFkanVzdAorKAorICAgIEdUX1UzMgkJZGV2TnVtLAorCUdUX1U4CQlWcmVmX2VuLAorCUdUX1U4CQlQT0RfT25seQorKTsKKworR1RfU1RBVFVTIGRkcjNUaXBERFI0RGRyNFRyYWluaW5nTWFpbkZsb3cKKygKKyAgICBHVF9VMzIgZGV2TnVtCispOworCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOYW1lOiAgICAgZGRyM1RpcFdyaXRlTGV2ZWxpbmdTdGF0aWNDb25maWcuCkBAIC04NzksMTEgKzk0MCwxMSBAQAogCiBHVF9TVEFUVVMgICAgZGRyM1RpcFJlc2V0Rmlmb1B0cihHVF9VMzIgZGV2TnVtKTsKIAotR1RfQk9PTCByZWFkUHVwVmFsdWUoR1RfMzIgUHVwVmFsdWVzW01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXSwgaW50IHJlZ0FkZHIsIEdUX1UzMiBtYXNrKTsKK0dUX0JPT0wgbXZId3NEZHIzVGlwUmVhZFB1cFZhbHVlKEdUX1UzMiBkZXZOdW0sIEdUXzMyIFB1cFZhbHVlc1tNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV0sIGludCByZWdBZGRyLCBHVF9VMzIgbWFzayk7CiAKLUdUX0JPT0wgcmVhZEFkbGxWYWx1ZShHVF9VMzIgUHVwVmFsdWVzW01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXSwgaW50IHJlZ0FkZHIsIEdUX1UzMiBtYXNrKTsKK0dUX0JPT0wgbXZId3NEZHIzVGlwUmVhZEFkbGxWYWx1ZShHVF9VMzIgZGV2TnVtLEdUX1UzMiBQdXBWYWx1ZXNbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dLCBpbnQgcmVnQWRkciwgR1RfVTMyIG1hc2spOwogCi1HVF9CT09MIHdyaXRlQWRsbFZhbHVlKEdUX1UzMiBQdXBWYWx1ZXNbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dLCBpbnQgcmVnQWRkcik7CitHVF9CT09MIG12SHdzRGRyM1RpcFdyaXRlQWRsbFZhbHVlKEdUX1UzMiBkZXZOdW0sR1RfVTMyIFB1cFZhbHVlc1tNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV0sIGludCByZWdBZGRyKTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwUHJ2SWYuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBQcnZJZi5oCmluZGV4IDBmNDZjODEuLjg2MDdiNDcgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBQcnZJZi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBQcnZJZi5oCkBAIC0yOTUsNiArMjk1LDExIEBACiAJR1RfVTggICAgZGV2TnVtCiApOwogCit0eXBlZGVmIEdUX1U4ICgqTVZfSFdTX1RSQUlOSU5HX0lQX0dFVF9SQVRJTykKKygKKwlHVF9VMzIgICAgZnJlcQorKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRnVuY3Rpb25zIFN0cnV0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHR5cGVkZWYgc3RydWN0CkBAIC0zMDcsNiArMzEyLDEwIEBACiAgICAgTVZfSFdTX1NFVF9GUkVRX0RJVklERVJfRlVOQ19QVFIgICAgICAgIHRpcFNldEZyZXFEaXZpZGVyRnVuYzsKICAgICBNVl9IV1NfR0VUX0NTX0NPTkZJR19GVU5DX1BUUiAgICAgICAgICAgdGlwR2V0Q3NDb25maWdJbmZvOwogCU1WX0hXU19UUkFJTklOR19JUF9HRVRfVEVNUAkJCQl0aXBHZXRUZW1wZXJhdHVyZTsKKwlNVl9IV1NfVFJBSU5JTkdfSVBfR0VUX1JBVElPCQkJdGlwR2V0Q2xvY2tSYXRpbzsKKyAgICBNVl9IV1NfVFJBSU5JTkdfSVBfRVhURVJOQUxfUkVBRF9QVFIJdGlwRXh0ZXJuYWxSZWFkOworICAgIE1WX0hXU19UUkFJTklOR19JUF9FWFRFUk5BTF9XUklURV9QVFIJdGlwRXh0ZXJuYWxXcml0ZTsKKwogfSBNVl9IV1NfVElQX0NPTkZJR19GVU5DX0RCOwogCiAKQEAgLTMzMiw3ICszNDEsNiBAQAogCiB9TVZfSFdTX1RSQUlOSU5HX0lQX0ZVTkNfUFRSUzsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nTGV2ZWxpbmcuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nTGV2ZWxpbmcuaAppbmRleCBjNjY4MmYyLi44ZGU2ZTllIDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0xldmVsaW5nLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdMZXZlbGluZy5oCkBAIC02NSw3ICs2NSw3IEBACiApOwogCiAKLUdUX1UzMiBtdkh3c0RkcjNUaXBNYXhDU0dldCh2b2lkKTsKK0dUX1UzMiBtdkh3c0RkcjNUaXBNYXhDU0dldChHVF9VMzIgZGV2TnVtKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiAgICB9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvbXZEZHJUb3BvbG9neURlZi5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL212RGRyVG9wb2xvZ3lEZWYuaAppbmRleCA2NzlkYWUzLi43Njc5YWEzIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvbXZEZHJUb3BvbG9neURlZi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9tdkRkclRvcG9sb2d5RGVmLmgKQEAgLTEsNCArMSw1IEBACiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIENvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCiAKQEAgLTY4LDI2ICs2OSwxNDMgQEAKICNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwRGVmLmgiCiAKICNpZmRlZiBDT05GSUdfRERSMwotI2luY2x1ZGUgIm12RGRyM1RvcG9sb2d5RGVmLmgiCit0eXBlZGVmIGVudW0KK3sKKyAgIFNQRUVEX0JJTl9ERFJfODAwRCwKKyAgIFNQRUVEX0JJTl9ERFJfODAwRSwKKyAgIFNQRUVEX0JJTl9ERFJfMTA2NkUsCisgICBTUEVFRF9CSU5fRERSXzEwNjZGLAorICAgU1BFRURfQklOX0REUl8xMDY2RywKKyAgIFNQRUVEX0JJTl9ERFJfMTMzM0YsCisgICBTUEVFRF9CSU5fRERSXzEzMzNHLAorICAgU1BFRURfQklOX0REUl8xMzMzSCwKKyAgIFNQRUVEX0JJTl9ERFJfMTMzM0osCisgICBTUEVFRF9CSU5fRERSXzE2MDBHLAorICAgU1BFRURfQklOX0REUl8xNjAwSCwKKyAgIFNQRUVEX0JJTl9ERFJfMTYwMEosCisgICBTUEVFRF9CSU5fRERSXzE2MDBLLAorICAgU1BFRURfQklOX0REUl8xODY2SiwKKyAgIFNQRUVEX0JJTl9ERFJfMTg2NkssCisgICBTUEVFRF9CSU5fRERSXzE4NjZMLAorICAgU1BFRURfQklOX0REUl8xODY2TSwKKyAgIFNQRUVEX0JJTl9ERFJfMjEzM0ssCisgICBTUEVFRF9CSU5fRERSXzIxMzNMLAorICAgU1BFRURfQklOX0REUl8yMTMzTSwKKyAgIFNQRUVEX0JJTl9ERFJfMjEzM04sCisKKyAgIFNQRUVEX0JJTl9ERFJfMTMzM0hfRVhULAorICAgU1BFRURfQklOX0REUl8xNjAwS19FWFQsCisgICBTUEVFRF9CSU5fRERSXzE4NjZNX0VYVAorfU1WX0hXU19TUEVFRF9CSU47CisKK3R5cGVkZWYgZW51bSAKK3sKKyAgRERSX0ZSRVFfTE9XX0ZSRVEsCisgIEREUl9GUkVRXzQwMCwKKyAgRERSX0ZSRVFfNTMzLAorICBERFJfRlJFUV82NjcsCisgIEREUl9GUkVRXzgwMCwKKyAgRERSX0ZSRVFfOTMzLAorICBERFJfRlJFUV8xMDY2LAorICBERFJfRlJFUV8zMTEsCisgIEREUl9GUkVRXzMzMywKKyAgRERSX0ZSRVFfNDY3LAorICBERFJfRlJFUV84NTAsCisgIEREUl9GUkVRXzYwMCwKKyAgRERSX0ZSRVFfMzAwLAorICBERFJfRlJFUV85MDAsCisgIEREUl9GUkVRXzM2MCwKKyAgRERSX0ZSRVFfMTAwMCwKKyAgIEREUl9GUkVRX0xJTUlUCit9TVZfSFdTX0REUl9GUkVROworCit0eXBlZGVmIGVudW0KK3sKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJDRCwKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJQLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkFTLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkMsCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkQxSywKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJSRDJLLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UEQsCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RGQVcxSywKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdEZBVzJLLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190V1RSLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlRQLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190V1IsCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RNT0QKK31zcGVlZEJpblRhYmxlRWxlbWVudHM7CisKICNlbGlmIGRlZmluZWQoQ09ORklHX0REUjQpCi0jaW5jbHVkZSAibXZEZHI0VG9wb2xvZ3lEZWYuaCIKKwordHlwZWRlZiBlbnVtCit7CisgICAgU1BFRURfQklOX0REUl8xNjAwSiwKKyAgICBTUEVFRF9CSU5fRERSXzE2MDBLLAorICAgIFNQRUVEX0JJTl9ERFJfMTYwMEwsCisgICAgU1BFRURfQklOX0REUl8xODY2TCwKKyAgICBTUEVFRF9CSU5fRERSXzE4NjZNLAorICAgIFNQRUVEX0JJTl9ERFJfMTg2Nk4sCisgICAgU1BFRURfQklOX0REUl8yMTMzTiwKKyAgICBTUEVFRF9CSU5fRERSXzIxMzNQLAorICAgIFNQRUVEX0JJTl9ERFJfMjEzM1IsCisgICAgU1BFRURfQklOX0REUl8yNDAwUCwKKyAgICBTUEVFRF9CSU5fRERSXzI0MDBSLAorICAgIFNQRUVEX0JJTl9ERFJfMjQwMFUsCit9TVZfSFdTX1NQRUVEX0JJTjsKKwordHlwZWRlZiBlbnVtIAoreworICAgIEREUl9GUkVRX0xPV19GUkVRLAorICAgIEREUl9GUkVRXzY2NywKKyAgICBERFJfRlJFUV84MDAsCisgICAgRERSX0ZSRVFfOTMzLAorICAgIEREUl9GUkVRXzEwNjYsCisJRERSX0ZSRVFfOTAwLAorCUREUl9GUkVRXzEwMDAsCisgICAgRERSX0ZSRVFfTElNSVQKK31NVl9IV1NfRERSX0ZSRVE7CisKK3R5cGVkZWYgZW51bQoreworICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkNELAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlAsCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSQVMsCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSQywKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJSRDBfNUssCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkQxSywKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJSRDJLLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlJETDBfNUssCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkRMMUssCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkRMMkssCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RQRCwKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdEZBVzBfNUssCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RGQVcxSywKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdEZBVzJLLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190V1RSLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190V1RSTCwKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJUUCwKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdSLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190TU9ECit9c3BlZWRCaW5UYWJsZUVsZW1lbnRzOworCiAjZWxzZQogIyBlcnJvciAiQ09ORklHX0REUjMgb3IgQ09ORklHX0REUjQgbXVzdCBiZSBkZWZpbmVkICEhISIKICNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBEZWZpbml0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKLSNkZWZpbmUgTUFYX0lOVEVSRkFDRV9OVU0gIAkJKDEpCi0jZGVmaW5lIE1BWF9CVVNfTlVNICAgICAgICAJCSg1KQorI2lmIGRlZmluZWQoQ09ORklHX0JPQkspIHx8IGRlZmluZWQoQ09ORklHX0JPQkNBVDIpIHx8IChkZWZpbmVkKENIWF9GQU1JTFkpIHx8IGRlZmluZWQoRVhNWFBNX0ZBTUlMWSkpCisjZGVmaW5lIE1BWF9JTlRFUkZBQ0VfTlVNICAJCSg1KQogI2Vsc2UKLSNkZWZpbmUgTUFYX0lOVEVSRkFDRV9OVU0gIAkJKDEyKQotI2RlZmluZSBNQVhfQlVTX05VTSAgICAgICAgCQkoOCkKKyNkZWZpbmUgTUFYX0lOVEVSRkFDRV9OVU0gIAkJKDEpCiAjZW5kaWYKIAotI2RlZmluZSBTRFJBTV9DU19TSVpFCQkJCQkJCTB4RkZGRkZGRgorI2RlZmluZSBNQVhfQlVTX05VTSAgICAgICAgCQkoNSkKKworI2RlZmluZSBTRFJBTV9DU19TSVpFCQkJCTB4RkZGRkZGRgorI2RlZmluZSBNVl9QQVJBTVNfVU5ERUZJTkVEIAkJMHhGRkZGRkZGRgogLyoqKioqKioqKioqKioqKioqKioqKioqKiogVG9wb2xvZ3kgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU0RSQU1fQ1NfU0laRQkJCQkJCQkweEZGRkZGRkYKIAogLyogYnVzIHdpZHRoIGluIGJpdHMgKi8KIHR5cGVkZWYgZW51bQpAQCAtMTcxLDkgKzI4OSw2IEBACiAgICAvKiBDb250cm9sbGVyIGNvbmZpZ3VyYXRpb24gcGVyIGludGVyZmFjZSAqLwogICAgSW50ZXJmYWNlUGFyYW1zICAgICAgaW50ZXJmYWNlUGFyYW1zW01BWF9JTlRFUkZBQ0VfTlVNXTsKIAotICAgLyogQlVTIHBlciBpbnRlcmZhY2UgKGRlZmF1bHQgaXMgNCkqLwotICAgR1RfVTggICAgICAgICAgICAgICBudW1PZkJ1c1BlckludGVyZmFjZTsKLQogICAgLyogQml0IG1hc2sgZm9yIGFjdGl2ZSBidXNlcyovCiAgICBHVF9VOCAgICAgICAgICAgICAgIGFjdGl2ZUJ1c01hc2s7CiAKQEAgLTE4NCwxMCArMjk5LDIwIEBACiB0eXBlZGVmIHN0cnVjdAogewogCUdUX1UzMglja0RlbGF5OwotCUdUX1UzMglja0RlbGF5XzE2OwotCUdUX1UzMglQZmluZ2VyOwotCUdUX1UzMglOZmluZ2VyOwogCUdUX1UzMglQaHlSZWczVmFsOworCisJR1RfVTMyIGdacHJpRGF0YTsKKwlHVF9VMzIgZ1pucmlEYXRhOworCUdUX1UzMiBnWnByaUN0cmw7CisJR1RfVTMyIGdabnJpQ3RybDsKKwlHVF9VMzIgZ1pwb2R0RGF0YTsKKwlHVF9VMzIgZ1pub2R0RGF0YTsKKwlHVF9VMzIgZ1pwb2R0Q3RybDsKKwlHVF9VMzIgZ1pub2R0Q3RybDsKKwlHVF9VMzIgZ0RpYzsKKwlHVF9VMzIgdWlPRFRDb25maWc7CisJR1RfVTMyIGdSdHROb207CisJR1RfVTMyIGdSdHRXUjsKIH0gR1RfVFVORV9UUkFJTklOR19QQVJBTVM7CiAKICNlbmRpZiAvKiBfRERSX1RPUE9MT0dZX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvbXZEZHJUcmFpbmluZ0lwRGIuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9tdkRkclRyYWluaW5nSXBEYi5oCmluZGV4IDRjOTQ3ZGQuLmRkNzg2MGEgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9tdkRkclRyYWluaW5nSXBEYi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9tdkRkclRyYWluaW5nSXBEYi5oCkBAIC00Nyw5ICs0NywxMDcgQEAKIAogI2luY2x1ZGUgIm12RGRyVG9wb2xvZ3lEZWYuaCIKICNpZmRlZiBDT05GSUdfRERSMwotI2luY2x1ZGUgIm12RGRyM1RyYWluaW5nSXBEYi5oIgordHlwZWRlZiBlbnVtCit7CisgICBQQVRURVJOX1BCUzEsCisgICBQQVRURVJOX1BCUzIsCisgICBQQVRURVJOX1BCUzMsCisgICBQQVRURVJOX1RFU1QsCisgICBQQVRURVJOX1JMLAorICAgUEFUVEVSTl9STDIsCisgICBQQVRURVJOX1NUQVRJQ19QQlMsCisgICBQQVRURVJOX0tJTExFUl9EUTAsCisgICBQQVRURVJOX0tJTExFUl9EUTEsCisgICBQQVRURVJOX0tJTExFUl9EUTIsCisgICBQQVRURVJOX0tJTExFUl9EUTMsCisgICBQQVRURVJOX0tJTExFUl9EUTQsCisgICBQQVRURVJOX0tJTExFUl9EUTUsCisgICBQQVRURVJOX0tJTExFUl9EUTYsCisgICBQQVRURVJOX0tJTExFUl9EUTcsCisgICBQQVRURVJOX1ZSRUYsCisgICBQQVRURVJOX0ZVTExfU1NPMCwKKyAgIFBBVFRFUk5fRlVMTF9TU08xLAorICAgUEFUVEVSTl9GVUxMX1NTTzIsCisgICBQQVRURVJOX0ZVTExfU1NPMywKKyAgIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEwLAorICAgUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTEsCisgICBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMiwKKyAgIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEzLAorICAgUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTQsCisgICBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNSwKKyAgIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE2LAorICAgUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTcsCisgICBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMCwKKyAgIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFExLAorICAgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTIsCisgICBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMywKKyAgIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE0LAorICAgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTUsCisgICBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNiwKKyAgIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE3LAorICAgUEFUVEVSTl9JU0lfWFRBTEtfRlJFRSwKKyAgIFBBVFRFUk5fTElNSVQKK30gTVZfSFdTX1BBVFRFUk47CiAjZWxpZiBkZWZpbmVkKENPTkZJR19ERFI0KQotI2luY2x1ZGUgIm12RGRyNFRyYWluaW5nSXBEYi5oIgordHlwZWRlZiBlbnVtCit7CisgICBQQVRURVJOX1BCUzEsLyowKi8KKyAgIFBBVFRFUk5fUEJTMiwKKyAgIFBBVFRFUk5fUEJTMywKKyAgIFBBVFRFUk5fVEVTVCwKKyAgIFBBVFRFUk5fUkwsCisgICBQQVRURVJOX1JMMiwKKyAgIFBBVFRFUk5fU1RBVElDX1BCUywKKyAgIFBBVFRFUk5fS0lMTEVSX0RRMCwKKyAgIFBBVFRFUk5fS0lMTEVSX0RRMSwKKyAgIFBBVFRFUk5fS0lMTEVSX0RRMiwKKyAgIFBBVFRFUk5fS0lMTEVSX0RRMywvKjEwKi8KKyAgIFBBVFRFUk5fS0lMTEVSX0RRNCwKKyAgIFBBVFRFUk5fS0lMTEVSX0RRNSwKKyAgIFBBVFRFUk5fS0lMTEVSX0RRNiwKKyAgIFBBVFRFUk5fS0lMTEVSX0RRNywKKyAgIFBBVFRFUk5fS0lMTEVSX0RRMF9JTlYsCisgICBQQVRURVJOX0tJTExFUl9EUTFfSU5WLAorICAgUEFUVEVSTl9LSUxMRVJfRFEyX0lOViwKKyAgIFBBVFRFUk5fS0lMTEVSX0RRM19JTlYsCisgICBQQVRURVJOX0tJTExFUl9EUTRfSU5WLAorICAgUEFUVEVSTl9LSUxMRVJfRFE1X0lOViwvKjIwKi8KKyAgIFBBVFRFUk5fS0lMTEVSX0RRNl9JTlYsCisgICBQQVRURVJOX0tJTExFUl9EUTdfSU5WLAorICAgUEFUVEVSTl9WUkVGLAorICAgUEFUVEVSTl9WUkVGX0lOViwKKyAgIFBBVFRFUk5fRlVMTF9TU08wLAorICAgUEFUVEVSTl9GVUxMX1NTTzEsCisgICBQQVRURVJOX0ZVTExfU1NPMiwKKyAgIFBBVFRFUk5fRlVMTF9TU08zLAorICAgUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTAsCisgICBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMSwvKjMwKi8KKyAgIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEyLAorICAgUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTMsCisgICBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNCwKKyAgIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE1LAorICAgUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTYsCisgICBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNywKKyAgIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEwLAorICAgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTEsCisgICBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMiwKKyAgIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEzLC8qNDAqLworICAgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTQsCisgICBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNSwKKyAgIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE2LAorICAgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTcsCisgICBQQVRURVJOX0lTSV9YVEFMS19GUkVFLAorICAgUEFUVEVSTl9SRVNPTkFOQ0VfMVQsCisgICBQQVRURVJOX1JFU09OQU5DRV8yVCwKKyAgIFBBVFRFUk5fUkVTT05BTkNFXzNULAorICAgUEFUVEVSTl9SRVNPTkFOQ0VfNFQsCisgICBQQVRURVJOX1JFU09OQU5DRV81VCwvKjUwKi8KKyAgIFBBVFRFUk5fUkVTT05BTkNFXzZULAorICAgUEFUVEVSTl9SRVNPTkFOQ0VfN1QsCisgICBQQVRURVJOX1JFU09OQU5DRV84VCwKKyAgIFBBVFRFUk5fUkVTT05BTkNFXzlULAorICAgUEFUVEVSTl9MSU1JVAorfU1WX0hXU19QQVRURVJOOwogI2Vsc2UKICNlcnJvciAiQ09ORklHX0REUjMgb3IgQ09ORklHX0REUjQgbXVzdCBiZSBkZWZpbmVkICEhISIKICNlbmRpZgpAQCAtNjgsOSArMTY2LDQ5IEBACiAgICAgV3JpdGVMZXZlbGluZ1N1cHBfRUNDTW9kZV9FQ0NQdXAzCiB9TVZfSFdTX1dMX1NVUFBfTU9ERTsKIAordHlwZWRlZiBlbnVtCit7CisgICAgTVZfQVRUUl9USVBfUkVWLAorICAgIE1WX0FUVFJfUEhZX0VER0UsCisgICAgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFLAorICAgIE1WX0FUVFJfUExMX0JFRk9SRV9JTklULAorICAgIE1WX0FUVFJfVFVORV9NQVNLLAorICAgIE1WX0FUVFJfSU5JVF9GUkVRLAorICAgIE1WX0FUVFJfTUlEX0ZSRVEsCisgICAgTVZfQVRUUl9ERlNfTE9XX0ZSRVEsCisgICAgTVZfQVRUUl9ERlNfTE9XX1BIWSwKKyAgICBNVl9BVFRSX0RFTEFZX0VOQUJMRSwKKyAgICBNVl9BVFRSX0NLX0RFTEFZLAorICAgIE1WX0FUVFJfQ0FfREVMQVksCisgICAgTVZfQVRUUl9JTlRFUkxFQVZFX1dBLAorICAgIE1WX0FUVFJfTEFTVAorfSBNVl9ERFJfREVWX0FUVFJJQlVURTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgTVZfVElQX1JFVl9OQSwKKyAgICBNVl9USVBfUkVWXzEsIC8qIE5QNSAqLworICAgIE1WX1RJUF9SRVZfMiwgLyogQkMyICovCisgICAgTVZfVElQX1JFVl8zLCAvKiBBQzMgKi8KKyAgICBNVl9USVBfUkVWXzQsIC8qIEEtMzgwL0EtMzkwICovCisgICAgTVZfVElQX1JFVl9MQVNUCit9IE1WX0REUl9USVBfUkVWSVNJT047CisKK3R5cGVkZWYgZW51bQoreworICAgIE1WX0REUl9UUkFJTklOR19DT05UUk9MTEVSX1RJUCwKKyAgICBNVl9ERFJfVFJBSU5JTkdfQ09OVFJPTExFUl9DUFUKK30gTVZfRERSX1RSQUlOSU5HX0NPTlRST0xMRVI7CisKK3R5cGVkZWYgZW51bQoreworICAgIE1WX0REUl9QSFlfRURHRV9QT1NJVElWRSwKKyAgICBNVl9ERFJfUEhZX0VER0VfTkVHQVRJVkUKK30gTVZfRERSX1BIWV9FREdFOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogR1RfVTMyIHNwZWVkQmluVGFibGUKICgKICAgICBHVF9VOCBpbmRleCwKQEAgLTg0LDYgKzIyMiw3IEBACiAgICAgR1RfVTggaW5kZXgKICk7CiAKKy8qIERldmljZSB0b3BvbG9neSBmdW5jdGlvbmFsaXR5ICovCiBNVl9IV1NfVE9QT0xPR1lfTUFQKiBkZHIzVGlwR2V0VG9wb2xvZ3lNYXAKICgKICAgICBHVF9VMzIgIGRldk51bQpAQCAtOTUsNiArMjM0LDQ1IEBACiAgICAgTVZfSFdTX1RPUE9MT0dZX01BUCogdG9wb2xvZ3kKICk7CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNUaXBEZXZBdHRySW5pdC4KKyogRGVzYzogICAgIEluaXQgZGV2aWNlIGF0dHJpYnV0ZXMgc3RydWN0dXJlcworKiBBcmdzOgorKiBOb3RlczoKKyogUmV0dXJuczogIG5vbmUuCisqLwordm9pZCAgICBkZHIzVGlwRGV2QXR0ckluaXQKKygKKyAgICBHVF9VMzIgIGRldk51bQorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOYW1lOiAgICAgZGRyM1RpcERldkF0dHJHZXQuCisqIERlc2M6ICAgICBnZXQgc3BlY2lmaWVkIGRldmljZSBhdHRyaWJ1dGUgdmFsdWUKKyogQXJnczoKKyogTm90ZXM6CisqIFJldHVybnM6ICBub25lLgorKi8KK0dUX1UzMiAgICBkZHIzVGlwRGV2QXR0ckdldAorKAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9ERFJfREVWX0FUVFJJQlVURSAgICBhdHRySWQKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNUaXBEZXZBdHRyU2V0LgorKiBEZXNjOiAgICAgc2V0IHNwZWNpZmllZCBkZXZpY2UgYXR0cmlidXRlIHZhbHVlCisqIEFyZ3M6CisqIE5vdGVzOgorKiBSZXR1cm5zOiAgbm9uZS4KKyovCit2b2lkICAgIGRkcjNUaXBEZXZBdHRyU2V0CisoCisgICAgR1RfVTMyICAgICAgICAgICAgICAgICAgZGV2TnVtLAorICAgIE1WX0REUl9ERVZfQVRUUklCVVRFICAgIGF0dHJJZCwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgICB2YWx1ZQorKTsKKwogI2VuZGlmIC8qIF9NVl9ERFIzX1RSQUlOSU5HSVBfREJfSF8gKi8KIAogCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Pcy9jb21tb24vc2lsaWNvbklmL212U2lsaWNvbklmLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Pcy9jb21tb24vc2lsaWNvbklmL212U2lsaWNvbklmLmgKaW5kZXggYjlkMTg3NS4uZjZlOTg1YyAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvT3MvY29tbW9uL3NpbGljb25JZi9tdlNpbGljb25JZi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL09zL2NvbW1vbi9zaWxpY29uSWYvbXZTaWxpY29uSWYuaApAQCAtODQsMTAgKzg0LDEwIEBACiAjZGVmaW5lIEFCUyh2YWwpICgodmFsKSA8IDApID8gLSh2YWwpIDogKHZhbCkKIAogLyogbWF4IG51bWJlciBvZiBkZXZpY2VzIHN1cHBvcnRlZCBieSBkcml2ZXIgKi8KLSNpZmRlZiBDT19DUFVfUlVOCi0jZGVmaW5lIEhXU19NQVhfREVWSUNFX05VTSAoMSkKLSNlbHNlCisjaWYgZGVmaW5lZChDSFhfRkFNSUxZKSB8fCBkZWZpbmVkKEVYTVhQTV9GQU1JTFkpCiAjZGVmaW5lIEhXU19NQVhfREVWSUNFX05VTSAoMTYpCisjZWxzZQorI2RlZmluZSBIV1NfTUFYX0RFVklDRV9OVU0gKDEpCiAjZW5kaWYKIC8qIG1heCBudW1iZXIgb2YgU0VSREVTZXMgaW4gb25lIGRldmljZSAqLwogI2RlZmluZSBIV1NfTUFYX0RFVl9TRVJERVNfTlVNICg5NikKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL1NpbGljb24vbXZId3NEZHIzQTM4eC5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvU2lsaWNvbi9tdkh3c0RkcjNBMzh4LmgKaW5kZXggYmRjMTA1ZS4uYzYwZGEzNCAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvU2lsaWNvbi9tdkh3c0RkcjNBMzh4LmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvU2lsaWNvbi9tdkh3c0RkcjNBMzh4LmgKQEAgLTM4LDE3ICszOCwyMyBAQAogI2RlZmluZSBfX212SHdzRGRyM19BMzh4X0gKIAogLyogVGVybWFsIFNlbnNvciBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgVFNFTl9TVEFURV9SRUcJCQkJCQkweEU0MDcwCi0jZGVmaW5lIFRTRU5fU1RBVEVfT0ZGU0VUCQkJCQkzMQotI2RlZmluZSBUU0VOX1NUQVRFX01BU0sJCQkJCQkoMHgxIDw8IFRTRU5fU1RBVEVfT0ZGU0VUKQotI2RlZmluZSBUU0VOX0NPTkZfUkVHCQkJCQkJMHhFNDA3NAotI2RlZmluZSBUU0VOX0NPTkZfUlNUX09GRlNFVAkJCQk4Ci0jZGVmaW5lIFRTRU5fQ09ORl9SU1RfTUFTSwkJCQkJKDB4MSA8PCBUU0VOX0NPTkZfUlNUX09GRlNFVCkKKyNkZWZpbmUgVFNFTl9DT05UUk9MX0xTQl9SRUcJCQkJCTB4RTQwNzAKKyNkZWZpbmUgVFNFTl9DT05UUk9MX0xTQl9UQ19UUklNX09GRlNFVAkJCQkwCisjZGVmaW5lIFRTRU5fQ09OVFJPTF9MU0JfVENfVFJJTV9NQVNLCQkJCSgweDcgPDwgVFNFTl9DT05UUk9MX0xTQl9UQ19UUklNX09GRlNFVCkKKyNkZWZpbmUgVFNFTl9DT05UUk9MX01TQl9SRUcJCQkJCTB4RTQwNzQKKyNkZWZpbmUgVFNFTl9DT05UUk9MX01TQl9SU1RfT0ZGU0VUCQkJCTgKKyNkZWZpbmUgVFNFTl9DT05UUk9MX01TQl9SU1RfTUFTSwkJCQkoMHgxIDw8IFRTRU5fQ09OVFJPTF9NU0JfUlNUX09GRlNFVCkKICNkZWZpbmUgVFNFTl9TVEFUVVNfUkVHCQkJCQkJMHhFNDA3OAogI2RlZmluZSBUU0VOX1NUQVRVU19SRUFET1VUX1ZBTElEX09GRlNFVAkxMAogI2RlZmluZSBUU0VOX1NUQVRVU19SRUFET1VUX1ZBTElEX01BU0sJCSgweDEgPDwgVFNFTl9TVEFUVVNfUkVBRE9VVF9WQUxJRF9PRkZTRVQpCiAjZGVmaW5lIFRTRU5fU1RBVFVTX1RFTVBfT1VUX09GRlNFVAkJCTAKICNkZWZpbmUgVFNFTl9TVEFUVVNfVEVNUF9PVVRfTUFTSwkJCSgweDNGRiA8PCBUU0VOX1NUQVRVU19URU1QX09VVF9PRkZTRVQpCiAKKy8qIGRldmljZSBJRCBhbmQgcmV2aXNpb24gKi8KKyNkZWZpbmUgREVWX0lEX1JFRwkJCQkJMHgxODIzOAorI2RlZmluZSBERVZfVkVSU0lPTl9JRF9SRUcJCQkweDE4MjNDCisjZGVmaW5lIFJFVklTT05fSURfT0ZGUwkJCQk4CisjZGVmaW5lIFJFVklTT05fSURfTUFTSwkJCQkweEYwMAorCiAjZW5kaWYgLypfX212SHdzRGRyM19BMzh4X0gqLwogCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9TaWxpY29uL212SHdzRGRyM0JjMi5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvU2lsaWNvbi9tdkh3c0RkcjNCYzIuaAppbmRleCBlN2Q0NDc2Li40Y2Y0Y2JmIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9TaWxpY29uL212SHdzRGRyM0JjMi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL1NpbGljb24vbXZId3NEZHIzQmMyLmgKQEAgLTUxLDIxICs1MSwyMSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBEZWZpbml0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBCQzJfTlVNQkVSX09GX0lOVEVSRkFDRVMJCTUKLSNkZWZpbmUgQkMyX05VTUJFUl9PRl9QVVAJCQkJNAotI2RlZmluZSBCQzJfTlVNQkVSX09GX0JPQVJEUwkJCTIKKyNkZWZpbmUgQkMyX05VTUJFUl9PRl9JTlRFUkZBQ0VTICAgICAgICAgICAgICAgKDUpCisjZGVmaW5lIEJDMl9OVU1CRVJfT0ZfUFVQICAgICAgICAgICAgICAgICAgICAgICg0KQorI2RlZmluZSBCQzJfTlVNQkVSX09GX0JPQVJEUyAgICAgICAgICAgICAgICAgICAoMikKIAotI2RlZmluZSBCQzJfREVWSUNFX1NBUjFfUkVHX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAweEY4MjAwCi0jZGVmaW5lIEJDMl9ERVZJQ0VfU0FSMl9SRUdfQUREUiAgICAgICAgICAgICAgICAgICAgICAgIDB4RjgyMDQKKyNkZWZpbmUgQkMyX0RFVklDRV9TQVIxX1JFR19BRERSICAgICAgICAgICAgICAgMHhGODIwMAorI2RlZmluZSBCQzJfREVWSUNFX1NBUjJfUkVHX0FERFIgICAgICAgICAgICAgICAweEY4MjA0CiAKICNkZWZpbmUgQkMyX0pUQUdfREVWX0lEX1NUQVRVU19SRUdfQUREUiAgICAgICAgMHgwMDBGODI0NAogI2RlZmluZSBCQzJfREVWX0dFTkVSQUxfU1RBVFVTX1JFRzFfQUREUl9BMCAgICAweDAwMEY4MkI0CiAjZGVmaW5lIEJDMl9ERVZfR0VORVJBTF9TVEFUVVNfUkVHMV9BRERSX0IwICAgIDB4MDAwRjhDODQKIAotI2RlZmluZSBCQzJfSlRBR19ERVZfSURfU1RBVFVTX1ZFUlNJT05fT0ZGU0VUICAgICAyOAorI2RlZmluZSBCQzJfSlRBR19ERVZfSURfU1RBVFVTX1ZFUlNJT05fT0ZGU0VUICAyOAogCi0jZGVmaW5lIEJDMl9ERVZJQ0VfU0FSMV9NU1lTX1RNX1NEUkFNX1NFTF9PRkZTRVQgICAgCTExCi0jZGVmaW5lIEJDMl9ERVZJQ0VfU0FSMV9NU1lTX1RNX1NEUkFNX1NFTF9NQVNLICAgICAgCTB4MQorI2RlZmluZSBCQzJfREVWSUNFX1NBUjFfTVNZU19UTV9TRFJBTV9TRUxfT0ZGU0VUICAgMTEKKyNkZWZpbmUgQkMyX0RFVklDRV9TQVIxX01TWVNfVE1fU0RSQU1fU0VMX01BU0sgICAgIDB4MQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBFbnVtcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvU2lsaWNvbi9tdkh3c0RkcjNCb2JLLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9TaWxpY29uL212SHdzRGRyM0JvYksuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NTA4OTAyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvU2lsaWNvbi9tdkh3c0RkcjNCb2JLLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgIENvcHlyaWdodCAoYykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisqCisqIFRoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwKKyogSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCisqIGFsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4KKyogSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlCisqIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisqICAtICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorKiAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgLSAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogIC0gICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyogICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorKiAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworKiBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyogT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZId3NEZHIzQm9iSy5oCisqCisqIERFU0NSSVBUSU9OOgorKgorKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgJFJldmlzaW9uOiA5ICQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19tdkh3c0RkcjNfQk9CS19ICisjZGVmaW5lIF9fbXZId3NEZHIzX0JPQktfSAorCisjaW5jbHVkZSAibXZEZHIzVHJhaW5pbmdJcERlZi5oIgorI2lmICFkZWZpbmVkKENQU1NfQlVJTEQpCisjaW5jbHVkZSAiY29uZmlnX21hcnZlbGwuaCIgICAgIC8qIFJlcXVpcmVkIHRvIGlkZW50aWZ5IFNPQyBhbmQgQm9hcmQgKi8KKyNpbmNsdWRlICJtdlN5c0VudkxpYi5oIgorI2VuZGlmCisjaW5jbHVkZSAibXZEZHIzVHJhaW5pbmdJcFN0YXRpYy5oIgorI2luY2x1ZGUgIm12RGRyM1RyYWluaW5nSXAuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBEZWZpbml0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBCT0JLX05VTUJFUl9PRl9CT0FSRFMgICAgICAgICAgICgyKQorI2RlZmluZSBOVU1CRVJfT0ZfUFVQCQkJCQk1CisvKioqKioqKioqKioqKioqKioqKioqKioqKiBFbnVtcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBlbnVtIHsKKwlUTV9FTiwKKwlNU1lTX0VOCit9RERSX0lGX0FTU0lHTk1FTlQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEdsb2JhbHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgREVGSU5FX0dMT0JBTFMKK2V4dGVybiBUcmlwRGVsYXlFbGVtZW50IGJvYktCb2FyZFJvdW5kVHJpcERlbGF5QXJyYXlbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU0qQk9CS19OVU1CRVJfT0ZfQk9BUkRTXTsKKyNlbHNlCisvKiB0aGlzIGFycmF5IGhvbGQgdGhlIGJvYXJkIHJvdW5kIHRyaXAgZGVsYXkgKERRIGFuZCBDSykgcGVyIDxpbnRlcmZjYWUsYnVzPiAqLworVHJpcERlbGF5RWxlbWVudCBib2JLQm9hcmRSb3VuZFRyaXBEZWxheUFycmF5W01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNKkJPQktfTlVNQkVSX09GX0JPQVJEU10gPQoreworICAgLyogMXN0IGJvYXJkICovCisgICAvKmludGVyZmFjZSBidXMgRFFTLWRlbGF5IENLLWRlbGF5ICovCisgICB7IDMwMTIsICAgNjcxNSB9LAorICAgeyAyNjI1LCAgIDY3MTUgfSwKKyAgIHsgMzAyMywgICA2NDU4IH0sCisgICB7IDI2NjMsICAgNjQ1OCB9LAorICAgeyAyNTk2LCAgIDY2OTEgfSwKKworICAgLyogMm5kIGJvYXJkICovCisgICAvKmludGVyZmFjZSBidXMgRFFTLWRlbGF5IENLLWRlbGF5ICovCisgICB7IDMwMTIsICAgNjcxNSB9LAorICAgeyAyNjI1LCAgIDY3MTUgfSwKKyAgIHsgMzAyMywgICA2NDU4IH0sCisgICB7IDI2NjMsICAgNjQ1OCB9LAorICAgeyAyNTk2LCAgIDY2OTEgfSwKK307CisjZW5kaWYKKworCisjaWZuZGVmIERFRklORV9HTE9CQUxTCitleHRlcm4gVHJpcERlbGF5RWxlbWVudCBib2JLUGFja2FnZVJvdW5kVHJpcERlbGF5QXJyYXlbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dOworI2Vsc2UKKy8qIHBhY2thZ2UgdHJhY2UgKi8KK1RyaXBEZWxheUVsZW1lbnQgYm9iS1BhY2thZ2VSb3VuZFRyaXBEZWxheUFycmF5W01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXSA9Cit7CisgICAgIC8qSUYgQlVTIERRX0RFTFlBIENLX0RFTEFZICovCisgICAgeyAgMzYyLCAgICA4MTMgfSwKKyAgICB7ICA0NTgsICAgIDgxMyB9LAorICAgIHsgIDQwNSwgICAgNzUwIH0sCisgICAgeyAgNDQ2LCAgICA3NTAgfSwKKyAgICB7ICAzOTMsICAgIDcxOCB9Cit9OworI2VuZGlmCisKKyNpZm5kZWYgREVGSU5FX0dMT0JBTFMKK2V4dGVybiBHVF8zMiBib2JLU2lsaWNvbkRlbGF5T2Zmc2V0W107CisjZWxzZQorR1RfMzIgYm9iS1NpbGljb25EZWxheU9mZnNldFtdID0KK3sKKyAgICAvKiBib2FyZCAwICovCisgICAgMCwKKyAgICAvKiBib2FyZCAxICovCisgICAgMCwKKyAgICAvKiBib2FyZCAyICovCisgICAgMAorfTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBGdW5jdGlvbnMgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBkZHIzVGlwSW5pdEJvYksuCisqIERlc2M6ICAgICBpbml0IFRyYWluaW5nIFNXIERCIGFuZCB1cGRhdGVzIEREUiB0b3BvbG9neS4KKyogQXJnczoKKyogTm90ZXM6CisqIFJldHVybnM6ICBHVF9PSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworR1RfU1RBVFVTIGRkcjNUaXBJbml0Qm9iSworKAorICAgIEdUX1UzMiAgZGV2TnVtLAorICAgIEdUX1UzMiAgYm9hcmRJZAorKSA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6ICAgICBkZHIzR2V0U2RyYW1Bc3NpZ25tZW50CisgKiBEZXNjOiAgICAgcmVhZCBTQFIgYW5kIHJldHVybiBERFIzIGFzc2lnbm1lbnQgKCAwID0gVE0gLCAxID0gTVNZUyApCisgKiBBcmdzOgorICogTm90ZXM6CisgKiBSZXR1cm5zOiAgcmVxdWlyZWQgdmFsdWUKKyAqLworRERSX0lGX0FTU0lHTk1FTlQgZGRyM0dldFNkcmFtQXNzaWdubWVudChHVF9VOCBkZXZOdW0pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19tdkh3c0RkcjNfQk9CS19IICovCisKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL1NvQy9kZHIzX2h3c19zaWwuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL1NvQy9kZHIzX2h3c19zaWwuaAppbmRleCA1ZWQ0MmE3Li41N2UxMWU4IDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Tb0MvZGRyM19od3Nfc2lsLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvU29DL2RkcjNfaHdzX3NpbC5oCkBAIC0yNyw2ICsyNyw5IEBACiAjaWYgZGVmaW5lZChNVl9NU1lTX0JDMikKICNpbmNsdWRlICJkZHIzX21zeXNfYmMyLmgiCiAjaW5jbHVkZSAiZGRyM19tc3lzX2JjMl9jb25maWcuaCIKKyNpZiBkZWZpbmVkKE1WX01TWVNfQk9CSykKKyNpbmNsdWRlICJkZHIzX21zeXNfYm9iay5oIgorI2luY2x1ZGUgImRkcjNfbXN5c19ib2JrX2NvbmZpZy5oIgogI2VsaWYgZGVmaW5lZChNVl9NU1lTX0FDMykKICNpbmNsdWRlICJkZHIzX21zeXNfYWMzLmgiCiAjaW5jbHVkZSAiZGRyM19tc3lzX2FjM19jb25maWcuaCIKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvZ3RCdWlsZCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvZ3RCdWlsZAppbmRleCA5ZTZjODcxLi43OGE0OGJhIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL2d0QnVpbGQKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9ndEJ1aWxkCkBAIC0yMiw2ICsyMiwxMiBAQAogI1NVQkRJUlMgICAgICA9CiBDX0VYQ0xVREVfRklMRV9MSVNUID0gbXZId3NEZHIzVHJhaW5pbmdTdHViLmMKIAorQ0ZMQUdTICs9IC1ERERSX1ZJRVdFUl9UT09MIC1ETVZfSFdTX0VYQ0xVREVfREVCVUdfUFJJTlRTCisKKyMgVG8gZW5hYmxlIFJYIElPIEJJU1QgVGVzdCB1bi1tYXJrIGJlbG93IGxpbmUKKyMgQ0ZMQUdTICs9IC1ETVZfSFdTX1JYX0lPX0JJU1QKKyMgVG8gZW5hYmxlIENNRC9BRERSIFRlc3QgdW4tbWFyayBiZWxvdyBsaW5lCisjIENGTEFHUyArPSAtRE1WX0hXU19SWF9JT19CSVNUX0VUUAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzRGVidWcuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzRGVidWcuYwppbmRleCA2ZjY5ZTBhLi4wOWE4OTJmIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM0RlYnVnLmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNEZWJ1Zy5jCkBAIC0zMiwxMSArMzIsMjMgQEAKICNpbmNsdWRlICJtdkRkclRyYWluaW5nSXBEYi5oIgogCiAKLSNpZm5kZWYgRVhDTFVERV9TV0lUQ0hfREVCVUcKKyNpZmRlZiBERFJfVklFV0VSX1RPT0wKIEdUX1NUQVRVUyBwcmludEFkbGwoR1RfVTMyIGRldk51bSwgR1RfVTMyIGFkbGxbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dKTsKK0dUX1NUQVRVUyBwcmludFBoKEdUX1UzMiBkZXZOdW0sIEdUX1UzMiBhZGxsW01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXSk7CisKK0dUX1U4IHN3ZWVwUGF0dGVybkluZGV4U3RhcnQgPSBQQVRURVJOX0tJTExFUl9EUTAsIHN3ZWVwUGF0dGVybkluZGV4RW5kID0gUEFUVEVSTl9MSU1JVDsKIHN0YXRpYyBjaGFyKiBDb252ZXJ0RnJlcShNVl9IV1NfRERSX0ZSRVEgZnJlcSk7CisjaWYgZGVmaW5lZChFWENMVURFX1NXSVRDSF9ERUJVRykKK2V4dGVybiBNVl9IV1NfUEFUVEVSTiBzd2VlcFBhdHRlcm47CitHVF9VMzIgY3RybFN3ZWVwcmVzW0FETExfTEVOR1RIXVtNQVhfSU5URVJGQUNFX05VTV1bTUFYX0JVU19OVU1dOworR1RfVTMyIGN0cmxBRExMW01BWF9DU19OVU0qTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dOworR1RfVTMyIGN0cmxBRExMMVtNQVhfQ1NfTlVNKk1BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXTsKK0dUX1UzMiBjdHJsTGV2ZWxQaGFzZVtNQVhfQ1NfTlVNKk1BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXTsKICNlbmRpZgotZXh0ZXJuIEdUX1UzMiBja0RlbGF5LCBja0RlbGF5XzE2OworI2VuZGlmCisKK2V4dGVybiBHVF9VMzIgY2tEZWxheTsKK2V4dGVybiBHVF9VMzIgZG1pblBoeVJlZ1RhYmxlW01BWF9CVVNfTlVNKk1BWF9DU19OVU1dWzJdOwogCiBleHRlcm4gR1RfU1RBVFVTIGRkcjNUaXBSZXN0b3JlRHVuaXRSZWdzCiAoCkBAIC0xNDYsNyArMTU4LDcgQEAKIGV4dGVybiBHVF9VMzIgbWFza1R1bmVGdW5jOwogZXh0ZXJuIEdUX1UzMiBmcmVxVmFsW107CiBNVl9IV1NfVElQX0NPTkZJR19GVU5DX0RCIGNvbmZpZ0Z1bmNJbmZvW0hXU19NQVhfREVWSUNFX05VTV07Ci1HVF9VOCBpc0RlZmF1bHRDZW50cmFsaXphdGlvbiA9IDAgLCBpc1R1bmVSZXN1bHQgPSAwLCBpc1ZhbGlkYXRlV2luZG93UGVySWYgPSAwLCBpc1ZhbGlkYXRlV2luZG93UGVyUHVwID0gMCwgc3dlZXBDbnQgPSAxLCBpc0Jpc3RSZXNldEJpdCA9IDE7CitHVF9VOCBpc0RlZmF1bHRDZW50cmFsaXphdGlvbiA9IDAgLCBpc1R1bmVSZXN1bHQgPSAwLCBpc1ZhbGlkYXRlV2luZG93UGVySWYgPSAwLCBpc1ZhbGlkYXRlV2luZG93UGVyUHVwID0gMCwgc3dlZXBDbnQgPSAxLCBpc0Jpc3RSZXNldEJpdCA9IDEsIGlzUnVuTGV2ZWxpbmdTd2VlcFRlc3RzID0gMDsKIHN0YXRpYyBNVl9IV1NfWFNCX0lORk8geHNiSW5mb1tIV1NfTUFYX0RFVklDRV9OVU1dOwogCiAKQEAgLTE2MCw2ICsxNzIsNyBAQAogewogICAgIEdUX1UzMiBpbnRlcmZhY2VJZCwgcmVnQWRkciwgZGF0YVZhbHVlLCBidXNJZDsKIAlHVF9VMzIgcmVhZERhdGFbTUFYX0lOVEVSRkFDRV9OVU1dOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAgICAgbXZQcmludGYoIi0tIGR1bml0IHJlZ2lzdGVycyAtLVxuIik7CiAgICAgZm9yKHJlZ0FkZHIgPSAweDE0MDA7IHJlZ0FkZHIgPCAweDE5RjA7IHJlZ0FkZHIrPTQpCiAgICAgewpAQCAtMTgwLDE1ICsxOTMsMTUgQEAKICAgICAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgICAgICAgewogICAgICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgICAgIGZvcihidXNJZCA9IDA7IGJ1c0lkIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNJZCsrKQorICAgICAgICAgICAgZm9yKGJ1c0lkID0gMDsgYnVzSWQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0lkKyspCiAgICAgICAgICAgICB7Ci0JCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0lkKQotCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTUmVhZCggICBkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgIEREUl9QSFlfREFUQSwgIHJlZ0FkZHIsICZkYXRhVmFsdWUpKTsKKwkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKKwkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTUmVhZCggICBkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgIEREUl9QSFlfREFUQSwgIHJlZ0FkZHIsICZkYXRhVmFsdWUpKTsKICAgICAgICAgICAgICAgICBtdlByaW50ZigiMHgleCAiLCAgZGF0YVZhbHVlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcihidXNJZCA9IDA7IGJ1c0lkIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNJZCsrKQorICAgICAgICAgICAgZm9yKGJ1c0lkID0gMDsgYnVzSWQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0lkKyspCiAgICAgICAgICAgICB7Ci0JCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0lkKQorCQkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0lkKQogICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgIGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCAgRERSX1BIWV9DT05UUk9MLCAgcmVnQWRkciwgJmRhdGFWYWx1ZSkpOwogICAgICAgICAgICAgICAgIG12UHJpbnRmKCIweCV4ICIsICBkYXRhVmFsdWUpOwogICAgICAgICAgICAgfQpAQCAtMjY1LDcgKzI3OCw3IEBACiB9CiAKIAotI2lmbmRlZiBFWENMVURFX1NXSVRDSF9ERUJVRworI2lmZGVmIEREUl9WSUVXRVJfVE9PTAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBDb252ZXJ0IGZyZXEgdG8gY2hhcmFjdGVyIHN0cmluZwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDEzLDkgKzQyNiwxMiBAQAogR1RfU1RBVFVTIGRkcjNUaXBQcmludExvZyhHVF9VMzIgZGV2TnVtLCBHVF9VMzIgbWVtQWRkcikKIHsKICAgICBHVF9VMzIgaW50ZXJmYWNlSWQgPSAwOwotCW1lbUFkZHIgPSBtZW1BZGRyOwogCi0jaWZuZGVmIEVYQ0xVREVfU1dJVENIX0RFQlVHCisgICAgbWVtQWRkciA9IG1lbUFkZHI7IC8qIGF2b2lkIHdhcm5pbmdzICovCisKKyNpZm5kZWYgRERSX1ZJRVdFUl9UT09MCisgICAgZGV2TnVtID0gZGV2TnVtOyAvKiBhdm9pZCB3YXJuaW5ncyAqLworI2Vsc2UKICAgICBpZiAoKCBpc1ZhbGlkYXRlV2luZG93UGVySWYgIT0gMCkgfHwgKCBpc1ZhbGlkYXRlV2luZG93UGVyUHVwICE9IDApKQogCiAgICAgewpAQCAtNDI1LDE3ICs0NDEsMjMgQEAKIAkJZnJlcSA9IHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbZmlyc3RBY3RpdmVJZl0ubWVtb3J5RnJlcTsKIAogICAgICAgICBpc1B1cExvZyA9IChpc1ZhbGlkYXRlV2luZG93UGVyUHVwICE9IDApID8gMTowOwotCW12UHJpbnRmKCI9PT1WQUxJREFURSBXSU5ET1cgTE9HIFNUQVJUPT09XG4iKTsKLQltdlByaW50ZigiRERSIEZyZXF1ZW5jeTogJXMgICA9PT09PT1cbiIsQ29udmVydEZyZXEoZnJlcSkpOworCQltdlByaW50ZigiPT09VkFMSURBVEUgV0lORE9XIExPRyBTVEFSVD09PVxuIik7CisJCW12UHJpbnRmKCJERFIgRnJlcXVlbmN5OiAlcyAgID09PT09PVxuIixDb252ZXJ0RnJlcShmcmVxKSk7CiAgICAgICAgIC8qIHByaW50IHN3ZWVwIHdpbmRvd3MgKi8KICAgICAgICAgZGRyM1RpcFJ1blN3ZWVwVGVzdChkZXZOdW0sIHN3ZWVwQ250LCAxICwgaXNQdXBMb2cpOwogICAgICAgICBkZHIzVGlwUnVuU3dlZXBUZXN0KGRldk51bSwgc3dlZXBDbnQsIDAgLCBpc1B1cExvZyk7Ci0gICAgICAgIGRkcjNUaXBQcmludEFsbFBic1Jlc3VsdChkZXZOdW0pOwotICAgICAgICBkZHIzVGlwUHJpbnRXTFN1cHBSZXN1bHQoZGV2TnVtKTsKLSAgICAgICAgbXZQcmludGYoIj09PVZBTElEQVRFIFdJTkRPVyBMT0cgRU5EID09PVxuIik7Ci0JQ0hFQ0tfU1RBVFVTKGRkcjNUaXBSZXN0b3JlRHVuaXRSZWdzKGRldk51bSkpOwotICAgICAgICBkZHIzVGlwUmVnRHVtcChkZXZOdW0pOwogCisjaWYgZGVmaW5lZChFWENMVURFX1NXSVRDSF9ERUJVRykKKwkJaWYoIGlzUnVuTGV2ZWxpbmdTd2VlcFRlc3RzID09IDEgKXsKKwkJCWRkcjNUaXBSdW5MZXZlbGluZ1N3ZWVwVGVzdChkZXZOdW0sIHN3ZWVwQ250LCAwICwgaXNQdXBMb2cpOworCQkJZGRyM1RpcFJ1bkxldmVsaW5nU3dlZXBUZXN0KGRldk51bSwgc3dlZXBDbnQsIDEgLCBpc1B1cExvZyk7CisJCX0KKyNlbmRpZgorCQlkZHIzVGlwUHJpbnRBbGxQYnNSZXN1bHQoZGV2TnVtKTsKKwkJZGRyM1RpcFByaW50V0xTdXBwUmVzdWx0KGRldk51bSk7CisJCW12UHJpbnRmKCI9PT1WQUxJREFURSBXSU5ET1cgTE9HIEVORCA9PT1cbiIpOworCQlDSEVDS19TVEFUVVMoZGRyM1RpcFJlc3RvcmVEdW5pdFJlZ3MoZGV2TnVtKSk7CisJCWRkcjNUaXBSZWdEdW1wKGRldk51bSk7CiAgICAgfQogI2VuZGlmCiAKQEAgLTU0MCw3ICs1NjIsNyBAQAogICAgfQogICAgIHJldHVybiBHVF9PSzsKIH0KLQorI2lmbmRlZiBNVl9IV1NfRVhDTFVERV9ERUJVR19QUklOVFMKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogUHJpbnQgc3RhYmlsaXR5IGxvZyBpbmZvCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01NTIsOCArNTc0LDExIEBACiAJR1RfVTMyIFBoID0gYWRsbFRhcCozMjsKIAlHVF9VMzIgQ0MgPSBQaCoyOyovCiAJR1RfVTMyIHJlZ0RhdGE7CisjaWZkZWYgQ09ORklHX0REUjQKKwlHVF9VMzIgcmVnRGF0YTE7CisjZW5kaWYKIAlHVF9VMzIgcmVhZERhdGFbTUFYX0lOVEVSRkFDRV9OVU1dOwotCUdUX1UzMiBtYXhfY3MgPSBtdkh3c0RkcjNUaXBNYXhDU0dldCgpOworCUdUX1UzMiBtYXhfY3MgPSBtdkh3c0RkcjNUaXBNYXhDU0dldChkZXZOdW0pOwogCiAJLypUaXRsZSBwcmludCovCiAJZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPCBNQVhfSU5URVJGQUNFX05VTTsgaW50ZXJmYWNlSWQrKykKQEAgLTU5Niw3ICs2MjEsNyBAQAogCXsKIAkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKIAotCQltdlByaW50ZigiRGF0YTogJWQsJWQsIixpbnRlcmZhY2VJZCwgKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwR2V0VGVtcGVyYXR1cmUgIT0gTlVMTCk/KGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwR2V0VGVtcGVyYXR1cmUoZGV2TnVtKSk6KDApKTsKKwkJbXZQcmludGYoIkRhdGE6ICVkLCVkLCIsaW50ZXJmYWNlSWQsIChjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcEdldFRlbXBlcmF0dXJlICE9IE5VTEwpPyhjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcEdldFRlbXBlcmF0dXJlKChHVF9VOClkZXZOdW0pKTooMCkpOwogCiAJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHgxNEM4LCByZWFkRGF0YSwgTUFTS19BTExfQklUUykpOwogCQltdlByaW50ZigiJWQsJWQsIiwoKHJlYWREYXRhW2ludGVyZmFjZUlkXSYweDNGMCk+PjQpLCgocmVhZERhdGFbaW50ZXJmYWNlSWRdJjB4RkMwMCk+PjEwKSk7CkBAIC02MTYsMTcgKzY0MSwyMSBAQAogCQkJCW12SHdzRGRyM1RpcEJVU1JlYWQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsIEREUl9QSFlfREFUQSwgUkVTVUxUX0RCX1BIWV9SRUdfQUREUitjc2luZGV4LCAmcmVnRGF0YSk7CiAJCQkJbXZQcmludGYoIiVkLCVkLCIsKHJlZ0RhdGEmMHgxRiksKChyZWdEYXRhJjB4M0UwKT4+NSkpOwogCQkJCSNlbHNlLypERFI0Ki8KKwkJCQkvKkRtaW5UeCwgYXJlYVRYKi8KIAkJCQltdkh3c0RkcjNUaXBCVVNSZWFkKGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCBERFJfUEhZX0RBVEEsIFJFU1VMVF9EQl9QSFlfUkVHX0FERFIrY3NpbmRleCwgJnJlZ0RhdGEpOwotCQkJCW12UHJpbnRmKCIlZCwlZCwiLChyZWdEYXRhJjB4MUYpKjQsMiooKHJlZ0RhdGEmMHhGRkUwKT4+NSkpOworCQkJCW12SHdzRGRyM1RpcEJVU1JlYWQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgZG1pblBoeVJlZ1RhYmxlW2NzaW5kZXgqNStidXNJZF1bMF0sIEREUl9QSFlfQ09OVFJPTCwgZG1pblBoeVJlZ1RhYmxlW2NzaW5kZXgqNStidXNJZF1bMV0sICZyZWdEYXRhMSk7CisJCQkJbXZQcmludGYoIiVkLCVkLCIsMioocmVnRGF0YTEmMHhGRikscmVnRGF0YSk7CisJCQkJLypEbWluUngsIGFyZWFSWCovCiAJCQkJbXZId3NEZHIzVGlwQlVTUmVhZChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgRERSX1BIWV9EQVRBLCBSRVNVTFRfREJfUEhZX1JFR19BRERSK2NzaW5kZXggKyA0LCAmcmVnRGF0YSk7Ci0JCQkJbXZQcmludGYoIiVkLCVkLCIsKHJlZ0RhdGEmMHgxRikqNCwyKigocmVnRGF0YSYweEZGRTApPj41KSk7CisJCQkJbXZId3NEZHIzVGlwQlVTUmVhZChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBkbWluUGh5UmVnVGFibGVbY3NpbmRleCo1K2J1c0lkXVswXSwgRERSX1BIWV9DT05UUk9MLCBkbWluUGh5UmVnVGFibGVbY3NpbmRleCo1K2J1c0lkXVsxXSwgJnJlZ0RhdGExKTsKKwkJCQltdlByaW50ZigiJWQsJWQsIiwyKihyZWdEYXRhMT4+OCkscmVnRGF0YSk7CiAJCQkJI2VuZGlmCiAJCQkJLypXTCovCiAJCQkJbXZId3NEZHIzVGlwQlVTUmVhZChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgRERSX1BIWV9EQVRBLCBXTF9QSFlfUkVHK2NzaW5kZXgqNCwgJnJlZ0RhdGEpOwogCQkJCW12UHJpbnRmKCIlZCwlZCwlZCwiLChyZWdEYXRhJjB4MUYpKygocmVnRGF0YSYweDFDMCk+PjYpKjMyLChyZWdEYXRhJjB4MUYpLChyZWdEYXRhJjB4MUMwKT4+Nik7CiAJCQkJLypSTCovCiAJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZChkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBSRUFEX0RBVEFfU0FNUExFX0RFTEFZLCByZWFkRGF0YSwgTUFTS19BTExfQklUUykpOwotCQkJCXJlYWREYXRhW2ludGVyZmFjZUlkXSA9IChyZWFkRGF0YVtpbnRlcmZhY2VJZF0mKDB4Rjw8KDQqY3NpbmRleCkpKSA+PiAoNCpjc2luZGV4KTsKKwkJCQlyZWFkRGF0YVtpbnRlcmZhY2VJZF0gPSAocmVhZERhdGFbaW50ZXJmYWNlSWRdJigweDFGPDwoOCpjc2luZGV4KSkpID4+ICg4KmNzaW5kZXgpOwogCQkJCW12SHdzRGRyM1RpcEJVU1JlYWQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsIEREUl9QSFlfREFUQSwgUkxfUEhZX1JFRytjc2luZGV4KjQsICZyZWdEYXRhKTsKIAkJCQltdlByaW50ZigiJWQsJWQsJWQsJWQsIiwocmVnRGF0YSYweDFGKSsoKHJlZ0RhdGEmMHgxQzApPj42KSozMiArIHJlYWREYXRhW2ludGVyZmFjZUlkXSo2NCwocmVnRGF0YSYweDFGKSwoKHJlZ0RhdGEmMHgxQzApPj42KSxyZWFkRGF0YVtpbnRlcmZhY2VJZF0pOwogCQkJCS8qQ2VudHJhbGl6YXRpb24qLwpAQCAtNjY4LDEzICs2OTcsMTMgQEAKIAlyZXR1cm4gR1RfT0s7CiB9CiAKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFJlZ2lzdGVyIFhTQiBpbmZvcm1hdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogR1RfU1RBVFVTIGRkcjNUaXBSZWdpc3RlclhzYkluZm8KICgKLSAgICBHVF9VMzIJCQkJCWRldk51bSwgCisgICAgR1RfVTMyCQkJCQlkZXZOdW0sCiAgICAgTVZfSFdTX1hTQl9JTkZPICAgICAgICAgKnhzYkluZm9UYWJsZQogKQogewpAQCAtNjg1LDIwICs3MTQsMjEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogUmVhZCBBRExMIFZhbHVlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HVF9CT09MIHJlYWRBZGxsVmFsdWUoR1RfVTMyIFB1cFZhbHVlc1tNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV0sIGludCByZWdBZGRyLCBHVF9VMzIgbWFzaykKK0dUX0JPT0wgbXZId3NEZHIzVGlwUmVhZEFkbGxWYWx1ZShHVF9VMzIgZGV2TnVtLCBHVF9VMzIgUHVwVmFsdWVzW01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXSwgaW50IHJlZ0FkZHIsIEdUX1UzMiBtYXNrKQogewogICAgIEdUX1UzMiAgZGF0YVZhbHVlOwogICAgIEdUX1UzMiBpbnRlcmZhY2VJZCA9IDAsIGJ1c0lkID0gMDsKLSAgICBHVF9VMzIgZGV2TnVtID0gMDsKKyAgICBHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOworCiAgICAgLyogbXVsdGkgQ1Mgc3VwcG9ydCAtIHJlZ0FkZHIgaXMgY2FsdWNhbGF0ZWQgaW4gY2FsbGluZyBmdW5jdGlvbiB3aXRoIENTIG9mZnNldCAqLwogICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICAgewogICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotCSAgICBmb3IoYnVzSWQgPSAwIDsgYnVzSWQgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBidXNJZCsrKQorCSAgICBmb3IoYnVzSWQgPSAwIDsgYnVzSWQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBidXNJZCsrKQogCSAgICB7CiAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0lkKQogICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgIGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCAgRERSX1BIWV9EQVRBLCAgcmVnQWRkciwgJmRhdGFWYWx1ZSkpOwotICAgICAgICAgICAgICAgIFB1cFZhbHVlc1tpbnRlcmZhY2VJZCp0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgKyBidXNJZF0gPSBkYXRhVmFsdWUgJiBtYXNrOworICAgICAgICAgICAgICAgIFB1cFZhbHVlc1tpbnRlcmZhY2VJZCpvY3RldHNQZXJJbnRlcmZhY2VOdW0gKyBidXNJZF0gPSBkYXRhVmFsdWUgJiBtYXNrOwogICAgICAgICB9CiAJfQogCkBAIC03MDgsMjAgKzczOCw3MSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBXcml0ZSBBRExMIFZhbHVlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HVF9CT09MIHdyaXRlQWRsbFZhbHVlKEdUX1UzMiBQdXBWYWx1ZXNbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dLCBpbnQgcmVnQWRkcikKK0dUX0JPT0wgbXZId3NEZHIzVGlwV3JpdGVBZGxsVmFsdWUoR1RfVTMyIGRldk51bSwgR1RfVTMyIFB1cFZhbHVlc1tNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV0sIGludCByZWdBZGRyKQogewogICAgIEdUX1UzMiBpbnRlcmZhY2VJZCA9IDAsIGJ1c0lkID0gMDsKLSAgICBHVF9VMzIgZGV2TnVtID0gMCwgZGF0YTsKKyAgICBHVF9VMzIgZGF0YTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgLyogbXVsdGkgQ1Mgc3VwcG9ydCAtIHJlZ0FkZHIgaXMgY2FsdWNhbGF0ZWQgaW4gY2FsbGluZyBmdW5jdGlvbiB3aXRoIENTIG9mZnNldCAqLwogCiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgICB7CiAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0JICAgIGZvcihidXNJZCA9IDAgOyBidXNJZCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IGJ1c0lkKyspCisJICAgIGZvcihidXNJZCA9IDAgOyBidXNJZCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IGJ1c0lkKyspCiAJICAgIHsKIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSWQpCi0JCWRhdGEgPSBQdXBWYWx1ZXNbaW50ZXJmYWNlSWQqdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlK2J1c0lkXTsKKwkJZGF0YSA9IFB1cFZhbHVlc1tpbnRlcmZhY2VJZCpvY3RldHNQZXJJbnRlcmZhY2VOdW0rYnVzSWRdOworCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgRERSX1BIWV9EQVRBLCByZWdBZGRyLCBkYXRhKSk7CisJICAgIH0KKworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JlYWQgUGhhc2UgVmFsdWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dUX0JPT0wgcmVhZFBoYXNlVmFsdWUoR1RfVTMyIGRldk51bSxHVF9VMzIgUHVwVmFsdWVzW01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXSwgaW50IHJlZ0FkZHIsIEdUX1UzMiBtYXNrKQoreworICAgIEdUX1UzMiAgZGF0YVZhbHVlOworICAgIEdUX1UzMiBpbnRlcmZhY2VJZCA9IDAsIGJ1c0lkID0gMDsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOworCisgICAgLyogbXVsdGkgQ1Mgc3VwcG9ydCAtIHJlZ0FkZHIgaXMgY2FsdWNhbGF0ZWQgaW4gY2FsbGluZyBmdW5jdGlvbiB3aXRoIENTIG9mZnNldCAqLworICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCisgICAgeworICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorCSAgICBmb3IoYnVzSWQgPSAwIDsgYnVzSWQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBidXNJZCsrKQorCSAgICB7CisJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0lkKQorICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgIGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCAgRERSX1BIWV9EQVRBLCAgcmVnQWRkciwgJmRhdGFWYWx1ZSkpOworICAgICAgICAgICAgICAgIFB1cFZhbHVlc1tpbnRlcmZhY2VJZCpvY3RldHNQZXJJbnRlcmZhY2VOdW0gKyBidXNJZF0gPSBkYXRhVmFsdWUgJiBtYXNrOworICAgICAgICB9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorV3JpdGUgTGV2ZWxpbmcgVmFsdWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dUX0JPT0wgd3JpdGVMZXZlbGluZ1ZhbHVlKEdUX1UzMiBkZXZOdW0sR1RfVTMyIFB1cFZhbHVlc1tNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV0sIEdUX1UzMiBQdXBQaFZhbHVlc1tNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV0saW50IHJlZ0FkZHIpCit7CisgICAgR1RfVTMyIGludGVyZmFjZUlkID0gMCwgYnVzSWQgPSAwOworICAgIEdUX1UzMiBkYXRhOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CisKKyAgICAvKiBtdWx0aSBDUyBzdXBwb3J0IC0gcmVnQWRkciBpcyBjYWx1Y2FsYXRlZCBpbiBjYWxsaW5nIGZ1bmN0aW9uIHdpdGggQ1Mgb2Zmc2V0ICovCisKKyAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQorICAgIHsKKyAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKwkgICAgZm9yKGJ1c0lkID0gMCA7IGJ1c0lkIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgYnVzSWQrKykKKwkgICAgeworCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKKwkJZGF0YSA9IFB1cFZhbHVlc1tpbnRlcmZhY2VJZCpvY3RldHNQZXJJbnRlcmZhY2VOdW0rYnVzSWRdICsgKFB1cFBoVmFsdWVzW2ludGVyZmFjZUlkKm9jdGV0c1BlckludGVyZmFjZU51bStidXNJZF0pOwogCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgRERSX1BIWV9EQVRBLCByZWdBZGRyLCBkYXRhKSk7CiAJICAgIH0KIApAQCAtNzQwLDggKzgyMSwxMyBAQAogZXh0ZXJuIEdUX1U4ICBpc0Rmc0luSW5pdDsKIGV4dGVybiBHVF8zMiB3bERlYnVnRGVsYXk7CiBleHRlcm4gR1RfVTMyIHNpbGljb25EZWxheVtIV1NfTUFYX0RFVklDRV9OVU1dOwotZXh0ZXJuIEdUX1UzMiBQZmluZ2VyOwotZXh0ZXJuIEdUX1UzMiBOZmluZ2VyOworZXh0ZXJuIAlHVF9VMzIgdnJlZkluaXRpYWxWYWx1ZTsKK2V4dGVybiAJR1RfVTMyIGdacHJpRGF0YTsKK2V4dGVybiAJR1RfVTMyIGdabnJpRGF0YTsKK2V4dGVybiAJR1RfVTMyIGdacHJpQ3RybDsKK2V4dGVybiAJR1RfVTMyIGdabnJpQ3RybDsKK2V4dGVybiAJR1RfVTMyIGdacG9kdERhdGE7CitleHRlcm4gCUdUX1UzMiBnWm5vZHREYXRhOwogZXh0ZXJuIEdUX1UzMiBmcmVxVmFsW0REUl9GUkVRX0xJTUlUXTsKIGV4dGVybiBHVF9VMzIgc3RhcnRQYXR0ZXJuLCBlbmRQYXR0ZXJuOwogZXh0ZXJuIEdUX1UzMiAgUGh5UmVnMFZhbDsKQEAgLTc1MCwxMSArODM2LDYgQEAKIGV4dGVybiBHVF9VMzIgIFBoeVJlZzNWYWw7CiBleHRlcm4gTVZfSFdTX1BBVFRFUk4gc3dlZXBQYXR0ZXJuOwogZXh0ZXJuIE1WX0hXU19QQVRURVJOIHBic1BhdHRlcm47Ci1leHRlcm4gR1RfVTggaXNSenE2OwotZXh0ZXJuIEdUX1UzMiB6bnJpRGF0YVBoeVZhbDsKLWV4dGVybiBHVF9VMzIgenByaURhdGFQaHlWYWw7Ci1leHRlcm4gR1RfVTMyIHpucmlDdHJsUGh5VmFsOwotZXh0ZXJuIEdUX1UzMiB6cHJpQ3RybFBoeVZhbDsKIGV4dGVybiBHVF9VOCAgZGVidWdUcmFpbmluZ0FjY2VzczsKIGV4dGVybiBHVF9VMzIgZmluZ2VyVGVzdCwgcEZpbmdlclN0YXJ0LCAgcEZpbmdlckVuZCwgIG5GaW5nZXJTdGFydCwgbkZpbmdlckVuZCwgcEZpbmdlclN0ZXAsIG5GaW5nZXJTdGVwOwogZXh0ZXJuIEdUX1UzMiBtb2RlMlQ7CkBAIC03NzAsMjIgKzg1MSwxNiBAQAogZXh0ZXJuIEdUX1UzMiBzdGFydFBhdHRlcm4sIGVuZFBhdHRlcm47CiAKIC8qRGVjbGFyYXRpb25zKi8KLUdUX1UzMiBybFZlcnNpb24gPSAxOyAvKiAwIC0gb2xkIFJMIG1hY2hpbmUgKi8KIE1WX0hXU19USVBfQ09ORklHX0ZVTkNfREIgY29uZmlnRnVuY0luZm9bSFdTX01BWF9ERVZJQ0VfTlVNXTsKIEdUX1UzMiAgc3RhcnRYc2JPZmZzZXQgPSAwOwogR1RfVTggaXNSbE9sZCA9IDA7CiBHVF9VOCBpc0ZyZXFPbGQgPSAwOwogR1RfVTggaXNEZnNEaXNhYmxlZCA9IDA7CiBHVF9VMzIgZGVmYXVsdENlbnRybGl6YXRpb25WYWx1ZSA9IDB4MTI7Ci1HVF9VMzIgdnJlZiA9IDB4NDsKIEdUX1UzMiBhY3RpdmF0ZVNlbGVjdEJlZm9yZVJ1bkFsZz0gMSwgYWN0aXZhdGVEZXNlbGVjdEFmdGVyUnVuQWxnID0gMSwgcmxUZXN0ID0gMCwgcmVzZXRSZWFkRmlmbyA9IDA7CiBHVF9CT09MIGRlYnVnQWNjID0gR1RfRkFMU0U7CiBHVF9VMzIgY3RybFN3ZWVwcmVzW0FETExfTEVOR1RIXVtNQVhfSU5URVJGQUNFX05VTV1bTUFYX0JVU19OVU1dOwogR1RfVTMyIGN0cmxBRExMW01BWF9DU19OVU0qTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dOwotR1RfVTggY3NNYXNrUmVnW109Ci17Ci0gICAgMCwgNCwgOCwgMTIgLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi19OwogR1RfVTMyIHhzYlRlc3RUYWJsZVtdWzhdID0KIHsKICAgICB7MHgwMDAwMDAwMCwgICAgICAgICAweDExMTExMTExLCAgICAgICAgIDB4MjIyMjIyMjIsICAgICAgICAgMHgzMzMzMzMzMywgICAgICAgICAweDQ0NDQ0NDQ0LCAgICAgICAgIDB4NTU1NTU1NTUsICAgICAgICAgMHg2NjY2NjY2NiwgICAgICAgICAweDc3Nzc3Nzc3fSwKQEAgLTgxMSwxMSArODg2LDEyIEBACiBHVF9TVEFUVVMgICAgZGRyM1RpcFByaW50QWRsbCgpCiB7CiAgICAgR1RfVTMyICBidXNDbnQgPSAwLCAgaW50ZXJmYWNlSWQsICBkYXRhUDEsIGRhdGFQMiwgdWlEYXRhMywgZGV2TnVtID0gMDsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgICB7CiAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0gICAgICAgIGZvcihidXNDbnQgPSAwOyBidXNDbnQgPCBHRVRfVE9QT0xPR1lfTlVNX09GX0JVU0VTKGRldk51bSk7IGJ1c0NudCsrKQorICAgICAgICBmb3IoYnVzQ250ID0gMDsgYnVzQ250IDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNDbnQrKykKICAgICAgICAgewogICAgICAgICAJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzQ250KQogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoICAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0NudCwgRERSX1BIWV9EQVRBLCAweDEsICZkYXRhUDEpKTsKQEAgLTkwNCwyNyArOTgwLDIzIEBACiAgICAgY2FzZSAwOgogICAgICAgICAqcHRyID0gKEdUX1UzMiopICYodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2spOwogICAgICAgICBicmVhazsKLQkJCSAKKwogICAgIGNhc2UgMHgxOgogICAgICAgICAqcHRyID0gKEdUX1UzMiopICZtYXNrVHVuZUZ1bmM7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDI6Ci0JICAgICpwdHIgPSAoR1RfVTMyKikgJmxvd0ZyZXE7CisgICAgICAgIGxvd0ZyZXEgPSAoTVZfSFdTX0REUl9GUkVRKXZhbHVlOwogCSAgICBicmVhazsKIAogICAgIGNhc2UgMHgzOgotCSAgICAqcHRyID0gKEdUX1UzMiopICZtZWRpdW1GcmVxOworICAgICAgICBtZWRpdW1GcmVxID0gKE1WX0hXU19ERFJfRlJFUSl2YWx1ZTsKIAkgICAgYnJlYWs7Ci0JCQkgCisKICAgICBjYXNlIDB4NDoKICAgICAgICAgKnB0ciA9IChHVF9VMzIqKSAmZ2VuZXJpY0luaXRDb250cm9sbGVyOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgMHg1OgotICAgICAgICAqcHRyID0gKEdUX1UzMiopICZybFZlcnNpb247Ci0gICAgICAgIGJyZWFrOwotCiAgICAgY2FzZSAweDg6CiAgICAgICAgICpwdHIgPSAoR1RfVTMyKikgJnN0YXJ0WHNiT2Zmc2V0OwogICAgICAgICBicmVhazsKQEAgLTk4MCwxNyArMTA1MiwxNiBAQAogICAgY2FzZSAweDMyOgogICAgICAgICpwdHIgPSAoR1RfVTMyKikgJmlzRGZzSW5Jbml0OwogICAgICAgIGJyZWFrOwotCiAgICBjYXNlIDB4MzM6Ci0gICAgICAgKnB0ciA9IChHVF9VMzIqKSAmUGZpbmdlcjsKKyAgICAgICAqcHRyID0gKEdUX1UzMiopICZnWm5vZHREYXRhOwogICAgICAgIGJyZWFrOwogCiAgICBjYXNlIDB4MzQ6Ci0gICAgICAgKnB0ciA9IChHVF9VMzIqKSAmTmZpbmdlcjsKKyAgICAgICAqcHRyID0gKEdUX1UzMiopICZnWnBvZHREYXRhOwogICAgICAgIGJyZWFrOwogCiAgICBjYXNlIDB4MzU6Ci0gICAgICAgKnB0ciA9IChHVF9VMzIqKSAmaW5pdEZyZXE7CisgICAgICAgaW5pdEZyZXEgPSAoTVZfSFdTX0REUl9GUkVRKXZhbHVlOwogICAgICAgIGJyZWFrOwogCiAgICBjYXNlIDB4MzY6CkBAIC0xMDIxLDI1ICsxMDkyLDIwIEBACiAgICAgICAgKnB0ciA9IChHVF9VMzIqKSAmUGh5UmVnM1ZhbDsKICAgICAgICBicmVhazsKIAotCiAgICBjYXNlIDB4NGU6Ci0gICAgICAgKnB0ciA9IChHVF9VMzIqKSAmc3dlZXBQYXR0ZXJuOworICAgICAgIHN3ZWVwUGF0dGVybiA9IChNVl9IV1NfUEFUVEVSTil2YWx1ZTsKICAgICAgICBicmVhazsKIC8qCiAgICBjYXNlIDB4NGY6CiAgICAgICAgKnB0ciA9IChHVF9VMzIqKSAmKHBoeTFWYWxUYWJsZVtERFJfRlJFUV9MT1dfRlJFUV0pOwogICAgICAgIGJyZWFrOwogKi8KLSAgIGNhc2UgMHg1MDoKLSAgICAgICAqcHRyID0gKEdUX1UzMiopICZpc1J6cTY7Ci0gICAgICAgYnJlYWs7Ci0KICAgIGNhc2UgMHg1MToKLSAgICAgICAqcHRyID0gKEdUX1UzMiopICZ6bnJpRGF0YVBoeVZhbDsKKyAgICAgICAqcHRyID0gKEdUX1UzMiopICZnWm5yaURhdGE7CiAgICAgICAgYnJlYWs7CiAKICAgIGNhc2UgMHg1MjoKLSAgICAgICAqcHRyID0gKEdUX1UzMiopICZ6cHJpRGF0YVBoeVZhbDsKKyAgICAgICAqcHRyID0gKEdUX1UzMiopICZnWnByaURhdGE7CiAgICAgICAgYnJlYWs7CiAKICAgIGNhc2UgMHg1MzoKQEAgLTEwNzEsMTkgKzExMzcsMTggQEAKICAgICAgICBicmVhazsKIAogICAgY2FzZSAweDVBOgotICAgICAgICpwdHIgPSAoR1RfVTMyKikgJnpucmlDdHJsUGh5VmFsOworICAgICAgICpwdHIgPSAoR1RfVTMyKikgJmdabnJpQ3RybDsKICAgICAgICBicmVhazsKIAogICAgY2FzZSAweDVCOgotICAgICAgICpwdHIgPSAoR1RfVTMyKikgJnpwcmlDdHJsUGh5VmFsOworICAgICAgICpwdHIgPSAoR1RfVTMyKikgJmdacHJpQ3RybDsKICAgICAgICBicmVhazsKLQogICAgY2FzZSAweDVDOgogICAgICAgICpwdHIgPSAoR1RfVTMyKikgJmlzUmVnRHVtcDsKICAgICAgICBicmVhazsKIAogICAgY2FzZSAweDVEOgotICAgICAgICpwdHIgPSAoR1RfVTMyKikgJnZyZWY7CisgICAgICAgKnB0ciA9IChHVF9VMzIqKSAmdnJlZkluaXRpYWxWYWx1ZTsKICAgICAgICBicmVhazsKIAogICAgY2FzZSAweDVFOgpAQCAtMTExNSwyMSArMTE4MCwxNyBAQAogICAgICAgIGJyZWFrOwogCiAgICBjYXNlIDB4NzE6Ci0gICAgICAgKnB0ciA9IChHVF9VMzIqKSAmcGJzUGF0dGVybjsKKyAgICAgICBwYnNQYXR0ZXJuID0gKE1WX0hXU19QQVRURVJOKXZhbHVlOwogICAgICAgIGJyZWFrOwogCiAgICBjYXNlIDB4NzI6CiAgICAgICAgKnB0ciA9IChHVF9VMzIqKSAmZGVsYXlFbmFibGU7CiAgICAgICAgYnJlYWs7Ci0JICAgCisKICAgIGNhc2UgMHg3MzoKICAgICAgICAqcHRyID0gKEdUX1UzMiopICZja0RlbGF5OwogICAgICAgIGJyZWFrOwogCi0gICBjYXNlIDB4NzQ6Ci0gICAgICAgKnB0ciA9IChHVF9VMzIqKSAmY2tEZWxheV8xNjsKLSAgICAgICBicmVhazsKLQogICAgY2FzZSAweDc1OgogICAgICAgICpwdHIgPSAoR1RfVTMyKikgJmNhRGVsYXk7CiAgICAgICAgYnJlYWs7CkBAIC0xMjY5LDI5ICsxMzMwLDUwIEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0JCQlERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9FUlJPUiwgKCJmbGFnSWQgb3V0IG9mIGJvdW5kYXJ5ICVkIFxuIixmbGFnSWQpKTsgCQkJCQorCQkJREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgiZmxhZ0lkIG91dCBvZiBib3VuZGFyeSAlZCBcbiIsZmxhZ0lkKSk7CiAgICAgICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBHVF9PSzsgCisgICAgcmV0dXJuIEdUX09LOwogIH0KLQotI2lmbmRlZiBFWENMVURFX1NXSVRDSF9ERUJVRworI2VuZGlmIC8qICNpZm5kZWYgRVhDTFVERV9TV0lUQ0hfREVCVUcgKi8KKyNpZmRlZiBERFJfVklFV0VSX1RPT0wKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogUHJpbnQgQURMTAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogR1RfU1RBVFVTIHByaW50QWRsbChHVF9VMzIgZGV2TnVtLCBHVF9VMzIgYWRsbFtNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV0pCiB7CiAgICAgR1RfVTMyIGksajsKKyAgICBHVF9VMzIgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOwogCi0JZGV2TnVtID0gZGV2TnVtOworICAgIGRldk51bSA9IGRldk51bTsKKyAgICBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSBkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKLSAgICBmb3Ioaj0wOyBqPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IGorKykKKyAgICBmb3Ioaj0wOyBqPCBvY3RldHNQZXJJbnRlcmZhY2VOdW07IGorKykKICAgICB7Ci0gICAgICAgCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGopCisgICAgICAgIFZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGopCiAgICAgICAgIGZvcihpPTA7aTxNQVhfSU5URVJGQUNFX05VTTsgaSsrKQogICAgICAgICB7Ci0gICAgICAgICAgICBtdlByaW50ZigiJWQgLCIsYWRsbFtpKnRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZStqXSk7CisgICAgICAgICAgICBtdlByaW50ZigiJWQgLCIsYWRsbFtpKm9jdGV0c1BlckludGVyZmFjZU51bStqXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbXZQcmludGYoIlxuIik7CisgICAgcmV0dXJuIEdUX09LOworfQorR1RfU1RBVFVTIHByaW50UGgoR1RfVTMyIGRldk51bSwgR1RfVTMyIGFkbGxbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dKQoreworICAgIEdUX1UzMiBpLGo7CisgICAgR1RfVTMyIG9jdGV0c1BlckludGVyZmFjZU51bTsKKworICAgIGRldk51bSA9IGRldk51bTsKKyAgICBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSBkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CisKKyAgICBmb3Ioaj0wOyBqPCBvY3RldHNQZXJJbnRlcmZhY2VOdW07IGorKykKKyAgICB7CisgICAgICAgIFZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGopCisgICAgICAgIGZvcihpPTA7aTxNQVhfSU5URVJGQUNFX05VTTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBtdlByaW50ZigiJWQgLCIsYWRsbFtpKm9jdGV0c1BlckludGVyZmFjZU51bStqXT4+Nik7CiAgICAgICAgIH0KICAgICB9CiAgICAgbXZQcmludGYoIlxuIik7CkBAIC0xMjk5LDggKzEzODEsOSBAQAogfQogI2VuZGlmCiAKKyNpZm5kZWYgRVhDTFVERV9TV0lUQ0hfREVCVUcKIC8qIHVpQnl0ZUluZGV4IC0gb25seSBieXRlIDAsMSwyLCBvciAzLCBveGZmIC0gdGVzdCBhbGwgYnl0ZXMgKi8KLXN0YXRpYyAKK3N0YXRpYwogR1RfVTMyIGRkcjNUaXBDb21wYXJlKEdUX1UzMiBpbnRlcmZhY2VJZCwgR1RfVTMyICpwU3JjLCBHVF9VMzIgKnBEc3QsIEdUX1UzMiB1aUJ5dGVJbmRleCkKIHsKICAgIEdUX1UzMiBidXJzdENudCA9IDAsIGFkZHJPZmZzZXQsaUlkOwpAQCAtMTMwOSw3ICsxMzkyLDcgQEAKICAgIGFkZHJPZmZzZXQgPSAodWlCeXRlSW5kZXggPT0gMHhmZikgPyAoR1RfVTMyKSAweGZmZmZmZmZmOiAoR1RfVTMyKSAoMHhmZiA8PCAodWlCeXRlSW5kZXgqOCkpOwogICAgZm9yKGJ1cnN0Q250ID0gMDsgYnVyc3RDbnQgPCBFWFRfQUNDRVNTX0JVUlNUX0xFTkdUSDsgYnVyc3RDbnQrKykKICAgIHsKLSAgICAgIGlmICgocFNyY1tidXJzdENudF0gJiBhZGRyT2Zmc2V0KSAhPSAocERzdFtidXJzdENudF0gJiBhZGRyT2Zmc2V0KSkgCisgICAgICBpZiAoKHBTcmNbYnVyc3RDbnRdICYgYWRkck9mZnNldCkgIT0gKHBEc3RbaW50ZXJmYWNlSWRdICYgYWRkck9mZnNldCkpCiAgICAgICB7CiAgICAgICAgICAgYklzRmFpbCA9IEdUX1RSVUU7CiAgICAgICB9CkBAIC0xMzMyLDg5ICsxNDE1LDMxIEBACiAKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiB1aVRlc3RUeXBlID0gMC10eCAsIDEgLSByeCAqLwotR1RfU1RBVFVTICAgIGRkcjNUaXBTd2VlcFRlc3QoR1RfVTMyICAgZGV2TnVtLCBHVF9VMzIgdWlUZXN0VHlwZSwgR1RfVTMyIHVpTWVtQWRkcmVzcywgR1RfVTMyIGlzTW9kaWZ5QWRsbCwgR1RfVTMyIHN0YXJ0SWYsIEdUX1UzMiBlbmRJZiwgR1RfVTMyIHN0YXJ0cHVwLCBHVF9VMzIgZW5kcHVwKQotewotICAgIEdUX1UzMiAgICBidXNDbnQgPSAwLCBhZGxsVmFsID0gMCwgaW50ZXJmYWNlSWQsIHVpUHJldkFkbGwsIHVpTWFza0JpdCwgZW5kX2FkbGwsIHN0YXJ0X2FkbGw7Ci0gICAgR1RfVTMyIHJlZ0FkZHIgPSAwLCBpdGVyID0gMDsKLQotCXVpTWVtQWRkcmVzcyA9IHVpTWVtQWRkcmVzczsKLQotICAgIGlmICh1aVRlc3RUeXBlID09IDApCi0gICAgewotICAgICAgICByZWdBZGRyID0gMTsKLSAgICAgICAgdWlNYXNrQml0ID0gMHgzZjsKLSAgICAgICAgc3RhcnRfYWRsbCA9IDA7Ci0gICAgICAgIGVuZF9hZGxsID0gdWlNYXNrQml0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZWdBZGRyID0gMzsKLSAgICAgICAgdWlNYXNrQml0ID0gMHgxZjsKLSAgICAgICAgc3RhcnRfYWRsbCA9IDA7Ci0gICAgICAgIGVuZF9hZGxsID0gdWlNYXNrQml0OwotICAgIH0KLSAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9JTkZPLCAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikpOwotICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0lORk8sICgiVGVzdCB0eXBlICVkICgwLXR4LCAxLXJ4KSBcbiIsdWlUZXN0VHlwZSkpOwotICAgIAotICAgIGZvcihpbnRlcmZhY2VJZCA9IHN0YXJ0SWY7IGludGVyZmFjZUlkIDw9IGVuZElmOyBpbnRlcmZhY2VJZCsrKQotICAgIHsKLSAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgZm9yKGJ1c0NudCA9IHN0YXJ0cHVwOyBidXNDbnQgPCBlbmRwdXA7IGJ1c0NudCsrKQotICAgICAgICB7Ci0gICAgICAKLSAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgIGRldk51bSwgaW50ZXJmYWNlSWQsICBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNDbnQsIEREUl9QSFlfREFUQSwgcmVnQWRkciwgJnVpUHJldkFkbGwpKTsKLQotICAgICAgICAgICAgZm9yKGFkbGxWYWwgPSBzdGFydF9hZGxsOyBhZGxsVmFsIDw9IGVuZF9hZGxsOyBhZGxsVmFsKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzTW9kaWZ5QWRsbCA9PSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCdXNSZWFkTW9kaWZ5V3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgIGJ1c0NudCwgRERSX1BIWV9EQVRBLCByZWdBZGRyLCBhZGxsVmFsLCB1aU1hc2tCaXQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yKGl0ZXIgPSAwOyBpdGVyIDw9IGRlYnVnU3dlZXBWYWw7IGl0ZXIrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qWHNiUldUZXN0KGRldk51bSwgaW50ZXJmYWNlSWQsIHVpTWVtQWRkcmVzcywgdGVzdFBhdHRlcm4sIGJ1c0NudCwgMCk7Ci0JCQkJCUNIRUNLX1NUQVRVUyhkZHIzVGlwRXh0V3JpdGUoZGV2TnVtLCBpbnRlcmZhY2VJZCwgdWlNZW1BZGRyZXNzLCAxLCB4c2JUZXN0VGFibGVbc2VxXSkpOwotCQkJCQlDSEVDS19TVEFUVVMoZGRyM1RpcEV4dFJlYWQoICBkZXZOdW0sIGludGVyZmFjZUlkLCB1aU1lbUFkZHJlc3MsIDEsIGRhdGFSZWFkKSk7Ci0JCQkJCXJldFRtcCA9IGRkcjNUaXBDb21wYXJlKGludGVyZmFjZUlkLCB4c2JUZXN0VGFibGVbc2VxXSwgZGF0YVJlYWQsIDB4ZmYpOyovCi0JCQkJfQotCQkJfQotICAgICAgICAgICAgaWYgKGlzTW9kaWZ5QWRsbCA9PSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggICBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgIGJ1c0NudCwgRERSX1BIWV9EQVRBLCByZWdBZGRyLCAgdWlQcmV2QWRsbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfSU5GTywgKCJcbiIpKTsKLSAgICAgICAgfQotICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9JTkZPLCAoIlxuIikpOwotICAgIH0KLQotICAgIHJldHVybiBHVF9PSzsKLX0KLQotI2lmbmRlZiBFWENMVURFX1NXSVRDSF9ERUJVRworI2VuZGlmIC8qIEVYQ0xVREVfU1dJVENIX0RFQlVHKi8KKyNpZiBkZWZpbmVkKEREUl9WSUVXRVJfVE9PTCkKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogU3dlZXAgdmFsaWRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogR1RfQk9PTCBkZHIzVGlwUnVuU3dlZXBUZXN0KEdUXzMyIGRldk51bSwgR1RfVTMyIFJlcGVhdE51bSwgR1RfVTMyIGRpcmVjdGlvbiwgR1RfVTMyIG1vZGUpCiB7CiAgICAgR1RfVTMyICBwdXAgPSAwLCBzdGFydFB1cCA9IDAsIGVuZFB1cCA9IDA7Ci0gICAgR1RfVTMyIGFkbGwgPSAwOworICAgIEdUX1UzMiBhZGxsID0gMCxyZXAgPSAwLHN3ZWVwUGF0dGVybkluZGV4ID0gMDsKICAgICBHVF9VMzIgcmVzW01BWF9JTlRFUkZBQ0VfTlVNXSA9IHswfTsKICAgICBHVF8zMiAgaW50ZXJmYWNlSWQgPSAwOwogICAgIEdUX1UzMiBhZGxsVmFsdWUgPSAwOwogICAgIEdUXzMyIHJlZyA9IChkaXJlY3Rpb24gPT0gMCkgPyBXUklURV9DRU5UUkFMSVpBVElPTl9QSFlfUkVHIDogUkVBRF9DRU5UUkFMSVpBVElPTl9QSFlfUkVHOwogICAgIE1WX0hXU19BQ0NFU1NfVFlQRSAgcHVwQWNjZXNzOwogICAgIEdUX1UzMiB1aUNzOwotICAgIEdUX1UzMiBtYXhDcyA9IG12SHdzRGRyM1RpcE1heENTR2V0KCk7CisgICAgR1RfVTMyIG1heENzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoZGV2TnVtKTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSBkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBSZXBlYXROdW0gPSBSZXBlYXROdW07Ci0KKwlSZXBlYXROdW0gPSAyOwogICAgIGlmICggbW9kZSA9PSAxKQogICAgIHsKICAgICAgICAgLyogcGVyIHB1cCAqLwogICAgICAgICBzdGFydFB1cCA9IDA7Ci0gICAgICAgIGVuZFB1cCA9IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZS0xOworICAgICAgICBlbmRQdXAgPSBvY3RldHNQZXJJbnRlcmZhY2VOdW0tMTsKICAgICAgICAgcHVwQWNjZXNzID0gQUNDRVNTX1RZUEVfVU5JQ0FTVDsKICAgICB9CiAgICAgZWxzZQpAQCAtMTQyOSw3ICsxNDU0LDcgQEAKIAkJZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKIAkJewogCQkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAJCQlmb3IoIHB1cCA9IHN0YXJ0UHVwIDtwdXAgPD0gZW5kUHVwIDsgcHVwKyspCisJCQlmb3IoIHB1cCA9IHN0YXJ0UHVwIDtwdXAgPD0gZW5kUHVwIDsgcHVwKyspCiAJCQl7CiAJCQkJY3RybFN3ZWVwcmVzW2FkbGxdW2ludGVyZmFjZUlkXVtwdXBdID0gMDsKIAkJCX0KQEAgLTE0NDEsMjQgKzE0NjYsMzAgQEAKIAkJY3RybEFETExbYWRsbF0gPSAwOwogCX0KIAkvKlNhdmUgRFFTIHZhbHVlKGFmdGVyIGFsZ29yaXRobSBydW4pKi8KLQlyZWFkQWRsbFZhbHVlKGN0cmxBRExMLCAocmVnICsgKHVpQ3MgKiBDU19SRUdJU1RFUl9BRERSX09GRlNFVCkpICwgTUFTS19BTExfQklUUyApOworCW12SHdzRGRyM1RpcFJlYWRBZGxsVmFsdWUoZGV2TnVtLGN0cmxBRExMLCAocmVnICsgKHVpQ3MgKiBDU19SRUdJU1RFUl9BRERSX09GRlNFVCkpICwgTUFTS19BTExfQklUUyApOwogCiAJLypTd2VlcCBBRExMICBmcm9tIDA6MzEgb24gYWxsIEkvRiBvbiBhbGwgUHVwIGFuZCBwZXJmb3JtIEJJU1Qgb24gZWFjaCBzdGFnZS4qLwogCWZvcihwdXA9c3RhcnRQdXA7IHB1cCA8PWVuZFB1cDsgcHVwKyspCiAJewogCQlmb3IoYWRsbCA9IDAgOyBhZGxsIDwgQURMTF9MRU5HVEggOyBhZGxsKyspCiAJCXsKLQkJCWFkbGxWYWx1ZSA9IChkaXJlY3Rpb24gPT0gMCkgPyAoYWRsbCoyKTphZGxsOwotCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIHB1cEFjY2VzcywgcHVwLCBERFJfUEhZX0RBVEEsIHJlZyArIENTX1JFR19WQUxVRSh1aUNzKSwgYWRsbFZhbHVlKSk7Ci0JCQltdkh3c0RkcjNSdW5CaXN0KGRldk51bSwgc3dlZXBQYXR0ZXJuLCByZXMgLHVpQ3MpOwotCQkJLypkZHIzVGlwUmVzZXRGaWZvUHRyKGRldk51bSk7Ki8KLQkJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCisJCQlmb3IocmVwID0gMDsgcmVwIDwgUmVwZWF0TnVtIDsgcmVwKyspCiAJCQl7Ci0JCQkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLQkJCQljdHJsU3dlZXByZXNbYWRsbF1baW50ZXJmYWNlSWRdW3B1cF0gPSByZXNbaW50ZXJmYWNlSWRdOwotCQkJCWlmIChtb2RlID09IDEpCisJCQkJZm9yKHN3ZWVwUGF0dGVybkluZGV4ID0gc3dlZXBQYXR0ZXJuSW5kZXhTdGFydCA7IHN3ZWVwUGF0dGVybkluZGV4IDwgc3dlZXBQYXR0ZXJuSW5kZXhFbmQgOyBzd2VlcFBhdHRlcm5JbmRleCsrKQogCQkJCXsKLQkJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIHJlZyArIENTX1JFR19WQUxVRSh1aUNzKSwgIGN0cmxBRExMW2ludGVyZmFjZUlkKnVpQ3MqdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlK3B1cF0pKTsKKwkJCQkJYWRsbFZhbHVlID0gKGRpcmVjdGlvbiA9PSAwKSA/IChhZGxsKjIpOmFkbGw7CisJCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCAwLCBwdXBBY2Nlc3MsIHB1cCwgRERSX1BIWV9EQVRBLCByZWcgKyBDU19CWVRFX0dBUCh1aUNzKSwgYWRsbFZhbHVlKSk7CisJCQkJCW12SHdzRGRyM1J1bkJpc3QoZGV2TnVtLCBzd2VlcFBhdHRlcm4sIHJlcyAsdWlDcyk7CisJCQkJCS8qZGRyM1RpcFJlc2V0Rmlmb1B0cihkZXZOdW0pOyovCisJCQkJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCisJCQkJCXsKKwkJCQkJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCisJCQkJCQljdHJsU3dlZXByZXNbYWRsbF1baW50ZXJmYWNlSWRdW3B1cF0gKz0gcmVzW2ludGVyZmFjZUlkXTsKKwkJCQkJCWlmIChtb2RlID09IDEpCisJCQkJCQl7CisJCQkJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIHJlZyArIENTX0JZVEVfR0FQKHVpQ3MpLCAgY3RybEFETExbaW50ZXJmYWNlSWQqdWlDcypvY3RldHNQZXJJbnRlcmZhY2VOdW0rcHVwXSkpOworCQkJCQkJfQorCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9CkBAIC0xNDkwLDE1ICsxNTIxLDE1IEBACiAJCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQogCQkJZm9yKCBwdXA9c3RhcnRQdXA7IHB1cCA8PWVuZFB1cDsgcHVwKyspCiAJCQl7Ci0JCQkJbXZQcmludGYoIiVkICwgIixjdHJsU3dlZXByZXNbYWRsbF1baW50ZXJmYWNlSWRdW3B1cF0pOworCQkJCW12UHJpbnRmKCIlOGQgLCAiLGN0cmxTd2VlcHJlc1thZGxsXVtpbnRlcmZhY2VJZF1bcHVwXSk7CiAJCQl9CiAJCX0KIAkJbXZQcmludGYoIlxuIik7CiAJfQogCS8qV3JpdGUgYmFjayB0byB0aGUgcGh5IHRoZSBSeCBEUVMgdmFsdWUsIHdlIHN0b3JlIGluIHRoZSBiZWdnaW5nLiAqLwotCXdyaXRlQWRsbFZhbHVlKGN0cmxBRExMLCAocmVnICsgIHVpQ3MgKiBDU19SRUdJU1RFUl9BRERSX09GRlNFVCkpOworCW12SHdzRGRyM1RpcFdyaXRlQWRsbFZhbHVlKGRldk51bSxjdHJsQURMTCwgKHJlZyArICB1aUNzICogQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQpKTsKIAkvKiBwcmludCBhZGxsIHJlc3VsdHMgKi8KLQlyZWFkQWRsbFZhbHVlKGN0cmxBRExMLCAocmVnICsgdWlDcyAqIENTX1JFR0lTVEVSX0FERFJfT0ZGU0VUKSwgTUFTS19BTExfQklUUyk7CisJbXZId3NEZHIzVGlwUmVhZEFkbGxWYWx1ZShkZXZOdW0sY3RybEFETEwsIChyZWcgKyB1aUNzICogQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQpLCBNQVNLX0FMTF9CSVRTKTsKIAltdlByaW50ZigiJXMsRFFTLEFETEwsLCwiLChkaXJlY3Rpb249PTApID8gIlR4IjoiUngiKTsKIAlwcmludEFkbGwoZGV2TnVtLCBjdHJsQURMTCk7CiAgICAgfQpAQCAtMTUwNiwxMyArMTUzNywxODUgQEAKICAgICByZXR1cm4gMDsKIH0KIAorI2lmIGRlZmluZWQoRVhDTFVERV9TV0lUQ0hfREVCVUcpCitHVF9CT09MIGRkcjNUaXBSdW5MZXZlbGluZ1N3ZWVwVGVzdChHVF8zMiBkZXZOdW0sIEdUX1UzMiBSZXBlYXROdW0sIEdUX1UzMiBkaXJlY3Rpb24sIEdUX1UzMiBtb2RlKQoreworICAgIEdUX1UzMiAgcHVwID0gMCwgc3RhcnRQdXAgPSAwLCBlbmRQdXAgPSAwLCBzdGFydEFkbGwgPSAwOworICAgIEdUX1UzMiBhZGxsID0gMCxyZXAgPSAwLHN3ZWVwUGF0dGVybkluZGV4ID0gMDsKKwlHVF9VMzIgIHJlYWREYXRhW01BWF9JTlRFUkZBQ0VfTlVNXTsKKyAgICBHVF9VMzIgcmVzW01BWF9JTlRFUkZBQ0VfTlVNXSA9IHswfTsKKyAgICBHVF8zMiAgaW50ZXJmYWNlSWQgPSAwLGdhcCA9IDA7CisgICAgR1RfMzIgYWRsbFZhbHVlID0gMDsKKyAgICBHVF8zMiByZWcgPSAoZGlyZWN0aW9uID09IDApID8gV0xfUEhZX1JFRyA6IFJMX1BIWV9SRUc7CisgICAgTVZfSFdTX0FDQ0VTU19UWVBFICBwdXBBY2Nlc3M7CisgICAgR1RfVTMyIHVpQ3M7CisgICAgR1RfVTMyIG1heENzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoZGV2TnVtKTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSBkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CisgICAgUmVwZWF0TnVtID0gUmVwZWF0TnVtOworCVJlcGVhdE51bSA9IDM7CisgICAgaWYgKCBtb2RlID09IDEpCisgICAgeworICAgICAgICAvKiBwZXIgcHVwICovCisgICAgICAgIHN0YXJ0UHVwID0gMDsKKyAgICAgICAgZW5kUHVwID0gb2N0ZXRzUGVySW50ZXJmYWNlTnVtLTE7CisgICAgICAgIHB1cEFjY2VzcyA9IEFDQ0VTU19UWVBFX1VOSUNBU1Q7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXJ0UHVwID0gMDsKKyAgICAgICAgZW5kUHVwID0gMDsKKyAgICAgICAgcHVwQWNjZXNzID0gQUNDRVNTX1RZUEVfTVVMVElDQVNUOworICAgIH0KKyAgICBmb3IodWlDcz0wOyB1aUNzIDwgbWF4Q3M7IHVpQ3MrKyl7CisJCWZvcihhZGxsID0gMCA7IGFkbGwgPCBBRExMX0xFTkdUSCA7IGFkbGwrKykKKwkJeworCQkJZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKKwkJCXsKKwkJCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorCQkJCWZvciggcHVwID0gc3RhcnRQdXAgO3B1cCA8PSBlbmRQdXAgOyBwdXArKykKKwkJCQl7CisJCQkJCWN0cmxTd2VlcHJlc1thZGxsXVtpbnRlcmZhY2VJZF1bcHVwXSA9IDA7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZm9yKGFkbGwgPSAwIDsgYWRsbCA8IChNQVhfSU5URVJGQUNFX05VTSAqIE1BWF9CVVNfTlVNKSA7IGFkbGwrKykKKwkJeworCQkJY3RybEFETExbYWRsbF0gPSAwOworCQkJY3RybExldmVsUGhhc2VbYWRsbF0gPSAwOworCQkJY3RybEFETEwxW2FkbGxdID0gMDsKKwkJfQorCQkvKlNhdmUgTGV2ZWxpbmcgdmFsdWUoYWZ0ZXIgYWxnb3JpdGhtIHJ1bikqLworCQltdkh3c0RkcjNUaXBSZWFkQWRsbFZhbHVlKGRldk51bSxjdHJsQURMTCwgKHJlZyArICh1aUNzICogQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQpKSAsIDB4MUYgKTsKKwkJcmVhZFBoYXNlVmFsdWUoZGV2TnVtLGN0cmxMZXZlbFBoYXNlLCAocmVnICsgKHVpQ3MgKiBDU19SRUdJU1RFUl9BRERSX09GRlNFVCkpICwgMHg3PDw2ICk7CisJCWlmKGRpcmVjdGlvbiA9PSAwKQorCQl7CisJCQltdkh3c0RkcjNUaXBSZWFkQWRsbFZhbHVlKGRldk51bSxjdHJsQURMTDEsICgweDEgKyAodWlDcyAqIENTX1JFR0lTVEVSX0FERFJfT0ZGU0VUKSkgLCBNQVNLX0FMTF9CSVRTICk7CisJCX0KKwkJLypTd2VlcCBBRExMICBmcm9tIDA6MzEgb24gYWxsIEkvRiBvbiBhbGwgUHVwIGFuZCBwZXJmb3JtIEJJU1Qgb24gZWFjaCBzdGFnZS4qLworCQlmb3IocHVwPXN0YXJ0UHVwOyBwdXAgPD1lbmRQdXA7IHB1cCsrKQorCQl7CisJCQlmb3IoYWRsbCA9IDAgOyBhZGxsIDwgQURMTF9MRU5HVEggOyBhZGxsKyspCisJCQl7CisJCQkJZm9yKHJlcCA9IDA7IHJlcCA8IFJlcGVhdE51bSA7IHJlcCsrKQorCQkJCXsKKwkJCQkJYWRsbFZhbHVlID0gKGRpcmVjdGlvbiA9PSAwKSA/IChhZGxsKjIpOihhZGxsKjMpOworCQkJCQlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQorCQkJCQl7CisJCQkJCQlzdGFydEFkbGwgPSBjdHJsQURMTFtpbnRlcmZhY2VJZCp1aUNzKm9jdGV0c1BlckludGVyZmFjZU51bStwdXBdICsgKGN0cmxMZXZlbFBoYXNlW2ludGVyZmFjZUlkKnVpQ3Mqb2N0ZXRzUGVySW50ZXJmYWNlTnVtK3B1cF0+PjYpKjMyIDsKKwkJCQkJCWlmKGRpcmVjdGlvbiA9PSAwKQorCQkJCQkJeworCQkJCQkJCXN0YXJ0QWRsbCA9IChzdGFydEFkbGw+MzIpPyhzdGFydEFkbGwtMzIpOjA7CisJCQkJCQl9ZWxzZQorCQkJCQkJeworCQkJCQkJCXN0YXJ0QWRsbCA9IChzdGFydEFkbGw+NDgpPyhzdGFydEFkbGwtNDgpOjA7CisJCQkJCQl9CisJCQkJCQlpZihkaXJlY3Rpb24gPT0gMCkKKwkJCQkJCXsKKwkJCQkJCQlhZGxsVmFsdWUgPSBzdGFydEFkbGwgKyBhZGxsVmFsdWU7CisJCQkJCQl9ZWxzZQorCQkJCQkJeworCQkJCQkJCWFkbGxWYWx1ZSA9IHN0YXJ0QWRsbCArIGFkbGxWYWx1ZTsKKwkJCQkJCX0KKwkJCQkJCWdhcCA9IGN0cmxBRExMMVtpbnRlcmZhY2VJZCp1aUNzKm9jdGV0c1BlckludGVyZmFjZU51bStwdXBdIC0gY3RybEFETExbaW50ZXJmYWNlSWQqdWlDcypvY3RldHNQZXJJbnRlcmZhY2VOdW0rcHVwXTsKKwkJCQkJCWdhcCA9ICgoKGFkbGxWYWx1ZSUzMikgKyBnYXApJTY0KTsKKwkJCQkJCWFkbGxWYWx1ZSA9ICgoYWRsbFZhbHVlJTMyKSArICgoKGFkbGxWYWx1ZS0gKGFkbGxWYWx1ZSUzMikpLzMyKTw8NikpOworCisJCQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBwdXBBY2Nlc3MsIHB1cCwgRERSX1BIWV9EQVRBLCByZWcgKyBDU19CWVRFX0dBUCh1aUNzKSwgYWRsbFZhbHVlKSk7CisJCQkJCQlpZihkaXJlY3Rpb24gPT0gMCkKKwkJCQkJCXsKKwkJCQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBwdXBBY2Nlc3MsIHB1cCwgRERSX1BIWV9EQVRBLCAweDEgKyBDU19CWVRFX0dBUCh1aUNzKSwgZ2FwKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZm9yKHN3ZWVwUGF0dGVybkluZGV4ID0gc3dlZXBQYXR0ZXJuSW5kZXhTdGFydCA7IHN3ZWVwUGF0dGVybkluZGV4IDwgc3dlZXBQYXR0ZXJuSW5kZXhFbmQgOyBzd2VlcFBhdHRlcm5JbmRleCsrKQorCQkJCQl7CisJCQkJCQltdkh3c0RkcjNSdW5CaXN0KGRldk51bSwgc3dlZXBQYXR0ZXJuLCByZXMgLHVpQ3MpOworCQkJCQkJZGRyM1RpcFJlc2V0Rmlmb1B0cihkZXZOdW0pOworCQkJCQkJZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKKwkJCQkJCXsKKwkJCQkJCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorCQkJCQkJCWlmKHB1cCAhPSA0KQorCQkJCQkJCXsKKwkJCQkJCQkJY3RybFN3ZWVwcmVzW2FkbGxdW2ludGVyZmFjZUlkXVtwdXBdICs9IHJlc1tpbnRlcmZhY2VJZF07CisJCQkJCQkJfWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHgxNDU4LCByZWFkRGF0YSwgTUFTS19BTExfQklUUykpOworCQkJCQkJCQljdHJsU3dlZXByZXNbYWRsbF1baW50ZXJmYWNlSWRdW3B1cF0gKz0gcmVhZERhdGFbaW50ZXJmYWNlSWRdOworCisJCQkJCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4MTQ1OCwgMHgwICwgMHhGRkZGRkZGRikpOworCQkJCQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweDE0NUMsIDB4MCAsIDB4RkZGRkZGRkYpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQorCQkJeworCQkJCXN0YXJ0QWRsbCA9IGN0cmxBRExMW2ludGVyZmFjZUlkKnVpQ3Mqb2N0ZXRzUGVySW50ZXJmYWNlTnVtK3B1cF0gKyBjdHJsTGV2ZWxQaGFzZVtpbnRlcmZhY2VJZCp1aUNzKm9jdGV0c1BlckludGVyZmFjZU51bStwdXBdIDsKKwkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBwdXBBY2Nlc3MsIHB1cCwgRERSX1BIWV9EQVRBLCByZWcgKyBDU19CWVRFX0dBUCh1aUNzKSwgc3RhcnRBZGxsKSk7CisJCQkJaWYoZGlyZWN0aW9uID09IDApCisJCQkJeworCQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBwdXBBY2Nlc3MsIHB1cCwgRERSX1BIWV9EQVRBLCAweDEgKyBDU19CWVRFX0dBUCh1aUNzKSwgY3RybEFETEwxW2ludGVyZmFjZUlkKnVpQ3Mqb2N0ZXRzUGVySW50ZXJmYWNlTnVtK3B1cF0pKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJbXZQcmludGYoIkZpbmFsLENTICVkLCVzLExldmVsaW5nLFJlc3VsdCxBZGxsLCIsIHVpQ3MsKChkaXJlY3Rpb249PTApID8gIlRYIjoiUlgiKSk7CisJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCisJCXsKKwkJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCisJCQlpZiAobW9kZSA9PSAxKQorCQkJeworCQkJCWZvcihwdXA9c3RhcnRQdXA7IHB1cCA8PWVuZFB1cDsgcHVwKyspCisJCQkJeworCQkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCisJCQkJCW12UHJpbnRmKCJJL0YlZC1QSFklZCAsICIsaW50ZXJmYWNlSWQscHVwKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXZQcmludGYoIkkvRiVkICwgIixpbnRlcmZhY2VJZCk7CisJCQl9CisJCX0KKwkJbXZQcmludGYoIlxuIik7CisJCWZvcihhZGxsID0gMCA7IGFkbGwgPCBBRExMX0xFTkdUSCA7IGFkbGwrKykKKwkJeworCQkJYWRsbFZhbHVlID0gKGRpcmVjdGlvbiA9PSAwKSA/ICgoYWRsbCoyKS0zMik6KChhZGxsKjMpLTQ4KTsKKwkJCW12UHJpbnRmKCJGaW5hbCwlcyxMZXZlbGluZ1N3ZWVwLFJlc3VsdCwgJWQgLCIsKChkaXJlY3Rpb249PTApID8gIlRYIjoiUlgiKSxhZGxsVmFsdWUpOworCisJCQlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKXsKKwkJCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorCQkJCWZvciggcHVwPXN0YXJ0UHVwOyBwdXAgPD1lbmRQdXA7IHB1cCsrKQorCQkJCXsKKwkJCQkJbXZQcmludGYoIiU4ZCAsICIsY3RybFN3ZWVwcmVzW2FkbGxdW2ludGVyZmFjZUlkXVtwdXBdKTsKKwkJCQl9CisJCQl9CisJCQltdlByaW50ZigiXG4iKTsKKwkJfQorCQkvKldyaXRlIGJhY2sgdG8gdGhlIHBoeSB0aGUgUnggRFFTIHZhbHVlLCB3ZSBzdG9yZSBpbiB0aGUgYmVnZ2luZy4gKi8KKwkJd3JpdGVMZXZlbGluZ1ZhbHVlKGRldk51bSxjdHJsQURMTCxjdHJsTGV2ZWxQaGFzZSwgKHJlZyArICB1aUNzICogQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQpKTsKKwkJaWYoZGlyZWN0aW9uID09IDApCisJCXsKKwkJCW12SHdzRGRyM1RpcFdyaXRlQWRsbFZhbHVlKGRldk51bSxjdHJsQURMTDEsICgweDEgKyAodWlDcyAqIENTX1JFR0lTVEVSX0FERFJfT0ZGU0VUKSkpOworCQl9CisJCS8qIHByaW50IGFkbGwgcmVzdWx0cyAqLworCQltdkh3c0RkcjNUaXBSZWFkQWRsbFZhbHVlKGRldk51bSxjdHJsQURMTCwgKHJlZyArIHVpQ3MgKiBDU19SRUdJU1RFUl9BRERSX09GRlNFVCksIE1BU0tfQUxMX0JJVFMpOworCQltdlByaW50ZigiJXMsRFFTLExldmVsaW5nLCwsIiwoZGlyZWN0aW9uPT0wKSA/ICJUeCI6IlJ4Iik7CisJCXByaW50QWRsbChkZXZOdW0sIGN0cmxBRExMKTsKKwkJcHJpbnRQaChkZXZOdW0sIGN0cmxMZXZlbFBoYXNlKTsKKwl9LypFbmQgb2YgQ1MqLworCisgICAgZGRyM1RpcFJlc2V0Rmlmb1B0cihkZXZOdW0pOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKIAogdm9pZCBwcmludFRvcG9sb2d5KE1WX0hXU19UT1BPTE9HWV9NQVAgKnBUb3BvbG9neURCKQogewogCUdUX1UzMiB1aSwgdWo7CiAKIAltdlByaW50ZigiXHRpbnRlcmZhY2VNYXNrOiAweCV4XG4iLCAgIHBUb3BvbG9neURCLT5pbnRlcmZhY2VBY3RpdmVNYXNrKTsKLQltdlByaW50ZigiXHROdW0gQnVzOiAgJWRcbiIsICAgcFRvcG9sb2d5REItPm51bU9mQnVzUGVySW50ZXJmYWNlKTsKKwltdlByaW50ZigiXHROdW0gQnVzOiAgJWRcbiIsICAgZGRyM1RpcERldkF0dHJHZXQoMCwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKSk7CiAJbXZQcmludGYoIlx0YWN0aXZlQnVzTWFzazogMHgleFxuIiwgICBwVG9wb2xvZ3lEQi0+YWN0aXZlQnVzTWFzayk7CiAKIAlmb3IoIHVpID0gMDsgdWkgPCBNQVhfSU5URVJGQUNFX05VTTsgdWkrKyApCkBAIC0xNTM4LDcgKzE3NDEsNyBAQAogCX0KIH0KICNlbmRpZgotCisjaWZuZGVmIEVYQ0xVREVfU1dJVENIX0RFQlVHCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEV4ZWN1dGUgWFNCIFRlc3QgdHJhbnNhY3Rpb24gKHJkL3dyL2JvdGgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNTc4LDE0ICsxNzgxLDcgQEAKIH0KIAogI2Vsc2UgLypFWENMVURFX1NXSVRDSF9ERUJVRyovCi1HVF9VMzIgcmxWZXJzaW9uID0gMTsgLyogMCAtIG9sZCBSTCBtYWNoaW5lICovCi1HVF9VMzIgdnJlZiA9IDB4NDsKIEdUX1UzMiAgc3RhcnRYc2JPZmZzZXQgPSAwOwotR1RfVTggY3NNYXNrUmVnW109Ci17Ci0gICAgMCwgNCwgOCwgMTIgLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi19OwotCiBHVF9TVEFUVVMgUnVuWHNiVGVzdChHVF9VMzIgZGV2TnVtLCBHVF9VMzIgdWlNZW1BZGRyZXNzLCBHVF9VMzIgd3JpdGVUeXBlLCBHVF9VMzIgcmVhZFR5cGUsIEdUX1UzMiBidXJzdExlbmd0aCkKIHsKIAlyZXR1cm4gR1RfT0s7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM0RlYnVnUnhJb0Jpc3QuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzRGVidWdSeElvQmlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhmZDRkMTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM0RlYnVnUnhJb0Jpc3QuYwpAQCAtMCwwICsxLDQ1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDEsIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuCisqIFRoaXMgY29kZSBjb250YWlucyBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24gb2YgTWFydmVsbCBzZW1pY29uZHVjdG9yLCBpbmMuCisqIG5vIHJpZ2h0cyBhcmUgZ3JhbnRlZCBoZXJlaW4gdW5kZXIgYW55IHBhdGVudCwgbWFzayB3b3JrIHJpZ2h0IG9yIGNvcHlyaWdodAorKiBvZiBNYXJ2ZWxsIG9yIGFueSB0aGlyZCBwYXJ0eS4KKyogTWFydmVsbCByZXNlcnZlcyB0aGUgcmlnaHQgYXQgaXRzIHNvbGUgZGlzY3JldGlvbiB0byByZXF1ZXN0IHRoYXQgdGhpcyBjb2RlCisqIGJlIGltbWVkaWF0ZWx5IHJldHVybmVkIHRvIE1hcnZlbGwuIFRoaXMgY29kZSBpcyBwcm92aWRlZCAiYXMgaXMiLgorKiBNYXJ2ZWxsIG1ha2VzIG5vIHdhcnJhbnRpZXMsIGV4cHJlc3MsIGltcGxpZWQgb3Igb3RoZXJ3aXNlLCByZWdhcmRpbmcgaXRzCisqIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3Mgb3IgcGVyZm9ybWFuY2UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkh3c0RkcjNEZWJ1Z1J4SW9CaXN0LmMuYworKgorKiBERVNDUklQVElPTjogUlggSU8gQklTVCBUZXN0CisqCisqCisqIERFUEVOREVOQ0lFUzoKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICRSZXZpc2lvbjogMjA0ICQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm12RGRyM1RyYWluaW5nSXBGbG93LmgiCisjaW5jbHVkZSAibXZEZHIzTG9nZ2luZ0RlZi5oIgorCisjaWYgZGVmaW5lZChNVl9IV1NfUlhfSU9fQklTVCkgfHwgZGVmaW5lZChNVl9IV1NfUlhfSU9fQklTVF9FVFApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWZpbml0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVZfSU9fQklTVF9QQVRURVJOX1NJWkUgICAgIDQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIGVudW1zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBlbnVtCit7CisgICAgVEVTVF9TVE9QLAorICAgIFRFU1RfU1RBUiwKKyAgICBURVNUX1NUT1BfQU5EX1NUQVJULAorfSBNVl9URVNUX0VOQUJMRTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIGdsb2JhbHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworR1RfVTMyIGlvQmlzdENvdW50ZXI7CitleHRlcm4gTVZfSFdTX1RPUE9MT0dZX01BUCAqdG9wb2xvZ3lNYXA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBQcmUtRGVjbGFyYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgbXZId3NJbml0RGF0YUFncnJlc3NvcihHVF9VOCBkZXZOdW0pOwordm9pZCBtdkh3c0luaXRDYUFncmVzc29yKEdUX1U4IGRldk51bSk7CitHVF9CT09MIG12SHdzRGF0YUFuZFN5bmNTZWxlY3QoR1RfVTggZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQsIEdUX1UzMiBwdXApOwordm9pZCBtdkh3c1NldFJ4UGJzRGVsYXkoR1RfVTggZGV2TnVtLCBHVF9VMzIgRHFWYWx1ZSwgR1RfVTMyIERxc1ZhbHVlKTsKK3ZvaWQgbXZId3NUZXN0RW5hYmxlKEdUX1U4IGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkLCBNVl9IV1NfQUNDRVNTX1RZUEUgcGh5QWNjZXNzLCBHVF9VMzIgcHVwLCBNVl9URVNUX0VOQUJMRSBlbk1vZGUpOwordm9pZCBtdkh3c1BoeUFuZFRlc3RSZXNldChHVF9VOCBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCwgTVZfSFdTX0FDQ0VTU19UWVBFIHBoeUFjY2VzcywgR1RfVTMyIHB1cCk7Cit2b2lkIG52SHdzSW9CaXN0VGVzdChHVF9VOCBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCk7Cit2b2lkIG12SHdzU2V0VmljdGltUGF0dGVybihHVF9VOCBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCk7Cit2b2lkIG12SHdzU2V0Tm9pc2VQYXR0ZXJuKEdUX1U4IGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkKTsKK3ZvaWQgbXZId3NJb0Jpc3RUZXN0UngoR1RfVTggZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQsIEdUX1UzMiBwdXAsR1RfVTMyIHZpY3RCaXQsIEdUX1UzMiBhZ3JCaXRzLCBHVF9VMzIgcnhBZGxsKTsKK0dUX1UzMiBtdkh3c0NvbmZpZ3VyZVR4QWRsbE9wdChHVF9VOCBkZXZOdW0sR1RfVTMyIGludGVyZmFjZUlkLCBHVF9VMzIgcHVwLCBHVF9VMzIgVmljdEJpdCwgR1RfVTMyIEFnckJpdHMsIEdUX1UzMiBkaXJyZWN0aW9uKTsKK3ZvaWQgbXZId3NGaWxsUGF0dGVybihHVF9VOCBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCwgR1RfQk9PTCBpc05vaXNlLCBHVF9VMzIgcGF0dGVybltNVl9JT19CSVNUX1BBVFRFUk5fU0laRV0pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitHVF9TVEFUVVMgbXZId3NJb0Jpc3RUZXN0KEdUX1U4IGRldk51bSkKK3sKKyAgICBHVF9VMzIgaW50ZXJmYWNlSWQ7CisKKyAgICBtdkh3c1NldFJ4UGJzRGVsYXkoZGV2TnVtLCAweDFGLCAweEYpOworCisjaWZkZWYgTVZfSFdTX1JYX0lPX0JJU1RfRVRQCisgICAgbXZId3NJbml0Q2FBZ3Jlc3NvcihkZXZOdW0pOworI2VuZGlmIC8qIE1WX0hXU19SWF9JT19CSVNUX0VUUCAqLworCisgICAgbXZId3NJbml0RGF0YUFncnJlc3NvcihkZXZOdW0pOworCisgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPCBNQVhfSU5URVJGQUNFX05VTTsgaW50ZXJmYWNlSWQrKykKKyAgICB7CisgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCisgICAgICAgIG52SHdzSW9CaXN0VGVzdChkZXZOdW0sIGludGVyZmFjZUlkKTsKKyAgICB9CisKKyAgICByZXR1cm4gR1RfT0s7Cit9CisKK3ZvaWQgbXZId3NTZXRSeFBic0RlbGF5KEdUX1U4IGRldk51bSwgR1RfVTMyIERxVmFsdWUsIEdUX1UzMiBEcXNWYWx1ZSkKK3sKKyAgICBHVF9VMzIgaW50ZXJmYWNlSWQ7CisgICAgR1RfVTMyIGJ1c051bTsKKyAgICBHVF9VMzIgb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOworCisgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKKyAgICB7CisgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCisgICAgICAgIGZvciAoYnVzTnVtPTA7IGJ1c051bTxvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c051bSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNOdW0pCisgICAgICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNOdW0sIEREUl9QSFlfREFUQSwgMHg1ZiwgRHFWYWx1ZSk7CisgICAgICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNOdW0sIEREUl9QSFlfREFUQSwgMHg1NCwgRHFzVmFsdWUpOworICAgICAgICAgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzTnVtLCBERFJfUEhZX0RBVEEsIDB4NTUsIERxc1ZhbHVlKTsKKyAgICAgICAgICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c051bSwgRERSX1BIWV9EQVRBLCAweDIsIDB4REYpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIG12SHdzSW5pdENhQWdyZXNzb3IoR1RfVTggZGV2TnVtKQoreworICAgIEdUX1UzMiBpbnRlcmZhY2VJZDsKKworICAgIC8qYWdncmVzc2l2ZSBwYXR0ZXJuIGZvciBhbGwgQy9BIHNpZ25hbHMqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAtMTUgICAxNi0zMSAgIDMyLTQ3ICAgNDgtNjMgKi8KKyAgICBHVF9VMzIgYWRkcktpbGxlclBhdHRlcm5bTVZfSU9fQklTVF9QQVRURVJOX1NJWkVdID0geyAweGNmYzAsIDB4MzMwYywgMHgzMzMzLCAweGMwY2MgfTsKKworICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCisgICAgeworICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorCisgICAgICAgIC8qVHggRVRQIG1vZGUqLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0NPTlRST0wsIDB4QjAsIDB4Mik7CisKKyAgICAgICAgLypDb250aW51b3VzIG1vZGUqLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0NPTlRST0wsIDB4QzgsIDB4MSk7CisKKyAgICAgICAgLyogUEhZICYgVGVzdCByZXNldC91bi1yZXNldCovCisgICAgICAgIG12SHdzUGh5QW5kVGVzdFJlc2V0KGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUpOworCisgICAgICAgIC8qZmlsbCBGSUZPIHdpdGggYWdncmVzc2l2ZSBwYXR0ZXJuKi8KKyAgICAgICAgbXZId3NGaWxsUGF0dGVybihkZXZOdW0sIGludGVyZmFjZUlkLCBHVF9GQUxTRSwgYWRkcktpbGxlclBhdHRlcm4pOworCisgICAgICAgIC8qY2xvY2sgTiBpbnZlcnQqLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0NPTlRST0wsIDB4QjYsIDB4Qyk7CisKKyAgICAgICAgLypTZWxlY3QgTm9pc2UgRklGTyovCisgICAgICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfQ09OVFJPTCwgMHhCNCwgMHgwKTsKKworICAgICAgICAvKlN0b3AgJiBTdGFydCBUZXN0Ki8KKyAgICAgICAgbXZId3NUZXN0RW5hYmxlKGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIFRFU1RfU1RPUF9BTkRfU1RBUlQpOworICAgIH0KK30KKwordm9pZCBtdkh3c0luaXREYXRhQWdycmVzc29yKEdUX1U4IGRldk51bSkKK3sKKyAgICBHVF9VMzIgaW50ZXJmYWNlSWQ7CisKKyAgICAvKmFnZ3Jlc3NpdmUgcGF0dGVybiBmb3IgYWxsIERhdGEgc2lnbmFscyovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMC0xNSAgIDE2LTMxICAgMzItNDcgICA0OC02MyAqLworICAgIEdUX1UzMiBkYXRhS2lsbGVyUGF0dGVybls0XSA9IHsgMHg1MmI4LCAweDhhNTUsIDB4YTZiMywgMHgwNjZkIH07CisKKyAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQorICAgIHsKKyAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKyAgICAgICAgLypUeCBFVFAgbW9kZSovCisgICAgICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgMHhCMCwgMHgyKTsKKworICAgICAgICAvKkNvbnRpbnVvdXMgbW9kZSovCisgICAgICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgMHhDOCwgMHgxKTsKKworICAgICAgICAvKiBQSFkgJiBUZXN0IHJlc2V0L3VuLXJlc2V0Ki8KKyAgICAgICAgbXZId3NQaHlBbmRUZXN0UmVzZXQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSk7CisKKyAgICAgICAgLypmaWxsIEZJRk8gd2l0aCBhZ2dyZXNzaXZlIHBhdHRlcm4qLworICAgICAgICBtdkh3c0ZpbGxQYXR0ZXJuKGRldk51bSwgaW50ZXJmYWNlSWQsIEdUX0ZBTFNFLCBkYXRhS2lsbGVyUGF0dGVybik7CisKKyAgICAgICAgLypTZWxlY3QgTm9pc2UgRklGTyovCisgICAgICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgMHhCNCwgMHgzMCk7CisKKyAgICAgICAgLypTdG9wICYgU3RhcnQgVGVzdCovCisgICAgICAgIG12SHdzVGVzdEVuYWJsZShkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBURVNUX1NUT1BfQU5EX1NUQVJUKTsKKyAgICB9Cit9CisKK3ZvaWQgbnZId3NJb0Jpc3RUZXN0KEdUX1U4IGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkKQoreworICAgIEdUX1UzMiBkcTsKKyAgICBHVF9VMzIgQWdyQml0czsKKyAgICBHVF9VMzIgVmljdEJpdDsKKyAgICBHVF9VMzIgcHVwOworICAgIEdUX1UzMiB0eEFkbGw7CisgICAgR1RfVTMyIHJ4QWRsbDsKKyAgICBHVF9VMzIgbWFzayA9IDB4N2ZmOworICAgIEdUX1UzMiByZXN1bHRzW01BWF9JTlRFUkZBQ0VfTlVNXVtNQVhfQlVTX05VTV1bTUFYX0RRX05VTV07CisKKyAgICBHVF9VMzIgb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOworCisgICAgbXZQcmludGYoIm9jdGV0c1BlckludGVyZmFjZU51bTogJWRcbiIsb2N0ZXRzUGVySW50ZXJmYWNlTnVtKTsKKworICAgIG12SHdzU2V0VmljdGltUGF0dGVybihkZXZOdW0sIGludGVyZmFjZUlkKTsKKworICAgIGZvcihkcSA9IDA7IGRxIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtICogOCA7IGRxKyspCisgICAgeworICAgICAgICBwdXAgPSBkcS84OworCisgICAgICAgIFZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKKyAgICAgICAgVmljdEJpdCA9IGRxJTg7CisgICAgICAgIEFnckJpdHMgPSAoVmljdEJpdCA+IDMpID8gKH4oMTw8KFZpY3RCaXQgKyAyKSkgJiBtYXNrKSA6ICh+KDE8PFZpY3RCaXQpICYgbWFzayk7IC8qIGVhY2ggcHVwPTExIEJpdHMgIDggZHEgYml0cywgQml0cyA0ICYgNSBhcmUgRFFTLCBCaXQgMTA9RE0gKi8KKworICAgICAgICBtdkh3c1NldE5vaXNlUGF0dGVybihpbnRlcmZhY2VJZCwgcHVwKTsKKyAgICAgICAgaHdzT3NFeGFjdERlbGF5UHRyKChHVF9VOClkZXZOdW0sIGRldk51bSwgMTApOworCisgICAgICAgIC8qIFBIWSAmIFRlc3QgcmVzZXQvdW4tcmVzZXQqLworICAgICAgICBtdkh3c1BoeUFuZFRlc3RSZXNldChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXApOworCisgICAgICAgIC8qU3RvcCBUZXN0Ki8KKyAgICAgICAgbXZId3NUZXN0RW5hYmxlKGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgVEVTVF9TVE9QKTsKKworICAgICAgICB0eEFkbGwgPSBtdkh3c0NvbmZpZ3VyZVR4QWRsbE9wdChkZXZOdW0sIGludGVyZmFjZUlkLCBwdXAsIFZpY3RCaXQsIEFnckJpdHMsIDEpICsgMTsKKyAgICAgICAgaWYgKCh0eEFkbGwgPiAwKSAmJiAodHhBZGxsIDwgNSkpIHsKKyAgICAgICAgICAgIHR4QWRsbCA9IG12SHdzQ29uZmlndXJlVHhBZGxsT3B0KGRldk51bSwgaW50ZXJmYWNlSWQsIHB1cCwgVmljdEJpdCwgQWdyQml0cywgMCkgLSAxOworICAgICAgICB9CisgICAgICAgIG12UHJpbnRmKCJ0eEFkbGw6ICVkXG4iLHR4QWRsbCk7CisKKyAgICAgICAgLypTZXQgT3B0aW1hbCBEUVNfV1IqLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHgxLCB0eEFkbGwpOworCisgICAgICAgIC8qU2V0IE9wdGltYWwgUmVjZWl2ZXIgQ2FsaWJyYXRpb24qLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHhEQiwgMHgzRik7CisKKyAgICAgICAgZm9yKHJ4QWRsbCA9IDA7IHJ4QWRsbCA8IDMyOyByeEFkbGwrKykgICAvKiBTZWFyY2ggUlggV2luZG93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFBIWSAmIFRlc3QgcmVzZXQvdW4tcmVzZXQqLworICAgICAgICAgICAgbXZId3NQaHlBbmRUZXN0UmVzZXQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwKTsKKworICAgICAgICAgICAgLypTdG9wIFRlc3QqLworICAgICAgICAgICAgbXZId3NUZXN0RW5hYmxlKGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgVEVTVF9TVE9QKTsKKworICAgICAgICAgICAgLypTZXQgQ3VycmVudCBSeCBBRExMKi8KKyAgICAgICAgICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgRERSX1BIWV9EQVRBLCAweDMsIHJ4QWRsbCk7CisgICAgICAgICAgICBtdkh3c0lvQmlzdFRlc3RSeChkZXZOdW0saW50ZXJmYWNlSWQscHVwLFZpY3RCaXQsIEFnckJpdHMsIHJ4QWRsbCk7CisgICAgICAgIH0KKyAgICAgICAgLypSZXNldCBEUVNfV1IqLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHgxLCAweDApOworICAgICAgICAvKlJlc2V0IERRU19SRCovCisgICAgICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgRERSX1BIWV9EQVRBLCAweDMsIDB4MCk7CisgICAgICAgIG12UHJpbnRmKCJcbiAjIyMjIyMjIyMjIFJ4IC0gd2luIHNpemU6ICVkICMjIyMjIyMjI1xuIixpb0Jpc3RDb3VudGVyKTsKKyAgICAgICAgcmVzdWx0c1tpbnRlcmZhY2VJZF1bcHVwXVtkcSU4XSA9IGlvQmlzdENvdW50ZXI7CisgICAgICAgIGlvQmlzdENvdW50ZXIgPSAwOworICAgIH0KKyAgICAvKnByaW50IGZpbmFsIHJlc3VsdHMqLworICAgIG12UHJpbnRmKCJJbnRlcmZhY2UgICAgIFBVUCAgICAgQklUICAgICBYX1dJTl9TSVpFXG4iKTsKKyAgICBtdlByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDwgTUFYX0lOVEVSRkFDRV9OVU07IGludGVyZmFjZUlkKyspCisgICAgeworICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorICAgICAgICBmb3IgKHB1cD0wOyBwdXA8b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBwdXArKykKKyAgICAgICAgeworICAgICAgICAgICAgVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQorICAgICAgICAgICAgZm9yKGRxID0gMDsgZHEgPCA4IDsgZHErKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtdlByaW50ZigiJWQgICAgICAgICVkICAgICAgJWQgICAgICAlZFxuIixpbnRlcmZhY2VJZCxwdXAsZHEscmVzdWx0c1tpbnRlcmZhY2VJZF1bcHVwXVtkcSU4XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgbXZId3NUZXN0RW5hYmxlKEdUX1U4IGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkLCBNVl9IV1NfQUNDRVNTX1RZUEUgcGh5QWNjZXNzLCBHVF9VMzIgcHVwLCBNVl9URVNUX0VOQUJMRSBlbk1vZGUpCit7CisgICAgaWYoKGVuTW9kZSA9PSBURVNUX1NUT1ApIHx8IChlbk1vZGUgPT0gVEVTVF9TVE9QX0FORF9TVEFSVCkpCisgICAgeworICAgICAgICAvKlN0b3AgVGVzdCovCisgICAgICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIHBoeUFjY2VzcywgcHVwLCBERFJfUEhZX0RBVEEsIDB4QjEsIDB4MCk7CisgICAgICAgIGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEwKTsKKyAgICB9CisKKyAgICBpZigoZW5Nb2RlID09IFRFU1RfU1RBUikgfHwgKGVuTW9kZSA9PSBURVNUX1NUT1BfQU5EX1NUQVJUKSkKKyAgICB7CisgICAgICAgIC8qU3RhcnQgVGVzdCovCisgICAgICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIHBoeUFjY2VzcywgcHVwLCBERFJfUEhZX0RBVEEsIDB4QjEsIDB4MSk7CisgICAgICAgIGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEwKTsKKyAgICB9Cit9CisKK3ZvaWQgbXZId3NQaHlBbmRUZXN0UmVzZXQoR1RfVTggZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQsIE1WX0hXU19BQ0NFU1NfVFlQRSBwaHlBY2Nlc3MsIEdUX1UzMiBwdXApCit7CisgICAgLypQaHkgUmVzZXQqLworICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIHBoeUFjY2VzcywgcHVwLCBERFJfUEhZX0RBVEEsIDB4OTAsIDB4Mik7CisgICAgaHdzT3NFeGFjdERlbGF5UHRyKChHVF9VOClkZXZOdW0sIGRldk51bSwgMTApOworCisgICAgLypQaHkgVW4tUmVzZXQqLworICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIHBoeUFjY2VzcywgcHVwLCBERFJfUEhZX0RBVEEsIDB4OTAsIDB4MjAwMik7CisgICAgaHdzT3NFeGFjdERlbGF5UHRyKChHVF9VOClkZXZOdW0sIGRldk51bSwgMTApOworCisgICAgLypUZXN0IFJlc2V0Ki8KKyAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBwaHlBY2Nlc3MsIHB1cCwgRERSX1BIWV9EQVRBLCAweEJELCAweDEpOworICAgIGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEwKTsKKworICAgIC8qVGVzdCBVbi1SZXNldCovCisgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgcGh5QWNjZXNzLCBwdXAsIEREUl9QSFlfREFUQSwgMHhCRCwgMHgwKTsKKyAgICBod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCAxMCk7Cit9CisKK3ZvaWQgbXZId3NGaWxsUGF0dGVybihHVF9VOCBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCwgR1RfQk9PTCBpc05vaXNlLCBHVF9VMzIgcGF0dGVybltNVl9JT19CSVNUX1BBVFRFUk5fU0laRV0pCit7CisgICAgR1RfVTMyIG9mZnNldCA9IChpc05vaXNlKSA/IDB4QzQgOiAweEMwOworICAgIEdUX1U4IGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBNVl9JT19CSVNUX1BBVFRFUk5fU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9EQVRBLCBvZmZzZXQgKyBpLCBwYXR0ZXJuW2ldKTsKKyAgICB9Cit9CisKK3ZvaWQgbXZId3NTZXRWaWN0aW1QYXR0ZXJuKEdUX1U4IGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkKQoreworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwLTE1ICAgMTYtMzEgICAzMi00NyAgIDQ4LTYzICovCisgICAgR1RfVTMyIGtpbGxlclZpY3RQYXR0ZXJuW01WX0lPX0JJU1RfUEFUVEVSTl9TSVpFXSA9IHsgMHhCOUE2LCAweDQ1QTYsIDB4NTgxOSwgMHhEQjlBIH07CisKKyAgICAvKmZpbGwgRklGTyB3aXRoIGFnZ3Jlc3NpdmUgcGF0dGVybiovCisgICAgbXZId3NGaWxsUGF0dGVybihkZXZOdW0sIGludGVyZmFjZUlkLCBHVF9UUlVFLCBraWxsZXJWaWN0UGF0dGVybik7CisKKyAgICAvKlRCRCAtIG5lZWQgdG8gZXh0ZW5kIGZvciBCQzIqLworfQorCit2b2lkIG12SHdzU2V0Tm9pc2VQYXR0ZXJuKEdUX1U4IGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkKQoreworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwLTE1ICAgMTYtMzEgICAzMi00NyAgIDQ4LTYzICovCisgICAgR1RfVTMyIGFsbFplcm9QYXR0ZXJuW01WX0lPX0JJU1RfUEFUVEVSTl9TSVpFXSA9IHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH07CisKKyAgICAvKmZpbGwgRklGTyB3aXRoIGFnZ3Jlc3NpdmUgcGF0dGVybiovCisgICAgbXZId3NGaWxsUGF0dGVybihkZXZOdW0sIGludGVyZmFjZUlkLCBHVF9GQUxTRSwgYWxsWmVyb1BhdHRlcm4pOworCisgICAgLypUQkQgLSBuZWVkIHRvIGV4dGVuZCBmb3IgQkMyKi8KK30KKwordm9pZCBtdkh3c0lvQmlzdFRlc3RSdW4oR1RfVTggZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQsIEdUX1UzMiBwdXAsIEdUX1UzMiB2aWN0Qml0LCBHVF9VMzIgYWdyQml0cykKK3sKKyAgICBHVF9VMzIgdGltZW91dCA9IDA7CisgICAgR1RfVTMyIGRhdGFWYWw7CisKKyAgICAvKkNvbmZpZ3VyZSBJL08gYmlzdCBNb2RlKi8KKyAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHhCMCwgMHgzKTsKKworICAgIC8qU2V0IFJlcGVhdCB0byAzMSovCisgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIDB4QkUsIDB4Rik7CisKKyAgICAvKkNvbmZpZ3VyZSBjb250aW51b3VzIG1vZGUgdG8gYWN0aXZlKi8KKyAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHhDOCwgMHgxKTsKKworICAgIC8qQ29uZmlndXJlIFN5bmMgUGF0dGVybiB0byAweDcqLworICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgRERSX1BIWV9EQVRBLCAweEJDLCAweDcpOworCisgICAgLyogUEhZICYgVGVzdCByZXNldC91bi1yZXNldCovCisgICAgbXZId3NQaHlBbmRUZXN0UmVzZXQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwKTsKKworICAgIC8qU2VsZWN0IFJ4IEJpdCovCisgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIDB4QjgsIHZpY3RCaXQpOworCisgICAgLypTZWxlY3QgQWdncmVzc29yKi8KKyAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHhCNCwgYWdyQml0cyk7CisKKyAgICAvKlN0b3AgJiBTdGFydCBUZXN0Ki8KKyAgICBtdkh3c1Rlc3RFbmFibGUoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBURVNUX1NUT1BfQU5EX1NUQVJUKTsKKworICAgIGRvCisgICAgeworICAgICAgICBtdkh3c0RkcjNUaXBCVVNSZWFkKGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgRERSX1BIWV9EQVRBLCAweEIxLCAmZGF0YVZhbCk7CisgICAgICAgIGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEwKTsKKyAgICAgICAgaWYgKHRpbWVvdXQrKz4xNikKKyAgICAgICAgeworICAgICAgICAgICAgLypTdG9wIFRlc3QqLworICAgICAgICAgICAgbXZId3NUZXN0RW5hYmxlKGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgVEVTVF9TVE9QKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGRhdGFWYWwgPT0gMSk7Cit9CisKK0dUX0JPT0wgbXZId3NEYXRhQW5kU3luY1NlbGVjdChHVF9VOCBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCwgR1RfVTMyIHB1cCkKK3sKKyAgICBHVF9VMzIgZGF0YVJlc3VsdDsKKyAgICBHVF9VMzIgc3luY1Jlc3VsdDsKKyAgICBHVF9VMzIgZGF0YVZhbDsKKworICAgIC8qRGF0YSBTZWxlY3QqLworICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgRERSX1BIWV9EQVRBLCAweEI3LCAweDEpOworICAgIGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEwKTsKKyAgICBtdkh3c0RkcjNUaXBCVVNSZWFkKGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgRERSX1BIWV9EQVRBLCAweEIyLCAmZGF0YVZhbCk7CisgICAgZGF0YVJlc3VsdCA9IGRhdGFWYWw7CisKKyAgICAvKlN5bmMgU2VsZWN0Ki8KKyAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHhCNywgMHgwKTsKKyAgICBod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCAxMCk7CisgICAgbXZId3NEZHIzVGlwQlVTUmVhZChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHhCMiwgJmRhdGFWYWwpOworICAgIHN5bmNSZXN1bHQgPSBkYXRhVmFsOworCisgICAgcmV0dXJuICgoZGF0YVJlc3VsdCA9PSAwKSAmJiAoc3luY1Jlc3VsdCA9PSAwKSkgPyBHVF9UUlVFIDogR1RfRkFMU0U7Cit9CisKK0dUX1UzMiBtdkh3c0NvbmZpZ3VyZVR4QWRsbE9wdChHVF9VOCBkZXZOdW0sR1RfVTMyIGludGVyZmFjZUlkLCBHVF9VMzIgcHVwLCBHVF9VMzIgdmljdEJpdCwgR1RfVTMyIGFnckJpdHMsIEdUX1UzMiBkaXJyZWN0aW9uKQoreworCUdUX1UzMiB0eEFkbGw7CisJR1RfVTMyIGVuZExvb3A7CisgICAgR1RfQk9PTCBpc1Bhc3M7CisKKwltdlByaW50ZigiZGlyZWN0aW9uID0gJWRcbiIsZGlycmVjdGlvbik7CisJaWYgKGRpcnJlY3Rpb24pIHsKKwkJZW5kTG9vcCA9IDY0OworCQl0eEFkbGwgPSA1OworCX0gZWxzZSB7CisJCWVuZExvb3AgPSAwOworCQl0eEFkbGwgPSA2NDsKKwl9CisKKwkvKlNldCBSeCBBZGxsIHRvIG1pbiovCisJbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIDB4MywgMHgwKTsKKworCXdoaWxlKHR4QWRsbCAhPSBlbmRMb29wKQorCXsKKyAgICAgICAgaWYgKGRpcnJlY3Rpb24pIHsKKyAgICAgICAgICAgIHR4QWRsbCArKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHR4QWRsbCAtLTsKKyAgICAgICAgfQorCisgICAgICAgIC8qU2V0IFR4IEFkbGwqLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHgxLCB0eEFkbGwpOworCisgICAgICAgIC8qIFJ1biBJL08gQklTVCB0ZXN0ICovCisgICAgICAgIG12SHdzSW9CaXN0VGVzdFJ1bihkZXZOdW0sIGludGVyZmFjZUlkLCBwdXAsIHZpY3RCaXQsIGFnckJpdHMpOworCisgICAgICAgIC8qIENoZWNrIGlmIFN5bmMgYW5kL29yIERhdGEgcGFzcyAqLworICAgICAgICBpc1Bhc3MgPSBtdkh3c0RhdGFBbmRTeW5jU2VsZWN0KGRldk51bSwgaW50ZXJmYWNlSWQsIHB1cCk7CisgICAgICAgIGlmKGlzUGFzcykKKyAgICAgICAgeworICAgICAgICAgICAgLyogbG9va2luZyBmb3IgZmFpbHVyZSBzbyBjb250aW51ZSB0aGUgc2VhcmNoICovCisgICAgICAgICAgICBtdlByaW50ZigiLiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHR4QWRsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHdlIHNob3VsZG4ndCByZWFjaCB0aGlzIHBvaW50LiBpZiBzbywgaXQncyBlbiBlcnJvciAqLworICAgIG12UHJpbnRmKCJtdkh3c0NvbmZpZ3VyZVR4QWRsbE9wdDogRXJyb3I6IGNvdWxkbid0IGZpbmQgZmFpbHVyZSBwb2ludFxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBtdkh3c0lvQmlzdFRlc3RSeChHVF9VOCBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCwgR1RfVTMyIHB1cCxHVF9VMzIgdmljdEJpdCwgR1RfVTMyIGFnckJpdHMsIEdUX1UzMiByeEFkbGwpCit7CisgICAgR1RfQk9PTCBpc1Bhc3M7CisKKyAgICAvKiBSdW4gSS9PIEJJU1QgdGVzdCAqLworICAgIG12SHdzSW9CaXN0VGVzdFJ1bihkZXZOdW0sIGludGVyZmFjZUlkLCBwdXAsIHZpY3RCaXQsIGFnckJpdHMpOworCisgICAgbXZQcmludGYoImludGVyZmFjZUlkOiAlZCAgIFBVUDogJWQgICBWaWN0Qml0OiAlZCAgQWdyQml0czogMHgleCAgcnhBZGxsOiAlZCAtLT4gIixpbnRlcmZhY2VJZCwgcHVwLCB2aWN0Qml0LCBhZ3JCaXRzLCByeEFkbGwpOworCisgICAgLyogQ2hlY2sgaWYgU3luYyBhbmQvb3IgRGF0YSBwYXNzICovCisgICAgaXNQYXNzID0gbXZId3NEYXRhQW5kU3luY1NlbGVjdChkZXZOdW0sIGludGVyZmFjZUlkLCBwdXApOworICAgIGlmKGlzUGFzcykKKyAgICB7CisgICAgICAgIG12UHJpbnRmKCJQQVNTXG4iKTsKKyAgICAgICAgaW9CaXN0Q291bnRlcisrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtdlByaW50ZigiLS0tLS1cbiIpOworICAgIH0KK30KKworI2VuZGlmIC8qIGRlZmluZWQoTVZfSFdTX1JYX0lPX0JJU1QpIHx8IGRlZmluZWQoTVZfSFdTX1JYX0lPX0JJU1RfRVRQKSAqLworCisKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmcuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmcuYwppbmRleCAzMjY5MzlkLi43YTVmNDg1IDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nLmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZy5jCkBAIC0zMSwxMCArMzEsNiBAQAogI2luY2x1ZGUgIm12RGRyM1RyYWluaW5nSXBQcnZJZi5oIgogI2luY2x1ZGUgIm12RGRyM0xvZ2dpbmdEZWYuaCIKIAotI2lmZGVmIENPTkZJR19ERFI0Ci0jaW5jbHVkZSAibXZId3NEZHI0VHJhaW5pbmcuaCIKLSNpbmNsdWRlICJtdkh3c0RkcjRNcHJQZGFJZi5oIgotI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEZyZWVSVE9TCiAjZGVmaW5lIERGWF9CQVIxX0JBU0UgICAgICAgICgweDgwMDAwMDAwKQpAQCAtNTAsNyArNDYsNiBAQAogLyojZGVmaW5lIFRJTUVfMl9DTE9DS19DWUNMRVMocHJtLCBjbGspICAgKChwcm0tMSkvY2xrKSovCiAjZGVmaW5lIFRJTUVfMl9DTE9DS19DWUNMRVMgICAgICAgICAgICAgQ0VJTF9ESVZJREUKIAotCiAjZGVmaW5lIEdFVF9DU19GUk9NX01BU0sobWFzaykgKGNzTWFzazJOdW1bbWFza10pCiAjZGVmaW5lIENTX0NCRV9WQUxVRShjc051bSkgICAoY3NDYmVSZWdbY3NOdW1dKQogCkBAIC02Miw3ICs1Nyw3IEBACiBHVF9VMzIgIFBoeVJlZzBWYWwgPSAwOwogR1RfVTMyICBQaHlSZWcxVmFsID0gODsKIEdUX1UzMiAgUGh5UmVnMlZhbCA9IDA7Ci1HVF9VMzIgIFBoeVJlZzNWYWwgPSAweEE7CitHVF9VMzIgIFBoeVJlZzNWYWwgPSBNVl9QQVJBTVNfVU5ERUZJTkVEOwogTVZfSFdTX0REUl9GUkVRIGluaXRGcmVxID0gRERSX0ZSRVFfNjY3OwogTVZfSFdTX0REUl9GUkVRIGxvd0ZyZXEgPSBERFJfRlJFUV9MT1dfRlJFUTsKIE1WX0hXU19ERFJfRlJFUSBtZWRpdW1GcmVxOwpAQCAtNzEsMTMgKzY2LDkgQEAKIEdUX1UzMiogZHFNYXBUYWJsZSA9IE5VTEw7CiBHVF9VMzIgb2R0Q29uZmlnID0gMTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZCAoQ09ORklHX0FSTUFEQV8zOVgpCi1HVF9VOCAgaXNQbGxCZWZvcmVJbml0ID0gMCwgaXNBZGxsQ2FsaWJCZWZvcmVJbml0ID0gMCwgaXNEZnNJbkluaXQgPSAwOwotR1RfVTMyIGRmc0xvd0ZyZXEgPSAxMzA7Ci0jZWxzZQogR1RfVTggIGlzUGxsQmVmb3JlSW5pdCA9IDAsIGlzQWRsbENhbGliQmVmb3JlSW5pdCA9IDEsIGlzRGZzSW5Jbml0ID0gMDsKLUdUX1UzMiBkZnNMb3dGcmVxID0gMTAwOwotI2VuZGlmCitHVF9VMzIgZGZzTG93RnJlcTsKKwogR1RfVTMyIGdSdHROb21DUzAsIGdSdHROb21DUzE7CiBHVF9VOCBjYWxpYnJhdGlvblVwZGF0ZUNvbnRyb2w7IC8qMiBleHRlcm5hbCBvbmx5LCAxIGlzIGludGVybmFsIG9ubHkqLwogCkBAIC0xMDksMTIgKzEwMCwyNSBAQAogR1RfVTMyIGRlbGF5RW5hYmxlID0gMDsKIHN0YXRpYyBHVF9VMzIgZnJlcU1hc2tbSFdTX01BWF9ERVZJQ0VfTlVNXVtERFJfRlJFUV9MSU1JVF07CiBHVF9CT09MIHJsTWlkRnJlcVdBID0gR1RfRkFMU0U7Ci1leHRlcm4gR1RfVTMyIGRkcjRUaXBDb25maWd1cmVQaHlWcmVmVGFwOwogCi0jaWYgZGVmaW5lZCAoQ09ORklHX0FMTEVZQ0FUMykKLUdUX1UzMiBtdkh3c21lbVNpemVbXSA9IHsgQUREUl9TSVpFXzUxMk1iLCBBRERSX1NJWkVfMUdiLCBBRERSX1NJWkVfMkdiLCBBRERSX1NJWkVfNEdiICxBRERSX1NJWkVfOEdiIH07Ci0jZGVmaW5lICBNVl9ERVZJQ0VfTUFYX0RSQU1fQUREUkVTU19TSVpFICAgICAgICAgIEFERFJfU0laRV8yR2IKLSNlbmRpZgorR1RfVTMyIHZyZWZJbml0aWFsVmFsdWUgPSAweDQ7CitHVF9VMzIgY2tEZWxheSA9IE1WX1BBUkFNU19VTkRFRklORUQ7CisKKy8qRGVzaWduIEd1aWRlbGluZXMgcGFyYW1ldGVycyovCitHVF9VMzIgZ1pwcmlEYXRhID0gTVZfUEFSQU1TX1VOREVGSU5FRDsgLyogY29udHJvbGxlciBkYXRhIC0gUCBkcml2ZSBzdHJlbmd0aCAqLworR1RfVTMyIGdabnJpRGF0YSA9IE1WX1BBUkFNU19VTkRFRklORUQ7IC8qIGNvbnRyb2xsZXIgZGF0YSAtIE4gZHJpdmUgc3RyZW5ndGggKi8KK0dUX1UzMiBnWnByaUN0cmwgPSBNVl9QQVJBTVNfVU5ERUZJTkVEOyAvKiBjb250cm9sbGVyIEMvQSAtIFAgZHJpdmUgc3RyZW5ndGggKi8KK0dUX1UzMiBnWm5yaUN0cmwgPSBNVl9QQVJBTVNfVU5ERUZJTkVEOyAvKiBjb250cm9sbGVyIEMvQSAtIE4gZHJpdmUgc3RyZW5ndGggKi8KKworR1RfVTMyIGdacG9kdERhdGEgPSBNVl9QQVJBTVNfVU5ERUZJTkVEOyAvKiBjb250cm9sbGVyIGRhdGEgLSBQIE9EVCAqLworR1RfVTMyIGdabm9kdERhdGEgPSBNVl9QQVJBTVNfVU5ERUZJTkVEOyAvKiBjb250cm9sbGVyIGRhdGEgLSBOIE9EVCAqLworR1RfVTMyIGdacG9kdEN0cmwgPSBNVl9QQVJBTVNfVU5ERUZJTkVEOyAvKiBjb250cm9sbGVyIGRhdGEgLSBQIE9EVCAqLworR1RfVTMyIGdabm9kdEN0cmwgPSBNVl9QQVJBTVNfVU5ERUZJTkVEOyAvKiBjb250cm9sbGVyIGRhdGEgLSBOIE9EVCAqLworCitHVF9VMzIgdWlPRFRDb25maWcgPSBNVl9QQVJBTVNfVU5ERUZJTkVEOworR1RfVTMyIGdSdHROb20gPSBNVl9QQVJBTVNfVU5ERUZJTkVEOworR1RfVTMyIGdSdHRXUiA9IE1WX1BBUkFNU19VTkRFRklORUQ7CitHVF9VMzIgZ0RpYyA9IE1WX1BBUkFNU19VTkRFRklORUQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBnbG9iYWxzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTM0LDEzICsxMzgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICBDRU5UUkFMSVpBVElPTl9SWF9NQVNLX0JJVCAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgQ0VOVFJBTElaQVRJT05fVFhfTUFTS19CSVQgICApOwogCi12b2lkIGRkcjNQcmludFZlcnNpb24oKQotewotCW12UHJpbnRmKEREUjNfVElQX1ZFUlNJT05fU1RSSU5HKTsKLX0KLQotCi0KIGV4dGVybiBHVF9VMzIgaXNQbGxPbGQ7CiBleHRlcm4gQ2xWYWx1ZVBlckZyZXEgY2FzTGF0ZW5jeVRhYmxlW107CiBleHRlcm4gUGF0dGVybkluZm8gcGF0dGVyblRhYmxlW10gOwpAQCAtMTU2LDIxICsxNTMsNyBAQAogZXh0ZXJuIEdUX1UxNiByZmNUYWJsZVtdOwogZXh0ZXJuIEdUX1UzMiBzcGVlZEJpblRhYmxlVFJjW107CiBleHRlcm4gR1RfVTMyIHNwZWVkQmluVGFibGVUUmNkVFJwW107Ci1leHRlcm4gR1RfVTMyIGNrRGVsYXksIGNrRGVsYXlfMTY7Ci1leHRlcm4gR1RfVTMyIGdacHJpRGF0YTsKLWV4dGVybiBHVF9VMzIgZ1pucmlEYXRhOwotZXh0ZXJuIEdUX1UzMiBnWnByaUN0cmw7Ci1leHRlcm4gR1RfVTMyIGdabnJpQ3RybDsKLQotZXh0ZXJuIEdUX1UzMiBnWnBvZHREYXRhOwotZXh0ZXJuIEdUX1UzMiBnWm5vZHREYXRhOwotZXh0ZXJuIEdUX1UzMiBnWnBvZHRDdHJsOwotZXh0ZXJuIEdUX1UzMiBnWm5vZHRDdHJsOwotCi1leHRlcm4gR1RfVTMyIGdEaWM7Ci1leHRlcm4gR1RfVTMyIHVpT0RUQ29uZmlnOwotZXh0ZXJuIEdUX1UzMiBnUnR0Tm9tOwotCitleHRlcm4gR1RfVTMyIG12TWVtU2l6ZVtdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJlLWRlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgR1RfU1RBVFVTICAgIGRkcjNUaXBERFIzRGRyM1RyYWluaW5nTWFpbkZsb3cKQEAgLTIyNSw2ICsyMDgsMTAgQEAKICAgICBNVl9IV1NfRERSX0ZSRVEJCQlmcmVxdWVuY3kKICk7CiAKKyNpZiBkZWZpbmVkKE1WX0hXU19SWF9JT19CSVNUKSB8fCBkZWZpbmVkKE1WX0hXU19SWF9JT19CSVNUX0VUUCkKK0dUX1NUQVRVUyBtdkh3c0lvQmlzdFRlc3QoR1RfVTggZGV2TnVtKTsKKyNlbmRpZgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIGRhdGEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgUGFnZUVsZW1lbnQgcGFnZVBhcmFtW10gPQpAQCAtMzMxLDYgKzMxOCwyNSBAQAogc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwUmFua0NvbnRyb2woR1RfVTMyIGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitWZXJzaW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NvbnN0IEdUX0NIQVIqIG12SHdzRGRyM1RpcFZlcnNpb25HZXQodm9pZCkKK3sKKyAgICByZXR1cm4gRERSM19USVBfVkVSU0lPTl9TVFJJTkc7Cit9CisKK2V4dGVybiBjb25zdCBHVF9DSEFSKiBtdkh3c0RkcjRTdWJMaWJWZXJzaW9uR2V0KHZvaWQpOworCit2b2lkIGRkcjNQcmludFZlcnNpb24oKQoreworICAgIG12UHJpbnRmKG12SHdzRGRyM1RpcFZlcnNpb25HZXQoKSk7CisjaWZkZWYgQ09ORklHX0REUjQKKyAgICBtdlByaW50Zihtdkh3c0RkcjRTdWJMaWJWZXJzaW9uR2V0KCkpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogUmVnaXN0ZXIgZnJlcSBtYXNrCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBHVF9TVEFUVVMgbXZId3NEZHIzVGlwUmVnaXN0ZXJGcmVxTWFzayhHVF9VMzIgZGV2TnVtLCBHVF9VMzIqIGZyZXFNYXNrVXNyKQpAQCAtMzU0LDE4ICszNjAsNzggQEAKIHsKIAlkZXZOdW0gPSBkZXZOdW07IC8qIGF2b2lkIHdhcm5pbmdzICovCiAKLQlpZihwYXJhbXMtPmNrRGVsYXkgIT0gLTEpCi0JCWNrRGVsYXkgPSBwYXJhbXMtPmNrRGVsYXk7CisJaWYocGFyYW1zLT5ja0RlbGF5ICE9IE1WX1BBUkFNU19VTkRFRklORUQpICAgICBja0RlbGF5ID0gcGFyYW1zLT5ja0RlbGF5OwogCi0JaWYocGFyYW1zLT5ja0RlbGF5XzE2ICE9IC0xKQotCQlja0RlbGF5XzE2ID0gIHBhcmFtcy0+Y2tEZWxheV8xNjsKLQlpZihwYXJhbXMtPlBoeVJlZzNWYWwgIT0gLTEpCi0JCVBoeVJlZzNWYWwgPSBwYXJhbXMtPlBoeVJlZzNWYWw7CisJaWYocGFyYW1zLT5QaHlSZWczVmFsICE9IE1WX1BBUkFNU19VTkRFRklORUQpICBQaHlSZWczVmFsID0gcGFyYW1zLT5QaHlSZWczVmFsOworCisJaWYocGFyYW1zLT5nUnR0Tm9tICE9IE1WX1BBUkFNU19VTkRFRklORUQpICAgICBnUnR0Tm9tID0gcGFyYW1zLT5nUnR0Tm9tOworCWlmKHBhcmFtcy0+Z1J0dFdSICE9IE1WX1BBUkFNU19VTkRFRklORUQpICAgICBnUnR0V1IgPSBwYXJhbXMtPmdSdHRXUjsKKwlpZihwYXJhbXMtPmdEaWMgIT0gTVZfUEFSQU1TX1VOREVGSU5FRCkgICAgICAgIGdEaWMgPSBwYXJhbXMtPmdEaWM7CisJaWYocGFyYW1zLT51aU9EVENvbmZpZyAhPSBNVl9QQVJBTVNfVU5ERUZJTkVEKSB1aU9EVENvbmZpZyA9IHBhcmFtcy0+dWlPRFRDb25maWc7CisKKwlpZihwYXJhbXMtPmdacHJpRGF0YSAhPSBNVl9QQVJBTVNfVU5ERUZJTkVEKSBnWnByaURhdGEgPSBwYXJhbXMtPmdacHJpRGF0YTsKKwlpZihwYXJhbXMtPmdabnJpRGF0YSAhPSBNVl9QQVJBTVNfVU5ERUZJTkVEKSBnWm5yaURhdGEgPSBwYXJhbXMtPmdabnJpRGF0YTsKKwlpZihwYXJhbXMtPmdacHJpQ3RybCAhPSBNVl9QQVJBTVNfVU5ERUZJTkVEKSBnWnByaUN0cmwgPSBwYXJhbXMtPmdacHJpQ3RybDsKKwlpZihwYXJhbXMtPmdabnJpQ3RybCAhPSBNVl9QQVJBTVNfVU5ERUZJTkVEKSBnWm5yaUN0cmwgPSBwYXJhbXMtPmdabnJpQ3RybDsKKworCWlmKHBhcmFtcy0+Z1pwb2R0RGF0YSAhPSBNVl9QQVJBTVNfVU5ERUZJTkVEKSBnWnBvZHREYXRhID0gcGFyYW1zLT5nWnBvZHREYXRhOworCWlmKHBhcmFtcy0+Z1pub2R0RGF0YSAhPSBNVl9QQVJBTVNfVU5ERUZJTkVEKSBnWm5vZHREYXRhID0gcGFyYW1zLT5nWm5vZHREYXRhOworCWlmKHBhcmFtcy0+Z1pwb2R0Q3RybCAhPSBNVl9QQVJBTVNfVU5ERUZJTkVEKSBnWnBvZHRDdHJsID0gcGFyYW1zLT5nWnBvZHRDdHJsOworCWlmKHBhcmFtcy0+Z1pub2R0Q3RybCAhPSBNVl9QQVJBTVNfVU5ERUZJTkVEKSBnWm5vZHRDdHJsID0gcGFyYW1zLT5nWm5vZHRDdHJsOworCisJREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfSU5GTywgKCJER0wgcGFyYW1zIGFyZSAweCVYIDB4JVggMHglWCAweCVYIDB4JVggMHglWCAweCVYIDB4JVggMHglWCAweCVYIDB4JVggMHglWFxuIiwKKwkJCQlnWnByaURhdGEsIGdabnJpRGF0YSwgZ1pwcmlDdHJsLCBnWm5yaUN0cmwsCisJCQkJZ1pwb2R0RGF0YSwgZ1pub2R0RGF0YSwgZ1pwb2R0Q3RybCwgZ1pub2R0Q3RybCwKKwkJCQlnUnR0Tm9tLCBnRGljLCB1aU9EVENvbmZpZywgZ1J0dFdSKSk7CiAKIAlyZXR1cm4gR1RfT0s7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29uZmlndXJlIHBoeSAoIGNhbGxlZCBieSBzdGF0aWMgaW5pdCBjb250cm9sbGVyKSAgZm9yIHN0YXRpYyBmbG93CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHVF9TVEFUVVMgICAgZGRyM1RpcENvbmZpZ3VyZVBoeQorKAorICAgIEdUX1UzMiAgICBkZXZOdW0KKykKK3sKKyAgICBHVF9VMzIgaW50ZXJmYWNlSWQsIHBoeUlkOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CisKKyAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgUEFEX1pSSV9DQUxJQl9QSFlfUkVHLCAoKDB4N2YgJiBnWnByaURhdGEpIDw8IDcgfCAoMHg3ZiAmIGdabnJpRGF0YSkpKSk7CisgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0NPTlRST0wsIFBBRF9aUklfQ0FMSUJfUEhZX1JFRywgKCgweDdmICYgZ1pwcmlDdHJsKSA8PCA3IHwgKDB4N2YgJiBnWm5yaUN0cmwpKSkpOworICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9EQVRBLCBQQURfT0RUX0NBTElCX1BIWV9SRUcsICgoMHgzZiAmIGdacG9kdERhdGEpIDw8IDYgfCAoMHgzZiAmIGdabm9kdERhdGEpKSkpOworICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9DT05UUk9MLCBQQURfT0RUX0NBTElCX1BIWV9SRUcsICgoMHgzZiAmIGdacG9kdEN0cmwpIDw8IDYgfCAoMHgzZiAmIGdabm9kdEN0cmwpKSkpOworCisgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0RBVEEsIFBBRF9QUkVfRElTQUJMRV9QSFlfUkVHLCAwKSk7CisgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0RBVEEsIENNT1NfQ09ORklHX1BIWV9SRUcsIDApKTsKKyAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfQ09OVFJPTCwgQ01PU19DT05GSUdfUEhZX1JFRywgMCkpOworICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCisJeworCQkvKiBjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGVuYWJsZWQgKi8KKyAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKyAgICAgICAgZm9yKHBoeUlkPTA7cGh5SWQ8b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBwaHlJZCsrKQorICAgICAgICB7CisgICAJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwaHlJZCkKKyAgICAgICAgICAgIC8qIFZyZWYgJiBjbGFtcCAqLworICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCdXNSZWFkTW9kaWZ5V3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgIHBoeUlkLCBERFJfUEhZX0RBVEEsIFBBRF9DT05GSUdfUEhZX1JFRywgICAoKGNsYW1wVGJsW2ludGVyZmFjZUlkXSA8PCA0KSB8IHZyZWZJbml0aWFsVmFsdWUgKSwgKCgweDcgPDwgNCkgfCAweDcpICkpOworICAgICAgICAgICAgLyogY2xhbXAgbm90IHJlbGV2YW50IGZvciBjb250cm9sICovCisgICAgICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJ1c1JlYWRNb2RpZnlXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAgcGh5SWQsIEREUl9QSFlfQ09OVFJPTCwgUEFEX0NPTkZJR19QSFlfUkVHLCAgICAweDQgLCAweDcgKSk7CisgICAgICAgIH0KKyAgICB9CisKKwlpZihkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfUEhZX0VER0UgKSA9PSBNVl9ERFJfUEhZX0VER0VfUE9TSVRJVkUpeworCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgMHg5MCwgMHg2MDAyKSk7CisJfQorCisjaWZkZWYgQ09ORklHX0REUjQKKyAgICBkZHI0VGlwQ29uZmlndXJlUGh5KGRldk51bSk7CisjZW5kaWYKKworICAgcmV0dXJuIEdUX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIENvbmZpZ3VyZSBDUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogR1RfU1RBVFVTIGRkcjNUaXBDb25maWd1cmVDcyhHVF9VMzIgZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQsIEdUX1UzMiBjc051bSwgR1RfVTMyIGVuYWJsZSkKQEAgLTQxOCw3ICs0ODQsOSBAQAogCUdUX1UzMiBjc0NvdW50OwogCUdUX1UzMiBjc0JpdG1hc2s7CiAJR1RfVTMyIGN1cnJDc051bSA9IDA7Ci0JZm9yKGJ1c0NudCA9IDA7IGJ1c0NudCA8IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKTsgYnVzQ250KyspCisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKKworCWZvcihidXNDbnQgPSAwOyBidXNDbnQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0NudCsrKQogCXsKIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzQ250KQogCQljc0NvdW50ID0gMDsKQEAgLTQ2MSw3ICs1MjksOCBAQAogICAgIEdUX1UzMiBjbFZhbHVlID0gMCwgY3dsVmFsID0gMDsKICAgICBHVF9VMzIgcmVmcmVzaEludGVydmFsQ250ID0gMCwgIGJ1c0NudCA9IDAsIGFkbGxUYXAgPSAwOwogICAgIE1WX0hXU19BQ0NFU1NfVFlQRQkgIGFjY2Vzc1R5cGUgPSBBQ0NFU1NfVFlQRV9VTklDQVNUOwotICAgICBHVF9VMzIgZGF0YVJlYWRbTUFYX0lOVEVSRkFDRV9OVU1dOworICAgIEdUX1UzMiBkYXRhUmVhZFtNQVhfSU5URVJGQUNFX05VTV07CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoIkluaXRDb250cm9sbGVyLCBkb01yc1BoeT0lZCwgaXNDdHJsNjRCaXQ9JWRcbiIsIGluaXRDbnRyUHJtLT5kb01yc1BoeSwgaW5pdENudHJQcm0tPmlzQ3RybDY0Qml0KSk7CiAKQEAgLTQ3Nyw3ICs1NDYsNyBAQAogICAgICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKICAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoImFjdGl2ZSBJRiAlZFxuIiwgaW50ZXJmYWNlSWQpKTsKICAgICAgICAgICAgIG1lbU1hc2sgPSAwOwotICAgICAgICAgICAgZm9yKGJ1c0luZGV4PTA7IGJ1c0luZGV4IDwgR0VUX1RPUE9MT0dZX05VTV9PRl9CVVNFUyhkZXZOdW0pIDsgYnVzSW5kZXgrKykKKyAgICAgICAgICAgIGZvcihidXNJbmRleD0wOyBidXNJbmRleCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IGJ1c0luZGV4KyspCiAgICAgICAgICAgICB7CiAgICAgICAgIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSW5kZXgpCiAgICAgICAgICAgICAgICAgbWVtTWFzayB8PSB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1tidXNJbmRleF0ubWlycm9yRW5hYmxlQml0bWFzazsKQEAgLTUwOCw3ICs1NzcsNyBAQAogICAgICAgICAgICAgLyogU1JNb2RlICovCiAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBTRFJBTV9DT05GSUdVUkFUSU9OX1JFRywgZGF0YVZhbHVlLCAweDEwMEZGRkYpKTsKIAotCQkJLyogSW50cmxlYXZlIGZpcnN0IGNvbW1hbmQgcHJlLWNoYXJnZSBlbmFibGUgKFRCRCkgKi8KKyAgICAgICAgICAgIC8qIEludGVybGVhdmUgZmlyc3QgY29tbWFuZCBwcmUtY2hhcmdlIGVuYWJsZSAoVEJEKSAqLwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgU0RSQU1fT1BFTl9QQUdFX0NPTlRST0xfUkVHLCAoMSA8PCAxMCksICgxIDw8IDEwKSkpOwogCiAgICAgICAgICAgICAvKiBQSFkgY29uZmlndXJhdGlvbiovCkBAIC01MzEsMTEgKzYwMCwxMyBAQAogCiAgICAgICAgICAgICAvKlBhZCBjYWxpYnJhdGlvbiBjb250cm9sIC0gZW5hYmxlKi8KICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIENBTElCX01BQ0hJTkVfQ1RSTF9SRUcsIDB4MSwgMHgxKSk7Ci0jaWYgIWRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpICYmICFkZWZpbmVkKENPTkZJR19BTExFWUNBVDMpICYmICFkZWZpbmVkIChDT05GSUdfQVJNQURBXzM5WCkKLSAgICAgICAgICAgIC8qIEREUjNfUmFua19Db250cm9sIFw5NiBQYXJ0IG9mIHRoZSBHZW5lcmljIGNvZGUgKi8KLSAgICAgICAgICAgIC8qOiBDUzEgTWlycm9yaW5nIGVuYWJsZSArIHcvYSBmb3IgSklSQSBEVU5JVC0xNDU4MSAqLyAKLSAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIFJBTktfQ1RSTF9SRUcsIDB4MjcsIE1BU0tfQUxMX0JJVFMpKTsKLSNlbmRpZgorCisJCQlpZiAoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpIDwgTVZfVElQX1JFVl8zKXsKKwkJICAgICAgICAvKiBERFIzX1JhbmtfQ29udHJvbCBcOTYgUGFydCBvZiB0aGUgR2VuZXJpYyBjb2RlICovCisJCSAgICAgICAgLyo6IENTMSBNaXJyb3JpbmcgZW5hYmxlICsgdy9hIGZvciBKSVJBIERVTklULTE0NTgxICovCisJCSAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgUkFOS19DVFJMX1JFRywgMHgyNywgTUFTS19BTExfQklUUykpOworCQkJfQorCiAgICAgICAgICAgICBjc01hc2sgPSAwOwogICAgICAgICAgICAgZGF0YVZhbHVlID0gMHg3OwogICAgICAgICAgICAgLyogQWRkcmVzcyBjdHJsIFw5NiBQYXJ0IG9mIHRoZSBHZW5lcmljIGNvZGUgCkBAIC01NjEsNyArNjMyLDcgQEAKIAogICAgICAgICAgICAgZGF0YVZhbHVlID0gKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmJ1c1dpZHRoID09IEJVU19XSURUSF84KSA/IDAgOiAxOwogICAgICAgICAgICAgLyogY3JlYXRlIG1lcmdlIGNzIG1hc2sgZm9yIGFsbCBjcyBhdmFpbGFibGUgaW4gZHVuaXQgKi8KLSAgICAgICAgICAgIGZvcihidXNDbnQgPSAwOyBidXNDbnQgPCBHRVRfVE9QT0xPR1lfTlVNX09GX0JVU0VTKGRldk51bSk7IGJ1c0NudCsrKQorICAgICAgICAgICAgZm9yKGJ1c0NudCA9IDA7IGJ1c0NudCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzQ250KyspCiAgICAgICAgICAgICB7CiAgICAgICAgCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzQ250KQogICAgICAgICAgICAgICAgIGNzTWFzayB8PSB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1tidXNDbnRdLmNzQml0bWFzazsKQEAgLTU4NCw5ICs2NTUsMTEgQEAKIAkgICAgICAgICAgICBjd2xWYWwgPSB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5jYXNXTDsKIAkgICAgICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJjbFZhbHVlIDB4JXggY3dsVmFsIDB4JXggXG4iLCBjbFZhbHVlLCBjd2xWYWwpKTsKIAorICAgICAgICAgICAgICAgIHRXUiA9IFRJTUVfMl9DTE9DS19DWUNMRVMoc3BlZWRCaW5UYWJsZShzcGVlZEJpbkluZGV4LHNwZWVkQmluVGFibGVFbGVtZW50c190V1IpLCB0Q0tDTEspOworCiAJICAgICAgICAgICAgZGF0YVZhbHVlID0gKChjbE1hc2tUYWJsZVtjbFZhbHVlXSAmIDB4MSkgPDwgMikgfCAoKGNsTWFza1RhYmxlW2NsVmFsdWVdICYgMHhFKSAgPDwgIDMpOwotCSAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIE1SMF9SRUcsIGRhdGFWYWx1ZSwoMHg3IDw8IDQpIHwgKDEgPDwgMikpKTsKLQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBNUjBfUkVHLCB0d3JNYXNrVGFibGVbdFdSICsgMV0sMHhFMDApKTsKKwkgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBNUjBfUkVHLCBkYXRhVmFsdWUsICgweDcgPDwgNCkgfCAoMSA8PCAyKSkpOworCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIE1SMF9SRUcsICh0d3JNYXNrVGFibGVbdFdSICsgMV0gPDwgOSksICgweDcgPDwgOSkpKTsKIAogCQkJCS8qIE1SMTogU2V0IFJUVCBhbmQgRElDIERlc2lnbiBHTCB2YWx1ZXMgY29uZmlndXJlZCBieSB1c2VyICovCiAJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE1SMV9SRUcsIGdEaWMgfCBnUnR0Tm9tLCAweDI2NikpOwpAQCAtNTk3LDE4ICs2NzAsMjEgQEAKIAkgICAgICAgICAgICAyKUNBUyBXcml0ZSAgTGF0ZW5jeSAqLwogCSAgICAgICAgICAgIGRhdGFWYWx1ZSA9IChjd2xNYXNrVGFibGVbY3dsVmFsXSA8PCAzKTsKIAkgICAgICAgICAgICBkYXRhVmFsdWUgfD0gKCh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5pbnRlcmZhY2VUZW1wID09IE1WX0hXU19URU1QX0hJR0gpID8gKDEgPDwgNykgOiAwKTsKKwkJCQlkYXRhVmFsdWUgfD0gZ1J0dFdSOwogCSAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgTVIyX1JFRywgZGF0YVZhbHVlICwgKDB4Nzw8MykgfCAoMHgxPDw3KSB8ICgweDM8PDkpKSk7CiAgICAgICAgICAgICB9CiAKIAkJCWRkcjNUaXBXcml0ZU9kdChkZXZOdW0sICBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgY2xWYWx1ZSwgY3dsVmFsKTsKICAgICAgICAgICAgIGRkcjNUaXBTZXRUaW1pbmcoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgZnJlcSk7CiAKLSNpZiAhZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgJiYgIWRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgJiYgIWRlZmluZWQgKENPTkZJR19BUk1BREFfMzlYKQotCQkJLypXckJ1ZmYsIFJkQnVmZiovCi0JCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBEVU5JVF9DT05UUk9MX0hJR0hfUkVHLCAweDEwMDAxMTksMHgxMDAwMTdGKSk7Ci0jZWxzZQotCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgRFVOSVRfQ09OVFJPTF9ISUdIX1JFRywgMHgxNzcsMHgxMDAwMTc3KSk7Ci0jZW5kaWYKKwkJCWlmIChkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPCBNVl9USVBfUkVWXzMpeworCQkJCS8qV3JCdWZmLCBSZEJ1ZmYqLworCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERVTklUX0NPTlRST0xfSElHSF9SRUcsIDB4MTAwMDExOSwweDEwMDAxN0YpKTsKKwkJCX0KKwkJCWVsc2V7CisJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgRFVOSVRfQ09OVFJPTF9ISUdIX1JFRywgMHgxNzcsMHgxMDAwMTc3KSk7CisJCQl9CisKIAkJICAgIGlmIChpbml0Q250clBybS0+aXNDdHJsNjRCaXQpCiAJICAgICAgCXsKIAkgICAgICAgIC8qIGRpc2FibGUgMC4yNSBjYyBkZWxheSAqLwpAQCAtNjQ1LDIwICs3MjEsMjAgQEAKIAogCQkJLypTZXQgQWN0aXZlIGNvbnRyb2wgZm9yIE9EVCB3cml0ZSB0cmFuc2FjdGlvbnMqLwogCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIDB4MTQ5NCwgdWlPRFRDb25maWcsIE1BU0tfQUxMX0JJVFMpKTsKLSNpZiBkZWZpbmVkIChDT05GSUdfQUxMRVlDQVQzKQotCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgMHgxNGE4LCAweDkwMCwweDkwMCkpOwotCQkJLypXQTogQ29udHJvbHMgd2hldGhlciB0byBmbG9hdCBUaGUgQ29udHJvbCBwdXBzIG91dHB1dHMgZHVyaW5nIFNlbGYgUmVmcmVzaCovCi0JCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCAweDE2ZDAsIDAsMHg4MDAwKSk7Ci0jZW5kaWYKKworICAgICAgICAgICAgaWYgKGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWKSA9PSBNVl9USVBfUkVWXzMpIC8qIEFDMy9Cb2JLIG9ubHkgKi8KKyAgICAgICAgICAgIHsKKwkJCSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCAweDE0YTgsIDB4OTAwLDB4OTAwKSk7CisJCQkgICAgLypXQTogQ29udHJvbHMgd2hldGhlciB0byBmbG9hdCBUaGUgQ29udHJvbCBwdXBzIG91dHB1dHMgZHVyaW5nIFNlbGYgUmVmcmVzaCovCisJCQkgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgMHgxNmQwLCAwLDB4ODAwMCkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAjaWZkZWYgU1RBVElDX0FMR09fU1VQUE9SVAogICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcFN0YXRpY0luaXRDb250cm9sbGVyKGRldk51bSkpOwotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQgKENPTkZJR19BUk1BREFfMzlYKQogCQlDSEVDS19TVEFUVVMoZGRyM1RpcFN0YXRpY1BoeUluaXRDb250cm9sbGVyKGRldk51bSkpOwotI2VuZGlmCiAjZW5kaWYvKlNUQVRJQ19BTEdPX1NVUFBPUlQqLwogICAgIH0KICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQpAQCAtNjcwLDE2ICs3NDYsMTMgQEAKIAkgICAgewogCSAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwUGFkSW52KGRldk51bSwgaW50ZXJmYWNlSWQpKTsKIAkgICAgfQotICAgIAogCi0gICAgLypQYWQgY2FsaWJyYXRpb24gY29udHJvbCAtIGRpc2FibGUqLwotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIENBTElCX01BQ0hJTkVfQ1RSTF9SRUcsIDB4MCwgMHgxKSk7Ci0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgQ0FMSUJfTUFDSElORV9DVFJMX1JFRywgY2FsaWJyYXRpb25VcGRhdGVDb250cm9sPDwzLCAweDM8PDMpKTsKKyAgICAgICAgLypQYWQgY2FsaWJyYXRpb24gY29udHJvbCAtIGRpc2FibGUqLworICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBDQUxJQl9NQUNISU5FX0NUUkxfUkVHLCAweDAsIDB4MSkpOworICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBDQUxJQl9NQUNISU5FX0NUUkxfUkVHLCBjYWxpYnJhdGlvblVwZGF0ZUNvbnRyb2w8PDMsIDB4Mzw8MykpOwogICAgIH0KICNpZmRlZiBDT05GSUdfRERSNAotCUNIRUNLX1NUQVRVUyhkZHI0VGlwQ2FsaWJyYXRpb25BZGp1c3QoZGV2TnVtLCBkZHI0VGlwQ29uZmlndXJlUGh5VnJlZlRhcCwxLDApKTsvKmRldk51bSxWcmVmVGFwLFZyZWZfZW4sUE9EX09ubHkqLwotICAgIGRkcjRNb2RlUmVnc0luaXQoZGV2TnVtKTsKLSAgICBkZHI0U2RyYW1Db25maWcoZGV2TnVtKTsKKwlDSEVDS19TVEFUVVMoZGRyNFRpcENhbGlicmF0aW9uQWRqdXN0KGRldk51bSwgMSwwKSk7LypkZXZOdW0sVnJlZlRhcCxWcmVmX2VuLFBPRF9Pbmx5Ki8KICNlbmRpZgogCiAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBFbmFibGVJbml0U2VxdWVuY2UoZGV2TnVtKSk7CkBAIC03MDUsMTUgKzc3OCwxMyBAQAogICAgIE1WX0hXU19TUEVFRF9CSU4gc3BlZWRCaW5JbmRleDsKICAgICBNVl9IV1NfRERSX0ZSRVEgZnJlcSA9IEREUl9GUkVRX0xJTUlUOwogICAgIEdUX1UzMiBpbnRlcmZhY2VJZCA9IDA7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAotCi0gICAgZnJlcVZhbFtERFJfRlJFUV9MT1dfRlJFUV0gPSBkZnNMb3dGcmVxOwotICAgIC8qb3NNZW1DcHkoJnRvcG9sb2d5TWFwW2Rldk51bV0sICh2b2lkKikgdG9wb2xvZ3ksc2l6ZW9mKE1WX0hXU19UT1BPTE9HWV9NQVApKTsqLwogICAgIGRkcjNUaXBTZXRUb3BvbG9neU1hcChkZXZOdW0sIHRvcG9sb2d5TWFwUHRyKTsKICAgICB0b3BvbG9neU1hcCA9IGRkcjNUaXBHZXRUb3BvbG9neU1hcChkZXZOdW0pOwogICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwR2V0Rmlyc3RBY3RpdmVJZigoR1RfVTgpZGV2TnVtLCB0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgJmZpcnN0QWN0aXZlSWYpKTsKLSAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJib2FyZCBJRl9NYXNrPTB4JXggbnVtT2ZCdXNQZXJJbnRlcmZhY2U9MHgleFxuIiwKLQkJCQkJICAgdG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSkpOworICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoImJvYXJkIElGX01hc2s9MHgleCBvY3RldHNQZXJJbnRlcmZhY2VOdW09MHgleFxuIiwKKwkJCQkJICAgdG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIG9jdGV0c1BlckludGVyZmFjZU51bSkpOwogCiAgICAgLyogaWYgQ0wsIENXTCB2YWx1ZXMgYXJlIG1pc3NpbmcgaW4gdG9wb2xvZ3kgbWFwLCB0aGVuIGZpbGwgdGhlbSBhY2NvcmRpbmcgdG8gc3BlZWRiaW4gdGFibGVzICovCiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKQEAgLTc0Miw1MCArODEzLDQ5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFJBTksgQ29udHJvbCBGbG93CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgIWRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpICYmICAhZGVmaW5lZCAoQ09ORklHX0FSTUFEQV8zOVgpICYmICFkZWZpbmVkKENPTkZJR19BTExFWUNBVDMpCi1zdGF0aWMgR1RfU1RBVFVTIGRkcjNUaXBSYW5rQ29udHJvbChHVF9VMzIgZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQpCitzdGF0aWMgR1RfU1RBVFVTIGRkcjNUaXBSZXYyUmFua0NvbnRyb2woR1RfVTMyIGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkKQogewogICAgIEdUX1UzMiBkYXRhVmFsdWUgPSAwLCAgYnVzQ250PSAwOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKLSAgICBmb3IoYnVzQ250ID0gMDsgYnVzQ250IDwgR0VUX1RPUE9MT0dZX05VTV9PRl9CVVNFUyhkZXZOdW0pOyBidXNDbnQrKykKKyAgICBmb3IoYnVzQ250ID0gMDsgYnVzQ250IDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNDbnQrKykKICAgICB7CiAgICAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0NudCkKICAgICAgICAgZGF0YVZhbHVlIHw9IHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0NudF0uY3NCaXRtYXNrOwotICAgICAgCisKICAgICAgICAgaWYgKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0NudF0ubWlycm9yRW5hYmxlQml0bWFzayA9PSBHVF9UUlVFKQotICAgICAgICB7IAotICAgICAgICAvKiBjaGVja2luZyBjcyBtYXNrIGlzIHNhbWUgYXMgY3NfYml0bWFzayAtIGlmIENTIGlzIGVuYWJsZWQgdGhhbiAgQ1MrNCBiaXQgaW4gd29yZCBzaGFsbCBiZSAnMScgKi8KKyAgICAgICAgeworICAgICAgICAvKiBjaGVja2luZyBtaXJyb3JFbmFibGVCaXRtYXNrIC0gaWYgbWlycm9yRW5hYmxlQml0bWFzayBpcyBlbmFibGVkIC0gQ1MrNCBiaXQgaW4gd29yZCBzaGFsbCBiZSAnMScgKi8KICAgICAgICAgICAgIGlmICgodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzQ250XS5jc0JpdG1hc2sgJiAweDEpICE9IDApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGF0YVZhbHVlIHw9ICgxIDw8IDQpOworICAgICAgICAgICAgICAgIGRhdGFWYWx1ZSB8PSAodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzQ250XS5taXJyb3JFbmFibGVCaXRtYXNrIDw8IDQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1tidXNDbnRdLmNzQml0bWFzayAmIDB4MikgIT0gMCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYXRhVmFsdWUgfD0gKDEgPDwgNSk7CisgICAgICAgICAgICAgICAgZGF0YVZhbHVlIHw9ICh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1tidXNDbnRdLm1pcnJvckVuYWJsZUJpdG1hc2sgPDwgNSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0NudF0uY3NCaXRtYXNrICYgMHg0KSAhPSAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRhdGFWYWx1ZSB8PSAoMSA8PCA2KTsKKyAgICAgICAgICAgICAgICBkYXRhVmFsdWUgfD0gKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0NudF0ubWlycm9yRW5hYmxlQml0bWFzayA8PCA2KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzQ250XS5jc0JpdG1hc2sgJiAweDgpICE9IDApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGF0YVZhbHVlIHw9ICgxIDw8IDcpOworICAgICAgICAgICAgICAgIGRhdGFWYWx1ZSB8PSAodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzQ250XS5taXJyb3JFbmFibGVCaXRtYXNrIDw8IDcpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotI2lmICFkZWZpbmVkKENPTkZJR19BTExFWUNBVDMpCi0gICAgLyogamlycmEgQ1MyIGV4aXN0ICovCi0gICAgZGF0YVZhbHVlIHw9ICgxIDw8IENTMl9FWElTVF9CSVQpOwotI2VuZGlmCisKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBSQU5LX0NUUkxfUkVHLCBkYXRhVmFsdWUsIDB4RkYpKTsKLSAgICAgCisKICAgICByZXR1cm4gR1RfT0s7CiB9Ci0jZWxzZQotc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwUmFua0NvbnRyb2woR1RfVTMyIGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkKQorCitzdGF0aWMgR1RfU1RBVFVTIGRkcjNUaXBSZXYzUmFua0NvbnRyb2woR1RfVTMyIGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkKQogewogICAgIEdUX1UzMiBkYXRhVmFsdWUgPSAwLCAgYnVzQ250OwotCWZvciAoYnVzQ250PSAxOyBidXNDbnQgPCBHRVRfVE9QT0xPR1lfTlVNX09GX0JVU0VTKGRldk51bSk7IGJ1c0NudCsrKSB7CisJR1RfVTMyIG9jdGV0c1BlckludGVyZmFjZU51bSA9IGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKKworCWZvciAoYnVzQ250PSAxOyBidXNDbnQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0NudCsrKSB7CiAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0NudCkKIAkJaWYgKCh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1swXS5jc0JpdG1hc2sgIT10b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1tidXNDbnRdLmNzQml0bWFzaykgfHwKIAkJCSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1swXS5taXJyb3JFbmFibGVCaXRtYXNrICE9dG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzQ250XS5taXJyb3JFbmFibGVCaXRtYXNrKSkKQEAgLTc5NCwxMSArODY0LDI0IEBACiAJfQogCWRhdGFWYWx1ZSB8PSB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1swXS5jc0JpdG1hc2s7CiAJZGF0YVZhbHVlIHw9IHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zWzBdLm1pcnJvckVuYWJsZUJpdG1hc2sgPDwgNDsKLQogCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIFJBTktfQ1RSTF9SRUcsIGRhdGFWYWx1ZSwgMHhGRikpOwotcmV0dXJuIEdUX09LOworCisgICAgcmV0dXJuIEdUX09LOwogfQotI2VuZGlmCisKK3N0YXRpYyBHVF9TVEFUVVMgZGRyM1RpcFJhbmtDb250cm9sKEdUX1UzMiBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCkKK3sKKyAgICBpZiAoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpID09IE1WX1RJUF9SRVZfMikKKyAgICB7CisgICAgICAgIC8qIEJDMiAqLworICAgICAgICByZXR1cm4gZGRyM1RpcFJldjJSYW5rQ29udHJvbChkZXZOdW0sIGludGVyZmFjZUlkKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogT3RoZXIgZGV2aWNlcyAqLworICAgICAgICByZXR1cm4gZGRyM1RpcFJldjNSYW5rQ29udHJvbChkZXZOdW0sIGludGVyZmFjZUlkKTsKKyAgICB9Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogUEFEIEludmVyc2UgRmxvdwpAQCAtODEwLDggKzg5Myw5IEBACiApCiB7CiAgICAgR1RfVTMyIGJ1c0NudCwgZGF0YVZhbHVlLCBja1N3YXBQdXBDdHJsOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKLSAgICBmb3IoYnVzQ250ID0gMDsgYnVzQ250IDwgR0VUX1RPUE9MT0dZX05VTV9PRl9CVVNFUyhkZXZOdW0pOyBidXNDbnQrKykKKyAgICBmb3IoYnVzQ250ID0gMDsgYnVzQ250IDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNDbnQrKykKICAgICB7CiAgICAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0NudCkKICAgICAgICAgaWYgKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0NudF0uaXNEcXNTd2FwID09IEdUX1RSVUUpCkBAIC04MzksNiArOTIzLDY4IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQWxnb3JpdGhtIHBhcmFtZXRlcnMgdmFsaWRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworR1RfQk9PTCBtdkh3c1ZhbGlkYXRlQWxnb1ZhcihHVF9VMzIgdmFsdWUsIEdUX1UzMiBmYWlsVmFsdWUsIGNoYXIqIHZhck5hbWUpCit7CisgICAgaWYodmFsdWUgPT0gZmFpbFZhbHVlKQorICAgIHsKKyAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgiRXJyb3I6ICVzIGlzIG5vdCBpbml0aWFsaXplZCAoQWxnbyBDb21wb25lbnRzIFZhbGlkYXRpb24pXG4iLCB2YXJOYW1lKSk7CisgICAgICAgIHJldHVybiBHVF9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gR1RfVFJVRTsKK30KKworR1RfQk9PTCBtdkh3c1ZhbGlkYXRlQWxnb1B0cihHVF9WT0lEKiBwdHIsIEdUX1ZPSUQqIGZhaWxWYWx1ZSwgY2hhciogcHRyTmFtZSkKK3sKKyAgICBpZihwdHIgPT0gZmFpbFZhbHVlKQorICAgIHsKKyAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgiRXJyb3I6ICVzIGlzIG5vdCBpbml0aWFsaXplZCAoQWxnbyBDb21wb25lbnRzIFZhbGlkYXRpb24pXG4iLCBwdHJOYW1lKSk7CisgICAgICAgIHJldHVybiBHVF9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gR1RfVFJVRTsKK30KKworR1RfU1RBVFVTIG12SHdzVmFsaWRhdGVBbGdvQ29tcG9uZW50cyhHVF9VOCBkZXZOdW0pCit7CisgICAgR1RfQk9PTCBzdGF0dXMgPSBHVF9UUlVFOworCisgICAgLyogY2hlY2sgREdMIHBhcmFtZXRlcnMqLworICAgIHN0YXR1cyAmPSBtdkh3c1ZhbGlkYXRlQWxnb1Zhcihja0RlbGF5LCAgICAgTVZfUEFSQU1TX1VOREVGSU5FRCwgImNrRGVsYXkiKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29WYXIoUGh5UmVnM1ZhbCwgIE1WX1BBUkFNU19VTkRFRklORUQsICJQaHlSZWczVmFsIik7CisgICAgc3RhdHVzICY9IG12SHdzVmFsaWRhdGVBbGdvVmFyKGdSdHROb20sICAgICBNVl9QQVJBTVNfVU5ERUZJTkVELCAiZ1J0dE5vbSIpOworICAgIHN0YXR1cyAmPSBtdkh3c1ZhbGlkYXRlQWxnb1ZhcihnRGljLCAgICAgICAgTVZfUEFSQU1TX1VOREVGSU5FRCwgImdEaWMiKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29WYXIodWlPRFRDb25maWcsIE1WX1BBUkFNU19VTkRFRklORUQsICJ1aU9EVENvbmZpZyIpOworICAgIHN0YXR1cyAmPSBtdkh3c1ZhbGlkYXRlQWxnb1ZhcihnWnByaURhdGEsICAgTVZfUEFSQU1TX1VOREVGSU5FRCwgImdacHJpRGF0YSIpOworICAgIHN0YXR1cyAmPSBtdkh3c1ZhbGlkYXRlQWxnb1ZhcihnWm5yaURhdGEsICAgTVZfUEFSQU1TX1VOREVGSU5FRCwgImdabnJpRGF0YSIpOworICAgIHN0YXR1cyAmPSBtdkh3c1ZhbGlkYXRlQWxnb1ZhcihnWnByaUN0cmwsICAgTVZfUEFSQU1TX1VOREVGSU5FRCwgImdacHJpQ3RybCIpOworICAgIHN0YXR1cyAmPSBtdkh3c1ZhbGlkYXRlQWxnb1ZhcihnWm5yaUN0cmwsICAgTVZfUEFSQU1TX1VOREVGSU5FRCwgImdabnJpQ3RybCIpOworICAgIHN0YXR1cyAmPSBtdkh3c1ZhbGlkYXRlQWxnb1ZhcihnWnBvZHREYXRhLCAgTVZfUEFSQU1TX1VOREVGSU5FRCwgImdacG9kdERhdGEiKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29WYXIoZ1pub2R0RGF0YSwgIE1WX1BBUkFNU19VTkRFRklORUQsICJnWm5vZHREYXRhIik7CisgICAgc3RhdHVzICY9IG12SHdzVmFsaWRhdGVBbGdvVmFyKGdacG9kdEN0cmwsICBNVl9QQVJBTVNfVU5ERUZJTkVELCAiZ1pwb2R0Q3RybCIpOworICAgIHN0YXR1cyAmPSBtdkh3c1ZhbGlkYXRlQWxnb1ZhcihnWm5vZHRDdHJsLCAgTVZfUEFSQU1TX1VOREVGSU5FRCwgImdabm9kdEN0cmwiKTsKKworICAgIC8qIGNoZWNrIGZ1bmN0aW9ucyBwb2ludGVycyAqLworI2lmbmRlZiBBU0lDX1NJTVVMQVRJT04KKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29QdHIoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBEdW5pdE11eFNlbGVjdEZ1bmMsICAgIE5VTEwsICJ0aXBEdW5pdE11eFNlbGVjdEZ1bmMiKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29QdHIoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBEdW5pdFdyaXRlRnVuYywgICAgICAgIE5VTEwsICJ0aXBEdW5pdFdyaXRlRnVuYyIpOworICAgIHN0YXR1cyAmPSBtdkh3c1ZhbGlkYXRlQWxnb1B0cihjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcER1bml0UmVhZEZ1bmMsICAgICAgICAgTlVMTCwgInRpcER1bml0UmVhZEZ1bmMiKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29QdHIoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBHZXRGcmVxQ29uZmlnSW5mb0Z1bmMsIE5VTEwsICJ0aXBHZXRGcmVxQ29uZmlnSW5mb0Z1bmMiKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29QdHIoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBTZXRGcmVxRGl2aWRlckZ1bmMsICAgIE5VTEwsICJ0aXBTZXRGcmVxRGl2aWRlckZ1bmMiKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29QdHIoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBHZXRDbG9ja1JhdGlvLCAgICAgICAgIE5VTEwsICJ0aXBHZXRDbG9ja1JhdGlvIik7CisjZWxzZQorCWRldk51bSA9IGRldk51bTsgLyogYXZvaWQgd2FybmluZ3MgKi8KKyNlbmRpZgorCisgICAgc3RhdHVzICY9IG12SHdzVmFsaWRhdGVBbGdvUHRyKGRxTWFwVGFibGUsIE5VTEwsICJkcU1hcFRhYmxlIik7CisgICAgc3RhdHVzICY9IG12SHdzVmFsaWRhdGVBbGdvVmFyKGRmc0xvd0ZyZXEsIDAsICJkZnNMb3dGcmVxIik7CisKKyAgICByZXR1cm4gKHN0YXR1cyA9PSBHVF9UUlVFKSA/IEdUX09LIDogR1RfTk9UX0lOSVRJQUxJWkVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFJ1biBUcmFpbmluZyBGbG93CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBHVF9TVEFUVVMgICAgbXZId3NEZHIzVGlwUnVuQWxnCkBAIC04NDcsNyArOTkzLDcgQEAKICAgICBNVl9IV1NfQUxHT19UWVBFICAgIGFsZ29UeXBlCiApCiB7Ci0gICAgR1RfU1RBVFVTICAgICAgICAgIHJldFZhbCA9IEdUX09LICwgcmV0VHVuZSA9IEdUX09LIDsKKyAgICBHVF9TVEFUVVMgICAgICAgICAgcmV0VmFsID0gR1RfT0s7CiAKICNpZmRlZiBPRFRfVEVTVF9TVVBQT1JUCiAgICBpZiAoZmluZ2VyVGVzdCA9PSAxKQpAQCAtODcwLDcgKzEwMTYsNyBAQAogICAgICAgICAvKiBhZGQgdG8gbWFzayAqLwogICAgICAgICBpZiAoaXNBZGxsQ2FsaWJCZWZvcmVJbml0ICE9IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIG12UHJpbnRmKCJ3aXRoIGFkbGwgY2FsaWIgYmVmb3JlIGluaXRcbiIpOworICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfSU5GTywgKCJ3aXRoIGFkbGwgY2FsaWIgYmVmb3JlIGluaXRcbiIpKTsKICAgICAgICAgICAgIEFkbGxDYWxpYnJhdGlvbihkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgMCwgZnJlcSApOwogICAgICAgICB9CiAgICAgICAgIC8qIGZyZXF1ZW5jeSBwZXIgaW50ZXJmYWNlIGlzIG5vdCByZWxldmFudCwgb25seSBpbnRlcmZhY2UgMCAqLwpAQCAtODgwLDcgKzEwMjYsNyBAQAogICAgIH0KICAgICBpZiAocmV0VmFsICE9IEdUX09LKQogICAgIHsKLSAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgiUnVuQWxnOiB0dW5pbmcgZmFpbGVkICVkXG4iLCByZXRUdW5lKSk7CisgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAoIioqKioqKioqICAgRFJBTSBpbml0aWFsaXphdGlvbiBGYWlsZWQgKHJlcyAweCV4KSAgICoqKioqKioqXG4iLCByZXRWYWwpKTsKICAgICB9CiAKICAgIHJldHVybiByZXRWYWw7CkBAIC05MzgsMTEgKzEwODQsNyBAQAogICAgIEdUX0JPT0wgIGVuYWJsZQogKQogewotICAgIGlmIChjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcER1bml0TXV4U2VsZWN0RnVuYyAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwRHVuaXRNdXhTZWxlY3RGdW5jKChHVF9VOClkZXZOdW0sIGVuYWJsZSk7Ci0gICAgfQotICAgIHJldHVybiBHVF9GQUlMOworICAgIHJldHVybiBjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcER1bml0TXV4U2VsZWN0RnVuYygoR1RfVTgpZGV2TnVtLCBlbmFibGUpOwogfQogCiAKQEAgLTk1OSwxMSArMTEwMSw3IEBACiAgICAgR1RfVTMyICAgICAgICAgICAgICAgIG1hc2sKICkKIHsKLSAgICBpZiAoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBEdW5pdFdyaXRlRnVuYyAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwRHVuaXRXcml0ZUZ1bmMoKEdUX1U4KWRldk51bSwgaW50ZXJmYWNlQWNjZXNzLCBpbnRlcmZhY2VJZCwgcmVnQWRkciwgZGF0YVZhbHVlLCBtYXNrKTsKLSAgICB9Ci0gICAgcmV0dXJuIEdUX0ZBSUw7CisgICAgcmV0dXJuIGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwRHVuaXRXcml0ZUZ1bmMoKEdUX1U4KWRldk51bSwgaW50ZXJmYWNlQWNjZXNzLCBpbnRlcmZhY2VJZCwgcmVnQWRkciwgZGF0YVZhbHVlLCBtYXNrKTsKIH0KIAogCkBAIC05ODEsMTEgKzExMTksNyBAQAogICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrCiApCiB7Ci0gICAgaWYgKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwRHVuaXRSZWFkRnVuYyAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwRHVuaXRSZWFkRnVuYygoR1RfVTgpZGV2TnVtLCBpbnRlcmZhY2VBY2Nlc3MsIGludGVyZmFjZUlkLCByZWdBZGRyLCBkYXRhLCBtYXNrKTsKLSAgICB9Ci0gICAgcmV0dXJuIEdUX0ZBSUw7CisgICAgcmV0dXJuIGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwRHVuaXRSZWFkRnVuYygoR1RfVTgpZGV2TnVtLCBpbnRlcmZhY2VBY2Nlc3MsIGludGVyZmFjZUlkLCByZWdBZGRyLCBkYXRhLCBtYXNrKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDcxLDEwICsxMjA1LDExIEBACiB7CiAgICAgR1RfVTMyIGJ1c0luZGV4ID0gMDsKICAgICBHVF9VMzIgZGF0YVJlYWRbTUFYX0lOVEVSRkFDRV9OVU1dOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKIAlpZiAocGh5QWNjZXNzID09IEFDQ0VTU19UWVBFX01VTFRJQ0FTVCkKIAl7Ci0JCWZvcihidXNJbmRleD0wOyBidXNJbmRleCA8IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKTsgYnVzSW5kZXgrKykKKwkJZm9yKGJ1c0luZGV4PTA7IGJ1c0luZGV4IDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNJbmRleCsrKQogCQl7CiAgICAgICAgCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJbmRleCkKIAkJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQnVzQWNjZXNzKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0luZGV4LCBwaHlUeXBlICwgcmVnQWRkciwgMCwgT3BlcmF0aW9uX1JFQUQpKTsKQEAgLTEyNDIsMzQgKzEzNzcsMjcgQEAKIHsKICAgICBNVl9IV1NfVElQX0ZSRVFfQ09ORklHX0lORk8JCWZyZXFDb25maWdJbmZvOwogICAgIEdUX1UzMiBidXNDbnQgPSAwOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICAvKiBSZXNldCBEaXZlcl9iIGFzc2VydCAtPiBkZS1hc3NlcnQqLwogICAgIENIRUNLX1NUQVRVUyAobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIFNEUkFNX0NPTkZJR1VSQVRJT05fUkVHLCAwLCAweDEwMDAwMDAwKSk7CiAgICAgQ0hFQ0tfU1RBVFVTKGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEwKSk7CiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBTRFJBTV9DT05GSUdVUkFUSU9OX1JFRywgMHgxMDAwMDAwMCwgMHgxMDAwMDAwMCkpOwogCi0gICAgaWYgKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwR2V0RnJlcUNvbmZpZ0luZm9GdW5jICE9IE5VTEwpCi0gICAgewotICAgICAgICBDSEVDS19TVEFUVVMoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBHZXRGcmVxQ29uZmlnSW5mb0Z1bmMoKEdUX1U4KWRldk51bSwgZnJlcXVlbmN5LCAmZnJlcUNvbmZpZ0luZm8pKTsKLSAgICB9Ci0JZWxzZQotCXsKLQkJREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgidGlwR2V0RnJlcUNvbmZpZ0luZm9GdW5jIGlzIE5VTEwiKSk7Ci0JCXJldHVybiBHVF9OT1RfSU5JVElBTElaRUQ7Ci0JfQotCWZvciAoYnVzQ250ID0gMDsgYnVzQ250IDwgR0VUX1RPUE9MT0dZX05VTV9PRl9CVVNFUyhkZXZOdW0pOyBidXNDbnQrKykKKyAgICBDSEVDS19TVEFUVVMoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBHZXRGcmVxQ29uZmlnSW5mb0Z1bmMoKEdUX1U4KWRldk51bSwgZnJlcXVlbmN5LCAmZnJlcUNvbmZpZ0luZm8pKTsKKworCWZvciAoYnVzQ250ID0gMDsgYnVzQ250IDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNDbnQrKykKICAgICB7CiAgICAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0NudCkKICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCdXNSZWFkTW9kaWZ5V3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgIGJ1c0NudCwgRERSX1BIWV9EQVRBLCBCV19QSFlfUkVHLCAgIGZyZXFDb25maWdJbmZvLmJ3UGVyRnJlcSA8PCA4IC8qZnJlcU1hc2tbZGV2TnVtXVtmcmVxdWVuY3ldIDw8IDgqLywgMHg3MDApKTsKICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCdXNSZWFkTW9kaWZ5V3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgIGJ1c0NudCwgRERSX1BIWV9EQVRBLCAgUkFURV9QSFlfUkVHLCAgZnJlcUNvbmZpZ0luZm8ucmF0ZVBlckZyZXEgLCAweDcpKTsKICAgICB9Ci0jaWYgIWRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpICYmICFkZWZpbmVkKENPTkZJR19BUk1BREFfMzlYKQotICAgIGZvciAoYnVzQ250ID0gMDsgYnVzQ250IDwgR0VUX1RPUE9MT0dZX05VTV9PRl9CVVNFUyhkZXZOdW0pOyBidXNDbnQrKykKKworICAgIGZvciAoYnVzQ250ID0gMDsgYnVzQ250IDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNDbnQrKykKICAgICB7CiAgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQnVzUmVhZE1vZGlmeVdyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsICBidXNDbnQsIEREUl9QSFlfQ09OVFJPTCwgQldfUEhZX1JFRywgICBmcmVxQ29uZmlnSW5mby5id1BlckZyZXEgPDwgOCAvKmZyZXFNYXNrW2Rldk51bV1bZnJlcXVlbmN5XSA8PCA4Ki8sIDB4NzAwKSk7CiAgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQnVzUmVhZE1vZGlmeVdyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgIGludGVyZmFjZUlkLCAgYnVzQ250LCBERFJfUEhZX0NPTlRST0wsICBSQVRFX1BIWV9SRUcsICBmcmVxQ29uZmlnSW5mby5yYXRlUGVyRnJlcSAsIDB4NykpOwogICAgIH0KLSNlbmRpZgogCiAgICAgLyogRFVuaXQgdG8gUGh5IGRyaXZlIHBvc3QgZWRnZSwgQURMTCByZXNldCAgYXNzZXJ0ICBkZS1hc3NlcnQqLyAKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERSQU1fUEhZX0NPTkZJR1VSQVRJT04sIDAsICgweDgwMDAwMDAwICB8IDB4NDAwMDAwMDApKSk7CkBAIC0xMzAyLDEyICsxNDMwLDE0IEBACiApCiB7CiAgICAgR1RfVTMyIGNsVmFsdWUgPSAwLCBjd2xWYWx1ZSA9IDAsIG1lbU1hc2sgPSAwLCBkYXRhVmFsdWUgPSAwLCB0SENMSyA9IDAsIHRXUiA9IDAsIHJlZnJlc2hJbnRlcnZhbENudCA9IDAsIGNudElkLCBpbnRlcmZhY2VJZHggPSAwOworICAgIEdUX1UzMiB0Q0tDTEsgPSAwOwogCUdUX1UzMiBzdGFydElmLCBlbmRJZjsKICAgICBHVF9VMzIgdFJFRkkgPSAwOwogICAgIEdUX0JPT0wgaXNEbGxPZmYgPSBHVF9GQUxTRTsKICAgICBHVF9VMzIgYnVzSW5kZXggPSAwLCBhZGxsVGFwID0gMDsKICAgICBNVl9IV1NfU1BFRURfQklOICAgICAgc3BlZWRCaW5JbmRleCA9IDA7CiAJR1RfVTMyICAgY3NNYXNrW01BWF9JTlRFUkZBQ0VfTlVNXTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfVFJBQ0UsICgiZGV2ICVkIGFjY2VzcyAlZCBJRiAlZCBmcmVxICVkXG4iLGRldk51bSAsIGFjY2Vzc1R5cGUgLCBpbnRlcmZhY2VJZCAsIGZyZXF1ZW5jeSkpOwogCkBAIC0xMzYxLDcgKzE0OTEsNyBAQAogICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoIlxuIikpOwogICAgIG1lbU1hc2sgPSAwOwogCS8qbW90aSBUQkQgLSBuZWVkIHRvIGluc2VydCBsb29wIG9uIGludGVyZmFjZSovCi0gICAgZm9yKGJ1c0luZGV4PTA7IGJ1c0luZGV4IDwgR0VUX1RPUE9MT0dZX05VTV9PRl9CVVNFUyhkZXZOdW0pIDsgYnVzSW5kZXgrKykKKyAgICBmb3IoYnVzSW5kZXg9MDsgYnVzSW5kZXggPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBidXNJbmRleCsrKQogICAgIHsKICAgIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSW5kZXgpCiAgICAgICAgIG1lbU1hc2sgfD0gdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzSW5kZXhdLm1pcnJvckVuYWJsZUJpdG1hc2s7CkBAIC0xMzc1LDggKzE1MDUsOSBAQAogICAgIC8qREZTICAtIENML0NXTCBwYXJhbWV0ZXJzIGFmdGVyIGV4aXRpbmcgU1IqLwogCiAgICAgLypERlMgIC0gRW50ZXIgU2VsZi1SZWZyZXNoKi8KLSAgICB0V1IgPSBzcGVlZEJpblRhYmxlKHNwZWVkQmluSW5kZXgsc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RXUik7Ci0gICAgdFdSID0gKHRXUiAvIDEwMDApOworICAgIHRDS0NMSyA9IChNRUdBL2ZyZXFWYWxbZnJlcXVlbmN5XSk7CisgICAgdFdSID0gVElNRV8yX0NMT0NLX0NZQ0xFUyhzcGVlZEJpblRhYmxlKHNwZWVkQmluSW5kZXgsc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RXUiksIHRDS0NMSyk7CisKICAgICAvKiBkYXRhVmFsdWUgPSAoY2xNYXNrVGFibGVbY2xWYWx1ZV0gPDwgOCkgfCAgKGN3bE1hc2tUYWJsZVtjd2xWYWx1ZV0gPDwgMTIpIHwgKDEgPDwgMSkgfCAoMSA8PCAyKSB8ICh0d3JNYXNrVGFibGVbdFdSKzFdIDw8IDE2KTsqLwogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERGU19SRUcsIChjbE1hc2tUYWJsZVtjbFZhbHVlXSA8PCA4KSAsIDB4RjAwKSk7CiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgREZTX1JFRywgKGN3bE1hc2tUYWJsZVtjd2xWYWx1ZV0gPDwgMTIpICwgMHg3MDAwKSk7CkBAIC0xNDE1LDI0ICsxNTQ2LDIyIEBACiAJLyptb3RpIFRCRCAtIG5lZWQgdG8gaW5zZXJ0IGxvb3Agb24gaW50ZXJmYWNlKi8KICAgICB0UkVGSSA9ICh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5pbnRlcmZhY2VUZW1wID09IE1WX0hXU19URU1QX0hJR0gpID8gVFJFRklfSElHSDpUUkVGSV9MT1c7CiAgICAgdFJFRkkgKj0gMTAwMDsgLypwc2VjICovCisKICAgICAvKiBIQ0xLIGluIFtwc10gKi8KLSAgICB0SENMSyA9IE1FR0EvKGZyZXFWYWxbZnJlcXVlbmN5XS8yKTsKKyAgICB0SENMSyA9IE1FR0EvKGZyZXFWYWxbZnJlcXVlbmN5XS9jb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcEdldENsb2NrUmF0aW8oZnJlcXVlbmN5KSk7CiAgICAgcmVmcmVzaEludGVydmFsQ250ID0gdFJFRkkvdEhDTEs7IC8qIG5vIHVuaXRzICovCiAKICAgICBkYXRhVmFsdWUgPSAweDQwMDAgIHwgcmVmcmVzaEludGVydmFsQ250OwogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgU0RSQU1fQ09ORklHVVJBVElPTl9SRUcsIGRhdGFWYWx1ZSwgMHg3RkZGKSk7CiAKICAgICAvKiBQTEwgY29uZmlndXJhdGlvbiAqLwotICAgIGlmIChjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcFNldEZyZXFEaXZpZGVyRnVuYyAhPSBOVUxMKQorICAgIC8qIE9mZXIgYiA1LzExLSBhc3NlcnQgQURMTCAqLworICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgU0RSQU1fQ09ORklHVVJBVElPTl9SRUcsIDAsIDB4NjAwMDAwMDApKTsKKyAgICAvKiBjb25maWd1cmUgcGxsIGRldmlkZXIqLworICAgIGZvcihpbnRlcmZhY2VJZHggPSBzdGFydElmOyBpbnRlcmZhY2VJZHggPD0gZW5kSWY7IGludGVyZmFjZUlkeCsrKQogICAgIHsKLQkJLyogT2ZlciBiIDUvMTEtIGFzc2VydCBBRExMICovCi0JCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgU0RSQU1fQ09ORklHVVJBVElPTl9SRUcsIDAsIDB4NjAwMDAwMDApKTsKLQkJLyogY29uZmlndXJlIHBsbCBkZXZpZGVyKi8KLQkJZm9yKGludGVyZmFjZUlkeCA9IHN0YXJ0SWY7IGludGVyZmFjZUlkeCA8PSBlbmRJZjsgaW50ZXJmYWNlSWR4KyspCi0JCXsKLQkJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWR4KQotCQkJY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBTZXRGcmVxRGl2aWRlckZ1bmMoKEdUX1U4KWRldk51bSwgaW50ZXJmYWNlSWR4LCBmcmVxdWVuY3kpOwotCQl9CisgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWR4KQorICAgICAgICBjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcFNldEZyZXFEaXZpZGVyRnVuYygoR1RfVTgpZGV2TnVtLCBpbnRlcmZhY2VJZHgsIGZyZXF1ZW5jeSk7CiAgICAgfQogCiAgICAgLyogUExMIGNvbmZpZ3VyYXRpb24gRW5kICovCkBAIC0xNDU2LDcgKzE1ODUsNyBAQAogCiAJaWYgKGRlbGF5RW5hYmxlICE9IDApCiAJewotCQlhZGxsVGFwID0gIE1FR0EvKGZyZXFWYWxbZnJlcXVlbmN5XSo2NCk7CisJCWFkbGxUYXAgPSAgKGlzRGxsT2ZmID09IEdUX1RSVUUpPygxMDAwKTooTUVHQS8oZnJlcVZhbFtmcmVxdWVuY3ldKjY0KSk7CiAJCWRkcjNUaXBDbWRBZGRySW5pdERlbGF5KGRldk51bSwgYWRsbFRhcCk7CiAJfQogCkBAIC0xNDg1LDEyICsxNjE0LDggQEAKICAgICBkYXRhVmFsdWUgPSAoKGNsTWFza1RhYmxlW2NsVmFsdWVdICYgMHgxKSA8PCAyKSB8ICgoY2xNYXNrVGFibGVbY2xWYWx1ZV0gJiAweEUpICA8PCAgMyk7CiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBNUjBfUkVHLCBkYXRhVmFsdWUsICgweDcgPDwgNCkgfCAoMSA8PCAyKSkpOwogICAgIC8qTVIyOiAgQ1dMID0gMTAgLCBBdXRvIFNlbGYtUmVmcmVzaCAtIGRpc2FibGUgKi8KLSAgICBkYXRhVmFsdWUgPSAoY3dsTWFza1RhYmxlW2N3bFZhbHVlXSA8PCAzKTsKLSAgICAvKmRhdGFWYWx1ZSB8PSAoMSA8PCA5KTsgcmVtb3ZlZCBieSBPZmVyIDMxLzEwCi0gICAgZGF0YVZhbHVlIHw9ICgodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uaW50ZXJmYWNlVGVtcCA9PSBNVl9IV1NfVEVNUF9ISUdIKSA/ICgxIDw8IDcpIDogMCk7Ci0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBNUjJfUkVHLCBkYXRhVmFsdWUgLCAoMHg3PDwzKSB8ICgweDE8PDcpIHwgKDB4Mzw8OSkpKTsqLwotCi0JQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBNUjJfUkVHLCBkYXRhVmFsdWUgLCAoMHg3PDwzKSkpOworICAgIGRhdGFWYWx1ZSA9IChjd2xNYXNrVGFibGVbY3dsVmFsdWVdIDw8IDMpIHwgZ1J0dFdSOworCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgTVIyX1JFRywgZGF0YVZhbHVlICwgKDB4Nzw8MykgfCAoMHgzIDw8IDkpKSk7CiAKICAgICBkZHIzVGlwV3JpdGVPZHQoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgY2xWYWx1ZSwgY3dsVmFsdWUpOwogCkBAIC0xNTAwLDkgKzE2MjUsOSBAQAogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCAwLCBNUjBfUkVHLCBkYXRhVmFsdWUsICgweDcgPDwgNCkgfCAoMSA8PCAyKSkpOwogCiAgICAgLyogcmUtd3JpdGUgQ1dMICovCi0gICAgZGF0YVZhbHVlID0gKGN3bE1hc2tUYWJsZVtjd2xWYWx1ZV0gPDwgMyk7Ci0gICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBXcml0ZU1SU0NtZChkZXZOdW0sIGNzTWFzaywgTVJTMl9DTUQsIGRhdGFWYWx1ZSwgKDB4NyA8PCAzKSApKTsKLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgMCwgTVIyX1JFRywgZGF0YVZhbHVlLCAoMHg3IDw8IDMpKSk7CisgICAgZGF0YVZhbHVlID0gKGN3bE1hc2tUYWJsZVtjd2xWYWx1ZV0gPDwgMykgIHwgZ1J0dFdSOworICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwV3JpdGVNUlNDbWQoZGV2TnVtLCBjc01hc2ssIE1SUzJfQ01ELCBkYXRhVmFsdWUsICgweDcgPDwgMykgIHwgKDB4MyA8PCA5KSkpOworICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCAwLCBNUjJfUkVHLCBkYXRhVmFsdWUsICgweDcgPDwgMykgfCAoMHgzIDw8IDkpKSk7CiAKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgMCwgU0RSQU1fT1BFUkFUSU9OX1JFRywgMHhDMDAsIDB4RjAwKSk7IC8qIENTMCAmIENTMSovCiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIFNEUkFNX09QRVJBVElPTl9SRUcsIDB4MywgMHgxRikpOyAgICAgLyogTVIwIFVwZGF0ZSBDb21tYW5kICovCkBAIC0xNTIwLDYgKzE2NDUsNyBAQAogICAgIHJldHVybiBHVF9PSzsKIH0KICNlbHNlCisvKiBmb3IgQS0zODAvQS0zOTAgKi8KIEdUX1NUQVRVUyAgICBkZHIzVGlwRnJlcVNldAogKAogICAgIEdUX1UzMgkJCQkJZGV2TnVtLApAQCAtMTUyOSwyMCArMTY1NSwyNSBAQAogKQogewogICAgIEdUX1UzMiBjbFZhbHVlID0gMCwgY3dsVmFsdWUgPSAwLCBtZW1NYXNrID0gMCwgZGF0YVZhbHVlID0gMCwgYnVzQ250ID0gMCwgdEhDTEsgPSAwLCB0V1IgPSAwLCByZWZyZXNoSW50ZXJ2YWxDbnQgPSAwLCBjbnRJZDsKLSAgICBHVF9VMzIgdFJFRkkgPSAwLCBlbmRJZiwgc3RhcnRJZjsKKyAgICBHVF9VMzIgdENLQ0xLOworICAgIEdUX1UzMiBlbmRJZiwgc3RhcnRJZjsKKyAgICBHVF9VMzIgdFJFRkkgPSAwOwogICAgIEdUX1UzMiBidXNJbmRleCA9IDA7CiAJR1RfQk9PTCBpc0RsbE9mZiA9IEdUX0ZBTFNFOwogICAgIE1WX0hXU19TUEVFRF9CSU4gICAgICBzcGVlZEJpbkluZGV4ID0gMDsKICAgICBNVl9IV1NfVE9QT0xPR1lfTUFQICp0b3BvbG9neU1hcCA9IGRkcjNUaXBHZXRUb3BvbG9neU1hcChkZXZOdW0pOwogICAgIE1WX0hXU19USVBfRlJFUV9DT05GSUdfSU5GTwkJZnJlcUNvbmZpZ0luZm87CiAgICAgTVZfSFdTX1JFU1VMVCogZmxvd1Jlc3VsdCA9IHRyYWluaW5nUmVzdWx0W3RyYWluaW5nU3RhZ2VdOwotCUdUX1UzMiBhZGxsVGFwID0gMDsKKwlHVF9VMzIgYWRsbFRhcCA9IDAsIHVpVDJ0LCBjc051bTsKIAlHVF9VMzIgICBjc01hc2tbTUFYX0lOVEVSRkFDRV9OVU1dOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoImRldiAlZCBhY2Nlc3MgJWQgSUYgJWQgZnJlcSAlZFxuIixkZXZOdW0gLCBhY2Nlc3NUeXBlICwgaW50ZXJmYWNlSWQgLCBmcmVxdWVuY3kpKTsKKwogCWlmIChmcmVxdWVuY3kgPT0gRERSX0ZSRVFfTE9XX0ZSRVEpIHsKIAkJaXNEbGxPZmYgPSBHVF9UUlVFOwogCX0KKwogICAgIGlmIChhY2Nlc3NUeXBlID09IEFDQ0VTU19UWVBFX01VTFRJQ0FTVCkKICAgICB7CiAgICAgICAgIHN0YXJ0SWYgPSAwOwpAQCAtMTU5NCw3ICsxNzI1LDcgQEAKICAgICAgICAgfQogICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJcbiIpKTsKICAgICAgICAgbWVtTWFzayA9IDA7Ci0gICAgICAgIGZvcihidXNJbmRleD0wOyBidXNJbmRleCA8IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKSA7IGJ1c0luZGV4KyspCisgICAgICAgIGZvcihidXNJbmRleD0wOyBidXNJbmRleCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IGJ1c0luZGV4KyspCiAgICAgICAgIHsKICAgICAgICAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0luZGV4KQogICAgICAgICAgICAgbWVtTWFzayB8PSB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1tidXNJbmRleF0ubWlycm9yRW5hYmxlQml0bWFzazsKQEAgLTE2MzEsNyArMTc2Miw3IEBACiAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIDB4MUE3NCwgMCAsICgweDcgPDwgOCkpKTsKICNlbmRpZgogCQl9Ci0gICAgICAgICAgIAorCiAgICAgICAgIC8qREZTICAtIEVudGVyIFNlbGYtUmVmcmVzaCovCiAJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgREZTX1JFRywgMHg0ICwgMHg0KSk7CiAJCS8qIHBvbGxpbmcgb24gc2VsZiByZWZyZXNoIGVudHJ5ICovCkBAIC0xNjQwLDE4ICsxNzcxLDQxIEBACiAgICAgICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9FUlJPUiwgKCJGcmVxU2V0OiBERFIzIHBvbGwgZmFpbGVkIG9uIFNSIGVudHJ5XG4iKSk7CiAgICAgICAgIH0KIAotICAgICAgICAgIC8qIFBMTCBjb25maWd1cmF0aW9uICovCi0gICAgICAgIGlmIChjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcFNldEZyZXFEaXZpZGVyRnVuYyAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcFNldEZyZXFEaXZpZGVyRnVuYyhkZXZOdW0sIGludGVyZmFjZUlkLCBmcmVxdWVuY3kpOwotICAgICAgICB9Ci0gICAgICAgIC8qIFBMTCBjb25maWd1cmF0aW9uIEVuZCAqLworCQkvKi0tLS0tLS0tLS0tQ2FsY3VsYXRlIDJUIG1vZGUtLS0tLS0tLS0tLS0tLS0qLworCQlpZiAobW9kZTJUICE9IDB4RkYpCisJCXsKKwkJCXVpVDJ0ID0gbW9kZTJUOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogY2FsY3VsYXRlIG51bWJlciBvZiBDUyAocGVyIGludGVyZmFjZSkqLworCQkJQ0hFQ0tfU1RBVFVTKG12Q2FsY0NzTnVtKGRldk51bSwgaW50ZXJmYWNlSWQsICZjc051bSkpOworCQkJdWlUMnQgPSAoY3NOdW0gPT0gMSkgPyAwIDogMTsKKwkJfQorCisKKwkJaWYoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX0lOVEVSTEVBVkVfV0EgKSA9PSBHVF9UUlVFKXsKKwkJCS8qSWYgY29uZmlndXJlZCAxOjEgUmF0aW8sIHVzZSAxVCBtb2RlKi8KKwkJCWlmKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwR2V0Q2xvY2tSYXRpbyhmcmVxdWVuY3kpID09IDEpeyAvKkxvdyBmcmVxKi8KKwkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBTRFJBTV9PUEVOX1BBR0VfQ09OVFJPTF9SRUcsIDB4MCwgMHgzQzApKTsKKwkJCQl1aVQydCA9IDA7CisJCQl9CisJCQllbHNley8qbWVkaXVtIG9yIHRhcmdldCBGUkVRKi8KKwkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBTRFJBTV9PUEVOX1BBR0VfQ09OVFJPTF9SRUcsIDB4M0MwLCAweDNDMCkpOworCQkJfQorCQl9CisJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIEREUl9DT05UUk9MX0xPV19SRUcsIHVpVDJ0IDw8IDMsMHgzIDw8IDMpKTsKKworICAgICAgICAvKiBQTEwgY29uZmlndXJhdGlvbiAqLworICAgICAgICBjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcFNldEZyZXFEaXZpZGVyRnVuYyhkZXZOdW0sIGludGVyZmFjZUlkLCBmcmVxdWVuY3kpOworCiAKIAkJLyogYWRqdXN0IHRSRUZJIHRvIG5ldyBmcmVxdWVuY3kqLwotCQl0UkVGSSA9ICh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5pbnRlcmZhY2VUZW1wID09IE1WX0hXU19URU1QX0hJR0gpID8gVFJFRklfTE9XOlRSRUZJX0hJR0g7CisJCXRSRUZJID0gKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmludGVyZmFjZVRlbXAgPT0gTVZfSFdTX1RFTVBfSElHSCkgPyBUUkVGSV9ISUdIOlRSRUZJX0xPVzsKICAgICAgICAgdFJFRkkgKj0gMTAwMDsgLypwc2VjICovCisKICAgICAgICAgLyogSENMSyBpbiBbcHNdICovCi0gICAgICAgIHRIQ0xLID0gTUVHQS8oZnJlcVZhbFtmcmVxdWVuY3ldLzIpOworICAgICAgICB0SENMSyA9IE1FR0EvKGZyZXFWYWxbZnJlcXVlbmN5XS9jb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcEdldENsb2NrUmF0aW8oZnJlcXVlbmN5KSk7CiAgICAgICAgIHJlZnJlc2hJbnRlcnZhbENudCA9IHRSRUZJL3RIQ0xLOyAvKiBubyB1bml0cyAqLwogICAgICAgICBkYXRhVmFsdWUgPSAweDQwMDAgIHwgcmVmcmVzaEludGVydmFsQ250OwogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIFNEUkFNX0NPTkZJR1VSQVRJT05fUkVHLCBkYXRhVmFsdWUsIDB4N0ZGRikpOwpAQCAtMTY2MCw4ICsxODE0LDEwIEBACiAgICAgICAgIC8qREZTICAtIENML0NXTC9XUiBwYXJhbWV0ZXJzIGFmdGVyIGV4aXRpbmcgU1IqLwogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERGU19SRUcsIChjbE1hc2tUYWJsZVtjbFZhbHVlXSA8PCA4KSAsIDB4RjAwKSk7IAogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERGU19SRUcsIChjd2xNYXNrVGFibGVbY3dsVmFsdWVdIDw8IDEyKSAsIDB4NzAwMCkpOwotICAgICAgICB0V1IgPSBzcGVlZEJpblRhYmxlKHNwZWVkQmluSW5kZXgsc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RXUik7Ci0gICAgICAgIHRXUiA9ICh0V1IgLyAxMDAwKTsKKworICAgICAgICB0Q0tDTEsgPSAoTUVHQS9mcmVxVmFsW2ZyZXF1ZW5jeV0pOworICAgICAgICB0V1IgPSBUSU1FXzJfQ0xPQ0tfQ1lDTEVTKHNwZWVkQmluVGFibGUoc3BlZWRCaW5JbmRleCxzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdSKSwgdENLQ0xLKTsKKwogICAgICAgIC8qIGRhdGFWYWx1ZSA9IChjbE1hc2tUYWJsZVtjbFZhbHVlXSA8PCA4KSB8ICAoY3dsTWFza1RhYmxlW2N3bFZhbHVlXSA8PCAxMikgfCAoMSA8PCAxKSB8ICgxIDw8IDIpIHwgKHR3ck1hc2tUYWJsZVt0V1IrMV0gPDwgMTYpOyovCiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgREZTX1JFRywgKHR3ck1hc2tUYWJsZVt0V1IrMV0gPDwgMTYpICwgMHg3MDAwMCkpOwogCQpAQCAtMTY3NywyNCArMTgzMywyMiBAQAogCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCAweDFBNzQsIGdSdHROb21DUzEgLCAoMHg3IDw8IDgpKSk7CiAjZW5kaWYKIAkJfQotICAgICAgICAvKiBSZXNldCBEaXZlcl9iIGFzc2VydCAtPiBkZS1hc3NlcnQqLyAKKyAgICAgICAgLyogUmVzZXQgRGl2ZXJfYiBhc3NlcnQgLT4gZGUtYXNzZXJ0Ki8KICAgICAgICAgQ0hFQ0tfU1RBVFVTIChtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgU0RSQU1fQ09ORklHVVJBVElPTl9SRUcsIDAsIDB4MTAwMDAwMDApKTsKLSAgICAgICAgQ0hFQ0tfU1RBVFVTKGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEwKSk7ICAKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEwKSk7CiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgU0RSQU1fQ09ORklHVVJBVElPTl9SRUcsIDB4MTAwMDAwMDAsIDB4MTAwMDAwMDApKTsKIAogICAgICAgICAvKiBBZGxsIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gb2YgcHJvY2VzcyBhbmQgRnJlcXVlbmN5Ki8KLSAgICAgICAgaWYgKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwR2V0RnJlcUNvbmZpZ0luZm9GdW5jICE9IE5VTEwpCi0gICAgICAgIHsKLQkJCUNIRUNLX1NUQVRVUyhjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcEdldEZyZXFDb25maWdJbmZvRnVuYyhkZXZOdW0sIGZyZXF1ZW5jeSwgJmZyZXFDb25maWdJbmZvKSk7Ci0gICAgICAgIH0KKyAgICAgICAgQ0hFQ0tfU1RBVFVTKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwR2V0RnJlcUNvbmZpZ0luZm9GdW5jKGRldk51bSwgZnJlcXVlbmN5LCAmZnJlcUNvbmZpZ0luZm8pKTsKKwogICAgICAgICAvKiBUQkQgY2hlY2sgbWlsbzUgdXNpbmcgZGV2aWNlIElEID8gKi8KLSAgICAgICAgZm9yIChidXNDbnQgPSAwOyBidXNDbnQgPCBHRVRfVE9QT0xPR1lfTlVNX09GX0JVU0VTKGRldk51bSk7IGJ1c0NudCsrKQorICAgICAgICBmb3IgKGJ1c0NudCA9IDA7IGJ1c0NudCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzQ250KyspCiAgICAgICAgIHsKICAgICAgICAgCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0NudCkKICAgICAgICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJ1c1JlYWRNb2RpZnlXcml0ZShkZXZOdW0sQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsICBidXNDbnQsIEREUl9QSFlfREFUQSwgMHg5MiwgICBmcmVxQ29uZmlnSW5mby5id1BlckZyZXEgPDwgOCAvKmZyZXFNYXNrW2Rldk51bV1bZnJlcXVlbmN5XSA8PCA4Ki8sIDB4NzAwKSk7CiAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCdXNSZWFkTW9kaWZ5V3JpdGUoZGV2TnVtLEFDQ0VTU19UWVBFX1VOSUNBU1QsICBpbnRlcmZhY2VJZCwgIGJ1c0NudCwgRERSX1BIWV9EQVRBLCAgMHg5NCwgIGZyZXFDb25maWdJbmZvLnJhdGVQZXJGcmVxICwgMHg3KSk7CiAgICAgICAgIH0KLSAgICAgICAgLyogRFVuaXQgdG8gUGh5IGRyaXZlIHBvc3QgZWRnZSwgQURMTCByZXNldCAgYXNzZXJ0ICBkZS1hc3NlcnQqLyAKKyAgICAgICAgLyogRFVuaXQgdG8gUGh5IGRyaXZlIHBvc3QgZWRnZSwgQURMTCByZXNldCAgYXNzZXJ0ICBkZS1hc3NlcnQqLwogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERSQU1fUEhZX0NPTkZJR1VSQVRJT04sIDAsICgweDgwMDAwMDAwICB8IDB4NDAwMDAwMDApKSk7CiAgICAgICAgIENIRUNLX1NUQVRVUyhod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgMCwgMTAwLyhmcmVxVmFsW2ZyZXF1ZW5jeV0vZnJlcVZhbFtERFJfRlJFUV9MT1dfRlJFUV0pKSk7CiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgRFJBTV9QSFlfQ09ORklHVVJBVElPTiwgKDB4ODAwMDAwMDAgIHwgMHg0MDAwMDAwMCksICgweDgwMDAwMDAwICB8IDB4NDAwMDAwMDApKSk7CkBAIC0xNzEyLDcgKzE4NjYsNyBAQAogCQlkZHIzVGlwU2V0VGltaW5nKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIGZyZXF1ZW5jeSk7CiAJCWlmIChkZWxheUVuYWJsZSAhPSAwKQogCQl7Ci0JCQlhZGxsVGFwID0gIE1FR0EvKGZyZXFWYWxbZnJlcXVlbmN5XSo2NCk7CisJCQlhZGxsVGFwID0gIChpc0RsbE9mZiA9PSBHVF9UUlVFKT8oMTAwMCk6KE1FR0EvKGZyZXFWYWxbZnJlcXVlbmN5XSo2NCkpOwogCQkJZGRyM1RpcENtZEFkZHJJbml0RGVsYXkoZGV2TnVtLCBhZGxsVGFwKTsKIAkJfQogCkBAIC0xNzM2LDE2ICsxODkwLDE2IEBACiAgICAgICAgIGRhdGFWYWx1ZSA9ICgoY2xNYXNrVGFibGVbY2xWYWx1ZV0gJiAweDEpIDw8IDIpIHwgKChjbE1hc2tUYWJsZVtjbFZhbHVlXSAmIDB4RSkgIDw8ICAzKTsKICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBNUjBfUkVHLCBkYXRhVmFsdWUsICgweDcgPDwgNCkgfCAoMSA8PCAyKSkpOwogICAgICAgICAvKk1SMjogIENXTCA9IDEwICwgQXV0byBTZWxmLVJlZnJlc2ggLSBkaXNhYmxlICovCi0gICAgICAgIGRhdGFWYWx1ZSA9IChjd2xNYXNrVGFibGVbY3dsVmFsdWVdIDw8IDMpOworICAgICAgICBkYXRhVmFsdWUgPSAoY3dsTWFza1RhYmxlW2N3bFZhbHVlXSA8PCAzKSAgIHwgZ1J0dFdSOwogCQkvKiBua2xlaW4gMjQuMTAuMTMgLSBzaG91bGQgbm90IGJlIGhlcmUgLSBsZWF2ZSB2YWx1ZSBhcyBzZXQgaW4KIAkJdGhlIGluaXQgY29uZmlndXJhdGlvbiBkYXRhVmFsdWUgfD0gKDEgPDwgOSk7IAogICAgICAgICBkYXRhVmFsdWUgfD0gKCh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5pbnRlcmZhY2VUZW1wID09IE1WX0hXU19URU1QX0hJR0gpID8gKDEgPDwgNykgOiAwKTsKICAgICAgICAgKioqKi8KLSAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBNUjJfUkVHLCBkYXRhVmFsdWUgLCAoMHg3PDwzKSkpOyAgLyogbmtsZWluIDI0LjEwLjEzIC0gc2VlIGFib3ZlIGNvbW1lbnQqLworICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIE1SMl9SRUcsIGRhdGFWYWx1ZSAsICgweDc8PDMpIHwgKDB4MyA8PCA5KSkpOyAgLyogbmtsZWluIDI0LjEwLjEzIC0gc2VlIGFib3ZlIGNvbW1lbnQqLwogICAgICAgICAvKk9EVCBUSU1JTkcgKi8KICAgICAgICAgZGF0YVZhbHVlID0gKChjbFZhbHVlLWN3bFZhbHVlKzEpIDw8IDQpIHwgICgoY2xWYWx1ZS1jd2xWYWx1ZSs2KSA8PCA4KSB8ICAoKGNsVmFsdWUtMSkgPDwgMTIpIHwgICgoY2xWYWx1ZSs2KSA8PCAxNik7CiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgT0RUX1RJTUlOR19MT1csIGRhdGFWYWx1ZSwgMHhGRkZGMCkpOwotICAgICAgICBkYXRhVmFsdWUgPSAweDcxIHwgKChjd2xWYWx1ZSAtIDEpIDw8IDgpIHwgKChjd2xWYWx1ZSs1KSA8PCAxMik7CisgICAgICAgIGRhdGFWYWx1ZSA9IDB4OTEgfCAoKGN3bFZhbHVlIC0gMSkgPDwgOCkgfCAoKGN3bFZhbHVlKzUpIDw8IDEyKTsKICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBPRFRfVElNSU5HX0hJX1JFRywgZGF0YVZhbHVlLCAweEZGRkYpKTsKICAgICAgICAgLyogT0RUIEFjdGl2ZSovCiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgRFVOSVRfT0RUX0NPTlRST0xfUkVHLCAweEYsIDB4RikpOwpAQCAtMTc1NSw5ICsxOTA5LDkgQEAKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgMCwgTVIwX1JFRywgZGF0YVZhbHVlLCAoMHg3IDw8IDQpIHwgKDEgPDwgMikpKTsKIAogICAgIC8qIHJlLXdyaXRlIENXTCAqLwotICAgIGRhdGFWYWx1ZSA9IChjd2xNYXNrVGFibGVbY3dsVmFsdWVdIDw8IDMpOwotICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwV3JpdGVNUlNDbWQoZGV2TnVtLCBjc01hc2ssIE1SUzJfQ01ELCBkYXRhVmFsdWUsICgweDcgPDwgMykgKSk7Ci0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIE1SMl9SRUcsIGRhdGFWYWx1ZSwgKDB4NyA8PCAzKSkpOworICAgIGRhdGFWYWx1ZSA9IChjd2xNYXNrVGFibGVbY3dsVmFsdWVdIDw8IDMpICB8IGdSdHRXUjsKKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcFdyaXRlTVJTQ21kKGRldk51bSwgY3NNYXNrLCBNUlMyX0NNRCwgZGF0YVZhbHVlLCAoMHg3IDw8IDMpIHwgKDB4MyA8PCA5KSkpOworICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCAwLCBNUjJfUkVHLCBkYXRhVmFsdWUsICgweDcgPDwgMykgfCAoMHgzIDw8IDkpKSk7CiAKICAgICAvKiAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIFNEUkFNX1RJTUlOR19ISUdIX1JFRywgMHgzRTAzMUY4MCwgMHgzRkZGRkZGRikpOyovCiAgICAgICAgIGlmIChtZW1NYXNrICE9IDApCkBAIC0xNzg5LDcgKzE5NDMsNyBAQAogCWRhdGFWYWx1ZSB8PSAoKChjbFZhbHVlLTEpPj40KSA8PCAyMikgfCAgKCgoY2xWYWx1ZSs2KT4+NCkgPDwgMjMpOwogCiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBPRFRfVElNSU5HX0xPVywgZGF0YVZhbHVlLCAweEZGRkYwKSk7Ci0gICAgZGF0YVZhbHVlID0gMHg3MSB8ICgoY3dsVmFsdWUgLSAxKSA8PCA4KSB8ICgoY3dsVmFsdWUrNSkgPDwgMTIpOworICAgIGRhdGFWYWx1ZSA9IDB4OTEgfCAoKGN3bFZhbHVlIC0gMSkgPDwgOCkgfCAoKGN3bFZhbHVlKzUpIDw8IDEyKTsKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIE9EVF9USU1JTkdfSElfUkVHLCBkYXRhVmFsdWUsIDB4RkZGRikpOwogCWlmIChvZHRBZGRpdGlvbmFsID09IDEpIAogCXsKQEAgLTE5NTAsMTkgKzIxMDQsMjAgQEAKICkKIHsKICAgICBHVF9VMzIgaW50ZXJmYWNlSWQsYnVzTnVtLCBjc0JpdG1hc2ssIGRhdGFWYWwsIGNzTnVtOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLQkJZm9yIChidXNOdW09MDsgYnVzTnVtPHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgYnVzTnVtKyspCisJCWZvciAoYnVzTnVtPTA7IGJ1c051bTxvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c051bSsrKQogCQl7CiAgICAgICAgIAlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNOdW0pCiAJCQljc0JpdG1hc2sgPSB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1tidXNOdW1dLmNzQml0bWFzazsKIAkJCWlmKGNzQml0bWFzayAhPSBlZmZlY3RpdmVfY3MpCiAJCQl7CiAgICAgICAgICAgICAgICAgY3NOdW0gPSBHRVRfQ1NfRlJPTV9NQVNLKGNzQml0bWFzayk7Ci0JCQkJbXZId3NEZHIzVGlwQlVTUmVhZChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNOdW0sIEREUl9QSFlfREFUQSwgb2Zmc2V0ICsgQ1NfUkVHX1ZBTFVFKGVmZmVjdGl2ZV9jcyksICZkYXRhVmFsKTsKLSAgICAJCQltdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNOdW0sIEREUl9QSFlfREFUQSwgb2Zmc2V0ICsgQ1NfUkVHX1ZBTFVFKGNzTnVtKSwgZGF0YVZhbCk7CisJCQkJbXZId3NEZHIzVGlwQlVTUmVhZChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNOdW0sIEREUl9QSFlfREFUQSwgb2Zmc2V0ICsgQ1NfQllURV9HQVAoZWZmZWN0aXZlX2NzKSwgJmRhdGFWYWwpOworICAgIAkJCW12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c051bSwgRERSX1BIWV9EQVRBLCBvZmZzZXQgKyBDU19CWVRFX0dBUChjc051bSksIGRhdGFWYWwpOwogCQkJfQkJCQkJCiAJCX0KIAl9CkBAIC0yMDA3LDU5ICsyMTYyLDYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUR5bmFtaWMgT0RUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HVF9TVEFUVVMgICAgZGRyM1RpcER5bmFtaWNPZHQKLSgKLSAgICBHVF9VMzIgICAgZGV2TnVtLAotICAgIEdUX0JPT0wgICBiSXNTZXQKLSkgICAgICAgICAgICAgICAgICAgICAgICAgIAotewotICAgIEdUX1UzMiBtcjFWYWx1ZSxtcjJWYWx1ZSwgaW50ZXJmYWNlSWQ7Ci0KLSAgICBpZiAoYklzU2V0ID09IEdUX1RSVUUpCi0gICAgewotICAgICAgICBtcjFWYWx1ZSA9IDB4MjQ7Ci0gICAgICAgIG1yMlZhbHVlID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbXIxVmFsdWUgPSAwOwotICAgICAgICBtcjJWYWx1ZSA9IDB4MjAwOwotICAgIH0KLSAgICAvKiBNUjE6IHNldCBSdHROb20gdG8gUlpRLzYgKi8KLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgMCwgTVIxX1JFRywgbXIxVmFsdWUsIDB4MjI0KSk7Ci0gICAgLyogTVIyOiBkaXNhYmxlIGR5bmFtaWMgT0RUKi8KLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgMCwgTVIyX1JFRywgbXIyVmFsdWUsIDB4NjAwKSk7Ci0gICAgLypPcGVyYXRpb24gY29tbWFuZCovCi0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIFNEUkFNX09QRVJBVElPTl9SRUcsIDB4QzAwLCAweEYwMCkpOwotICAgIC8qIE1SMSBDb21tYW5kICovCi0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIFNEUkFNX09QRVJBVElPTl9SRUcsIDB4NCwgMHgxRikpOwotICAgIC8qIGNoZWNrIGNvbnRyb2xsZXIgYmFjayB0byBub3JtYWwgKi8KLSAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQotICAgIHsKLSAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgaWYgKGRkcjNUaXBJZlBvbGxpbmcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMCwgMHgxRiwgU0RSQU1fT1BFUkFUSU9OX1JFRywgTUFYX1BPTExJTkdfSVRFUkFUSU9OUykgIT0gR1RfT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAoIldMOiBERFIzIHBvbGwgZmFpbGVkKDEpIikpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIE1SMiBDb21tYW5kICovCi0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIFNEUkFNX09QRVJBVElPTl9SRUcsIDB4OCwgMHgxRikpOwotICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCi0gICAgewotICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICBpZiAoZGRyM1RpcElmUG9sbGluZyhkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAwLCAweDFGLCBTRFJBTV9PUEVSQVRJT05fUkVHLCBNQVhfUE9MTElOR19JVEVSQVRJT05TKSAhPSBHVF9PSykKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgiV0w6IEREUjMgcG9sbCBmYWlsZWQoMikiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEdUX09LOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBSZXNldCBYU0IgUmVhZCBGSUZPCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBHVF9TVEFUVVMgICAgZGRyM1RpcFJlc2V0Rmlmb1B0cgpAQCAtMjA5NSwxNyArMjE5NywyNCBAQAogKQogewogICAgIEdUX1UzMiBpbnRlcmZhY2VJZCwgcGh5SWQsY3M7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICAgewogICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICBmb3IgKHBoeUlkPTA7IHBoeUlkPHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgcGh5SWQrKykKKyAgICAgICAgZm9yIChwaHlJZD0wOyBwaHlJZDxvY3RldHNQZXJJbnRlcmZhY2VOdW07IHBoeUlkKyspCiAgICAgICAgIHsKICAgICAgICAgCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHBoeUlkKQotCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcGh5SWQsIEREUl9QSFlfREFUQSwgV0xfUEhZX1JFRyArIENTX1JFR19WQUxVRShlZmZlY3RpdmVfY3MpLCBQaHlSZWcwVmFsKSk7Ci0gICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwaHlJZCwgRERSX1BIWV9EQVRBLCBSTF9QSFlfUkVHICsgQ1NfUkVHX1ZBTFVFKGVmZmVjdGl2ZV9jcyksIFBoeVJlZzJWYWwpKTsKLSAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHBoeUlkLCBERFJfUEhZX0RBVEEsIFJFQURfQ0VOVFJBTElaQVRJT05fUEhZX1JFRyArIENTX1JFR19WQUxVRShlZmZlY3RpdmVfY3MpLCBQaHlSZWczVmFsKSk7Ci0gICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwaHlJZCwgRERSX1BIWV9EQVRBLCBXUklURV9DRU5UUkFMSVpBVElPTl9QSFlfUkVHICsgQ1NfUkVHX1ZBTFVFKGVmZmVjdGl2ZV9jcyksIFBoeVJlZzNWYWwpKTsKKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcGh5SWQsIEREUl9QSFlfREFUQSwgV0xfUEhZX1JFRyArIENTX0JZVEVfR0FQKGVmZmVjdGl2ZV9jcyksIFBoeVJlZzBWYWwpKTsKKyAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcGh5SWQsIEREUl9QSFlfREFUQSwgUkxfUEhZX1JFRyArIENTX0JZVEVfR0FQKGVmZmVjdGl2ZV9jcyksIFBoeVJlZzJWYWwpKTsKKyAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcGh5SWQsIEREUl9QSFlfREFUQSwgUkVBRF9DRU5UUkFMSVpBVElPTl9QSFlfUkVHICsgQ1NfQllURV9HQVAoZWZmZWN0aXZlX2NzKSwgUGh5UmVnM1ZhbCkpOworICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwaHlJZCwgRERSX1BIWV9EQVRBLCBXUklURV9DRU5UUkFMSVpBVElPTl9QSFlfUkVHICsgQ1NfQllURV9HQVAoZWZmZWN0aXZlX2NzKSwgUGh5UmVnMVZhbCkpOworCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwaHlJZCwgRERSX1BIWV9EQVRBLCAweDFGICsgQ1NfUEJTX0dBUChlZmZlY3RpdmVfY3MpLCAwKSk7CisJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHBoeUlkLCBERFJfUEhZX0RBVEEsIDB4NUYgKyBDU19QQlNfR0FQKGVmZmVjdGl2ZV9jcyksIDApKTsKKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcGh5SWQsIEREUl9QSFlfREFUQSwgMHgxNCArIENTX1BCU19HQVAoZWZmZWN0aXZlX2NzKSwgMCkpOworCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwaHlJZCwgRERSX1BIWV9EQVRBLCAweDU0ICsgQ1NfUEJTX0dBUChlZmZlY3RpdmVfY3MpLCAwKSk7CisJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHBoeUlkLCBERFJfUEhZX0RBVEEsIDB4MTUgKyBDU19QQlNfR0FQKGVmZmVjdGl2ZV9jcyksIDApKTsKKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcGh5SWQsIEREUl9QSFlfREFUQSwgMHg1NSArIENTX1BCU19HQVAoZWZmZWN0aXZlX2NzKSwgMCkpOwogCQl9CiAgICAgfQogCkBAIC0yMTU3LDkgKzIyNjYsOSBAQAogICAgIEluaXRDbnRyUGFyYW0gICBpbml0Q250clBybTsKICAgICBHVF9TVEFUVVMgcmV0VmFsID0gR1RfT0s7CiAJR1RfVTMyIGludGVyZmFjZUlkOwotCUdUX1UzMiBtYXhfY3MgPSBtdkh3c0RkcjNUaXBNYXhDU0dldCgpOworCUdUX1UzMiBtYXhfY3MgPSBtdkh3c0RkcjNUaXBNYXhDU0dldChkZXZOdW0pOwogCi0jaWZuZGVmIEVYQ0xVREVfU1dJVENIX0RFQlVHCisjaWZkZWYgRERSX1ZJRVdFUl9UT09MCiAJaWYoZGVidWdUcmFpbmluZyA9PSBERUJVR19MRVZFTF9UUkFDRSkKIAkJQ0hFQ0tfU1RBVFVTKHByaW50RGV2aWNlSW5mbygoR1RfVTgpZGV2TnVtKSk7CiAjZW5kaWYKQEAgLTIxNzAsNiArMjI3OSw4IEBACiAJZWZmZWN0aXZlX2NzID0gMDsvKlNldCB0byAwIGFmdGVyIGVhY2ggbG9vcCB0byBhdm9pZCBpbGxlZ2FsIHZhbHVlIG1heSBiZSB1c2VkKi8KIAogICAgIGZyZXEgPSBpbml0RnJlcTsKKyAgICBmcmVxVmFsW0REUl9GUkVRX0xPV19GUkVRXSA9IGRmc0xvd0ZyZXE7CisKICAgICBpZiAoaXNQbGxCZWZvcmVJbml0ICE9IDAgKQogICAgIHsKIAkJZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPCBNQVhfSU5URVJGQUNFX05VTTsgaW50ZXJmYWNlSWQrKykgewpAQCAtMjIxMiw2ICsyMzIzLDE2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEdUX0ZBSUw7IAogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyNpZiBkZWZpbmVkKE1WX0hXU19SWF9JT19CSVNUKSB8fCBkZWZpbmVkKE1WX0hXU19SWF9JT19CSVNUX0VUUCkKKyAgICAgICAgLyogUnVuIFJYIElPIEJJU1QgKi8KKyAgICAgICAgcmV0VmFsID0gbXZId3NJb0Jpc3RUZXN0KChHVF9VOClkZXZOdW0pOworICAgICAgICBpZiAocmV0VmFsICE9IEdUX09LKQorICAgICAgICB7CisgICAgICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9FUlJPUiwgKCJtdkh3c0lvQmlzdFRlc3QgZmFpbHVyZSBcbiIpKTsKKyAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgIH0KKyNlbmRpZgogICAgIH0KIAogI2lmZGVmIFNUQVRJQ19BTEdPX1NVUFBPUlQKQEAgLTIyNzUsNyArMjM5Niw2IEBACiAJfQogCWVmZmVjdGl2ZV9jcyA9IDA7LypTZXQgdG8gMCBhZnRlciBlYWNoIGxvb3AgdG8gYXZvaWQgaWxsZWdhbCB2YWx1ZSBtYXkgYmUgdXNlZCovCiAKLQogICAgIGlmIChtYXNrVHVuZUZ1bmMgJiBTRVRfTUVESVVNX0ZSRVFfTUFTS19CSVQpCiAgICAgewogCSAgIHRyYWluaW5nU3RhZ2UgPSBTRVRfTUVESVVNX0ZSRVE7CkBAIC0yMzQxLDcgKzI0NjEsNyBAQAogCQl9CiAJfQogCWVmZmVjdGl2ZV9jcyA9IDA7LypTZXQgdG8gMCBhZnRlciBlYWNoIGxvb3AgdG8gYXZvaWQgaWxsZWdhbCB2YWx1ZSBtYXkgYmUgdXNlZCovCi0JCisKICAgICBpZiAobWFza1R1bmVGdW5jICYgUkVBRF9MRVZFTElOR19NQVNLX0JJVCkKICAgICB7CiAgICAgICAgIHRyYWluaW5nU3RhZ2UgPSBSRUFEX0xFVkVMSU5HOwpAQCAtMjQ0OCw2ICsyNTY4LDcgQEAKIAkJCX0KIAkJfQogICAgIH0KKwogICAgIC8qaWYgKG1hc2tUdW5lRnVuYyAmIEFESlVTVF9EUVNfTUFTS19CSVQpCiAgICAgewogICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9JTkZPLCAoIkFESlVTVF9EUVNfTUFTS19CSVRcbiIpKTsKQEAgLTI1MDksNDYgKzI2MzAsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0jaWZkZWYgQ09ORklHX0REUjRfX05PVF9VU0VECi0JaWYgKG1hc2tUdW5lRnVuYyAmIFBFUl9CSVRfUkVBRF9MRVZFTElOR19URl9NQVNLX0JJVCkKLSAgICB7Ci0gICAgICAgdHJhaW5pbmdTdGFnZSA9IFBFUl9CSVRfUkVBRF9MRVZFTElOR19URjsKLSAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9JTkZPLCAoIlBFUl9CSVRfUkVBRF9MRVZFTElOR19URl9NQVNLX0JJVCBcbiIpKTsKLSAgICAgICByZXRWYWwgPSBkZHIzVGlwRHluYW1pY1BlckJpdFJlYWRMZXZlbGluZyhkZXZOdW0sIHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbZmlyc3RBY3RpdmVJZl0ubWVtb3J5RnJlcSk7Ci0gICAgICAgaWYgKGlzUmVnRHVtcCAhPSAwKQotICAgICAgIHsKLSAgICAgICAgICAgZGRyM1RpcFJlZ0R1bXAoZGV2TnVtKTsKLSAgICAgICB9Ci0gICAgICAgaWYgKHJldFZhbCAhPSBHVF9PSykKLSAgICAgICB7Ci0gICAgICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9FUlJPUiwgKCJkZHIzVGlwRHluYW1pY1BlckJpdFJlYWRMZXZlbGluZyBURiBmYWlsdXJlIFxuIikpOyAKLSAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUgPT0gR1RfRkFMU0UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdUX0ZBSUw7IAotICAgICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobWFza1R1bmVGdW5jICYgU1dfUkVBRF9MRVZFTElOR19NQVNLX0JJVCkKLSAgICB7Ci0gICAgICAgIHRyYWluaW5nU3RhZ2UgPSBTV19SRUFEX0xFVkVMSU5HOwotICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9JTkZPLCAoIlNXX1JFQURfTEVWRUxJTkdfTUFTS19CSVRcbiIpKTsKLQkJcmV0VmFsID0gZGRyNFRpcFNvZnR3YXJlUmVhZExldmVsaW5nKGRldk51bSwgbWVkaXVtRnJlcSk7Ci0gICAgICAgIGlmIChpc1JlZ0R1bXAgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICBkZHIzVGlwUmVnRHVtcChkZXZOdW0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXRWYWwgIT0gR1RfT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAoImRkcjRUaXBTb2Z0d2FyZVJlYWRMZXZlbGluZyBmYWlsdXJlIFxuIikpOwotICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSA9PSBHVF9GQUxTRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR1RfRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSNlbmRpZiAvKiBDT05GSUdfRERSNCAqLwotCiAjaWZkZWYgQ09ORklHX0REUjMKICAgICBpZiAobWFza1R1bmVGdW5jICYgRE1fUEJTX1RYX01BU0tfQklUKQogICAgIHsKQEAgLTI1NzgsNyArMjY1OSw2IEBACiAJCX0KIAl9CiAJZWZmZWN0aXZlX2NzID0gMDsvKlNldCB0byAwIGFmdGVyIGVhY2ggbG9vcCB0byBhdm9pZCBpbGxlZ2FsIHZhbHVlIG1heSBiZSB1c2VkKi8KLQogIAlmb3IoZWZmZWN0aXZlX2NzID0gMDsgZWZmZWN0aXZlX2NzIDwgbWF4X2NzOyBlZmZlY3RpdmVfY3MrKyl7CiAJICAgIGlmIChtYXNrVHVuZUZ1bmMgJiBDRU5UUkFMSVpBVElPTl9SWF9NQVNLX0JJVCkKIAkJIHsKQEAgLTI2MjYsNzkgKzI3MDYsNyBAQAogCiAjaWZkZWYgQ09ORklHX0REUjQKIAlmb3IoZWZmZWN0aXZlX2NzID0gMDsgZWZmZWN0aXZlX2NzIDwgbWF4X2NzOyBlZmZlY3RpdmVfY3MrKyl7Ci0JCWlmIChtYXNrVHVuZUZ1bmMgJiBSRUNFSVZFUl9DQUxJQlJBVElPTl9NQVNLX0JJVCkKLQkJewotCQkgICB0cmFpbmluZ1N0YWdlID0gUkVDRUlWRVJfQ0FMSUJSQVRJT047Ci0JCSAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9JTkZPLCAoIlJFQ0VJVkVSX0NBTElCUkFUSU9OX01BU0tfQklUXG4iKSk7Ci0JCSAgICByZXRWYWwgPSBkZHI0VGlwUmVjZWl2ZXJDYWxpYnJhdGlvbihkZXZOdW0pOwotCQkgICAgaWYgKGlzUmVnRHVtcCAhPSAwKQotCQkgICAgewotCQkgICAgICAgZGRyM1RpcFJlZ0R1bXAoZGV2TnVtKTsKLQkJICAgIH0KLQkJICAgIGlmIChyZXRWYWwgIT0gR1RfT0spCi0JCSAgICB7Ci0JCSAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgiZGRyNFRpcFJlY2VpdmVyQ2FsaWJyYXRpb24gZmFpbHVyZSBcbiIpKTsKLQkJICAgICAgICBpZiAoZGVidWdNb2RlID09IEdUX0ZBTFNFKQotCQkgICAgICAgIHsKLQkJICAgICAgICAgICAgcmV0dXJuIEdUX0ZBSUw7Ci0JCSAgICAgICAgfQotCQkgICAgfQotCQl9Ci0JCWlmIChtYXNrVHVuZUZ1bmMgJiBXTF9QSEFTRV9DT1JSRUNUSU9OX01BU0tfQklUKQotCQl7Ci0JCSAgIHRyYWluaW5nU3RhZ2UgPSBXTF9QSEFTRV9DT1JSRUNUSU9OOwotCQkgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfSU5GTywgKCJXTF9QSEFTRV9DT1JSRUNUSU9OX01BU0tfQklUXG4iKSk7Ci0JCSAgICByZXRWYWwgPSBkZHI0VGlwRHluYW1pY1dyaXRlTGV2ZWxpbmdTdXBwKGRldk51bSk7Ci0JCSAgICBpZiAoaXNSZWdEdW1wICE9IDApCi0JCSAgICB7Ci0JCSAgICAgICBkZHIzVGlwUmVnRHVtcChkZXZOdW0pOwotCQkgICAgfQotCQkgICAgaWYgKHJldFZhbCAhPSBHVF9PSykKLQkJICAgIHsKLQkJICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9FUlJPUiwgKCJkZHI0VGlwRHluYW1pY1dyaXRlTGV2ZWxpbmdTdXBwIGZhaWx1cmVcbiIpKTsKLQkJICAgICAgICBpZiAoZGVidWdNb2RlID09IEdUX0ZBTFNFKQotCQkgICAgICAgIHsKLQkJICAgICAgICAgICAgcmV0dXJuIEdUX0ZBSUw7Ci0JCSAgICAgICAgfQotCQkgICAgfQotCQl9Ci0JCWlmIChtYXNrVHVuZUZ1bmMgJiBEUV9WUkVGX0NBTElCUkFUSU9OX01BU0tfQklUKQotCQl7Ci0JCSAgIHRyYWluaW5nU3RhZ2UgPSBEUV9WUkVGX0NBTElCUkFUSU9OOwotCQkgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfSU5GTywgKCJEUV9WUkVGX0NBTElCUkFUSU9OX01BU0tfQklUXG4iKSk7Ci0JCSAgICByZXRWYWwgPSBkZHI0VGlwRHFWcmVmQ2FsaWJyYXRpb24oZGV2TnVtKTsKLQkJICAgIGlmIChpc1JlZ0R1bXAgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgIGRkcjNUaXBSZWdEdW1wKGRldk51bSk7Ci0JCSAgICB9Ci0JCSAgICBpZiAocmV0VmFsICE9IEdUX09LKQotCQkgICAgewotCQkgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAoImRkcjRUaXBEcVZyZWZDYWxpYnJhdGlvbiBmYWlsdXJlXG4iKSk7Ci0JCSAgICAgICAgaWYgKGRlYnVnTW9kZSA9PSBHVF9GQUxTRSkKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICAgIHJldHVybiBHVF9GQUlMOwotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJfQotCX0KLQllZmZlY3RpdmVfY3MgPSAwOwotICAgIGlmIChtYXNrVHVuZUZ1bmMgJiBEUV9NQVBQSU5HX01BU0tfQklUKQotICAgIHsKLSAgICAgICB0cmFpbmluZ1N0YWdlID0gRFFfTUFQUElORzsKLSAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfSU5GTywgKCJEUV9NQVBQSU5HX01BU0tfQklUXG4iKSk7Ci0gICAgICAgIHJldFZhbCA9IGRkcjREcVBpbnNNYXBwaW5nKGRldk51bSk7Ci0gICAgICAgIGlmIChpc1JlZ0R1bXAgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICBkZHIzVGlwUmVnRHVtcChkZXZOdW0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXRWYWwgIT0gR1RfT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAoImRkcjREcVBpbnNNYXBwaW5nIGZhaWx1cmVcbiIpKTsKLSAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUgPT0gR1RfRkFMU0UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdUX0ZBSUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBERFI0RGRyNFRyYWluaW5nTWFpbkZsb3coZGV2TnVtKSk7CiAgICAgfQogI2VuZGlmCiAKQEAgLTI3NzMsMTAgKzI3ODEsMTAgQEAKICAgICB9CiAgICAgLyogcHJpbnQgbG9nICovCiAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBQcmludExvZyhkZXZOdW0sIHdpbmRvd01lbUFkZHIpKTsKLQorI2lmbmRlZiBNVl9IV1NfRVhDTFVERV9ERUJVR19QUklOVFMKIAlpZihyZXRWYWwgIT0gR1RfT0spCiAJCUNIRUNLX1NUQVRVUyhkZHIzVGlwUHJpbnRTdGFiaWxpdHlMb2coZGV2TnVtKSk7Ci0KKyNlbmRpZgogICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICAgewogICAgICAgICBpc0lmRmFpbCA9IEdUX0ZBTFNFOwpAQCAtMjc5NCw3ICsyODAyLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKLQlpZiAoKHJldFZhbD09IEdUX0ZBSUwpIHx8IChpc0F1dG9UdW5lRmFpbCA9PSBHVF9UUlVFKSkKKwlpZiAoKChyZXRWYWwgIT0gR1RfT0spICYmIChpc0F1dG9UdW5lRmFpbCA9PSBHVF9GQUxTRSkpIHx8CisJICAgICgocmV0VmFsID09IEdUX09LKSAmJiAoaXNBdXRvVHVuZUZhaWwgPT0gR1RfVFJVRSkpKQorCXsKKwkJLyogaW4gY2FzZSBNYWluRmxvdyByZXN1bHQgYW5kIHRyYWluaW5nUmVzdWx0IERCIGFyZSBub3Qgc3luY2VkIHdlIGlzc3VlIHdhcm5pbmcgbWVzc2FnZQorCQkgICB0aGlzIHVzdWFsbHkgbWVhbnMgdGhhdCB0cmFpbmluZ1Jlc3VsdCBEQiB3YXMgbm90IHVwZGF0ZWQgaW4gYSBjYXNlIG9mIGEgZmFpbHVyZSAqLworCQlERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9JTkZPLCAoIldhcm5pbmc6IEFsZ29yaXRobSByZXR1cm4gdmFsdWUgYW5kIFJlc3VsdCBEQiBhcmUgbm90IHN5bmNlZCAocmV0VmFsIDB4JXggIHJlc3VsdCBEQiAlZClcbiIsIHJldFZhbCwgaXNBdXRvVHVuZUZhaWwpKTsKKwl9CisKKwlpZiAoKHJldFZhbCAhPSBHVF9PSykgfHwgKGlzQXV0b1R1bmVGYWlsID09IEdUX1RSVUUpKQogCQlyZXR1cm4gR1RfRkFJTDsKIAllbHNlCiAJCXJldHVybiBHVF9PSzsKQEAgLTI4MDgsMzYgKzI4MjQsMzcgQEAKICAgICBHVF9VMzIgZGV2TnVtCiApCiB7Ci0gICBHVF9CT09MIGlzRmFpbCA9IEdUX0ZBTFNFOwotICAgR1RfVTMyIGludGVyZmFjZUlkID0gMCwgbWVtTWFzaz0gMCAsIGJ1c0luZGV4ID0gMDsKKyAgICBHVF9CT09MIGlzRmFpbCA9IEdUX0ZBTFNFOworICAgIEdUX1UzMiBpbnRlcmZhY2VJZCA9IDAsIG1lbU1hc2s9IDAgLCBidXNJbmRleCA9IDA7CisgICAgR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAotICAgLypFbmFibGUgaW5pdCBzZXF1ZW5jZSAqLwotICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIFNEUkFNX0lOSVRfQ09OVFJPTF9SRUcsIDB4MSwweDEpKTsKKyAgICAvKkVuYWJsZSBpbml0IHNlcXVlbmNlICovCisgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIFNEUkFNX0lOSVRfQ09OVFJPTF9SRUcsIDB4MSwweDEpKTsKIAotICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKLSAgIHsKLSAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCisgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKKyAgICB7CisgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCiAKLSAgICAgIGlmIChkZHIzVGlwSWZQb2xsaW5nKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDAsIDB4MSwgU0RSQU1fSU5JVF9DT05UUk9MX1JFRywgTUFYX1BPTExJTkdfSVRFUkFUSU9OUykgIT0gR1RfT0spCi0gICAgICB7Ci0gICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9FUlJPUiwgKCJwb2xsaW5nIGZhaWxlZCBJRiAlZCBcbiIsaW50ZXJmYWNlSWQpKTsgCi0gICAgICAgICBpc0ZhaWwgPSBHVF9UUlVFOwotICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBtZW1NYXNrID0gMDsKLSAgICAgIGZvcihidXNJbmRleD0wOyBidXNJbmRleCA8IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKSA7IGJ1c0luZGV4KyspCi0gICAgICB7Ci0gICAgICAgCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJbmRleCkKLSAgICAgICAgIAltZW1NYXNrIHw9IHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0luZGV4XS5taXJyb3JFbmFibGVCaXRtYXNrOwotICAgICAgfQotICAgICAgaWYgKG1lbU1hc2sgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgICAvKkRpc2FibGUgTXVsdGlDUyAqLwotICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgaW50ZXJmYWNlSWQsIENTX0VOQUJMRV9SRUcsIDE8PDMsIDE8PDMpKTsKLSAgICAgIH0KKyAgICAgICAgaWYgKGRkcjNUaXBJZlBvbGxpbmcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMCwgMHgxLCBTRFJBTV9JTklUX0NPTlRST0xfUkVHLCBNQVhfUE9MTElOR19JVEVSQVRJT05TKSAhPSBHVF9PSykKKyAgICAgICAgeworICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgicG9sbGluZyBmYWlsZWQgSUYgJWQgXG4iLGludGVyZmFjZUlkKSk7IAorICAgICAgICAgICAgaXNGYWlsID0gR1RfVFJVRTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1lbU1hc2sgPSAwOworICAgICAgICBmb3IoYnVzSW5kZXg9MDsgYnVzSW5kZXggPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBidXNJbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgICBWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJbmRleCkKKyAgICAgICAgICAgIG1lbU1hc2sgfD0gdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzSW5kZXhdLm1pcnJvckVuYWJsZUJpdG1hc2s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lbU1hc2sgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypEaXNhYmxlIE11bHRpQ1MgKi8KKyAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIGludGVyZmFjZUlkLCBDU19FTkFCTEVfUkVHLCAxPDwzLCAxPDwzKSk7CisgICAgICAgIH0KIAotICAgfQotICAgcmV0dXJuIChpc0ZhaWwgPT0gR1RfRkFMU0UpPyBHVF9PSzpHVF9GQUlMOworICAgIH0KKyAgICByZXR1cm4gKGlzRmFpbCA9PSBHVF9GQUxTRSk/IEdUX09LOkdUX0ZBSUw7CiB9CiAKIApAQCAtMjk4NSwzMiArMzAwMiwzMSBAQAogCiBHVF9TVEFUVVMgbXZId3NEZHIzQ3NCYXNlQWRyQ2FsYyhHVF9VMzIgaW50ZXJmYWNlSWQsIEdUX1UzMiB1aUNzLCBHVF9VMzIgKmNzQmFzZUFkZHIpCiB7Ci0KLQlHVF9VMzIgdWlDc01lbVNpemUgPSAwOworICAgICAgIEdUX1UzMiB1aUNzTWVtU2l6ZSA9IDA7CiAKICNpZmRlZiBNVl9ERVZJQ0VfTUFYX0RSQU1fQUREUkVTU19TSVpFCi0JR1RfVTMyIHBoeXNpY2FsTWVtU2l6ZTsKLQlHVF9VMzIgbWF4TWVtU2l6ZSA9IE1WX0RFVklDRV9NQVhfRFJBTV9BRERSRVNTX1NJWkU7CisgICAgICAgR1RfVTMyIHBoeXNpY2FsTWVtU2l6ZTsKKyAgICAgICBHVF9VMzIgbWF4TWVtU2l6ZSA9IE1WX0RFVklDRV9NQVhfRFJBTV9BRERSRVNTX1NJWkU7CiAjZW5kaWYKIAotCWlmIChtdkh3c0RkcjNDYWxjTWVtQ3NTaXplKGludGVyZmFjZUlkLHVpQ3MsICZ1aUNzTWVtU2l6ZSkgIT0gR1RfT0spCi0JCXJldHVybiBHVF9GQUlMOworICAgICAgIGlmIChtdkh3c0RkcjNDYWxjTWVtQ3NTaXplKGludGVyZmFjZUlkLHVpQ3MsICZ1aUNzTWVtU2l6ZSkgIT0gR1RfT0spCisgICAgICAgICAgICAgICByZXR1cm4gR1RfRkFJTDsKIAogI2lmZGVmIE1WX0RFVklDRV9NQVhfRFJBTV9BRERSRVNTX1NJWkUKLQkvKiBpZiBudW1iZXIgb2YgYWRkcmVzcyBwaW5zIGRvZXNuJ3QgYWxsb3cgdG8gdXNlIG1heCBtZW0gc2l6ZSB0aGF0IGlzIGRlZmluZWQgaW4gdG9wb2xvZ3kKLQkgbWVtIHNpemUgaXMgZGVmaW5lZCBieSBNVl9ERVZJQ0VfTUFYX0RSQU1fQUREUkVTU19TSVpFKi8KLQlwaHlzaWNhbE1lbVNpemUgPSBtdkh3c21lbVNpemUgW3RvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbMF0ubWVtb3J5U2l6ZV07CisgICAgICAgLyogaWYgbnVtYmVyIG9mIGFkZHJlc3MgcGlucyBkb2Vzbid0IGFsbG93IHRvIHVzZSBtYXggbWVtIHNpemUgdGhhdCBpcyBkZWZpbmVkIGluIHRvcG9sb2d5CisgICAgICAgIG1lbSBzaXplIGlzIGRlZmluZWQgYnkgTVZfREVWSUNFX01BWF9EUkFNX0FERFJFU1NfU0laRSovCisgICAgICAgcGh5c2ljYWxNZW1TaXplID0gIG12TWVtU2l6ZVt0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zWzBdLm1lbW9yeVNpemVdOwogCi0JaWYgKG12SHdzRGRyM0dldERldmljZVdpZHRoKHVpQ3MpID09IDE2KQotCQltYXhNZW1TaXplID0gTVZfREVWSUNFX01BWF9EUkFNX0FERFJFU1NfU0laRSAqIDI7IC8qIDE2Yml0IG1lbSBkZXZpY2UgY2FuIGJlIHR3aWNlIG1vcmUgLSBubyBuZWVkIGluIGxlc3Mgc2lnbmlmaWNhbnQgcGluKi8KKyAgICAgICBpZiAobXZId3NEZHIzR2V0RGV2aWNlV2lkdGgodWlDcykgPT0gMTYpCisgICAgICAgICAgICAgICBtYXhNZW1TaXplID0gTVZfREVWSUNFX01BWF9EUkFNX0FERFJFU1NfU0laRSAqIDI7IC8qIDE2Yml0IG1lbSBkZXZpY2UgY2FuIGJlIHR3aWNlIG1vcmUgLSBubyBuZWVkIGluIGxlc3Mgc2lnbmlmaWNhbnQgcGluKi8KIAotCWlmIChwaHlzaWNhbE1lbVNpemUgPiBtYXhNZW1TaXplICl7Ci0JCXVpQ3NNZW1TaXplID0gbWF4TWVtU2l6ZSAqIChtdkh3c0RkcjNHZXRCdXNXaWR0aCgpIC8gbXZId3NEZHIzR2V0RGV2aWNlV2lkdGgoaW50ZXJmYWNlSWQpKSA7Ci0JCURFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAgKCJVcGRhdGVkIFBoeXNpY2FsIE1lbSBzaXplIGlzIGZyb20gMHgleCB0byAleFxuIiwgcGh5c2ljYWxNZW1TaXplLCBNVl9ERVZJQ0VfTUFYX0RSQU1fQUREUkVTU19TSVpFKSk7Ci0JfQorICAgICAgIGlmIChwaHlzaWNhbE1lbVNpemUgPiBtYXhNZW1TaXplICl7CisgICAgICAgICAgICAgICB1aUNzTWVtU2l6ZSA9IG1heE1lbVNpemUgKiAobXZId3NEZHIzR2V0QnVzV2lkdGgoKSAvIG12SHdzRGRyM0dldERldmljZVdpZHRoKGludGVyZmFjZUlkKSkgOworICAgICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICAoIlVwZGF0ZWQgUGh5c2ljYWwgTWVtIHNpemUgaXMgZnJvbSAweCV4IHRvICV4XG4iLCBwaHlzaWNhbE1lbVNpemUsIE1WX0RFVklDRV9NQVhfRFJBTV9BRERSRVNTX1NJWkUpKTsKKyAgICAgICB9CiAjZW5kaWYKLQkvKmNhbGN1bGF0ZSBDUyBiYXNlIGFkZHIgICovCi0JKmNzQmFzZUFkZHIgPSAoKHVpQ3NNZW1TaXplKSAqIHVpQ3MpICYgMHhGRkZGMDAwMDsKLQlyZXR1cm4gR1RfT0s7CisgICAgICAgLypjYWxjdWxhdGUgQ1MgYmFzZSBhZGRyICAqLworICAgICAgICpjc0Jhc2VBZGRyID0gKCh1aUNzTWVtU2l6ZSkgKiB1aUNzKSAmIDB4RkZGRjAwMDA7CisgICAgICAgcmV0dXJuIEdUX09LOwogfQogCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nQmlzdC5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ0Jpc3QuYwppbmRleCAwOGU5OWQ1Li5lY2ZmNTJhIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nQmlzdC5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdCaXN0LmMKQEAgLTEyMywxOSArMTIzLDIwIEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSxBQ0NFU1NfVFlQRV9VTklDQVNULCBpZk51bSwgT0RQR19CSVNUX0RPTkUsIHJlYWREYXRhLCBNQVNLX0FMTF9CSVRTKSk7CiAJCQkJCWRhdGFWYWx1ZSA9IHJlYWREYXRhW2ludGVyZmFjZU51bV07Ci0jaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZCAoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZCAoQ09ORklHX0FSTUFEQV8zOVgpCi0JCQkJCWlmICgoZGF0YVZhbHVlICYgMHgxKSA9PSAweDApLyppbiBTT0MgdHlwZSBkZXZpY2VzIHRoaXMgYml0IGlzIHNlbGYgY2xlYXIgc28sIGlmIGl0IHdhcyBjbGVhcmVkIGFsbCBnb29kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2Vsc2UKLQkJCQkJaWYgKChkYXRhVmFsdWUgJiAweDEpID09IDB4MSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmlzdFJlc2V0Qml0ICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLEFDQ0VTU19UWVBFX1VOSUNBU1QsIGlmTnVtLCBPRFBHX0JJU1RfRE9ORSwgKGRhdGFWYWx1ZSAmIDB4RkZGRkZGRkUpLCBNQVNLX0FMTF9CSVRTKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCisJCQkJCWlmIChkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPj0gTVZfVElQX1JFVl8zKXsKKwkJCQkJCWlmICgoZGF0YVZhbHVlICYgMHgxKSA9PSAweDApLyppbiBTT0MgdHlwZSBkZXZpY2VzIHRoaXMgYml0IGlzIHNlbGYgY2xlYXIgc28sIGlmIGl0IHdhcyBjbGVhcmVkIGFsbCBnb29kKi8KKwkJICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQkJfQorCQkJCQllbHNleworCQkJCQkJaWYgKChkYXRhVmFsdWUgJiAweDEpID09IDB4MSkKKwkJICAgICAgICAgICAgICAgIHsKKwkJICAgICAgICAgICAgICAgICAgICBpZiAoaXNCaXN0UmVzZXRCaXQgIT0gMCkKKwkJICAgICAgICAgICAgICAgICAgICB7CisJCSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxBQ0NFU1NfVFlQRV9VTklDQVNULCBpZk51bSwgT0RQR19CSVNUX0RPTkUsIChkYXRhVmFsdWUgJiAweEZGRkZGRkZFKSwgTUFTS19BTExfQklUUykpOworCQkgICAgICAgICAgICAgICAgICAgIH0KKwkJICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJICAgICAgICAgICAgICAgIH0KKwkJCQkJfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocG9sbENudCA+PSBNYXhQb2xsKQogICAgICAgICAgICAgICAgIHsKQEAgLTI2MiwxOSArMjYzLDIxIEBACiAKICAgIGlmIChvcGVyVHlwZSA9PSBCSVNUX1NUT1ApCiAgICB7Ci0jaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZCAoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZCAoQ09ORklHX0FSTUFEQV8zOVgpCi0JICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCAgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsICBPRFBHX0JJU1RfRE9ORSwgICgxIDw8IDgpLCAoMSA8PCA4KSkpOwotI2Vsc2UKLQkgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sICBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgIE9EUEdfREFUQV9DT05UUk9MX1JFRywgICgxIDw8IDMwKSAgLCAoR1RfVTMyKSgweDMgPDwgMzApKSk7Ci0jZW5kaWYKKwkJaWYgKGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWKSA+PSBNVl9USVBfUkVWXzMpeworCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCAgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsICBPRFBHX0JJU1RfRE9ORSwgICgxIDw8IDgpLCAoMSA8PCA4KSkpOworCQl9CisJCWVsc2V7CisJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sICBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgIE9EUEdfREFUQV9DT05UUk9MX1JFRywgICgxIDw8IDMwKSAgLCAoR1RfVTMyKSgweDMgPDwgMzApKSk7CisJCX0KICAgIH0KICAgIGVsc2UKICAgIHsKLSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkIChDT05GSUdfQUxMRVlDQVQzKSB8fCBkZWZpbmVkIChDT05GSUdfQVJNQURBXzM5WCkKLSAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sICBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgIE9EUEdfQklTVF9ET05FLCAgMSwgMSkpOwotI2Vsc2UKLQkgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sICBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgIE9EUEdfREFUQV9DT05UUk9MX1JFRywgIChHVF9VMzIpKDEgPDwgMzEpLCAoR1RfVTMyKSgxIDw8IDMxKSkpOwotI2VuZGlmCisJCWlmIChkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPj0gTVZfVElQX1JFVl8zKXsKKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCAgT0RQR19CSVNUX0RPTkUsICAxLCAxKSk7CisJCX0KKwkJZWxzZXsKKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCAgT0RQR19EQVRBX0NPTlRST0xfUkVHLCAgKEdUX1UzMikoMSA8PCAzMSksIChHVF9VMzIpKDEgPDwgMzEpKSk7CisJCX0KICAgIH0KICAgIHJldHVybiBHVF9PSzsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdDZW50cmFsaXphdGlvbi5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ0NlbnRyYWxpemF0aW9uLmMKaW5kZXggYTZlODY4YS4uMDM1OTdlZCAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ0NlbnRyYWxpemF0aW9uLmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ0NlbnRyYWxpemF0aW9uLmMKQEAgLTEyOCw2ICsxMjgsNyBAQAogCUdUX1UzMiBwdXBXaW5MZW5ndGggPSAwOwogICAgIE1WX0hXU19TZWFyY2hEaXJlY3Rpb24gc2VhcmNoRGlySWQ7CiAJR1RfVTggY29uc1RhcCA9IChtb2RlID09IENFTlRSQUxfVFgpPyg2NCk6KDApOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKQEAgLTE1MCwxMSArMTUxLDEyIEBACiAgICAgICAgIHJlZ1BoeU9mZnNldCA9IFJFQURfQ0VOVFJBTElaQVRJT05fUEhZX1JFRyArIChlZmZlY3RpdmVfY3MgKiA0KTsKICAgICAgICAgZGlyZWN0aW9uID0gT1BFUl9SRUFEOwogICAgIH0KKwogICAgIC8qIERCIGluaXRpYWxpemF0aW9uICovCiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgICB7CiAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0gICAgICAgIGZvcihidXNJZCA9IDA7IGJ1c0lkIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgYnVzSWQrKykKKyAgICAgICAgZm9yKGJ1c0lkID0gMDsgYnVzSWQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBidXNJZCsrKQogICAgICAgICB7CiAgICAgICAgIAlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKICAgICAgICAgICAgIGNlbnRyYWxpemF0aW9uU3RhdGVbaW50ZXJmYWNlSWRdW2J1c0lkXSA9IDA7CkBAIC0xNjMsNiArMTY1LDcgQEAKICAgICAgICAgICAgIGNlbnRyYWxpemF0aW9uUmVzdWx0W2ludGVyZmFjZUlkXVtidXNJZF0gPSAwOwogICAgICAgICB9CiAgICAgfQorCiAgICAgLyogc3RhcnQgZmxvdyAqLwogICAgIGZvcihwYXR0ZXJuSWQgPSBzdGFydFBhdHRlcm47IHBhdHRlcm5JZCA8PSBlbmRQYXR0ZXJuIDsgcGF0dGVybklkKyspCiAgICAgewpAQCAtMTcxLDEwICsxNzQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNX05PVF9DQVJFLCBkaXJlY3Rpb24sIHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwgbWF4V2luU2l6ZS0xLCBtYXhXaW5TaXplLTEsIHBhdHRlcm5JZCwgRURHRV9GUEYsIENTX1NJTkdMRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTV9OT1RfQ0FSRSwgdHJhaW5pbmdSZXN1bHQpOworCiAgICAgICAgIGZvcihpbnRlcmZhY2VJZCA9IHN0YXJ0SWY7IGludGVyZmFjZUlkIDw9IGVuZElmOyBpbnRlcmZhY2VJZCsrKQogICAgICAgICB7CiAgICAgICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICAgICAgZm9yKGJ1c0lkID0gMDsgYnVzSWQgPD0gdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlLTEgOyBidXNJZCsrKQorICAgICAgICAgICAgZm9yKGJ1c0lkID0gMDsgYnVzSWQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBidXNJZCsrKQogICAgICAgICAgICAgewogICAgICAgICAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0lkKQogCkBAIC0yNjAsNiArMjY0LDcgQEAKIAkJICAgICAgICAgICAgICAgIGNlbnRyYWxpemF0aW9uU3RhdGVbaW50ZXJmYWNlSWRdW2J1c0lkXSA9IDE7CiAJCSAgICAgICAgICAgICAgICBpZiAoZGVidWdNb2RlID09IEdUX0ZBTFNFKQogCQkgICAgICAgICAgICAgICAgeworCQkJCQkJCWZsb3dSZXN1bHRbaW50ZXJmYWNlSWRdID0gVEVTVF9GQUlMRUQ7CiAJCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdUX0ZBSUw7CiAJCSAgICAgICAgICAgICAgICB9CiAJCSAgICAgICAgICAgIH0KQEAgLTI2OSwxMyArMjc0LDExIEBACiAgICAgfS8qcGF0dGVybiovCiAgICAgZm9yKGludGVyZmFjZUlkID0gc3RhcnRJZjsgaW50ZXJmYWNlSWQgPD0gZW5kSWY7IGludGVyZmFjZUlkKyspCiAgICAgewotICAgICAgICBpZiAoSVNfSU5URVJGQUNFX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpID09ICBHVF9GQUxTRSkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KKwkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKwogICAgICAgICBpc0lmRmFpbCA9IEdUX0ZBTFNFOwogICAgICAgICBmbG93UmVzdWx0W2ludGVyZmFjZUlkXSA9IFRFU1RfU1VDQ0VTUzsKLSAgICAgICAgZm9yKGJ1c0lkID0gMDsgYnVzSWQgPD0gKHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZS0xKSA7IGJ1c0lkKyspCisgICAgICAgIGZvcihidXNJZCA9IDA7IGJ1c0lkIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgYnVzSWQrKykKICAgICAgICAgewogICAgICAgICAJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSWQpCiAKQEAgLTMwMiw2ICszMDUsNyBAQAogICAgICAgICAgICAgICAgICAgICBjb25zVGFwICAgPSA2NDsKIAkJCQl9CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qIGNoZWNrIHN0YXRlcyAqLwogICAgICAgICAgICAgaWYgKGNlbnRyYWxpemF0aW9uU3RhdGVbaW50ZXJmYWNlSWRdW2J1c0lkXSA9PSAzKQogICAgICAgICAgICAgewpAQCAtMzIyLDYgKzMyNiw3IEBACiAgICAgICAgICAgICAgICAgREVCVUdfQ0VOVFJBTElaQVRJT05fRU5HSU5FKERFQlVHX0xFVkVMX0VSUk9SLCAoImZhaWwsIElGICVkIHB1cCAlZFxuIiwgaW50ZXJmYWNlSWQsIGJ1c0lkKSk7CiAgICAgICAgICAgICAgICAgbG9ja1N1Y2Nlc3MgPSBHVF9GQUxTRTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGxvY2tTdWNjZXNzID09IEdUX1RSVUUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgY2VudHJhbGl6YXRpb25SZXN1bHRbaW50ZXJmYWNlSWRdW2J1c0lkXSA9IChidXNFbmRXaW5kb3dbbW9kZV1baW50ZXJmYWNlSWRdW2J1c0lkXSArIGJ1c1N0YXJ0V2luZG93W21vZGVdW2ludGVyZmFjZUlkXVtidXNJZF0pLzIgLSBjb25zVGFwOwpAQCAtMzQzLDE3ICszNDgsMjAgQEAKICAgICAgICAgICAgICAgICBpc0lmRmFpbCA9IEdUX1RSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgfQorCiAgICAgICAgaWYgKGlzSWZGYWlsID09IEdUX1RSVUUpCiAgICAgICAgewogICAgICAgICAgICBmbG93UmVzdWx0W2ludGVyZmFjZUlkXSA9IFRFU1RfRkFJTEVEOwogICAgICAgIH0KICAgIH0KIAotICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCisgICAvKiByZXN0b3JlIGNzIGVuYWJsZSB2YWx1ZSovCisgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgewotICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKSAgICAgICAgLyogcmVzdG9yZSBjcyBlbmFibGUgdmFsdWUqLworICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBDU19FTkFCTEVfUkVHLCBjc0VuYWJsZVJlZ1ZhbFtpbnRlcmZhY2VJZF0sIE1BU0tfQUxMX0JJVFMpKTsKICAgIH0KKwogICAgcmV0dXJuIGlzSWZGYWlsOwogfQogCkBAIC0zNzksMTAgKzM4NywxMSBAQAogICAgCUdUX1UzMiAgIGNzRW5hYmxlUmVnVmFsW01BWF9JTlRFUkZBQ0VfTlVNXTsKIAlHVF9VMzIgdGVtcCA9IDA7CiAgICAgaW50IFBhZE51bSA9IDA7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAotCWlmKCBkZHIzVGlwU3BlY2lhbFJ4UnVuT25jZUZsYWcgIT0gMCApCisJaWYoIChkZHIzVGlwU3BlY2lhbFJ4UnVuT25jZUZsYWcmKDE8PGVmZmVjdGl2ZV9jcykpID09IDE8PGVmZmVjdGl2ZV9jcyApCiAJCXJldHVybiBHVF9PSzsKLQlkZHIzVGlwU3BlY2lhbFJ4UnVuT25jZUZsYWcgPSAxOworCWRkcjNUaXBTcGVjaWFsUnhSdW5PbmNlRmxhZyB8PSAxPDxlZmZlY3RpdmVfY3M7CiAKICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8IE1BWF9JTlRFUkZBQ0VfTlVNOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKQEAgLTM5NSwzOCArNDA0LDM4IEBACiAKICAgICBtYXhXaW5TaXplID0gTUFYX1dJTkRPV19TSVpFX1JYOwogICAgIGRpcmVjdGlvbiA9IE9QRVJfUkVBRDsKLQlwYXR0ZXJuSWQgPSBQQVRURVJOX1ZSRUY7CisJcGF0dGVybklkID0gUEFUVEVSTl9GVUxMX1NTTzE7CiAKICAgICAvKiBzdGFydCBmbG93ICovCiAgICAgZGRyM1RpcElwVHJhaW5pbmdXcmFwcGVyKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTV9OT1RfQ0FSRSwgcmVzdWx0VHlwZSwgTVZfSFdTX0NvbnRyb2xFbGVtZW50X0FETEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNX05PVF9DQVJFLCBkaXJlY3Rpb24sIHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAsIG1heFdpblNpemUtMSwgbWF4V2luU2l6ZS0xLCBwYXR0ZXJuSWQsIEVER0VfRlBGLCBDU19TSU5HTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNX05PVF9DQVJFLCB0cmFpbmluZ1Jlc3VsdCk7CisJCQkJICAgICAgICAgICAgICBQQVJBTV9OT1RfQ0FSRSwgcmVzdWx0VHlwZSwgTVZfSFdTX0NvbnRyb2xFbGVtZW50X0FETEwsCisJCQkJICAgICAgICAgICAgIFBBUkFNX05PVF9DQVJFLCBkaXJlY3Rpb24sIHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLAorCQkJCSAgICAgICAgICAgICAweDAsIG1heFdpblNpemUtMSwgbWF4V2luU2l6ZS0xLCBwYXR0ZXJuSWQsIEVER0VfRlBGLCBDU19TSU5HTEUsCisJCQkJICAgICAgICAgICAgIFBBUkFNX05PVF9DQVJFLCB0cmFpbmluZ1Jlc3VsdCk7CiAgICAgZm9yKGludGVyZmFjZUlkID0gc3RhcnRJZjsgaW50ZXJmYWNlSWQgPD0gZW5kSWY7IGludGVyZmFjZUlkKyspCiAgICAgewogICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICBmb3IocHVwSWQgPSAwOyBwdXBJZCA8PSB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXBJZCsrKQorICAgICAgICBmb3IocHVwSWQgPSAwOyBwdXBJZCA8PSBvY3RldHNQZXJJbnRlcmZhY2VOdW07IHB1cElkKyspCiAgICAgICAgIHsKIAkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cElkKQogCiAgICAgICAgICAgICBmb3Ioc2VhcmNoRGlySWQgPSBNVl9IV1NfTG93MkhpZ2ggOyBzZWFyY2hEaXJJZCA8PSBNVl9IV1NfSGlnaDJMb3cgOyBzZWFyY2hEaXJJZCsrKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwUmVhZFRyYWluaW5nUmVzdWx0KGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVwSWQsIEFMTF9CSVRTX1BFUl9QVVAsIHNlYXJjaERpcklkLCAgZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFR5cGUsIFRyYWluaW5nTG9hZE9wZXJhdGlvbl9VTkxPQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfU0lOR0xFLCAmcmVzdWx0W3NlYXJjaERpcklkXSAsIEdUX1RSVUUsIDAsIEdUX0ZBTFNFKSk7Ci0gICAgICAgICAgICAgICAgREVCVUdfQ0VOVFJBTElaQVRJT05fRU5HSU5FKERFQlVHX0xFVkVMX0lORk8sKCJTcGVjaWFsOiBwYXQgJWQgSUYgJWQgcHVwICVkIFJlZ3M6IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleFxuIixwYXR0ZXJuSWQsIGludGVyZmFjZUlkLCBwdXBJZCwgIHJlc3VsdFtzZWFyY2hEaXJJZF1bMF0scmVzdWx0W3NlYXJjaERpcklkXVsxXSxyZXN1bHRbc2VhcmNoRGlySWRdWzJdLHJlc3VsdFtzZWFyY2hEaXJJZF1bM10scmVzdWx0W3NlYXJjaERpcklkXVs0XSxyZXN1bHRbc2VhcmNoRGlySWRdWzVdLHJlc3VsdFtzZWFyY2hEaXJJZF1bNl0scmVzdWx0W3NlYXJjaERpcklkXVs3XSkpOworCQkJCUNIRUNLX1NUQVRVUyhkZHIzVGlwUmVhZFRyYWluaW5nUmVzdWx0KGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsCisJCQkJICAgICAgICAgICAgIHB1cElkLCBBTExfQklUU19QRVJfUFVQLCBzZWFyY2hEaXJJZCwgIGRpcmVjdGlvbiwKKwkJCQkgICAgICAgICAgICByZXN1bHRUeXBlLCBUcmFpbmluZ0xvYWRPcGVyYXRpb25fVU5MT0FELAorCQkJCSAgICAgICAgICAgIENTX1NJTkdMRSwgJnJlc3VsdFtzZWFyY2hEaXJJZF0gLCBHVF9UUlVFLCAwLCBHVF9GQUxTRSkpOworCQkJCURFQlVHX0NFTlRSQUxJWkFUSU9OX0VOR0lORShERUJVR19MRVZFTF9JTkZPLCgiU3BlY2lhbDogcGF0ICVkIElGICVkIHB1cCAlZCBSZWdzOiAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXhcbiIscGF0dGVybklkLCBpbnRlcmZhY2VJZCwgcHVwSWQsICByZXN1bHRbc2VhcmNoRGlySWRdWzBdLHJlc3VsdFtzZWFyY2hEaXJJZF1bMV0scmVzdWx0W3NlYXJjaERpcklkXVsyXSxyZXN1bHRbc2VhcmNoRGlySWRdWzNdLHJlc3VsdFtzZWFyY2hEaXJJZF1bNF0scmVzdWx0W3NlYXJjaERpcklkXVs1XSxyZXN1bHRbc2VhcmNoRGlySWRdWzZdLHJlc3VsdFtzZWFyY2hEaXJJZF1bN10pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvcihiaXRJZCA9IDA7IGJpdElkIDwgQlVTX1dJRFRIX0lOX0JJVFMgIDsgYml0SWQrKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiB0aGlzIGNvZGUgaXMgdmFsaWQgZm9yIDIgZWRnZSwgcHJvYmFibHkgbm90IDooICovCi0gICAgICAgICAgICAgICAgY3VycmVudFN0YXJ0V2luZG93W2JpdElkXSA9IEdFVF9UQVBfUkVTVUxUKHJlc3VsdFtNVl9IV1NfTG93MkhpZ2hdW2JpdElkXSwgRURHRV8xKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50RW5kV2luZG93W2JpdElkXSA9IEdFVF9UQVBfUkVTVUxUKHJlc3VsdFtNVl9IV1NfSGlnaDJMb3ddW2JpdElkXSwgRURHRV8xKTsKKwkJCQkvKiBjaGVjayBpZiB0aGlzIGNvZGUgaXMgdmFsaWQgZm9yIDIgZWRnZSwgcHJvYmFibHkgbm90IDooICovCisJCQkJY3VycmVudFN0YXJ0V2luZG93W2JpdElkXSA9IEdFVF9UQVBfUkVTVUxUKHJlc3VsdFtNVl9IV1NfTG93MkhpZ2hdW2JpdElkXSwgRURHRV8xKTsKKwkJCQljdXJyZW50RW5kV2luZG93W2JpdElkXSA9IEdFVF9UQVBfUkVTVUxUKHJlc3VsdFtNVl9IV1NfSGlnaDJMb3ddW2JpdElkXSwgRURHRV8xKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmKCAhKChkZHIzVGlwSXNQdXBMb2NrKHJlc3VsdFtNVl9IV1NfTG93MkhpZ2hdLCByZXN1bHRUeXBlKSkgJiYgKGRkcjNUaXBJc1B1cExvY2socmVzdWx0W01WX0hXU19IaWdoMkxvd10sIHJlc3VsdFR5cGUpKSkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUdfQ0VOVFJBTElaQVRJT05fRU5HSU5FKERFQlVHX0xFVkVMX0VSUk9SLCgiU3BlY2lhbDogUHVwIGxvY2sgZmFpbCwgcGF0ICVkIElGICVkIHB1cCAlZCBcbiIscGF0dGVybklkLCBpbnRlcmZhY2VJZCwgcHVwSWQpKTsKKwkJCQlERUJVR19DRU5UUkFMSVpBVElPTl9FTkdJTkUoREVCVUdfTEVWRUxfRVJST1IsKCJTcGVjaWFsOiBQdXAgbG9jayBmYWlsLCBwYXQgJWQgSUYgJWQgcHVwICVkIFxuIixwYXR0ZXJuSWQsIGludGVyZmFjZUlkLCBwdXBJZCkpOwogCQkJCXJldHVybiBHVF9GQUlMOwogICAgICAgICAgICAgfQogCkBAIC00MzcsMjIgKzQ0NiwyMiBAQAogCQkJewogCQkJCWZvciggYml0SWQgPSAwIDsgYml0SWQgPCBCVVNfV0lEVEhfSU5fQklUUyA7IGJpdElkKyspCiAJCQkJewotCQkJCQlQYWROdW0gPSBkcU1hcFRhYmxlW2JpdElkK3B1cElkKkJVU19XSURUSF9JTl9CSVRTICsgaW50ZXJmYWNlSWQqQlVTX1dJRFRIX0lOX0JJVFMqdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlXTsKLSAgICAgICAgICAgICAgIAkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoICBkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXBJZCwgIEREUl9QSFlfREFUQSwgIFBCU19SWF9QSFlfUkVHK1BhZE51bSwgJnRlbXApKTsKKwkJCQkJUGFkTnVtID0gZHFNYXBUYWJsZVtiaXRJZCtwdXBJZCpCVVNfV0lEVEhfSU5fQklUUyArIGludGVyZmFjZUlkKkJVU19XSURUSF9JTl9CSVRTKm9jdGV0c1BlckludGVyZmFjZU51bV07CisJCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwSWQsICBERFJfUEhZX0RBVEEsICBQQlNfUlhfUEhZX1JFRytQYWROdW0gKyAgZWZmZWN0aXZlX2NzICogMHgxMCwgJnRlbXApKTsKIAkJCQkJdGVtcCA9ICh0ZW1wICsgMHhBID4gMzEpPygzMSk6KHRlbXAgKyAweEEpOwotICAgICAgICAgICAgICAgCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLEFDQ0VTU19UWVBFX1VOSUNBU1QsaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QscHVwSWQsIEREUl9QSFlfREFUQSwgUEJTX1JYX1BIWV9SRUcrUGFkTnVtLCB0ZW1wKSk7CisJCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sQUNDRVNTX1RZUEVfVU5JQ0FTVCxpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCxwdXBJZCwgRERSX1BIWV9EQVRBLCBQQlNfUlhfUEhZX1JFRytQYWROdW0gKyBlZmZlY3RpdmVfY3MgKiAweDEwLCB0ZW1wKSk7CiAJCQkJfQogCQkJCURFQlVHX0NFTlRSQUxJWkFUSU9OX0VOR0lORShERUJVR19MRVZFTF9JTkZPLCgiU3BlY2lhbDogUEJTOjogSS9GIyAlZCAsIEJ1cyMgJWQgZml4IGFsaWduIHRvIHRoZSBMZWZ0IFxuIiwgaW50ZXJmYWNlSWQscHVwSWQpKTsKIAkJCX0KIAogCQkJaWYoIGN1cnJlbnRFbmRXaW5kb3dNaW4gPiAzMCApLypBbGlnbiByaWd0aCovCiAJCQl7Ci0gICAgICAgICAgICAgICAJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoICBkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXBJZCwgIEREUl9QSFlfREFUQSwgIFBCU19SWF9QSFlfUkVHKzQsICZ0ZW1wKSk7CisJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoICBkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXBJZCwgIEREUl9QSFlfREFUQSwgIFBCU19SWF9QSFlfUkVHKzQgKyBlZmZlY3RpdmVfY3MgKiAweDEwLCAmdGVtcCkpOwogCQkJCXRlbXAgKz0gMHhBOwotICAgICAgICAgICAJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sQUNDRVNTX1RZUEVfVU5JQ0FTVCxpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCxwdXBJZCwgRERSX1BIWV9EQVRBLCBQQlNfUlhfUEhZX1JFRys0LCB0ZW1wKSk7Ci0gICAgICAgICAgICAgICAJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoICBkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXBJZCwgIEREUl9QSFlfREFUQSwgIFBCU19SWF9QSFlfUkVHKzUsICZ0ZW1wKSk7CisJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSxBQ0NFU1NfVFlQRV9VTklDQVNULGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULHB1cElkLCBERFJfUEhZX0RBVEEsIFBCU19SWF9QSFlfUkVHKzQgKyBlZmZlY3RpdmVfY3MgKiAweDEwLCB0ZW1wKSk7CisJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoICBkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXBJZCwgIEREUl9QSFlfREFUQSwgIFBCU19SWF9QSFlfUkVHKzUgKyBlZmZlY3RpdmVfY3MgKiAweDEwLCAmdGVtcCkpOwogCQkJCXRlbXAgKz0gMHhBOwotICAgICAgICAgICAJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sQUNDRVNTX1RZUEVfVU5JQ0FTVCxpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCxwdXBJZCwgRERSX1BIWV9EQVRBLCBQQlNfUlhfUEhZX1JFRys1LCB0ZW1wKSk7CisJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSxBQ0NFU1NfVFlQRV9VTklDQVNULGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULHB1cElkLCBERFJfUEhZX0RBVEEsIFBCU19SWF9QSFlfUkVHKzUgKyBlZmZlY3RpdmVfY3MgKiAweDEwLCB0ZW1wKSk7CiAJCQkJREVCVUdfQ0VOVFJBTElaQVRJT05fRU5HSU5FKERFQlVHX0xFVkVMX0lORk8sKCJTcGVjaWFsOiBQQlM6OiBJL0YjICVkICwgQnVzIyAlZCBmaXggYWxpZ24gdG8gdGhlIHJpZ2h0IFxuIiwgaW50ZXJmYWNlSWQscHVwSWQpKTsKIAkJCX0KIApAQCAtNDkzLDYgKzUwMiw3IEBACiApCiB7CiAgICAgR1RfVTMyIGludGVyZmFjZUlkID0gMCwgYnVzSWQgPSAwOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKIAlkZXZOdW0gPSBkZXZOdW07CiAKQEAgLTUwMSw3ICs1MTEsNyBAQAogICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICAgewogICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICBmb3IoYnVzSWQgPSAwOyBidXNJZCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IGJ1c0lkKyspCisgICAgICAgIGZvcihidXNJZCA9IDA7IGJ1c0lkIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNJZCsrKQogICAgICAgICB7CiAgICAgICAgIAlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKICAgICAgICAgICAgIG12UHJpbnRmKCIlZCAsXG4iLGNlbnRyYWxpemF0aW9uU3RhdGVbaW50ZXJmYWNlSWRdW2J1c0lkXSk7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nRGIuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdEYi5jCmluZGV4IDBlMjkxYjEuLjZjMTBhNGUgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdEYi5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdEYi5jCkBAIC0xOCw3ICsxOCw2IEBACiAqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgogKiAgICAgICAkUmV2aXNpb246IDIwICQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBDT05GSUdfRERSMwogCiAjaW5jbHVkZSAibXZEZHJUcmFpbmluZ0lwRGIuaCIKICNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwLmgiCkBAIC0yNiw3ICsyNSwxMiBAQAogI2luY2x1ZGUgIm12RGRyM1RyYWluaW5nSXBEZWYuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEdsb2JhbHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfSFdTX1RPUE9MT0dZX01BUCAqdG9wb2xvZ3lNYXBEYltIV1NfTUFYX0RFVklDRV9OVU1dID0ge05VTEx9OworLypEZXZpY2UgYXR0cmlidXRlcyBzdHJ1Y3R1cmVzKi8KK01WX0REUl9ERVZfQVRUUklCVVRFIGRkckRldkF0dHJpYnV0ZXNbSFdTX01BWF9ERVZJQ0VfTlVNXVtNVl9BVFRSX0xBU1RdOyAgLyogaG9sZHMgZGV2aWNlIGF0dHJpYnV0ZXMgKi8KK0dUX0JPT0wgZGRyRGV2QXR0ckluaXREb25lW0hXU19NQVhfREVWSUNFX05VTV0gPSB7MH07CS8qIGRlc2NyaWJlZCB3aGV0aGVyIGRldmljZSBhdHRyaWJ1dGVzIHdlcmUgaW5pdGlhbGl6ZWQgKi8KKworI2lmZGVmIENPTkZJR19ERFIzCitNVl9IV1NfVE9QT0xPR1lfTUFQICp0b3BvbG9neU1hcERiW0hXU19NQVhfREVWSUNFX05VTV0gPSB7TlVMTH07ICAgICAgICAgIC8qIGhvbGRzIGRldmljZSBERFIgdG9wb2xvZ3kgKi8KIAogLyogbGlzdCBvZiBhbGxvd2VkIGZyZXF1ZW5jeSBsaXN0ZWQgaW4gb3JkZXIgb2YgTVZfSFdTX0REUl9GUkVRICovCiBHVF9VMzIgZnJlcVZhbFtERFJfRlJFUV9MSU1JVF0gPQpAQCAtMTI1LDcgKzEyOSw3IEBACiAgICAgMSwgLyo1Ki8KICAgICAyLCAvKjYqLwogICAgIDMsIC8qNyovCi0gICAgMTAsCisgICAgNCwgLyo4Ki8KICAgICAxMCwKICAgICA1LCAvKjEwKi8KICAgICAxMCwKQEAgLTMyMiw2ICszMjYsNyBAQAogCTB4RkUKIH07CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKlJldHVybiBzcGVlZCBCaW4gdmFsdWUgZm9yIHNlbGVjdGVkIGluZGV4IGFuZCB0KiBlbGVtZW50Ki8KIEdUX1UzMiBzcGVlZEJpblRhYmxlCkBAIC00MzcsNiArNDQyLDg1IEBACiAJfQogfQogCitJTkxJTkUgc3RhdGljIEdUX1UzMiBwYXR0ZXJuVGFibGVHZXRTc29GdWxsWHRhbGtXb3JkKCBHVF9VOCBiaXQsIEdUX1U4IGluZGV4KQoreworCUdUX1U4IGJ5dGUgPSAoMSA8PCBiaXQpOworCisJaWYoIDEgPT0gKGluZGV4JjEpICl7CisJCWJ5dGUgPSB+Ynl0ZTsKKwl9CisKKwlyZXR1cm4gKGJ5dGUgfHwgKGJ5dGU8PDgpIHx8IChieXRlPDwxNikgfHwgKGJ5dGU8PDI0KSk7Cit9CisKK0lOTElORSBzdGF0aWMgR1RfVTMyIHBhdHRlcm5UYWJsZUdldFNzb1h0YWxrRnJlZVdvcmQoIEdUX1U4IGJpdCwgR1RfVTggaW5kZXgpCit7CisJR1RfVTggYnl0ZSA9ICgxIDw8IGJpdCk7CisKKwlpZiggMSA9PSAoaW5kZXgmMSkgKXsKKwkJYnl0ZSA9IDA7CisJfQorCisJcmV0dXJuIChieXRlIHx8IChieXRlPDw4KSB8fCAoYnl0ZTw8MTYpIHx8IChieXRlPDwyNCkpOworfQorCitJTkxJTkUgc3RhdGljIEdUX1UzMiBwYXR0ZXJuVGFibGVHZXRJU0lXb3JkKCBHVF9VOCBpbmRleCkKK3sKKwlHVF9VOCBJMCA9ICBpbmRleCUzMjsKKwlHVF9VOCBJMSA9ICBpbmRleCU4OworCUdUX1UzMglXb3JkOworCisJaWYoSTAgPiAxNSkKKwl7CisJCVdvcmQgPSAgKChJMSA9PTUpfChJMT09NykpPzB4RkZGRkZGRkY6MHgwOworCX1lbHNleworCQlXb3JkID0gIChJMSA9PTYpPzB4RkZGRkZGRkY6MHgwOworCX0KKworCVdvcmQgPSAoKEkwJTE2KT43KT9+V29yZDpXb3JkOworCXJldHVybiBXb3JkOworfQorCitJTkxJTkUgc3RhdGljIEdUX1UzMiBwYXR0ZXJuVGFibGVHZXRTc29GdWxsWHRhbGtXb3JkXzE2KCBHVF9VOCBiaXQsIEdUX1U4IGluZGV4KQoreworCUdUX1U4IGJ5dGUgPSAoMSA8PCBiaXQpOworCisJaWYoIDEgPT0gKGluZGV4JjEpICl7CisJCWJ5dGUgPSB+Ynl0ZTsKKwl9CisKKwlyZXR1cm4gKGJ5dGUgfHwgKGJ5dGU8PDgpIHx8ICgofmJ5dGUpPDwxNikgfHwgKCh+Ynl0ZSk8PDI0KSk7Cit9CisKK0lOTElORSBzdGF0aWMgR1RfVTMyIHBhdHRlcm5UYWJsZUdldFNzb1h0YWxrRnJlZVdvcmRfMTYoIEdUX1U4IGJpdCwgR1RfVTggaW5kZXgpCit7CisJR1RfVTggYnl0ZSA9ICgxIDw8IGJpdCk7CisKKwlpZiggMCA9PSAoKGluZGV4KSYxKSApeworCQlyZXR1cm4gKChieXRlPDwxNikgfHwgKGJ5dGU8PDI0KSk7CisJfQorCWVsc2V7CisJCXJldHVybiAoYnl0ZSB8fCAoYnl0ZTw8OCkpOworCX0KKworfQorSU5MSU5FIHN0YXRpYyBHVF9VMzIgcGF0dGVyblRhYmxlR2V0SVNJV29yZF8xNiggR1RfVTggaW5kZXgpCit7CisJR1RfVTggSTAgPSAgaW5kZXglMTY7CisJR1RfVTggSTEgPSAgaW5kZXglNDsKKwlHVF9VMzIJV29yZDsKKworCWlmKEkwID4gNykKKwl7CisgCQlXb3JkID0gKCBJMT4xKT8weDAwMDBGRkZGOjB4MDsKKwl9ZWxzZXsKKwkJV29yZCA9ICAoSTEgPT0zKT8weEZGRkYwMDAwOjB4MDsKKwl9CisKKwlXb3JkID0gKChJMCU4KT4zKT9+V29yZDpXb3JkOworCXJldHVybiBXb3JkOworfQorCiBJTkxJTkUgc3RhdGljIEdUX1UzMiBwYXR0ZXJuVGFibGVHZXRWcmVmV29yZChHVF9VOCBpbmRleCkKIHsKIAlpZiggMCA9PSAoKHBhdHRlcm5WcmVmUGF0dGVyblRhYmxlTWFwW2luZGV4LzhdID4+IChpbmRleCU4KSkmMSkgKXsKQEAgLTU0NiwxMyArNjMwLDM2IEBACiAJCWNhc2UgUEFUVEVSTl9WUkVGOgogCQkJcGF0dGVybiA9IHBhdHRlcm5UYWJsZUdldFZyZWZXb3JkKGluZGV4KTsKIAkJCWJyZWFrOworCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEwOgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFExOgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEyOgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEzOgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE0OgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE1OgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE2OgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE3OgorCQkJcGF0dGVybiA9IHBhdHRlcm5UYWJsZUdldFNzb0Z1bGxYdGFsa1dvcmQodHlwZSAtIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEwLCBpbmRleCk7CisJCQlicmVhazsKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMDoKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMToKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMjoKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMzoKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNDoKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNToKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNjoKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNzoKKwkJCXBhdHRlcm4gPSBwYXR0ZXJuVGFibGVHZXRTc29YdGFsa0ZyZWVXb3JkKHR5cGUgLSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMCwgaW5kZXgpOworCQkJYnJlYWs7CisJCWNhc2UgUEFUVEVSTl9JU0lfWFRBTEtfRlJFRToKKwkJCXBhdHRlcm4gPSBwYXR0ZXJuVGFibGVHZXRJU0lXb3JkKCBpbmRleCk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXBhdHRlcm4gPSAwOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAJZWxzZXsKLQkvKjE2Yml0IHBhdHRlcm5zKi8JCisJLyoxNmJpdCBwYXR0ZXJucyovCiAJCXN3aXRjaCh0eXBlKXsKIAkJY2FzZSBQQVRURVJOX1BCUzE6CiAJCWNhc2UgUEFUVEVSTl9QQlMyOgpAQCAtNTg5LDcgKzY5NiwxMyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgUEFUVEVSTl9URVNUOgotCQkJcGF0dGVybiA9IFBBVFRFUk5fMDA4MDsKKwkJCS8qcGF0dGVybiA9IFBBVFRFUk5fMDA4MDsqLworICAgICAgICAgICBpZigoaW5kZXggPT0gMCkgfHwgKGluZGV4ID09IDMpKXsKKwkJCQlwYXR0ZXJuID0gMHgwMDAwMDAwMDsKKwkJCX0KKwkJCWVsc2V7CisJCQkJcGF0dGVybiA9IDB4RkZGRkZGRkY7CisJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBQQVRURVJOX0ZVTExfU1NPMDoKIAkJCXBhdHRlcm4gPSAweDAwMDBGRkZGOwpAQCAtNjAyLDYgKzcxNSwyOSBAQAogCQljYXNlIFBBVFRFUk5fVlJFRjoKIAkJCXBhdHRlcm4gPSBwYXR0ZXJuVGFibGVHZXRWcmVmV29yZDE2KGluZGV4KTsKIAkJCWJyZWFrOworCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEwOgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFExOgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEyOgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEzOgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE0OgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE1OgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE2OgorCQljYXNlIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE3OgorCQkJcGF0dGVybiA9IHBhdHRlcm5UYWJsZUdldFNzb0Z1bGxYdGFsa1dvcmRfMTYodHlwZSAtIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEwLCBpbmRleCk7CisJCQlicmVhazsKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMDoKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMToKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMjoKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMzoKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNDoKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNToKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNjoKKwkJY2FzZSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNzoKKwkJCXBhdHRlcm4gPSBwYXR0ZXJuVGFibGVHZXRTc29YdGFsa0ZyZWVXb3JkXzE2KHR5cGUgLSBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMCwgaW5kZXgpOworCQkJYnJlYWs7CisJCWNhc2UgUEFUVEVSTl9JU0lfWFRBTEtfRlJFRToKKwkJCXBhdHRlcm4gPSBwYXR0ZXJuVGFibGVHZXRJU0lXb3JkXzE2KCBpbmRleCk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXBhdHRlcm4gPSAwOwogCQkJYnJlYWs7CkBAIC02MTEsOCArNzQ3LDkgQEAKIAlyZXR1cm4gcGF0dGVybjsKIH0KIAorCiBNVl9IV1NfVE9QT0xPR1lfTUFQKiAgICBkZHIzVGlwR2V0VG9wb2xvZ3lNYXAKLSggCisoCiAgICAgR1RfVTMyICBkZXZOdW0KICkKIHsKQEAgLTYyMCw3ICs3NTcsNyBAQAogfQogCiB2b2lkICAgIGRkcjNUaXBTZXRUb3BvbG9neU1hcAotKCAKKygKICAgICBHVF9VMzIgIGRldk51bSwKICAgICBNVl9IV1NfVE9QT0xPR1lfTUFQKiB0b3BvbG9neQogKQpAQCAtNjMwLDMgKzc2Nyw1MiBAQAogCiAjZW5kaWYgLyogQ09ORklHX0REUjMgKi8KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitEZXZpY2UgYXR0cmlidXRlcyBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgZGRyM1RpcERldkF0dHJJbml0CisoCisgICAgR1RfVTMyICBkZXZOdW0KKykKK3sKKyAgICBHVF9VMzIgYXR0cklkOworCisgICAgZm9yKGF0dHJJZCA9IDA7IGF0dHJJZCA8IE1WX0FUVFJfTEFTVDsgYXR0cklkKyspCisgICAgeworICAgICAgICBkZHJEZXZBdHRyaWJ1dGVzW2Rldk51bV1bYXR0cklkXSA9IDB4RkY7CisgICAgfQorCisgICAgZGRyRGV2QXR0ckluaXREb25lW2Rldk51bV0gPSBHVF9UUlVFOworfQorCitHVF9VMzIgICAgZGRyM1RpcERldkF0dHJHZXQKKygKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgTVZfRERSX0RFVl9BVFRSSUJVVEUgICAgYXR0cklkCispCit7CisgICAgaWYoZGRyRGV2QXR0ckluaXREb25lW2Rldk51bV0gPT0gR1RfRkFMU0UpCisgICAgeworICAgICAgICBkZHIzVGlwRGV2QXR0ckluaXQoZGV2TnVtKTsKKyAgICB9CisKKyAgICByZXR1cm4gZGRyRGV2QXR0cmlidXRlc1tkZXZOdW1dW2F0dHJJZF07Cit9CisKK3ZvaWQgICAgZGRyM1RpcERldkF0dHJTZXQKKygKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgTVZfRERSX0RFVl9BVFRSSUJVVEUgICAgYXR0cklkLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICAgIHZhbHVlCispCit7CisgICAgaWYoZGRyRGV2QXR0ckluaXREb25lW2Rldk51bV0gPT0gR1RfRkFMU0UpCisgICAgeworICAgICAgICBkZHIzVGlwRGV2QXR0ckluaXQoZGV2TnVtKTsKKyAgICB9CisKKyAgICBkZHJEZXZBdHRyaWJ1dGVzW2Rldk51bV1bYXR0cklkXSA9IHZhbHVlOworfQorCisKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ0h3QWxnb3MuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdId0FsZ29zLmMKaW5kZXggMmQ3OGExNS4uNDViNmJlNCAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ0h3QWxnb3MuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nSHdBbGdvcy5jCkBAIC00MSw3ICs0MSw2IEBACiAjZGVmaW5lIEdFVF9SRF9TQU1QTEVfREVMQVkoZGF0YSxjcykgKChkYXRhID4+IHJkU2FtcGxlTWFza1tjc10pICYgMHhmKQogI2RlZmluZSBHRVRfTUFYKGFyZzEsYXJnMikgKGFyZzE8YXJnMikgPyAoYXJnMikgOiAoYXJnMSk7CiAKLUdUX1UzMiBja0RlbGF5ID0gKEdUX1UzMiktMSwgY2tEZWxheV8xNiA9IChHVF9VMzIpLTE7CiBHVF9VMzIgY2FEZWxheTsKIEdUX0JPT0wJZGRyM1RpcENlbnRyYWxpemF0aW9uU2tpcE1pbldpbmRvd0NoZWNrID0gR1RfRkFMU0U7CiBHVF9VOCBjdXJyZW50VnJlZltNQVhfQlVTX05VTV1bTUFYX0lOVEVSRkFDRV9OVU1dIDsKQEAgLTU0LDYgKzUzLDcgQEAKIEdUX1U4IHZyZWZXaW5kb3dTaXplW01BWF9JTlRFUkZBQ0VfTlVNXVtNQVhfQlVTX05VTV07CiBHVF9VOCB2cmVmV2luZG93U2l6ZVRoID0gMTI7CiAKK2V4dGVybiBHVF9VMzIgY2tEZWxheTsKIGV4dGVybiBNVl9IV1NfVE9QT0xPR1lfTUFQICp0b3BvbG9neU1hcDsKIGV4dGVybiBHVF9VMzIgY3NNYXNrUmVnW107CiBleHRlcm4gR1RfVTMyIGRlbGF5RW5hYmxlOwpAQCAtOTEsNyArOTEsOCBAQAogICAgIEdUX1UzMiBkYXRhVmFsdWU7CiAgICAgR1RfVTMyIHB1cEluZGV4OwogICAgIEdUXzMyIG1heFBoYXNlID0gTUlOX1ZBTFVFLCBjdXJyZW50UGhhc2U7Ci0gICAgTVZfSFdTX0FDQ0VTU19UWVBFCSAgICBhY2Nlc3NUeXBlID0gQUNDRVNTX1RZUEVfVU5JQ0FTVDsKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgIGFjY2Vzc1R5cGUgPSBBQ0NFU1NfVFlQRV9VTklDQVNUOworICAgIEdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERVTklUX09EVF9DT05UUk9MX1JFRywgMCA8PCA4LCAweDMgPDwgOCkpOwogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgUkVBRF9EQVRBX1NBTVBMRV9ERUxBWSwgZGF0YVJlYWQsIE1BU0tfQUxMX0JJVFMpKTsKQEAgLTExMSw5ICsxMTIsOSBAQAogCQkJewogCQkJCW1heFJlYWRTYW1wbGUgPSBSZWFkU2FtcGxlW2NzTnVtXTsKIAkJCX0KLSAgICAgICAgICAgIGZvcihwdXBJbmRleD0wIDsgcHVwSW5kZXggPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IHB1cEluZGV4KyspCisgICAgICAgICAgICBmb3IocHVwSW5kZXg9MCA7IHB1cEluZGV4IDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBwdXBJbmRleCsrKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cEluZGV4LCBERFJfUEhZX0RBVEEsIFJMX1BIWV9SRUcgKyBDU19SRUdfVkFMVUUoY3NOdW0pLCAmZGF0YVZhbHVlKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwSW5kZXgsIEREUl9QSFlfREFUQSwgUkxfUEhZX1JFRyArIENTX0JZVEVfR0FQKGNzTnVtKSwgJmRhdGFWYWx1ZSkpOwogCQkJCWN1cnJlbnRQaGFzZSA9ICgoR1RfMzIpZGF0YVZhbHVlJjB4RTApPj42OwogICAgICAgICAgICAgICAgIGlmICggY3VycmVudFBoYXNlID49IG1heFBoYXNlICkKICAgICAgICAgICAgICAgICB7CkBAIC0xNzEsMTYgKzE3MiwxOCBAQAogCS8qCVRoZSBWcmVmIHJlZ2lzdGVyIGhhdmUgbm9uIGxpbmVhciBvcmRlci4gbmVlZCB0byBjaGVjayB3aGF0IHdpbGwgYmUgaW4gZnV0dXIgIHByb2plY3RzLiAqLwogCUdUX1UzMiB2cmVmTWFwWzhdID0gezEsMiwzLDQsNSw2LDcsMH07CiAJLyoJc3RhdGUgYW5kIHBhcmFtZXRlciBkZWZpbml0aW9ucyAqLwotCUdUX1UzMiBpbml0aWFsU3RlcCA9IFZSRUZfSU5JVElBTF9TVEVQOwotCUdUX1UzMiBzZWNvbmRTdGVwID0gVlJFRl9TRUNPTkRfU1RFUDsvKiBuZWVkIHRvIGJlIGFzc2lnbiB3aXRoIG1pbnVzID8/Pz8/ICovCisJR1RfVTggIGluaXRpYWxTdGVwID0gVlJFRl9JTklUSUFMX1NURVA7CisJR1RfVTggIHNlY29uZFN0ZXAgPSBWUkVGX1NFQ09ORF9TVEVQOy8qIG5lZWQgdG8gYmUgYXNzaWduIHdpdGggbWludXMgPz8/Pz8gKi8KIAlHVF9VMzIgYWxnb1J1bkZsYWcgPSAwLCBjdXJycmVudFZyZWYgPSAwOwogCUdUX1UzMiB3aGlsZUNvdW50ID0gMDsKLQlHVF9VMzIgcHVwID0gMCwgaW50ZXJmYWNlSWQgID0gMCwgbnVtUHVwID0gMCwgUmVwID0gMDsKKwlHVF9VMzIgcHVwID0gMCwgaW50ZXJmYWNlSWQgID0gMCwgbnVtUHVwID0gMDsKKyAgICBHVF9VOCAgcmVwID0gMDsKIAlHVF9VMzIgZGF0YVZhbHVlID0gMDsKIAlHVF9VMzIgcmVnQWRkciA9IDB4QTg7CiAJR1RfVTMyIGNvcHlTdGFydFBhdHRlcm4sIGNvcHlFbmRQYXR0ZXJuOwogICAgIE1WX0hXU19SRVNVTFQqIGZsb3dSZXN1bHQgPSBkZHIzVGlwR2V0UmVzdWx0UHRyKHRyYWluaW5nU3RhZ2UpOwogCUdUX1U4IHJlc1s0XTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBTcGVjaWFsUngoZGV2TnVtKSk7CiAKQEAgLTE5Niw3ICsxOTksNyBAQAogCWZvcihpbnRlcmZhY2VJZCA9IDAgOyBpbnRlcmZhY2VJZCA8IE1BWF9JTlRFUkZBQ0VfTlVNIDsgaW50ZXJmYWNlSWQrKykKIAl7CiAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0JCWZvcihwdXAgPSAwIDsgcHVwIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwKyspCisJCWZvcihwdXAgPSAwIDsgcHVwIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwKyspCiAJCXsKIAkJCWN1cnJlbnRWcmVmW3B1cF1baW50ZXJmYWNlSWRdID0gMDsKIAkJCWxhc3RWcmVmW3B1cF1baW50ZXJmYWNlSWRdID0gMDsKQEAgLTIxNiwxMiArMjE5LDEyIEBACiAJCWludGVyZmFjZVN0YXRlW2ludGVyZmFjZUlkXSA9IDA7CiAJfQogCi0JbnVtUHVwID0gdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlKk1BWF9JTlRFUkZBQ0VfTlVNOy8qVE9ETyBzZXQgbnVtYmVyIG9mIGFjdGl2ZSBpbnRlcmZhY2VzKi8KKwludW1QdXAgPSBvY3RldHNQZXJJbnRlcmZhY2VOdW0qTUFYX0lOVEVSRkFDRV9OVU07LypUT0RPIHNldCBudW1iZXIgb2YgYWN0aXZlIGludGVyZmFjZXMqLwogCXdoaWxlKChhbGdvUnVuRmxhZyA8PSBudW1QdXApJih3aGlsZUNvdW50PDEwKSAgKQogCXsKIAkJd2hpbGVDb3VudCsrOwogCi0JCWZvcihSZXAgPSAxIDsgIFJlcCA8IDQgOyBSZXArKykKKwkJZm9yKHJlcCA9IDEgOyAgcmVwIDwgNCA7IHJlcCsrKQogCQl7CiAJCQlkZHIzVGlwQ2VudHJhbGl6YXRpb25Ta2lwTWluV2luZG93Q2hlY2sgPSBHVF9UUlVFOwogCQkJZGRyM1RpcENlbnRyYWxpemF0aW9uUngoZGV2TnVtKTsKQEAgLTIzMywxNCArMjM2LDE0IEBACiAJCQkJaWYoaW50ZXJmYWNlU3RhdGVbaW50ZXJmYWNlSWRdICE9IDQpCiAJCQkJewogCQkJCQlHZXRWYWxpZFdpblJ4KGRldk51bSwgaW50ZXJmYWNlSWQsICByZXMpOwotCQkJCQlmb3IoIHB1cCA9IDAgOyBwdXAgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXArKykKKwkJCQkJZm9yKCBwdXAgPSAwIDsgcHVwIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwKyspCiAJCQkJCXsKICAgICAgICAJCQkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKIAkJCQkJCWlmKHB1cFN0YXRlW3B1cF1baW50ZXJmYWNlSWRdID09IFZSRUZfQ09OVkVSR0UpCiAJCQkJCQl7CiAJCQkJCQkJY29udGludWU7CiAJCQkJCQl9Ci0JCQkJCQljdXJyZW50VmFsaWRXaW5kb3dbcHVwXVtpbnRlcmZhY2VJZF0gPSAoY3VycmVudFZhbGlkV2luZG93W3B1cF1baW50ZXJmYWNlSWRdKihSZXAtMSkgKyAxMDAwKnJlc1twdXBdKS9SZXA7CisJCQkJCQljdXJyZW50VmFsaWRXaW5kb3dbcHVwXVtpbnRlcmZhY2VJZF0gPSAoY3VycmVudFZhbGlkV2luZG93W3B1cF1baW50ZXJmYWNlSWRdKihyZXAtMSkgKyAxMDAwKnJlc1twdXBdKS9yZXA7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBAIC0yNTAsNyArMjUzLDcgQEAKIAkJewogICAgICAgIAkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKIAkJCURFQlVHX1RSQUlOSU5HX0hXX0FMRyhERUJVR19MRVZFTF9UUkFDRSwgKCJjdXJyZW50VmFsaWRXaW5kb3c6IElGWyAlZCBdIC0gIiwgaW50ZXJmYWNlSWQgKSk7Ci0JCQlmb3IocHVwID0gMCA7IHB1cCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IHB1cCsrKQorCQkJZm9yKHB1cCA9IDAgOyBwdXAgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBwdXArKykKIAkJCXsKIAkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCiAgICAJCQkJREVCVUdfVFJBSU5JTkdfSFdfQUxHKERFQlVHX0xFVkVMX1RSQUNFLCAoIiVkICIsIGN1cnJlbnRWYWxpZFdpbmRvd1twdXBdW2ludGVyZmFjZUlkXSkpOwpAQCAtMjYxLDcgKzI2NCw3IEBACiAJCWZvcihpbnRlcmZhY2VJZCA9IDAgOyBpbnRlcmZhY2VJZCA8IE1BWF9JTlRFUkZBQ0VfTlVNOyBpbnRlcmZhY2VJZCsrKQogCQl7CiAJCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotCQkJZm9yKHB1cCA9IDAgOyBwdXAgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXArKykKKwkJCWZvcihwdXAgPSAwIDsgcHVwIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwKyspCiAJCQl7CiAJCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQogCQkJCURFQlVHX1RSQUlOSU5HX0hXX0FMRyhERUJVR19MRVZFTF9UUkFDRSwgKCJJL0ZbICVkIF0scHVwWyAlZCBdIFNUQVRFICMlZCAoJWQpXG4iLCBpbnRlcmZhY2VJZCwgcHVwLApAQCAtMzY1LDcgKzM2OCw3IEBACiAJZm9yKGludGVyZmFjZUlkID0gMCA7IGludGVyZmFjZUlkIDwgTUFYX0lOVEVSRkFDRV9OVU07IGludGVyZmFjZUlkKyspCiAJewogICAgCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotCQlmb3IocHVwID0gMCA7IHB1cCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IHB1cCsrKQorCQlmb3IocHVwID0gMCA7IHB1cCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cCsrKQogCQl7CiAJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCiAgICAJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTUmVhZCggZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIHJlZ0FkZHIsICZkYXRhVmFsdWUpKTsKQEAgLTM5OCw3ICs0MDEsNyBAQAogCS8qIENBX2RlbGF5IGlzIGRlbGF5aW5nIHRoZSBvZiB0aGUgZW50aXJlIGNvbW1hbmQgJiBBZGRyZXNzIHNpZ25hbHMgKGluY2x1ZGUgQ2xvY2sgc2lnbmFsIO+/vSB0byBvdmVyY29tZSBER0wgZXJyb3Igb24gdGhlIENsb2NrIHZlcnN1cyB0aGUgRFFTKS4gKi8KIAkvKkNhbGMgQURMTCBUYXAqLwogCi0JaWYoIChja0RlbGF5ID09IC0xKSB8fCAoY2tEZWxheV8xNiA9PSAtMSkgKQorCWlmKGNrRGVsYXkgPT0gTVZfUEFSQU1TX1VOREVGSU5FRCkKIAl7CiAJCURFQlVHX1RSQUlOSU5HX0hXX0FMRyhERUJVR19MRVZFTF9FUlJPUiwoIkVSUk9SOiBPbmUgb2YgY2tEZWxheSB2YWx1ZXMgbm90IGluaXRpYWxpemVkISEhXG4iKSk7CiAJfQpAQCAtNDA3LDE1ICs0MTAsOSBAQAogCXsKIAkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKIAkJLypDYWxjIERlbGF5IHBzIGluIEFETEwgdGFwKi8KLQkJaWYgKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmJ1c1dpZHRoID09IEJVU19XSURUSF8xNikKLQkJewotCQkJY2tOdW1BRExMVGFwID0gY2tEZWxheV8xNi9hZGxsVGFwOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJY2tOdW1BRExMVGFwID0gY2tEZWxheS9hZGxsVGFwOwotCQl9CisJCWNrTnVtQURMTFRhcCA9IGNrRGVsYXkvYWRsbFRhcDsKIAkJY2FOdW1BRExMVGFwID0gY2FEZWxheS9hZGxsVGFwOworCiAJCWRhdGEgPSAoY2tOdW1BRExMVGFwICYgMHgzZikgKyAoKGNhTnVtQURMTFRhcCAmIDB4M2YpIDw8IDEwKTsKIAkJLyogU2V0IHRoZSBBRExMIG51bWJlciB0byB0aGUgQ0sgQURMTCBmb3IgSW50ZXJmYWNlcyBmb3IgYWxsIFB1cCAqLwogCQlERUJVR19UUkFJTklOR19IV19BTEcoREVCVUdfTEVWRUxfVFJBQ0UsKCJja051bUFETExUYXAgJWQgY2FOdW1BRExMVGFwICVkIGFkbGxUYXAgJWRcbiIsY2tOdW1BRExMVGFwLGNhTnVtQURMTFRhcCxhZGxsVGFwKSk7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nSXBFbmdpbmUuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdJcEVuZ2luZS5jCmluZGV4IGE1NWEyZWUuLjg1ZDA1NDAgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdJcEVuZ2luZS5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdJcEVuZ2luZS5jCkBAIC02OSwxMzAgKzY5LDI1MyBAQAogICAgIFJFU1VMVF9DT05UUk9MX1BVUF8yX0JJVF80X1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzJfQklUXzVfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfMl9CSVRfNl9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF8yX0JJVF83X1JFRywKICAgICBSRVNVTFRfQ09OVFJPTF9QVVBfNF9CSVRfMF9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF80X0JJVF8xX1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzRfQklUXzJfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfNF9CSVRfM19SRUcsCiAgICAgUkVTVUxUX0NPTlRST0xfUFVQXzRfQklUXzRfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfNF9CSVRfNV9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF80X0JJVF82X1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzRfQklUXzdfUkVHLAotICAgIFJFU1VMVF9DT05UUk9MX1BVUF80X0JJVF8wX1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzRfQklUXzFfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfNF9CSVRfMl9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF80X0JJVF8zX1JFRywKLSAgICBSRVNVTFRfQ09OVFJPTF9QVVBfNF9CSVRfNF9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF80X0JJVF81X1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzRfQklUXzZfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfNF9CSVRfN19SRUcsCisgICAgUkVTVUxUX0NPTlRST0xfUFVQXzNfQklUXzBfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfM19CSVRfMV9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF8zX0JJVF8yX1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzNfQklUXzNfUkVHLAorICAgIFJFU1VMVF9DT05UUk9MX1BVUF8zX0JJVF80X1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzNfQklUXzVfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfM19CSVRfNl9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF8zX0JJVF83X1JFRywKIH07CiAKIEdUX1UxNiAgIG1hc2tSZXN1bHRzUHVwUmVnTWFwUHVwM0VDQ1tdID0KIHsKICAgICBSRVNVTFRfQ09OVFJPTF9CWVRFX1BVUF8wX1JFRywgUkVTVUxUX0NPTlRST0xfQllURV9QVVBfMV9SRUcsIFJFU1VMVF9DT05UUk9MX0JZVEVfUFVQXzJfUkVHLCBSRVNVTFRfQ09OVFJPTF9CWVRFX1BVUF80X1JFRywgUkVTVUxUX0NPTlRST0xfQllURV9QVVBfNF9SRUcKIH07Ci0JICAgCi1QYXR0ZXJuSW5mbyBwYXR0ZXJuVGFibGVfMTZbXSA9IAotewotLyogbnVtIHR4IHBoYXNlcyAgdHggYnVyc3QgICBkZWxheSBiZXR3ZWVuICAgcnggcGF0dGVybiBzdGFydF9hZGRyZXNzICAgcGF0dGVybkxlbiovCi0gICB7MSwgICAgICAgICAgIDEsICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgMHgwMDgwLCAgICAgICAgICAgIDIgICAgICB9LCAvKiBQQVRURVJOX1BCUzEqLyAgICAgICAgICAgIAotICAgezEsICAgICAgICAgICAxLCAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgIDB4MDBDMCwgICAgICAgICAgICAyICAgICAgfSwgLyogUEFUVEVSTl9QQlMyKi8gICAgICAgICAgICAKLSAgIHsxLCAgICAgICAgICAgMSwgICAgICAgICAgMiwgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAweDAxMDAsICAgICAgICAgICAgMiAgICAgIH0sIC8qIFBBVFRFUk5fUkwqLyAgICAgICAgICAgICAgCi0gICB7MHhmLCAgICAgICAweDcsICAgICAgICAgMiwgICAgICAgICAgICAgICAweDcsICAgICAgICAgICAweDAxNDAsICAgICAgICAgICAxNiAgICAgICB9LCAvKiBQQVRURVJOX1NUQVRJQ19QQlMqLyAgICAgIAotICAgezB4ZiwgICAgICAgMHg3LCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHg3LCAgICAgICAgICAgMHgwMTkwLCAgICAgICAgICAgMTYgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEwKi8gICAgICAKLSAgIHsweGYsICAgICAgIDB4NywgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4NywgICAgICAgICAgIDB4MDFEMCwgICAgICAgICAgIDE2ICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMSovCi0gICB7MHhmLCAgICAgICAweDcsICAgICAgICAgMiwgICAgICAgICAgICAgICAweDcsICAgICAgICAgICAweDAyMTAsICAgICAgICAgICAxNiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTIqLwotICAgezB4ZiwgICAgICAgMHg3LCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHg3LCAgICAgICAgICAgMHgwMjUwLCAgICAgICAgICAgMTYgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEzKi8KLSAgIHsweGYsICAgICAgIDB4NywgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4NywgICAgICAgICAgIDB4MDI5MCwgICAgICAgICAgIDE2ICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNCovCi0gICB7MHhmLCAgICAgICAweDcsICAgICAgICAgMiwgICAgICAgICAgICAgICAweDcsICAgICAgICAgICAweDAyRDAsICAgICAgICAgICAxNiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTUqLwotICAgezB4ZiwgICAgICAgMHg3LCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHg3LCAgICAgICAgICAgMHgwMzEwLCAgICAgICAgICAgMTYgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE2Ki8KLSAgIHsweGYsICAgICAgIDB4NywgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4NywgICAgICAgICAgIDB4MDM1MCwgICAgICAgICAgIDE2ICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNyovCi0gICB7MSwgICAgICAgICAgIDEsICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgMHgwMzgwLCAgICAgICAgICAgIDIgICAgICB9LCAvKiBQQVRURVJOX1BCUzMqLyAgICAgICAgICAgIAotICAgezEsICAgICAgICAgICAxLCAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgIDB4MDAwMCwgICAgICAgICAgICAyICAgICAgfSwgLyogUEFUVEVSTl9STDIqLyAgICAgICAgICAgICAKLSAgIHsxLCAgICAgICAgICAgMSwgICAgICAgICAgMiwgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAweDAwNDAsICAgICAgICAgICAgMiAgICAgIH0sIC8qIFBBVFRFUk5fVEVTVCovICAgICAgICAgICAgCi0gICB7MHhmLCAgICAgICAweDcsICAgICAgICAgMiwgICAgICAgICAgICAgICAweDcsICAgICAgICAgICAweDAzQzAsICAgICAgICAgICAxNiAgICAgICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzFUKi8gICAgIAotICAgezB4ZiwgICAgICAgMHg3LCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHg3LCAgICAgICAgICAgMHgwNDAwLCAgICAgICAgICAgMTYgICAgICAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT18yVCovICAgICAKLSAgIHsweGYsICAgICAgIDB4NywgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4NywgICAgICAgICAgIDB4MDQ0MCwgICAgICAgICAgIDE2ICAgICAgIH0sIC8qIFBBVFRFUk5fRlVMTF9TU09fM1QqLyAgICAgCi0gICB7MHhmLCAgICAgICAweDcsICAgICAgICAgMiwgICAgICAgICAgICAgICAweDcsICAgICAgICAgICAweDA0ODAsICAgICAgICAgICAxNiAgICAgICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzRUKi8gICAgIAotICAgezB4ZiwgICAgICAgMHg3LCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHg3LCAgICAgICAgICAgMHgwNEMwLCAgICAgICAgICAgMTYgICAgICAgfSAgLyogUEFUVEVSTl9WUkVGKi8KLS8qTm90ZTogYWN0dWFsIHN0YXJ0X2FkZHJlc3MgaXMgPDwzIG9mIGRlZmluZWQgYWRkZXNzKi8KLX07ICAgCiAKICNpZmRlZiBDT05GSUdfRERSMwotUGF0dGVybkluZm8gcGF0dGVyblRhYmxlXzMyW10gPSAKK1BhdHRlcm5JbmZvIHBhdHRlcm5UYWJsZV8xNltdID0KIHsKIC8qIG51bSB0eCBwaGFzZXMgIHR4IGJ1cnN0ICAgZGVsYXkgYmV0d2VlbiAgIHJ4IHBhdHRlcm4gc3RhcnRfYWRkcmVzcyAgIHBhdHRlcm5MZW4qLwotICAgezMsICAgICAgICAgICAzLCAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgMywgICAgICAgICAgIDB4MDA4MCwgICAgICAgICAgICA0ICAgICAgIH0sIC8qIFBBVFRFUk5fUEJTMSovICAgICAgICAgICAgCi0gICB7MywgICAgICAgICAgIDMsICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAzLCAgICAgICAgICAgMHgwMEMwLCAgICAgICAgICAgIDQgICAgICAgfSwgLyogUEFUVEVSTl9QQlMyKi8gICAgICAgICAgICAKLSAgIHszLCAgICAgICAgICAgMywgICAgICAgICAgMiwgICAgICAgICAgICAgICAgIDMsICAgICAgICAgICAweDAxMDAsICAgICAgICAgICAgNCAgICAgICB9LCAvKiBQQVRURVJOX1JMKi8gICAgICAgICAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDE0MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fU1RBVElDX1BCUyovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwMTkwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEwKi8KLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAxRDAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTEqLwotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDIxMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMiovCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwMjUwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEzKi8KLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAyOTAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTQqLwotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDJEMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNSovCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwMzEwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE2Ki8KLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAzNTAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTcqLwotICAgezMsICAgICAgICAgICAzLCAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgMywgICAgICAgICAgIDB4MDM4MCwgICAgICAgICAgICA0ICAgICAgIH0sIC8qIFBBVFRFUk5fUEJTMyovICAgICAgICAgICAgCi0gICB7MywgICAgICAgICAgIDMsICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAzLCAgICAgICAgICAgMHgwMDAwLCAgICAgICAgICAgIDQgICAgICAgfSwgLyogUEFUVEVSTl9STDIqLyAgICAgICAgICAgICAKLSAgIHszLCAgICAgICAgICAgMywgICAgICAgICAgMiwgICAgICAgICAgICAgICAgIDMsICAgICAgICAgICAweDAwNDAsICAgICAgICAgICAgNCAgICAgICB9LCAvKiBQQVRURVJOX1RFU1QqLyAgICAgICAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDNDMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fRlVMTF9TU09fMVQqLyAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwNDAwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT18yVCovICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDA0NDAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzNUKi8gICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDQ4MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fRlVMTF9TU09fNFQqLyAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwNEMwLCAgICAgICAgICAgMzIgICAgICAgfSAgLyogUEFUVEVSTl9WUkVGKi8gICAgICAgICAgICAKKyAgIHsweDEsCTEsCTIsICAxLCAweDAwODAsICAyIH0sCS8qIFBBVFRFUk5fUEJTMSovCisgICB7MHgxLAkxLAkyLCAgMSwgMHgwMEMwLCAgMiB9LAkvKiBQQVRURVJOX1BCUzIqLworICAgezB4MSwJMSwJMiwgIDEsIDB4MDM4MCwgIDIgfSwJLyogUEFUVEVSTl9QQlMzKi8KKyAgIHsweDEsCTEsCTIsICAxLCAweDAwNDAsICAyIH0sCS8qIFBBVFRFUk5fVEVTVCovCisgICB7MHgxLAkxLAkyLCAgMSwgMHgwMTAwLCAgMiB9LAkvKiBQQVRURVJOX1JMKi8KKyAgIHsweDEsCTEsCTIsICAxLCAweDAwMDAsICAyIH0sCS8qIFBBVFRFUk5fUkwyKi8KKyAgIHsweGYsCTcsICAyLAk3LCAweDAxNDAsIDE2ICB9LAkvKiBQQVRURVJOX1NUQVRJQ19QQlMqLworICAgezB4ZiwJNywgIDIsCTcsIDB4MDE5MCwgMTYgIH0sCS8qIFBBVFRFUk5fS0lMTEVSX0RRMCovCisgICB7MHhmLCAgCTcsICAyLAk3LCAweDAxRDAsIDE2ICB9LAkvKiBQQVRURVJOX0tJTExFUl9EUTEqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHgwMjEwLCAxNiAgfSwJLyogUEFUVEVSTl9LSUxMRVJfRFEyKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4MDI1MCwgMTYgIH0sCS8qIFBBVFRFUk5fS0lMTEVSX0RRMyovCisgICB7MHhmLCAgCTcsICAyLAk3LCAweDAyOTAsIDE2ICB9LAkvKiBQQVRURVJOX0tJTExFUl9EUTQqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHgwMkQwLCAxNiAgfSwJLyogUEFUVEVSTl9LSUxMRVJfRFE1Ki8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4MDMxMCwgMTYgIH0sCS8qIFBBVFRFUk5fS0lMTEVSX0RRNiovCisgICB7MHhmLCAgCTcsICAyLAk3LCAweDAzNTAsIDE2ICB9LAkvKiBQQVRURVJOX0tJTExFUl9EUTcqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHgwNEMwLCAxNiAgfSwJLyogUEFUVEVSTl9WUkVGKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4MDNDMCwgMTYgIH0sCS8qIFBBVFRFUk5fRlVMTF9TU09fMVQqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHgwNDAwLCAxNiAgfSwJLyogUEFUVEVSTl9GVUxMX1NTT18yVCovCisgICB7MHhmLCAgCTcsICAyLAk3LCAweDA0NDAsIDE2ICB9LAkvKiBQQVRURVJOX0ZVTExfU1NPXzNUKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4MDQ4MCwgMTYgIH0sCS8qIFBBVFRFUk5fRlVMTF9TU09fNFQqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg2MjgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTAqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg2NjgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTEqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg2QTgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTIqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg2RTgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTMqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg3MjgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTQqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg3NjgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTUqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg3QTgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTYqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg3RTgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTcqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg4MjgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTAqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg4NjgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTEqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg4QTgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTIqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg4RTgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTMqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg5MjgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTQqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg5NjgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTUqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg5QTgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTYqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHg5RTgwLCAxNiAgfSwgLyogUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTcqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHhBMjgwLCAxNiAgfSAvKiBQQVRURVJOX0lTSV9YVEFMS19GUkVFKi8KIC8qTm90ZTogYWN0dWFsIHN0YXJ0X2FkZHJlc3MgaXMgPDwzIG9mIGRlZmluZWQgYWRkZXNzKi8KLX07ICAgCi0jZWxzZQorfTsKKwogUGF0dGVybkluZm8gcGF0dGVyblRhYmxlXzMyW10gPQogewogLyogbnVtIHR4IHBoYXNlcyAgdHggYnVyc3QgICBkZWxheSBiZXR3ZWVuICAgcnggcGF0dGVybiBzdGFydF9hZGRyZXNzICAgcGF0dGVybkxlbiovCi0gICB7MywgICAgICAgICAgIDMsICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAzLCAgICAgICAgICAgMHgwMDgwLCAgICAgICAgICAgIDQgICAgICAgfSwgLyogUEFUVEVSTl9QQlMxKi8gICAgICAgICAgICAKLSAgIHszLCAgICAgICAgICAgMywgICAgICAgICAgMiwgICAgICAgICAgICAgICAgIDMsICAgICAgICAgICAweDAwQzAsICAgICAgICAgICAgNCAgICAgICB9LCAvKiBQQVRURVJOX1BCUzIqLyAgICAgICAgICAgIAotICAgezMsICAgICAgICAgICAzLCAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgMywgICAgICAgICAgIDB4MDEwMCwgICAgICAgICAgICA0ICAgICAgIH0sIC8qIFBBVFRFUk5fUkwqLyAgICAgICAgICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwMTQwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9TVEFUSUNfUEJTKi8gICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAxODAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTAqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDFDMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMSovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwMjAwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEyKi8gICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAyNDAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTMqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDI4MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNCovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwMkMwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE1Ki8gICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAzMDAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTYqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDM0MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNyovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgxMTgwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEwX0VYVCovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgxMUMwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFExX0VYVCovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgxMjAwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEyX0VYVCovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgxMjQwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEzX0VYVCovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgxMjgwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE0X0VYVCovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgxMkMwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE1X0VYVCovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgxMzAwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE2X0VYVCovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgxMzQwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE3X0VYVCovICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDA0QzAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX1ZSRUYqLyAgICAgICAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTRDMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fVlJFRl9JTlYqLyAgICAgICAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTUwMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzFUKi8gIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTU0MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzJUKi8gIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTU4MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzNUKi8gIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTVDMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzRUKi8gIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTYwMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzVUKi8gIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTY0MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzZUKi8gIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTY4MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzdUKi8gIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTZDMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzhUKi8gIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTcwMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzlUKi8gIAotICAgezMsICAgICAgICAgICAzLCAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgMywgICAgICAgICAgIDB4MDM4MCwgICAgICAgICAgICA0ICAgICAgIH0sIC8qIFBBVFRFUk5fUEJTMyovICAgICAgICAgICAgCi0gICB7MywgICAgICAgICAgIDMsICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAzLCAgICAgICAgICAgMHgwMDAwLCAgICAgICAgICAgIDQgICAgICAgfSwgLyogUEFUVEVSTl9STDIqLyAgICAgICAgICAgICAKLSAgIHszLCAgICAgICAgICAgMywgICAgICAgICAgMiwgICAgICAgICAgICAgICAgIDMsICAgICAgICAgICAweDAwNDAsICAgICAgICAgICAgNCAgICAgICB9LCAvKiBQQVRURVJOX1RFU1QqLyAgICAgICAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDNDMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fRlVMTF9TU09fMVQqLyAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwNDAwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT18yVCovICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDA0NDAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzNUKi8gICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDQ4MCwgICAgICAgICAgIDMyICAgICAgIH0gIC8qIFBBVFRFUk5fRlVMTF9TU09fNFQqLyAgICAgCisgICB7MHgzLAkweDMsICAyLCAgMHgzLCAweDAwODAsICA0IH0sCS8qIFBBVFRFUk5fUEJTMSovCisgICB7MHgzLAkweDMsICAyLCAgMHgzLCAweDAwQzAsICA0IH0sCS8qIFBBVFRFUk5fUEJTMiovCisgICB7MHgzLAkweDMsICAyLCAgMHgzLCAweDAzODAsICA0IH0sCS8qIFBBVFRFUk5fUEJTMyovCisgICB7MHgzLAkweDMsICAyLCAgMHgzLCAweDAwNDAsICA0IH0sCS8qIFBBVFRFUk5fVEVTVCovCisgICB7MHgzLAkweDMsICAyLCAgMHgzLCAweDAxMDAsICA0IH0sCS8qIFBBVFRFUk5fUkwqLworICAgezB4MywJMHgzLCAgMiwgIDB4MywgMHgwMDAwLCAgNCB9LAkvKiBQQVRURVJOX1JMMiovCisgICB7MHgxZiwJMHhGLCAgMiwgIDB4ZiwgMHgwMTQwLCAzMiAgfSwJLyogUEFUVEVSTl9TVEFUSUNfUEJTKi8KKyAgIHsweDFmLAkweEYsICAyLCAgMHhmLCAweDAxOTAsIDMyICB9LAkvKiBQQVRURVJOX0tJTExFUl9EUTAqLworICAgezB4MWYsICAJMHhGLCAgMiwgIDB4ZiwgMHgwMUQwLCAzMiAgfSwJLyogUEFUVEVSTl9LSUxMRVJfRFExKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4MDIxMCwgMzIgIH0sCS8qIFBBVFRFUk5fS0lMTEVSX0RRMiovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDAyNTAsIDMyICB9LAkvKiBQQVRURVJOX0tJTExFUl9EUTMqLworICAgezB4MWYsICAJMHhGLCAgMiwgIDB4ZiwgMHgwMjkwLCAzMiAgfSwJLyogUEFUVEVSTl9LSUxMRVJfRFE0Ki8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4MDJEMCwgMzIgIH0sCS8qIFBBVFRFUk5fS0lMTEVSX0RRNSovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDAzMTAsIDMyICB9LAkvKiBQQVRURVJOX0tJTExFUl9EUTYqLworICAgezB4MWYsICAJMHhGLCAgMiwgIDB4ZiwgMHgwMzUwLCAzMiAgfSwJLyogUEFUVEVSTl9LSUxMRVJfRFE3Ki8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4MDRDMCwgMzIgIH0sCS8qIFBBVFRFUk5fVlJFRiovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDAzQzAsIDMyICB9LAkvKiBQQVRURVJOX0ZVTExfU1NPXzFUKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4MDQwMCwgMzIgIH0sCS8qIFBBVFRFUk5fRlVMTF9TU09fMlQqLworICAgezB4MWYsICAJMHhGLCAgMiwgIDB4ZiwgMHgwNDQwLCAzMiAgfSwJLyogUEFUVEVSTl9GVUxMX1NTT18zVCovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDA0ODAsIDMyICB9LAkvKiBQQVRURVJOX0ZVTExfU1NPXzRUKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4NjI4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEwKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4NjY4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFExKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4NkE4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEyKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4NkU4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEzKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4NzI4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE0Ki8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4NzY4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE1Ki8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4N0E4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE2Ki8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4N0U4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE3Ki8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4ODI4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEwKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4ODY4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFExKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4OEE4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEyKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4OEU4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEzKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4OTI4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE0Ki8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4OTY4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE1Ki8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4OUE4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE2Ki8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4OUU4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE3Ki8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4QTI4MCwgMzIgIH0gLyogUEFUVEVSTl9JU0lfWFRBTEtfRlJFRSovCisKKwogLypOb3RlOiBhY3R1YWwgc3RhcnRfYWRkcmVzcyBpcyA8PDMgb2YgZGVmaW5lZCBhZGRlc3MqLwogfTsKKyNlbHNlCitQYXR0ZXJuSW5mbyBwYXR0ZXJuVGFibGVfMTZbXSA9Cit7CisvKiBudW0gdHggcGhhc2VzICB0eCBidXJzdCAgIGRlbGF5IGJldHdlZW4gICByeCBwYXR0ZXJuIHN0YXJ0X2FkZHJlc3MgICBwYXR0ZXJuTGVuKi8KKyAgIHsweDEsIAkweDEsCTIsICAweDEsIDB4MDAwMCwgIDIgIH0sIC8qIFBBVFRFUk5fUEJTMSovCisgICB7MHgxLCAJMHgxLAkyLCAgMHgxLCAweDAwODAsICAyICB9LCAvKiBQQVRURVJOX1BCUzIqLworICAgezB4MSwgCTB4MSwJMiwgIDB4MSwgMHgwMTAwLCAgMiAgfSwgLyogUEFUVEVSTl9QQlMzKi8KKyAgIHsweDEsIAkweDEsCTIsICAweDEsIDB4MDE4MCwgIDIgIH0sIC8qIFBBVFRFUk5fVEVTVCovCisgICB7MHgxLCAJMHgxLAkyLCAgMHgxLCAweDAyMDAsICAyICB9LCAvKiBQQVRURVJOX1JMKi8KKyAgIHsweDEsIAkweDEsCTIsICAweDEsIDB4MDI4MCwgIDIgIH0sIC8qIFBBVFRFUk5fUkwyKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4MDY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1RBVElDX1BCUyovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDBBODAsIDE2ICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTAqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHgwRTgwLCAxNiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFExKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4MTI4MCwgMTYgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMiovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDE2ODAsIDE2ICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTMqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHgxQTgwLCAxNiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE0Ki8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4MUU4MCwgMTYgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNSovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDIyODAsIDE2ICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTYqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHgyNjgwLCAxNiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE3Ki8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4MkE4MCwgMTYgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMF9JTlYqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHgyRTgwLCAxNiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFExX0lOViovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDMyODAsIDE2ICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTJfSU5WKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4MzY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRM19JTlYqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHgzQTgwLCAxNiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE0X0lOViovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDNFODAsIDE2ICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTVfSU5WKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4NDI4MCwgMTYgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNl9JTlYqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHg0NjgwLCAxNiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE3X0lOViovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDRBODAsIDE2ICB9LCAvKiBQQVRURVJOX1ZSRUYqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHg0RTgwLCAxNiAgfSwgLyogUEFUVEVSTl9WUkVGX0lOViovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDUyODAsIDE2ICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzBUKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4NTY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fRlVMTF9TU09fMVQqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHg1QTgwLCAxNiAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT18yVCovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDVFODAsIDE2ICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzNUKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4NjI4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEwKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4NjY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFExKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4NkE4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEyKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4NkU4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEzKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4NzI4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE0Ki8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4NzY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE1Ki8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4N0E4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE2Ki8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4N0U4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE3Ki8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4ODI4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEwKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4ODY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFExKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4OEE4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEyKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4OEU4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEzKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4OTI4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE0Ki8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4OTY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE1Ki8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4OUE4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE2Ki8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4OUU4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE3Ki8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4QTI4MCwgMTYgIH0sIC8qIFBBVFRFUk5fSVNJX1hUQUxLX0ZSRUUqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHhBNjgwLCAxNiAgfSwgLyogUEFUVEVSTl9SRVNPTkFOQ0VfMVQqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHhBQTgwLCAxNiAgfSwgLyogUEFUVEVSTl9SRVNPTkFOQ0VfMlQqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHhBRTgwLCAxNiAgfSwgLyogUEFUVEVSTl9SRVNPTkFOQ0VfM1QqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHhCMjgwLCAxNiAgfSwgLyogUEFUVEVSTl9SRVNPTkFOQ0VfNFQqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHhCNjgwLCAxNiAgfSwgLyogUEFUVEVSTl9SRVNPTkFOQ0VfNVQqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHhCQTgwLCAxNiAgfSwgLyogUEFUVEVSTl9SRVNPTkFOQ0VfNlQqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHhCRTgwLCAxNiAgfSwgLyogUEFUVEVSTl9SRVNPTkFOQ0VfN1QqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHhDMjgwLCAxNiAgfSwgLyogUEFUVEVSTl9SRVNPTkFOQ0VfOFQqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHhDNjgwLCAxNiAgfSAgLyogUEFUVEVSTl9SRVNPTkFOQ0VfOVQqLworLypOb3RlOiBhY3R1YWwgc3RhcnRfYWRkcmVzcyBpcyA8PDMgb2YgZGVmaW5lZCBhZGRlc3MqLworfTsKKworUGF0dGVybkluZm8gcGF0dGVyblRhYmxlXzMyW10gPQoreworLyogbnVtIHR4IHBoYXNlcyAgdHggYnVyc3QgICBkZWxheSBiZXR3ZWVuICAgcnggcGF0dGVybiBzdGFydF9hZGRyZXNzICAgcGF0dGVybkxlbiovCisgICB7MHgzLCAJMHgzLAkyLCAgMHgzLCAweDAwMDAsICA0ICB9LCAvKiBQQVRURVJOX1BCUzEqLworICAgezB4MywgCTB4MywJMiwgIDB4MywgMHgwMDgwLCAgNCAgfSwgLyogUEFUVEVSTl9QQlMyKi8KKyAgIHsweDMsIAkweDMsCTIsICAweDMsIDB4MDEwMCwgIDQgIH0sIC8qIFBBVFRFUk5fUEJTMyovCisgICB7MHgzLCAJMHgzLAkyLCAgMHgzLCAweDAxODAsICA0ICB9LCAvKiBQQVRURVJOX1RFU1QqLworICAgezB4MywgCTB4MywJMiwgIDB4MywgMHgwMjAwLCAgNCAgfSwgLyogUEFUVEVSTl9STCovCisgICB7MHgzLCAJMHgzLAkyLCAgMHgzLCAweDAyODAsICA0ICB9LCAvKiBQQVRURVJOX1JMMiovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHgwNjgwLCAzMiAgfSwgLyogUEFUVEVSTl9TVEFUSUNfUEJTKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDBBODAsIDMyICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTAqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4MEU4MCwgMzIgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMSovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHgxMjgwLCAzMiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEyKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDE2ODAsIDMyICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTMqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4MUE4MCwgMzIgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNCovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHgxRTgwLCAzMiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE1Ki8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDIyODAsIDMyICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTYqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4MjY4MCwgMzIgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNyovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHgyQTgwLCAzMiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEwX0lOViovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHgyRTgwLCAzMiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFExX0lOViovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHgzMjgwLCAzMiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEyX0lOViovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHgzNjgwLCAzMiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEzX0lOViovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHgzQTgwLCAzMiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE0X0lOViovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHgzRTgwLCAzMiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE1X0lOViovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg0MjgwLCAzMiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE2X0lOViovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg0NjgwLCAzMiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE3X0lOViovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg0QTgwLCAzMiAgfSwgLyogUEFUVEVSTl9WUkVGKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDRFODAsIDMyICB9LCAvKiBQQVRURVJOX1ZSRUZfSU5WKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDUyODAsIDMyICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzBUKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDU2ODAsIDMyICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzFUKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDVBODAsIDMyICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzJUKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDVFODAsIDMyICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzNUKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDYyODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMCovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg2NjgwLCAzMiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTEqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4NkE4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEyKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDZFODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMyovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg3MjgwLCAzMiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTQqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4NzY4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE1Ki8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDdBODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNiovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg3RTgwLCAzMiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTcqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4ODI4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEwKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDg2ODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMSovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg4QTgwLCAzMiAgfSwgLyogUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTIqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4OEU4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEzKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDkyODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNCovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg5NjgwLCAzMiAgfSwgLyogUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTUqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4OUE4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE2Ki8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDlFODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNyovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHhBMjgwLCAzMiAgfSwgLyogUEFUVEVSTl9JU0lfWFRBTEtfRlJFRSovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHhBNjgwLCAzMiAgfSwgLyogUEFUVEVSTl9SRVNPTkFOQ0VfMVQqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4QUE4MCwgMzIgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzJUKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweEFFODAsIDMyICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV8zVCovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHhCMjgwLCAzMiAgfSwgLyogUEFUVEVSTl9SRVNPTkFOQ0VfNFQqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4QjY4MCwgMzIgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzVUKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweEJBODAsIDMyICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV82VCovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHhCRTgwLCAzMiAgfSwgLyogUEFUVEVSTl9SRVNPTkFOQ0VfN1QqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4QzI4MCwgMzIgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzhUKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweEM2ODAsIDMyICB9ICAvKiBQQVRURVJOX1JFU09OQU5DRV85VCovCisvKk5vdGU6IGFjdHVhbCBzdGFydF9hZGRyZXNzIGlzIDw8MyBvZiBkZWZpbmVkIGFkZGVzcyovCit9OworCiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBHVF9VMzIgICAgICAgICAgICAgICAgICAgICAgdHJhaW5EZXZOdW07CiBNVl9IV1NfRERSX0NTICAgICAgICAgICAgICAgdHJhaW50cmFpbkNzVHlwZTsKLUdUX1UzMiAgICAgICAgICAgICAgICAgICAgICB0cmFpblB1cE51bTsgCitHVF9VMzIgICAgICAgICAgICAgICAgICAgICAgdHJhaW5QdXBOdW07CiBNVl9IV1NfVFJBSU5JTkdfUkVTVUxUICAgICAgdHJhaW5SZXN1bHRUeXBlOwogTVZfSFdTX0NvbnRyb2xFbGVtZW50ICAgICAgIHRyYWluQ29udHJvbEVsZW1lbnQ7CiBNVl9IV1NfU2VhcmNoRGlyZWN0aW9uICAgICAgdHJhaW5lU2VhcmNoRGlyOwogTVZfSFdTX0RJUkVDVElPTiAgICAgICAgICAgIHRyYWluRGlyZWN0aW9uOwotR1RfVTMyICAgICAgICAgICAgICAgICAgICAgIHRyYWluSWZTZWxlY3Q7IAorR1RfVTMyICAgICAgICAgICAgICAgICAgICAgIHRyYWluSWZTZWxlY3Q7CiBHVF9VMzIgICAgICAgICAgICAgICAgICAgICAgdHJhaW5Jbml0VmFsdWU7CiBHVF9VMzIgICAgICAgICAgICAgICAgICAgICAgdHJhaW5OdW1iZXJJdGVyYXRpb25zOwogTVZfSFdTX1BBVFRFUk4gICAgICAgICAgICAgIHRyYWluUGF0dGVybjsKIE1WX0hXU19FZGdlQ29tcGFyZSAgICAgICAgICB0cmFpbkVkZ2VDb21wYXJlOwogR1RfVTMyICAgICAgICAgICAgICAgICAgICAgIHRyYWluQ3NOdW07CiBHVF9VMzIgICAgICAgICAgICAgICAgICAgICAgdHJhaW5JZkFjZXNzLCB0cmFpbklmSWQsIHRyYWluUHVwQWNjZXNzOworI2lmZGVmIENPTkZJR19ERFI0CitHVF9VMzIgICAgICAgICAgICAgICAgICAgICAgbWF4UG9sbGluZ0ZvckRvbmUgPSAxMDAwMDAwMDA7ICAvKiB0aGlzIGNvdW50ZXIgd2FzIGluY3JlYXNlZCBmb3IgRERSNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVlIHRvIEEzOTAgREItR1AgRERSNCBmYWlsdXJlICovCisjZWxzZSAvKiBERFIzICovCisjaWZkZWYgQ09ORklHX0JPQksKK0dUX1UzMiAgICAgICAgICAgICAgICAgICAgICBtYXhQb2xsaW5nRm9yRG9uZSA9IDEwMDA7CisjZWxzZQogR1RfVTMyICAgICAgICAgICAgICAgICAgICAgIG1heFBvbGxpbmdGb3JEb25lID0gMTAwMDAwMDsKLQorI2VuZGlmIC8qIENPTkZJR19CT0JLICovCisjZW5kaWYgLyogQ09ORklHX0REUjQgKi8KIGV4dGVybiBNVl9IV1NfUkVTVUxUIHRyYWluaW5nUmVzdWx0W01BWF9TVEFHRV9MSU1JVF1bTUFYX0lOVEVSRkFDRV9OVU1dOwogZXh0ZXJuIEFVVE9fVFVORV9TVEFHRSB0cmFpbmluZ1N0YWdlOwogCkBAIC0yNDUsNyArMzY4LDcgQEAKICkKIHsKICAgICAKLSAgICBHVF9VMzIgbWFza0RxTnVtT2ZSZWdzLCBtYXNrUHVwTnVtT2ZSZWdzLCBpbmRleENudCxwb2xsQ250LCByZWdEYXRhLCBwdXBJZDsKKyAgICBHVF9VMzIgbWFza0RxTnVtT2ZSZWdzLCBtYXNrUHVwTnVtT2ZSZWdzLCBpbmRleENudCxwb2xsQ250LCByZWdEYXRhLCBwdXBJZCwgdHJpZ2dlclJlZ0FkZHI7CiAgICAgR1RfVTMyIHR4QnVyc3RTaXplOwogICAgIEdUX1UzMiBkZWxheUJldHdlZW5CdXJzdDsKICAgICBHVF9VMzIgcmRNb2RlOwpAQCAtMjUzLDggKzM3Niw5IEBACiAJUGF0dGVybkluZm8gKnBhdHRlcm5UYWJsZSA9IGRkcjNUaXBHZXRQYXR0ZXJuVGFibGUoKTsKIAlHVF9VMTYgKm1hc2tSZXN1bHRzUHVwUmVnTWFwID0gZGRyM1RpcEdldE1hc2tSZXN1bHRzUHVwUmVnTWFwKCk7CiAJR1RfVTE2ICptYXNrUmVzdWx0c0RxUmVnTWFwIAk9IGRkcjNUaXBHZXRNYXNrUmVzdWx0c0RxUmVnKCk7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAotICAgIGlmIChwdXBOdW0gPj0gdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlKQorICAgIGlmIChwdXBOdW0gPj0gb2N0ZXRzUGVySW50ZXJmYWNlTnVtKQogICAgIHsKICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVBfRU5HSU5FKERFQlVHX0xFVkVMX0VSUk9SLCAoInB1cE51bSAlZCBub3QgdmFsaWRcbiIscHVwTnVtKSk7CiAgICAgfQpAQCAtMzczLDggKzQ5Nyw4IEBACiAgICAgcmVnRGF0YSB8PSAoMHg2IDw8IDI4KTsKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZU51bSwgQ0FMSUJfT0JKX1BSRkFfUkVHLCByZWdEYXRhIHwgKGluaXRWYWx1ZSA8PCA4KSAsIDB4ZmYgfCAoMHhGRkZGIDw8IDgpfCAoMHhGIDw8IDI0KSB8IChHVF9VMzIpKDB4RiA8PCAyOCkpKTsKIAotCW1hc2tEcU51bU9mUmVncyA9IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSAqIEJVU19XSURUSF9JTl9CSVRTOwotCW1hc2tQdXBOdW1PZlJlZ3MgPSB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7CisJbWFza0RxTnVtT2ZSZWdzID0gb2N0ZXRzUGVySW50ZXJmYWNlTnVtICogQlVTX1dJRFRIX0lOX0JJVFM7CisJbWFza1B1cE51bU9mUmVncyA9IG9jdGV0c1BlckludGVyZmFjZU51bTsKIAogICAgIGlmIChyZXN1bHRUeXBlID09IFJFU1VMVF9QRVJfQklUKQogICAgIHsKQEAgLTM4NCwxMSArNTA4LDExIEBACiAgICAgICAgIH0KIAogCQkvKk1hc2sgZGlzYWJsZWQgYnVzZXMqLwotICAgICAgICBmb3IocHVwSWQgPSAwOyBwdXBJZCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IHB1cElkKyspCisgICAgICAgIGZvcihwdXBJZCA9IDA7IHB1cElkIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwSWQrKykKICAgICAgICAgewogCQkJaWYgKElTX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cElkKSA9PSBHVF9UUlVFKSBjb250aW51ZTsKIAotCQkgICAgZm9yKGluZGV4Q250PShtYXNrRHFOdW1PZlJlZ3MtcHVwSWQqOCk7IGluZGV4Q250PChtYXNrRHFOdW1PZlJlZ3MtKHB1cElkKzEpKjgpO2luZGV4Q250KyspCisJCSAgICBmb3IoaW5kZXhDbnQ9cHVwSWQqODsgaW5kZXhDbnQ8KHB1cElkKzEpKjg7aW5kZXhDbnQrKykKIAkJICAgIHsKIAkJICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZU51bSwgbWFza1Jlc3VsdHNEcVJlZ01hcFtpbmRleENudF0sICgxPDwyNCksIDE8PDI0KSk7CiAJCSAgICB9CkBAIC00MTMsNDggKzUzNyw1MSBAQAogICAgIH0KIAogICAgIC8qU3RhcnQgVHJhaW5pbmcgVHJpZ2dlciAqLwotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZU51bSwgT0RQR19UUkFJTklOR19UUklHR0VSX1JFRywgMSwgMSkpOwotI2Vsc2UKLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZU51bSwgT0RQR19UUkFJTklOR19TVEFUVVNfUkVHLCAxLCAxKSk7Ci0jZW5kaWYKKwl0cmlnZ2VyUmVnQWRkciA9IChkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPj0gTVZfVElQX1JFVl8zKT8oT0RQR19UUkFJTklOR19UUklHR0VSX1JFRyk6KE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRyk7CisgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VOdW0sIHRyaWdnZXJSZWdBZGRyLCAxLCAxKSk7CisKICAgICAvKndhaXQgZm9yIGFsbCBSRlUgdGVzdHMgdG8gZmluaXNoIChvciB0aW1lb3V0KSovCiAJLypXQSBmb3IgMTYgYml0IG1vZGUsIG1vcmUgaW52ZXN0aWdhdGlvbiBuZWVkZWQqLwogICAgIGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEpOyAvKiAxIG1TZWMgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKLSAgICAvKiBUcmFpbmluZyAiRG9uZSA/IiAqLwotICAgIGZvcihpbmRleENudD0wOyBpbmRleENudCA8IE1BWF9JTlRFUkZBQ0VfTlVNO2luZGV4Q250KyspCisgICAgLyogVHJhaW5pbmcgIkRvbmUgPyIgIGZvciBDUFUgY29udG9sbGVkIFRJUCovCisgICAgaWYoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpID49IE1WX1RJUF9SRVZfMykKICAgICB7Ci0gICAgICAgIGlmIChJU19JTlRFUkZBQ0VfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbmRleENudCkgPT0gIDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgIAotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnRlcmZhY2VNYXNrICYgKDE8PGluZGV4Q250KSkKLSAgICAgICAgewotICAgICAgICAgICAgLypuZWVkIHRvIGNoZWNrIHJlc3VsdHMgZm9yIHRoaXMgRHVuaXQgKi8KLSAgICAgICAgICAgIGZvcihwb2xsQ250PTA7cG9sbENudCA8IG1heFBvbGxpbmdGb3JEb25lO3BvbGxDbnQrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW5kZXhDbnQsIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRywgJnJlZ0RhdGEsIE1BU0tfQUxMX0JJVFMpKTsKLSAgICAgICAgICAgICAgICAgaWYgKChyZWdEYXRhICYgMHgyKSAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypkb25lICovCi0gICAgICAgICAgICAgICAgCXRyYWluU3RhdHVzW2luZGV4Q250XSA9IE1WX0hXU19UcmFpbmluZ0lwU3RhdHVzX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKLSAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwb2xsQ250ID09IG1heFBvbGxpbmdGb3JEb25lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyYWluU3RhdHVzW2luZGV4Q250XSA9IE1WX0hXU19UcmFpbmluZ0lwU3RhdHVzX1RJTUVPVVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJLypCZSBzdXJlIHRoYXQgT0RQRyBkb25lKi8KLSAgICAgICAgQ0hFQ0tfU1RBVFVTKGlzT2RwZ0FjY2Vzc0RvbmUoZGV2TnVtLCBpbmRleENudCkpOwotICAgIH0KLQotCS8qV3JpdGUgT0RQRyBkb25lIGluIER1bml0Ki8KLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfU1RBVFVTX0RPTkVfUkVHLCAwLCAweDEpKTsKKwkJZm9yKGluZGV4Q250PTA7IGluZGV4Q250IDwgTUFYX0lOVEVSRkFDRV9OVU07aW5kZXhDbnQrKykKKwkJeworCQkgICAgaWYgKElTX0lOVEVSRkFDRV9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGluZGV4Q250KSA9PSAgMCkKKwkJICAgIHsKKwkJICAgICAgICBjb250aW51ZTsKKwkJICAgIH0KKwkJICAgIGlmIChpbnRlcmZhY2VNYXNrICYgKDE8PGluZGV4Q250KSkKKwkJICAgIHsKKwkJICAgICAgICAvKm5lZWQgdG8gY2hlY2sgcmVzdWx0cyBmb3IgdGhpcyBEdW5pdCAqLworCQkgICAgICAgIGZvcihwb2xsQ250PTA7cG9sbENudCA8IG1heFBvbGxpbmdGb3JEb25lO3BvbGxDbnQrKykKKwkJICAgICAgICB7CisJCSAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbmRleENudCwgT0RQR19UUkFJTklOR19TVEFUVVNfUkVHLCByZWFkRGF0YSwgTUFTS19BTExfQklUUykpOworCQkgICAgICAgICAgICBpZiAoKHJlYWREYXRhW2luZGV4Q250XSAmIDB4MikgIT0gMCkKKwkJICAgICAgICAgICAgeworCQkgICAgICAgICAgICAgICAgLypkb25lICovCisJCQkJCQl0cmFpblN0YXR1c1tpbmRleENudF0gPSBNVl9IV1NfVHJhaW5pbmdJcFN0YXR1c19TVUNDRVNTOworCQkgICAgICAgICAgICAgICAgYnJlYWs7CisJCSAgICAgICAgICAgIH0KKwkJICAgICAgICB9CisjaWZkZWYgQ09ORklHX0JPQksKKyAgICAgICAgICAgICAgICAgLyogV0EgdG8gYXZvaWQgdHJhaW5pbmcgc3R1Y2tpbmcgKi8KKyAgICAgICAgICAgICAgICBod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCA1MCk7IC8qIDUwIG1TZWMgKi8KICNlbmRpZgorCQkgICAgICAgIGlmIChwb2xsQ250ID09IG1heFBvbGxpbmdGb3JEb25lKQorCQkgICAgICAgIHsKKwkJICAgICAgICAgICAgdHJhaW5TdGF0dXNbaW5kZXhDbnRdID0gTVZfSFdTX1RyYWluaW5nSXBTdGF0dXNfVElNRU9VVDsKKwkJICAgICAgICB9CisJCSAgICB9CisJCQkvKkJlIHN1cmUgdGhhdCBPRFBHIGRvbmUqLworCQkgICAgQ0hFQ0tfU1RBVFVTKGlzT2RwZ0FjY2Vzc0RvbmUoZGV2TnVtLCBpbmRleENudCkpOworCQl9CisKKwkJLypXcml0ZSBPRFBHIGRvbmUgaW4gRHVuaXQqLworCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfU1RBVFVTX0RPTkVfUkVHLCAwLCAweDEpKTsKKwl9CiAKICAgICAvKndhaXQgZm9yIGFsbCBEdW5pdCB0ZXN0cyB0byBmaW5pc2ggKG9yIHRpbWVvdXQpKi8KICAgICAvKiBUcmFpbmluZyAiRG9uZSA/IiAqLwpAQCAtNDYzLDE4ICs1OTAsMTQgQEAKICAgICB7CiAgICAgICAgIGlmIChJU19JTlRFUkZBQ0VfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbmRleENudCkgPT0gIDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgIAorICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGludGVyZmFjZU1hc2sgJiAoMTw8aW5kZXhDbnQpKQogICAgICAgICB7CiAgICAgICAgICAgICAvKm5lZWQgdG8gY2hlY2sgcmVzdWx0cyBmb3IgdGhpcyBEdW5pdCAqLwogICAgICAgICAgICAgZm9yKHBvbGxDbnQ9MDtwb2xsQ250IDwgbWF4UG9sbGluZ0ZvckRvbmU7cG9sbENudCsrKQogICAgICAgICAgICAgewotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKLSAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW5kZXhDbnQsIE9EUEdfVFJBSU5JTkdfVFJJR0dFUl9SRUcsIHJlYWREYXRhLCBNQVNLX0FMTF9CSVRTKSk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbmRleENudCwgT0RQR19UUkFJTklOR19TVEFUVVNfUkVHLCByZWFkRGF0YSwgTUFTS19BTExfQklUUykpOwotI2VuZGlmCisgICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZChkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGluZGV4Q250LCB0cmlnZ2VyUmVnQWRkciwgcmVhZERhdGEsIE1BU0tfQUxMX0JJVFMpKTsKICAgICAgICAgICAgICAgICByZWdEYXRhID0gcmVhZERhdGFbaW5kZXhDbnRdOwogICAgICAgICAgICAgICAgICBpZiAoKHJlZ0RhdGEgJiAweDIpICE9IDApCiAgICAgICAgICAgICAgICAgewpAQCAtNDg1LDExICs2MDgsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluU3RhdHVzW2luZGV4Q250XSA9IE1WX0hXU19UcmFpbmluZ0lwU3RhdHVzX0ZBSUw7CisJCQkJCQl0cmFpblN0YXR1c1tpbmRleENudF0gPSBNVl9IV1NfVHJhaW5pbmdJcFN0YXR1c19GQUlMOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKLSAgICAgICAgICAgICAgICB9ICAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorI2lmZGVmIENPTkZJR19CT0JLCisgICAgICAgICAgICAvKiBXQSB0byBhdm9pZCB0cmFpbmluZyBzdHVja2luZyAqLworICAgICAgICAgICAgIGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDUwKTsKKyNlbmRpZgogICAgICAgICAgICAgaWYgKHBvbGxDbnQgPT0gbWF4UG9sbGluZ0ZvckRvbmUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdHJhaW5TdGF0dXNbaW5kZXhDbnRdID0gTVZfSFdTX1RyYWluaW5nSXBTdGF0dXNfVElNRU9VVDsKQEAgLTY2MSw2ICs3ODgsNyBAQAogICAgIEdUX1UzMiByZWFkRGF0YVtNQVhfSU5URVJGQUNFX05VTV07CiAJR1RfVTE2ICptYXNrUmVzdWx0c1B1cFJlZ01hcCA9IGRkcjNUaXBHZXRNYXNrUmVzdWx0c1B1cFJlZ01hcCgpOwogCUdUX1UxNiAqbWFza1Jlc3VsdHNEcVJlZ01hcCAJPSBkZHIzVGlwR2V0TWFza1Jlc3VsdHNEcVJlZygpOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICAvKiBBZ3JlZWQgYXNzdW1wdGlvbjogYWxsIENTIG1hc2sgY29udGFpbiBzYW1lIG51bWJlciBvZiBiaXRzLCBpLmUuIGluIG11bHRpIENTLCB0aGUgbnVtYmVyIG9mIENTIHBlciBtZW1vcnkgaXMgdGhlIHNhbWUgZm9yIGFsbCBwdXBzICovCiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCAgaW50ZXJmYWNlSWQsIENTX0VOQUJMRV9SRUcsIChjc051bVR5cGUgPT0gMCkgPyAxPDwzIDogMCwgKDEgPDwgMykpKTsKQEAgLTY3MSw3ICs3OTksNyBAQAogICAgICAgICBERUJVR19UUkFJTklOR19JUF9FTkdJTkUoREVCVUdfTEVWRUxfRVJST1IsICgiZGRyM1RpcFJlYWRUcmFpbmluZ1Jlc3VsdCBsb2FkUmVzID0gTlVMTCIpKTsKICAgICAgICAgcmV0dXJuIEdUX0ZBSUw7CiAgICAgfQotICAgIGlmIChwdXBOdW0gPj0gdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlKQorICAgIGlmIChwdXBOdW0gPj0gb2N0ZXRzUGVySW50ZXJmYWNlTnVtKQogICAgIHsKICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVBfRU5HSU5FKERFQlVHX0xFVkVMX0VSUk9SLCAoInB1cE51bSAlZCBub3QgdmFsaWRcbiIscHVwTnVtKSk7CiAgICAgfQpAQCAtNjk1LDcgKzgyMyw3IEBACiAgICAgZWxzZSAvKnB1cEFjY2Vzc1R5cGUgPT0gQUNDRVNTX1RZUEVfTVVMVElDQVNUKSovCiAgICAgewogICAgICAgICBzdGFydFB1cCA9IDA7Ci0gICAgICAgIGVuZFB1cCA9IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZS0xOworICAgICAgICBlbmRQdXAgPSBvY3RldHNQZXJJbnRlcmZhY2VOdW0tMTsKICAgICB9IAogICAgIGZvcihwdXBDbnQgPSBzdGFydFB1cDsgcHVwQ250IDw9IGVuZFB1cCA7IHB1cENudCsrKQogICAgIHsKQEAgLTgwNSwxOCArOTMzLDE2IEBACiAgICAgR1RfVTMyIGludGVyZmFjZUlkCiApCiB7Ci0gICAgR1RfVTMyIHBvbGxDbnQgPSAwLCBkYXRhVmFsdWU7CisgICAgR1RfVTMyIHBvbGxDbnQgPSAwLCBkYXRhVmFsdWUsIGV4cGVjdGVkVmFsOwogICAgIEdUX1UzMiByZWFkRGF0YVtNQVhfSU5URVJGQUNFX05VTV07CiAKICAgICBmb3IgKHBvbGxDbnQgPSAwOyBwb2xsQ250IDwgTUFYX1BPTExJTkdfSVRFUkFUSU9OUyA7IHBvbGxDbnQrKykKICAgICB7CiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBPRFBHX0JJU1RfRE9ORSwgcmVhZERhdGEsIE1BU0tfQUxMX0JJVFMpKTsKICAJCWRhdGFWYWx1ZSA9IHJlYWREYXRhW2ludGVyZmFjZUlkXTsKLSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkKENPTkZJR19BTExFWUNBVDMpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOVgpCi0gICAgICAgIGlmICgoKGRhdGFWYWx1ZSA+PiBPRFBHX0JJU1RfRE9ORV9CSVRfT0ZGUyApJiAweDEpID09IE9EUEdfQklTVF9ET05FX0JJVF9WQUxVRSkKLSNlbHNlCi0gICAgICAgIGlmICgoZGF0YVZhbHVlICYgMHgxKSA9PSAweDEpCi0jZW5kaWYKKworCQlleHBlY3RlZFZhbCA9ICAoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpIDwgTVZfVElQX1JFVl8zKT8oT0RQR19CSVNUX0RPTkVfQklUX1ZBTFVFX1JFVjIpOihPRFBHX0JJU1RfRE9ORV9CSVRfVkFMVUVfUkVWMyk7CisgICAgICAgIGlmICgoKGRhdGFWYWx1ZSA+PiBPRFBHX0JJU1RfRE9ORV9CSVRfT0ZGUyApJiAweDEpID09IGV4cGVjdGVkVmFsKQogICAgICAgICB7CiAgICAgICAgICAgICBkYXRhVmFsdWUgPSBkYXRhVmFsdWUgJiAweGZmZmZmZmZlOwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgT0RQR19CSVNUX0RPTkUsIGRhdGFWYWx1ZSwgTUFTS19BTExfQklUUykpOwpAQCAtODU3LDE4ICs5ODMsMjAgQEAKICAgICAvKiBsb2FkIHBhdHRlcm4gdG8gT0RQRyAqLwogICAgIGRkcjNUaXBMb2FkUGF0dGVyblRvT2RwZyhkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIHBhdHRlcm4sIHBhdHRlcm5UYWJsZVtwYXR0ZXJuXS5zdGFydEFkZHIpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZChDT05GSUdfQUxMRVlDQVQzKSB8fCBkZWZpbmVkKENPTkZJR19BUk1BREFfMzlYKQotICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDwgTUFYX0lOVEVSRkFDRV9OVU0gOyBpbnRlcmZhY2VJZCsrKQotICAgIHsKLQkJaWYgKElTX0lOVEVSRkFDRV9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKSA9PSAgMCkKLSAgICAgICAgICAgICBjb250aW51ZTsKLQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHgxNDk4LCAweDMgLCAweGYpKTsKLSAgICB9CisJaWYoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpID49IE1WX1RJUF9SRVZfMykKKwl7CisJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDwgTUFYX0lOVEVSRkFDRV9OVU0gOyBpbnRlcmZhY2VJZCsrKQorCQl7CisJCQlpZiAoSVNfSU5URVJGQUNFX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpID09ICAwKQorCQkgICAgICAgICBjb250aW51ZTsKKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIFNEUkFNX09EVF9DT05UUk9MX0hJR0hfUkVHLCAweDMgLCAweGYpKTsKKwkJfQogCi0JQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX0VOQUJMRV9SRUcsIDB4MSA8PCBPRFBHX0VOQUJMRV9PRkZTLCAgKDB4MSA8PCBPRFBHX0VOQUJMRV9PRkZTKSkpOwotI2Vsc2UKKwkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX0VOQUJMRV9SRUcsIDB4MSA8PCBPRFBHX0VOQUJMRV9PRkZTLCAgKDB4MSA8PCBPRFBHX0VOQUJMRV9PRkZTKSkpOworCX0KKwllbHNlIHsKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfREFUQV9DT05UUk9MX1JFRywgKEdUX1UzMikoMHgxIDw8IDMxKSwgIChHVF9VMzIpKDB4MSA8PCAzMSkpKTsKLSNlbmRpZgorCX0KIAogICAgIGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEpOyAvKiAxIG1TZWMgKi8KIApAQCAtODgzLDEwICsxMDExLDEwIEBACiAgICAgLyogcmV0dXJuIHRvIGRlZmF1bHQgKi8KICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfREFUQV9DT05UUk9MX1JFRywgMCwgTUFTS19BTExfQklUUykpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZChDT05GSUdfQUxMRVlDQVQzKSB8fCBkZWZpbmVkKENPTkZJR19BUk1BREFfMzlYKQotCS8qZGlzYWJsZSBvZHQwIGZvciBDUzAgdHJhaW5pbmcgLSBuZWVkIHRvIGFkanVzdCBmb3IgbXVsdHkgQ1MqLwotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULFBBUkFNX05PVF9DQVJFICwgMHgxNDk4LCAweDAgLCAweGYpKTsKLSNlbmRpZgorCWlmKGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWKSA+PSBNVl9USVBfUkVWXzMpeworCQkvKmRpc2FibGUgb2R0MCBmb3IgQ1MwIHRyYWluaW5nIC0gbmVlZCB0byBhZGp1c3QgZm9yIG11bHR5IENTKi8KKwkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsUEFSQU1fTk9UX0NBUkUgLCAweDE0OTgsIDB4MCAsIDB4ZikpOworCX0KIAogICAgIC8qIHRlbXBvcmFyeSBhZGRlZCAqLwogICAgIGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEpOwpAQCAtODk0LDI2ICsxMDIyLDYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Mb2FkIHNwZWNpZmljIHBhdHRlcm4gdG8gbWVtb3J5IHVzaW5nIENQVQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR1RfU1RBVFVTICAgIGRkcjNUaXBMb2FkUGF0dGVyblRvTWVtQnlDcHUKLSgKLSAgICBHVF9VMzIgICAgICAgICAgZGV2TnVtLAotICAgIE1WX0hXU19QQVRURVJOICBwYXR0ZXJuLAotICAgIEdUX1UzMiAgICAgICAgICBvZmZzZXQKLSkKLXsKLQkvKiBhdm9pZCB3YXJuaW5ncyAqLwotCWRldk51bSA9IGRldk51bTsKLQlwYXR0ZXJuID0gcGF0dGVybjsKLQlvZmZzZXQgPSBvZmZzZXQ7Ci0KLSAgICAvKiBlcmFuYmEgLSBUQkQgKi8KLSAgICByZXR1cm4gR1RfT0s7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBUcmFpbmluZyBzZWFyY2ggcm91dGluZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogR1RfU1RBVFVTICAgIGRkcjNUaXBJcFRyYWluaW5nV3JhcHBlckludApAQCAtOTQzLDYgKzEwNTEsNyBAQAogICAgIE1WX0hXU19TZWFyY2hEaXJlY3Rpb24gc2VhcmNoRGlySWQgLCBzdGFydFNlYXJjaCwgZW5kU2VhcmNoOwogICAgIE1WX0hXU19FZGdlQ29tcGFyZSAgICAgZWRnZUNvbXBVc2VkOwogCUdUX1U4IGNvbnNUYXAgPSAoZGlyZWN0aW9uID09IE9QRVJfV1JJVEUpPyg2NCk6KDApOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBpZiAodHJhaW5TdGF0dXMgPT0gTlVMTCkKICAgICB7CkBAIC05NTYsNyArMTA2NSw3IEBACiAgICAgICAgIChzZWFyY2hEaXIgPiBNVl9IV1NfSGlnaDJMb3cpIHx8CiAgICAgICAgIChjb250cm9sRWxlbWVudCA+IE1WX0hXU19Db250cm9sRWxlbWVudF9EUVNfU0tFVykgfHwKICAgICAgICAgKHJlc3VsdFR5cGUgPiBSRVNVTFRfUEVSX0JZVEUpIHx8Ci0gICAgICAgIChwdXBOdW0gPj0gdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlKSB8fAorICAgICAgICAocHVwTnVtID49IG9jdGV0c1BlckludGVyZmFjZU51bSkgfHwKICAgICAgICAgKHB1cEFjY2Vzc1R5cGUgPiBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QpIHx8CiAgICAgICAgIChpbnRlcmZhY2VJZCA+IDExKXx8CiAgICAgICAgIChhY2Nlc3NUeXBlID4gQUNDRVNTX1RZUEVfTVVMVElDQVNUKSkKQEAgLTEwNDUsOCArMTE1NCw5IEBACiAJR1RfVTggY29uc1RhcCA9IChkaXJlY3Rpb24gPT0gT1BFUl9XUklURSk/KDY0KTooMCk7CiAJR1RfVTggYml0Qml0TWFza1tNQVhfQlVTX05VTV0gPSB7MH0sIGJpdEJpdE1hc2tBY3RpdmUgPSAwOwogCUdUX1U4IHB1cElkOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKLSAgICBpZiAocHVwTnVtID49IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSkKKyAgICBpZiAocHVwTnVtID49IG9jdGV0c1BlckludGVyZmFjZU51bSkKICAgICB7CiAgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQX0VOR0lORShERUJVR19MRVZFTF9FUlJPUiwgKCJwdXBOdW0gJWQgbm90IHZhbGlkXG4iLHB1cE51bSkpOwogICAgIH0KQEAgLTEwNzIsNyArMTE4Miw3IEBACiAgICAgZm9yKGludGVyZmFjZUNudCA9IHN0YXJ0SWY7IGludGVyZmFjZUNudCA8PSBlbmRJZjsgaW50ZXJmYWNlQ250KyspICAgIAogICAgIHsKICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VDbnQpCi0gICAgICAgIGZvcihwdXBJZCA9IDA7IHB1cElkIDw9ICh0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UtMSkgOyBwdXBJZCsrKQorICAgICAgICBmb3IocHVwSWQgPSAwOyBwdXBJZCA8PSAob2N0ZXRzUGVySW50ZXJmYWNlTnVtLTEpIDsgcHVwSWQrKykKICAgICAgICAgewogCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwSWQpCiAgICAgICAgICAgICBpZiAocmVzdWx0VHlwZSA9PSBSRVNVTFRfUEVSX0JJVCkKQEAgLTExMjMsNyArMTIzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WX0hXU19Mb3cySGlnaCwgZGlyZWN0aW9uLCBpbnRlcmZhY2VNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICBudW1JdGVyLzIsIG51bUl0ZXIvMiwgcGF0dGVybiwgRURHRV9GUCwgdHJhaW5Dc1R5cGUsIGNzTnVtLCAgdHJhaW5TdGF0dXMpOwogCi0JCSAgICBmb3IocHVwSWQgPSAwOyBwdXBJZCA8PSAodG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlLTEpIDsgcHVwSWQrKykKKwkJICAgIGZvcihwdXBJZCA9IDA7IHB1cElkIDw9IChvY3RldHNQZXJJbnRlcmZhY2VOdW0tMSkgOyBwdXBJZCsrKQogCQkgICAgewogCQkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cElkKQogCkBAIC0xMTQ2LDcgKzEyNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBNVl9IV1NfSGlnaDJMb3csIGRpcmVjdGlvbiwgaW50ZXJmYWNlTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtSXRlci8yLCBudW1JdGVyLzIsIHBhdHRlcm4sIEVER0VfRlAsIHRyYWluQ3NUeXBlLCBjc051bSwgIHRyYWluU3RhdHVzKTsKIAotCQkgICAgZm9yKHB1cElkID0gMDsgcHVwSWQgPD0gKHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZS0xKSA7IHB1cElkKyspCisJCSAgICBmb3IocHVwSWQgPSAwOyBwdXBJZCA8PSAob2N0ZXRzUGVySW50ZXJmYWNlTnVtLTEpIDsgcHVwSWQrKykKIAkJICAgIHsKIAkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXBJZCkKIApAQCAtMTE3NSwxMSArMTI4NSwxMiBAQAogR1RfU1RBVFVTICAgIGRkcjNUaXBMb2FkUGh5VmFsdWVzKEdUX0JPT0wgYkxvYWQpCiB7CiAgICAgR1RfVTMyICBidXNDbnQgPSAwLCAgaW50ZXJmYWNlSWQsICBkZXZOdW0gPSAwOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgZm9yKGJ1c0NudCA9IDA7IGJ1c0NudCA8IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKTsgYnVzQ250KyspCisgICAgICAgIGZvcihidXNDbnQgPSAwOyBidXNDbnQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0NudCsrKQogICAgICAgICB7CiAgICAgICAgIAlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNDbnQpCiAgICAgICAgICAgICBpZiAoYkxvYWQgPT0gR1RfVFJVRSkKQEAgLTEyMTcsNiArMTMyOCw3IEBACiAgICAgTVZfSFdTX1RyYWluaW5nSXBTdGF0dXMgdHJhaW5TdGF0dXNbTUFYX0lOVEVSRkFDRV9OVU1dOwogICAgIEdUX1UzMiAqcFJlcyA9IE5VTEw7CiAgICAgR1RfVTMyIHNlYXJjaFN0YXRlID0gMDsgCisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIGRkcjNUaXBMb2FkUGh5VmFsdWVzKEdUX1RSVUUpOwogCkBAIC0xMjMxLDcgKzEzNDMsNyBAQAogICAgICAgICAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICAgICAgICAgIGZvcihwdXBJZCA9IDA7IHB1cElkIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwSWQrKykKKyAgICAgICAgICAgICAgICBmb3IocHVwSWQgPSAwOyBwdXBJZCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cElkKyspCiAgICAgICAgICAgICAgICAgewogCQkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXBJZCkKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBSZWFkVHJhaW5pbmdSZXN1bHQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nTGV2ZWxpbmcuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdMZXZlbGluZy5jCmluZGV4IDM1ZDFjNjguLmRjZWU2MWIgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdMZXZlbGluZy5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdMZXZlbGluZy5jCkBAIC0zMywxMCArMzMsMTQgQEAKICNpbmNsdWRlICJtdkRkclRvcG9sb2d5RGVmLmgiCiAKICNkZWZpbmUgV0xfSVRFUkFUSU9OX05VTSAgICAgICAgICAgICgxMCkKLSNkZWZpbmUgT05FX0NMT0NLX0VSUk9SX1NISUZUICAgKDIpCi0jZGVmaW5lIEFMSUdOX0VSUk9SX1NISUZUICAgICAgICgtMikKICNkZWZpbmUgTUFUUklYX01FTV9BRERSRVNTICAgICAgKDB4ZmQwMDApCiAKKyNkZWZpbmUgTk9fUEhBU0VfU0hJRlQJCQkJKDApCisjZGVmaW5lIE9ORV9DTE9DS19FUlJPUl9TSElGVAkJKDIpCisjZGVmaW5lIFRXT19DTE9DS19FUlJPUl9TSElGVAkJKDQpCisjZGVmaW5lIFRIUkVFX0NMT0NLX0VSUk9SX1NISUZUCQkoNikKKyNkZWZpbmUgQUxJR05fRVJST1JfU0hJRlQJCQkoLTIpCisKIHN0YXRpYyBHVF9VMzIgcHVwTWFza1RhYmxlW109CiB7CiAgICAgMHgwMDAwMDBGRiwKQEAgLTUwLDcgKzU0LDYgQEAKIAogZXh0ZXJuIE1WX0hXU19SRVNVTFQgdHJhaW5pbmdSZXN1bHRbTUFYX1NUQUdFX0xJTUlUXVtNQVhfSU5URVJGQUNFX05VTV07CiBleHRlcm4gQVVUT19UVU5FX1NUQUdFIHRyYWluaW5nU3RhZ2U7Ci1leHRlcm4gR1RfVTMyIHJsVmVyc2lvbjsgCiBleHRlcm4gTVZfSFdTX1RPUE9MT0dZX01BUCAqdG9wb2xvZ3lNYXA7CiBleHRlcm4gQ2xWYWx1ZVBlckZyZXEgY2FzTGF0ZW5jeVRhYmxlW107CiBleHRlcm4gR1RfVTMyICBzdGFydFhzYk9mZnNldDsKQEAgLTczLDUzICs3Niw2MSBAQAogKAogICAgIEdUX1UzMiAgIGRldk51bQogKTsKLXN0YXRpYyBHVF9TVEFUVVMgICAgZGRyM1RpcFdsU3VwcEFsaWduRXJyU2hpZnQKLSgKLQlHVF9VMzIgZGV2TnVtLAotCUdUX1UzMiBpbnRlcmZhY2VJZCwKLQlHVF9VMzIgYnVzSWQsCi0JR1RfVTMyIGJ1c0lkRGVsdGEKLSk7CiAKIHN0YXRpYyBHVF9TVEFUVVMgICAgZGRyM1RpcFdsU3VwcEFsaWduUGhhc2VTaGlmdAogKAogCUdUX1UzMiBkZXZOdW0sCi0JR1RfVTMyIGludGVyZmFjZUlkLAotCUdUX1UzMiBidXNJZCwKLQlHVF9VMzIgIG9mZnNldCwKLQlHVF9VMzIgYnVzSWREZWx0YQorICAgIEdUX1UzMiBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgYnVzSWQKICk7CiAKIHN0YXRpYyBHVF9TVEFUVVMgICAgZGRyM1RpcFhzYkNvbXBhcmVUZXN0CiAoCisgICAgR1RfVTMyIGRldk51bSwKKyAgICBHVF9VMzIgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyIGJ1c0lkLAorICAgIEdUXzggb2Zmc2V0CispOworCisjaWYgMCAvKiByZW1vdmUgdGhpcyBpZiBpdCdzIG5vdCBpbiB1c2UgKi8KK3N0YXRpYyBHVF9TVEFUVVMgICAgZGRyM1RpcFdsU3VwcEFsaWduRXJyU2hpZnQKKygKIAlHVF9VMzIgZGV2TnVtLAogCUdUX1UzMiBpbnRlcmZhY2VJZCwKLQlHVF9VMzIgYnVzSWQsCi0JR1RfVTMyIGVkZ2VPZmZzZXQsCi0JR1RfVTMyIGJ1c0lkRGVsdGEKKwlHVF9VMzIgYnVzSWQKICk7CiAKIHN0YXRpYyBHVF9TVEFUVVMgICAgZGRyM1RpcFdsU3VwcE9uZUNsa0VyclNoaWZ0CiAoCiAJR1RfVTMyIGRldk51bSwKIAlHVF9VMzIgaW50ZXJmYWNlSWQsCi0JR1RfVTMyIGJ1c0lkLAotCUdUX1UzMiBidXNJZERlbHRhCisJR1RfVTMyIGJ1c0lkCiApOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogbXZId3NEZHIzVGlwTWF4Q1NHZXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdUX1UzMiBtdkh3c0RkcjNUaXBNYXhDU0dldCh2b2lkKQorR1RfVTMyIG12SHdzRGRyM1RpcE1heENTR2V0KEdUX1UzMiBkZXZOdW0pCiB7Ci0gIEdUX1UzMiBjX2NzOworICBHVF9VMzIgY19jcyxpbnRlcmZhY2VJZD0wLGJ1c0lkPTA7CisgIEdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAgIHN0YXRpYyBHVF9VMzIgbWF4X2NzPTA7CiAKLSAgaWYgKCFtYXhfY3MpewotCSBmb3IoY19jcyA9IDA7Y19jcyA8IE5VTV9PRl9DUzsgY19jcysrKXsKLQkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbMF0uYXNCdXNQYXJhbXNbMF0uY3NCaXRtYXNrLCBjX2NzKQorICBpZiAoIW1heF9jcykKKyAgeworICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBHZXRGaXJzdEFjdGl2ZUlmKChHVF9VOClkZXZOdW0sIHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCAmaW50ZXJmYWNlSWQpKTsKKyAJICBmb3IoYnVzSWQ9MDsgYnVzSWQ8b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNJZCsrKQorICAgICAgeworICAgICAgICAgIFZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0lkKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBmb3IoY19jcyA9IDA7Y19jcyA8IE5VTV9PRl9DUzsgY19jcysrKQorICAgICAgeworCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzSWRdLmNzQml0bWFzaywgY19jcykKIAkJbWF4X2NzKys7Ci0JCX0KKwkgIH0KICAgfQogICByZXR1cm4gbWF4X2NzOwogfQpAQCAtMTM0LDcgKzE0NSw3IEBACiApCiB7CiAgICAgR1RfVTMyIGRhdGEsIG1hc2s7Ci0JR1RfVTMyIG1heF9jcyA9IG12SHdzRGRyM1RpcE1heENTR2V0KCk7CisJR1RfVTMyIG1heF9jcyA9IG12SHdzRGRyM1RpcE1heENTR2V0KGRldk51bSk7CiAJR1RfVTMyIGJ1c051bSwgaW50ZXJmYWNlSWQsIGNsVmFsOwogICAgIE1WX0hXU19TUEVFRF9CSU4gc3BlZWRCaW5JbmRleDsKIAlHVF9VMzIgY3NFbmFibGVSZWdWYWxbTUFYX0lOVEVSRkFDRV9OVU1dID0gezB9OyAvKiBzYXZlIGN1cnJlbnQgQ1MgdmFsdWUgKi8KQEAgLTE0Myw1NyArMTU0LDcgQEAKIAlHVF9VOCAgIFJMVmFsdWVzW05VTV9PRl9DU11bTUFYX0JVU19OVU1dW01BWF9JTlRFUkZBQ0VfTlVNXSA7CiAJUGF0dGVybkluZm8gKnBhdHRlcm5UYWJsZSA9IGRkcjNUaXBHZXRQYXR0ZXJuVGFibGUoKTsKIAlHVF9VMTYgKm1hc2tSZXN1bHRzUHVwUmVnTWFwID0gZGRyM1RpcEdldE1hc2tSZXN1bHRzUHVwUmVnTWFwKCk7Ci0KLQotCS8qREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfSU5GTywgKCI9PT1SRUFEIExFVkVMSU5HPT09IikpOyovCi0gICAgaWYgKHJsVmVyc2lvbiA9PSAwKQotICAgIHsKLSAgICAgICAgLyogT0xEIFJMIG1hY2hpbmUgKi8KLSAgICAgICAgZGF0YSA9IDB4NDA7Ci0gICAgICAgIGRhdGEgfD0gKDE8PDIwKTsKLSAgICAgICAgLyogVEJEIG11bHRpIENTICovCi0gICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgVFJBSU5JTkdfUkVHLCBkYXRhLCAweDExRkZGRikpOwotICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIFRSQUlOSU5HX1BBVFRFUk5fQkFTRV9BRERSRVNTX1JFRywgMCwgMHhGRkZGRkZGOCkpOwotICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIFRSQUlOSU5HX1JFRywgKEdUX1UzMikoMSA8PCAzMSksIChHVF9VMzIpKDEgPDwgMzEpKSk7Ci0gICAgICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgICAgdHJhaW5pbmdSZXN1bHRbdHJhaW5pbmdTdGFnZV1baW50ZXJmYWNlSWRdID0gVEVTVF9TVUNDRVNTOwotICAgICAgICAgICBpZiAoZGRyM1RpcElmUG9sbGluZyhkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAwLCAoR1RfVTMyKSgxIDw8IDMxKSwgVFJBSU5JTkdfUkVHLCBNQVhfUE9MTElOR19JVEVSQVRJT05TKSAhPSBHVF9PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJSTDogRERSMyBwb2xsIGZhaWxlZCgxKSBJRiAlZFxuIiwgaW50ZXJmYWNlSWQpKTsKLSAgICAgICAgICAgICAgICB0cmFpbmluZ1Jlc3VsdFt0cmFpbmluZ1N0YWdlXVtpbnRlcmZhY2VJZF0gPSBURVNUX0ZBSUxFRDsKLSAgICAgICAgICAgICAgICBpZiAoZGVidWdNb2RlID09IEdUX0ZBTFNFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdUX0ZBSUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIHJlYWQgcmVhZC1sZXZlbGluZyByZXN1bHQgKi8KLSAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZChkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIFRSQUlOSU5HX1JFRywgZGF0YVJlYWQsIDE8PDMwKSk7Ci0gICAgICAgIC8qIGV4aXQgcmVhZCBsZXZlbGluZyBtb2RlICovCi0gICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgVFJBSU5JTkdfU1dfMl9SRUcsIDB4OCwgMHg5KSk7Ci0gICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgVFJBSU5JTkdfU1dfMV9SRUcsIDE8PDE2LCAxPDwxNikpOwotICAgICAgICAvKiBkaXNhYmxlIFJMIG1hY2hpbmUgYWxsIFRybl9DU1szOjBdICwgWzE2OjBdICovCi0KLSAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBUUkFJTklOR19SRUcsICAwLCAweEYxRkZGRikpOwotCi0gICAgICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0gICAgICAgICAgICBpZiAoKGRhdGFSZWFkW2ludGVyZmFjZUlkXSYoMTw8MzApKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIlxuUmVhZCBMZXZlbGluZyBmYWlsZWQgZm9yIElGICVkXG4iLCBpbnRlcmZhY2VJZCkpOwotICAgICAgICAgICAgICAgIHRyYWluaW5nUmVzdWx0W3RyYWluaW5nU3RhZ2VdW2ludGVyZmFjZUlkXSA9IFRFU1RfRkFJTEVEOwotICAgICAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUgPT0gR1RfRkFMU0UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR1RfRkFJTDsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBHVF9PSzsKLSAgICB9Ci0gICAgLyogTkVXIFJMIG1hY2hpbmUgKi8KKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAJZm9yKGVmZmVjdGl2ZV9jcyA9IDA7IGVmZmVjdGl2ZV9jcyA8IE5VTV9PRl9DUzsgZWZmZWN0aXZlX2NzKyspCiAJCWZvcihidXNOdW0gPSAwOyBidXNOdW0gPCBNQVhfQlVTX05VTTsgYnVzTnVtKyspCkBAIC0yODYsNTAgKzI0Nyw0OCBAQAogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgVFJBSU5JTkdfUkVHLCAoMSA8PCAyNCkgfCAoMSA8PCAyMCksICgxIDw8IDI0KSB8ICgxIDw8IDIwKSkpOwogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgVFJBSU5JTkdfUkVHLCAoR1RfVTMyKSgxIDw8IDMxKSwgKEdUX1UzMikoMSA8PCAzMSkpKTsKICAgICAvKioqKioqKioqIHRyaWdnZXIgdHJhaW5pbmcgKioqKioqKioqKioqKioqKioqKi8KLSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkKENPTkZJR19BTExFWUNBVDMpICB8fCBkZWZpbmVkKENPTkZJR19BUk1BREFfMzlYKSAvKiBUcmlnZ2VyLCBwb2xsIG9uIHN0YXR1cyBhbmQgZGlzYWJsZSBPRFBHICovCi0vKiAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfVFJBSU5JTkdfVFJJR0dFUl9SRUcsIDB4MSwgMHgxKSk7ICovCi0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHLCAweDEsIDB4MSkpOwotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19UUkFJTklOR19TVEFUVVNfUkVHLCAweDEsIDB4MSkpOworCWlmKGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWKSA+PSBNVl9USVBfUkVWXzMpeworCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfVFJBSU5JTkdfVFJJR0dFUl9SRUcsIDB4MSwgMHgxKSk7CiAKLQkgIC8qY2hlY2sgZm9yIHRyYWluaW5nIGRvbmUgKyByZXN1bHRzIHBhc3MqLwotCSAgaWYgKGRkcjNUaXBJZlBvbGxpbmcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAweDIsIDB4MiwgT0RQR19UUkFJTklOR19TVEFUVVNfUkVHLCBNQVhfUE9MTElOR19JVEVSQVRJT05TKSAhPSBHVF9PSykKLQkJICB7Ci0JCQkgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIlRyYWluaW5nIERvbmUgRmFpbGVkXG4iKSk7Ci0JCQkgIHJldHVybiBHVF9GQUlMOwotCQkgIH0KLSAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQotICAgIHsKLSAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLQkgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoICBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHLCAgZGF0YVJlYWQsIDB4NCkpOwotCWRhdGEgPSBkYXRhUmVhZFtpbnRlcmZhY2VJZF07Ci0JaWYoZGF0YSAhPSAweDApIHsKLQkgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIlRyYWluaW5nIFJlc3VsdCBGYWlsZWRcbiIpKTsKLQkgIH0KLSAgICB9Ci0JICAvKmRpc2FibGUgT0RQRyAtIEJhY2sgdG8gZnVuY3Rpb25hbCBtb2RlKi8KLQkgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19FTkFCTEVfUkVHLCAweDEgPDwgT0RQR19ESVNBQkxFX09GRlMsICAoMHgxIDw8IE9EUEdfRElTQUJMRV9PRkZTKSkpOwotCSAgaWYgKGRkcjNUaXBJZlBvbGxpbmcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAweDAsIDB4MSwgT0RQR19FTkFCTEVfUkVHLCBNQVhfUE9MTElOR19JVEVSQVRJT05TKSAhPSBHVF9PSykKKwkJICAvKmNoZWNrIGZvciB0cmFpbmluZyBkb25lICsgcmVzdWx0cyBwYXNzKi8KKwkJICBpZiAoZGRyM1RpcElmUG9sbGluZyhkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIDB4MiwgMHgyLCBPRFBHX1RSQUlOSU5HX1NUQVRVU19SRUcsIE1BWF9QT0xMSU5HX0lURVJBVElPTlMpICE9IEdUX09LKQogCQkJICB7Ci0JCQkJICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJPRFBHIGRpc2FibGUgZmFpbGVkICIpKTsKKwkJCQkgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIlRyYWluaW5nIERvbmUgRmFpbGVkXG4iKSk7CiAJCQkJICByZXR1cm4gR1RfRkFJTDsKIAkJCSAgfQotCSAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX0RBVEFfQ09OVFJPTF9SRUcsIDAsIE1BU0tfQUxMX0JJVFMpKTsKLSNlbHNlIC8qIEp1c3QgdHJpZ2dlciBhbmQgZ28gY2hlY2sgZm9yIHJlc3VsdHMgKi8KLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRywgMHgxLCAweDEpKTsKLSNlbmRpZgotCisJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCisJCXsKKwkJICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCisJCSAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZCggIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIE9EUEdfVFJBSU5JTkdfVFJJR0dFUl9SRUcsICBkYXRhUmVhZCwgMHg0KSk7CisJCWRhdGEgPSBkYXRhUmVhZFtpbnRlcmZhY2VJZF07CisJCWlmKGRhdGEgIT0gMHgwKSB7CisJCSAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfRVJST1IsICgiVHJhaW5pbmcgUmVzdWx0IEZhaWxlZFxuIikpOworCQkgIH0KKwkJfQorCQkgIC8qZGlzYWJsZSBPRFBHIC0gQmFjayB0byBmdW5jdGlvbmFsIG1vZGUqLworCQkgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19FTkFCTEVfUkVHLCAweDEgPDwgT0RQR19ESVNBQkxFX09GRlMsICAoMHgxIDw8IE9EUEdfRElTQUJMRV9PRkZTKSkpOworCQkgIGlmIChkZHIzVGlwSWZQb2xsaW5nKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgMHgwLCAweDEsIE9EUEdfRU5BQkxFX1JFRywgTUFYX1BPTExJTkdfSVRFUkFUSU9OUykgIT0gR1RfT0spCisJCQkJICB7CisJCQkJCSAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfRVJST1IsICgiT0RQRyBkaXNhYmxlIGZhaWxlZCAiKSk7CisJCQkJCSAgcmV0dXJuIEdUX0ZBSUw7CisJCQkJICB9CisJCSAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX0RBVEFfQ09OVFJPTF9SRUcsIDAsIE1BU0tfQUxMX0JJVFMpKTsKKwl9CisJZWxzZSB7CisJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19UUkFJTklOR19TVEFUVVNfUkVHLCAweDEsIDB4MSkpOworCX0KIAkJLyoqKioqKioqKioqKiBkb3VibGUgbG9vcCBvbiBidXMsIHB1cCAqKioqKioqKiovCiAJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAJCXsKIAkJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCiAJCQkvKiBjaGVjayB0cmFpbmluZyBkb25lICovCiAJCQlpc0FueVB1cEZhaWwgPSBHVF9GQUxTRTsKLQkJCWZvciAoYnVzTnVtPTA7IGJ1c051bTx0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IGJ1c051bSsrKQorCQkJZm9yIChidXNOdW09MDsgYnVzTnVtPG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzTnVtKyspCiAJCQl7CiAgICAgICAgCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzTnVtKQogCQkJCWlmIChkZHIzVGlwSWZQb2xsaW5nKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsICgxIDw8IDI1KSwgKDEgPDwgMjUpLCBtYXNrUmVzdWx0c1B1cFJlZ01hcFtidXNOdW1dLCBNQVhfUE9MTElOR19JVEVSQVRJT05TKSAhPSBHVF9PSykKIAkJCQl7Ci0JCQkJCURFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIlxuUkw6IEREUjMgcG9sbCBmYWlsZWQoMikgZm9yIGJ1cyAlZCIsIGJ1c051bSkpOworCQkJCQlERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJcblJMOiBERFIzIHBvbGwgZmFpbGVkKDIpIGZvciBJRiAlZCBDUyAlZCBidXMgJWQiLCBpbnRlcmZhY2VJZCwgZWZmZWN0aXZlX2NzLCBidXNOdW0pKTsKIAkJCQkJaXNBbnlQdXBGYWlsID0gR1RfVFJVRTsKIAkJCQl9CiAJCQkJZWxzZQpAQCAtMzY5LDcgKzMyOCw3IEBACiAJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAJCXsKIAkJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0JCQlmb3IgKGJ1c051bT0wOyBidXNOdW08dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNOdW0rKykKKwkJCWZvciAoYnVzTnVtPTA7IGJ1c051bTxvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c051bSsrKQogCQkJewogCQkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c051bSkKIAkJCQkvKiByZWFkIHJlc3VsdCBwZXIgcHVwIGZyb20gYXJyeSAqLwpAQCAtNDA5LDcgKzM2OCw3IEBACiApCiB7CiAJR1RfVTMyIGNfY3MsIGludGVyZmFjZUlkLCBjc19tYXNrID0gMDsKLQlHVF9VMzIgbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoKTsKKwlHVF9VMzIgbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoZGV2TnVtKTsKIAogLyoJaW4gVFJBSU5JVU5HIHJlZyAoMHgxNWIwKSB3cml0ZSAweDgwMDAwMDA4IHwgY3NfbWFzazoKIAlUcm5TdGFydApAQCAtNDQzLDcgKzQwMiw3IEBACiApCiB7CiAJR1RfVTMyIGNfY3MsIGludGVyZmFjZUlkLCBjc19tYXNrID0gMDsKLQlHVF9VMzIgbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoKTsKKwlHVF9VMzIgbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoZGV2TnVtKTsKIAogCS8qIGluIFRSQUlOSVVORyByZWcgKDB4MTViMCkgd3JpdGUgMHg4MDAwMDA0MCB8IGNzX21hc2s6CiAJVHJuU3RhcnQKQEAgLTQ5NCwxMSArNDUzLDEyIEBACiAgICAgR1RfVTMyICBkYXRhMldyaXRlW01BWF9JTlRFUkZBQ0VfTlVNXVtNQVhfQlVTX05VTV07CiAJUGF0dGVybkluZm8gKnBhdHRlcm5UYWJsZSA9IGRkcjNUaXBHZXRQYXR0ZXJuVGFibGUoKTsKIAlHVF9VMTYgKm1hc2tSZXN1bHRzRHFSZWdNYXAgCT0gZGRyM1RpcEdldE1hc2tSZXN1bHRzRHFSZWcoKTsKLSAgICAKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOworCiAJZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPCBNQVhfSU5URVJGQUNFX05VTTsgaW50ZXJmYWNlSWQrKykKIAl7CiAJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0gICAgICAgIGZvcihidXNOdW0gPSAwOyBidXNOdW0gPD10b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IGJ1c051bSsrKQorICAgICAgICBmb3IoYnVzTnVtID0gMDsgYnVzTnVtIDw9b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNOdW0rKykKIAkJewogCQkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c051bSkKIAkJCQlwZXJCaXRSTFB1cFN0YXR1c1tpbnRlcmZhY2VJZF1bYnVzTnVtXSA9IDA7CQpAQCAtNTgyLDQ0ICs1NDIsNDMgQEAKIAkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBUUkFJTklOR19SRUcsICgxIDw8IDI0KSB8ICgxIDw8IDIwKSwgKDEgPDwgMjQpIHwgKDEgPDwgMjApKSk7CiAJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgVFJBSU5JTkdfUkVHLCAoR1RfVTMyKSgxIDw8IDMxKSwgKEdUX1UzMikoMSA8PCAzMSkpKTsKIAkJLyoqKioqKioqKiB0cmlnZ2VyIHRyYWluaW5nICoqKioqKioqKioqKioqKioqKiovCi0jaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkgfHwgZGVmaW5lZChDT05GSUdfQUxMRVlDQVQzKSAvKiBUcmlnZ2VyLCBwb2xsIG9uIHN0YXR1cyBhbmQgZGlzYWJsZSBPRFBHICovCi0vKiAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfVFJBSU5JTkdfVFJJR0dFUl9SRUcsIDB4MSwgMHgxKSk7ICovCi0JICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19UUkFJTklOR19UUklHR0VSX1JFRywgMHgxLCAweDEpKTsKLQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX1RSQUlOSU5HX1NUQVRVU19SRUcsIDB4MSwgMHgxKSk7CisJCWlmKGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWKSA+PSBNVl9USVBfUkVWXzMpeworCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHLCAweDEsIDB4MSkpOwogCi0JCS8qY2hlY2sgZm9yIHRyYWluaW5nIGRvbmUgKyByZXN1bHRzIHBhc3MqLwotCQlpZiAoZGRyM1RpcElmUG9sbGluZyhkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIDB4MiwgMHgyLCBPRFBHX1RSQUlOSU5HX1NUQVRVU19SRUcsIE1BWF9QT0xMSU5HX0lURVJBVElPTlMpICE9IEdUX09LKQorCQkJLypjaGVjayBmb3IgdHJhaW5pbmcgZG9uZSArIHJlc3VsdHMgcGFzcyovCisJCQlpZiAoZGRyM1RpcElmUG9sbGluZyhkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIDB4MiwgMHgyLCBPRFBHX1RSQUlOSU5HX1NUQVRVU19SRUcsIE1BWF9QT0xMSU5HX0lURVJBVElPTlMpICE9IEdUX09LKQorCQkJeworCQkJCSBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJUcmFpbmluZyBEb25lIEZhaWxlZFxuIikpOworCQkJCSByZXR1cm4gR1RfRkFJTDsKKwkJCX0KKwkJZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKIAkJewotCQkJIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIlRyYWluaW5nIERvbmUgRmFpbGVkXG4iKSk7Ci0JCQkgcmV0dXJuIEdUX0ZBSUw7CisJCSAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZChkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHLCAgZGF0YVJlYWQsIDB4NCkpOworCQkJZGF0YSA9IGRhdGFSZWFkW2ludGVyZmFjZUlkXTsKKwkJCWlmKGRhdGEgIT0gMHgwKSB7CisJCQkJREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfRVJST1IsICgiVHJhaW5pbmcgUmVzdWx0IEZhaWxlZFxuIikpOworCQkJfQogCQl9Ci0gICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKLSAgICB7Ci0gICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0JCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgT0RQR19UUkFJTklOR19UUklHR0VSX1JFRywgIGRhdGFSZWFkLCAweDQpKTsKLQkJZGF0YSA9IGRhdGFSZWFkW2ludGVyZmFjZUlkXTsKLQkJaWYoZGF0YSAhPSAweDApIHsKLQkJCURFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIlRyYWluaW5nIFJlc3VsdCBGYWlsZWRcbiIpKTsKKwkJCS8qZGlzYWJsZSBPRFBHIC0gQmFjayB0byBmdW5jdGlvbmFsIG1vZGUqLworCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX0VOQUJMRV9SRUcsIDB4MSA8PCBPRFBHX0RJU0FCTEVfT0ZGUywgICgweDEgPDwgT0RQR19ESVNBQkxFX09GRlMpKSk7CisJCQlpZiAoZGRyM1RpcElmUG9sbGluZyhkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIDB4MCwgMHgxLCBPRFBHX0VOQUJMRV9SRUcsIE1BWF9QT0xMSU5HX0lURVJBVElPTlMpICE9IEdUX09LKQorCQkJeworCQkJCURFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIk9EUEcgZGlzYWJsZSBmYWlsZWQgIikpOworCQkJCXJldHVybiBHVF9GQUlMOworCQkJfQorCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX0RBVEFfQ09OVFJPTF9SRUcsIDAsIE1BU0tfQUxMX0JJVFMpKTsKIAkJfQotCX0KLQkJLypkaXNhYmxlIE9EUEcgLSBCYWNrIHRvIGZ1bmN0aW9uYWwgbW9kZSovCi0JCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19FTkFCTEVfUkVHLCAweDEgPDwgT0RQR19ESVNBQkxFX09GRlMsICAoMHgxIDw8IE9EUEdfRElTQUJMRV9PRkZTKSkpOwotCQlpZiAoZGRyM1RpcElmUG9sbGluZyhkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIDB4MCwgMHgxLCBPRFBHX0VOQUJMRV9SRUcsIE1BWF9QT0xMSU5HX0lURVJBVElPTlMpICE9IEdUX09LKQotCQl7Ci0JCQlERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJPRFBHIGRpc2FibGUgZmFpbGVkICIpKTsKLQkJCXJldHVybiBHVF9GQUlMOworCQllbHNlIHsKKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19UUkFJTklOR19TVEFUVVNfUkVHLCAweDEsIDB4MSkpOwogCQl9Ci0JCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19EQVRBX0NPTlRST0xfUkVHLCAwLCBNQVNLX0FMTF9CSVRTKSk7Ci0jZWxzZSAvKiBKdXN0IHRyaWdnZXIgYW5kIGdvIGNoZWNrIGZvciByZXN1bHRzICovCi0JCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19UUkFJTklOR19TVEFUVVNfUkVHLCAweDEsIDB4MSkpOwotI2VuZGlmCiAKIAkJLyoqKioqKioqKioqKiBkb3VibGUgbG9vcCBvbiBidXMsIHB1cCAqKioqKioqKiovCiAJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAJCXsKIAkJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCiAJCQkvKiBjaGVjayB0cmFpbmluZyBkb25lICovCi0JCQlmb3IgKGJ1c051bT0wOyBidXNOdW08dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNOdW0rKykKKwkJCWZvciAoYnVzTnVtPTA7IGJ1c051bTxvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c051bSsrKQogCQkJewogCQkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c051bSkKIAkJCQlpZiAocGVyQml0UkxQdXBTdGF0dXNbaW50ZXJmYWNlSWRdW2J1c051bV0gPT0gR1RfRkFMU0UpCkBAIC02NjIsNyArNjIxLDcgQEAKIAkJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAJCQl7CiAJCQkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLQkJCQlmb3IgKGJ1c051bT0wOyBidXNOdW08dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNOdW0rKykKKwkJCQlmb3IgKGJ1c051bT0wOyBidXNOdW08b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNOdW0rKykKIAkJCQl7CiAJICAgCQkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c051bSkKIAkJCQkJaWYgKHBlckJpdFJMUHVwU3RhdHVzW2ludGVyZmFjZUlkXVtidXNOdW1dICE9IEdUX1RSVUUpCkBAIC02ODQsMTEgKzY0MywxMSBAQAogCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICAgewogCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICBmb3IgKGJ1c051bT0wOyBidXNOdW08dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNOdW0rKykKKyAgICAgICAgZm9yIChidXNOdW09MDsgYnVzTnVtPG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzTnVtKyspCiAgICAgICAgIHsKIAkgICAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c051bSkKIAkJCWlmIChwZXJCaXRSTFB1cFN0YXR1c1tpbnRlcmZhY2VJZF1bYnVzTnVtXSA9PSBHVF9UUlVFKQotCQkJCW12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c051bSwgRERSX1BIWV9EQVRBLCBSTF9QSFlfUkVHICsgQ1NfUkVHX1ZBTFVFKGVmZmVjdGl2ZV9jcyksIGRhdGEyV3JpdGVbaW50ZXJmYWNlSWRdW2J1c051bV0pOworCQkJCW12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c051bSwgRERSX1BIWV9EQVRBLCBSTF9QSFlfUkVHICsgQ1NfQllURV9HQVAoZWZmZWN0aXZlX2NzKSwgZGF0YTJXcml0ZVtpbnRlcmZhY2VJZF1bYnVzTnVtXSk7CiAJCQllbHNlCiAJCQkJaXNBbnlQdXBGYWlsID0gR1RfVFJVRTsKIAkJfQpAQCAtNzQ3LDYgKzcwNiw3IEBACiB7CiAJR1RfVTMyIGFsbEJ1c0NzID0gMCwgc2FtZUJ1c0NzOwogCUdUX1UzMiBidXNDbnQ7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogCWRldk51bSA9IGRldk51bTsgLyogYXZvaWQgd2FybmluZ3MgKi8KIApAQCAtNzU4LDcgKzcxOCw3IEBACiAJICAgaWYgdGhleSBhcmUgdGhleSBhcmUgbm90IHRoZSBzYW1lIHRoZW4gaXQncyBtaXhlZCBtb2RlIHNvIGFsbCBDUyBzaG91bGQgYmUgY29uZmlndXJlZAogCSAgICh3aGVuIGNvbmZpZ3VyaW5nIHRoZSBNUlMpKi8KIAotCWZvciAoYnVzQ250PTA7IGJ1c0NudDx0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IGJ1c0NudCsrKQorCWZvciAoYnVzQ250PTA7IGJ1c0NudDxvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0NudCsrKQogCXsKIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzQ250KQogCkBAIC03ODEsNyArNzQxLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEdUX1NUQVRVUyAgICBkZHIzVGlwRHluYW1pY1dyaXRlTGV2ZWxpbmcoR1RfVTMyICAgIGRldk51bSkKIHsKLSAgICBHVF9VMzIgICByZWdEYXRhID0gMCwgaXRlciwgaW50ZXJmYWNlSWQsIGJ1c0NudDsKKyAgICBHVF9VMzIgICByZWdEYXRhID0gMCwgaXRlciwgaW50ZXJmYWNlSWQsIGJ1c0NudCwgdHJpZ2dlclJlZ0FkZHI7CiAJR1RfVTMyICAgY3NFbmFibGVSZWdWYWxbTUFYX0lOVEVSRkFDRV9OVU1dID0gezB9OwogICAgIEdUX1UzMiAgIGNzTWFza1tNQVhfSU5URVJGQUNFX05VTV07CiAgICAgR1RfVTMyICAgcmVhZERhdGFTYW1wbGVEZWxheVZhbHNbTUFYX0lOVEVSRkFDRV9OVU1dID0gezB9OwpAQCAtNzkyLDE0ICs3NTIsMTQgQEAKIAlHVF9VOCAgIFdMVmFsdWVzW05VTV9PRl9DU11bTUFYX0JVU19OVU1dW01BWF9JTlRFUkZBQ0VfTlVNXTsKIAlHVF9VMTYgKm1hc2tSZXN1bHRzUHVwUmVnTWFwID0gZGRyM1RpcEdldE1hc2tSZXN1bHRzUHVwUmVnTWFwKCk7CiAJR1RfVTMyIGNzTWFzazBbTUFYX0lOVEVSRkFDRV9OVU1dPXswfTsKLQlHVF9VMzIgbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoKTsKLSAgICAvKkRFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0lORk8sICgiPT09V1JJVEUgTEVWRUxJTkc9PT0iKSk7Ki8KKwlHVF9VMzIgbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoZGV2TnVtKTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgICB7CiAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCiAKLSAgICAgICAgdHJhaW5pbmdSZXN1bHRbdHJhaW5pbmdTdGFnZV1baW50ZXJmYWNlSWRdID0gVEVTVF9TVUNDRVNTOworCQl0cmFpbmluZ1Jlc3VsdFt0cmFpbmluZ1N0YWdlXVtpbnRlcmZhY2VJZF0gPSBURVNUX1NVQ0NFU1M7CiAKICAgICAgICAgLyogc2F2ZSBSZWFkIERhdGEgU2FtcGxlIERlbGF5ICovCiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgUkVBRF9EQVRBX1NBTVBMRV9ERUxBWSwgcmVhZERhdGFTYW1wbGVEZWxheVZhbHMsIE1BU0tfQUxMX0JJVFMpKTsKQEAgLTgwOCwxMCArNzY4LDExIEBACiAgICAgICAgIC8qIHNhdmUgY3VycmVudCBjcyByZWcgdmFsICovCiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQ1NfRU5BQkxFX1JFRywgY3NFbmFibGVSZWdWYWwsIE1BU0tfQUxMX0JJVFMpKTsKIAotI2lmICFkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSAmJiAhZGVmaW5lZChDT05GSUdfQUxMRVlDQVQzKSAgJiYgIWRlZmluZWQoQ09ORklHX0FSTUFEQV8zOVgpCi0gICAgICAgIC8qIGVuYWJsZSBtdWx0aSBjcyAqLwotICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBDU19FTkFCTEVfUkVHLCAwLCAoMSA8PCAzKSkpOwotI2VuZGlmCisJCWlmKGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWKSA8IE1WX1RJUF9SRVZfMykKKwkJeworCQkgICAgLyogZW5hYmxlIG11bHRpIGNzICovCisJCSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBDU19FTkFCTEVfUkVHLCAwLCAoMSA8PCAzKSkpOworCQl9CiAgICAgfQogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTg0OSwxNiArODEwLDE3IEBACiAJCQlkZHIzVGlwQ2FsY0NzTWFzayhkZXZOdW0sIGludGVyZmFjZUlkLCBlZmZlY3RpdmVfY3MsICZjc01hc2tbaW50ZXJmYWNlSWRdKTsKIAkJfQogCi0JI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKLQkJLypFbmFibGUgT3V0cHV0IGJ1ZmZlciB0byByZWxldmFudCBDUyAtIFEgb24gLCBXTCBvbiovCi0JCUNIRUNLX1NUQVRVUyhkZHIzVGlwV3JpdGVNUlNDbWQoZGV2TnVtLCBjc01hc2ssIE1SUzFfQ01ELCAweDgwLCAweDEwODApKTsKKwkJaWYoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpID49IE1WX1RJUF9SRVZfMykKKwkJeworCQkJLypFbmFibGUgT3V0cHV0IGJ1ZmZlciB0byByZWxldmFudCBDUyAtIFEgb24gLCBXTCBvbiovCisJCQlDSEVDS19TVEFUVVMoZGRyM1RpcFdyaXRlTVJTQ21kKGRldk51bSwgY3NNYXNrLCBNUlMxX0NNRCwgMHg4MCwgMHgxMDgwKSk7CiAKLQkJLyplbmFibGUgb2R0IGZvciByZWxldmFudCBDUyovCi0JCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgMHgxNDk4LCAoMHgzPDwoZWZmZWN0aXZlX2NzKjIpKSAsIDB4ZikpOwotCi0JI2Vsc2UKLQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBXcml0ZU1SU0NtZChkZXZOdW0sIGNzTWFzaywgTVJTMV9DTUQsIDB4QzAsIDB4MTJDNCkpOwotCSNlbmRpZgorCQkJLyplbmFibGUgb2R0IGZvciByZWxldmFudCBDUyovCisJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIDB4MTQ5OCwgKDB4Mzw8KGVmZmVjdGl2ZV9jcyoyKSkgLCAweGYpKTsKKwkJfQorCQllbHNlIHsKKwkJCUNIRUNLX1NUQVRVUyhkZHIzVGlwV3JpdGVNUlNDbWQoZGV2TnVtLCBjc01hc2ssIE1SUzFfQ01ELCAweEMwLCAweDEyQzQpKTsgLypGSVhNRSBzaG91bGQgYmUgc2FtZSBhcyBfQ1BVIGNhc2UqLworCQl9CiAKIAkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogICAgIFBoYXNlIDI6IFNldCB0cmFpbmluZyBJUCB0byB3cml0ZSBsZXZlbGluZyBtb2RlICAgICAgICAgICAgICAgICAgKi8KQEAgLTg2OCwxNCArODMwLDEyIEBACiAJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qICAgICBQaGFzZSAzOiBUcmlnZ2VyIHRyYWluaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKLQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHLCAweDEsIDB4MSkpOwotCSNlbHNlCi0JCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19UUkFJTklOR19TVEFUVVNfUkVHLCAweDEsIDB4MSkpOwotCSNlbmRpZgorCQl0cmlnZ2VyUmVnQWRkciA9IChkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPCBNVl9USVBfUkVWXzMpPyhPRFBHX1RSQUlOSU5HX1NUQVRVU19SRUcpOihPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHKTsKKwkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCB0cmlnZ2VyUmVnQWRkciwgMHgxLCAweDEpKTsKIAogCi0JI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKKwlpZihkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPj0gTVZfVElQX1JFVl8zKQorCXsKIAkgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8IE1BWF9JTlRFUkZBQ0VfTlVNOyBpbnRlcmZhY2VJZCsrKQogCQl7CiAJCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQpAQCAtODg1LDE5ICs4NDUsMjIgQEAKIAkJCXsKIAkJCQlERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJXTDogRERSMyBwb2xsICg0KSBmYWlsZWQgKERhdGE6IDB4JXgpXG4iLCByZWdEYXRhKSk7CiAJCQl9Ci0JI2lmICFkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSAvKkRpc2FibGVkLiBKSVJBICMxNDk4Ki8KIAkJCWVsc2UKIAkJCXsKLQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIE9EUEdfVFJBSU5JTkdfVFJJR0dFUl9SRUcsICZyZWdEYXRhLCAoMSA8PCAyKSkpOwotCQkJCWlmIChyZWdEYXRhICE9IDApCisgICAgICAgICAgICAgICAgI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIC8qIEpJUkEgIzE0OTggZm9yIDE2IGJpdCB3aXRoIEVDQyAqLworICAgICAgICAgICAgICAgIGlmKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrID09IDB4QikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKwkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIE9EUEdfVFJBSU5JTkdfVFJJR0dFUl9SRUcsIGRhdGFSZWFkLCAoMSA8PCAyKSkpOworCQkJCWlmIChkYXRhUmVhZFtpbnRlcmZhY2VJZF0gIT0gMCkKIAkJCQl7Ci0JCQkJCURFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIldMOiBXTCBmYWlsZWQgSUYgJWQgcmVnRGF0YT0weCV4XG4iLGludGVyZmFjZUlkLHJlZ0RhdGEpKTsKKwkJCQkJREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfRVJST1IsICgiV0wgMTogV0wgZmFpbGVkIElGICVkIHJlZ0RhdGE9MHgleFxuIixpbnRlcmZhY2VJZCxkYXRhUmVhZFtpbnRlcmZhY2VJZF0pKTsKIAkJCQl9CiAJCQl9Ci0JI2VuZGlmCiAJCX0KLQkjZW5kaWYKLQorCX0KIAkJZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKIAkJewogCQkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKQEAgLTkwOCwyNiArODcxLDMxIEBACiAJCQl9CiAJCQllbHNlCiAJCQl7Ci0JI2lmICFkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSAvKkRpc2FibGVkLiBKSVJBICMxNDk4Ki8KIAkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRywgZGF0YVJlYWQsICgxIDw8IDIpKSk7CiAJCQkJcmVnRGF0YSA9IGRhdGFSZWFkW2ludGVyZmFjZUlkXTsKKyAgICAgICAgICAgICAgICAjaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgLyogSklSQSAjMTQ5OCBmb3IgMTYgYml0IHdpdGggRUNDICovCisgICAgICAgICAgICAgICAgaWYodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2sgPT0gMHhCKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc2V0IGRhdGEgdG8gMCBpbiBvcmRlciB0byBza2lwIHRoZSBjaGVjayAqLworICAgICAgICAgICAgICAgICAgICByZWdEYXRhID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZGlmCiAJCQkJaWYgKHJlZ0RhdGEgIT0gMCkKIAkJCQl7Ci0JCQkJCURFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIldMOiBXTCBmYWlsZWQgSUYgJWQgcmVnRGF0YT0weCV4XG4iLGludGVyZmFjZUlkLHJlZ0RhdGEpKTsKKwkJCQkJREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfRVJST1IsICgiV0wgMjogIFdMIGZhaWxlZCBJRiAlZCByZWdEYXRhPTB4JXhcbiIsaW50ZXJmYWNlSWQscmVnRGF0YSkpOwogCQkJCX0KLQkjZW5kaWYKIAogCQkJCS8qIGNoZWNrIGZvciB0cmFpbmluZyBjb21wbGV0aW9uIHBlciBidXMgKi8KLQkJCQlmb3IgKGJ1c0NudD0wOyBidXNDbnQ8dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNDbnQrKykKKwkJCQlmb3IgKGJ1c0NudD0wOyBidXNDbnQ8b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNDbnQrKykKIAkJCQl7CiAgICAgICAgCQkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0NudCkKIAkJCQkJLyogdHJhaW5pbmcgc3RhdHVzICovCi0JCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgbWFza1Jlc3VsdHNQdXBSZWdNYXBbYnVzQ250XSwgZGF0YVJlYWQsICgxIDw8IDI1KSkpOworCQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIG1hc2tSZXN1bHRzUHVwUmVnTWFwW2J1c0NudF0sIGRhdGFSZWFkLCBNQVNLX0FMTF9CSVRTKSk7CiAgICAgCQkJCXJlZ0RhdGEgPSBkYXRhUmVhZFtpbnRlcmZhY2VJZF07CiAJCQkJCURFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJXTDogSUYgJWQgQlVTICVkIHJlZyAweCV4XG4iLCBpbnRlcmZhY2VJZCwgYnVzQ250LHJlZ0RhdGEpKTsKLQkJCQkJaWYgKHJlZ0RhdGEgPT0gMCkKKwkJCQkJaWYoKHJlZ0RhdGEgJiAoMSA8PCAyNSkpID09IDAgKQogCQkJCQl7Ci0JCQkJCQlyZXNWYWx1ZXNbKGludGVyZmFjZUlkICogdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlKSArIGJ1c0NudF0gPSBHVF9UUlVFOworCQkJCQkJcmVzVmFsdWVzWyhpbnRlcmZhY2VJZCAqIG9jdGV0c1BlckludGVyZmFjZU51bSkgKyBidXNDbnRdID0gR1RfVFJVRTsKIAkJCQkJfQogCQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIG1hc2tSZXN1bHRzUHVwUmVnTWFwW2J1c0NudF0sIGRhdGFSZWFkLCAweGZmKSk7CiAJCQkJCVdMVmFsdWVzW2VmZmVjdGl2ZV9jc11bYnVzQ250XVtpbnRlcmZhY2VJZF0gPSAoR1RfVTgpZGF0YVJlYWRbaW50ZXJmYWNlSWRdOyAvKiBzYXZlIHRoZSByZWFkIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHdyaXRlIHRvIFBIWSByZWdpc3RlciAqLwpAQCAtOTM2LDE3ICs5MDQsNDcgQEAKIAkJfQogCiAJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCS8qICAgICBQaGFzZSAzLjU6IFZhbGlkYXRlIHJlc3VsdCBwaGFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDwgTUFYX0lOVEVSRkFDRV9OVU07IGludGVyZmFjZUlkKyspCisJCXsKKwkJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCisJCQlmb3IgKGJ1c0NudD0wOyBidXNDbnQ8b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNDbnQrKyl7CisKKwkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNDbnQpCisJCQkJLypyZWFkIHJlc3VsdCBjb250cm9sIHJlZ2lzdGVyIGFjY29yZGluZyB0byBwdXAgKi8KKwkJCQlyZWdEYXRhID0gV0xWYWx1ZXNbZWZmZWN0aXZlX2NzXVtidXNDbnRdW2ludGVyZmFjZUlkXSArIDE2IDsvKjE2IGlzIGhhbGYgYSBwaGFzZSovCisJCQkJLyogd3JpdGUgaW50byB3cml0ZSBsZXZlbGluZyByZWdpc3RlciAoWzQ6MF0gQURMTCwgWzg6Nl0gUGhhc2UsIFsxNToxMF0gKGNlbnRyYWxpemF0aW9uKSBBRExMICsgMHgxMCkgKi8KKwkJCQlyZWdEYXRhID0gKHJlZ0RhdGEgJiAweDFmKSB8ICgoKHJlZ0RhdGEgJiAweEUwKSA+PiA1KSA8PCA2KSB8ICgoKHJlZ0RhdGEgJiAweDFmKSArIFBoeVJlZzFWYWwpIDw8IDEwKTsKKwkJCQltdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzQ250LCBERFJfUEhZX0RBVEEsCisJCQkJCQkJCQlXTF9QSFlfUkVHICsgMCpDU19SRUdJU1RFUl9BRERSX09GRlNFVCwgcmVnRGF0YSk7Lyp3ZSBhbHdheXMgd29yayB3aXRoIENTMCBzbyB0aGUgc2VhcmNoIGlzIHdpdGggV0wtQ1MwIHJlZ2lzdGVyIGluIHRoZSBwaHkqLworCisJCQkJLypDaGVjayBpZiBkYXRhIHJlYWQgZnJvbSBEUkFNIG5vdCBjaGFuZ2VkLCBpZiBzbyAtIGZpeCB0aGUgcmVzdWx0Ki8KKwkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIFRSQUlOSU5HX1dSSVRFX0xFVkVMSU5HX1JFRywKKwkJCQkJCQkJCWRhdGFSZWFkLCBNQVNLX0FMTF9CSVRTKSk7CisJCQkJaWYoKGRhdGFSZWFkW2ludGVyZmFjZUlkXSYoMTw8KDIwK2J1c0NudCkpKT4+KDIwK2J1c0NudCkgPT0gMCkKKwkJCQl7CisJCQkJCURFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIldMVmFsdWVzIHdhcyBjaGFuZ2VkIGZyb20gMHglWCIsIFdMVmFsdWVzW2VmZmVjdGl2ZV9jc11bYnVzQ250XVtpbnRlcmZhY2VJZF0pKTsKKwkJCQkJV0xWYWx1ZXNbZWZmZWN0aXZlX2NzXVtidXNDbnRdW2ludGVyZmFjZUlkXSA9IFdMVmFsdWVzW2VmZmVjdGl2ZV9jc11bYnVzQ250XVtpbnRlcmZhY2VJZF0gKyAzMjsKKwkJCQkJREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfRVJST1IsICgidG8gMHglWFxuIiwgV0xWYWx1ZXNbZWZmZWN0aXZlX2NzXVtidXNDbnRdW2ludGVyZmFjZUlkXSkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qICAgICBQaGFzZSA0OiBFeGl0IHdyaXRlIGxldmVsaW5nIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIGRpc2FibGUgRFFzIHRvZ2dsaW5nICovCiAJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgIFdSX0xFVkVMSU5HX0RRU19QQVRURVJOX1JFRywgMHgwLCAweDEpKTsKIAogCQkvKiBVcGRhdGUgTVJTIDEgKFdMIG9mZikgKi8KLQkjaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZChDT05GSUdfQUxMRVlDQVQzKSB8fCBkZWZpbmVkKENPTkZJR19BUk1BREFfMzlYKQotCQlDSEVDS19TVEFUVVMoZGRyM1RpcFdyaXRlTVJTQ21kKGRldk51bSwgY3NNYXNrMCwgTVJTMV9DTUQgLCAweDEwMDAsIDB4MTA4MCkpOyAgLy8gbmtsZWluIDI0LjEwLjEzCi0JI2Vsc2UKLQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBXcml0ZU1SU0NtZChkZXZOdW0sIGNzTWFzazAsIE1SUzFfQ01ELCAweDEwMDAsIDB4MTJDNCkpOwotCSNlbmRpZgorCQlpZihkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPj0gTVZfVElQX1JFVl8zKQorCQl7CisJCQlDSEVDS19TVEFUVVMoZGRyM1RpcFdyaXRlTVJTQ21kKGRldk51bSwgY3NNYXNrMCwgTVJTMV9DTUQgLCAweDEwMDAsIDB4MTA4MCkpOworCQl9CisJCWVsc2UgeworCQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBXcml0ZU1SU0NtZChkZXZOdW0sIGNzTWFzazAsIE1SUzFfQ01ELCAweDEwMDAsIDB4MTJDNCkpOyAvKkZJWE1FIHNob3VsZCBiZSBzYW1lIGFzIF9DUFUgY2FzZSovCisJCX0KIAogCQkvKiBVcGRhdGUgTVJTIDEgKHJldHVybiB0byBmdW5jdGlvbmFsIG1vZGUgLSBRIG9uICwgV0wgb2ZmKSAqLwogCQlDSEVDS19TVEFUVVMoZGRyM1RpcFdyaXRlTVJTQ21kKGRldk51bSwgY3NNYXNrMCwgTVJTMV9DTUQsIDB4MCwgMHgxMDgwKSk7CkBAIC05NjUsMTEgKzk2MywxMSBAQAogCQl7CiAJCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQogCQkJdGVzdFJlcyA9IDA7Ci0JCQlmb3IgKGJ1c0NudD0wOyBidXNDbnQ8dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNDbnQrKykKKwkJCWZvciAoYnVzQ250PTA7IGJ1c0NudDxvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0NudCsrKQogCQkJewogCQkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0NudCkKIAkJCQkvKiBjaGVjayBpZiByZXN1bHQgPT0gcGFzcyAqLwotCQkJCWlmIChyZXNWYWx1ZXNbKGludGVyZmFjZUlkICogdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlKSArIGJ1c0NudF0gPT0gMCkKKwkJCQlpZiAocmVzVmFsdWVzWyhpbnRlcmZhY2VJZCAqIG9jdGV0c1BlckludGVyZmFjZU51bSkgKyBidXNDbnRdID09IDApCiAJCQkJewogCQkJCQkvKnJlYWQgcmVzdWx0IGNvbnRyb2wgcmVnaXN0ZXIgYWNjb3JkaW5nIHRvIHB1cCAqLwogCQkJCQlyZWdEYXRhID0gV0xWYWx1ZXNbZWZmZWN0aXZlX2NzXVtidXNDbnRdW2ludGVyZmFjZUlkXTsKQEAgLTEwMTAsMTAgKzEwMDgsMTAgQEAKICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQ1NfRU5BQkxFX1JFRywgY3NFbmFibGVSZWdWYWxbaW50ZXJmYWNlSWRdLCBNQVNLX0FMTF9CSVRTKSk7CiAgICAgfQogCi0jaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZChDT05GSUdfQUxMRVlDQVQzKSB8fCBkZWZpbmVkKENPTkZJR19BUk1BREFfMzlYKQotCS8qZGlzYWJsZSBtb2R0MCBmb3IgQ1MwIHRyYWluaW5nIC0gbmVlZCB0byBhZGp1c3QgZm9yIG11bHR5IENTKi8KLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIDB4MTQ5OCwgMHgwICwgMHhmKSk7Ci0jZW5kaWYKKwlpZihkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPj0gTVZfVElQX1JFVl8zKXsKKwkJLypkaXNhYmxlIG1vZHQwIGZvciBDUzAgdHJhaW5pbmcgLSBuZWVkIHRvIGFkanVzdCBmb3IgbXVsdHkgQ1MqLworCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIDB4MTQ5OCwgMHgwICwgMHhmKSk7CisJfQogICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICAgewogICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQpAQCAtMTAzNSwyMCArMTAzMywxOSBAQAogICAgIEdUXzMyIGFkbGxPZmZzZXQ7CiAgICAgR1RfVTMyIGludGVyZmFjZUlkLCBidXNJZCwgZGF0YSwgZGF0YVRtcDsKICAgICBHVF9CT09MIGlzSWZGYWlsID0gR1RfRkFMU0U7Ci0KLSAgICAvKkRFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0lORk8sICgiPT09V1JJVEUgTEVWRUxJTkcgU1VQUExFTUVOVEFSWT09PSIpKTsqLworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKICAgICAgICAgaXNJZkZhaWwgPSBHVF9GQUxTRTsKLSAgICAgICAgZm9yKGJ1c0lkID0gMDsgYnVzSWQgPCBHRVRfVE9QT0xPR1lfTlVNX09GX0JVU0VTKGRldk51bSk7IGJ1c0lkKyspCisgICAgICAgIGZvcihidXNJZCA9IDA7IGJ1c0lkIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNJZCsrKQogICAgICAgICB7CiAgICAgICAgCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKICAgICAgICAgICAgIHdyaXRlU3VwcFJlc3VsdFRhYmxlW2ludGVyZmFjZUlkXVtidXNJZF0uaXNQdXBGYWlsID0gR1RfVFJVRTsKICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsIEREUl9QSFlfREFUQSwgV1JJVEVfQ0VOVFJBTElaQVRJT05fUEhZX1JFRyArIGVmZmVjdGl2ZV9jcypDU19SRUdJU1RFUl9BRERSX09GRlNFVCwgJmRhdGEpKTsKICAgICAgICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJXTCBTdXBwOiBhZGxsT2Zmc2V0PTAgZGF0YSBkZWxheSA9ICVkIFxuIiwgZGF0YSkpOwotICAgICAgICAgICAgaWYgKGRkcjNUaXBXbFN1cHBBbGlnblBoYXNlU2hpZnQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgYnVzSWQsIDAsIDApID09IEdUX09LKQorICAgICAgICAgICAgaWYgKGRkcjNUaXBXbFN1cHBBbGlnblBoYXNlU2hpZnQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgYnVzSWQpID09IEdUX09LKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJXTCBTdXBwOiBJRiAlZCBidXNJZCAlZCBhZGxsT2Zmc2V0PTAgU3VjY2VzcyAhXG4iLCBpbnRlcmZhY2VJZCwgYnVzSWQpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTEwNTksNyArMTA1Niw3IEBACiAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTUmVhZCggIGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCBERFJfUEhZX0RBVEEsIFdSSVRFX0NFTlRSQUxJWkFUSU9OX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MqQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQsICZkYXRhVG1wKSk7CiAgICAgICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiV0wgU3VwcDogYWRsbE9mZnNldD0gJWQgZGF0YSBkZWxheSA9ICVkIFxuIiwgYWRsbE9mZnNldCwgZGF0YVRtcCkpOwogCi0gICAgICAgICAgICBpZiAoZGRyM1RpcFdsU3VwcEFsaWduUGhhc2VTaGlmdChkZXZOdW0sIGludGVyZmFjZUlkLCBidXNJZCwgYWRsbE9mZnNldCwgMCkgPT0gR1RfT0spCisgICAgICAgICAgICBpZiAoZGRyM1RpcFdsU3VwcEFsaWduUGhhc2VTaGlmdChkZXZOdW0sIGludGVyZmFjZUlkLCBidXNJZCkgPT0gR1RfT0spCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoIldMIFN1cHA6IElGICVkIGJ1c0lkICVkIGFkbGxPZmZzZXQ9ICVkIFN1Y2Nlc3MgIVxuIiwgaW50ZXJmYWNlSWQsIGJ1c0lkLCBhZGxsT2Zmc2V0KSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xMDY5LDcgKzEwNjYsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsIEREUl9QSFlfREFUQSwgV1JJVEVfQ0VOVFJBTElaQVRJT05fUEhZX1JFRyArIGVmZmVjdGl2ZV9jcypDU19SRUdJU1RFUl9BRERSX09GRlNFVCwgZGF0YSArIGFkbGxPZmZzZXQpKTsKICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsIEREUl9QSFlfREFUQSwgV1JJVEVfQ0VOVFJBTElaQVRJT05fUEhZX1JFRyArIGVmZmVjdGl2ZV9jcypDU19SRUdJU1RFUl9BRERSX09GRlNFVCwgJmRhdGFUbXApKTsKICAgICAgICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJXTCBTdXBwOiBhZGxsT2Zmc2V0PSAlZCBkYXRhIGRlbGF5ID0gJWQgXG4iLCBhZGxsT2Zmc2V0LCBkYXRhVG1wKSk7Ci0gICAgICAgICAgICBpZiAoZGRyM1RpcFdsU3VwcEFsaWduUGhhc2VTaGlmdChkZXZOdW0sIGludGVyZmFjZUlkLCBidXNJZCwgYWRsbE9mZnNldCwgMCkgPT0gR1RfT0spCisgICAgICAgICAgICBpZiAoZGRyM1RpcFdsU3VwcEFsaWduUGhhc2VTaGlmdChkZXZOdW0sIGludGVyZmFjZUlkLCBidXNJZCkgPT0gR1RfT0spCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoIldMIFN1cHA6IElGICVkIGJ1c0lkICVkIGFkbGxPZmZzZXQ9ICVkIFN1Y2Nlc3MgIVxuIiwgaW50ZXJmYWNlSWQsIGJ1c0lkLCBhZGxsT2Zmc2V0KSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xMDgwLDExICsxMDc3LDEwIEBACiAgICAgICAgICAgICAgICAgaXNJZkZhaWwgPSBHVF9UUlVFOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJXTCBTdXBwOiBJRiAlZCBidXNJZCAlZCBpc1B1cEZhaWwgJWRcbiIsIGludGVyZmFjZUlkLCBidXNJZCwgaXNJZkZhaWwpKTsKIAogICAgICAgICBpZiAoaXNJZkZhaWwgPT0gR1RfVFJVRSkKICAgICAgICAgewotICAgICAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfRVJST1IsICAoIldMIFN1cHA6IElGICVkIGZhaWxlZFxuIiwgaW50ZXJmYWNlSWQpKTsKKyAgICAgICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAgKCJXTCBTdXBwIENTIyAlZDogSUYgJWQgZmFpbGVkXG4iLCBlZmZlY3RpdmVfY3MgLGludGVyZmFjZUlkKSk7CiAgICAgICAgICAgICB0cmFpbmluZ1Jlc3VsdFt0cmFpbmluZ1N0YWdlXVtpbnRlcmZhY2VJZF0gPSBURVNUX0ZBSUxFRDsKICAgICAgICAgfQogICAgICAgICBlbHNlCkBAIC0xMTA4LDQxICsxMTA0LDYwIEBACiBzdGF0aWMgR1RfU1RBVFVTICAgIGRkcjNUaXBXbFN1cHBBbGlnblBoYXNlU2hpZnQKICgKIAlHVF9VMzIgZGV2TnVtLAotCUdUX1UzMiBpbnRlcmZhY2VJZCwKLQlHVF9VMzIgYnVzSWQsCi0JR1RfVTMyICBvZmZzZXQsCi0JR1RfVTMyIGJ1c0lkRGVsdGEKKyAgICBHVF9VMzIgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyIGJ1c0lkCiApCiB7Ci0gICAgIHdyaXRlU3VwcFJlc3VsdFRhYmxlW2ludGVyZmFjZUlkXVtidXNJZF0uc3RhZ2UgPSBQSEFTRV9TSElGVDsKLSAgICAgaWYgKGRkcjNUaXBYc2JDb21wYXJlVGVzdChkZXZOdW0sIGludGVyZmFjZUlkLCBidXNJZCwgMCwgYnVzSWREZWx0YSkgPT0gR1RfT0spCi0gICAgewotICAgICAgICB3cml0ZVN1cHBSZXN1bHRUYWJsZVtpbnRlcmZhY2VJZF1bYnVzSWRdLmlzUHVwRmFpbCA9IEdUX0ZBTFNFOwotICAgICAgICByZXR1cm4gR1RfT0s7Ci0gICAgfQotICAgIC8qIDEgY2xvY2sgZXJyb3IgKi8KLSAgICBlbHNlIGlmIChkZHIzVGlwWHNiQ29tcGFyZVRlc3QoZGV2TnVtLCBpbnRlcmZhY2VJZCwgYnVzSWQsIE9ORV9DTE9DS19FUlJPUl9TSElGVCxidXNJZERlbHRhKSA9PSBHVF9PSykKLSAgICB7Ci0gICAgICAgIHdyaXRlU3VwcFJlc3VsdFRhYmxlW2ludGVyZmFjZUlkXVtidXNJZF0uc3RhZ2UgPSBDTE9DS19TSElGVDsKLSAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoIlN1cHA6IDEgZXJyb3IgY2xvY2sgZm9yIGlmICVkIHB1cCAlZCB3aXRoIG9mc3NldCAlZCBzdWNjZXNzXG4iLCBpbnRlcmZhY2VJZCwgYnVzSWQsIG9mZnNldCkpOwotICAgICAgICBkZHIzVGlwV2xTdXBwT25lQ2xrRXJyU2hpZnQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgYnVzSWQsIDApOwotICAgICAgICB3cml0ZVN1cHBSZXN1bHRUYWJsZVtpbnRlcmZhY2VJZF1bYnVzSWRdLmlzUHVwRmFpbCA9IEdUX0ZBTFNFOwotICAgICAgICByZXR1cm4gR1RfT0s7Ci0gICAgfQotICAgIC8qIGFsaWduIGVycm9yICovCi0gICAgZWxzZSBpZiAoZGRyM1RpcFhzYkNvbXBhcmVUZXN0KGRldk51bSwgaW50ZXJmYWNlSWQsIGJ1c0lkLCBBTElHTl9FUlJPUl9TSElGVCwgYnVzSWREZWx0YSkgPT0gR1RfT0spCi0gICAgewotICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiU3VwcDogYWxpZ24gZXJyb3IgZm9yIGlmICVkIHB1cCAlZCB3aXRoIG9mc3NldCAlZCBzdWNjZXNzXG4iLCBpbnRlcmZhY2VJZCwgYnVzSWQsIG9mZnNldCkpOwotICAgICAgICB3cml0ZVN1cHBSZXN1bHRUYWJsZVtpbnRlcmZhY2VJZF1bYnVzSWRdLnN0YWdlID0gQUxJR05fU0hJRlQ7Ci0gICAgICAgIGRkcjNUaXBXbFN1cHBBbGlnbkVyclNoaWZ0KGRldk51bSwgaW50ZXJmYWNlSWQsIGJ1c0lkLCAwKTsKLSAgICAgICAgd3JpdGVTdXBwUmVzdWx0VGFibGVbaW50ZXJmYWNlSWRdW2J1c0lkXS5pc1B1cEZhaWwgPSBHVF9GQUxTRTsKLSAgICAgICAgcmV0dXJuIEdUX09LOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB3cml0ZVN1cHBSZXN1bHRUYWJsZVtpbnRlcmZhY2VJZF1bYnVzSWRdLmlzUHVwRmFpbCA9IEdUX1RSVUU7Ci0gICAgICAgIHJldHVybiBHVF9GQUlMOwotICAgIH0KKwlHVF9VMzIgb3JpZ2luYWxQaGFzZTsKKyAgICBHVF9VMzIgZGF0YSwgd3JpdGVEYXRhOworCisgICAgd3JpdGVTdXBwUmVzdWx0VGFibGVbaW50ZXJmYWNlSWRdW2J1c0lkXS5zdGFnZSA9IFBIQVNFX1NISUZUOworCWlmKCBHVF9PSyA9PSBkZHIzVGlwWHNiQ29tcGFyZVRlc3QoZGV2TnVtLCBpbnRlcmZhY2VJZCwgYnVzSWQsIDApKQorCQlyZXR1cm4gR1RfT0s7CisKKwkvKlJlYWQgdGhlIGN1cnJlbnQgcGhhc2UgKi8KKyAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTUmVhZChkZXZOdW0sIGludGVyZmFjZUlkLCAgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsIEREUl9QSFlfREFUQSwgV0xfUEhZX1JFRyArIGVmZmVjdGl2ZV9jcypDU19SRUdJU1RFUl9BRERSX09GRlNFVCwgJmRhdGEpKTsKKwlvcmlnaW5hbFBoYXNlID0gZGF0YSA+PiA2ICYgMHg3OworCisJLyotLS0gc2V0IHBoYXNlKDB4MFs2LThdKSAtMiAgLS0tKi8KKwlpZiggb3JpZ2luYWxQaGFzZSA+PSAxKXsKKwkJaWYoIG9yaWdpbmFsUGhhc2UgPT0gMSkgd3JpdGVEYXRhID0gKGRhdGEgJiB+MHgxREYpOworCQllbHNlIHdyaXRlRGF0YSA9IChkYXRhICYgfjB4MUMwKSB8ICggKG9yaWdpbmFsUGhhc2UgLSAyKSA8PCA2KTsKKwkJbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsIEREUl9QSFlfREFUQSwgV0xfUEhZX1JFRyArIGVmZmVjdGl2ZV9jcypDU19SRUdJU1RFUl9BRERSX09GRlNFVCwgd3JpdGVEYXRhKTsKKworCQlDSEVDS19TVEFUVVMoZGRyM1RpcFhzYkNvbXBhcmVUZXN0KGRldk51bSwgaW50ZXJmYWNlSWQsIGJ1c0lkLCAtMiApKQorCX0KKworCS8qLS0tIHNldCBwaGFzZSgweDBbNi04XSkgKzIgIC0tLSovCisJaWYoIG9yaWdpbmFsUGhhc2UgPD0gNSl7CisJCXdyaXRlRGF0YSA9IChkYXRhICYgfjB4MUMwKSB8ICggKG9yaWdpbmFsUGhhc2UgKyAyKSA8PCA2KTsKKwkJbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsIEREUl9QSFlfREFUQSwgV0xfUEhZX1JFRyArIGVmZmVjdGl2ZV9jcypDU19SRUdJU1RFUl9BRERSX09GRlNFVCwgd3JpdGVEYXRhKTsKKworCQlDSEVDS19TVEFUVVMoZGRyM1RpcFhzYkNvbXBhcmVUZXN0KGRldk51bSwgaW50ZXJmYWNlSWQsIGJ1c0lkLCAyKSkKKwl9CisKKwkvKi0tLSBzZXQgcGhhc2UoMHgwWzYtOF0pICs0ICAtLS0qLworCWlmKCBvcmlnaW5hbFBoYXNlIDw9IDMpeworCQl3cml0ZURhdGEgPSAoZGF0YSAmIH4weDFDMCkgfCAoIChvcmlnaW5hbFBoYXNlICsgNCkgPDwgNik7CisJCW12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCBERFJfUEhZX0RBVEEsIFdMX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MqQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQsIHdyaXRlRGF0YSk7CisKKwkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBYc2JDb21wYXJlVGVzdChkZXZOdW0sIGludGVyZmFjZUlkLCBidXNJZCwgNCkpCisJfQorCisJLyotLS0gc2V0IHBoYXNlKDB4MFs2LThdKSArNiAgLS0tKi8KKwlpZiggb3JpZ2luYWxQaGFzZSA8PSAxKXsKKwkJd3JpdGVEYXRhID0gKGRhdGEgJiB+MHgxQzApIHwgKCAob3JpZ2luYWxQaGFzZSArIDYpIDw8IDYpOworCQltdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgRERSX1BIWV9EQVRBLCBXTF9QSFlfUkVHICsgZWZmZWN0aXZlX2NzKkNTX1JFR0lTVEVSX0FERFJfT0ZGU0VULCB3cml0ZURhdGEpOworCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwWHNiQ29tcGFyZVRlc3QoZGV2TnVtLCBpbnRlcmZhY2VJZCwgYnVzSWQsIDYpKQorCX0KKworCS8qTm90aGluZyBzdWNlc3MsIGdvIGFoZWFkKi8KKworCS8qV3JpdGUgb3JpZ2luYWwgV0wgcmVzdWx0IGJhY2sqLworCW12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCBERFJfUEhZX0RBVEEsIFdMX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MqQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQsIGRhdGEpOworCXdyaXRlU3VwcFJlc3VsdFRhYmxlW2ludGVyZmFjZUlkXVtidXNJZF0uaXNQdXBGYWlsID0gR1RfVFJVRTsKKwlyZXR1cm4gR1RfRkFJTDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTUwLDgyICsxMTY1LDg3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgR1RfU1RBVFVTICAgIGRkcjNUaXBYc2JDb21wYXJlVGVzdAogKAotCUdUX1UzMiBkZXZOdW0sCi0JR1RfVTMyIGludGVyZmFjZUlkLAotCUdUX1UzMiBidXNJZCwKLQlHVF9VMzIgIGVkZ2VPZmZzZXQsCi0JR1RfVTMyIGJ1c0lkRGVsdGEKKyAgICBHVF9VMzIgZGV2TnVtLAorICAgIEdUX1UzMiBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgYnVzSWQsCisgICAgR1RfOCBlZGdlT2Zmc2V0CiApCiB7Ci0gICAgR1RfVTMyIG51bU9mU3VjY0J5dGVDb21wYXJlLCB3b3JkSW5QYXR0ZXJuLCBhYnNPZmZzZXQ7Ci0gICAgR1RfVTMyIHdvcmRPZmZzZXQsaTsKKyAgICBHVF9VMzIgbnVtT2ZTdWNjQnl0ZUNvbXBhcmUsIHdvcmRJblBhdHRlcm47CisgICAgR1RfVTMyIHdvcmRPZmZzZXQsaSxudW1PZldvcmRNdWx0OwogICAgIEdUX1UzMiByZWFkUGF0dGVybltURVNUX1BBVFRFUk5fTEVOR1RIKjJdOwogCVBhdHRlcm5JbmZvICpwYXR0ZXJuVGFibGUgPSBkZHIzVGlwR2V0UGF0dGVyblRhYmxlKCk7CiAJR1RfVTMyIHBhdHRlcm5UZXN0UGF0dGVyblRhYmxlWzhdOwogCi0JZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgbnVtT2ZXb3JkTXVsdCA9ICh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzayA9PSAzIC8qSU5URVJGQUNFX0JVU19NQVNLXzE2QklUKi8pID8gMToyOyAKKworICAgIAlmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJcGF0dGVyblRlc3RQYXR0ZXJuVGFibGVbaV0gPSBwYXR0ZXJuVGFibGVHZXRXb3JkKGRldk51bSwgUEFUVEVSTl9URVNULCAoR1RfVTgpaSk7CiAJfQogCisKICAgICAvKiBleHRlcm4gd3JpdGUsIHRoYW4gcmVhZCBhbmQgY29tcGFyZSAqLwotICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwRXh0V3JpdGUoZGV2TnVtLCBpbnRlcmZhY2VJZCwgKHBhdHRlcm5UYWJsZVtQQVRURVJOX1RFU1RdLnN0YXJ0QWRkciArICgoU0RSQU1fQ1NfU0laRSArIDEpICAqIGVmZmVjdGl2ZV9jcykpLCAxLCBwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZSkpOworCUNIRUNLX1NUQVRVUyhkZHIzVGlwTG9hZFBhdHRlcm5Ub01lbShkZXZOdW0sIFBBVFRFUk5fVEVTVCkpOwkKIAogICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwUmVzZXRGaWZvUHRyKGRldk51bSkpOwogCi0gICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBFeHRSZWFkKGRldk51bSwgaW50ZXJmYWNlSWQsIChwYXR0ZXJuVGFibGVbUEFUVEVSTl9URVNUXS5zdGFydEFkZHIgKyAoKFNEUkFNX0NTX1NJWkUgKyAxKSAgKiBlZmZlY3RpdmVfY3MpKSwgMSwgcmVhZFBhdHRlcm4pKTsKKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEV4dFJlYWQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgKChwYXR0ZXJuVGFibGVbUEFUVEVSTl9URVNUXS5zdGFydEFkZHI8PDMpICsgKChTRFJBTV9DU19TSVpFICsgMSkgICogZWZmZWN0aXZlX2NzKSksIDEsIHJlYWRQYXR0ZXJuKSk7CiAKLSAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiWHNiQ29tcHQ6IElGICVkIGJ1c0lkICVkIDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleFxuIiwKKyAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiWHNiQ29tcHQgQ1MjJWQ6IElGICVkIGJ1c0lkICVkIDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleFxuIixlZmZlY3RpdmVfY3MsCiAJCQkJCQkJCQkJaW50ZXJmYWNlSWQsIGJ1c0lkLCByZWFkUGF0dGVyblswXSxyZWFkUGF0dGVyblsxXSxyZWFkUGF0dGVyblsyXSxyZWFkUGF0dGVyblszXSwKIAkJCQkJCQkJCQlyZWFkUGF0dGVybls0XSxyZWFkUGF0dGVybls1XSxyZWFkUGF0dGVybls2XSxyZWFkUGF0dGVybls3XSkpOwogICAgIC8qIGNvbXBhcmUgYnl0ZSBwZXIgcHVwICovCiAgICAgbnVtT2ZTdWNjQnl0ZUNvbXBhcmUgPSAwOwotICAgIGZvcih3b3JkSW5QYXR0ZXJuID0gc3RhcnRYc2JPZmZzZXQ7IHdvcmRJblBhdHRlcm4gPCAoVEVTVF9QQVRURVJOX0xFTkdUSCoyKSA7IHdvcmRJblBhdHRlcm4rKykKKyAgICBmb3Iod29yZEluUGF0dGVybiA9IHN0YXJ0WHNiT2Zmc2V0OyB3b3JkSW5QYXR0ZXJuIDwgKFRFU1RfUEFUVEVSTl9MRU5HVEgqbnVtT2ZXb3JkTXVsdCkgOyB3b3JkSW5QYXR0ZXJuKyspCiAgICAgewotICAgICAgICB3b3JkT2Zmc2V0ID0gd29yZEluUGF0dGVybiArIGVkZ2VPZmZzZXQ7Ci0gICAgICAgIGlmICgod29yZE9mZnNldCA+IChURVNUX1BBVFRFUk5fTEVOR1RIKjIgLSAxKSl8fCh3b3JkT2Zmc2V0IDwgMCkpCisgICAgICAgIHdvcmRPZmZzZXQgPSB3b3JkSW5QYXR0ZXJuOworICAgICAgICBpZiAod29yZE9mZnNldCA+IChURVNUX1BBVFRFUk5fTEVOR1RIKjIgLSAxKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBpZiAoKHJlYWRQYXR0ZXJuW3dvcmRJblBhdHRlcm5dICYgcHVwTWFza1RhYmxlW2J1c0lkXSkgPT0gKHBhdHRlcm5UZXN0UGF0dGVyblRhYmxlW3dvcmRPZmZzZXRdICYgcHVwTWFza1RhYmxlW2J1c0lkXSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIC8qREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoImRkcjNUaXBEeW5hbWljV3JpdGVMZXZlbGluZ1N1cHAgZXF1YWwgdG8gT2Zmc2V0IHBhdHRlcm4gISEgXG4iKSk7Ki8KKyAgICAgICAgICAgIC8qREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoImRkcjNUaXBEeW5hbWljV3JpdGVMZXZlbGluZ1N1cHAgZXF1YWwgdG8gT2Zzc2V0IHBhdHRlcm4gISEgXG4iKSk7Ki8KICAgICAgICAgICAgIG51bU9mU3VjY0J5dGVDb21wYXJlKys7CiAgICAgICAgIH0KICAgICB9Ci0gICAgYWJzT2Zmc2V0ID0gKGVkZ2VPZmZzZXQgPiAwKSA/IGVkZ2VPZmZzZXQgOiAtZWRnZU9mZnNldDsKLSAgICBpZiAobnVtT2ZTdWNjQnl0ZUNvbXBhcmUgPT0gKChURVNUX1BBVFRFUk5fTEVOR1RIKjIpIC0gYWJzT2Zmc2V0IC0gc3RhcnRYc2JPZmZzZXQpKQorICAgIGlmIChudW1PZlN1Y2NCeXRlQ29tcGFyZSA9PSAoKFRFU1RfUEFUVEVSTl9MRU5HVEgqbnVtT2ZXb3JkTXVsdCkgLSBzdGFydFhzYk9mZnNldCkpCiAgICAgewotICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiWHNiQ29tcHQ6IElGICVkIGJ1c0lkICVkIG51bU9mU3VjY0J5dGVDb21wYXJlICVkIC0gU3VjY2VzcyBcbiIsIGludGVyZmFjZUlkLCBidXNJZCwgbnVtT2ZTdWNjQnl0ZUNvbXBhcmUpKTsKKwkJd3JpdGVTdXBwUmVzdWx0VGFibGVbaW50ZXJmYWNlSWRdW2J1c0lkXS5zdGFnZSA9IGVkZ2VPZmZzZXQ7CisJCURFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCgic3VwcGxlbWVudGFyeTogc2hpZnQgdG8gJWQgZm9yIGlmICVkIHB1cCAlZCBzdWNjZXNzXG4iLAorCQkJCQkJCQkJCQllZGdlT2Zmc2V0LCBpbnRlcmZhY2VJZCwgYnVzSWQpKTsKKwkJd3JpdGVTdXBwUmVzdWx0VGFibGVbaW50ZXJmYWNlSWRdW2J1c0lkXS5pc1B1cEZhaWwgPSBHVF9GQUxTRTsKICAgICAgICAgcmV0dXJuIEdUX09LOwogICAgIH0KICAgICBlbHNlCiAgICAgewotCi0gICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJYc2JDb21wdDogSUYgJWQgYnVzSWQgJWQgbnVtT2ZTdWNjQnl0ZUNvbXBhcmUgJWQgLSBGYWlsICEgXG4iLCBpbnRlcmZhY2VJZCwgYnVzSWQsIG51bU9mU3VjY0J5dGVDb21wYXJlKSk7Ci0KLSAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoIlhzYkNvbXB0OiBleHBlY3RlZCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXhcbiIsIHBhdHRlcm5UZXN0UGF0dGVyblRhYmxlWzBdLHBhdHRlcm5UZXN0UGF0dGVyblRhYmxlWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVsyXSxwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVszXSxwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVs0XSxwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVs1XSxwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVs2XSxwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVs3XSkpOwotICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiWHNiQ29tcHQ6IHJlY2lldmVkIDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleFxuIiwgcmVhZFBhdHRlcm5bMF0scmVhZFBhdHRlcm5bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRQYXR0ZXJuWzJdLHJlYWRQYXR0ZXJuWzNdLHJlYWRQYXR0ZXJuWzRdLHJlYWRQYXR0ZXJuWzVdLHJlYWRQYXR0ZXJuWzZdLHJlYWRQYXR0ZXJuWzddKSk7Ci0KLSAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoIlhzYkNvbXB0OiBJRiAlZCBidXNJZCAlZCBudW1PZlN1Y2NCeXRlQ29tcGFyZSAlZCAtIEZhaWwgISBcbiIsIGludGVyZmFjZUlkLCBidXNJZCwgbnVtT2ZTdWNjQnl0ZUNvbXBhcmUpKTsKLQotCisgICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJYc2JDb21wdCBDUyMgJWQ6IElGICVkIGJ1c0lkICVkIG51bU9mU3VjY0J5dGVDb21wYXJlICVkIC0gRmFpbCAhIFxuIixlZmZlY3RpdmVfY3MsIAorCQkJCQkJCQkJCQlpbnRlcmZhY2VJZCwgYnVzSWQsIG51bU9mU3VjY0J5dGVDb21wYXJlKSk7CisgICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJYc2JDb21wdDogZXhwZWN0ZWQgMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4XG4iLCAKKwkJCQkJCQkJCQkJcGF0dGVyblRlc3RQYXR0ZXJuVGFibGVbMF0scGF0dGVyblRlc3RQYXR0ZXJuVGFibGVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5UZXN0UGF0dGVyblRhYmxlWzJdLHBhdHRlcm5UZXN0UGF0dGVyblRhYmxlWzNdLHBhdHRlcm5UZXN0UGF0dGVyblRhYmxlWzRdLAorCQkJCQkJCQkJCQlwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVs1XSxwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVs2XSxwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVs3XSkpOworICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiWHNiQ29tcHQ6IHJlY2VpdmVkIDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleFxuIiwgCisJCQkJCQkJCQkJCXJlYWRQYXR0ZXJuWzBdLHJlYWRQYXR0ZXJuWzFdLHJlYWRQYXR0ZXJuWzJdLHJlYWRQYXR0ZXJuWzNdLAorCQkJCQkJCQkJCQlyZWFkUGF0dGVybls0XSxyZWFkUGF0dGVybls1XSxyZWFkUGF0dGVybls2XSxyZWFkUGF0dGVybls3XSkpOworICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiWHNiQ29tcHQgQ1MjICVkOiBJRiAlZCBidXNJZCAlZCBudW1PZlN1Y2NCeXRlQ29tcGFyZSAlZCAtIEZhaWwgISBcbiIsIGVmZmVjdGl2ZV9jcywKKwkJCQkJCQkJCQkJaW50ZXJmYWNlSWQsIGJ1c0lkLCBudW1PZlN1Y2NCeXRlQ29tcGFyZSkpOwogICAgICAgICByZXR1cm4gR1RfRkFJTDsKICAgICB9CiB9CiAKKyNpZiAwIC8qIHJlbW92ZSB0aGlzIGlmIGl0J3Mgbm90IGluIHVzZSAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1DbG9jayBlcnJvciBzaGlmdCAtIGZ1bmN0aW9uIG1vdmVzIHRoZSB3cml0ZSBsZXZlbGluZyBkZWxheSAxY2MgZm9yd2FyZAorQ2xvY2sgZXJyb3Igc2hpZnQgLSBmdW5jdGlvbiBtb3ZlcyB0aGUgd3JpdGUgbGV2ZWxsaW5nIGRlbGF5IDFjYyBmb3J3YXJkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgR1RfU1RBVFVTICAgIGRkcjNUaXBXbFN1cHBPbmVDbGtFcnJTaGlmdAogKAotCUdUX1UzMiBkZXZOdW0sCi0JR1RfVTMyIGludGVyZmFjZUlkLAotCUdUX1UzMiBidXNJZCwKLQlHVF9VMzIgYnVzSWREZWx0YQorICAgIEdUX1UzMiBkZXZOdW0sCisgICAgR1RfVTMyIGludGVyZmFjZUlkLAorICAgIEdUX1UzMiBidXNJZAogKQogewogICAgIEdUXzMyIHBoYXNlLCAgYWRsbDsKICAgICBHVF9VMzIgZGF0YTsKKwogICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJPbmVDbGtFcnJTaGlmdFxuIikpOwogCiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoICAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCBERFJfUEhZX0RBVEEsIFdMX1BIWV9SRUcsICZkYXRhKSk7CkBAIC0xMjQ5LDcgKzEyNjksNyBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIC8qcGhhc2UgMyovCi0gICAgICAgIHJldHVybiBHVF9GQUlMOyAKKyAgICAgICAgcmV0dXJuIEdUX0ZBSUw7CiAgICAgfQogICAgIHJldHVybiBHVF9PSzsKIH0KQEAgLTEyNTksMTAgKzEyNzksOSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIEdUX1NUQVRVUyAgICBkZHIzVGlwV2xTdXBwQWxpZ25FcnJTaGlmdAogKAotCUdUX1UzMiBkZXZOdW0sCi0JR1RfVTMyIGludGVyZmFjZUlkLAotCUdUX1UzMiBidXNJZCwKLQlHVF9VMzIgYnVzSWREZWx0YQorICAgIEdUX1UzMiBkZXZOdW0sCisgICAgR1RfVTMyIGludGVyZmFjZUlkLAorICAgIEdUX1UzMiBidXNJZAogKQogewogICAgIEdUXzMyIHBoYXNlLCBhZGxsOwpAQCAtMTI4OCw3ICsxMzA3LDYgQEAKICAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJ1c1JlYWRNb2RpZnlXcml0ZShkZXZOdW0sICBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgIGJ1c0lkLCBERFJfUEhZX0RBVEEsICAxLCAgZGF0YSAsIDB4MWYpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gR1RfT0s7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKQEAgLTEzMTAsNiArMTMyOCw3IEBACiAgICAgfQogICAgIHJldHVybiBHVF9PSzsKIH0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIER5bmFtaWMgd3JpdGUgbGV2ZWxpbmcgc2VxdWVuY2UKQEAgLTEzMTksNiArMTMzOCw3IEBACiAgICAgR1RfVTMyIGJ1c0lkLCBkcUlkOwogCUdUX1UxNiAqbWFza1Jlc3VsdHNQdXBSZWdNYXAgPSBkZHIzVGlwR2V0TWFza1Jlc3VsdHNQdXBSZWdNYXAoKTsKIAlHVF9VMTYgKm1hc2tSZXN1bHRzRHFSZWdNYXAgCT0gZGRyM1RpcEdldE1hc2tSZXN1bHRzRHFSZWcoKTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAgVFJBSU5JTkdfU1dfMl9SRUcsIDB4MSwgICAgICAweDUpKTsKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsICBUUkFJTklOR19XUklURV9MRVZFTElOR19SRUcsICAweDUwLCAgICAgMHhGRikpOwpAQCAtMTMzNiwxMyArMTM1NiwxMyBAQAogICAgIH0KIAogCS8qTWFzayBhbGwgcmVzdWx0cyovCi0gICAgZm9yIChidXNJZD0wOyBidXNJZCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgYnVzSWQrKykKKyAgICBmb3IgKGJ1c0lkPTA7IGJ1c0lkIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNJZCsrKQogICAgIHsKICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAgbWFza1Jlc3VsdHNQdXBSZWdNYXBbYnVzSWRdLCAweDE8PDI0LCAweDE8PDI0KSk7CiAgICAgfQogCiAJLypVbm1hc2sgb25seSB3YW50ZWQqLwotICAgIGZvciAoYnVzSWQ9MDsgYnVzSWQgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IGJ1c0lkKyspCisgICAgZm9yIChidXNJZD0wOyBidXNJZCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzSWQrKykKICAgICB7CiAgICAgICAgCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0lkKQogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsICBtYXNrUmVzdWx0c1B1cFJlZ01hcFtidXNJZF0sIDAsIDB4MTw8MjQpKTsKQEAgLTEzNjIsNiArMTM4Miw3IEBACiAgICAgR1RfVTMyIGJ1c0lkLCBkcUlkOwogCUdUX1UxNiAqbWFza1Jlc3VsdHNQdXBSZWdNYXAgPSBkZHIzVGlwR2V0TWFza1Jlc3VsdHNQdXBSZWdNYXAoKTsKIAlHVF9VMTYgKm1hc2tSZXN1bHRzRHFSZWdNYXAgCT0gZGRyM1RpcEdldE1hc2tSZXN1bHRzRHFSZWcoKTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgLyogbWFzayBQQlMgKi8KICAgICBmb3IgKGRxSWQ9MDsgZHFJZDxNQVhfRFFfTlVNOyBkcUlkKyspCkBAIC0xMzcwLDEzICsxMzkxLDEzIEBACiAgICAgfQogCiAJLypNYXNrIGFsbCByZXN1bHRzKi8KLSAgICBmb3IgKGJ1c0lkPTA7IGJ1c0lkIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNJZCsrKQorICAgIGZvciAoYnVzSWQ9MDsgYnVzSWQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0lkKyspCiAgICAgewogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsICBtYXNrUmVzdWx0c1B1cFJlZ01hcFtidXNJZF0sIDB4MTw8MjQsIDB4MTw8MjQpKTsKICAgICB9CiAKIAkvKlVubWFzayBvbmx5IHdhbnRlZCovCi0gICAgZm9yIChidXNJZD0wOyBidXNJZDx0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IGJ1c0lkKyspCisgICAgZm9yIChidXNJZD0wOyBidXNJZDxvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0lkKyspCiAgICAgewogICAgICAgIAlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAgbWFza1Jlc3VsdHNQdXBSZWdNYXBbYnVzSWRdLCAwLCAweDE8PDI0KSk7CkBAIC0xMzkzLDYgKzE0MTQsNyBAQAogICAgIEdUX1UzMiBidXNJZCwgZHFJZDsKIAlHVF9VMTYgKm1hc2tSZXN1bHRzUHVwUmVnTWFwID0gZGRyM1RpcEdldE1hc2tSZXN1bHRzUHVwUmVnTWFwKCk7CiAJR1RfVTE2ICptYXNrUmVzdWx0c0RxUmVnTWFwIAk9IGRkcjNUaXBHZXRNYXNrUmVzdWx0c0RxUmVnKCk7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIC8qIG1hc2sgUEJTICovCiAgICAgZm9yIChkcUlkPTA7IGRxSWQ8TUFYX0RRX05VTTsgZHFJZCsrKQpAQCAtMTQwMSw3ICsxNDIzLDcgQEAKICAgICB9CiAKIAkvKk1hc2sgYWxsIHJlc3VsdHMqLwotICAgIGZvciAoYnVzSWQ9MDsgYnVzSWQgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IGJ1c0lkKyspCisgICAgZm9yIChidXNJZD0wOyBidXNJZCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzSWQrKykKICAgICB7CiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgIG1hc2tSZXN1bHRzUHVwUmVnTWFwW2J1c0lkXSwgMHgxPDwyNCwgMHgxPDwyNCkpOwogICAgIH0KQEAgLTE0MjIsNiArMTQ0NCw3IEBACiBHVF9CT09MIGRkcjNUaXBQcmludFdMU3VwcFJlc3VsdChHVF9VMzIgZGV2TnVtKQogewogICAgIEdUX1UzMiBidXNJZCA9IDAsaW50ZXJmYWNlSWQgPSAwOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9JTkZPLCgiSS9GMCBQVVAwIFJlc3VsdFswIC0gc3VjY2VzcywgMS1mYWlsXSAuLi5cbiIpKTsKIApAQCAtMTQzMCw3ICsxNDUzLDcgQEAKICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgIGZvcihidXNJZD0wOyBidXNJZDx0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IGJ1c0lkKyspCisgICAgICAgICBmb3IoYnVzSWQ9MDsgYnVzSWQ8b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNJZCsrKQogICAgICAgICB7CiAJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKICAgICAgICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0lORk8sKCIlZCAsIiwgd3JpdGVTdXBwUmVzdWx0VGFibGVbaW50ZXJmYWNlSWRdW2J1c0lkXS5pc1B1cEZhaWwpKTsKQEAgLTE0NDAsNyArMTQ2Myw3IEBACiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgICB7CiAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0gICAgICAgICBmb3IoYnVzSWQ9MDsgYnVzSWQ8dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNJZCsrKQorICAgICAgICAgZm9yKGJ1c0lkPTA7IGJ1c0lkPG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzSWQrKykKICAgICAgICAgewogCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSWQpCiAgICAgICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9JTkZPLCgiJWQgLCIsIHdyaXRlU3VwcFJlc3VsdFRhYmxlW2ludGVyZmFjZUlkXVtidXNJZF0uc3RhZ2UpKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdQYnMuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdQYnMuYwppbmRleCBjNGI1NWRlLi43YmU2ZjA1IDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nUGJzLmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ1Bicy5jCkBAIC01MiwxMiArNTIsMTIgQEAKIEdUX1U4IE1pblBCU1BlclB1cFtNQVhfSU5URVJGQUNFX05VTV1bTUFYX0JVU19OVU1dOwogR1RfVTggTWF4QURMTFBlclB1cFtNQVhfSU5URVJGQUNFX05VTV1bTUFYX0JVU19OVU1dOwogR1RfVTggTWluQURMTFBlclB1cFtNQVhfSU5URVJGQUNFX05VTV1bTUFYX0JVU19OVU1dOwotR1RfVTMyIHBic2RlbGF5UGVyUHVwW05VTV9PRl9QQlNfTU9ERVNdW01BWF9JTlRFUkZBQ0VfTlVNXVtNQVhfQlVTX05VTV07CitHVF9VOCBwYnNEZWxheVBlclB1cFtOVU1fT0ZfUEJTX01PREVTXVtNQVhfSU5URVJGQUNFX05VTV1bTUFYX0JVU19OVU1dW01BWF9DU19OVU1dOwogR1RfVTggQURMTF9TSElGVF9Mb2NrW01BWF9JTlRFUkZBQ0VfTlVNXVtNQVhfQlVTX05VTV0gOwogR1RfVTggQURMTF9TSElGVF92YWxbTUFYX0lOVEVSRkFDRV9OVU1dW01BWF9CVVNfTlVNXSA7CiBNVl9IV1NfUEFUVEVSTiBwYnNQYXR0ZXJuID0gUEFUVEVSTl9WUkVGOwogCi1leHRlcm4gR1RfVTMyIG12SHdzRGRyM1RpcE1heENTR2V0KHZvaWQpOworZXh0ZXJuIEdUX1UzMiBtdkh3c0RkcjNUaXBNYXhDU0dldChHVF9VMzIgZGV2TnVtKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBwcmUgZGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiBNVl9IV1NfVE9QT0xPR1lfTUFQICp0b3BvbG9neU1hcDsKIGV4dGVybiBHVF9VMzIgbWFza1Jlc3VsdHNEcVJlZ01hcFtdOwpAQCAtMTE1LDYgKzExNSw3IEBACiAgICAgR1RfVTMyICAgY3NFbmFibGVSZWdWYWxbTUFYX0lOVEVSRkFDRV9OVU1dOwogICAgIEdUX1UxNiAqbWFza1Jlc3VsdHNEcVJlZ01hcCAJPSBkZHIzVGlwR2V0TWFza1Jlc3VsdHNEcVJlZygpOwogICAgIEdUX1U4IHRlbXAgPSAwOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICAvKiBzYXZlIGN1cnJlbnQgY3MgZW5hYmxlIHJlZyB2YWwgKi8KICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQpAQCAtMTI3LDcgKzEyOCw3IEBACiAgICAgfQogCiAgICAgcmVnQWRkciA9IChwYnNNb2RlID09IFBCU19SWF9NT0RFICkgPyAoUkVBRF9DRU5UUkFMSVpBVElPTl9QSFlfUkVHICsgKGVmZmVjdGl2ZV9jcyAqIENTX1JFR0lTVEVSX0FERFJfT0ZGU0VUKSkgOiAoV1JJVEVfQ0VOVFJBTElaQVRJT05fUEhZX1JFRyArIChlZmZlY3RpdmVfY3MgKiBDU19SRUdJU1RFUl9BRERSX09GRlNFVCkpOwotICAgIHJlYWRBZGxsVmFsdWUobm9taW5hbEFkbGwsIHJlZ0FkZHIgLCBNQVNLX0FMTF9CSVRTICk7CisgICAgbXZId3NEZHIzVGlwUmVhZEFkbGxWYWx1ZShkZXZOdW0sbm9taW5hbEFkbGwsIHJlZ0FkZHIsIE1BU0tfQUxMX0JJVFMgKTsKICAgICAvKiBzdGFnZSAxIHNoaWZ0IEFETEwgKi8KICAgICAvKmRkcjNUaXBJcFRyYWluaW5nUGVyYml0TXVsdGlDYXN0KCBTZWFyY2hEaXJlY3Rpb24sIERpcmVjdGlvbiwgSW5pdFZhbHVlLCBOdW1iZXJPZkl0ZXJhdGlvbnMsIHBic1BhdHRlcm4sICBTZWFyY2hFREdFXyAsIE1WX0hXU19Db250cm9sRWxlbWVudF9BRExMKTsqLwogCkBAIC0xMzUsNyArMTM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hEaXJlY3Rpb24sIERpcmVjdGlvbiwgdG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIEluaXRWYWx1ZSwgTnVtYmVyT2ZJdGVyYXRpb25zLCBwYnNQYXR0ZXJuLCBTZWFyY2hFREdFXywgQ1NfU0lOR0xFLCBjc051bSwgdHJhaW5TdGF0dXMpOwogCiAgICAgdmFsaWRhdGlvblZhbCA9IChwYnNNb2RlID09IFBCU19SWF9NT0RFKSA/IDB4MWYgOiAwOwotCWZvciggcHVwID0gMCA7IHB1cCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IHB1cCsrKQorCWZvciggcHVwID0gMCA7IHB1cCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cCsrKQogCXsKIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQogCQlmb3IoIGludGVyZmFjZUlkID0gMCA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTEgOyBpbnRlcmZhY2VJZCsrKQpAQCAtMTQ5LDcgKzE1MCw3IEBACiAgICAgfQogCiAgICAgLyogRUJBICovCi0JZm9yKCBwdXAgPSAwIDsgcHVwIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwKyspCisJZm9yKCBwdXAgPSAwIDsgcHVwIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwKyspCiAJewogCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCiAJCWZvciggYml0ID0gMCA7IGJpdCA8IEJVU19XSURUSF9JTl9CSVRTIDsgYml0KyspCkBAIC0xOTAsNyArMTkxLDcgQEAKIAl9CiAKIAkvKiBFRUJBICovCi0JZm9yKCBwdXAgPSAwIDsgcHVwIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwKyspCisJZm9yKCBwdXAgPSAwIDsgcHVwIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwKyspCiAJewogCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCiAgICAgICAgIGZvciggaW50ZXJmYWNlSWQgPSAwIDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMSA7IGludGVyZmFjZUlkKyspCkBAIC0yNTUsNyArMjU2LDcgQEAKIAl9CiAKIAkvKiBQcmludCBTdGFnZSByZXN1bHQgKi8KLQlmb3IoIHB1cCA9IDAgOyBwdXAgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXArKykKKwlmb3IoIHB1cCA9IDAgOyBwdXAgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBwdXArKykKIAl7CiAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKICAgICAgICAgZm9yKCBpbnRlcmZhY2VJZCA9IDAgOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xIDsgaW50ZXJmYWNlSWQrKykKQEAgLTI2Niw3ICsyNjcsNyBAQAogCX0KIAogICAgIERFQlVHX1BCU19FTkdJTkUoREVCVUdfTEVWRUxfSU5GTywoIlVwZGF0ZSBBRExMIFNoaWZ0IG9mIGFsbCBwdXBzOlxuIikpOwotCWZvciggcHVwID0gMCA7IHB1cCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IHB1cCsrKQorCWZvciggcHVwID0gMCA7IHB1cCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cCsrKQogCXsKIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQogICAgICAgICBmb3IoIGludGVyZmFjZUlkID0gMCA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTEgOyBpbnRlcmZhY2VJZCsrKQpAQCAtMjgxLDcgKzI4Miw3IEBACiAKICAgICAvKiBQQlMgRUVCQSZFQkEgKi8KIAkvKiBTdGFydCB0aGUgUGVyIEJpdCBTa2V3IHNlYXJjaCAqLwotCWZvciggcHVwID0gMCA7IHB1cCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IHB1cCsrKQorCWZvciggcHVwID0gMCA7IHB1cCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cCsrKQogCXsKIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQogICAgICAgICBmb3IoIGludGVyZmFjZUlkID0gMCA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTEgOyBpbnRlcmZhY2VJZCsrKQpAQCAtMzA1LDcgKzMwNiw3IEBACiAgICAgZGRyM1RpcElwVHJhaW5pbmcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBSRVNVTFRfUEVSX0JJVCwgTVZfSFdTX0NvbnRyb2xFbGVtZW50X0RRX1NLRVcsCiAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoRGlyZWN0aW9uLCBEaXJlY3Rpb24sIHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBJbml0VmFsdWUsIE51bWJlck9mSXRlcmF0aW9ucywgcGJzUGF0dGVybiwgU2VhcmNoRURHRV8sIENTX1NJTkdMRSwgY3NOdW0sIHRyYWluU3RhdHVzKTsKIAkKLSAJZm9yKCBwdXAgPSAwIDsgcHVwIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwKyspCisgCWZvciggcHVwID0gMCA7IHB1cCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cCsrKQogCXsKIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQogICAgICAgICBmb3IoIGludGVyZmFjZUlkID0gMCA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTEgOyBpbnRlcmZhY2VJZCsrKQpAQCAtMzQyLDcgKzM0Myw3IEBACiAKICAgICAvKiBDaGVjayBhbGwgUHVwIGxvY2sgKi8KIAlBbGxMb2NrID0gMTsKLQlmb3IoIHB1cCA9IDAgOyBwdXAgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXArKykKKwlmb3IoIHB1cCA9IDAgOyBwdXAgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBwdXArKykKIAl7CiAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKICAgICAgICAgZm9yKCBpbnRlcmZhY2VJZCA9IDAgOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xIDsgaW50ZXJmYWNlSWQrKykKQEAgLTM1OSw3ICszNjAsNyBAQAogCQkvKiBBRExMIHNoaWZ0IGZvciBTQkEgKi8KIAkJU2VhcmNoRGlyZWN0aW9uID0gKHBic01vZGUgPT0gUEJTX1JYX01PREUpID8gTVZfSFdTX0xvdzJIaWdoIDogTVZfSFdTX0hpZ2gyTG93OyAKIAkJSW5pdFZhbHVlID0gKFNlYXJjaERpcmVjdGlvbiA9PSBNVl9IV1NfTG93MkhpZ2gpPzA6TnVtYmVyT2ZJdGVyYXRpb25zOwotCQlmb3IoIHB1cCA9IDAgOyBwdXAgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXArKykKKwkJZm9yKCBwdXAgPSAwIDsgcHVwIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwKyspCiAJCXsKIAkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKICAgICAgICAgICAgIGZvciggaW50ZXJmYWNlSWQgPSAwIDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMSA7IGludGVyZmFjZUlkKyspCkBAIC00MjIsNyArNDIzLDcgQEAKIAkgICAgZGRyM1RpcElwVHJhaW5pbmcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBSRVNVTFRfUEVSX0JJVCwgTVZfSFdTX0NvbnRyb2xFbGVtZW50X0RRX1NLRVcsCiAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoRGlyZWN0aW9uLCBEaXJlY3Rpb24sIHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBJbml0VmFsdWUsIE51bWJlck9mSXRlcmF0aW9ucywgcGJzUGF0dGVybiwgU2VhcmNoRURHRV8sIENTX1NJTkdMRSwgY3NOdW0sIHRyYWluU3RhdHVzKTsKIAotCQlmb3IoIHB1cCA9IDAgOyBwdXAgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXArKykKKwkJZm9yKCBwdXAgPSAwIDsgcHVwIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwKyspCiAJCXsKIAkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKICAgICAgICAgICAgIGZvciggaW50ZXJmYWNlSWQgPSAwIDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMSA7IGludGVyZmFjZUlkKyspCkBAIC00NTYsMTQgKzQ1NywxNCBAQAogCQl9CiAJCS8qIENoZWNrIGFsbCBQdXAgc3RhdGUgKi8KIAkJQWxsTG9jayA9IDE7Ci0JCWZvciggcHVwID0gMCA7IHB1cCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IHB1cCsrKQorCQlmb3IoIHB1cCA9IDAgOyBwdXAgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBwdXArKykKIAkJewogICAgICAgICAgIC8qICBERUJVR19QQlNfRU5HSU5FKERFQlVHX0xFVkVMX0lORk8sKCJQdXBTdGF0ZVslZF1bJWRdID0gJWRcbiIsaW50ZXJmYWNlSWQscHVwLFB1cFN0YXRlW2ludGVyZmFjZUlkXVtwdXBdKSk7ICovCiAJCX0KIAl9CiAJLyogRU5EIE9GIFNCQSAqLwogICAgIC8qIE5vcm0gKi8KLQlmb3IoIHB1cCA9IDAgOyBwdXAgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXArKykKKwlmb3IoIHB1cCA9IDAgOyBwdXAgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBwdXArKykKIAl7CiAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKIAkJZm9yKCBiaXQgPSAwIDsgYml0IDwgQlVTX1dJRFRIX0lOX0JJVFMgOyBiaXQrKykKQEAgLTUwMiw3ICs1MDMsNyBAQAogICAgIGZvciggaW50ZXJmYWNlSWQgPSAwIDsgaW50ZXJmYWNlSWQgPCBNQVhfSU5URVJGQUNFX05VTSA7IGludGVyZmFjZUlkKyspCiAgICAgewogICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotCQlmb3IoIHB1cCA9IDAgOyBwdXAgPCAgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwKyspCisJCWZvciggcHVwID0gMCA7IHB1cCA8ICBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBwdXArKykKIAkJewogCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQogCQkJLyppZihBRExMX1NISUZUX0xvY2tbaW50ZXJmYWNlSWRdW3B1cF0gIT0gMSkgeyBjb250aW51ZTt9Ki8gLyogaWYgcHVwIG5vdCBsb2NrIGNvbnRpbnVlIHRvIG5leHQgcHVwICovCkBAIC01MTIsMTUgKzUxMywyMCBAQAogCQkJewogCQkJCSBpZiAoZHFNYXBUYWJsZSA9PSBOVUxMKQogCQkJCSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BCU19FTkdJTkUoREVCVUdfTEVWRUxfRVJST1IsKCJkcU1hcFRhYmxlIG5vdCBpbml0aWFsaXphZWRcbiIpKTsKKwkJCQkJREVCVUdfUEJTX0VOR0lORShERUJVR19MRVZFTF9FUlJPUiwoImRxTWFwVGFibGUgbm90IGluaXRpYWxpemFlZFxuIikpOwogCQkJCQlyZXR1cm4gR1RfRkFJTDsKIAkJCQkgfQotCQkJCSBQYWROdW0gPSBkcU1hcFRhYmxlW2JpdCtwdXAqQlVTX1dJRFRIX0lOX0JJVFMgKyBpbnRlcmZhY2VJZCpCVVNfV0lEVEhfSU5fQklUUyp0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2VdOwotICAgICAgICAgICAgICAgICBERUJVR19QQlNfRU5HSU5FKERFQlVHX0xFVkVMX0lORk8sKCJSZXN1bHRfTUFUOiAlZCAiICxSZXN1bHRfTUFUW2ludGVyZmFjZUlkXVtwdXBdW2JpdF0pKTsKLSAgICAgICAgICAgICAgICAgcmVnQWRkciA9IChwYnNNb2RlID09IFBCU19SWF9NT0RFKSA/IChQQlNfUlhfUEhZX1JFRyArIGVmZmVjdGl2ZV9jcyAqIDB4MTApIDogKFBCU19UWF9QSFlfUkVHICsgZWZmZWN0aXZlX2NzICogMHgxMCk7Ci0gICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sICBBQ0NFU1NfVFlQRV9VTklDQVNULCAgIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCAgcHVwLCBERFJfUEhZX0RBVEEsIHJlZ0FkZHIrUGFkTnVtLCBSZXN1bHRfTUFUW2ludGVyZmFjZUlkXVtwdXBdW2JpdF0pKTsKKwkJCQlQYWROdW0gPSBkcU1hcFRhYmxlW2JpdCtwdXAqQlVTX1dJRFRIX0lOX0JJVFMgKyBpbnRlcmZhY2VJZCpCVVNfV0lEVEhfSU5fQklUUypvY3RldHNQZXJJbnRlcmZhY2VOdW1dOworCQkJCURFQlVHX1BCU19FTkdJTkUoREVCVUdfTEVWRUxfSU5GTywoIlJlc3VsdF9NQVQ6ICVkICIgLFJlc3VsdF9NQVRbaW50ZXJmYWNlSWRdW3B1cF1bYml0XSkpOworCQkJCXJlZ0FkZHIgPSAocGJzTW9kZSA9PSBQQlNfUlhfTU9ERSkgPyAoUEJTX1JYX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MgKiAweDEwKSA6IChQQlNfVFhfUEhZX1JFRyArIGVmZmVjdGl2ZV9jcyAqIDB4MTApOworCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sICBBQ0NFU1NfVFlQRV9VTklDQVNULCAgIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCAgcHVwLCBERFJfUEhZX0RBVEEsIHJlZ0FkZHIrUGFkTnVtLCBSZXN1bHRfTUFUW2ludGVyZmFjZUlkXVtwdXBdW2JpdF0pKTsKIAkJCX0KLQkJCXBic2RlbGF5UGVyUHVwW3Bic01vZGVdW2ludGVyZmFjZUlkXVtwdXBdID0gKE1heFBCU1BlclB1cFtpbnRlcmZhY2VJZF1bcHVwXSA9PSBNaW5QQlNQZXJQdXBbaW50ZXJmYWNlSWRdW3B1cF0pP1RZUElDQUxfUEJTX1ZBTFVFIDooKE1heEFETExQZXJQdXBbaW50ZXJmYWNlSWRdW3B1cF0gLSBNaW5BRExMUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdKSpBRExMVGFwLyhNYXhQQlNQZXJQdXBbaW50ZXJmYWNlSWRdW3B1cF0gLSBNaW5QQlNQZXJQdXBbaW50ZXJmYWNlSWRdW3B1cF0pKTsKKworICAgICAgICAgICAgdGVtcCA9IChNYXhQQlNQZXJQdXBbaW50ZXJmYWNlSWRdW3B1cF0gPT0gTWluUEJTUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdKSA/XAorICAgICAgICAgICAgICAgIFRZUElDQUxfUEJTX1ZBTFVFIDpcCisgICAgICAgICAgICAgICAgKChNYXhBRExMUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdIC0gTWluQURMTFBlclB1cFtpbnRlcmZhY2VJZF1bcHVwXSkgKiAoR1RfVTgpQURMTFRhcCAvIChNYXhQQlNQZXJQdXBbaW50ZXJmYWNlSWRdW3B1cF0gLSBNaW5QQlNQZXJQdXBbaW50ZXJmYWNlSWRdW3B1cF0pKTsKKworCQkJcGJzRGVsYXlQZXJQdXBbcGJzTW9kZV1baW50ZXJmYWNlSWRdW3B1cF1bZWZmZWN0aXZlX2NzXSA9IHRlbXA7CiAKIAkJCWlmKCBwYnNNb2RlID09IFBCU19UWF9NT0RFICl7IC8qUlggcmVzdWx0cyByZWFkeSwgd3JpdGUgUlggYWxzbyovCiAJCQkJLypXcml0ZSBUWCByZXN1bHRzKi8KQEAgLTU0MCwxMyArNTQ2LDEyIEBACiAJCQkJUmVzdWx0X01BVF9SWF9EUVNbaW50ZXJmYWNlSWRdW3B1cF1bZWZmZWN0aXZlX2NzXSA9IChNYXhQQlNQZXJQdXBbaW50ZXJmYWNlSWRdW3B1cF0gLSBNaW5QQlNQZXJQdXBbaW50ZXJmYWNlSWRdW3B1cF0pLzI7CiAJCQl9CiAKLSAgICAgICAgICAgIERFQlVHX1BCU19FTkdJTkUoREVCVUdfTEVWRUxfSU5GTywoIiwgUEJTIHRhcD0lZCBbcHNlY10gPT0+IHNrZXcgb2JzZXJ2ZWQgPSAlZFxuIiwgcGJzZGVsYXlQZXJQdXBbcGJzTW9kZV1baW50ZXJmYWNlSWRdW3B1cF0sICgoTWF4UEJTUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdIC0gTWluUEJTUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdKSpwYnNkZWxheVBlclB1cFtwYnNNb2RlXVtpbnRlcmZhY2VJZF1bcHVwXSkpKTsKKwkJCURFQlVHX1BCU19FTkdJTkUoREVCVUdfTEVWRUxfSU5GTywoIiwgUEJTIHRhcD0lZCBbcHNlY10gPT0+IHNrZXcgb2JzZXJ2ZWQgPSAlZFxuIiwgdGVtcCwgKChNYXhQQlNQZXJQdXBbaW50ZXJmYWNlSWRdW3B1cF0gLSBNaW5QQlNQZXJQdXBbaW50ZXJmYWNlSWRdW3B1cF0pKnRlbXApKSk7CiAJCX0KLQl9Ci0KKyAgICB9CiAgICAgLypXcml0ZSBiYWNrIHRvIHRoZSBwaHkgdGhlIGRlZmF1bHQgdmFsdWVzICovCiAgICAgcmVnQWRkciA9IChwYnNNb2RlID09IFBCU19SWF9NT0RFKSA/IChSRUFEX0NFTlRSQUxJWkFUSU9OX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MgKiA0KSA6IChXUklURV9DRU5UUkFMSVpBVElPTl9QSFlfUkVHICsgZWZmZWN0aXZlX2NzICogNCk7Ci0Jd3JpdGVBZGxsVmFsdWUobm9taW5hbEFkbGwsIHJlZ0FkZHIpOworCW12SHdzRGRyM1RpcFdyaXRlQWRsbFZhbHVlKGRldk51bSxub21pbmFsQWRsbCwgcmVnQWRkcik7CiAKIAogICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKQEAgLTU2MiwxNyArNTY3LDIxIEBACiAKICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICB7Ci0gICAgICAvKiBpZiAodHJhaW5pbmdSZXN1bHRbdHJhaW5pbmdTdGFnZV1baW50ZXJmYWNlSWRdID09IFRFU1RfRkFJTEVEKSAqLwotCSAgaWYgKCBQdXBTdGF0ZVtpbnRlcmZhY2VJZF1bcHVwXSA9PSAxKSAvKiBtZWFuaW5nIHRoYXQgdGhlcmUgaXMgbm8gVlcgZXhpc3QgYXQgYWxsIChObyBsb2NrIGF0IHRoZSBFQkEgQURMTCBzaGlmdCBhdCBFQlMpICovCi0JICAgCSByZXR1cm4gR1RfRkFJTDsKKyAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKwkJZm9yKCBwdXAgPSAwIDsgcHVwIDwgIG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cCsrKQorCQl7CisJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCisJCQkvKiBpZiAodHJhaW5pbmdSZXN1bHRbdHJhaW5pbmdTdGFnZV1baW50ZXJmYWNlSWRdID09IFRFU1RfRkFJTEVEKSAqLworCQkJaWYgKCBQdXBTdGF0ZVtpbnRlcmZhY2VJZF1bcHVwXSA9PSAxKSAvKiBtZWFuaW5nIHRoYXQgdGhlcmUgaXMgbm8gVlcgZXhpc3QgYXQgYWxsIChObyBsb2NrIGF0IHRoZSBFQkEgQURMTCBzaGlmdCBhdCBFQlMpICovCisJCQlyZXR1cm4gR1RfRkFJTDsKKwkJfQogICAgfQorCiAgICByZXR1cm4gR1RfT0s7CiAKIAogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOYW1lOiAgICAgZGRyM1RpcFBic1J4LgogKiBEZXNjOiAgICAgUEJTIFRYCkBAIC01OTcsNyArNjA2LDcgQEAKICAgIHJldHVybiBkZHIzVGlwUGJzKHVpZGV2TnVtLCBQQlNfVFhfTU9ERSk7CiB9CiAKLSNpZm5kZWYgRVhDTFVERV9TV0lUQ0hfREVCVUcKKyNpZmRlZiBERFJfVklFV0VSX1RPT0wKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogUHJpbnQgUEJTIFJlc3VsdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjA3LDEyICs2MTYsMTIgQEAKICkKIHsKICAgICBHVF9VMzIgY3VyckNzOwotICAgIEdUX1UzMiBtYXhfY3MgPSBtdkh3c0RkcjNUaXBNYXhDU0dldCgpOworICAgIEdUX1UzMiBtYXhfY3MgPSBtdkh3c0RkcjNUaXBNYXhDU0dldChkZXZOdW0pOwogCiAgICBmb3IoY3VyckNzID0gMDsgY3VyckNzIDwgbWF4X2NzOyBjdXJyQ3MrKykKICAgIHsKLQkgICAgZGRyM1RpcFByaW50UGJzUmVzdWx0KGRldk51bSwgY3VyckNzLFBCU19SWF9NT0RFKTsKLQkgICAgZGRyM1RpcFByaW50UGJzUmVzdWx0KGRldk51bSwgY3VyckNzLFBCU19UWF9NT0RFKTsKKwkgICBkZHIzVGlwUHJpbnRQYnNSZXN1bHQoZGV2TnVtLCBjdXJyQ3MsUEJTX1JYX01PREUpOworCSAgIGRkcjNUaXBQcmludFBic1Jlc3VsdChkZXZOdW0sIGN1cnJDcyxQQlNfVFhfTU9ERSk7CiAgICB9CiAgICByZXR1cm4gR1RfT0s7CiB9CkBAIC02MjksNyArNjM4LDE4IEBACiB7CiAgICAgR1RfVTMyIGRhdGFWYWx1ZSA9IDAsIGJpdCA9IDAsIGludGVyZmFjZUlkID0gMCwgcHVwID0gMDsKICAgICBHVF9VMzIgcmVnQWRkciA9IChwYnNNb2RlID09IFBCU19SWF9NT0RFKSA/IChQQlNfUlhfUEhZX1JFRyArIGNzTnVtICogMHgxMCkgOiAoUEJTX1RYX1BIWV9SRUcgKyBjc051bSAqIDB4MTApOwotICAgIG12UHJpbnRmKCJDUyVkLCAlcyAsUEJTIFxuIiwgY3NOdW0gLChwYnNNb2RlPT1QQlNfUlhfTU9ERSk/ICJSeCIgOiAiVHgiKTsKKyAgICBHVF9VMzIgb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOworCisgICAgbXZQcmludGYoIiVzLENTJWQsUEJTLEFETExSQVRJTywsLCIsIChwYnNNb2RlID09IFBCU19SWF9NT0RFKT8iUngiOiJUeCIsIGNzTnVtKTsKKyAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQorICAgIHsKKyAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKyAgICAgICAgZm9yKCBwdXA9MDsgcHVwIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBwdXArKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIG12UHJpbnRmKCIlZCwiLHBic0RlbGF5UGVyUHVwW3Bic01vZGVdW2ludGVyZmFjZUlkXVtwdXBdW2NzTnVtXSk7CisgICAgICAgIH0KKwl9CisgICAgbXZQcmludGYoIlxuQ1MlZCwgJXMgLFBCUyBcbiIsIGNzTnVtICwocGJzTW9kZT09UEJTX1JYX01PREUpPyAiUngiIDogIlR4Iik7CiAgICAgZm9yKCBiaXQgPSAwIDsgYml0IDwgQlVTX1dJRFRIX0lOX0JJVFMgOyBiaXQrKykKICAgICB7CiAJbXZQcmludGYoIiVzLCBEUSIsKHBic01vZGU9PVBCU19SWF9NT0RFKT8gIlJ4IiA6ICJUeCIpOwpAQCAtNjM3LDcgKzY1Nyw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCiAJICAgIG12UHJpbnRmKCIlZCAsUEJTLCwsICIsYml0KTsKLSAgICAgICAgICAgIGZvciggcHVwPTA7IHB1cCA8PXRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgcHVwKyspCisgICAgICAgICAgICBmb3IoIHB1cD0wOyBwdXAgPD1vY3RldHNQZXJJbnRlcmZhY2VOdW07IHB1cCsrKQogICAgICAgICAgICAgewogCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCiAgICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoICAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCAgRERSX1BIWV9EQVRBLCAgcmVnQWRkcitiaXQsICZkYXRhVmFsdWUpKTsKQEAgLTY2NCwxMSArNjg0LDEyIEBACiB7CiAgICAgR1RfVTMyIGludGVyZmFjZUlkLCBwdXAsIGJpdDsKICAgICBHVF9VMzIgcmVnQWRkciA9IChwYnNNb2RlID09IFBCU19SWF9NT0RFKSA/IChQQlNfUlhfUEhZX1JFRyArIGVmZmVjdGl2ZV9jcyAqIDB4MTApIDogKFBCU19UWF9QSFlfUkVHICsgZWZmZWN0aXZlX2NzICogMHgxMCk7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIGZvciggaW50ZXJmYWNlSWQgPSAwIDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMSA7IGludGVyZmFjZUlkKyspCiAgICAgewogICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICBmb3IoIHB1cD0wOyBwdXAgPD10b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IHB1cCsrKQorICAgICAgICBmb3IoIHB1cD0wOyBwdXAgPD1vY3RldHNQZXJJbnRlcmZhY2VOdW07IHB1cCsrKQogICAgICAgICB7CiAJCQlmb3IoIGJpdCA9IDAgOyBiaXQgPD0gQlVTX1dJRFRIX0lOX0JJVFMrMzsgYml0KyspCiAJCQl7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nU3RhdGljLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nU3RhdGljLmMKaW5kZXggMDdlM2VkNS4uODhmZTI4MSAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ1N0YXRpYy5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdTdGF0aWMuYwpAQCAtMjksMTMgKzI5LDggQEAKICNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwUHJ2SWYuaCIKICNpbmNsdWRlICJtdkRkcjNMb2dnaW5nRGVmLmgiCiAKLSNpZmRlZiBDT05GSUdfRERSNAotI2luY2x1ZGUgIm12SHdzRGRyNFRyYWluaW5nLmgiCi0jZW5kaWYKLQogZXh0ZXJuIE1WX0hXU19UT1BPTE9HWV9NQVAgKnRvcG9sb2d5TWFwOwogZXh0ZXJuIEdUX1UzMiBjbGFtcFRibFtNQVhfSU5URVJGQUNFX05VTV07Ci1leHRlcm4gR1RfVTMyIHZyZWY7CiAKICNpZmRlZiBTVEFUSUNfQUxHT19TVVBQT1JUCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjUsNyArNjAsNiBAQAogCiBHVF9VMzIgcmVhZFJlYWR5RGVsYXlQaGFzZU9mZnNldFtdID0geyA0LCA0LCA0LCA0LCA2LCA2LCA2LCA2IH07CiAKLWV4dGVybiBHVF9VMzIgdnJlZjsKIGV4dGVybiBDbFZhbHVlUGVyRnJlcSBjYXNMYXRlbmN5VGFibGVbXTsKIGV4dGVybiBHVF9VMzIgdGFyZ2V0RnJlcTsKIGV4dGVybiBNVl9IV1NfVElQX0NPTkZJR19GVU5DX0RCIGNvbmZpZ0Z1bmNJbmZvW0hXU19NQVhfREVWSUNFX05VTV07CkBAIC0xNTMsMTAgKzE0NywxMSBAQAogICAgIEdUX1UzMiB0ZW1wOwogICAgIEdUX1UzMiBib2FyZFRyYWNlOwogICAgIFRyaXBEZWxheUVsZW1lbnQqIHBrZ0RlbGF5UHRyOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIHNpZ24gPSAoaXNXbCkgPyAtMSA6IDE7IC8qIGluIFdMIHdlIGNhbGMgdGhlIGRpZmYgYmV0d2VlbiBDbG9jayB0byBEUXMgaW4gUkwgd2Ugc3VtIHRoZSByb3VuZCB0cmlwIG9mIENsb2NrIGFuZCBEUXMgKi8KIAotICAgIGJ1c1BlckludGVyZmFjZSA9IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKTsKKyAgICBidXNQZXJJbnRlcmZhY2UgPSBvY3RldHNQZXJJbnRlcmZhY2VOdW07CiAKICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKQEAgLTE5NywxMiArMTkyLDEzIEBACiAgICAgR1RfVTMyIHBoYXNlID0gMDsKICAgICBHVF9VMzIgYWRsbCA9IDAsIGFkbGxfY2VuLCBhZGxsX2ludiwgYWRsbF9maW5hbDsKICAgICBHVF9VMzIgYWRsbFBlcmlvZCA9IE1FR0EgLyBmcmVxVmFsW2ZyZXF1ZW5jeV0gLyA2NDsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSBkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBERUJVR19UUkFJTklOR19TVEFUSUNfSVAoREVCVUdfTEVWRUxfVFJBQ0UsICgiZGRyM1RpcFdyaXRlTGV2ZWxpbmdTdGF0aWNDb25maWdcbiIpKTsKICAgICBERUJVR19UUkFJTklOR19TVEFUSUNfSVAoREVCVUdfTEVWRUxfVFJBQ0UsICgiZGV2TnVtIDB4JXggSUYgMHgleCBmcmVxICVkIChhZGxsUGVyaW9kIDB4JXgpXG4iLCBkZXZOdW0sIGludGVyZmFjZUlkLCBmcmVxdWVuY3ksIGFkbGxQZXJpb2QpKTsgICAKIAogCi0JYnVzUGVySW50ZXJmYWNlID0gR0VUX1RPUE9MT0dZX05VTV9PRl9CVVNFUyhkZXZOdW0pOworCWJ1c1BlckludGVyZmFjZSA9IG9jdGV0c1BlckludGVyZmFjZU51bTsKIAlidXNTdGFydEluZGV4ID0gaW50ZXJmYWNlSWQgKiBidXNQZXJJbnRlcmZhY2U7CiAJZm9yKGJ1c0luZGV4ID0gYnVzU3RhcnRJbmRleDsgYnVzSW5kZXggPCAoYnVzU3RhcnRJbmRleCArIGJ1c1BlckludGVyZmFjZSk7IGJ1c0luZGV4KyspCiAJewpAQCAtMjQ4LDggKzI0NCw3IEBACiAJTVZfSFdTX1NQRUVEX0JJTiBzcGVlZEJpbkluZGV4OwogCUdUX1UzMiByZFNhbXBsZURseVtNQVhfQ1NfTlVNXSA9IHsgMCB9OwogCUdUX1UzMiByZFJlYWR5RGVsW01BWF9DU19OVU1dICA9IHsgMCB9OwotCUdUX1UzMiAgYnVzUGVySW50ZXJmYWNlID0gR0VUX1RPUE9MT0dZX05VTV9PRl9CVVNFUyhkZXZOdW0pOwotCisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgREVCVUdfVFJBSU5JTkdfU1RBVElDX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoImRkcjNUaXBSZWFkTGV2ZWxpbmdTdGF0aWNDb25maWdcbiIpKTsKICAgICBERUJVR19UUkFJTklOR19TVEFUSUNfSVAoREVCVUdfTEVWRUxfVFJBQ0UsICgiZGV2TnVtIDB4JXggaWZjIDB4JXggZnJlcSAlZFxuIiwgZGV2TnVtLGludGVyZmFjZUlkLCBmcmVxdWVuY3kpKTsgICAKQEAgLTI2Nyw5ICsyNjIsOSBAQAogICAgIH0KICAgCiAKLSAgICBidXNTdGFydEluZGV4ID0gaW50ZXJmYWNlSWQgKiBidXNQZXJJbnRlcmZhY2U7CisgICAgYnVzU3RhcnRJbmRleCA9IGludGVyZmFjZUlkICogb2N0ZXRzUGVySW50ZXJmYWNlTnVtOwogCi0gICAgZm9yKGJ1c0luZGV4PWJ1c1N0YXJ0SW5kZXg7IGJ1c0luZGV4IDwgKGJ1c1N0YXJ0SW5kZXggKyBidXNQZXJJbnRlcmZhY2UpOyBidXNJbmRleCs9MikKKyAgICBmb3IoYnVzSW5kZXg9YnVzU3RhcnRJbmRleDsgYnVzSW5kZXggPCAoYnVzU3RhcnRJbmRleCArIG9jdGV0c1BlckludGVyZmFjZU51bSk7IGJ1c0luZGV4Kz0yKQogICAgIHsKICAgIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSW5kZXgpCiAgICAgICAgIGNzID0gY2hpcFNlbGVjdE1hcFt0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1soYnVzSW5kZXggJSA0KV0uY3NCaXRtYXNrXS5jc051bTsKQEAgLTI5NywzMCArMjkyLDExIEBACiAJCWRhdGEwID0gICgocGhhc2UwIDw8IDYpICsgKGFkbGwwICYgMHgxRikpOwogCQlkYXRhMSA9ICgocGhhc2UxIDw8IDYpICsgKGFkbGwxICYgMHgxRikpOwogCi0jaWYgMAotLypDaGVjayB3aGVuIHRoaXMgdXNlZCBpbiBvdGhlciBwcm9qZWN0cyovCi0JCWlmIChzaWxpY29uID09IDApCi0JCXsKLQkJCXN3aXRjaCh0b3BvbG9neU1hcC0+Ym9hcmRJZCkKLQkJCXsKLQkJCQljYXNlIEREUl9CT0FSRF9GVU5DVElPTkFMOgotCQkJCQlkYXRhMyA9IGZ1bmN0aW9uUmVnVmFsdWU7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBERFJfQk9BUkRfRVRQOgotCQkJCWNhc2UgRERSX0JPQVJEX0NVU1RPTUVSOgotCQkJCWRlZmF1bHQ6Ci0JCQkJCWRhdGEzID0gc191aU1SZWdWYWx1ZTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLSNlbmRpZgotCiAJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQnVzUmVhZE1vZGlmeVdyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIChidXNJbmRleCAlIDQpLCBERFJfUEhZX0RBVEEsIFBIWV9SRUFEX0RFTEFZKGNzKSwgZGF0YTAsMHgxREYpKTsKIAkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCdXNSZWFkTW9kaWZ5V3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgKChidXNJbmRleCArIDEpICUgNCksIEREUl9QSFlfREFUQSwgUEhZX1JFQURfREVMQVkoY3MpLCBkYXRhMSwgMHgxREYpKTsKIAl9CiAKLSAgICBmb3IgKGJ1c0luZGV4ID0gMDsgYnVzSW5kZXggPCBidXNQZXJJbnRlcmZhY2U7IGJ1c0luZGV4KyspCisgICAgZm9yIChidXNJbmRleCA9IDA7IGJ1c0luZGV4IDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNJbmRleCsrKQogICAgIHsKICAgIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSW5kZXgpCiAgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQnVzUmVhZE1vZGlmeVdyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgYnVzSW5kZXgsIEREUl9QSFlfREFUQSwgMHgzLCBkYXRhMywgMHgxRikpOwpAQCAtMzg4LDcgKzM2NCw3IEBACiAgICBHVF9VMzIgaW5kZXhDbnQgPSAwOwogCiAgICBERUJVR19UUkFJTklOR19TVEFUSUNfSVAoREVCVUdfTEVWRUxfVFJBQ0UsICgiZGRyM1RpcFN0YXRpY0luaXRDb250cm9sbGVyXG4iKSk7IAotLy8gICBmb3IoaW5kZXhDbnQgPSAwOyBpbmRleENudCA8IHN0YXRpY0luaXRDb250cm9sbGVyQ29uZmlnTGVuW2Rldk51bV07IGluZGV4Q250KyspCisKIAl3aGlsZShzdGF0aWNJbml0Q29udHJvbGxlckNvbmZpZ1tkZXZOdW1dW2luZGV4Q250XS5yZWdBZGRyICE9IDApCiAgICB7CiAgICAgICAgCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAKQEAgLTQwOCw5NSArMzg0LDE1IEBACiAgICAgR1RfVTMyICAgIGRldk51bQogKQogewotCS8vREVCVUdfVFJBSU5JTkdfU1RBVElDX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoIkNMSyB0byBDVFJMIHNrZXdcbiIpKTsKLSAgICAvL0NIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgMHgyLCBERFJfUEhZX0NPTlRST0wsIDB4OTAsIDB4MjBkYSkpOwotCi0JLy9ERUJVR19UUkFJTklOR19TVEFUSUNfSVAoREVCVUdfTEVWRUxfVFJBQ0UsICgiQ1RSTCBSZWYgRGVsYXlcbiIpKTsgLyogbW90aWIgZG9lcyBub3QgZWZlY3QqLwotICAgIC8vQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0NPTlRST0wsIDB4MSwgMHhmKSk7Ci0gICAgIAotCURFQlVHX1RSQUlOSU5HX1NUQVRJQ19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJQaHkgSW5pdCBDb250cm9sbGVyIDJcbiIpKTsgCiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0RBVEEsIDB4QTQsIDB4M2RmZSkpOwotCQotCURFQlVHX1RSQUlOSU5HX1NUQVRJQ19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJQaHkgSW5pdCBDb250cm9sbGVyIDNcbiIpKTsKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgMHhBNiwgMHhDQjIpKTsKLQkgCi0JREVCVUdfVFJBSU5JTkdfU1RBVElDX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoIlBoeSBJbml0IENvbnRyb2xsZXIgNFxuIikpOwogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9EQVRBLCAweEE5LCAwKSk7Ci0gICAgCi0JREVCVUdfVFJBSU5JTkdfU1RBVElDX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoIlN0YXRpYyBSZWNlaXZlciBDYWxpYnJhdGlvblxuIikpOwogCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9EQVRBLCAweEQwLCAweDFGKSk7Ci0JIAotCURFQlVHX1RSQUlOSU5HX1NUQVRJQ19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJTdGF0aWMgVi1SRUYgQ2FsaWJyYXRpb25cbiIpKTsKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgMHhBOCwgMHg0MzQpKTsKICAgICAgCi0KICAgICByZXR1cm4gR1RfT0s7CiB9CiAKICNlbmRpZgogCi0vKkRlc2lnbiBHdWlkZWxpbmVzIHBhcmFtZXRlcnMqLwotR1RfVTMyIGdacHJpRGF0YSA9IDEyMzsgLy9jb250cm9sbGVyIGRhdGEgLSBQIGRyaXZlIHN0cmVuZ3RoCi1HVF9VMzIgZ1pucmlEYXRhID0gMTIzOyAvL2NvbnRyb2xsZXIgZGF0YSDvv70gTiBkcml2ZSBzdHJlbmd0aAotR1RfVTMyIGdacHJpQ3RybCA9IDc0OyAvL2NvbnRyb2xsZXIgQy9BIO+/vSBQIGRyaXZlIHN0cmVuZ3RoCi1HVF9VMzIgZ1pucmlDdHJsID0gNzQ7IC8vY29udHJvbGxlciBDL0Eg77+9IE4gZHJpdmUgc3RyZW5ndGgKLQotR1RfVTMyIGdacG9kdERhdGEgPSA0NTsgLy9jb250cm9sbGVyIGRhdGEgLSBQIE9EVAotR1RfVTMyIGdabm9kdERhdGEgPSA0NTsgLy9jb250cm9sbGVyIGRhdGEgLSBOIE9EVAotR1RfVTMyIGdacG9kdEN0cmwgPSA0NTsgLy9jb250cm9sbGVyIGRhdGEgLSBQIE9EVAotR1RfVTMyIGdabm9kdEN0cmwgPSA0NTsgLy9jb250cm9sbGVyIGRhdGEgLSBOIE9EVAotCi0jaWYgMAotR1RfVTMyIGdEaWMgPSBHVF9UVU5FX1RSQUlOSU5HX1BBUkFNU19VTkRFRklORUQ7IC8vbWVtb3J5IGRyaXZlIHN0cmVuZ3RoCi1HVF9VMzIgdWlPRFRDb25maWcgPSBHVF9UVU5FX1RSQUlOSU5HX1BBUkFNU19VTkRFRklORUQ7Ci1HVF9VMzIgZ1J0dE5vbSA9IEdUX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1VOREVGSU5FRDsKLSNlbmRpZgotLy9HVF9VMzIgZ1J0dFdyID0gR1RfVFVORV9UUkFJTklOR19QQVJBTVNfVU5ERUZJTkVEOwotCi1HVF9VMzIgdWlPRFRDb25maWcgPSAweDEyMDAxMjsKLUdUX1UzMiBnUnR0Tm9tID0gMHg0NDsKLUdUX1UzMiBnRGljID0gMHgyOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUNvbmZpZ3VyZSBwaHkgKCBjYWxsZWQgYnkgc3RhdGljIGluaXQgY29udHJvbGxlcikgIGZvciBzdGF0aWMgZmxvdwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR1RfU1RBVFVTICAgIGRkcjNUaXBDb25maWd1cmVQaHkKLSgKLSAgICBHVF9VMzIgICAgZGV2TnVtCi0pCi17Ci0gICAgR1RfVTMyIGludGVyZmFjZUlkLCBwaHlJZDsKLQotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9EQVRBLCBQQURfWlJJX0NBTElCX1BIWV9SRUcsICgoMHg3ZiAmIGdacHJpRGF0YSkgPDwgNyB8ICgweDdmICYgZ1pucmlEYXRhKSkpKTsKLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfQ09OVFJPTCwgUEFEX1pSSV9DQUxJQl9QSFlfUkVHLCAoKDB4N2YgJiBnWnByaUN0cmwpIDw8IDcgfCAoMHg3ZiAmIGdabnJpQ3RybCkpKSk7Ci0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0RBVEEsIFBBRF9PRFRfQ0FMSUJfUEhZX1JFRywgKCgweDNmICYgZ1pwb2R0RGF0YSkgPDwgNiB8ICgweDNmICYgZ1pub2R0RGF0YSkpKSk7Ci0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0NPTlRST0wsIFBBRF9PRFRfQ0FMSUJfUEhZX1JFRywgKCgweDNmICYgZ1pwb2R0Q3RybCkgPDwgNiB8ICgweDNmICYgZ1pub2R0Q3RybCkpKSk7Ci0KLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgUEFEX1BSRV9ESVNBQkxFX1BIWV9SRUcsIDApKTsKLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgQ01PU19DT05GSUdfUEhZX1JFRywgMCkpOwotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9DT05UUk9MLCBDTU9TX0NPTkZJR19QSFlfUkVHLCAwKSk7Ci0gICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKLQl7Ci0JCS8qIGNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZW5hYmxlZCAqLwotICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICBmb3IocGh5SWQ9MDtwaHlJZDx0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IHBoeUlkKyspCi0gICAgICAgIHsKLSAgIAkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHBoeUlkKQotICAgICAgICAgICAgLyogVnJlZiAmIGNsYW1wICovCi0gICAgICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJ1c1JlYWRNb2RpZnlXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAgcGh5SWQsIEREUl9QSFlfREFUQSwgUEFEX0NPTkZJR19QSFlfUkVHLCAgICgoY2xhbXBUYmxbaW50ZXJmYWNlSWRdIDw8IDQpIHwgdnJlZiApLCAoKDB4NyA8PCA0KSB8IDB4NykgKSk7Ci0gICAgICAgICAgICAvKiBjbGFtcCBub3QgcmVsZXZhbnQgZm9yIGNvbnRyb2wgKi8KLSAgICAgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQnVzUmVhZE1vZGlmeVdyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsICBwaHlJZCwgRERSX1BIWV9DT05UUk9MLCBQQURfQ09ORklHX1BIWV9SRUcsICAgIDB4NCAsIDB4NyApKTsKLSAgICAgICAgfQotICAgIH0KLQotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQgKENPTkZJR19BUk1BREFfMzlYKQotCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9EQVRBLCAweDkwLCAweDYwMDIpKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0REUjQKLSAgICBkZHI0VGlwQ29uZmlndXJlUGh5KGRldk51bSk7Ci0jZW5kaWYKLQotICAgcmV0dXJuIEdUX09LOwotfQogCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL09zL2d0T3MvbXZYb3IuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvT3MvZ3RPcy9tdlhvci5jCmluZGV4IDM2YzVkMTQuLjA1NDE5ODIgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvT3MvZ3RPcy9tdlhvci5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvT3MvZ3RPcy9tdlhvci5jCkBAIC03MCwzNSArNzAsNTkgQEAKICNkZWZpbmUgREIoeCkKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0dGQ0gxMDAKKy8qIEF0dGVtcHQgdG8gcmV0YWluIHRoZSBTRFJBTSBtZW1vcnkgY29udGVudHMgYWNyb3NzIHJlYm9vdHMgKi8KKyNkZWZpbmUgTk9OX0RFU1RSVUNUSVZFX0VDQ19JTklUCisjZW5kaWYKKwogc3RhdGljIEdUX1UzMiB1aVhvclJlZ3NDdHJsQmFja3VwOwotc3RhdGljIEdUX1UzMiB1aVhvclJlZ3NCYXNlQmFja3VwW01BWF9DU107Ci1zdGF0aWMgR1RfVTMyIHVpWG9yUmVnc01hc2tCYWNrdXBbTUFYX0NTXTsKK3N0YXRpYyBHVF9VMzIgdWlYb3JSZWdzQmFzZUJhY2t1cFtNQVhfQ1MgKyAxXTsKK3N0YXRpYyBHVF9VMzIgdWlYb3JSZWdzTWFza0JhY2t1cFtNQVhfQ1MgKyAxXTsKIAotZXh0ZXJuIEdUX1UzMiBtdkh3c0RkcjNUaXBNYXhDU0dldCh2b2lkKTsKK2V4dGVybiBHVF9VMzIgbXZId3NEZHIzVGlwTWF4Q1NHZXQoR1RfVTMyIGRldk51bSk7CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12U3lzWG9ySW5pdAorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIFhPUiB1bml0J3Mgd2luZG93cy4KKyogSU5QVVQ6CisqICAgICAgIHVpTnVtT2ZDUwktIG51bWJlciBvZiBlbmFibGVkIGNoaXAgc2VsZWN0CisqCXVpQ3NFbmEJCS0gYml0bWFwIG9mIGVuYWJsZWQgY2hpcCBzZWxlY3RzOgorKgkJCQliaXRbaV0gPSAxIGlmIGNoaXAgc2VsZWN0IGkgaXMgZW5hYmxlZCAoZm9yIDEgPD0gaSA8PSAzKQorKgkJCQliaXRbNF0gPSBpZiBTUkFNIHdpbmRvdyBpcyBlbmFibGVkCisqCWNzU2l6ZQkJLSBzaXplIG9mIERSQU0gY2hpcCBzZWxlY3QKKyoJYmFzZURlbHRhCS0gYmFzZSBzdGFydCBvZiB0aGUgRFJBTSB3aW5kb3dzCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogR1RfVk9JRCBtdlN5c1hvckluaXQoR1RfVTMyIHVpTnVtT2ZDUywgR1RfVTMyIHVpQ3NFbmEsIEdUX1UzMiBjc1NpemUsIEdUX1UzMiBiYXNlRGVsdGEpCiB7Ci0JR1RfVTMyIHVpUmVnLHVpLHVpQmFzZSx1aUNzQ291bnQ7CisJR1RfVTMyIHVpUmVnLCB1aSwgdWlCYXNlLCB1aUNzQ291bnQsIHNpemVNYXNrOwogCiAJdWlYb3JSZWdzQ3RybEJhY2t1cCA9IE1WX1JFR19SRUFEKFhPUl9XSU5ET1dfQ1RSTF9SRUcoMCwgMCkpOwotCWZvcih1aT0wO3VpPE1BWF9DUzt1aSsrKQorCWZvcih1aSA9IDA7IHVpIDwgTUFYX0NTICsgMTsgdWkrKykKIAkJdWlYb3JSZWdzQmFzZUJhY2t1cFt1aV0gPSBNVl9SRUdfUkVBRChYT1JfQkFTRV9BRERSX1JFRygwLCB1aSkpOwotCWZvcih1aT0wO3VpPE1BWF9DUzt1aSsrKQorCWZvcih1aSA9IDA7IHVpIDwgTUFYX0NTICsgMTsgdWkrKykKIAkJdWlYb3JSZWdzTWFza0JhY2t1cFt1aV0gPSBNVl9SRUdfUkVBRChYT1JfU0laRV9NQVNLX1JFRygwLCB1aSkpOwogCiAJdWlSZWcgPSAwOwotCWZvcih1aT0wO3VpPCh1aU51bU9mQ1MpO3VpKyspIHsKLQkJdWlSZWcgfD0gKDB4MSA8PCAodWkpKTsgCQkJCQkvKiAJRW5hYmxlIFdpbmRvdyB4IGZvciBlYWNoIENTICovCi0JCXVpUmVnIHw9ICgweDMgPDwgKCh1aSoyKSsxNikpOyAJCQkJLyogCUVuYWJsZSBXaW5kb3cgeCBmb3IgZWFjaCBDUyAqLworCWZvciAodWlDc0NvdW50ID0gMCwgdWkgPSAwOyB1aUNzQ291bnQgPCB1aU51bU9mQ1MgJiYgdWkgPCA4OyB1aSsrKSB7CisJCWlmKHVpQ3NFbmEgJiAoMSA8PCB1aSkpIHsKKwkJCXVpUmVnIHw9ICgweDEgPDwgKHVpKSk7CQkJLyogRW5hYmxlIFdpbmRvdyB4IGZvciBlYWNoIENTICovCisJCQl1aVJlZyB8PSAoMHgzIDw8ICgodWkqMikrMTYpKTsgCQkvKiBFbmFibGUgV2luZG93IHggZm9yIGVhY2ggQ1MgKi8KKwkJCXVpQ3NDb3VudCsrOworCQl9CiAJfQogCiAJTVZfUkVHX1dSSVRFKFhPUl9XSU5ET1dfQ1RSTF9SRUcoMCwgMCksIHVpUmVnKTsKIAotCXVpQ3NDb3VudCA9IDA7Ci0JZm9yKHVpPTA7dWk8dWlOdW1PZkNTO3VpKyspIHsKKwlmb3IgKHVpQ3NDb3VudCA9IDAsIHVpID0gMDsgdWlDc0NvdW50IDwgdWlOdW1PZkNTICYmIHVpIDwgODsgdWkrKykgewogCQlpZih1aUNzRW5hICYgKDE8PHVpKSkgewogCQkJLyogd2luZG93IHggLSBCYXNlIC0gMHgwMDAwMDAwMCwgQXR0cmlidXRlIDB4MEUgLSBEUkFNICovCiAJCQl1aUJhc2UgPSBjc1NpemUqdWkgKyBiYXNlRGVsdGE7CisJCQkvKiBmaXhlZCBzaXplIDJHQiBmb3IgZWFjaCBDUyAqLworCQkJc2l6ZU1hc2sgPSAweDdGRkYwMDAwOwogCQkJc3dpdGNoKHVpKSB7CiAJCQkJY2FzZSAwOgogCQkJCQl1aUJhc2UgfD0gMHhFMDA7CkBAIC0xMTIsMTIgKzEzNiwxNiBAQAogCQkJCWNhc2UgMzoKIAkJCQkJdWlCYXNlIHw9IDB4NzAwOwogCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6IC8qIFNSQU0gKi8KKwkJCQkJdWlCYXNlID0gMHg0MDAwMDAwMDsKKwkJCQkJdWlCYXNlIHw9IDB4MUYwMDsgLyogY29uZmlndXJlIGFzIHNoYXJlZCB0cmFuc2FjdGlvbiAqLworCQkJCQlzaXplTWFzayA9IDB4RjAwMDA7CiAJCQl9CiAKLQkJCU1WX1JFR19XUklURShYT1JfQkFTRV9BRERSX1JFRygwLCB1aUNzQ291bnQpLCB1aUJhc2UpOworCQkJTVZfUkVHX1dSSVRFKFhPUl9CQVNFX0FERFJfUkVHKDAsIHVpKSwgdWlCYXNlKTsKIAogCQkJLyogd2luZG93IHggLSBTaXplKi8KLQkJCU1WX1JFR19XUklURShYT1JfU0laRV9NQVNLX1JFRygwLCB1aUNzQ291bnQpLCAweDdGRkYwMDAwKTsKKwkJCU1WX1JFR19XUklURShYT1JfU0laRV9NQVNLX1JFRygwLCB1aSksIHNpemVNYXNrKTsKIAkJCXVpQ3NDb3VudCsrOwogCQl9CiAJfQpAQCAtMTMxLDkgKzE1OSw5IEBACiAJR1RfVTMyIHVpOwogCiAJTVZfUkVHX1dSSVRFKFhPUl9XSU5ET1dfQ1RSTF9SRUcoMCwgMCksIHVpWG9yUmVnc0N0cmxCYWNrdXApOwotCWZvcih1aT0wO3VpPE1BWF9DUzt1aSsrKQorCWZvcih1aSA9IDA7IHVpIDwgTUFYX0NTICsgMTsgdWkrKykKIAkJTVZfUkVHX1dSSVRFKFhPUl9CQVNFX0FERFJfUkVHKDAsIHVpKSwgdWlYb3JSZWdzQmFzZUJhY2t1cFt1aV0pOwotCWZvcih1aT0wO3VpPE1BWF9DUzt1aSsrKQorCWZvcih1aSA9IDA7IHVpIDwgTUFYX0NTICsgMTsgdWkrKykKIAkJTVZfUkVHX1dSSVRFKFhPUl9TSVpFX01BU0tfUkVHKDAsIHVpKSwgdWlYb3JSZWdzTWFza0JhY2t1cFt1aV0pOwogCiAJTVZfUkVHX1dSSVRFKFhPUl9BRERSX09WUkRfUkVHKDAsIDApLCAwKTsKQEAgLTIwMyw2ICsyMzEsOTggQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZYb3JFY2NDbGVhbiAtIC4KKyoKKyogREVTQ1JJUFRJT046CisqCisqCisqIElOUFVUOgorKiAgICAgICBkZXN0UHRyIC0KKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk46CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworR1RfU1RBVFVTIG12WG9yRWNjQ2xlYW4oR1RfVTMyIGNoYW4sIE1WX1hPUl9FQ0MgKnBYb3JFY2NDb25maWcpCit7CisJTVZfVTMyIHRDbGtDeWNsZXM7CisJTVZfVTMyIHRlbXA7CisKKwkvKiBQYXJhbWV0ZXIgY2hlY2tpbmcgICAqLworCWlmIChjaGFuID49IE1WX1hPUl9NQVhfQ0hBTikgeworCQlEQihtdk9zUHJpbnRmKCIlczogRVJSLiBJbnZhbGlkIGNoYW4gbnVtICVkXG4iLCBfX2Z1bmNfXywgY2hhbikpOworCQlyZXR1cm4gTVZfQkFEX1BBUkFNOworCX0KKwlpZiAoTlVMTCA9PSBwWG9yRWNjQ29uZmlnKSB7CisJCURCKG12T3NQcmludGYoIiVzOiBFUlIuIHBYb3JFY2NDb25maWcgaXMgTlVMTCBwb2ludGVyXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm4gTVZfQkFEX1BUUjsKKwl9CisJaWYgKE1WX0FDVElWRSA9PSBtdlhvclN0YXRlR2V0KGNoYW4pKSB7CisJCURCKG12T3NQcmludGYoIiVzOiBFUlIuIENoYW5uZWwgaXMgYWxyZWFkeSBhY3RpdmVcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBNVl9CVVNZOworCX0KKwlpZiAoKHBYb3JFY2NDb25maWctPnNlY3RvclNpemUgPCBYRVRNQ1JfU0VDVElPTl9TSVpFX01JTl9WQUxVRSkgfHwKKwkgICAgKHBYb3JFY2NDb25maWctPnNlY3RvclNpemUgPiBYRVRNQ1JfU0VDVElPTl9TSVpFX01BWF9WQUxVRSkpIHsKKwkJREIobXZPc1ByaW50ZigiJXM6IEVSUi4gc2VjdG9yU2l6ZSBtdXN0IGJlIGJldHdlZW4gJWQgdG8gJWRcbiIsCisJCQkgICAgICBfX2Z1bmNfXywgWEVUTUNSX1NFQ1RJT05fU0laRV9NSU5fVkFMVUUsIFhFVE1DUl9TRUNUSU9OX1NJWkVfTUFYX1ZBTFVFKSk7CisJCXJldHVybiBNVl9CQURfUEFSQU07CisJfQorCWlmICgocFhvckVjY0NvbmZpZy0+YmxvY2tTaXplIDwgWEVYQlNSX0JMT0NLX1NJWkVfTUlOX1ZBTFVFKSB8fAorCSAgICAocFhvckVjY0NvbmZpZy0+YmxvY2tTaXplID4gWEVYQlNSX0JMT0NLX1NJWkVfTUFYX1ZBTFVFKSkgeworCQlEQihtdk9zUHJpbnRmKCIlczogRVJSLiBCbG9jayBzaXplIG11c3QgYmUgYmV0d2VlbiAlZCB0byAldWxcbiIsCisJCQkgICAgICBfX2Z1bmNfXywgWEVYQlNSX0JMT0NLX1NJWkVfTUlOX1ZBTFVFLCBYRVhCU1JfQkxPQ0tfU0laRV9NQVhfVkFMVUUpKTsKKwkJcmV0dXJuIE1WX0JBRF9QQVJBTTsKKwl9CisKKyNpZm5kZWYgTk9OX0RFU1RSVUNUSVZFX0VDQ19JTklUCisJaWYgKDB4MCA9PSBwWG9yRWNjQ29uZmlnLT5kZXN0UHRyKSB7CisJCURCKG12T3NQcmludGYoIiVzOiBFUlIuIGRlc3RQdHIgaXMgTlVMTCBwb2ludGVyXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm4gTVZfQkFEX1BBUkFNOworCX0KKyNlbmRpZgorCisJLyogc2V0IHRoZSBvcGVyYXRpb24gbW9kZSB0byBFQ0MgKi8KKwl0ZW1wID0gTVZfUkVHX1JFQUQoWE9SX0NPTkZJR19SRUcoWE9SX1VOSVQoY2hhbiksIFhPUl9DSEFOKGNoYW4pKSk7CisJdGVtcCAmPSB+WEVYQ1JfT1BFUkFUSU9OX01PREVfTUFTSzsKKwl0ZW1wIHw9IFhFWENSX09QRVJBVElPTl9NT0RFX0VDQzsKKwlNVl9SRUdfV1JJVEUoWE9SX0NPTkZJR19SRUcoWE9SX1VOSVQoY2hhbiksIFhPUl9DSEFOKGNoYW4pKSwgdGVtcCk7CisKKwkvKiB1cGRhdGUgdGhlIFRpbWVyRW4gYml0IGluIHRoZSBYT1IgRW5naW5lIFRpbWVyIE1vZGUKKwkgICBDb250cm9sIFJlZ2lzdGVyIChYRVRNQ1IpICovCisJaWYgKHBYb3JFY2NDb25maWctPnBlcmlvZGljRW5hYmxlKQorCQlNVl9SRUdfQklUX1NFVChYT1JfVElNRVJfTU9ERV9DVFJMX1JFRyhYT1JfVU5JVChjaGFuKSksIFhFVE1DUl9USU1FUl9FTl9NQVNLKTsKKwllbHNlCisJCU1WX1JFR19CSVRfUkVTRVQoWE9SX1RJTUVSX01PREVfQ1RSTF9SRUcoWE9SX1VOSVQoY2hhbikpLCBYRVRNQ1JfVElNRVJfRU5fTUFTSyk7CisKKwkvKiB1cGRhdGUgdGhlIFNlY3Rpb25TaXplQ3RybCBiaXQgaW4gdGhlIFhPUiBFbmdpbmUgVGltZXIgTW9kZSBDb250cm9sCisJICAgUmVnaXN0ZXIgKFhFVE1DUikgKi8KKwl0ZW1wID0gTVZfUkVHX1JFQUQoWE9SX1RJTUVSX01PREVfQ1RSTF9SRUcoWE9SX1VOSVQoY2hhbikpKTsKKwl0ZW1wICY9IH5YRVRNQ1JfU0VDVElPTl9TSVpFX0NUUkxfTUFTSzsKKwl0ZW1wIHw9IChwWG9yRWNjQ29uZmlnLT5zZWN0b3JTaXplIDw8IFhFVE1DUl9TRUNUSU9OX1NJWkVfQ1RSTF9PRkZTKTsKKwlNVl9SRUdfV1JJVEUoWE9SX1RJTUVSX01PREVfQ1RSTF9SRUcoWE9SX1VOSVQoY2hhbikpLCB0ZW1wKTsKKworCS8qIHVwZGF0ZSB0aGUgRHN0UHRyIGZpZWxkIGluIHRoZSBYT1IgRW5naW5lIFswLi4xXSBEZXN0aW5hdGlvbiBQb2ludGVyCisJICAgUmVnaXN0ZXIgKFhFeERQUjApICovCisJTVZfUkVHX1dSSVRFKFhPUl9EU1RfUFRSX1JFRyhYT1JfVU5JVChjaGFuKSwgWE9SX0NIQU4oY2hhbikpLCBwWG9yRWNjQ29uZmlnLT5kZXN0UHRyKTsKKworCS8qIHVwZGF0ZSB0aGUgQmxvY2tTaXplIGZpZWxkIGluIHRoZSBYT1IgRW5naW5lWzAuLjFdIEJsb2NrIFNpemUKKwkgICBSZWdpc3RlcnMgKFhFeEJTUikgKi8KKwlNVl9SRUdfV1JJVEUoWE9SX0JMT0NLX1NJWkVfUkVHKFhPUl9VTklUKGNoYW4pLCBYT1JfQ0hBTihjaGFuKSksIHBYb3JFY2NDb25maWctPmJsb2NrU2l6ZSk7CisKKwkvKiB1cGRhdGUgdGhlIFhPUiBFbmdpbmUgVGltZXIgTW9kZSBJbml0aWFsIFZhbHVlIFJlZ2lzdGVyIChYRVRNSVZSKSAqLworCXRDbGtDeWNsZXMgPSBwWG9yRWNjQ29uZmlnLT50Q2xrVGlja3M7CisJTVZfUkVHX1dSSVRFKFhPUl9USU1FUl9NT0RFX0lOSVRfVkFMX1JFRyhYT1JfVU5JVChjaGFuKSksIHRDbGtDeWNsZXMpOworCisJLyogc3RhcnQgdHJhbnNmZXIgKi8KKwlNVl9SRUdfQklUX1NFVChYT1JfQUNUSVZBVElPTl9SRUcoWE9SX1VOSVQoY2hhbiksIFhPUl9DSEFOKGNoYW4pKSwgWEVYQUNUUl9YRVNUQVJUX01BU0spOworCisJcmV0dXJuIE1WX09LOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12WG9yTWVtSW5pdCAtCiAqCiAqIERFU0NSSVBUSU9OOgpAQCAtMzkwLDI4ICs1MTAsMTU4IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfVk9JRAlkZHIzTmV3VGlwRWNjU2NydWIoKQogewotCU1WX1UzMiBjc19jLG1heF9jczsKLQlNVl9VMzIgdWlDc0VuYSA9IDA7Ci0gICAgbXZQcmludGYoIkREUjMgVHJhaW5pbmcgU2VxdWVuY2UgLSBTdGFydCBzY3J1YmJpbmcgXG4iKTsKKyAgICBNVl9VMzIgY3NfYyxtYXhfY3M7CisgICAgTVZfVTMyIHVpQ3NFbmEgPSAwOworI2lmZGVmIE5PTl9ERVNUUlVDVElWRV9FQ0NfSU5JVAorICAgIG12UHJpbnRmKCJERFIgVHJhaW5pbmcgU2VxdWVuY2UgLSBTdGFydCBub24tZGVzdHJ1Y3RpdmUgc2NydWJiaW5nIFxuIik7CisjZWxzZQorICAgIG12UHJpbnRmKCJERFIgVHJhaW5pbmcgU2VxdWVuY2UgLSBTdGFydCBzY3J1YmJpbmcgXG4iKTsKKyNlbmRpZgogCi0JbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoKTsKLQlmb3IgKGNzX2MgPSAwOyBjc19jIDwgbWF4X2NzOyBjc19jKyspCi0JCXVpQ3NFbmEgfD0gMSA8PCBjc19jOworICAgIG1heF9jcyA9IG12SHdzRGRyM1RpcE1heENTR2V0KDApOworICAgIGZvciAoY3NfYyA9IDA7IGNzX2MgPCBtYXhfY3M7IGNzX2MrKykKKyAgICAgICAgdWlDc0VuYSB8PSAxIDw8IGNzX2M7CiAKLQltdlN5c1hvckluaXQobWF4X2NzLCB1aUNzRW5hLCAweDgwMDAwMDAwLCAwKTsKKyAgICBtdlN5c1hvckluaXQobWF4X2NzLCB1aUNzRW5hLCAweDgwMDAwMDAwLCAwKTsKIAotCW12WG9yTWVtSW5pdCgwLCAweDAwMDAwMDAwLCAweDgwMDAwMDAwLCAweGRlYWRiZWVmLCAweGRlYWRiZWVmKTsKKyNpZmRlZiBOT05fREVTVFJVQ1RJVkVfRUNDX0lOSVQKKyAgICAvKiBVc2UgWE9SIEVuZ2luZSBFQ0MgY2xlYW51cCBtb2RlIHRvIGluaXRpYWxpemUgRUNDIGJpdHMgKi8KKyAgICBHVF9VMzIgZGVzdGluYXRpb247CisgICAgR1RfVTMyIG9yaWdpbmFsX3NkcmFtX2NvbmZpZzsKKyAgICBNVl9YT1JfRUNDIGVjY19jb25maWd1cmF0aW9uOworCisgICAgb3JpZ2luYWxfc2RyYW1fY29uZmlnID0gTVZfUkVHX1JFQUQoUkVHX1NEUkFNX0NPTkZJR19BRERSKTsKKyAgICAvKiBFbmFibGUgYml0IDE5IC0gSWdub3JlIEVDQyBlcnJvcnMgKi8KKyAgICBNVl9SRUdfV1JJVEUoUkVHX1NEUkFNX0NPTkZJR19BRERSLCBvcmlnaW5hbF9zZHJhbV9jb25maWcgfCBCSVQxOSk7CisKKyAgICAvKiBQcm9jZXNzIHVwIHRvIDNHQiBvZiBSQU0gKi8KKyAgICBmb3IgKGRlc3RpbmF0aW9uID0gMDsgZGVzdGluYXRpb24gPCAweGMwMDAwMDAwOyBkZXN0aW5hdGlvbiArPSAweDQwMDAwMDAwKSB7CisgICAgICAgIC8qIG1lbW9yeSBSTVcgRUNDIGVuZ2luZSAqLworICAgICAgICBlY2NfY29uZmlndXJhdGlvbi5kZXN0UHRyID0gZGVzdGluYXRpb247CisgICAgICAgIGVjY19jb25maWd1cmF0aW9uLmJsb2NrU2l6ZSA9IDB4NDAwMDAwMDA7ICAvKiAxR0IgKi8KKyAgICAgICAgZWNjX2NvbmZpZ3VyYXRpb24ucGVyaW9kaWNFbmFibGUgPSAwOyAgICAgIC8qIG5vdCBlbmFibGVkICovCisgICAgICAgIGVjY19jb25maWd1cmF0aW9uLnRDbGtUaWNrcyA9IDA7ICAgICAgICAgICAvKiBub3QgZW5hYmxlZCAqLworICAgICAgICBlY2NfY29uZmlndXJhdGlvbi5zZWN0b3JTaXplID0gMzA7ICAgICAgICAgLyogMUdCIHNlY3RvciBzaXplICovCisKKyAgICAgICAgR1RfU1RBVFVTIHN0YXR1cyA9IG12WG9yRWNjQ2xlYW4oMCwgJmVjY19jb25maWd1cmF0aW9uKTsKKyAgICAgICAgd2hpbGUgKG12WG9yU3RhdGVHZXQoMCkgIT0gTVZfSURMRSk7CisgICAgfQorCisgICAgTVZfUkVHX1dSSVRFKFJFR19TRFJBTV9DT05GSUdfQUREUiwgb3JpZ2luYWxfc2RyYW1fY29uZmlnKTsKKyNlbHNlCisgICAgLyogVXNlIFhPUiBFbmdpbmUgTWVtb3J5IEluaXRpYWxpemF0aW9uIHRvIHNldCB0aGUgY29udGVudHMgb2YgUkFNICovCisgICAgbXZYb3JNZW1Jbml0KDAsIDB4MDAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4MGVjYzBlY2MsIDB4MGVjYzBlY2MpOwogICAgIC8qIHdhaXQgZm9yIHByZXZpb3VzIHRyYW5zZmVyIGNvbXBsZXRpb24gKi8KICAgICB3aGlsZSAobXZYb3JTdGF0ZUdldCgwKSAhPSBNVl9JRExFKTsKIAotCW12WG9yTWVtSW5pdCgwLCAweDgwMDAwMDAwLCAweDQwMDAwMDAwLCAweGRlYWRiZWVmLCAweGRlYWRiZWVmKTsKKyAgICBtdlhvck1lbUluaXQoMCwgMHg4MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwZWNjMGVjYywgMHgwZWNjMGVjYyk7CiAgICAgLyogd2FpdCBmb3IgcHJldmlvdXMgdHJhbnNmZXIgY29tcGxldGlvbiAqLwogICAgIHdoaWxlIChtdlhvclN0YXRlR2V0KDApICE9IE1WX0lETEUpOworI2VuZGlmCiAKICAgICAvKiBSZXR1cm4gWE9SIFN0YXRlICovCiAgICAgbXZTeXNYb3JGaW5pc2goKTsKIAotICAgIG12UHJpbnRmKCJERFIzIFRyYWluaW5nIFNlcXVlbmNlIC0gRW5kIHNjcnViYmluZyBcbiIpOworICAgIG12UHJpbnRmKCJERFIgVHJhaW5pbmcgU2VxdWVuY2UgLSBFbmQgc2NydWJiaW5nIFxuIik7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12WG9yVHJhbnNmZXIgLSBUcmFuc2ZlciBkYXRhIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIG9uIG9uZSBvZgorKiAgICAgICAgICAgICAgICAgdGhyZWUgbW9kZXMgKFhPUixDUkMzMixETUEpCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYXRlcyBYT1IgY2hhbm5lbCwgYWNjb3JkaW5nIHRvIGZ1bmN0aW9uIHBhcmFtZXRlcnMsCisqICAgICAgIGluIG9yZGVyIHRvIHBlcmZvcm0gWE9SIG9yIENSQzMyIG9yIERNQSB0cmFuc2FjdGlvbi4KKyogICAgICAgVG8gZ2FpbiBtYXhpbXVtIHBlcmZvcm1hbmNlIHRoZSB1c2VyIGlzIGFza2VkIHRvIGtlZXAgdGhlIGZvbGxvd2luZworKiAgICAgICByZXN0cmljdGlvbnM6CisqICAgICAgIDEpIFNlbGVjdGVkIGVuZ2luZSBpcyBhdmFpbGFibGUgKG5vdCBidXN5KS4KKyogICAgICAgMSkgVGhpcyBtb2R1bGUgZG9lcyBub3QgdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gQ1BVIE1NVSBpc3N1ZXMuCisqICAgICAgICAgIEluIG9yZGVyIGZvciB0aGUgWE9SIGVuZ2luZSB0byBhY2Nlc3MgdGhlIGFwcHJvcHJlYXRlIHNvdXJjZQorKiAgICAgICAgICBhbmQgZGVzdGluYXRpb24sIGFkZHJlc3MgcGFyYW1ldGVycyBtdXN0IGJlIGdpdmVuIGluIHN5c3RlbQorKiAgICAgICAgICBwaHlzaWNhbCBtb2RlLgorKiAgICAgICAyKSBUaGlzIEFQSSBkb2VzIG5vdCB0YWtlIGNhcmUgb2YgY2FjaGUgY29oZXJlbmN5IGlzc3Vlcy4gVGhlIHNvdXJjZSwKKyogICAgICAgICAgZGVzdGluYXRpb24gYW5kIGluIGNhc2Ugb2YgY2hhaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBhcmUgYXNzdW1lZAorKiAgICAgICAgICB0byBiZSBjYWNoZSBjb2hlcmVudC4KKyogICAgICAgNCkgUGFyYW1ldGVycyB2YWxpZGl0eS4gRm9yIGV4YW1wbGUsIGRvZXMgc2l6ZSBwYXJhbWV0ZXIgZXhjZWVkcworKiAgICAgICAgICBtYXhpbXVtIGJ5dGUgY291bnQgb2YgZGVzY3JpcHRvciBtb2RlICgxNk0gb3IgNjRLKS4KKyoKKyogSU5QVVQ6CisqICAgICAgIGNoYW4gICAgICAgICAgLSBYT1IgY2hhbm5lbCBudW1iZXIuIFNlZSBHVF9YT1JfQ0hBTk5FTCBlbnVtZXJhdG9yLgorKiAgICAgICB4b3JUeXBlICAgICAgIC0gT25lIG9mIHRocmVlOiBYT1IsIENSQzMyIGFuZCBETUEgb3BlcmF0aW9ucy4KKyogICAgICAgeG9yQ2hhaW5QdHIgICAtIGFkZHJlc3Mgb2YgY2hhaW4gcG9pbnRlcgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSUzoKKyogICAgICAgR1RfQkFEX1BBUkFNIGlmIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb24gaW52YWxpZCwgR1RfT0sgb3RoZXJ3aXNlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dUX1NUQVRVUyBtdlhvclRyYW5zZmVyKEdUX1UzMiBjaGFuLCBNVl9YT1JfVFlQRSB4b3JUeXBlLCBHVF9VMzIgeG9yQ2hhaW5QdHIpCit7CisJR1RfVTMyIHRlbXA7CiAKKwkvKiBQYXJhbWV0ZXIgY2hlY2tpbmcgKi8KKwlpZiAoY2hhbiA+PSBNVl9YT1JfTUFYX0NIQU4pIHsKKwkJREIobXZQcmludGYoIiVzOiBFUlIuIEludmFsaWQgY2hhbiBudW0gJWRcbiIsIF9fZnVuY19fLCBjaGFuKSk7CisJCXJldHVybiBHVF9CQURfUEFSQU07CisJfQorCWlmIChNVl9BQ1RJVkUgPT0gbXZYb3JTdGF0ZUdldChjaGFuKSkgeworCQlEQihtdlByaW50ZigiJXM6IEVSUi4gQ2hhbm5lbCBpcyBhbHJlYWR5IGFjdGl2ZVxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIEdUX0JVU1k7CisJfQorCWlmICgweDAgPT0geG9yQ2hhaW5QdHIpIHsKKwkJREIobXZQcmludGYoIiVzOiBFUlIuIHhvckNoYWluUHRyIGlzIE5VTEwgcG9pbnRlclxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKKwl9CisKKwkvKiByZWFkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYW5kIG1hc2sgdGhlIG9wZXJhdGlvbiBtb2RlIGZpZWxkICovCisJdGVtcCA9IE1WX1JFR19SRUFEKFhPUl9DT05GSUdfUkVHKFhPUl9VTklUKGNoYW4pLCBYT1JfQ0hBTihjaGFuKSkpOworCXRlbXAgJj0gflhFWENSX09QRVJBVElPTl9NT0RFX01BU0s7CisKKwlzd2l0Y2ggKHhvclR5cGUpIHsKKwljYXNlIE1WX1hPUjoKKwkJaWYgKDAgIT0gKHhvckNoYWluUHRyICYgWEVYRFBSX0RTVF9QVFJfWE9SX01BU0spKSB7CisJCQlEQihtdlByaW50ZigiJXM6IEVSUi4gSW52YWxpZCBjaGFpbiBwb2ludGVyIChiaXRzIFs1OjBdIG11c3QgIgorCQkJCSAgICAgICJiZSBjbGVhcmVkKVxuIiwgX19mdW5jX18pKTsKKwkJCXJldHVybiBHVF9CQURfUEFSQU07CisJCX0KKwkJLyogc2V0IHRoZSBvcGVyYXRpb24gbW9kZSB0byBYT1IgKi8KKwkJdGVtcCB8PSBYRVhDUl9PUEVSQVRJT05fTU9ERV9YT1I7CisJCWJyZWFrOworCisJY2FzZSBNVl9ETUE6CisJCWlmICgwICE9ICh4b3JDaGFpblB0ciAmIFhFWERQUl9EU1RfUFRSX0RNQV9NQVNLKSkgeworCQkJREIobXZQcmludGYoIiVzOiBFUlIuIEludmFsaWQgY2hhaW4gcG9pbnRlciAoYml0cyBbNDowXSBtdXN0ICIKKwkJCQkgICAgICAiYmUgY2xlYXJlZClcbiIsIF9fZnVuY19fKSk7CisJCQlyZXR1cm4gR1RfQkFEX1BBUkFNOworCQl9CisJCS8qIHNldCB0aGUgb3BlcmF0aW9uIG1vZGUgdG8gRE1BICovCisJCXRlbXAgfD0gWEVYQ1JfT1BFUkFUSU9OX01PREVfRE1BOworCQlicmVhazsKKworCWNhc2UgTVZfQ1JDMzI6CisJCWlmICgwICE9ICh4b3JDaGFpblB0ciAmIFhFWERQUl9EU1RfUFRSX0NSQ19NQVNLKSkgeworCQkJREIobXZQcmludGYoIiVzOiBFUlIuIEludmFsaWQgY2hhaW4gcG9pbnRlciAoYml0cyBbNDowXSBtdXN0ICIKKwkJCQkgICAgICAiYmUgY2xlYXJlZClcbiIsIF9fZnVuY19fKSk7CisJCQlyZXR1cm4gR1RfQkFEX1BBUkFNOworCQl9CisJCS8qIHNldCB0aGUgb3BlcmF0aW9uIG1vZGUgdG8gQ1JDMzIgKi8KKwkJdGVtcCB8PSBYRVhDUl9PUEVSQVRJT05fTU9ERV9DUkM7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKKwl9CisKKwkvKiB3cml0ZSB0aGUgb3BlcmF0aW9uIG1vZGUgdG8gdGhlIHJlZ2lzdGVyICovCisJTVZfUkVHX1dSSVRFKFhPUl9DT05GSUdfUkVHKFhPUl9VTklUKGNoYW4pLCBYT1JfQ0hBTihjaGFuKSksIHRlbXApOworCS8qIHVwZGF0ZSB0aGUgTmV4dERlc2NQdHIgZmllbGQgaW4gdGhlIFhPUiBFbmdpbmUgWzAuLjFdIE5leHQgRGVzY3JpcHRvcgorCSAgIFBvaW50ZXIgUmVnaXN0ZXIgKFhFeE5EUFIpICovCisJTVZfUkVHX1dSSVRFKFhPUl9ORVhUX0RFU0NfUFRSX1JFRyhYT1JfVU5JVChjaGFuKSwgWE9SX0NIQU4oY2hhbikpLCB4b3JDaGFpblB0cik7CisKKwkvKiBzdGFydCB0cmFuc2ZlciAqLworCU1WX1JFR19CSVRfU0VUKFhPUl9BQ1RJVkFUSU9OX1JFRyhYT1JfVU5JVChjaGFuKSwgWE9SX0NIQU4oY2hhbikpLCBYRVhBQ1RSX1hFU1RBUlRfTUFTSyk7CisKKwlyZXR1cm4gR1RfT0s7Cit9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vZ3RCdWlsZCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9ndEJ1aWxkCmluZGV4IDZiZmU3MTEuLmJlYjlhZjIgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9ndEJ1aWxkCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9ndEJ1aWxkCkBAIC0xOSw3ICsxOSw3IEBACiAKICMjIENQU1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgIyMjIyMjIyMjIyMjIyMjIyMKICNJTkNMVURFX1BBVEggPQotQ19GSUxFX0xJU1QgICA9IG12SHdzRGRyM0JjMi5jCitDX0ZJTEVfTElTVCAgID0gbXZId3NEZHIzTXN5cy5jIG12SHdzRGRyM0JjMi5jIG12SHdzRGRyM0JvYksuYwogI1NVQkRJUlMgICAgICA9CiAjQ19FWENMVURFX0ZJTEVfTElTVCA9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNBYzMuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNBYzMuYwppbmRleCBlYzhhMmE4Li5lZDVmZDczIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzQWMzLmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM0FjMy5jCkBAIC00NywzNiArNDcsMTggQEAKIAogZXh0ZXJuIE1WX0JPT0wgZGRyM0lmRWNjRW5hYmxlZCh2b2lkKTsKIGV4dGVybiBHVF9VMzIgbWFza1R1bmVGdW5jOwotZXh0ZXJuIEdUX1UzMiBybFZlcnNpb247Ci1leHRlcm4gR1RfVTMyIGRlbGF5RW5hYmxlLCBja0RlbGF5LCBja0RlbGF5XzE2LCBjYURlbGF5OworZXh0ZXJuIEdUX1UzMiBkZWxheUVuYWJsZSwgY2tEZWxheSwgY2FEZWxheTsKIGV4dGVybiBHVF9VMzIgZmlyc3RBY3RpdmVJZjsKIGV4dGVybiBNVl9IV1NfRERSX0ZSRVEgaW5pdEZyZXE7CiBleHRlcm4gR1RfVTggIGRlYnVnVHJhaW5pbmdBY2Nlc3M7CiBleHRlcm4gR1RfVTggIGRlYnVnVHJhaW5pbmdBYzM7CiBleHRlcm4gTVZfSFdTX0REUl9GUkVRIG1lZGl1bUZyZXE7CiBleHRlcm4gR1RfVTggY2FsaWJyYXRpb25VcGRhdGVDb250cm9sOyAvKjIgZXh0ZXJuYWwgb25seSwgMSBpcyBpbnRlcm5hbCBvbmx5Ki8KK2V4dGVybiBHVF9VMzIgZGZzTG93RnJlcTsKK2V4dGVybiBHVF9VMzIgZnJlcVZhbFtdOwogCiBHVF9VMzIgIHBpcGVNdWx0aWNhc3RNYXNrOwogCi1zdGF0aWMgR1RfVTE2IGZyZXFWYWxbRERSX0ZSRVFfTElNSVRdID0KLXsKLSAgICAxMzAsIC8qRERSX0ZSRVFfTE9XX0ZSRVEqLwotICAgIDQwMCwgLypERFJfRlJFUV80MDAsKi8KLSAgICA1MzMsIC8qRERSX0ZSRVFfNTMzLCovCi0gICAgNjY2LCAvKkREUl9GUkVRXzY2NywqLwotICAgIDgwMCwgLypERFJfRlJFUV84MDAsKi8KLSAgICA5MzMsIC8qRERSX0ZSRVFfOTMzLCovCi0gICAxMDY2LCAvKkREUl9GUkVRXzEwNjYsKi8KLSAgICAzMTEsIC8qRERSX0ZSRVFfMzExLCovCi0gICAgMzMzLCAvKkREUl9GUkVRXzMzMywqLwotICAgIDQ2NywgIC8qRERSX0ZSRVFfNDY3LCovCi0gICAgODUwLCAgLypERFJfRlJFUV84NTAsKi8KLSAgICA2MDAsICAvKkREUl9GUkVRXzYwMCwqLwotICAgIDMwMCwgIC8qRERSX0ZSRVFfMzAwLCovCi0JOTAwLCAgLypERFJfRlJFUV85MDAqLwotCTM2MCAgLypERFJfRlJFUV8zNjAqLwotfTsKLQogc3RhdGljIEdUX1U4IEFjM0J3UGVyRnJlcVtERFJfRlJFUV9MSU1JVF0gPQogewogICAgIDB4MywgLypERFJfRlJFUV8xMDAqLwpAQCAtMTk5LDYgKzE4MSw5IEBACiAJR1RfVTggICAgICBkZXZOdW0sCiAJTVZfRERSM19ERVZJQ0VfSU5GTyAqIGluZm9QdHIKICk7CisKK0dUX1U4ICAgIGRkcjNUaXBDbG9ja01vZGUoIEdUX1UzMiBmcmVxdWVuY3kgKTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFNlcnZlciBBY2Nlc3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBHVF9TVEFUVVMgZGRyM1RpcEFjM1NlcnZlclJlZ1dyaXRlCkBAIC0zOTYsOCArMzgxLDkgQEAKIAlNVl9IV1NfRERSX0ZSRVEgdWlEZHJGcmVxOwogCU1WX1NUQVRVUyBzdGF0dXM7CiAJTVZfSFdTX1RPUE9MT0dZX01BUCogdG9wb2xvZ3lNYXAgPSBkZHIzVGlwR2V0VG9wb2xvZ3lNYXAoZGV2TnVtKTsKKwlHVF9VOCBudW1PZkJ1c1BlckludGVyZmFjZSA9IDU7CiAKLSAgICBHVF9VMzIgYm9hcmRPZmZzZXQgPSBib2FyZElkICogQUMzX05VTUJFUl9PRl9JTlRFUkZBQ0VTICp0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7CisgICAgR1RfVTMyIGJvYXJkT2Zmc2V0ID0gYm9hcmRJZCAqIEFDM19OVU1CRVJfT0ZfSU5URVJGQUNFUyAqbnVtT2ZCdXNQZXJJbnRlcmZhY2U7CiAKICAgICAvKiBuZXcgcmVhZCBsZXZlbGluZyB2ZXJzaW9uICovCiAgICAgc3RhdGljQ29uZmlnLnNpbGljb25EZWxheSA9IEFjM1NpbGljb25EZWxheU9mZnNldFtib2FyZElkXTsKQEAgLTQxMSwxMSArMzk3LDE5IEBACiAJY29uZmlnRnVuYy50aXBTZXRGcmVxRGl2aWRlckZ1bmMgPSBkZHIzVGlwQWMzU2V0RGl2aWRlcjsKIAljb25maWdGdW5jLnRpcEdldERldmljZUluZm9GdW5jID0gZGRyM1RpcEFDM0dldERldmljZUluZm87CiAJY29uZmlnRnVuYy50aXBHZXRUZW1wZXJhdHVyZSA9IE5VTEw7CisJY29uZmlnRnVuYy50aXBHZXRDbG9ja1JhdGlvID0gZGRyM1RpcENsb2NrTW9kZTsKIAogICAgIG12SHdzRGRyM1RpcEluaXRDb25maWdGdW5jKGRldk51bSwgJmNvbmZpZ0Z1bmMpOwogCiAJZGRyM1RpcFJlZ2lzdGVyRHFUYWJsZShkZXZOdW0sIERRYml0TWFwMlBoeXBpbik7CiAKKwkvKlNldCBkZXZpY2UgYXR0cmlidXRlcyovCisJZGRyM1RpcERldkF0dHJJbml0KGRldk51bSk7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYsIE1WX1RJUF9SRVZfMyk7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX1BIWV9FREdFLCBNVl9ERFJfUEhZX0VER0VfTkVHQVRJVkUpOworCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFLCBudW1PZkJ1c1BlckludGVyZmFjZSk7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX0lOVEVSTEVBVkVfV0EsIEdUX0ZBTFNFKTsKKwogI2lmZGVmIFNUQVRJQ19BTEdPX1NVUFBPUlQKICAgICBkZHIzVGlwSW5pdFN0YXRpY0NvbmZpZ0RiKGRldk51bSwgJnN0YXRpY0NvbmZpZyk7CiAjZW5kaWYKQEAgLTQyNSwxMiArNDE5LDExIEBACiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0gICAgcmxWZXJzaW9uID0gMTsKLQotICAgIG1hc2tUdW5lRnVuYyA9ICAgICAoU0VUX01FRElVTV9GUkVRX01BU0tfQklUIHwKKyAgICBtYXNrVHVuZUZ1bmMgPSAgICAgKFNFVF9MT1dfRlJFUV9NQVNLX0JJVCB8CisJCQkJCQlMT0FEX1BBVFRFUk5fTUFTS19CSVQgfAorCQkJCQkJU0VUX01FRElVTV9GUkVRX01BU0tfQklUIHwKIAkJCQkJCVdSSVRFX0xFVkVMSU5HX01BU0tfQklUIHwKIAkJCQkJCVdSSVRFX0xFVkVMSU5HX1NVUFBfTUFTS19CSVQgfAotCQkJCQkJTE9BRF9QQVRURVJOXzJfTUFTS19CSVQgfAogCQkJCQkJUkVBRF9MRVZFTElOR19NQVNLX0JJVCB8CiAJCQkJCQlQQlNfUlhfTUFTS19CSVQgfAogCQkJCQkJUEJTX1RYX01BU0tfQklUIHwKQEAgLTQ0OCwxMyArNDQxLDEyIEBACiAJCW1hc2tUdW5lRnVuYyAmPQl+V1JJVEVfTEVWRUxJTkdfU1VQUF9NQVNLX0JJVDsKIAl9CiAKLQlpZiggY2tEZWxheSA9PSAtMSApCi0JCWNrRGVsYXlfMTYgPSAyMDA7Ci0JaWYoIGNrRGVsYXkgPT0gLTEgKQorCWlmKCBja0RlbGF5ID09IE1WX1BBUkFNU19VTkRFRklORUQgKQogCQlja0RlbGF5ID0gMjAwOwogCWRlbGF5RW5hYmxlID0gMTsKIAljYURlbGF5ID0gMDsKIAljYWxpYnJhdGlvblVwZGF0ZUNvbnRyb2wgPSAxOworCWZyZXFWYWxbRERSX0ZSRVFfTE9XX0ZSRVFdID0gZGZzTG93RnJlcSA9IDEzMDsKIAogCWluaXRGcmVxID0gdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0ubWVtb3J5RnJlcTsKIApAQCAtNTcxLDI1ICs1NjMsMTggQEAKICAgICBHVF9VMzIgc2FyVmFsOwogCUdUX1UzMiBkYXRhID0gMDsKIAlHVF9VMzIgc2VsZWN0ID0gMDsKKwlHVF9VOCB2YWx1ZTsKIAlNVl9IV1NfVE9QT0xPR1lfTUFQKiB0b3BvbG9neU1hcCA9IGRkcjNUaXBHZXRUb3BvbG9neU1hcChkZXZOdW0pOwogCi0JLyogRHVuaXQgdHJhaW5pbmcgY2xvY2sgKyAxOjEgbW9kZSAqLwotCWlmKGZyZXF1ZW5jeSA9PSBERFJfRlJFUV9MT1dfRlJFUSkgewotCQlkaXZSYXRpbyA9ICgxIDw8IDMwKTsKLQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBYzNTZXJ2ZXJSZWdSZWFkKGRldk51bSwgIDB4RjgyOTQsICAmZGF0YSwgTUFTS19BTExfQklUUyApKTsKLQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBYzNTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIDB4RjgyOTQsICBSX01PRF9XKGRpdlJhdGlvLCBkYXRhLCAoMHgzIDw8IDMwKSkpKTsKKwkvKiBEdW5pdCB0cmFpbmluZyBjbG9jayArIDE6MS8yOjEgbW9kZSAqLworCWRpdlJhdGlvID0gKGRkcjNUaXBDbG9ja01vZGUoZnJlcXVlbmN5KSA8PCAzMCk7CisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBYzNTZXJ2ZXJSZWdSZWFkKGRldk51bSwgIDB4RjgyOTQsICAmZGF0YSwgTUFTS19BTExfQklUUyApKTsKKwlDSEVDS19TVEFUVVMoZGRyM1RpcEFjM1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHhGODI5NCwgIFJfTU9EX1coZGl2UmF0aW8sIGRhdGEsICgweDMgPDwgMzApKSkpOwogCi0JCUNIRUNLX1NUQVRVUyhkZHIzVGlwQWMzU2VydmVyUmVnUmVhZChkZXZOdW0sICAweDE1MjQsICAmZGF0YSwgTUFTS19BTExfQklUUyApKTsKLQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBYzNTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIDB4MTUyNCwgIFJfTU9EX1coKDAgPDwgMTUpLCBkYXRhLCAoMCA8PCAxNSkgKSkpOwotCX0KLQllbHNlIHsKLQkJZGl2UmF0aW8gPSAoMiA8PCAzMCk7Ci0JCUNIRUNLX1NUQVRVUyhkZHIzVGlwQWMzU2VydmVyUmVnUmVhZChkZXZOdW0sICAweEY4Mjk0LCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMgKSk7Ci0JCUNIRUNLX1NUQVRVUyhkZHIzVGlwQWMzU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweEY4Mjk0LCAgUl9NT0RfVyhkaXZSYXRpbywgZGF0YSwgKDB4MyA8PCAzMCkpKSk7CisJLyogQ29uZmlndXJlIER1bml0IHRvIDE6MSBpbiBjYXNlIG9mIERMTCBvZmYgbW9kZSBlbHNlIDI6MSovCisJdmFsdWUgPSAoZGRyM1RpcENsb2NrTW9kZShmcmVxdWVuY3kpID09IDEpPyAwIDogMTsKKwlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgaW50ZXJmYWNlSWQsIDB4MTUyNCwgKHZhbHVlIDw8IDE1KSwgKDEgPDwgMTUpKSk7CiAKLQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBYzNTZXJ2ZXJSZWdSZWFkKGRldk51bSwgIDB4MTUyNCwgICZkYXRhLCBNQVNLX0FMTF9CSVRTICkpOwotCQlDSEVDS19TVEFUVVMoZGRyM1RpcEFjM1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHgxNTI0LCAgUl9NT0RfVygoMSA8PCAxNSksIGRhdGEsICgwIDw8IDE1KSApKSk7Ci0JfQogCXNlbGVjdCA9IChmcmVxdWVuY3kgPT0gdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tmaXJzdEFjdGl2ZUlmXS5tZW1vcnlGcmVxKT8oMCA8PCAyOSkgOiAoMSA8PCAyOSk7Ly9URiBpcyB0aGUgZnVuY3Rpb24gbW9kZSBzbyB0aGUgc2VsZWN0b3IgaGF2ZSB0byBiZSAwLgogCUNIRUNLX1NUQVRVUyhkZHIzVGlwQWMzU2VydmVyUmVnUmVhZChkZXZOdW0sICAweEY4Mjk0LCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMgKSk7CiAJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBYzNTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIDB4RjgyOTQsICBSX01PRF9XKHNlbGVjdCwgZGF0YSwgKDB4MSA8PCAyOSkpKSk7CkBAIC02NDIsNiArNjI3LDE5IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcmV0dXJuIDEgb2YgY29yZS9EVU5JVCBjbG9jayByYXRpb24gaXMgMSBmb3IgZ2l2ZW4gZnJlcSwgMCBpZiBjbG9jayByYXRpb3MgaXMgMjoxCisqLworR1RfVTggICAgZGRyM1RpcENsb2NrTW9kZSggR1RfVTMyIGZyZXF1ZW5jeSApCit7CisJaWYoZnJlcXVlbmN5ID09IEREUl9GUkVRX0xPV19GUkVRKXsKKwkJcmV0dXJuIDE7CisJfQorCWVsc2V7CisJCXJldHVybiAyOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBleHRlcm5hbCByZWFkIGZyb20gbWVtb3J5CiAqLwogR1RfU1RBVFVTICAgIGRkcjNUaXBFeHRSZWFkCkBAIC02NTUsNyArNjUzLDcgQEAKIHsKICAgICBHVF9VMzIgYnVyc3ROdW07CiAKLSAgICBmb3IoYnVyc3ROdW09MCA7IGJ1cnN0TnVtIDwgbnVtT2ZCdXJzdHMqODsgYnVyc3ROdW0rKykKKyAgICBmb3IoYnVyc3ROdW09MCA7IGJ1cnN0TnVtIDwgbnVtT2ZCdXJzdHMqNDsgYnVyc3ROdW0rKykvLyA0IHBlciAxNiBiaXQgSS9GCiAgICAgewogCQlkYXRhW2J1cnN0TnVtXSA9ICogKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAocmVnQWRkciArIDQqIGJ1cnN0TnVtKTsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzQmMyLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzQmMyLmMKaW5kZXggZjkyN2ZmNy4uNTIzNjdhZiAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM0JjMi5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNCYzIuYwpAQCAtMzIsNyArMzIsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBCQzJfTlVNX0JZVEVTICAgICAgICAgICAgICAgICAgICgzKQotI2RlZmluZSBCQzJfTlVNQkVSX09GX0lOVEVSRkFDRVMJCTUKIAogI2RlZmluZSBCQzJfQ0xJRU5UX0ZJRUxEKGNsaWVudCkJCShjbGllbnQgPDwgMTUpCiAjZGVmaW5lIEJDMl9HRVRfQ0xJRU5UX0ZJRUxEKGludGVyZmFjZUFjY2VzcyxpbnRlcmZhY2VJZCkgKChpbnRlcmZhY2VBY2Nlc3MgPT0gQUNDRVNTX1RZUEVfTVVMVElDQVNUKSA/IEJDMl9DTElFTlRfRklFTEQoTVVMVElDQVNUX0lEKTpCQzJfQ0xJRU5UX0ZJRUxEKGludGVyZmFjZUlkKSkKQEAgLTQ3LDYgKzQ2LDIzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBwcmUtZGVjbGFyYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCitHVF9TVEFUVVMgICAgZGRyM1RpcEJDMkV4dFJlYWQKKygKKyAgICBHVF9VMzIgICAgICBkZXZOdW0sCisgICAgR1RfVTMyICAgICAgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICBudW1PZkJ1cnN0cywKKyAgICBHVF9VMzIgICAgICAqZGF0YQorKTsKKworR1RfU1RBVFVTICAgIGRkcjNUaXBCQzJFeHRXcml0ZQorKAorICAgIEdUX1UzMiAgICAgIGRldk51bSwKKyAgICBHVF9VMzIgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgIG51bU9mQnVyc3RzLAorICAgIEdUX1UzMiAgICAgICphZGRyCispOwogc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwQmMyR2V0TWVkaXVtRnJlcQogKAogICAgIEdUX1UzMiAgICAgICAgICBkZXZOdW0sCkBAIC04Niw3ICsxMDIsNyBAQAogICAgIE1WX0hXU19ERFJfRlJFUSogZnJlcQogKTsKIAotR1RfU1RBVFVTIGRkcjNUaXBUbUdldEluaXRGcmVxCitzdGF0aWMgR1RfU1RBVFVTIGRkcjNUaXBUbUdldEluaXRGcmVxCiAoCiAgICAgR1RfU1RBVFVTICAgICAgIGRldk51bSwKICAgICBNVl9IV1NfRERSX0ZSRVEgKmZyZXEKQEAgLTEzNSw3ICsxNTEsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEdsb2JhbHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBleHRlcm4gR1RfVTMyIG1hc2tUdW5lRnVuYzsKLWV4dGVybiBHVF9VMzIgcmxWZXJzaW9uOwogZXh0ZXJuIEdUX1UzMiBmcmVxVmFsW107CiBleHRlcm4gTVZfSFdTX0REUl9GUkVRIG1lZGl1bUZyZXE7CiBleHRlcm4gTVZfSFdTX1RPUE9MT0dZX01BUCAqdG9wb2xvZ3lNYXA7CkBAIC0xNDcsOSArMTYyLDEwIEBACiBleHRlcm4gR1RfVTMyIGlzUGxsQmVmb3JlSW5pdDsKIGV4dGVybiBHVF9VMzIgdXNlQnJvYWRjYXN0OwogZXh0ZXJuIEdUX1UzMiBpc0NiZVJlcXVpcmVkOwotZXh0ZXJuIEdUX1UzMiBkZWxheUVuYWJsZSwgY2tEZWxheSwgY2tEZWxheV8xNixjYURlbGF5OworZXh0ZXJuIEdUX1UzMiBkZWxheUVuYWJsZSwgY2tEZWxheSxjYURlbGF5OwogZXh0ZXJuIEdUX1U4IGRlYnVnVHJhaW5pbmdBY2Nlc3M7CiBleHRlcm4gR1RfVTggY2FsaWJyYXRpb25VcGRhdGVDb250cm9sOyAvKjIgZXh0ZXJuYWwgb25seSwgMSBpcyBpbnRlcm5hbCBvbmx5Ki8KK2V4dGVybiBHVF9VMzIgZGZzTG93RnJlcTsKIAogR1RfVTMyIGRlYnVnQmMyID0gMDsKIEdUX1UzMiAgcGlwZU11bHRpY2FzdE1hc2s7CkBAIC0yNjEsMjQgKzI3Nyw2IEBACiAgICAweDEgIC8qRERSX0ZSRVFfMzYwKi8KIH07CiAKLUdUX1UzMiBwaHkxVmFsVGFibGVbRERSX0ZSRVFfTElNSVRdID0KLXsKLSAgMCwgICAvKiBERFJfRlJFUV9MT1dfRlJFUSAqLwotICAweGYsIC8qIEREUl9GUkVRXzQwMCAqLwotICAweGYsIC8qIEREUl9GUkVRXzUzMyAqLwotICAweGYsIC8qIEREUl9GUkVRXzY2NyAqLwotICAweGMsIC8qIEREUl9GUkVRXzgwMCAqLwotICAweDgsIC8qIEREUl9GUkVRXzkzMyAqLwotICAweDgsIC8qIEREUl9GUkVRXzEwNjYgKi8KLSAgMHhmLCAvKiBERFJfRlJFUV8zMTEgKi8KLSAgMHhmLCAvKiBERFJfRlJFUV8zMzMgKi8KLSAgMHhmLCAvKiBERFJfRlJFUV80NjcgKi8KLSAgMHhjLCAvKkREUl9GUkVRXzg1MCovCi0gIDB4ZiwgLypERFJfRlJFUV82MDAqLwotICAweGYsIC8qRERSX0ZSRVFfMzAwKi8KLSAgMHg4LCAgLypERFJfRlJFUV85MDAqLwotICAweGYgIC8qRERSX0ZSRVFfMzYwKi8KLX07CiAKIC8qIEJpdCBtYXBwaW5nIChmb3IgUEJTKSAqLwogR1RfVTMyIGJjMkRRYml0TWFwMlBoeXBpbltdID0KQEAgLTMxNiwzMSArMzE0LDMxIEBACiAgICAgLyogMXN0IGJvYXJkICovCiAgICAgewogICAgIDB4MWYsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KLSB7ICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9IH0sCi0gICAgNCwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyB7ICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9IH0sCiAgICAgMHhGICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKIAotCS8qIDJuZCBib2FyZCAqLworICAgIC8qIDJuZCBib2FyZCAqLwogICAgIHsKICAgICAweDFmLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCi0geyAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSB9LAotICAgIDQsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgMSAgLyogYm9hcmQgbnVtYmVyICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgeyAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSB9LAorICAgIDB4RiAgLyogQnVzZXMgbWFzayAqLwogICAgIH0KIH07CiAjZW5kaWYKIAorc3RhdGljIEdUX1U4ICAgIGRkcjNUaXBDbG9ja01vZGUoIEdUX1UzMiBmcmVxdWVuY3kgKTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFNlcnZlciBBY2Nlc3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBHVF9TVEFUVVMgZGRyM1RpcEJjMlNlcnZlclJlZ1dyaXRlCkBAIC00NDUsNyArNDQzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRW5hYmxlIFBpcGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdUX1NUQVRVUyAgICBkZHIzVGlwUGlwZUVuYWJsZQorc3RhdGljIEdUX1NUQVRVUyAgICBkZHIzVGlwUGlwZUVuYWJsZQogKAogICAgIEdUX1U4ICAgICAgICAgICAgICAgICBkZXZOdW0sCiAgICAgTVZfSFdTX0FDQ0VTU19UWVBFICAgIGludGVyZmFjZUFjY2VzcywKQEAgLTQ3OCw3ICs0NzYsNyBAQAogICAgIHJldHVybiBHVF9PSzsKIH0KIAotdm9pZCBkZHIzVGlwSXNVbmljYXN0QWNjZXNzKCBHVF9VOCBkZXZOdW0sR1RfVTMyKiBpbnRlcmZhY2VJZCwgTVZfSFdTX0FDQ0VTU19UWVBFKiBpbnRlcmZhY2VBY2Nlc3MpCitzdGF0aWMgdm9pZCBkZHIzVGlwSXNVbmljYXN0QWNjZXNzKCBHVF9VOCBkZXZOdW0sR1RfVTMyKiBpbnRlcmZhY2VJZCwgTVZfSFdTX0FDQ0VTU19UWVBFKiBpbnRlcmZhY2VBY2Nlc3MpCiB7CiAJR1RfVTMyIGluZGV4Q250LCB0b3RhbENudCA9IDAgLCBpbnRlcmZhY2VUbXAgPSAwOwogICAgIE1WX0hXU19UT1BPTE9HWV9NQVAgKnRvcG9sb2d5TWFwID0gZGRyM1RpcEdldFRvcG9sb2d5TWFwKGRldk51bSk7CkBAIC03MzgsMjAgKzczNiwyMSBAQAogICAgIEdUX1UzMiAgYm9hcmRJZAogKQogewotICAgIE1WX0hXU19USVBfQ09ORklHX0ZVTkNfREIgY29uZmlnRnVuYzsKLQlNVl9IV1NfVE9QT0xPR1lfTUFQKiB0b3BvbG9neU1hcCA9IGRkcjNUaXBHZXRUb3BvbG9neU1hcChkZXZOdW0pOworICAgIE1WX0hXU19USVBfQ09ORklHX0ZVTkNfREIgICBjb25maWdGdW5jOworCU1WX0hXU19UT1BPTE9HWV9NQVAqICAgICAgICB0b3BvbG9neU1hcCA9IGRkcjNUaXBHZXRUb3BvbG9neU1hcChkZXZOdW0pOworICAgIEdUX1RVTkVfVFJBSU5JTkdfUEFSQU1TICAgICB0dW5lUGFyYW1zOwogCiAJaWYodG9wb2xvZ3lNYXAgPT0gTlVMTCkKIAl7CiAJCXJldHVybiBHVF9OT1RfSU5JVElBTElaRUQ7CiAJfQogCi0JZGRyM1RpcEJjMkdldEludGVyZmFjZU1hcCgoR1RfVTgpZGV2TnVtKTsKKyAgICBkZHIzVGlwQmMyR2V0SW50ZXJmYWNlTWFwKChHVF9VOClkZXZOdW0pOwogCiAjaWZkZWYgU1RBVElDX0FMR09fU1VQUE9SVAogCU1WX0hXU19USVBfU1RBVElDX0NPTkZJR19JTkZPIHN0YXRpY0NvbmZpZzsKIAotICAgIEdUX1UzMiBib2FyZE9mZnNldCA9IGJvYXJkSWQgKiBCQzJfTlVNQkVSX09GX0lOVEVSRkFDRVMgKnRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsKKyAgICBHVF9VMzIgYm9hcmRPZmZzZXQgPSBib2FyZElkICogQkMyX05VTUJFUl9PRl9JTlRFUkZBQ0VTICogQkMyX05VTUJFUl9PRl9QVVA7CiAKICAgICBzdGF0aWNDb25maWcuc2lsaWNvbkRlbGF5ID0gYmMyU2lsaWNvbkRlbGF5T2Zmc2V0W2JvYXJkSWRdOwogICAgIHN0YXRpY0NvbmZpZy5wYWNrYWdlVHJhY2VBcnIgPSBiYzJQYWNrYWdlUm91bmRUcmlwRGVsYXlBcnJheTsKQEAgLTc3MSw1NyArNzcwLDgwIEBACiAgICAgY29uZmlnRnVuYy50aXBTZXRGcmVxRGl2aWRlckZ1bmMgPSBkZHIzVGlwQmMyU2V0RGl2aWRlcjsKICAgICBjb25maWdGdW5jLnRpcEdldERldmljZUluZm9GdW5jID0gZGRyM1RpcEJjMkdldERldmljZUluZm87CiAJY29uZmlnRnVuYy50aXBHZXRUZW1wZXJhdHVyZSA9IE5VTEw7CisJY29uZmlnRnVuYy50aXBHZXRDbG9ja1JhdGlvID0gZGRyM1RpcENsb2NrTW9kZTsKKworICAgIGNvbmZpZ0Z1bmMudGlwRXh0ZXJuYWxSZWFkICA9IGRkcjNUaXBCQzJFeHRSZWFkOworICAgIGNvbmZpZ0Z1bmMudGlwRXh0ZXJuYWxXcml0ZSA9IGRkcjNUaXBCQzJFeHRXcml0ZTsKIAogICAgIG12SHdzRGRyM1RpcEluaXRDb25maWdGdW5jKGRldk51bSwgJmNvbmZpZ0Z1bmMpOwogCiAJLyogcmVnaXN0ZXIgYml0IG1hcHBpbmcgKGZvciBQQlMpICovCiAJZGRyM1RpcFJlZ2lzdGVyRHFUYWJsZShkZXZOdW0sIGJjMkRRYml0TWFwMlBoeXBpbik7CiAKLSNpZiBkZWZpbmVkKENIWF9GQU1JTFkpIHx8IGRlZmluZWQoRVhNWFBNX0ZBTUlMWSkKLQkJLyogZm9yIFRNIGludGVyZmFjZSwgc2luY2UgREZTIGZsb3cgaXMgZGlmZmVyZW50IGZyb20gTVNZUyBERlMgKHdoaWNoIGlzIG5vdAotCQkgICBmdW5jdGlvbmFsKSBERlMgaXMgaW5jbHVkZWQgaW4gdGhlIGZsb3cgKi8KKwkvKlNldCBkZXZpY2UgYXR0cmlidXRlcyovCisJZGRyM1RpcERldkF0dHJJbml0KGRldk51bSk7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYsIE1WX1RJUF9SRVZfMik7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX1BIWV9FREdFLCBNVl9ERFJfUEhZX0VER0VfTkVHQVRJVkUpOworCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFLCBCQzJfTlVNQkVSX09GX1BVUCk7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX0lOVEVSTEVBVkVfV0EsIEdUX0ZBTFNFKTsKIAotCQkgICAvKiBUQkQgLSBuZWVkIHRvIGFkZCBQQlMgKFBCU19SWF9NQVNLX0JJVCB8IFBCU19UWF9NQVNLX0JJVCkgKi8KIAltYXNrVHVuZUZ1bmMgPSAoIElOSVRfQ09OVFJPTExFUl9NQVNLX0JJVCB8CiAgICAgICAgICAgICAgICAgICAgICBTRVRfTUVESVVNX0ZSRVFfTUFTS19CSVQgfAogICAgICAgICAgICAgICAgICAgICAgV1JJVEVfTEVWRUxJTkdfTUFTS19CSVQgfAogICAgICAgICAgICAgICAgICAgICAgTE9BRF9QQVRURVJOXzJfTUFTS19CSVQgfAogICAgICAgICAgICAgICAgICAgICAgUkVBRF9MRVZFTElOR19NQVNLX0JJVCB8Ci0JCQkJCSBQQlNfUlhfTUFTS19CSVQgfAotCQkJCQkgUEJTX1RYX01BU0tfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgIFBCU19SWF9NQVNLX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICBQQlNfVFhfTUFTS19CSVQgfAogICAgICAgICAgICAgICAgICAgICAgU0VUX1RBUkdFVF9GUkVRX01BU0tfQklUIHwKICAgICAgICAgICAgICAgICAgICAgIFdSSVRFX0xFVkVMSU5HX1RGX01BU0tfQklUIHwKICAgICAgICAgICAgICAgICAgICAgIFJFQURfTEVWRUxJTkdfVEZfTUFTS19CSVQgfAogICAgICAgICAgICAgICAgICAgICAgV1JJVEVfTEVWRUxJTkdfU1VQUF9URl9NQVNLX0JJVCB8CiAgICAgICAgICAgICAgICAgICAgICBDRU5UUkFMSVpBVElPTl9SWF9NQVNLX0JJVCB8CiAgICAgICAgICAgICAgICAgICAgICBDRU5UUkFMSVpBVElPTl9UWF9NQVNLX0JJVCk7Ci0jZWxzZQotCW1hc2tUdW5lRnVuYyA9ICggSU5JVF9DT05UUk9MTEVSX01BU0tfQklUIHwKLSAgICAgICAgICAgICAgICAgICAgIFdSSVRFX0xFVkVMSU5HX01BU0tfQklUIHwKLSAgICAgICAgICAgICAgICAgICAgIExPQURfUEFUVEVSTl8yX01BU0tfQklUIHwKLSAgICAgICAgICAgICAgICAgICAgIFJFQURfTEVWRUxJTkdfTUFTS19CSVQgfAotICAgICAgICAgICAgICAgICAgICAgQ0VOVFJBTElaQVRJT05fUlhfTUFTS19CSVQgfAotICAgICAgICAgICAgICAgICAgICAgQ0VOVFJBTElaQVRJT05fVFhfTUFTS19CSVQpOwotI2VuZGlmCiAKKwkvKlNraXAgbWlkIGZyZXEgc3RhZ2VzIGZvciA0MDBNaHogRERSIHNwZWVkKi8KKwlpZiggKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbZmlyc3RBY3RpdmVJZl0ubWVtb3J5RnJlcSA9PSBERFJfRlJFUV80MDApICl7CisJCW1hc2tUdW5lRnVuYyA9IChJTklUX0NPTlRST0xMRVJfTUFTS19CSVQgfAorCQkgICAgICAgICAgICAgICAgV1JJVEVfTEVWRUxJTkdfTUFTS19CSVQgfAorCQkgICAgICAgICAgICAgICAgTE9BRF9QQVRURVJOXzJfTUFTS19CSVQgfAorCQkgICAgICAgICAgICAgICAgUkVBRF9MRVZFTElOR19NQVNLX0JJVCB8CisJCSAgICAgICAgICAgICAgICBDRU5UUkFMSVpBVElPTl9SWF9NQVNLX0JJVCB8CisJCSAgICAgICAgICAgICAgICBDRU5UUkFMSVpBVElPTl9UWF9NQVNLX0JJVCk7CisJfQorCisgICAgaWYoIGNrRGVsYXkgPT0gTVZfUEFSQU1TX1VOREVGSU5FRCApCisgICAgICAgIGNrRGVsYXkgPSAxNTA7CisgICAgZGVsYXlFbmFibGUgPSAxOworICAgIGNhRGVsYXkgPSAwOworCisgICAgLyogdXBkYXRlIERHTCBwYXJhbWV0ZXJzICovCisgICAgdHVuZVBhcmFtcy5ja0RlbGF5ID0gY2tEZWxheTsKKyAgICB0dW5lUGFyYW1zLlBoeVJlZzNWYWwgPSAweEE7CisgICAgdHVuZVBhcmFtcy5nUnR0Tm9tID0gMHg0NDsKKyAgICB0dW5lUGFyYW1zLmdEaWMgPSAweDI7CisgICAgdHVuZVBhcmFtcy51aU9EVENvbmZpZyA9IDB4MTIwMDEyOworICAgIHR1bmVQYXJhbXMuZ1pwcmlEYXRhID0gMTIzOworICAgIHR1bmVQYXJhbXMuZ1pucmlEYXRhID0gMTIzOworICAgIHR1bmVQYXJhbXMuZ1pwcmlDdHJsID0gNzQ7CisgICAgdHVuZVBhcmFtcy5nWm5yaUN0cmwgPSA3NDsKKyAgICB0dW5lUGFyYW1zLmdacG9kdERhdGEgPSA0NTsKKyAgICB0dW5lUGFyYW1zLmdabm9kdERhdGEgPSA0NTsKKyAgICB0dW5lUGFyYW1zLmdacG9kdEN0cmwgPSA0NTsKKyAgICB0dW5lUGFyYW1zLmdabm9kdEN0cmwgPSA0NTsKKyAgICB0dW5lUGFyYW1zLmdSdHRXUiA9IDB4MjAwOworCisgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBUdW5lVHJhaW5pbmdQYXJhbXMoZGV2TnVtLCAmdHVuZVBhcmFtcykpOworCisgICAgLyogZnJlcXVlbmN5IGFuZCBnZW5lcmFsIHBhcmFtZXRlcnMgKi8KICAgICBkZHIzVGlwQmMyR2V0TWVkaXVtRnJlcShkZXZOdW0sIGZpcnN0QWN0aXZlSWYsICZtZWRpdW1GcmVxKTsKICAgICBpbml0RnJlcSA9IHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbZmlyc3RBY3RpdmVJZl0ubWVtb3J5RnJlcTsKLSAgICBkZnNMb3dGcmVxID0gMTAwOworICAgIGZyZXFWYWxbRERSX0ZSRVFfTE9XX0ZSRVFdID0gZGZzTG93RnJlcSA9IDEwMDsKICAgICBkZnNMb3dQaHkxID0gUGh5UmVnMVZhbDsKICAgICBpc1BsbEJlZm9yZUluaXQgPSAwOwotICAgIHJsVmVyc2lvbiA9IDE7IC8qIG5ldyBSTCBtYWNoaW5lICovCiAgICAgdXNlQnJvYWRjYXN0ID0gR1RfRkFMU0U7IC8qIG11bHRpY2FzdCAqLwogICAgIGlzQ2JlUmVxdWlyZWQgPSBHVF9UUlVFOwogCWNhbGlicmF0aW9uVXBkYXRlQ29udHJvbCA9IDI7CiAKLQkvKiBEZWxheSBQYXJhbSAqLwotCWlmKCBja0RlbGF5ID09IC0xICkKLQkJY2tEZWxheSA9IDE1MDsKLQlpZiggY2tEZWxheV8xNiA9PSAtMSApCi0JCWNrRGVsYXlfMTYgPSAxNTA7Ci0JZGVsYXlFbmFibGUgPSAxOwotCWNhRGVsYXkgPSAwOwotCiAgICAgcmV0dXJuIEdUX09LOwogfQogCkBAIC05MzAsNyArOTUyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogWFNCIEV4dGVybmFsIHJlYWQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdUX1NUQVRVUyAgICBkZHIzVGlwRXh0UmVhZAorR1RfU1RBVFVTICAgIGRkcjNUaXBCQzJFeHRSZWFkCiAoCiAgICAgR1RfVTMyICAgICAgZGV2TnVtLAogICAgIEdUX1UzMiAgICAgIGludGVyZmFjZUlkLApAQCAtOTk1LDcgKzEwMTcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBYU0IgRXh0ZXJuYWwgd3JpdGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdUX1NUQVRVUyAgICBkZHIzVGlwRXh0V3JpdGUKK0dUX1NUQVRVUyAgICBkZHIzVGlwQkMyRXh0V3JpdGUKICgKICAgICBHVF9VMzIgICAgICBkZXZOdW0sCiAgICAgR1RfVTMyICAgICAgaW50ZXJmYWNlSWQsCkBAIC0xMTA4LDYgKzExMzAsMTcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiByZXR1cm4gMSBvZiBjb3JlL0RVTklUIGNsb2NrIHJhdGlvbiBpcyAxIGZvciBnaXZlbiBmcmVxLCAwIGlmIGNsb2NrIHJhdGlvcyBpcyAyOjEKKyovCitzdGF0aWMgR1RfVTggICAgZGRyM1RpcENsb2NrTW9kZShHVF9VMzIgZnJlcXVlbmN5KQoreworICAgIGZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsgLyogYXZvaWQgd2FybmluZ3MgKi8KKworICAgIHJldHVybiAyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTmFtZTogICAgIGRkcjNUaXBUbVNldERpdmlkZXIuCiAqIERlc2M6ICAgICBQbGwgRGl2aWRlciBvZiBUaGUgVHJhZmljIE1hbmFnZXIgVW5pdAogKiBBcmdzOgpAQCAtMTIzMCwxMCArMTI2MywxMiBAQAogICAgIHN3aXRjaCAoZGl2aWRlcikKICAgICB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHdyaXRlRGF0YSA9IDB4MjsKKwkJCS8qTm90IDgwMCBpcyBhIDY2NyBvbmx5Ki8KKyAgICAgICAgICAgIHdyaXRlRGF0YSA9IChzYXJGcmVxPT1ERFJfRlJFUV84MDApPygweDIpOigweDEpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHdyaXRlRGF0YSA9IDB4MzsKKwkJCS8qTm90IDgwMCBpcyBhIDY2NyBvbmx5Ki8KKyAgICAgICAgICAgIHdyaXRlRGF0YSA9IChzYXJGcmVxPT1ERFJfRlJFUV84MDApPygweDMpOigweDIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfSU5GTywgKCJFcnJvcjogV3JvbmcgZGl2aWRlciAlZFxuIiwgZGl2aWRlcikpOwpAQCAtMTM3NSw3ICsxNDEwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogVE0gaW50ZXJmYWNlIGZyZXF1ZW5jeSBHZXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdUX1NUQVRVUyBkZHIzVGlwVG1HZXRJbml0RnJlcQorc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwVG1HZXRJbml0RnJlcQogKAogCUdUX1NUQVRVUyAgICAgICBkZXZOdW0sCiAJTVZfSFdTX0REUl9GUkVRICpmcmVxCkBAIC0xNDg0LDYgKzE1MTksMTEgQEAKIAogICAgIHN3aXRjaChzYXJGcmVxKQogICAgIHsKKyAgICAgICAgY2FzZSBERFJfRlJFUV80MDA6CisJCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfVFJBQ0UsICgiTm8gbWVkaXVtIGZyZXEgc3VwcG9ydGVkIGZvciA0MDBNaHpcbiIpKTsKKyAgICAgICAgICAgICpmcmVxID0gRERSX0ZSRVFfNDAwOworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgY2FzZSBERFJfRlJFUV82Njc6CiAJCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfVFJBQ0UsICgiTWVkaXVtIEREUl9GUkVRXzMzM1xuIikpOwogICAgICAgICAgICAgKmZyZXEgPSBERFJfRlJFUV8zMzM7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzQm9iSy5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM0JvYksuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZGMxZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM0JvYksuYwpAQCAtMCwwICsxLDE2NDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDAxLCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorKiBUaGlzIGNvZGUgY29udGFpbnMgY29uZmlkZW50aWFsIGluZm9ybWF0aW9uIG9mIE1hcnZlbGwgc2VtaWNvbmR1Y3RvciwgaW5jLgorKiBubyByaWdodHMgYXJlIGdyYW50ZWQgaGVyZWluIHVuZGVyIGFueSBwYXRlbnQsIG1hc2sgd29yayByaWdodCBvciBjb3B5cmlnaHQKKyogb2YgTWFydmVsbCBvciBhbnkgdGhpcmQgcGFydHkuCisqIE1hcnZlbGwgcmVzZXJ2ZXMgdGhlIHJpZ2h0IGF0IGl0cyBzb2xlIGRpc2NyZXRpb24gdG8gcmVxdWVzdCB0aGF0IHRoaXMgY29kZQorKiBiZSBpbW1lZGlhdGVseSByZXR1cm5lZCB0byBNYXJ2ZWxsLiBUaGlzIGNvZGUgaXMgcHJvdmlkZWQgImFzIGlzIi4KKyogTWFydmVsbCBtYWtlcyBubyB3YXJyYW50aWVzLCBleHByZXNzLCBpbXBsaWVkIG9yIG90aGVyd2lzZSwgcmVnYXJkaW5nIGl0cworKiBhY2N1cmFjeSwgY29tcGxldGVuZXNzIG9yIHBlcmZvcm1hbmNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZId3NEZHIzQm9iSy5jCisqCisqIERFU0NSSVBUSU9OOiBERFIzIEJvYksgY29uZmlndXJhdGlvbgorKgorKiBERVBFTkRFTkNJRVM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgREVGSU5FX0dMT0JBTFMKKworI2luY2x1ZGUgIm12RGRyM1RyYWluaW5nSXBTdGF0aWMuaCIKKyNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwRmxvdy5oIgorI2luY2x1ZGUgIm12RGRyVHJhaW5pbmdJcERiLmgiCisjaW5jbHVkZSAibXZEZHIzVHJhaW5pbmdJcC5oIgorI2luY2x1ZGUgIm12RGRyM1RyYWluaW5nSXBEZWYuaCIKKyNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwUHJ2SWYuaCIKKyNpbmNsdWRlICJtdkRkcjNMb2dnaW5nRGVmLmgiCisjaW5jbHVkZSAibXZId3NEZHIzQm9iSy5oIgorI2lmICFkZWZpbmVkKENQU1NfQlVJTEQpCisjaW5jbHVkZSAiZGRyM19tc3lzX2JvYmsuaCIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBCT0JLX05VTV9CWVRFUyAgICAgICAgICAgICAgICAgICAoMykKKworI2RlZmluZSBCT0JLX0NMSUVOVF9GSUVMRChjbGllbnQpCQkoY2xpZW50IDw8IDE1KQorI2RlZmluZSBCT0JLX0dFVF9DTElFTlRfRklFTEQoaW50ZXJmYWNlQWNjZXNzLGludGVyZmFjZUlkKSAoKGludGVyZmFjZUFjY2VzcyA9PSBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QpID8gQk9CS19DTElFTlRfRklFTEQoTVVMVElDQVNUX0lEKTpCT0JLX0NMSUVOVF9GSUVMRChpbnRlcmZhY2VJZCkpCisjZGVmaW5lIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIGludGVyZmFjZUFjY2VzcywgcmVnYWRkcikgICAocmVnYWRkcisgWFNCX0JBU0VfQUREUiArIEJPQktfR0VUX0NMSUVOVF9GSUVMRChpbnRlcmZhY2VBY2Nlc3MsaW50ZXJmYWNlTWFwW2ludGVyZmFjZUlkXS5jbGllbnQpKQorCisjaWYgZGVmaW5lZChDUFNTX0JVSUxEKQorCisjZGVmaW5lIFJFR19ERVZJQ0VfU0FSMF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgMHhGODIwMAorI2RlZmluZSBSRUdfREVWSUNFX1NBUjFfQUREUiAgICAgICAgICAgICAgICAgICAgICAgIDB4RjgyMDQKKyNkZWZpbmUgUkVHX0RFVklDRV9TQVIxX09WRVJSSURFX0FERFIgICAgICAgICAgICAgICAweEY4MkQ4CisjZGVmaW5lIFBMTDBfQ05GSUdfT0ZGU0VUICAgICAgICAgCQkJCQkyMQorI2RlZmluZSBQTEwwX0NORklHX01BU0sgICAgICAgICAgIAkJCQkJMHg3CisjZGVmaW5lIFBMTDFfQ05GSUdfT0ZGU0VUICAgICAgICAgCQkJCQkxOAorI2RlZmluZSBQTEwxX0NORklHX01BU0sgICAgICAgICAgIAkJCQkJMHg3CisKKyNkZWZpbmUgQ1NfQ0JFX1ZBTFVFKGNzTnVtKSAgIChjc0NiZVJlZ1tjc051bV0pCisjZW5kaWYKKworI2RlZmluZSBCT0JLX0NMSUVOVF9NQVBQSU5HKGludGVyZmFjZUlkLCByZWdhZGRyKSAoKHJlZ2FkZHIgPDwgMikrIENMSUVOVF9CQVNFX0FERFIgKyBCT0JLX0NMSUVOVF9GSUVMRChpbnRlcmZhY2VNYXBbaW50ZXJmYWNlSWRdLmNsaWVudCkpCisKKyNkZWZpbmUgVE1fUExMX1JFR19EQVRBKGEsYixjKSAgKChhIDw8IDEyKSArIChiIDw8IDgpICsgKGMgPDwgMikpCisjZGVmaW5lIFJfTU9EX1cod3JpdGVEYXRhLHJlYWREYXRhLG1hc2spICgod3JpdGVEYXRhICYgbWFzaykgfCAocmVhZERhdGEgJiAofm1hc2spKSkKKworI2RlZmluZSBDRVRVU19ERVZfSUQgICAweEJFMDAKKyNkZWZpbmUgQ0FFTFVNX0RFVl9JRCAgMHhCQzAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBwcmUtZGVjbGFyYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgR1RfU1RBVFVTIGRkcjNUaXBCb2JLR2V0TWVkaXVtRnJlcQorKAorICAgIEdUX1UzMiAgICAgICAgICBkZXZOdW0sCisJR1RfVTMyCQkJaW50ZXJmYWNlSWQsCisgICAgTVZfSFdTX0REUl9GUkVRICpmcmVxCispOworCitHVF9TVEFUVVMgICAgZGRyM1RpcEJvYktFeHRSZWFkCisoCisgICAgR1RfVTMyICAgICAgZGV2TnVtLAorICAgIEdUX1UzMiAgICAgIGludGVyZmFjZUlkLAorICAgIEdUX1UzMiAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgbnVtT2ZCdXJzdHMsCisgICAgR1RfVTMyICAgICAgKmRhdGEKKyk7CisKK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS0V4dFdyaXRlCisoCisgICAgR1RfVTMyICAgICAgZGV2TnVtLAorICAgIEdUX1UzMiAgICAgIGludGVyZmFjZUlkLAorICAgIEdUX1UzMiAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgbnVtT2ZCdXJzdHMsCisgICAgR1RfVTMyICAgICAgKmRhdGEKKyk7CisKK0dUX1NUQVRVUyBkZHIzVGlwQm9iS1NldERpdmlkZXIKKygKKwlHVF9VOAkJCQkJCQlkZXZOdW0sCisJR1RfVTMyICAgICAgICAgICAgICAgIAkJCWludGVyZmFjZUlkLAorICAgIE1WX0hXU19ERFJfRlJFUSAgICAgICAgICAgICAgICAgZnJlcQorKTsKKworc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwVG1TZXREaXZpZGVyCisoCisJR1RfVTgJCQkJCQkJZGV2TnVtLAorCUdUX1UzMiAgICAgICAgICAgICAgICAJCQlpbnRlcmZhY2VJZCwKKyAgICBNVl9IV1NfRERSX0ZSRVEgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeQorKTsKKworc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwQ3B1U2V0RGl2aWRlcgorKAorCUdUX1U4CQkJCQkJCWRldk51bSwKKwlHVF9VMzIgICAgICAgICAgICAgICAgCQkJaW50ZXJmYWNlSWQsCisgICAgTVZfSFdTX0REUl9GUkVRICAgICAgICAgICAgICAgICBmcmVxdWVuY3kKKyk7CisKK0dUX1NUQVRVUyBkZHIzQm9iS1VwZGF0ZVRvcG9sb2d5TWFwCisoCisgICAgR1RfVTMyIGRldk51bSwKKyAgICBNVl9IV1NfVE9QT0xPR1lfTUFQKiB0b3BvbG9neU1hcAorKTsKKworR1RfU1RBVFVTIGRkcjNUaXBCb2JLR2V0SW5pdEZyZXEKKygKKyAgICBHVF9VOCAgICAgICAJZGV2TnVtLAorCUdUX1UzMgkJCWludGVyZmFjZUlkLAorICAgIE1WX0hXU19ERFJfRlJFUSogZnJlcQorKTsKKworc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwVG1HZXRJbml0RnJlcQorKAorICAgIEdUX1NUQVRVUyAgICAgICBkZXZOdW0sCisgICAgTVZfSFdTX0REUl9GUkVRICpmcmVxCispOworCitzdGF0aWMgR1RfU1RBVFVTIGRkcjNUaXBDcHVHZXRJbml0RnJlcQorKAorICAgIEdUX1NUQVRVUyAgICAgICBkZXZOdW0sCisgICAgTVZfSFdTX0REUl9GUkVRICpmcmVxCispOworCitHVF9TVEFUVVMgICAgZGRyM1RpcEJvYktSZWFkCisoCisgICAgR1RfVTggICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIG1hc2sKKyk7CisKK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS1dyaXRlCisoCisgICAgR1RfVTggICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgZGF0YVZhbHVlLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrCispOworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLSUZSZWFkCisoCisgICAgR1RfVTggICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgICAgaW50ZXJmYWNlQWNjZXNzLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIG1hc2sKKyk7CisKK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS0lGV3JpdGUKKygKKyAgICBHVF9VOCAgICAgICAgICAgICAgICAgZGV2TnVtLAorICAgIE1WX0hXU19BQ0NFU1NfVFlQRSAgICBpbnRlcmZhY2VBY2Nlc3MsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIGludGVyZmFjZUlkLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBkYXRhVmFsdWUsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIG1hc2sKKyk7CisKK0dUX1NUQVRVUyBkZHIzVGlwQm9iS0lzZkFjY2Vzc0RvbmUKKygKKyAgICBHVF9VMzIgZGV2TnVtLAorICAgIEdUX1UzMiBpbnRlcmZhY2VJZAorKTsKKworR1RfU1RBVFVTIGRkcjNUaXBCb2JLR2V0RGV2aWNlSW5mbworKAorCUdUX1U4ICAgICAgZGV2TnVtLAorCU1WX0REUjNfREVWSUNFX0lORk8gKiBpbmZvUHRyCispOworCitHVF9TVEFUVVMgICAgZGRyM1RpcEJvYktUTVdyaXRlCisoCisgICAgR1RfVTggICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgICAgaW50ZXJmYWNlQWNjZXNzLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgZGF0YVZhbHVlLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrCispOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEdsb2JhbHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gR1RfVTMyIG1hc2tUdW5lRnVuYzsKK2V4dGVybiBHVF9VMzIgZnJlcVZhbFtdOworZXh0ZXJuIE1WX0hXU19ERFJfRlJFUSBtZWRpdW1GcmVxOworZXh0ZXJuIE1WX0hXU19UT1BPTE9HWV9NQVAgKnRvcG9sb2d5TWFwOworZXh0ZXJuIEdUX1UzMiBmaXJzdEFjdGl2ZUlmOworZXh0ZXJuIE1WX0hXU19ERFJfRlJFUSBpbml0RnJlcTsKK2V4dGVybiBHVF9VMzIgZGZzTG93RnJlcTsKK2V4dGVybiBHVF9VMzIgZGZzTG93UGh5MTsKK2V4dGVybiBHVF9VMzIgIFBoeVJlZzFWYWw7CitleHRlcm4gR1RfVTMyIGlzUGxsQmVmb3JlSW5pdDsKK2V4dGVybiBHVF9VMzIgdXNlQnJvYWRjYXN0OworZXh0ZXJuIEdUX1UzMiBpc0NiZVJlcXVpcmVkOworZXh0ZXJuIEdUX1UzMiBkZWxheUVuYWJsZSwgY2tEZWxheSxjYURlbGF5OworZXh0ZXJuIEdUX1U4IGRlYnVnVHJhaW5pbmdBY2Nlc3M7CitleHRlcm4gR1RfVTggY2FsaWJyYXRpb25VcGRhdGVDb250cm9sOyAvKjIgZXh0ZXJuYWwgb25seSwgMSBpcyBpbnRlcm5hbCBvbmx5Ki8KK2V4dGVybiBHVF9VMzIgZGZzTG93RnJlcTsKKworR1RfVTMyIGRlYnVnQm9iSyA9IDA7CitHVF9VMzIgIHBpcGVNdWx0aWNhc3RNYXNrOworCisjaWYgZGVmaW5lZChDUFNTX0JVSUxEKQorc3RhdGljIEdUX1UzMiBjc0NiZVJlZ1tdPQoreworICAgIDB4RSAsIDB4RCwgMHhCLCAweDcsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CisKK0dUX1UzMiBkZXZJZCwgaHdEZHJJZk1hc2ssIGh3TWF4RGRySWZOdW07CisKK3N0YXRpYyBNVl9ERlhfQUNDRVNTIGludGVyZmFjZU1hcFtdID0KK3sKKwkvKiBQaXBlCUNsaWVudCovCisJeyAgIDAsCSAxNiB9LAorCXsgICAzLAkgMTgJfSwKKwl7ICAgMSwJIDEwIH0sCisJeyAgIDMsCSAxCX0sCisgICAgeyAgIDAsCSAwCX0gLyogaW4gQk9CSyBpbnRlcmZhY2UgNCBkb2Vzbid0IGJlbG9uZyB0byBUTSovCit9OworI2VuZGlmCitzdGF0aWMgR1RfVTggYm9iS0J3UGVyRnJlcVtERFJfRlJFUV9MSU1JVF0gPQoreworICAgIDB4MywgLypERFJfRlJFUV9MT1dfRlJFUSovCisgICAgMHg0LCAvKkREUl9GUkVRXzQwMCovCisgICAgMHg0LCAvKkREUl9GUkVRXzUzMyovCisgICAgMHg1LCAvKkREUl9GUkVRXzY2NyovCisgICAgMHg1LCAvKkREUl9GUkVRXzgwMCovCisgICAgMHg1LCAvKkREUl9GUkVRXzkzMywqLworICAgIDB4NSwgLypERFJfRlJFUV8xMDY2Ki8KKyAgICAweDMsIC8qRERSX0ZSRVFfMzExKi8KKyAgICAweDMsIC8qRERSX0ZSRVFfMzMzKi8KKyAgICAweDQsICAvKkREUl9GUkVRXzQ2NyovCisgICAgMHg1LCAvKkREUl9GUkVRXzg1MCovCisgICAgMHg1LCAgLypERFJfRlJFUV82MDAqLworICAgIDB4MywgIC8qRERSX0ZSRVFfMzAwKi8KKwkweDUsIC8qRERSX0ZSRVFfOTAwKi8KKwkweDMgLypERFJfRlJFUV8zNjAqLworfTsKKworc3RhdGljIEdUX1U4IGJvYktSYXRlUGVyRnJlcVtERFJfRlJFUV9MSU1JVF0gPQoreworICAgMHgxLCAvKkREUl9GUkVRX0xPV19GUkVRLCovCisgICAweDIsIC8qRERSX0ZSRVFfNDAwLCovCisgICAweDIsIC8qRERSX0ZSRVFfNTMzLCovCisgICAweDIsIC8qRERSX0ZSRVFfNjY3LCovCisgICAweDIsIC8qRERSX0ZSRVFfODAwLCovCisgICAweDMsIC8qRERSX0ZSRVFfOTMzLCovCisgICAweDMsIC8qRERSX0ZSRVFfMTA2NiwqLworICAgMHgxLCAvKkREUl9GUkVRXzMxMSovCisgICAweDEsIC8qRERSX0ZSRVFfMzMzKi8KKyAgIDB4MiwgLypERFJfRlJFUV80NjcqLworICAgMHgyLCAvKkREUl9GUkVRXzg1MCovCisgICAweDIsIC8qRERSX0ZSRVFfNjAwKi8KKyAgIDB4MSwgLypERFJfRlJFUV8zMDAqLworICAgMHgzLCAgLypERFJfRlJFUV85MDAqLworICAgMHgxICAvKkREUl9GUkVRXzM2MCovCit9OworCisvKiBCaXQgbWFwcGluZyAoZm9yIFBCUykgKi8KK0dUX1UzMiBib2JLRFFiaXRNYXAyUGh5cGluW10gPQoreworLyojd2FybmluZyAiRFEgbWFwcGluZyBpcyB1cGRhdGVkIGZvciBJbnRlcmZhY2UgMCBhbmQgNCBvbmx5ISIgISEhKi8KKwkgICAgLyogSW50ZXJmYWNlIDAgKi8KKyAgICAgICAgMiwwLDMsOSw3LDgsNiwxICwgLyogZHFbMDo3XSAgICovCisgICAgICAgIDMsMiwxLDYsMCw5LDcsOCAsIC8qIGRxWzg6MTVdICAqLworICAgICAgICA5LDYsMywyLDEsNywwLDggLCAvKiBkcVsxNjoyM10gKi8KKyAgICAgICAgMywxLDcsMiwwLDgsOSw2ICwgLyogZHFbMjQ6MzFdICovCisgICAgICAgIDAsMCwwLDAsMCwwLDAsMCAsIC8qIGRxW0VDQ10gICAqLworCisJICAgIC8qIEludGVyZmFjZSAxICovCisJICAgIDksMCw3LDIsOCw2LDMsMSAsIC8qIGRxWzA6N10gICAqLworCSAgICA5LDAsMSw2LDgsMywyLDcgLCAvKiBkcVs4OjE1XSAgKi8KKwkgICAgMCw3LDEsOSw2LDIsMyw4ICwgLyogZHFbMTY6MjNdICovCisJICAgIDksMCw4LDMsNyw2LDIsMSAsIC8qIGRxWzI0OjMxXSAqLworICAgICAgICAwLDAsMCwwLDAsMCwwLDAgLCAvKiBkcVtFQ0NdICAgKi8KKworCSAgICAvKiBJbnRlcmZhY2UgMiAqLworCSAgICAwLDAsMCwwLDAsMCwwLDAgLCAvKiBkcVswOjddICAgKi8KKwkgICAgMCwwLDAsMCwwLDAsMCwwICwgLyogZHFbODoxNV0gICovCisJICAgIDAsMCwwLDAsMCwwLDAsMCAsIC8qIGRxWzE2OjIzXSAqLworCSAgICAwLDAsMCwwLDAsMCwwLDAgLCAvKiBkcVsyNDozMV0gKi8KKyAgICAgICAgMCwwLDAsMCwwLDAsMCwwICwgLyogZHFbRUNDXSAgICovCisKKwkgICAgLyogSW50ZXJmYWNlIDMgKi8KKwkgICAgNiwyLDgsOSwwLDEsNywzICwgLyogZHFbMDo3XSAgICovCisJICAgIDEsMyw3LDksMCwyLDgsNiAsIC8qIGRxWzg6MTVdICAqLworCSAgICAyLDAsNywxLDgsOSw2LDMgLCAvKiBkcVsxNjoyM10gKi8KKwkgICAgMSw2LDgsMiwwLDcsMyw5ICwgLyogZHFbMjQ6MzFdICovCisgICAgICAgIDAsMCwwLDAsMCwwLDAsMCAsIC8qIGRxW0VDQ10gICAqLworCisgICAgICAgIC8qIEludGVyZmFjZSA0ICovCisJICAgIDEsOSw4LDMsMCw3LDIsNiAsIC8qIGRxWzA6N10gICAqLworCSAgICAzLDIsOCwxLDksNiw3LDAgLCAvKiBkcVs4OjE1XSAgKi8KKwkgICAgMCw2LDIsMSw5LDMsOCw3ICwgLyogZHFbMTY6MjNdICovCisJICAgIDAsNiwxLDgsMyw5LDcsMiAsIC8qIGRxWzI0OjMxXSAqLworICAgICAgICAwLDEsMiwzLDYsNyw4LDkgICAvKiBkcVtFQ0NdICAgKi8KK307CisKKyNpZiBkZWZpbmVkKENQU1NfQlVJTEQpCisKK01WX0hXU19UT1BPTE9HWV9NQVAgYm9iS1RvcG9sb2d5TWFwW10gPQoreworICAgIC8qIDFzdCBib2FyZCAgLSBDRVRVUyovCisgICAgeworICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyB7ICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwxLDAsMH0sIHsweDIsMSwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9IH0sCisgICAgMHhGICAvKiBCdXNlcyBtYXNrICovCisgICAgfSwKKyAgICAvKiAybmQgYm9hcmQgIC0gQ2FlbHVtKi8KKyAgICB7CisgICAgMHhCLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworIHsgIHt7ezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gfSwKKyAgICAweEYgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICB9Cit9OworI2VuZGlmCisKK3N0YXRpYyBHVF9VOCAgICBkZHIzVGlwQ2xvY2tNb2RlKCBHVF9VMzIgZnJlcXVlbmN5ICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBTZXJ2ZXIgQWNjZXNzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dUX1NUQVRVUyBkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlCisoCisJR1RfVTMyIGRldk51bSwKKwlHVF9VMzIgcmVnQWRkciwKKwlHVF9VMzIgZGF0YVZhbHVlCispCit7CisjaWZkZWYgQVNJQ19TSU1VTEFUSU9OCisgICAgLyogYXZvaWQgd2FybmluZ3MgKi8KKyAgICBkZXZOdW0gPSBkZXZOdW07CisgICAgcmVnQWRkciA9IHJlZ0FkZHI7CisgICAgZGF0YVZhbHVlID0gZGF0YVZhbHVlOworCisJcmV0dXJuIEdUX09LOworI2Vsc2UKKwlyZXR1cm4gaHdzU2VydmVyUmVnU2V0RnVuY1B0cihkZXZOdW0sIHJlZ0FkZHIsIGRhdGFWYWx1ZSk7CisjZW5kaWYKK30KKworR1RfU1RBVFVTIGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZAorKAorCUdUX1UzMiBkZXZOdW0sCisJR1RfVTMyIHJlZ0FkZHIsCisJR1RfVTMyICpkYXRhVmFsdWUsCisJR1RfVTMyIHJlZ01hc2sKKykKK3sKKyNpZmRlZiBBU0lDX1NJTVVMQVRJT04KKyAgICAvKiBhdm9pZCB3YXJuaW5ncyAqLworICAgIGRldk51bSA9IGRldk51bTsKKyAgICByZWdBZGRyID0gcmVnQWRkcjsKKyAgICByZWdNYXNrID0gcmVnTWFzazsKKworCSpkYXRhVmFsdWUgPSAwOworI2Vsc2UKKwlod3NTZXJ2ZXJSZWdHZXRGdW5jUHRyKGRldk51bSwgcmVnQWRkciwgZGF0YVZhbHVlKTsKKworCisJKmRhdGFWYWx1ZSAgPSAqZGF0YVZhbHVlICYgcmVnTWFzazsKKyNlbmRpZgorCXJldHVybiBHVF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0dUX1NUQVRVUyBkZHIzVGlwQm9iS0dldEZyZXFDb25maWcKKygKKwlHVF9VOAkJCQkJCQlkZXZOdW0sCisgICAgTVZfSFdTX0REUl9GUkVRICAgICAgICAgICAgICAgICBmcmVxLAorCU1WX0hXU19USVBfRlJFUV9DT05GSUdfSU5GTwkJKmZyZXFDb25maWdJbmZvCispCit7CisgICAgZGV2TnVtID0gZGV2TnVtOyAvKiBhdm9pZCB3YXJuaW5ncyAqLworCisgICAgaWYgKGJvYktCd1BlckZyZXFbZnJlcV0gPT0gMHhmZikKKyAgICB7CisgICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIGlmIChmcmVxQ29uZmlnSW5mbyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKKyAgICB9CisKKyAgICBmcmVxQ29uZmlnSW5mby0+YndQZXJGcmVxID0gYm9iS0J3UGVyRnJlcVtmcmVxXTsKKyAgICBmcmVxQ29uZmlnSW5mby0+cmF0ZVBlckZyZXEgPSBib2JLUmF0ZVBlckZyZXFbZnJlcV07CisKKyAgICBmcmVxQ29uZmlnSW5mby0+aXNTdXBwb3J0ZWQgPSBHVF9UUlVFOworCisgICAgcmV0dXJuIEdUX09LOworfQorI2lmIGRlZmluZWQoQ1BTU19CVUlMRCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRW5hYmxlIFBpcGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBHVF9TVEFUVVMgICAgZGRyM1RpcFBpcGVFbmFibGUKKygKKyAgICBHVF9VOCAgICAgICAgICAgICAgICAgZGV2TnVtLAorICAgIE1WX0hXU19BQ0NFU1NfVFlQRSAgICBpbnRlcmZhY2VBY2Nlc3MsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIGludGVyZmFjZUlkLAorICAgIEdUX0JPT0wgICAgICAgICAgICAgICBlbmFibGUKKykKK3sKKyAgICBHVF9VMzIgZGF0YVZhbHVlPTAsIHBpcGVFbmFibGVNYXNrID0gMDsKKworCisgICAgaWYgKGVuYWJsZSA9PSBHVF9GQUxTRSkKKyAgICB7CisgICAgICAgIHBpcGVFbmFibGVNYXNrID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICBpZiAoaW50ZXJmYWNlQWNjZXNzID09IEFDQ0VTU19UWVBFX01VTFRJQ0FTVCkKKyAgICAgICAgeworICAgICAgICAgICAgcGlwZUVuYWJsZU1hc2sgPSBwaXBlTXVsdGljYXN0TWFzazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBpcGVFbmFibGVNYXNrID0gKDEgPDwgaW50ZXJmYWNlTWFwW2ludGVyZmFjZUlkXS5waXBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgUElQRV9FTkFCTEVfQUREUiwgJmRhdGFWYWx1ZSwgTUFTS19BTExfQklUUykpOworICAgIGRhdGFWYWx1ZSA9IChkYXRhVmFsdWUgJiAofjB4RkYpKSB8IHBpcGVFbmFibGVNYXNrOworICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgUElQRV9FTkFCTEVfQUREUiwgZGF0YVZhbHVlKSk7CisgICAgcmV0dXJuIEdUX09LOworfQorCitzdGF0aWMgdm9pZCBkZHIzVGlwSXNVbmljYXN0QWNjZXNzKCBHVF9VOCBkZXZOdW0sR1RfVTMyKiBpbnRlcmZhY2VJZCwgTVZfSFdTX0FDQ0VTU19UWVBFKiBpbnRlcmZhY2VBY2Nlc3MpCit7CisJR1RfVTMyIGluZGV4Q250LCB0b3RhbENudCA9IDAgLCBpbnRlcmZhY2VUbXAgPSAwOworICAgIE1WX0hXU19UT1BPTE9HWV9NQVAgKnRvcG9sb2d5TWFwID0gZGRyM1RpcEdldFRvcG9sb2d5TWFwKGRldk51bSk7CisKKwlpZiAoKmludGVyZmFjZUFjY2VzcyA9PSBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QpCisJeworCQlmb3IoaW5kZXhDbnQgPSAwOyBpbmRleENudCA8IE1BWF9JTlRFUkZBQ0VfTlVNOyBpbmRleENudCsrKQorCQl7CisJCQlpZiAoSVNfSU5URVJGQUNFX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW5kZXhDbnQpICE9ICAwKQorCQkJeworCQkJCXRvdGFsQ250Kys7CisJCQkJaW50ZXJmYWNlVG1wID0gaW5kZXhDbnQ7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKHRvdGFsQ250ID09IDEpIHsKKwkJCSppbnRlcmZhY2VBY2Nlc3MgPSBBQ0NFU1NfVFlQRV9VTklDQVNUOworCQkJKmludGVyZmFjZUlkID0gaW50ZXJmYWNlVG1wOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBkZHIzVGlwQm9iS1NlbGVjdFRNRGRyQ29udHJvbGxlci4KKyogRGVzYzogICAgIEVuYWJsZS9EaXNhYmxlIGFjY2VzcyB0byBNYXJ2ZWxsJ3Mgc2VydmVyLgorKiBBcmdzOiAgICAgZGV2TnVtICAgICAtIGRldmljZSBudW1iZXIKKyogICAgICAgICAgIGVuYWJsZSAgICAgICAgLSB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzZXJ2ZXIKKyogTm90ZXM6CisqIFJldHVybnM6ICBHVF9PSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLU2VsZWN0VE1EZHJDb250cm9sbGVyCisoCisgICAgR1RfVTggICAgZGV2TnVtLAorICAgIEdUX0JPT0wgIGVuYWJsZQorKQoreworICAgIEdUX1UzMiBpbnRlcmZhY2VJZCA9IDAsIGRhdGFWYWx1ZSA9IDA7CisjaWZuZGVmIEFTSUNfU0lNVUxBVElPTgorICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCAweDAwMEY4MjQwICwgICZkZXZJZCwgTUFTS19BTExfQklUUykpOworI2Vsc2UKKyAgICBkZXZJZCA9IDB4QkMwMDsgLyogQ0FFTFVNX0RFVl9JRCAqLworI2VuZGlmCisgICAgaWYgKChkZXZJZCAmIDB4RkZGRikgPT0gQ0VUVVNfREVWX0lEICkKKyAgICB7CisgICAgICAgIC8qIElOIENldHVzIFRNIGhhcyBvbmx5IDEgSUYgIzAqLworICAgICAgICBod01heERkcklmTnVtID0gMTsKKyAgICAgICAgaHdEZHJJZk1hc2sgICA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKChkZXZJZCAmMHhGRkZGKSA9PSBDQUVMVU1fREVWX0lEICkKKyAgICB7CisgICAgICAgIC8qIGluIENhZWx1bSBUTSBtYXkgdXNlIDMgSUZzIDAsMSxhbmQgMyovCisgICAgICAgIGh3TWF4RGRySWZOdW0gPSA0OworICAgICAgICBod0RkcklmTWFzayAgID0gMHhCOworICAgIH0KKyAgICBlbHNlCisgICAgICAgICAgbXZQcmludGYgKCJVbnN1cHBvcnRlZCBkZXZpY2UgSUQgJXhcbiIsIGRldklkKTsKKworICAgIGZvciAoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8IGh3TWF4RGRySWZOdW07IGludGVyZmFjZUlkKyspCisJeworICAgICAgICBpZihJU19JTlRFUkZBQ0VfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkgPT0gIDApLyogaWYgdGhlIGludGVyZmFjZSBkb2VzbnQgZXhpeHN0IGluIEhXIDoqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGVsc2UgLyogaW50ZXJmYWNlIGV4aXN0IGluIEhXKi8KKyAgICAgICAgeworICAgICAgICAgICAgZGRyM1RpcFBpcGVFbmFibGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgR1RfVFJVRSk7CisJCQlpZiAoSVNfSU5URVJGQUNFX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpID09ICAwKQorCQkJeworCQkJCSAvKmRpc2FibGUgaW4tYWN0aXZlIGludGVyZmFjZXMgKHNvIHRoZXkgd29uJ3QgYmUgYWNjZXNzZWQgdXBvbiBtdWx0aWNhc3QpKi8KKwkJCQlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgQk9CS19DTElFTlRfTUFQUElORyhpbnRlcmZhY2VJZCwgQ0xJRU5UX0NUUkxfUkVHKSwgJmRhdGFWYWx1ZSwgTUFTS19BTExfQklUUykpOworCQkJCWRhdGFWYWx1ZSAmPSB+MHg0MDsKKwkJCQlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfQ0xJRU5UX01BUFBJTkcoaW50ZXJmYWNlSWQsIENMSUVOVF9DVFJMX1JFRyksIGRhdGFWYWx1ZSkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJCS8qIEVuYWJsZSByZWxldmFudCBQaXBlICovCisJCQlwaXBlTXVsdGljYXN0TWFzayB8PSAoMSA8PCBpbnRlcmZhY2VNYXBbaW50ZXJmYWNlSWRdLnBpcGUpOworCQkJLyogbXVsdGljYXN0IE1hY3JvIGlzIHN1YnNjcmliZWQgdG8gTXVsdGljYXN0IDB4MUQgKi8KKwkJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCBCT0JLX0NMSUVOVF9NQVBQSU5HKGludGVyZmFjZUlkLCBDTElFTlRfQ1RSTF9SRUcpLCAmZGF0YVZhbHVlLCBNQVNLX0FMTF9CSVRTKSk7CisJCQlkYXRhVmFsdWUgfD0gMHg0MDsKKwkJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgQk9CS19DTElFTlRfTUFQUElORyhpbnRlcmZhY2VJZCwgQ0xJRU5UX0NUUkxfUkVHKSwgZGF0YVZhbHVlKSk7CisKKwkJCWRkcjNUaXBQaXBlRW5hYmxlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEdUX0ZBTFNFKTsKKworCQl9CisgICAgfQorCQkvKiBlbmFibGUgYWNjZXNzIHRvIHJlbGV2YW50IHBpcGVzIChhY2NvcmRpbmcgdG8gdGhlIHBpcGUgbWFzaykgKi8KKwlkZHIzVGlwUGlwZUVuYWJsZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEdUX1RSVUUpOworCisgICBpZiAoZW5hYmxlKQorICAgIHsKKyAgICAgICAvKiBFbmFibGUgRERSIFR1bmluZyAqLworCisgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1RNV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBSRUFEX0JVRkZFUl9TRUxFQ1RfUkVHLCAgMHg4MDAwLCBNQVNLX0FMTF9CSVRTKSk7CisgICAgICAgIC8qIGNvbmZpZ3VyZSBkdXBsaWNhdGUgQ1MgKi8KKwkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLVE1Xcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIENTX0VOQUJMRV9SRUcsICAweDRBLypIYWltIDB4NDIqLywgTUFTS19BTExfQklUUykpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBEaXNhYmxlIEREUiBUdW5pbmcgU2VsZWN0ICovCisgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1RNV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBDU19FTkFCTEVfUkVHLCAgMHgyLCBNQVNLX0FMTF9CSVRTKSk7CisgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1RNV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBSRUFEX0JVRkZFUl9TRUxFQ1RfUkVHLCAwLE1BU0tfQUxMX0JJVFMpKTsKKyAgIH0KKyAgIHJldHVybiBHVF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDaGVjayBpZiBEdW5pdCBhY2Nlc3MgaXMgZG9uZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitHVF9TVEFUVVMgICAgZGRyM1RpcEJvYktJc0FjY2Vzc0RvbmUKKygKKyAgICBHVF9VOCBkZXZOdW0sCisgICAgR1RfMzIgaW50ZXJmYWNlSWQKKykKK3sKKyAgICBHVF9VMzIgcmREYXRhID0gMSwgY250ID0gMDsKKworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBYU0JfQ01EX1JFRyksICZyZERhdGEsIE1BU0tfQUxMX0JJVFMpKTsKKwlyZERhdGEgJj0gMTsKKworCXdoaWxlKHJkRGF0YSAhPSAwKQorICAgIHsKKwkJaWYgKGNudCsrID49IE1BWF9QT0xMSU5HX0lURVJBVElPTlMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZChkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIFhTQl9DTURfUkVHKSwgJnJkRGF0YSwgTUFTS19BTExfQklUUykpOworICAgICAgICByZERhdGEgJj0gMTsKKyNpZmRlZiBBU0lDX1NJTVVMQVRJT04KKyAgICAgICAgcmREYXRhID0gMDsvKiBubyBtb3JlIGl0ZXJhdGlvbnMgbmVlZGVkICovCisjZW5kaWYgLypBU0lDX1NJTVVMQVRJT04qLworICAgIH0KKyAgICBpZiAoY250IDwgTUFYX1BPTExJTkdfSVRFUkFUSU9OUykKKyAgICB7CisJCXJldHVybiBHVF9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0lORk8sKCJBY2Nlc3NEb25lIGZhaWw6IGlmID0gJWRcbiIsaW50ZXJmYWNlSWQpKTsKKyAgICAgICAgcmV0dXJuIEdUX0ZBSUw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLVE1SZWFkCisoCisgICAgR1RfVTggICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgICAgaW50ZXJmYWNlQWNjZXNzLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIG1hc2sKKykKK3sKKyAgICBHVF9VMzIgZGF0YVZhbHVlID0gMCwgc3RhcnRJZiwgZW5kSWY7CisgICAgTVZfSFdTX1RPUE9MT0dZX01BUCAqdG9wb2xvZ3lNYXAgPSBkZHIzVGlwR2V0VG9wb2xvZ3lNYXAoZGV2TnVtKTsKKworICAgCWRkcjNUaXBJc1VuaWNhc3RBY2Nlc3MoZGV2TnVtLCAmaW50ZXJmYWNlSWQsICZpbnRlcmZhY2VBY2Nlc3MpOworCisgICAgaWYgKGludGVyZmFjZUFjY2VzcyA9PSBBQ0NFU1NfVFlQRV9VTklDQVNUKQorICAgIHsKKyAgICAgICAgc3RhcnRJZiA9IGludGVyZmFjZUlkOworICAgICAgICBlbmRJZiA9IGludGVyZmFjZUlkOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdGFydElmID0gMDsKKyAgICAgICAgZW5kSWYgPSBNQVhfSU5URVJGQUNFX05VTS0xOworICAgIH0KKworICAgIGZvcihpbnRlcmZhY2VJZCA9IHN0YXJ0SWY7IGludGVyZmFjZUlkIDw9IGVuZElmOyBpbnRlcmZhY2VJZCsrKQorICAgIHsKKyAgICAgICAgaWYgKElTX0lOVEVSRkFDRV9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKSA9PSAgMCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZGRyM1RpcFBpcGVFbmFibGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgR1RfVFJVRSk7CisgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgQk9CS19YU0JfTUFQUElORyhpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgWFNCX0NUUkxfMV9SRUcpICxUUkFJTklOR19JRCkpOworCisgICAgICAgIC8qd29ya2luZyB3aXRoIFhTQiBjbGllbnQgSW50ZXJmYWNlTnVtICBXcml0ZSBJbnRlcmZhY2UgQUREUiBhcyBkYXRhIHRvIFhTQiBhZGRyZXNzIEMqLworICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIFhTQl9BRERSRVNTX1JFRyksIHJlZ0FkZHIpKTsKKyAgICAgICAgZGF0YVZhbHVlID0gKChHVF9VMzIpKFRBUkdFVF9JTlQgPDwgMTkpKSArIChCWVRFX0VOIDw8IDExKSArIChCT0JLX05VTV9CWVRFUyA8PCA0KSArIChDTURfUkVBRCA8PCAyKSArKElOVEVSTkFMX0FDQ0VTU19QT1JUICA8PCAxKSArIEVYRUNVVElORzsKKyAgICAgICAgLypXcml0ZSBJbnRlcmZhY2UgQ09NTUFORCBhcyBkYXRhIHRvIFhTQiBhZGRyZXNzIDggKi8KKyAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBYU0JfQ01EX1JFRyksIGRhdGFWYWx1ZSkpOworCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS0lzQWNjZXNzRG9uZShkZXZOdW0sIGludGVyZmFjZUlkKSk7CisKKwkJLyogY29uc2lkZXIgdGhhdCBpbnB1dCBkYXRhIGlzIGFsd2F5cyBhIHZlY3RvciwgYW5kIGZvciB1bmljYXN0IHRoZSB3cml0aW5nIHdpbGwgYmUgaW4gdGhlIGludGVyZmFjZSBpbmRleCBpbiB2ZWN0b3IgKi8KKyAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZChkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIFhTQl9EQVRBX1JFRyksICZkYXRhW2ludGVyZmFjZUlkXSwgbWFzaykpOworICAgICAgICBpZiAoZGVidWdCb2JLID49IDIpCisgICAgICAgIHsKKwkJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9JTkZPLCAoIkR1bml0UmVhZCAgIDB4JXg6IDB4JXggKG1hc2sgMHgleClcbiIsICByZWdBZGRyLCAgKmRhdGEsIG1hc2spKTsKKyAgICAgICAgfQorICAgICAgICAvKmRkcjNUaXBQaXBlRW5hYmxlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEdUX0ZBTFNFKTsqLworICAgIH0KKyAgICByZXR1cm4gR1RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHVF9TVEFUVVMgICAgZGRyM1RpcEJvYktUTVdyaXRlCisoCisgICAgR1RfVTggICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgICAgaW50ZXJmYWNlQWNjZXNzLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgZGF0YVZhbHVlLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrCispCit7CisgICAgR1RfVTMyIGRhdGFDbWQgPSAwLCB1aURhdGFSZWFkID0gMCwgdWlSZWFkSW50ZXJmYWNlSWQ9MDsKKyAgICBHVF9VMzIgZGF0YVJlYWRbTUFYX0lOVEVSRkFDRV9OVU1dOworCUdUX1UzMiBzdGFydElmLCBlbmRJZjsKKyAgICBNVl9IV1NfVE9QT0xPR1lfTUFQICp0b3BvbG9neU1hcCA9IGRkcjNUaXBHZXRUb3BvbG9neU1hcChkZXZOdW0pOworCisgICAJZGRyM1RpcElzVW5pY2FzdEFjY2VzcyhkZXZOdW0sICZpbnRlcmZhY2VJZCwgJmludGVyZmFjZUFjY2Vzcyk7CisgICAgaWYgKG1hc2sgIT0gTUFTS19BTExfQklUUykKKyAgICB7CisgICAgICAgIC8qIGlmIGFsbCBiaXRzIHNob3VsZCBiZSB3cml0dGVuIHRoZXJlIGlzIG5vIG5lZWQgZm9yIHJlYWQtbW9kaWZ5LXdyaXRlICovCisgICAgICAgIGlmIChpbnRlcmZhY2VBY2Nlc3MgPT0gQUNDRVNTX1RZUEVfTVVMVElDQVNUKQorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEdldEZpcnN0QWN0aXZlSWYoZGV2TnVtLCB0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgJnVpUmVhZEludGVyZmFjZUlkKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB1aVJlYWRJbnRlcmZhY2VJZCA9IGludGVyZmFjZUlkOworICAgICAgICB9CisgICAgICAgIGlmIChkZWJ1Z0JvYksgPj0gMikKKyAgICAgICAgeworICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0lORk8sICgiZGRyM1RpcEJvYktUTVdyaXRlIGFjdGl2ZSBpbnRlcmZhY2UgPSAlZFxuIix1aVJlYWRJbnRlcmZhY2VJZCkpOworICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLVE1SZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgdWlSZWFkSW50ZXJmYWNlSWQscmVnQWRkcixkYXRhUmVhZCxNQVNLX0FMTF9CSVRTKSk7CisgICAgICAgIHVpRGF0YVJlYWQgPSBkYXRhUmVhZFt1aVJlYWRJbnRlcmZhY2VJZF07CisgICAgICAgIGRhdGFWYWx1ZSA9ICh1aURhdGFSZWFkICYgKH5tYXNrKSkgfCAoZGF0YVZhbHVlICYgbWFzayk7CisgICAgfQorICAgIGRkcjNUaXBQaXBlRW5hYmxlKGRldk51bSwgaW50ZXJmYWNlQWNjZXNzLCBpbnRlcmZhY2VJZCwgR1RfVFJVRSk7CisgICAgLyogc2V0IHRoZSBJRCAqLworICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgQk9CS19YU0JfTUFQUElORyhpbnRlcmZhY2VJZCwgaW50ZXJmYWNlQWNjZXNzLCBYU0JfQ1RSTF8xX1JFRykgLCBUUkFJTklOR19JRCkpOworCisgICAgLyp3b3JraW5nIHdpdGggWFNCIG11bHRpY2FzdCBjbGllbnQgLCBXcml0ZSBJbnRlcmZhY2UgQUREUiBhcyBkYXRhIHRvIFhTQiBhZGRyZXNzIEMgKi8KKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIGludGVyZmFjZUFjY2VzcywgWFNCX0FERFJFU1NfUkVHKSwgcmVnQWRkcikpOworICAgIC8qV3JpdGUgSW50ZXJmYWNlIERBVEEgYXMgZGF0YSB0byBYU0IgYWRkcmVzcyAweDEwLiovCisgICAgaWYgKGRlYnVnQm9iSyA+PSAxKQorICAgIHsKKyAgICAgICAgREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0lORk8sICgiRHVuaXQgV3JpdGU6IGludGVyZmFjZSAlZCAgYWNjZXNzICVkIEFkZHJlc3MgMHgleCBEYXRhIDB4JXhcbiIsIGludGVyZmFjZUlkLCBpbnRlcmZhY2VBY2Nlc3MsIHJlZ0FkZHIsIGRhdGFWYWx1ZSkpOworICAgIH0KKwlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIGludGVyZmFjZUFjY2VzcywgWFNCX0RBVEFfUkVHKSwgIGRhdGFWYWx1ZSkpOworICAgIGRhdGFDbWQgPSAoKEdUX1UzMikoVEFSR0VUX0lOVCA8PCAxOSkpICsgKEJZVEVfRU4gPDwgMTEpICsgKEJPQktfTlVNX0JZVEVTIDw8IDQpICsgIChDTURfV1JJVEUgPDwgMikgKyAoSU5URVJOQUxfQUNDRVNTX1BPUlQgPDwgMSk7CisgICAgLypXcml0ZSBJbnRlcmZhY2UgQ09NTUFORCBhcyBkYXRhIHRvIFhTQiBhZGRyZXNzIDgKKyAgICAgIEV4ZWN1dGUgYW4gaW50ZXJuYWwgd3JpdGUgdG8geEJhciBwb3J0MSAqLworICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgQk9CS19YU0JfTUFQUElORyhpbnRlcmZhY2VJZCwgaW50ZXJmYWNlQWNjZXNzLCBYU0JfQ01EX1JFRyksIGRhdGFDbWQpKTsKKwlkYXRhQ21kIHw9IEVYRUNVVElORzsKKwlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIGludGVyZmFjZUFjY2VzcywgWFNCX0NNRF9SRUcpLCBkYXRhQ21kKSk7CisKKwkgLypjaGVjayB0aGF0IHdyaXRlIGlzIGNvbXBsZXRlZDsgdGhlIHRlc3Qgc2hvdWxkIGJlIGRvbmUgcGVyIGludGVyZmFjZSAqLworCWlmIChpbnRlcmZhY2VBY2Nlc3MgPT0gQUNDRVNTX1RZUEVfTVVMVElDQVNUKQorICAgIHsKKyAgICAgICAgc3RhcnRJZiA9IDA7CisgICAgICAgIGVuZElmID0gaHdNYXhEZHJJZk51bS0xOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdGFydElmID0gaW50ZXJmYWNlSWQ7CisgICAgICAgIGVuZElmID0gaW50ZXJmYWNlSWQ7CisgICAgfQorCisgICAgZm9yKGludGVyZmFjZUlkID0gc3RhcnRJZjsgaW50ZXJmYWNlSWQgPD0gZW5kSWY7IGludGVyZmFjZUlkKyspCisgICAgeworICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorCQlkZHIzVGlwUGlwZUVuYWJsZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBHVF9UUlVFKTsKKwkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLSXNBY2Nlc3NEb25lKGRldk51bSwgaW50ZXJmYWNlSWQpKTsKKwl9CisgICAvKiBkZHIzVGlwUGlwZUVuYWJsZShkZXZOdW0sIGludGVyZmFjZUFjY2VzcywgaW50ZXJmYWNlSWQsIEdUX0ZBTFNFKTsqLworICAgIHJldHVybiBHVF9PSzsKK30KKyNlbHNlIC8qIWRlZmluZWQoQ1BTU19CVUlMRCkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOYW1lOiAgICAgZGRyM1RpcEJvYktXcml0ZS4KKyogRGVzYzoKKyogQXJnczoKKyogTm90ZXM6CisqIFJldHVybnM6ICBHVF9PSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLV3JpdGUKKygKKyAgICBHVF9VOCAgICAgICAgICAgICAgICAgZGV2TnVtLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBkYXRhVmFsdWUsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIG1hc2sKKykKK3sKKwlHVF9VMzIgdWlEYXRhUmVhZDsKKyNpZmRlZiBXSU4zMgorICAgIHJldHVybiBHVF9PSzsKKyNlbmRpZgorICAgIGlmIChtYXNrICE9IE1BU0tfQUxMX0JJVFMpCisgICAgeworCQlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktSZWFkKGRldk51bSwgcmVnQWRkciwgICZ1aURhdGFSZWFkLCBNQVNLX0FMTF9CSVRTKSk7CisgICAgICAgIGRhdGFWYWx1ZSA9ICh1aURhdGFSZWFkICYgKH5tYXNrKSkgfCAoZGF0YVZhbHVlICYgbWFzayk7CisgICAgfQorCisgICAgaWYgKGRlYnVnQm9iSyA+PSAxKQorICAgIHsKKyAgICAgICBtdlByaW50ZigiRHVuaXQgV3JpdGU6IEFkZHJlc3MgMHgleCBEYXRhIDB4JXhcbiIsIHJlZ0FkZHIsIGRhdGFWYWx1ZSk7CisgICAgfQorCisgICAgTVZfUkVHX1dSSVRFKHJlZ0FkZHIsIGRhdGFWYWx1ZSk7CisJaWYgKGRlYnVnQm9iSyA+PSAyKQorCQltdlByaW50Zigid3JpdGU6IDB4JXggPSAweCV4XG4iLHJlZ0FkZHIsZGF0YVZhbHVlKTsKKworICAgIHJldHVybiBHVF9PSzsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNUaXBCb2JLUmVhZC4KKyogRGVzYzoKKyogQXJnczoKKyogTm90ZXM6CisqIFJldHVybnM6ICBHVF9PSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLUmVhZAorKAorICAgIEdUX1U4ICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgICpkYXRhLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrCispCit7CisjaWZkZWYgV0lOMzIKKyAgICAgcmV0dXJuIEdUX09LOworI2VuZGlmCisKKwkqZGF0YSA9IE1WX1JFR19SRUFEKHJlZ0FkZHIpICYgbWFzazsKKwlpZiAoZGVidWdCb2JLID49IDIpCisJeworCQltdlByaW50ZigiRHVuaXRSZWFkICAgMHgleDogMHgleCAobWFzayAweCV4KVxuIiwgIHJlZ0FkZHIsICAqZGF0YSwgbWFzayk7CisJfQorCisgICAgcmV0dXJuIEdUX09LOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOYW1lOiAgICAgZGRyM1RpcEJvYktJRldyaXRlLgorKiBEZXNjOgorKiBBcmdzOgorKiBOb3RlczoKKyogUmV0dXJuczogIEdUX09LIGlmIHN1Y2Nlc3MsIG90aGVyIGVycm9yIGNvZGUgaWYgZmFpbC4KKyovCitHVF9TVEFUVVMgICAgZGRyM1RpcEJvYktJRldyaXRlCisoCisgICAgR1RfVTggICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgICAgaW50ZXJmYWNlQWNjZXNzLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgZGF0YVZhbHVlLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrCispCit7CisgICAgaWYgKGludGVyZmFjZUFjY2VzcyA9PSBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QpCisgICAgICAgIGludGVyZmFjZUlkID0gNDsKKyAKKyAgICByZXR1cm4oZGRyM1RpcEJvYktXcml0ZShkZXZOdW0scmVnQWRkcixkYXRhVmFsdWUsbWFzaykpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOYW1lOiAgICAgZGRyM1RpcEJvYktJRlJlYWQuCisqIERlc2M6CisqIEFyZ3M6CisqIE5vdGVzOgorKiBSZXR1cm5zOiAgR1RfT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS0lGUmVhZAorKAorICAgIEdUX1U4ICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgTVZfSFdTX0FDQ0VTU19UWVBFICAgIGludGVyZmFjZUFjY2VzcywKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgICpkYXRhLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrCispCit7CisgICAgaWYgKGludGVyZmFjZUFjY2VzcyA9PSBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QpCisgICAgICAgIGludGVyZmFjZUlkID0gNDsKKyAgICByZXR1cm4gZGRyM1RpcEJvYktSZWFkKGRldk51bSwgcmVnQWRkciwgJmRhdGFbaW50ZXJmYWNlSWRdLCBtYXNrKTsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNUaXBCb2JLU2VsZWN0Q3B1RGRyQ29udHJvbGxlci4KKyogRGVzYzogICAgIEVuYWJsZS9EaXNhYmxlIGFjY2VzcyB0byBNYXJ2ZWxsJ3Mgc2VydmVyLgorKiBBcmdzOiAgICAgZGV2TnVtICAgICAtIGRldmljZSBudW1iZXIKKyogICAgICAgICAgIGVuYWJsZSAgICAgICAgLSB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzZXJ2ZXIKKyogTm90ZXM6CisqIFJldHVybnM6ICBHVF9PSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLU2VsZWN0Q1BVRGRyQ29udHJvbGxlcgorKAorICAgIEdUX1U4ICAgIGRldk51bSwKKyAgICBHVF9CT09MICBlbmFibGUKKykKK3sKKyAgICAvKiBhdm9pZCB3YXJuaW5ncyAqLworICAgIGRldk51bSA9ZGV2TnVtOworICAgIGVuYWJsZSA9IGVuYWJsZTsKKyAgICByZXR1cm4gR1RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNUaXBJbml0Qm9iS1NpbGljb24uCisqIERlc2M6ICAgICBpbml0IFRyYWluaW5nIFNXIERCLgorKiBBcmdzOgorKiBOb3RlczoKKyogUmV0dXJuczogIEdUX09LIGlmIHN1Y2Nlc3MsIG90aGVyIGVycm9yIGNvZGUgaWYgZmFpbC4KKyovCitzdGF0aWMgR1RfU1RBVFVTIGRkcjNUaXBJbml0Qm9iS1NpbGljb24KKygKKyAgICBHVF9VMzIgIGRldk51bSwKKyAgICBHVF9VMzIgIGJvYXJkSWQKKykKK3sKKyAgICBNVl9IV1NfVElQX0NPTkZJR19GVU5DX0RCICAgY29uZmlnRnVuYzsKKwlNVl9IV1NfVE9QT0xPR1lfTUFQKiAgICAgICAgdG9wb2xvZ3lNYXAgPSBkZHIzVGlwR2V0VG9wb2xvZ3lNYXAoZGV2TnVtKTsKKyAgICBHVF9UVU5FX1RSQUlOSU5HX1BBUkFNUyAgICAgdHVuZVBhcmFtczsKKwlHVF9VOCBudW1PZkJ1c1BlckludGVyZmFjZTsKKworCWlmKHRvcG9sb2d5TWFwID09IE5VTEwpCisJeworCQlyZXR1cm4gR1RfTk9UX0lOSVRJQUxJWkVEOworCX0KKworI2lmIDAKKwlkZHIzVGlwQm9iS0dldEludGVyZmFjZU1hcCgoR1RfVTgpZGV2TnVtKTsKKyNlbmRpZgorCisgICAgYm9hcmRJZCA9IGJvYXJkSWQ7IC8qIGF2b2lkIHdhcm5pbmdzICovCisKKyNpZiBkZWZpbmVkKENQU1NfQlVJTEQpCisgICAgbnVtT2ZCdXNQZXJJbnRlcmZhY2UgPSA0OyAvKiBUTSBoYXMgb25seSA0IGJ1c2VzKi8KKyAgICBjb25maWdGdW5jLnRpcER1bml0UmVhZEZ1bmMgPSBkZHIzVGlwQm9iS1RNUmVhZDsKKyAgICBjb25maWdGdW5jLnRpcER1bml0V3JpdGVGdW5jID0gZGRyM1RpcEJvYktUTVdyaXRlOworICAgIGNvbmZpZ0Z1bmMudGlwRHVuaXRNdXhTZWxlY3RGdW5jID0gZGRyM1RpcEJvYktTZWxlY3RUTURkckNvbnRyb2xsZXI7CisKKyNlbHNlCisgICAgbnVtT2ZCdXNQZXJJbnRlcmZhY2UgPSA1OyAvKk1TWVMgbWF5IGhhdmUgNSBidXNlcyovCisgICAgY29uZmlnRnVuYy50aXBEdW5pdFJlYWRGdW5jID0gZGRyM1RpcEJvYktJRlJlYWQ7CisgICAgY29uZmlnRnVuYy50aXBEdW5pdFdyaXRlRnVuYyA9IGRkcjNUaXBCb2JLSUZXcml0ZTsKKyAgICBjb25maWdGdW5jLnRpcER1bml0TXV4U2VsZWN0RnVuYyA9IGRkcjNUaXBCb2JLU2VsZWN0Q1BVRGRyQ29udHJvbGxlcjsKKyNlbmRpZgorCisgICAgY29uZmlnRnVuYy50aXBFeHRlcm5hbFJlYWQgID0gZGRyM1RpcEJvYktFeHRSZWFkOworCWNvbmZpZ0Z1bmMudGlwRXh0ZXJuYWxXcml0ZSA9IGRkcjNUaXBCb2JLRXh0V3JpdGU7CisKKyAgICBjb25maWdGdW5jLnRpcEdldEZyZXFDb25maWdJbmZvRnVuYyA9IGRkcjNUaXBCb2JLR2V0RnJlcUNvbmZpZzsKKyAgICBjb25maWdGdW5jLnRpcFNldEZyZXFEaXZpZGVyRnVuYyA9IGRkcjNUaXBCb2JLU2V0RGl2aWRlcjsKKyAgICBjb25maWdGdW5jLnRpcEdldERldmljZUluZm9GdW5jID0gZGRyM1RpcEJvYktHZXREZXZpY2VJbmZvOworCWNvbmZpZ0Z1bmMudGlwR2V0VGVtcGVyYXR1cmUgPSBOVUxMOworCWNvbmZpZ0Z1bmMudGlwR2V0Q2xvY2tSYXRpbyA9IGRkcjNUaXBDbG9ja01vZGU7CisKKyAgICBtdkh3c0RkcjNUaXBJbml0Q29uZmlnRnVuYyhkZXZOdW0sICZjb25maWdGdW5jKTsKKworCS8qIHJlZ2lzdGVyIGJpdCBtYXBwaW5nIChmb3IgUEJTKSAqLworCWRkcjNUaXBSZWdpc3RlckRxVGFibGUoZGV2TnVtLCBib2JLRFFiaXRNYXAyUGh5cGluKTsKKworCS8qU2V0IGRldmljZSBhdHRyaWJ1dGVzKi8KKwlkZHIzVGlwRGV2QXR0ckluaXQoZGV2TnVtKTsKKyNpZiBkZWZpbmVkKENQU1NfQlVJTEQpCisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYsIE1WX1RJUF9SRVZfMik7ICAgLyogVE0gRERSIChOb24tRUNDKSBUSVAgdmVyc2lvbiAyKi8KKyNlbHNlCisgICAgZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYsIE1WX1RJUF9SRVZfMyk7ICAgLyogQk9CSyBNU1lTIEREUiBUSVAgdmVyc2lvbiAzICAqLworI2VuZGlmCisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX1BIWV9FREdFLCBNVl9ERFJfUEhZX0VER0VfTkVHQVRJVkUpOworCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFLCBudW1PZkJ1c1BlckludGVyZmFjZSk7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX0lOVEVSTEVBVkVfV0EsIEdUX0ZBTFNFKTsKKworI2lmIGRlZmluZWQoQ1BTU19CVUlMRCkKKwltYXNrVHVuZUZ1bmMgPSAoIElOSVRfQ09OVFJPTExFUl9NQVNLX0JJVCB8CisJCQkJCVNFVF9NRURJVU1fRlJFUV9NQVNLX0JJVCB8CisJCQkJCVdSSVRFX0xFVkVMSU5HX01BU0tfQklUIHwKKwkJCQkJTE9BRF9QQVRURVJOXzJfTUFTS19CSVQgfAorCQkJCQlSRUFEX0xFVkVMSU5HX01BU0tfQklUIHwKKwkJCQkJU0VUX1RBUkdFVF9GUkVRX01BU0tfQklUIHwKKwkJCQkJV1JJVEVfTEVWRUxJTkdfVEZfTUFTS19CSVQgfAorCQkJCQlSRUFEX0xFVkVMSU5HX1RGX01BU0tfQklUIHwKKwkJCQkJV1JJVEVfTEVWRUxJTkdfU1VQUF9URl9NQVNLX0JJVCB8CisJCQkJCUNFTlRSQUxJWkFUSU9OX1JYX01BU0tfQklUIHwKKwkJCQkJQ0VOVFJBTElaQVRJT05fVFhfTUFTS19CSVQpOworI2Vsc2UKKyAgIG1hc2tUdW5lRnVuYyA9ICAgICAoLypTRVRfTE9XX0ZSRVFfTUFTS19CSVQgfAorCQkJCQkJTE9BRF9QQVRURVJOX01BU0tfQklUIHwqLworCQkJCQkJU0VUX01FRElVTV9GUkVRX01BU0tfQklUIHwKKwkJCQkJCVdSSVRFX0xFVkVMSU5HX01BU0tfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIExPQURfUEFUVEVSTl8yX01BU0tfQklUIHwKKwkJCQkJCVdSSVRFX0xFVkVMSU5HX1NVUFBfTUFTS19CSVQgfAorCQkJCQkJUkVBRF9MRVZFTElOR19NQVNLX0JJVCB8CisJCQkJCQlQQlNfUlhfTUFTS19CSVQgfAorCQkJCQkJUEJTX1RYX01BU0tfQklUIHwKKwkJCQkJCVNFVF9UQVJHRVRfRlJFUV9NQVNLX0JJVCB8CisJCQkJCQlXUklURV9MRVZFTElOR19URl9NQVNLX0JJVCB8CisJCQkJCQlXUklURV9MRVZFTElOR19TVVBQX1RGX01BU0tfQklUIHwKKwkJCQkJCVJFQURfTEVWRUxJTkdfVEZfTUFTS19CSVQgfAorCQkJCQkJQ0VOVFJBTElaQVRJT05fUlhfTUFTS19CSVQgfAorCQkJCQkJQ0VOVFJBTElaQVRJT05fVFhfTUFTS19CSVQKKwkJCQkJCSk7CisjZW5kaWYKKwkvKlNraXAgbWlkIGZyZXEgc3RhZ2VzIGZvciA0MDBNaHogRERSIHNwZWVkKi8KKwlpZiggKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbZmlyc3RBY3RpdmVJZl0ubWVtb3J5RnJlcSA9PSBERFJfRlJFUV80MDApICl7CisJCW1hc2tUdW5lRnVuYyA9ICggV1JJVEVfTEVWRUxJTkdfTUFTS19CSVQgfAorCQkgICAgICAgICAgICAgICAgTE9BRF9QQVRURVJOXzJfTUFTS19CSVQgfAorCQkgICAgICAgICAgICAgICAgUkVBRF9MRVZFTElOR19NQVNLX0JJVCB8CisJCSAgICAgICAgICAgICAgICBDRU5UUkFMSVpBVElPTl9SWF9NQVNLX0JJVCB8CisJCSAgICAgICAgICAgICAgICBDRU5UUkFMSVpBVElPTl9UWF9NQVNLX0JJVCk7CisJfQorCisgICAgaWYoIGNrRGVsYXkgPT0gTVZfUEFSQU1TX1VOREVGSU5FRCApCisgICAgICAgIGNrRGVsYXkgPSAxNTA7CisgICAgZGVsYXlFbmFibGUgPSAxOworICAgIGNhRGVsYXkgPSAwOworCisgICAgLyogdXBkYXRlIERHTCBwYXJhbWV0ZXJzICovCisgICAgdHVuZVBhcmFtcy5ja0RlbGF5ID0gY2tEZWxheTsKKyAgICB0dW5lUGFyYW1zLlBoeVJlZzNWYWwgPSAweEE7CisgICAgdHVuZVBhcmFtcy5nUnR0Tm9tID0gMHg0NDsKKyAgICB0dW5lUGFyYW1zLmdEaWMgPSAweDI7CisgICAgdHVuZVBhcmFtcy51aU9EVENvbmZpZyA9IDB4MTIwMDEyOworICAgIHR1bmVQYXJhbXMuZ1pwcmlEYXRhID0gMTIzOworICAgIHR1bmVQYXJhbXMuZ1pucmlEYXRhID0gMTIzOworICAgIHR1bmVQYXJhbXMuZ1pwcmlDdHJsID0gNzQ7CisgICAgdHVuZVBhcmFtcy5nWm5yaUN0cmwgPSA3NDsKKyAgICB0dW5lUGFyYW1zLmdacG9kdERhdGEgPSA0NTsKKyAgICB0dW5lUGFyYW1zLmdabm9kdERhdGEgPSA0NTsKKyAgICB0dW5lUGFyYW1zLmdacG9kdEN0cmwgPSA0NTsKKyAgICB0dW5lUGFyYW1zLmdabm9kdEN0cmwgPSA0NTsKKyAgICB0dW5lUGFyYW1zLmdSdHRXUiA9IDA7IC8qMHg0MDA7MHgwOyovCisKKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcFR1bmVUcmFpbmluZ1BhcmFtcyhkZXZOdW0sICZ0dW5lUGFyYW1zKSk7CisKKyAgICAvKiBmcmVxdWVuY3kgYW5kIGdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgIGRkcjNUaXBCb2JLR2V0TWVkaXVtRnJlcShkZXZOdW0sIGZpcnN0QWN0aXZlSWYsICZtZWRpdW1GcmVxKTsKKyAgICBpbml0RnJlcSA9IHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbZmlyc3RBY3RpdmVJZl0ubWVtb3J5RnJlcTsKKwlmcmVxVmFsW0REUl9GUkVRX0xPV19GUkVRXSA9IGRmc0xvd0ZyZXEgPSAxMzA7CisgICAgZGZzTG93UGh5MSA9IFBoeVJlZzFWYWw7CisJY2FsaWJyYXRpb25VcGRhdGVDb250cm9sID0gMTsKKworICAgIHJldHVybiBHVF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOYW1lOiAgICAgZGRyM0JvYktVcGRhdGVUb3BvbG9neU1hcC4KKyogRGVzYzoKKyogQXJnczoKKyogTm90ZXM6CisqIFJldHVybnM6ICBHVF9PSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworR1RfU1RBVFVTIGRkcjNCb2JLVXBkYXRlVG9wb2xvZ3lNYXAoR1RfVTMyIGRldk51bSwgTVZfSFdTX1RPUE9MT0dZX01BUCogdG9wb2xvZ3lNYXApCit7CisgICAgR1RfVTMyIGludGVyZmFjZUlkOworICAgIE1WX0hXU19ERFJfRlJFUSBmcmVxOworCisJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0lORk8sICgidG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2sgaXMgMHgleFxuIiwgdG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2spKTsKKworICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDwgTUFYX0lOVEVSRkFDRV9OVU07IGludGVyZmFjZUlkKyspIHsKKyAgICAJaWYgKElTX0lOVEVSRkFDRV9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKSA9PSAgR1RfRkFMU0UpCisgICAgCSAgICBjb250aW51ZTsKKwkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLR2V0SW5pdEZyZXEoKEdUX1U4KWRldk51bSwgaW50ZXJmYWNlSWQsICZmcmVxKSk7CisgICAgICAgIHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLm1lbW9yeUZyZXEgPSBmcmVxOworCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfVFJBQ0UsICgiVXBkYXRlIHRvcG9sb2d5IGZyZXF1ZW5jeSBmb3IgaW50ZXJmYWNlICVkIHRvICVkXG4iLGludGVyZmFjZUlkLCBmcmVxKSk7CisgICAJfQorCisJLyogcmUtY2FsYyB0b3BvbG9neSBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byB0b3BvbG9neSB1cGRhdGVzIChpZiBuZWVkZWQpICovCisJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcExvYWRUb3BvbG9neU1hcChkZXZOdW0sIHRvcG9sb2d5TWFwKSk7CisKKyAgICByZXR1cm4gR1RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNUaXBJbml0Qm9iSy4KKyogRGVzYzogICAgIGluaXQgVHJhaW5pbmcgU1cgREIgYW5kIHVwZGF0ZXMgRERSIHRvcG9sb2d5LgorKiBBcmdzOgorKiBOb3RlczoKKyogUmV0dXJuczogIEdUX09LIGlmIHN1Y2Nlc3MsIG90aGVyIGVycm9yIGNvZGUgaWYgZmFpbC4KKyovCitHVF9TVEFUVVMgZGRyM1RpcEluaXRCb2JLCisoCisgICAgR1RfVTMyICBkZXZOdW0sCisgICAgR1RfVTMyICBib2FyZElkCispCit7CisJTVZfSFdTX1RPUE9MT0dZX01BUCogdG9wb2xvZ3lNYXAgPSBkZHIzVGlwR2V0VG9wb2xvZ3lNYXAoZGV2TnVtKTsKKworCWlmKE5VTEwgPT0gdG9wb2xvZ3lNYXApCisJeworCQkjaWYgZGVmaW5lZChDUFNTX0JVSUxEKQorCQkvKiBmb3IgQ1BTUywgc2luY2UgdG9wb2xvZ3kgaXMgbm90IGFsd2F5cyBpbml0aWFsaXplZCwgaXQgaXMKKwkJICAgbmVlZGVkIHRvIHNldCBpdCB0byBkZWZhdWx0IHRvcG9sb2d5ICovCisJCXRvcG9sb2d5TWFwID0gJmJvYktUb3BvbG9neU1hcFtib2FyZElkXTsKKyAgICAgICAgbXZQcmludGYgKCJib2FyZCBJRCAlZCwgYWN0aXZlIGludGVyZmFjZSBtYXNrID0gJXhcbiIsYm9hcmRJZCx0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzayk7CisJCSNlbHNlCisJCXJldHVybiBHVF9GQUlMOworCQkjZW5kaWYKKwl9CisKKwlDSEVDS19TVEFUVVMoZGRyM0JvYktVcGRhdGVUb3BvbG9neU1hcChkZXZOdW0sIHRvcG9sb2d5TWFwKSk7CisKKyAgICBkZHIzVGlwSW5pdEJvYktTaWxpY29uKGRldk51bSwgYm9hcmRJZCk7CisgICAgcmV0dXJuIEdUX09LOworfQorCisjaWYgZGVmaW5lZChDUFNTX0JVSUxEKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitEYXRhIFJlc2V0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgR1RfU1RBVFVTICAgIGRkcjNUaXBEYXRhUmVzZXQKKygKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgTVZfSFdTX0FDQ0VTU19UWVBFICAgICAgaW50ZXJmYWNlQWNjZXNzLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICAgIGludGVyZmFjZUlkCispCit7CisgICAgR1RfU1RBVFVTIHJldFZhbDsKKyAgICBHVF9VMzIgIHVpV29yZENudDsKKworICAgIGZvcih1aVdvcmRDbnQgPSAwOyB1aVdvcmRDbnQgPCA4IDsgdWlXb3JkQ250KyspCisgICAgeworICAgICAgICAvKldyaXRlIEludGVyZmFjZSBEQVRBIGFzIGRhdGEgdG8gWFNCIGFkZHJlc3MgMHgxMC4qLworICAgICAgICByZXRWYWwgPSBkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgICAgIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIGludGVyZmFjZUFjY2VzcywgWFNCX0RBVEFfUkVHKyh1aVdvcmRDbnQgKiA0KSksIDB4QUJDREVGMTIpOworICAgICAgICBpZiAocmV0VmFsICE9IEdUX09LKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBHVF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitYU0IgRXh0ZXJuYWwgcmVhZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLRXh0UmVhZAorKAorICAgIEdUX1UzMiAgICAgIGRldk51bSwKKyAgICBHVF9VMzIgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgIG51bU9mQnVyc3RzLAorICAgIEdUX1UzMiAgICAgICpkYXRhCispCit7CisgICAgR1RfVTMyIGJ1cnN0TnVtLCB3b3JkTnVtICwgZGF0YVZhbHVlOworCUdUX1UzMiBjbnRQb2xsOworICAgIE1WX0hXU19BQ0NFU1NfVFlQRSBhY2Nlc3NUeXBlID0gQUNDRVNTX1RZUEVfVU5JQ0FTVDsKKyAgICAvKkRFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9JTkZPLCAoIj09PSBFWFRFUk5BTCBSRUFEID09PSIpKTsqLworCisgICAgZGRyM1RpcFBpcGVFbmFibGUoKEdUX1U4KWRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIEdUX1RSVUUpOworICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgQk9CS19YU0JfTUFQUElORyhpbnRlcmZhY2VJZCwgYWNjZXNzVHlwZSwgWFNCX0NUUkxfMF9SRUcpICxFWFRfVFJBSU5JTkdfSUQpKTsKKworICAgIGZvcihidXJzdE51bT0wIDsgYnVyc3ROdW0gPCBudW1PZkJ1cnN0czsgYnVyc3ROdW0rKykKKyAgICB7CisgICAgICAgIGRkcjNUaXBEYXRhUmVzZXQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCk7CisgICAgICAgIC8qd29ya2luZyB3aXRoIFhTQiBjbGllbnQgSW50ZXJmYWNlTnVtICBXcml0ZSBJbnRlcmZhY2UgQUREUiBhcyBkYXRhIHRvIFhTQiBhZGRyZXNzIEMqLworICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIGFjY2Vzc1R5cGUsIFhTQl9BRERSRVNTX1JFRyArIChidXJzdE51bSAqIDMyKSksIHJlZ0FkZHIpKTsKKyAgICAgICAgaWYgKGlzQ2JlUmVxdWlyZWQgPT0gIEdUX1RSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qQ1NfQ0JFX1ZBTFVFKDApKi8KKyAgICAgICAgICAgIGRhdGFWYWx1ZSA9IENTX0NCRV9WQUxVRSgwKSA8PCAxOTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFWYWx1ZSA9IChHVF9VMzIpKFRBUkdFVF9FWFQgPDwgMTkpOworICAgICAgICB9CisgICAgICAgIGRhdGFWYWx1ZSB8PSAoQllURV9FTiA8PCAxMSkgKyAoTlVNX0JZVEVTX0lOX0JVUlNUIDw8IDQpICsgKEFDQ0VTU19FWFQgPDwgMyk7CisgICAgICAgIC8qV3JpdGUgSW50ZXJmYWNlIENPTU1BTkQgYXMgZGF0YSB0byBYU0IgYWRkcmVzcyA4ICovCisgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgQk9CS19YU0JfTUFQUElORyggaW50ZXJmYWNlSWQsIGFjY2Vzc1R5cGUsIFhTQl9DTURfUkVHKSwgICBkYXRhVmFsdWUpKTsKKyAgICAgICAgZGF0YVZhbHVlIHw9IEVYRUNVVElORzsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKCBpbnRlcmZhY2VJZCwgYWNjZXNzVHlwZSwgWFNCX0NNRF9SRUcpLCAgIGRhdGFWYWx1ZSkpOworCisJCWZvcihjbnRQb2xsPTA7IGNudFBvbGwgPCBNQVhfUE9MTElOR19JVEVSQVRJT05TOyBjbnRQb2xsKyspCisJCXsKKwkJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKCBpbnRlcmZhY2VJZCwgYWNjZXNzVHlwZSwgWFNCX0NNRF9SRUcpLCAmZGF0YVZhbHVlLCAweDEpKTsKKworCQkJaWYgKGRhdGFWYWx1ZSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNudFBvbGwgPj0gTUFYX1BPTExJTkdfSVRFUkFUSU9OUykKKwkJeworCQkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0VSUk9SLCAoIk5vIERvbmUgaW5kaWNhdGlvbiBmb3IgRERSIFJlYWRcbiIsIGRhdGFWYWx1ZSkpOworCQkJcmV0dXJuIEdUX05PVF9SRUFEWTsKKwkJfQorCisgICAgICAgIGZvcih3b3JkTnVtID0gMDsgd29yZE51bSA8IEVYVF9BQ0NFU1NfQlVSU1RfTEVOR1RIIC8qc191aU51bU9mQnl0ZXNJbkJ1cnN0LzQqLzsgd29yZE51bSsrKQorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgQk9CS19YU0JfTUFQUElORyhpbnRlcmZhY2VJZCwgYWNjZXNzVHlwZSwgWFNCX0RBVEFfUkVHICsgKHdvcmROdW0gKiA0KSksICZkYXRhW3dvcmROdW1dLCBNQVNLX0FMTF9CSVRTKSk7CisgICAgICAgICAgICBERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfVFJBQ0UsICgiZGRyM1RpcEV4dFJlYWQgZGF0YSAweCV4IFxuIixkYXRhW3dvcmROdW1dKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEdUX09LOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitYU0IgRXh0ZXJuYWwgd3JpdGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS0V4dFdyaXRlCisoCisgICAgR1RfVTMyICAgICAgZGV2TnVtLAorICAgIEdUX1UzMiAgICAgIGludGVyZmFjZUlkLAorICAgIEdUX1UzMiAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgbnVtT2ZCdXJzdHMsCisgICAgR1RfVTMyICAgICAgKmFkZHIKKykKK3sKKyAgICBHVF9VMzIgICAgICAgIHdvcmROdW0gPSAwLCAgZGF0YUNtZCA9IDAsIGJ1cnN0TnVtPTAsIGNudFBvbGwgPSAwLCBkYXRhVmFsdWUgID0gMDsKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgYWNjZXNzVHlwZSA9IEFDQ0VTU19UWVBFX1VOSUNBU1Q7CisKKyAgICBkZHIzVGlwUGlwZUVuYWJsZSgoR1RfVTgpZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgR1RfVFJVRSk7CisgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBhY2Nlc3NUeXBlLCBYU0JfQ1RSTF8wX1JFRykgLEVYVF9UUkFJTklOR19JRCAgKSk7CisgICAgZm9yKGJ1cnN0TnVtPTAgOyBidXJzdE51bSA8IG51bU9mQnVyc3RzOyBidXJzdE51bSsrKQorICAgIHsKKyAgICAgICAgLyp3b3JraW5nIHdpdGggWFNCIG11bHRpY2FzdCBjbGllbnQgLCBXcml0ZSBJbnRlcmZhY2UgQUREUiBhcyBkYXRhIHRvIFhTQiBhZGRyZXNzIEMgKi8KKyAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBhY2Nlc3NUeXBlLCBYU0JfQUREUkVTU19SRUcpLCByZWdBZGRyICsgKGJ1cnN0TnVtICogRVhUX0FDQ0VTU19CVVJTVF9MRU5HVEggKiA0KSkpOworICAgICAgICBmb3Iod29yZE51bSA9IDA7IHdvcmROdW0gPCA4IDsgd29yZE51bSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKldyaXRlIEludGVyZmFjZSBEQVRBIGFzIGRhdGEgdG8gWFNCIGFkZHJlc3MgMHgxMC4qLworICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBhY2Nlc3NUeXBlLCBYU0JfREFUQV9SRUcgKyAod29yZE51bSAqIDQpKSwgYWRkclt3b3JkTnVtXSkpOworICAgICAgICB9CisgICAgICAgIGlmIChpc0NiZVJlcXVpcmVkID09ICBHVF9UUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhQ21kID0gIENTX0NCRV9WQUxVRSgwKSA8PCAxOTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFDbWQgPSAoR1RfVTMyKShUQVJHRVRfRVhUIDw8IDE5KTsKKyAgICAgICAgfQorICAgICAgICBkYXRhQ21kIHw9IChCWVRFX0VOIDw8IDExKSArIChOVU1fQllURVNfSU5fQlVSU1QgPDwgNCkgKyAoQUNDRVNTX0VYVCA8PCAzKSArIEVYVF9NT0RFOworICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsICBhY2Nlc3NUeXBlLCBYU0JfQ01EX1JFRyksIGRhdGFDbWQpKTsKKyAgICAgICAgLyogZXhlY3V0ZSB4c2Igd3JpdGUgKi8KKyAgICAgICAgZGF0YUNtZCB8PSAweDE7CisgICAgICAgIERFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9UUkFDRSwgKCJkZHIzVGlwRXh0V3JpdGUgZGF0YUNtZCAweCV4IFxuIiwgZGF0YUNtZCkpOworICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIGFjY2Vzc1R5cGUsIFhTQl9DTURfUkVHKSwgZGF0YUNtZCkpOworCisJCWZvcihjbnRQb2xsPTA7IGNudFBvbGwgPCBNQVhfUE9MTElOR19JVEVSQVRJT05TOyBjbnRQb2xsKyspCisJCXsKKwkJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKCBpbnRlcmZhY2VJZCwgYWNjZXNzVHlwZSwgWFNCX0NNRF9SRUcpLCAmZGF0YVZhbHVlLCAweDEpKTsKKworCQkJaWYgKGRhdGFWYWx1ZSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNudFBvbGwgPj0gTUFYX1BPTExJTkdfSVRFUkFUSU9OUykKKwkJeworCQkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0VSUk9SLCAoIk5vIERvbmUgaW5kaWNhdGlvbiBmb3IgRERSIFdyaXRlIEV4dGVybmFsXG4iLCBkYXRhVmFsdWUpKTsKKwkJCXJldHVybiBHVF9OT1RfUkVBRFk7CisJCX0KKworICAgIH0KKyAgICByZXR1cm4gR1RfT0s7Cit9CisjZWxzZQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBleHRlcm5hbCByZWFkIGZyb20gbWVtb3J5CisqLworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLRXh0UmVhZAorKAorICAgIEdUX1UzMiAgICAgIGRldk51bSwKKyAgICBHVF9VMzIgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgIG51bU9mQnVyc3RzLAorICAgIEdUX1UzMiAgICAgICpkYXRhCispCit7CisgICAgR1RfVTMyIGJ1cnN0TnVtOworCisgICAgZm9yKGJ1cnN0TnVtPTAgOyBidXJzdE51bSA8IG51bU9mQnVyc3RzKjg7IGJ1cnN0TnVtKyspCisgICAgeworCQlkYXRhW2J1cnN0TnVtXSA9ICogKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAocmVnQWRkciArIDQqIGJ1cnN0TnVtKTsKKyAgICB9CisKKyAgICByZXR1cm4gR1RfT0s7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBleHRlcm5hbCB3cml0ZSB0byBtZW1vcnkKKyovCitHVF9TVEFUVVMgICAgZGRyM1RpcEJvYktFeHRXcml0ZQorKAorICAgIEdUX1UzMiAgICAgIGRldk51bSwKKyAgICBHVF9VMzIgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgIG51bU9mQnVyc3RzLAorICAgIEdUX1UzMiAgICAgICpkYXRhCispCit7CisgICAgR1RfVTMyIGJ1cnN0TnVtOworCisgICAgZm9yKGJ1cnN0TnVtPTAgOyBidXJzdE51bSA8IG51bU9mQnVyc3RzKjg7IGJ1cnN0TnVtKyspCisgICAgeworCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAocmVnQWRkcis0KmJ1cnN0TnVtKSA9IGRhdGFbYnVyc3ROdW1dOworICAgIH0KKworICAgIHJldHVybiBHVF9PSzsKK30KKworI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICBQTEwvRnJlcXVlbmN5IEZ1bmN0aW9uYWxpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNUaXBCb25LU2V0RGl2aWRlci4KKyogRGVzYzogICAgIFBsbCBEaXZpZGVyCisqIEFyZ3M6CisqIE5vdGVzOgorKiBSZXR1cm5zOiAgR1RfT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK0dUX1NUQVRVUyBkZHIzVGlwQm9iS1NldERpdmlkZXIKKygKKwlHVF9VOAkJCQkJCQlkZXZOdW0sCisJR1RfVTMyCQkJCQkJCWludGVyZmFjZUlkLAorICAgIE1WX0hXU19ERFJfRlJFUSAgICAgICAgICAgICAgICAgZnJlcXVlbmN5CispCit7CisJaWYoaW50ZXJmYWNlSWQgPCA0KQorCXsKKwkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0lORk8sICgiVE0gc2V0IGRpdmlkZXIgZm9yIGludGVyZmFjZSAlZFxuIixpbnRlcmZhY2VJZCkpOworCQlyZXR1cm4gZGRyM1RpcFRtU2V0RGl2aWRlcihkZXZOdW0sIGludGVyZmFjZUlkLCBmcmVxdWVuY3kpOworCX0KKworCWVsc2UKKwl7CisJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9JTkZPLCAoIkNQVSBzZXQgZGl2aWRlciBmb3IgaW50ZXJmYWNlIDRcbiIpKTsKKwkJcmV0dXJuIGRkcjNUaXBDcHVTZXREaXZpZGVyKGRldk51bSwgaW50ZXJmYWNlSWQsIGZyZXF1ZW5jeSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHJldHVybiAxIG9mIGNvcmUvRFVOSVQgY2xvY2sgcmF0aW9uIGlzIDEgZm9yIGdpdmVuIGZyZXEsIDAgaWYgY2xvY2sgcmF0aW9zIGlzIDI6MQorKi8KK3N0YXRpYyBHVF9VOCBkZHIzVGlwQ2xvY2tNb2RlKCBHVF9VMzIgZnJlcXVlbmN5ICkKK3sKKwlpZihmcmVxdWVuY3kgPT0gRERSX0ZSRVFfTE9XX0ZSRVEpeworCQlyZXR1cm4gMTsKKwl9CisJZWxzZXsKKwkJcmV0dXJuIDI7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBkZHIzVGlwVG1TZXREaXZpZGVyLgorKiBEZXNjOiAgICAgUGxsIERpdmlkZXIgb2YgVGhlIFRyYWZpYyBNYW5hZ2VyIFVuaXQKKyogQXJnczoKKyogTm90ZXM6CisqIFJldHVybnM6ICBHVF9PSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwVG1TZXREaXZpZGVyCisoCisJR1RfVTgJCQkJCQkJZGV2TnVtLAorCUdUX1UzMgkJCQkJCQlpbnRlcmZhY2VJZCwKKyAgICBNVl9IV1NfRERSX0ZSRVEgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeQorKQoreworICAgIEdUX1UzMiBkYXRhID0gMCwgd3JpdGVEYXRhLCBkaXZpZGVyID0gMDsKKyAgICBNVl9IV1NfRERSX0ZSRVEgc2FyRnJlcTsKKworCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9JTkZPLCAoIlRNIFBMTCBDb25maWdcbiIpKTsKKworICAgIC8qIGF2b2lkIHdhcm5pbmdzICovCisgICAgaW50ZXJmYWNlSWQgPSBpbnRlcmZhY2VJZDsKKyAgICAvKiBDYWxjIFNBUiAqLworICAgLypDSEVDS19TVEFUVVMoZGRyM1RpcFRtR2V0SW5pdEZyZXEoZGV2TnVtLCAmc2FyRnJlcSkpOyovCisgICAgLyogY2FsYyBTQVIgKi8KKyAgICBkZHIzVGlwQm9iS0dldEluaXRGcmVxKGRldk51bSwgMCwgJnNhckZyZXEpOworICAgIGRpdmlkZXIgPSBmcmVxVmFsW3NhckZyZXFdL2ZyZXFWYWxbZnJlcXVlbmN5XTsKKworICAgIERFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9JTkZPLCAoIlx0U0FSIHZhbHVlICVkIGRpdmlkZXIgJWQgKGZyZXFWYWxbJWRdICVkICBmcmVxVmFsWyVkXSAlZFxuIiwKKwkJCQkJICBzYXJGcmVxLCBkaXZpZGVyLCBzYXJGcmVxLCBmcmVxVmFsW3NhckZyZXFdLCBmcmVxdWVuY3ksIGZyZXFWYWxbZnJlcXVlbmN5XSkpOworICAgIHN3aXRjaCAoZGl2aWRlcikKKyAgICB7CisJY2FzZSAxOgorCQl3cml0ZURhdGEgID0gVE1fUExMX1JFR19EQVRBKDIsMSwzKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl3cml0ZURhdGEgID0gVE1fUExMX1JFR19EQVRBKDQsMiwzKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl3cml0ZURhdGEgID0gVE1fUExMX1JFR19EQVRBKDYsMywzKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl3cml0ZURhdGEgID0gVE1fUExMX1JFR19EQVRBKDgsNCwzKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfRVJST1IsICgiRXJyb3I6IGRkcjNUaXBUbVNldERpdmlkZXI6ICVkIGRpdmlkZXIgaXMgbm90IHN1cHBvcnRlZFxuIiwgZGl2aWRlcikpOworCQlyZXR1cm4gR1RfQkFEX1BBUkFNOworICAgIH0KKworICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCAweDAwMEY4MjY0LCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMgKSk7CisgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweDAwMEY4MjY0LCAgUl9NT0RfVyh3cml0ZURhdGEsZGF0YSwweEZGMEMpKSk7CisKKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgMHgwMDBGODI2NCwgICZkYXRhLCBNQVNLX0FMTF9CSVRTKSk7CisJZGF0YSB8PSAoMTw8MTYpOworICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHgwMDBGODI2NCwgIGRhdGEpKTsKKworCS8qaHdzT3NFeGFjdERlbGF5UHRyKGRldk51bSwgMCwgMTApOyAqLworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCAweDAwMEY4MjY0LCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMpKTsKKwlkYXRhICY9IH4oMTw8MTYpOworICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHgwMDBGODI2NCwgIFJfTU9EX1coMCwgZGF0YSwgKDE8PDE2KSkpKTsKKworICAgIHJldHVybiBHVF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOYW1lOiAgICAgZGRyM1RpcENwdVNldERpdmlkZXIuCisqIERlc2M6ICAgICBQbGwgRGl2aWRlciBvZiB0aGUgQ1BVKG1zeXMpIFVuaXQKKyogQXJnczoKKyogTm90ZXM6CisqIFJldHVybnM6ICBHVF9PSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwQ3B1U2V0RGl2aWRlcgorKAorCUdUX1U4CQkJCQkJCWRldk51bSwKKwlHVF9VMzIJCQkJCQkJaW50ZXJmYWNlSWQsCisgICAgTVZfSFdTX0REUl9GUkVRICAgICAgICAgICAgICAgICBmcmVxdWVuY3kKKykKK3sKKyAgICBHVF9VMzIgZGF0YSA9IDAsIGRpdmlkZXIgPSAwOworI2lmIDAKKyAgICBHVF9VMzIgdmFsdWUsIGRpdlJhdGlvOworI2VuZGlmCisgICAgTVZfSFdTX0REUl9GUkVRIHNhckZyZXE7CisgICAgR1RfVTMyIHdyaXRlRGF0YTsKKworCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9JTkZPLCAoIkNQVSBQTEwgQ29uZmlnXG4iKSk7CisjaWYgMQorICAgIC8qIGNhbGMgU0FSICovCisgICAgZGRyM1RpcEJvYktHZXRJbml0RnJlcShkZXZOdW0sIGludGVyZmFjZUlkLCAmc2FyRnJlcSk7CisgICAgZGl2aWRlciA9IGZyZXFWYWxbc2FyRnJlcV0vZnJlcVZhbFtmcmVxdWVuY3ldOworCisgICAgREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIlxuU0FSIHZhbHVlICVkIGRpdmlkZXIgJWQgZnJlcVZhbFslZF0gJWQgIGZyZXFWYWxbJWRdICVkXG4iLAorCQkJCQkgIHNhckZyZXEsIGRpdmlkZXIsIHNhckZyZXEsIGZyZXFWYWxbc2FyRnJlcV0sIGZyZXF1ZW5jeSwgZnJlcVZhbFtmcmVxdWVuY3ldKSk7CisKKwlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgMHgwMDBGODJlYywgICZkYXRhLCBNQVNLX0FMTF9CSVRTICkpOworCXdyaXRlRGF0YSA9ICgweDEgPDwgOSk7CisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweDAwMEY4MmVjLCAgUl9NT0RfVyh3cml0ZURhdGEsZGF0YSwgKDB4MSA8PCA5KSkpKTsKKworICAgIHN3aXRjaCAoZGl2aWRlcikKKyAgICB7CisgICAgICAgIGNhc2UgMToKKwkJCS8qTm90IDgwMCBpcyBhIDY2NyBvbmx5Ki8KKyAgICAgICAgICAgIHdyaXRlRGF0YSA9IChzYXJGcmVxPT1ERFJfRlJFUV84MDApPygweDIpOigweDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKwkJCS8qTm90IDgwMCBpcyBhIDY2NyBvbmx5Ki8KKyAgICAgICAgICAgIHdyaXRlRGF0YSA9IChzYXJGcmVxPT1ERFJfRlJFUV84MDApPygweDMpOigweDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfSU5GTywgKCJFcnJvcjogV3JvbmcgZGl2aWRlciAlZFxuIiwgZGl2aWRlcikpOworICAgICAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCAweDAwMEY4MmU4LCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMgKSk7CisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweDAwMEY4MmU4LCAgUl9NT0RfVyh3cml0ZURhdGEsZGF0YSwgKDB4NyA8PCAwKSkpKTsKKyNlbHNlCisgICAgLyogY2FsYyBTQVIgKi8KKyAgICBkZHIzVGlwQm9iS0dldEluaXRGcmVxKGRldk51bSwgaW50ZXJmYWNlSWQsICZzYXJGcmVxKTsKKyAgICBkaXZpZGVyID0gZnJlcVZhbFtzYXJGcmVxXS9mcmVxVmFsW2ZyZXF1ZW5jeV07CisKKyAgICBERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfVFJBQ0UsICgiXG5TQVIgdmFsdWUgJWQgZGl2aWRlciAlZCBmcmVxVmFsWyVkXSAlZCAgZnJlcVZhbFslZF0gJWRcbiIsCisJCQkJCSAgc2FyRnJlcSwgZGl2aWRlciwgc2FyRnJlcSwgZnJlcVZhbFtzYXJGcmVxXSwgZnJlcXVlbmN5LCBmcmVxVmFsW2ZyZXF1ZW5jeV0pKTsKKworCS8qIENvbmZpZ3VyZSBEdW5pdCB0byAxOjEgaW4gY2FzZSBvZiBETEwgb2ZmIG1vZGUgZWxzZSAyOjEqLworCXZhbHVlID0gKGRkcjNUaXBDbG9ja01vZGUoZnJlcXVlbmN5KSA9PSAxKT8gMCA6IDE7CisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLV3JpdGUoZGV2TnVtLCAweDE1MjQsICh2YWx1ZSA8PCAxNSksICgxIDw8IDE1KSkpOworCisJLyogRHVuaXQgdHJhaW5pbmcgY2xvY2sgKyAxOjEvMjoxIG1vZGUgKi8KKwlkaXZSYXRpbyA9IChkZHIzVGlwQ2xvY2tNb2RlKGZyZXF1ZW5jeSkgPDwgMTYpOworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCAgMHhGODI5OCwgICZkYXRhLCBNQVNLX0FMTF9CSVRTICkpOworCS8qZGRyX3BoeV9jbGtfZGl2aWRlciovCisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweEY4Mjk4LCAgUl9NT0RfVyhkaXZSYXRpbywgZGF0YSwgKDB4MyA8PCAxNikpKSk7CisJZGl2UmF0aW8gPSAoZnJlcXVlbmN5PT1pbml0RnJlcSk/KDApOigxKTsKKwkvKnNlbF9wbGxfZGRyX2Nsa19kaXYyKi8KKwlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIDB4RjgyOTgsICBSX01PRF9XKCBkaXZSYXRpbzw8MTUsIGRhdGEsICgweDEgPDwgMTUpKSkpOworCisJLypjcHVfcGxsX2Nsa2Rpdl9yZWxvYWRfc21vb3RoKi8KKwlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgIDB4RjgyNzAsICAmZGF0YSwgTUFTS19BTExfQklUUyApKTsKKwlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIDB4RjgyNzAsICBSX01PRF9XKCgvKjB4N0Y8Ki8weDZmPDExKSwgZGF0YSwgKDB4N0YgPDwgMTEpKSkpOworCisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZChkZXZOdW0sICAweEY4MjY4LCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMgKSk7CisJLypjcHVfcGxsX2Nsa2Rpdl9yZWxheF9lbiovCisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweEY4MjY4LCAgUl9NT0RfVygvKjB4N0Y8Ki8weDZmLCBkYXRhLCAweDdGKSkpOworCS8qY3B1X3BsbF9jbGtkaXZfcmVzZXRfbWFzayovCisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweEY4MjY4LCAgUl9NT0RfVygoLyoweDdGPCovMHg2Zjw8NyksIGRhdGEsICgweDdGIDw8IDcpKSkpOworCisJLypjcHVfcGxsX2Rkcl9jbGtkaXZfcmF0aW9fZnVsbCovCisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZChkZXZOdW0sICAweEY4MjZDLCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMgKSk7CisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweEY4MjZDLCAgUl9NT0RfVygoZGl2aWRlcjw8MTIpLCBkYXRhLCAoMHgzRiA8PCAxMikpKSk7CisKKwkvKmNwdV9wbGxfY2xrZGl2X3JlbG9hZF9mb3JjZSovCisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZChkZXZOdW0sICAweEY4MjY4LCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMgKSk7CisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweEY4MjY4LCAgUl9NT0RfVygoMHgyPDwyMSksIGRhdGEsICgweDdGIDw8IDIxKSkpKTsKKworCS8qY3B1X3BsbF9jbGtkaXZfcmVsb2FkX3JhdGlvKi8KKwlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgIDB4RjgyNzAsICAmZGF0YSwgTUFTS19BTExfQklUUyApKTsKKwlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIDB4RjgyNzAsICBSX01PRF9XKCgweDE8PDEwKSwgZGF0YSwgKDB4MSA8PCAxMCkpKSk7CisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweEY4MjcwLCAgUl9NT0RfVygwLCBkYXRhLCAoMHgxIDw8IDEwKSkpKTsKKworICAgIERFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9JTkZPLCAoIlx0Q1BVIFBMTCBjb25maWcgRG9uZVxuIikpOworI2VuZGlmCisgICAgcmV0dXJuIEdUX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBkZHIzVGlwQm9iS0dldEluaXRGcmVxLgorKiBEZXNjOiAgICAgY2hvb3NlIGZyb20gd2hlcmUgdG8gZXh0cmFjdCB0aGUgZnJlcXVlbmN5IChUTSBvciBDUFUpCisqIEFyZ3M6CisqIE5vdGVzOgorKiBSZXR1cm5zOiAgR1RfT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK0dUX1NUQVRVUyBkZHIzVGlwQm9iS0dldEluaXRGcmVxCisoCisJR1RfVTgJCQkJZGV2TnVtLAorCUdUX1UzMgkJCQlpbnRlcmZhY2VJZCwKKyAgICBNVl9IV1NfRERSX0ZSRVEqIAlzYXJGcmVxCispCit7CisJR1RfU1RBVFVTIHJlczsKKworCWlmKGludGVyZmFjZUlkIDwgNCkKKwl7CisJCXJlcyA9IGRkcjNUaXBUbUdldEluaXRGcmVxKGRldk51bSwgc2FyRnJlcSk7CisJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9UUkFDRSwgKCJUTSBmcmVxdWVuY3kgZm9yIGludGVyZmFjZSAlZCBpcyAlZFxuIixpbnRlcmZhY2VJZCwgKnNhckZyZXEpKTsKKwl9CisJZWxzZQorCXsKKwkJcmVzID0gZGRyM1RpcENwdUdldEluaXRGcmVxKGRldk51bSwgc2FyRnJlcSk7CisJfQorCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVE0gaW50ZXJmYWNlIGZyZXF1ZW5jeSBHZXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBHVF9TVEFUVVMgZGRyM1RpcFRtR2V0SW5pdEZyZXEKKygKKwlHVF9TVEFUVVMgICAgICAgZGV2TnVtLAorCU1WX0hXU19ERFJfRlJFUSAqZnJlcQorKQoreworICAgIEdUX1UzMiBkYXRhOworCisgICAgLyogY2FsYyBTQVIgKi8KKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgMHgwMDBGODIwNCAsICAmZGF0YSwgTUFTS19BTExfQklUUykpOworICAgIGRhdGEgPSAoZGF0YSA+PiAxNSkgJiAweDc7CisjaWZkZWYgQVNJQ19TSU1VTEFUSU9OCisgICAgZGF0YSA9IDI7CisjZW5kaWYKKyAgICBzd2l0Y2goZGF0YSkKKyAgICB7CisJY2FzZSAwOgorCQkvKiBUTSBpcyBkaXNhYmxlZCAqLworCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfVFJBQ0UsICgiVE0gRGlzYWJsZWRcbiIpKTsKKwkJKmZyZXEgPSBERFJfRlJFUV9MSU1JVDsKKwkJcmV0dXJuIEdUX05PVF9JTklUSUFMSVpFRDsKKworCWNhc2UgMToKKwkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIlRNIEREUl9GUkVRXzgwMFxuIikpOworCQkqZnJlcSA9IEREUl9GUkVRXzgwMDsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9UUkFDRSwgKCJUTSBERFJfRlJFUV85MzNcbiIpKTsKKwkJKmZyZXEgPSBERFJfRlJFUV85MzM7CisJCWJyZWFrOworCisJY2FzZSAzOgorCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfVFJBQ0UsICgiVE0gRERSX0ZSRVFfNjY3XG4iKSk7CisJCSpmcmVxID0gRERSX0ZSRVFfNjY3OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9FUlJPUiwgKCJFcnJvcjogZGRyM1RpcFRtR2V0SW5pdEZyZXE6IFVua25vd24gRnJlcSBTQVIgdmFsdWUgMHgleFxuIiwgZGF0YSkpOworCQkqZnJlcSA9IEREUl9GUkVRX0xJTUlUOworCQlyZXR1cm4gR1RfQkFEX1BBUkFNOworICAgIH0KKyAgICByZXR1cm4gR1RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ1BVIGludGVyZmFjZSBmcmVxdWVuY3kgR2V0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgR1RfU1RBVFVTIGRkcjNUaXBDcHVHZXRJbml0RnJlcQorKAorICAgIEdUX1NUQVRVUyAgICAgICBkZXZOdW0sCisgICAgTVZfSFdTX0REUl9GUkVRICpmcmVxCispCit7CisJR1RfVTMyIGRhdGE7CisKKyAgICAvKiBjYWxjIFNBUiAqLworICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCBSRUdfREVWSUNFX1NBUjFfQUREUiwmZGF0YSwgTUFTS19BTExfQklUUyApKTsKKyAgICBERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfSU5GTywgKCJTQVIxIGlzIDB4JVhcbiIsIGRhdGEpKTsKKworICAgIGRhdGEgPSAoZGF0YSA+PiBQTEwxX0NORklHX09GRlNFVCkgJiBQTEwxX0NORklHX01BU0s7CisKKyAgICBzd2l0Y2goZGF0YSkKKyAgICB7CisgICAgICAgIGNhc2UgMDoKKwkJY2FzZSA1OgorCQkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIkREUl9GUkVRXzQwMFxuIikpOworICAgICAgICAgICAgKmZyZXEgPSBERFJfRlJFUV80MDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorCQkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIkREUl9GUkVRXzUzM1xuIikpOworICAgICAgICAgICAgKmZyZXEgPSBERFJfRlJFUV81MzM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorCQkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIkREUl9GUkVRXzY2N1xuIikpOworICAgICAgICAgICAgKmZyZXEgPSBERFJfRlJFUV82Njc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorCQkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIkREUl9GUkVRXzgwMFxuIikpOworICAgICAgICAgICAgKmZyZXEgPSBERFJfRlJFUV84MDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9JTkZPLCAoIkZyZXEgU0FSIFVua25vd25cbiIpKTsKKyAgICAgICAgICAgICpmcmVxID0gRERSX0ZSRVFfTElNSVQ7CisgICAgICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOworICAgIH0KKyAgICByZXR1cm4gR1RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNUaXBCb2JLR2V0TWVkaXVtRnJlcS4KKyogRGVzYzoKKyogQXJnczoKKyogTm90ZXM6CisqIFJldHVybnM6ICBHVF9PSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwQm9iS0dldE1lZGl1bUZyZXEKKygKKwlHVF9VMzIgZGV2TnVtLAorCUdUX1UzMiBpbnRlcmZhY2VJZCwKKwlNVl9IV1NfRERSX0ZSRVEgKmZyZXEKKykKK3sKKyAgICBNVl9IV1NfRERSX0ZSRVEgc2FyRnJlcTsKKworICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLR2V0SW5pdEZyZXEoKEdUX1U4KWRldk51bSwgaW50ZXJmYWNlSWQsICZzYXJGcmVxKSk7CisKKyAgICAgIHN3aXRjaChzYXJGcmVxKQorICAgICAgeworICAgICAgICAgIGNhc2UgRERSX0ZSRVFfNDAwOgorICAgICAgICAgICAgICBERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfVFJBQ0UsICgiTm8gbWVkaXVtIGZyZXEgc3VwcG9ydGVkIGZvciA0MDBNaHpcbiIpKTsKKyAgICAgICAgICAgICAgKmZyZXEgPSBERFJfRlJFUV80MDA7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBERFJfRlJFUV82Njc6CisgICAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9UUkFDRSwgKCJNZWRpdW0gRERSX0ZSRVFfMzMzXG4iKSk7CisgICAgICAgICAgICAgICpmcmVxID0gRERSX0ZSRVFfMzMzOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgRERSX0ZSRVFfODAwOgorICAgICAgICAgICAgICBERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfVFJBQ0UsICgiTWVkaXVtIEREUl9GUkVRXzQwMFxuIikpOworICAgICAgICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzQwMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEREUl9GUkVRXzkzMzoKKyAgICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIk1lZGl1bSBERFJfRlJFUV8zMTFcbiIpKTsKKyAgICAgICAgICAgICAgKmZyZXEgPSBERFJfRlJFUV8zMTE7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0VSUk9SLCAoIkVycm9yOiBkZHIzVGlwQmMyR2V0TWVkaXVtRnJlcTogRnJlcSAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBzYXJGcmVxKSk7CisgICAgICAgICAgICAgIHJldHVybiBHVF9GQUlMOworICAgICAgfQorICAgIHJldHVybiBHVF9PSzsKK30KKworCitHVF9TVEFUVVMgZGRyM1RpcEJvYktHZXREZXZpY2VJbmZvCisoCisgICAgR1RfVTggICAgICBkZXZOdW0sCisgICAgTVZfRERSM19ERVZJQ0VfSU5GTyAqIGluZm9QdHIKKykKK3sKKyAgICBkZXZOdW0gPSBkZXZOdW07IC8qIGF2b2lkIHdhcm5pbmdzICovCisKKwlpbmZvUHRyLT5kZXZpY2VJZCA9IDB4RkMwMDsKKwlpbmZvUHRyLT5ja0RlbGF5ID0gY2tEZWxheTsKKworCXJldHVybiBHVF9PSzsKK30KKworCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzTXN5cy5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM01zeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjViMzUzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM01zeXMuYwpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwMSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KKyogVGhpcyBjb2RlIGNvbnRhaW5zIGNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiBvZiBNYXJ2ZWxsIHNlbWljb25kdWN0b3IsIGluYy4KKyogbm8gcmlnaHRzIGFyZSBncmFudGVkIGhlcmVpbiB1bmRlciBhbnkgcGF0ZW50LCBtYXNrIHdvcmsgcmlnaHQgb3IgY29weXJpZ2h0CisqIG9mIE1hcnZlbGwgb3IgYW55IHRoaXJkIHBhcnR5LgorKiBNYXJ2ZWxsIHJlc2VydmVzIHRoZSByaWdodCBhdCBpdHMgc29sZSBkaXNjcmV0aW9uIHRvIHJlcXVlc3QgdGhhdCB0aGlzIGNvZGUKKyogYmUgaW1tZWRpYXRlbHkgcmV0dXJuZWQgdG8gTWFydmVsbC4gVGhpcyBjb2RlIGlzIHByb3ZpZGVkICJhcyBpcyIuCisqIE1hcnZlbGwgbWFrZXMgbm8gd2FycmFudGllcywgZXhwcmVzcywgaW1wbGllZCBvciBvdGhlcndpc2UsIHJlZ2FyZGluZyBpdHMKKyogYWNjdXJhY3ksIGNvbXBsZXRlbmVzcyBvciBwZXJmb3JtYW5jZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12SHdzRGRyM01zeXMuYworKgorKiBERVNDUklQVElPTjogRERSMyBNU1lTIGdlbmVyYWwgZnVuY3Rpb25zKgorKiBERVBFTkRFTkNJRVM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwUHJ2SWYuaCIKKworR1RfVTMyIHBoeTFWYWxUYWJsZVtERFJfRlJFUV9MSU1JVF0gPQoreworICAwLCAgIC8qIEREUl9GUkVRX0xPV19GUkVRICovCisgIDB4ZiwgLyogRERSX0ZSRVFfNDAwICovCisgIDB4ZiwgLyogRERSX0ZSRVFfNTMzICovCisgIDB4ZiwgLyogRERSX0ZSRVFfNjY3ICovCisgIDB4YywgLyogRERSX0ZSRVFfODAwICovCisgIDB4OCwgLyogRERSX0ZSRVFfOTMzICovCisgIDB4OCwgLyogRERSX0ZSRVFfMTA2NiAqLworICAweGYsIC8qIEREUl9GUkVRXzMxMSAqLworICAweGYsIC8qIEREUl9GUkVRXzMzMyAqLworICAweGYsIC8qIEREUl9GUkVRXzQ2NyAqLworICAweGMsIC8qRERSX0ZSRVFfODUwKi8KKyAgMHhmLCAvKkREUl9GUkVRXzYwMCovCisgIDB4ZiwgLypERFJfRlJFUV8zMDAqLworICAweDgsICAvKkREUl9GUkVRXzkwMCovCisgIDB4ZiAgLypERFJfRlJFUV8zNjAqLworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKipleHRlcm5hbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gTVZfSFdTX1RJUF9DT05GSUdfRlVOQ19EQiBjb25maWdGdW5jSW5mb1tIV1NfTUFYX0RFVklDRV9OVU1dOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitYU0IgRXh0ZXJuYWwgcmVhZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworR1RfU1RBVFVTICAgIGRkcjNUaXBFeHRSZWFkCisoCisgICAgR1RfVTMyICAgICAgZGV2TnVtLAorICAgIEdUX1UzMiAgICAgIGludGVyZmFjZUlkLAorICAgIEdUX1UzMiAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgbnVtT2ZCdXJzdHMsCisgICAgR1RfVTMyICAgICAgKmRhdGEKKykKK3sKKyAgICByZXR1cm4gY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBFeHRlcm5hbFJlYWQoZGV2TnVtLGludGVyZmFjZUlkLHJlZ0FkZHIsbnVtT2ZCdXJzdHMsZGF0YSk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1hTQiBFeHRlcm5hbCB3cml0ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworR1RfU1RBVFVTICAgIGRkcjNUaXBFeHRXcml0ZQorKAorICAgIEdUX1UzMiAgICAgIGRldk51bSwKKyAgICBHVF9VMzIgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgIG51bU9mQnVyc3RzLAorICAgIEdUX1UzMiAgICAgICphZGRyCispCit7CisgICAgcmV0dXJuIGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwRXh0ZXJuYWxXcml0ZShkZXZOdW0saW50ZXJmYWNlSWQscmVnQWRkcixudW1PZkJ1cnN0cyxhZGRyKTsKK30KKworCisKKworCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzTlA1LmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzTlA1LmMKaW5kZXggMjY1N2Y4Yy4uN2RjZWQwMyAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM05QNS5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNOUDUuYwpAQCAtNjQsNyArNjQsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIHByZS1kZWNsYXJhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBSZWFkIDFzdCBhY3RpdmUgaW50ZXJmYWNlICovCiBleHRlcm4gR1RfVTMyIG1hc2tUdW5lRnVuYzsKLWV4dGVybiBHVF9VMzIgcmxWZXJzaW9uOwogZXh0ZXJuIE1WX0hXU19ERFJfRlJFUSBtZWRpdW1GcmVxOwogZXh0ZXJuIE1WX0hXU19ERFJfRlJFUSBsb3dGcmVxOwogZXh0ZXJuIEdUX1UzMiBpc1BsbEJlZm9yZUluaXQ7CkBAIC03Miw4ICs3MSw5IEBACiBleHRlcm4gTVZfSFdTX0REUl9GUkVRIGluaXRGcmVxOwogZXh0ZXJuIEdUX1UzMiBvZHRBZGRpdGlvbmFsOwogZXh0ZXJuIEdUX1U4ICBkZWJ1Z1RyYWluaW5nOwotZXh0ZXJuIEdUX1UzMiBkZWxheUVuYWJsZSwgY2tEZWxheSwgY2FEZWxheSwgY2tEZWxheV8xNjsKK2V4dGVybiBHVF9VMzIgZGVsYXlFbmFibGUsIGNrRGVsYXksIGNhRGVsYXk7CiBleHRlcm4gR1RfVTggY2FsaWJyYXRpb25VcGRhdGVDb250cm9sOyAvKjIgZXh0ZXJuYWwgb25seSwgMSBpcyBpbnRlcm5hbCBvbmx5Ki8KK2V4dGVybiBHVF9VMzIgZGZzTG93RnJlcTsKIAogZXh0ZXJuIEdUX1NUQVRVUyBkZHIzVGlwUmVnV3JpdGUKICgKQEAgLTg5OSw4ICs4OTksOSBAQAogICAgIE1WX0hXU19USVBfU1RBVElDX0NPTkZJR19JTkZPIHN0YXRpY0NvbmZpZzsKICAgICBNVl9IV1NfVElQX0NPTkZJR19GVU5DX0RCIGNvbmZpZ0Z1bmM7CiAgICAgTVZfSFdTX1hTQl9JTkZPICAgICAgICAgeHNiSW5mbzsKKwlHVF9VOCBudW1PZkJ1c1BlckludGVyZmFjZSA9IDQ7CiAKLSAgICBHVF9VMzIgYm9hcmRPZmZzZXQgPSBib2FyZElkICogTlA1X05VTUJFUl9PRl9JTlRFUkZBQ0VTICpucDVUb3BvbG9neU1hcFtib2FyZElkXS5udW1PZkJ1c1BlckludGVyZmFjZTsKKyAgICBHVF9VMzIgYm9hcmRPZmZzZXQgPSBib2FyZElkICogTlA1X05VTUJFUl9PRl9JTlRFUkZBQ0VTICpudW1PZkJ1c1BlckludGVyZmFjZTsKIAogCURFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0lORk8sICgicmVnaXN0ZXIgZnVuY3Rpb25zIFxuIikpOwogCkBAIC05MTcsNiArOTE4LDEzIEBACiAKICAgICBtdkh3c0RkcjNUaXBJbml0Q29uZmlnRnVuYyhkZXZOdW0sICZjb25maWdGdW5jKTsKIAorCS8qU2V0IGRldmljZSBhdHRyaWJ1dGVzKi8KKwlkZHIzVGlwRGV2QXR0ckluaXQoZGV2TnVtKTsKKwlkZHIzVGlwRGV2QXR0clNldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFViwgTVZfVElQX1JFVl8xKTsKKwlkZHIzVGlwRGV2QXR0clNldChkZXZOdW0sIE1WX0FUVFJfUEhZX0VER0UsIE1WX0REUl9QSFlfRURHRV9ORUdBVElWRSk7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UsIG51bU9mQnVzUGVySW50ZXJmYWNlKTsKKwlkZHIzVGlwRGV2QXR0clNldChkZXZOdW0sIE1WX0FUVFJfSU5URVJMRUFWRV9XQSwgR1RfRkFMU0UpOworCiAjaWZkZWYgU1RBVElDX0FMR09fU1VQUE9SVAogICAgIGRkcjNUaXBJbml0U3RhdGljQ29uZmlnRGIoZGV2TnVtLCAmc3RhdGljQ29uZmlnKTsKICNlbmRpZgpAQCAtOTQzLDcgKzk1MSw2IEBACiAgICAgbG93RnJlcSA9IEREUl9GUkVRX0xPV19GUkVROwogICAgIG1lZGl1bUZyZXEgPSBERFJfRlJFUV82Njc7CiAgICAgaXNQbGxCZWZvcmVJbml0ID0gMTsKLSAgICBybFZlcnNpb24gPSAwOwogICAgIGluaXRGcmVxID0gRERSX0ZSRVFfNjY3OwogCWRlYnVnVHJhaW5pbmcgPSBERUJVR19MRVZFTF9JTkZPOwogCW9kdEFkZGl0aW9uYWwgPSAwOwpAQCAtOTUxLDEwICs5NTgsOSBAQAogCWRlbGF5RW5hYmxlID0gMDsKIAlpZiggY2tEZWxheSA9PSAtMSApCiAJCWNrRGVsYXkgPSAxNTA7Ci0JaWYoIGNrRGVsYXlfMTYgPT0gLTEgKQotCQlja0RlbGF5XzE2ID0gMDsKIAljYURlbGF5ID0gMDsKIAljYWxpYnJhdGlvblVwZGF0ZUNvbnRyb2wgPSAxOworCWZyZXFWYWxbRERSX0ZSRVFfTE9XX0ZSRVFdID0gZGZzTG93RnJlcSA9IDEwMDsKIAogICAgIHJldHVybiBHVF9PSzsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNhMzh4LmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzYTM4eC5jCmluZGV4IDI0ZTljYjEuLjQxMjEwNGEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNhMzh4LmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM2EzOHguYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgImRkcjNfYTM4eF90aXBfdHJhaW5pbmdfc3RhdGljLmgiCiAjaW5jbHVkZSAiZGRyM19od3Nfc2lsX3RyYWluaW5nLmgiCiAjaW5jbHVkZSAibXZYb3IuaCIKKyNpbmNsdWRlICJtdlN5c0VudkxpYi5oIgogCiAjaW5jbHVkZSAibXZId3NEZHIzQTM4eC5oIgogI2luY2x1ZGUgIm12U2lsaWNvbklmLmgiCkBAIC00MSw5ICs0MiwxMyBAQAogZXh0ZXJuIEdUX1U4ICBkZWJ1Z1RyYWluaW5nQTM4eDsKIGV4dGVybiBHVF9VMzIgZmlyc3RBY3RpdmVJZjsKIGV4dGVybiBNVl9IV1NfRERSX0ZSRVEgaW5pdEZyZXE7Ci1leHRlcm4gR1RfVTMyIGRlbGF5RW5hYmxlLCBja0RlbGF5LCBja0RlbGF5XzE2LCBjYURlbGF5OwotR1RfVTMyICBwaXBlTXVsdGljYXN0TWFzazsKK2V4dGVybiBHVF9VMzIgZGVsYXlFbmFibGUsIGNrRGVsYXksIGNhRGVsYXk7CitleHRlcm4gR1RfVTMyIGRmc0xvd0ZyZXE7CiAKK2V4dGVybiBHVF9VMzIgbW9kZTJUOworCitHVF9VMzIgIHBpcGVNdWx0aWNhc3RNYXNrOworR1RfQk9PTCBkZHIzQXN5bmNNb2RlQXRURiA9IEdUX0ZBTFNFOwogI2RlZmluZSBBMzhYX05VTV9CWVRFUyAgICAgICAgICAgICAgICAgICgzKQogI2RlZmluZSBBMzhYX05VTUJFUl9PRl9JTlRFUkZBQ0VTCQk1CiAKQEAgLTU2LDQyICs2MSwxNCBAQAogZXh0ZXJuIE1WX0JPT0wgZGRyM0lmRWNjRW5hYmxlZCh2b2lkKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBwcmUtZGVjbGFyYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIEdUX1UzMiBtYXNrVHVuZUZ1bmM7Ci1leHRlcm4gR1RfVTMyIHJsVmVyc2lvbjsKIGV4dGVybiBHVF9CT09MIHJsTWlkRnJlcVdBOwogZXh0ZXJuIEdUX1U4IGNhbGlicmF0aW9uVXBkYXRlQ29udHJvbDsgLyoyIGV4dGVybmFsIG9ubHksIDEgaXMgaW50ZXJuYWwgb25seSovCitleHRlcm4gR1RfVTMyIGZyZXFWYWxbXTsKIAotCi0jaWZkZWYgQ09ORklHX0REUjMKLXN0YXRpYyBHVF9VMTYgZnJlcVZhbFtERFJfRlJFUV9MSU1JVF0gPQotewotICAgIDEzMCwgLypERFJfRlJFUV9MT1dfRlJFUSovCi0gICAgNDAwLCAvKkREUl9GUkVRXzQwMCwqLwotICAgIDUzMywgLypERFJfRlJFUV81MzMsKi8KLSAgICA2NjYsIC8qRERSX0ZSRVFfNjY3LCovCi0gICAgODAwLCAvKkREUl9GUkVRXzgwMCwqLwotICAgIDkzMywgLypERFJfRlJFUV85MzMsKi8KLSAgIDEwNjYsIC8qRERSX0ZSRVFfMTA2NiwqLwotICAgIDMxMSwgLypERFJfRlJFUV8zMTEsKi8KLSAgICAzMzMsIC8qRERSX0ZSRVFfMzMzLCovCi0gICAgNDY3LCAvKkREUl9GUkVRXzQ2NywqLwotICAgIDg1MCwgLypERFJfRlJFUV84NTAsKi8KLSAgICA2MDAsIC8qRERSX0ZSRVFfNjAwLCovCi0gICAgMzAwLCAvKkREUl9GUkVRXzMwMCwqLwotCTkwMCwgIC8qRERSX0ZSRVFfOTAwKi8KLQkzNjAsICAvKkREUl9GUkVRXzM2MCovCi0JMTAwMCAgLypERFJfRlJFUV8xMDAwKi8KLX07Ci0jZWxzZSAvKiBDT05GSUdfRERSNCAqLwotc3RhdGljIEdUX1UxNiBmcmVxVmFsW0REUl9GUkVRX0xJTUlUXSA9Ci17Ci0gICAgMTMwLCAgICAvKiBERFJfRlJFUV9MT1dfRlJFUSAqLwotICAgIDY2NiwgICAgLyogRERSX0ZSRVFfNjY3ICovCi0gICAgODAwLCAgICAvKiBERFJfRlJFUV84MDAgKi8KLSAgICA5MzMsICAgIC8qIEREUl9GUkVRXzkzMyAqLwotICAgIDEwNjYsICAvKiBERFJfRlJFUV8xMDY2ICovCi0JOTAwICAJLypERFJfRlJFUV85MDAqLwotfTsKKyNpZmRlZiBDT05GSUdfRERSNAorZXh0ZXJuIEdUX1U4CXZyZWZDYWxpYnJhdGlvbldBOyAvKjEgbWVhbnMgU1NUTCAmIFBPRCBnZXRzIHRoZSBzYW1lIFZyZWYgYW5kIGEgV0EgaXMgbmVlZGVkKi8KICNlbmRpZgorCiBleHRlcm4gTVZfSFdTX0REUl9GUkVRIG1lZGl1bUZyZXE7CiAKIGV4dGVybiBHVF9TVEFUVVMgZGRyM1RpcFJlZ1dyaXRlCkBAIC0xMzQsNiArMTExLDkgQEAKICAgICBHVF9TVEFUVVMgICAgICAgZGV2TnVtLAogICAgIE1WX0hXU19ERFJfRlJFUSAqZnJlcQogKTsKKworR1RfVTggICAgZGRyM1RpcENsb2NrTW9kZSggR1RfVTMyIGZyZXF1ZW5jeSApOworCiAjaWZkZWYgQ09ORklHX0REUjMKIEdUX1NUQVRVUyBkZHIzVGlwQTM4eEdldE1lZGl1bUZyZXEKICgKQEAgLTE3Nyw2ICsxNTcsNyBAQAogICAgIDB4NSwgLypERFJfRlJFUV8xMDY2Ki8KICNpZmRlZiBDT05GSUdfRERSNAogCTB4NSwgLypERFJfRlJFUV85MDAqLworCTB4NSwgLypERFJfRlJFUV8xMDAwKi8KICNlbmRpZgogI2lmZGVmIENPTkZJR19ERFIzCiAgICAgMHgzLCAvKkREUl9GUkVRXzMxMSovCkBAIC0xOTMsNyArMTc0LDYgQEAKIAogc3RhdGljIEdUX1U4IEEzOHhSYXRlUGVyRnJlcVtERFJfRlJFUV9MSU1JVF0gPQogewotLypUQkQqLwogICAgIDB4MSwgLypERFJfRlJFUV8xMDAqLwogI2lmZGVmIENPTkZJR19ERFIzCiAgICAgMHgyLCAvKkREUl9GUkVRXzQwMCovCkBAIC0yMDUsNiArMTg1LDcgQEAKICAgICAweDMsIC8qRERSX0ZSRVFfMTA2NiovCiAjaWZkZWYgQ09ORklHX0REUjQKIAkweDIsIC8qRERSX0ZSRVFfOTAwKi8KKwkweDIsIC8qRERSX0ZSRVFfMTAwMCovCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRERSMwogICAgIDB4MSwgLypERFJfRlJFUV8zMTEqLwpAQCAtMjE5LDcgKzIwMCw3IEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyBHVF9VMTYgQTM4eFZjb0ZyZXFQZXJTYXJbXSA9CitzdGF0aWMgR1RfVTE2IEEzOHhWY29GcmVxUGVyU2FyUmVmQ2xrMjVNaHpbXSA9CiB7CiAJNjY2LCAvKjAqLwogCTEzMzIsCkBAIC0yNTQsMTYgKzIzNSw2NSBAQAogCTgwMAogfTsKIAotI2lmZGVmIENPTkZJR19BUk1BREFfMzhYX1oxX09CU09MRVRFCi1HVF9VMzIgRFFiaXRNYXAyUGh5cGluW10gPQorc3RhdGljIEdUX1UxNiBBMzh4VmNvRnJlcVBlclNhclJlZkNsazQwTWh6W10gPQogewotICAgIDEsIDAsICAyLCAzLCAgNiwgNywgOCwgIDksIAkvLzAKLSAgICAwLCAxLCAxMCwgMywgIDYsIDcsIDgsICA5LAkvLzEKLSAgICA4LCAxLCAgMiwgMCwgMTAsIDksIDYsICA3LAkvLzIKLSAgICAwLCAxLCAgMiwgMywgIDcsIDgsIDYsIDEwLAkvLzMKLSAgICAwLCAxLCAgMiwgMywgIDYsIDcsIDgsICA5LAkvLzQKKwk2NjYsIC8qMCovCisJMTMzMiwKKwk4MDAsCisJODAwLCAvKjB4MyovCisJMTA2NiwKKwkxMDY2LCAvKjB4NSovCisJMTIwMCwKKwkyNDAwLAorCTEzMzIsCisJMTMzMiwKKwkxNTAwLC8qMTAqLworCTE2MDAsIC8qMHhCKi8KKwkxNjAwLAorCTE2MDAsCisJMTcwMCwKKwkxNTYwLCAvKjB4RiovCisJMTg2NiwKKwkxODY2LAorCTE4MDAsCisJMjAwMCwKKwkyMDAwLC8qMjAqLworCTQwMDAsCisJMjEzMiwKKwkyMTMyLAorCTIzMDAsCisJMjMwMCwKKwkyNDAwLAorCTI0MDAsCisJMjUwMCwKKwkyNTAwLAorCTE4MDAgLyozMCAtIDB4MUUqLwogfTsKLSNlbHNlCisKK0dUX1UxNiBBMzh4T0RUU2xvcGVbXSA9Cit7CisJMjE0NDMsCisJMTQ1MiwKKwk0ODIsCisJMjQwLAorCTE0MSwKKwk5MCwKKwk2NywKKwk1MgorfTsKKworR1RfVTE2IEEzOHhPRFRJbnRlcmNlcHRbXSA9Cit7CisJMTUxNywKKwkzMjgsCisJMTg2LAorCTEzMSwKKwkxMDAsCisJODAsCisJNjksCisJNjEKK307CisKIEdUX1UzMiBEUWJpdE1hcDJQaHlwaW5bXSA9CiB7CiAJMSwgMCwgMiwgNiwgOSwgOCwgMywgNywJLy8wCkBAIC0yNzIsNyArMzAyLDYgQEAKIAkxLCAwLCA2LCAyLCA4LCAzLCA3LCA5LAkvLzMKIAkwLCAxLCAyLCA5LCA3LCA4LCAzLCA2LAkvLzQKIH07Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTI4NSw4ICszMTQsMTQgQEAKIAlHVF8zMiByZWcgPSAwOwogCiAJLyogSW5pdGlhdGVzIFRTRU4gaGFyZHdhcmUgcmVzZXQgb25jZSAqLwotCWlmICgoTVZfUkVHX1JFQUQoVFNFTl9DT05GX1JFRykgJiBUU0VOX0NPTkZfUlNUX01BU0spID09IDApCi0JCU1WX1JFR19CSVRfU0VUKFRTRU5fQ09ORl9SRUcsIFRTRU5fQ09ORl9SU1RfTUFTSyk7CisJaWYgKChNVl9SRUdfUkVBRChUU0VOX0NPTlRST0xfTVNCX1JFRykgJiBUU0VOX0NPTlRST0xfTVNCX1JTVF9NQVNLKSA9PSAwKSB7CisJCU1WX1JFR19CSVRfU0VUKFRTRU5fQ09OVFJPTF9NU0JfUkVHLCBUU0VOX0NPTlRST0xfTVNCX1JTVF9NQVNLKTsKKwkJLyogc2V0IFRzZW4gVGMgVHJpbSB0byBjb3JyZWN0IGRlZmF1bHQgdmFsdWUgKGVycmF0YSAjMTMyNjk4KSAqLworCQlyZWcgPSBNVl9SRUdfUkVBRChUU0VOX0NPTlRST0xfTFNCX1JFRyk7CisJCXJlZyAmPSB+VFNFTl9DT05UUk9MX0xTQl9UQ19UUklNX01BU0s7CisJCXJlZyB8PSAweDMgPDwgVFNFTl9DT05UUk9MX0xTQl9UQ19UUklNX09GRlNFVDsKKwkJTVZfUkVHX1dSSVRFKFRTRU5fQ09OVFJPTF9MU0JfUkVHLCByZWcpOworCX0KIAltdk9zRGVsYXkoMTApOwogCiAJLyogQ2hlY2sgaWYgdGhlIHJlYWRvdXQgZmllbGQgaXMgdmFsaWQgKi8KQEAgLTUwMSw2ICs1MzYsNyBAQAogCU1WX0hXU19ERFJfRlJFUSB1aURkckZyZXE7CiAJTVZfU1RBVFVTIHN0YXR1czsKIAlNVl9IV1NfVE9QT0xPR1lfTUFQKiB0b3BvbG9neU1hcCA9IGRkcjNUaXBHZXRUb3BvbG9neU1hcChkZXZOdW0pOworCUdUX1U4IG51bU9mQnVzUGVySW50ZXJmYWNlID0gNTsKIAogICAgIC8qIG5ldyByZWFkIGxldmVsaW5nIHZlcnNpb24gKi8KICAgICBjb25maWdGdW5jLnRpcER1bml0UmVhZEZ1bmMgPSBkZHIzVGlwQTM4eElGUmVhZDsKQEAgLTUxMCwxNSArNTQ2LDI3IEBACiAJY29uZmlnRnVuYy50aXBTZXRGcmVxRGl2aWRlckZ1bmMgPSBkZHIzVGlwQTM4eFNldERpdmlkZXI7CiAJY29uZmlnRnVuYy50aXBHZXREZXZpY2VJbmZvRnVuYyA9IGRkcjNUaXBBMzh4R2V0RGV2aWNlSW5mbzsKIAljb25maWdGdW5jLnRpcEdldFRlbXBlcmF0dXJlID0gZGRyM0N0cmxHZXRKdW5jVGVtcDsKKwljb25maWdGdW5jLnRpcEdldENsb2NrUmF0aW8gPSBkZHIzVGlwQ2xvY2tNb2RlOwogCiAgICAgbXZId3NEZHIzVGlwSW5pdENvbmZpZ0Z1bmMoZGV2TnVtLCAmY29uZmlnRnVuYyk7CiAKIAlkZHIzVGlwUmVnaXN0ZXJEcVRhYmxlKGRldk51bSwgRFFiaXRNYXAyUGh5cGluKTsKIAorCS8qU2V0IGRldmljZSBhdHRyaWJ1dGVzKi8KKwlkZHIzVGlwRGV2QXR0ckluaXQoZGV2TnVtKTsKKwlkZHIzVGlwRGV2QXR0clNldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFViwgTVZfVElQX1JFVl80KTsKKwlkZHIzVGlwRGV2QXR0clNldChkZXZOdW0sIE1WX0FUVFJfUEhZX0VER0UsIE1WX0REUl9QSFlfRURHRV9QT1NJVElWRSk7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UsIG51bU9mQnVzUGVySW50ZXJmYWNlKTsKKyNpZmRlZiBDT05GSUdfQVJNQURBXzM5WAorCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9JTlRFUkxFQVZFX1dBLCBHVF9UUlVFKTsKKyNlbHNlCisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX0lOVEVSTEVBVkVfV0EsIEdUX0ZBTFNFKTsKKyNlbmRpZgorCiAjaWZkZWYgU1RBVElDX0FMR09fU1VQUE9SVAogCXsKIAkJTVZfSFdTX1RJUF9TVEFUSUNfQ09ORklHX0lORk8gc3RhdGljQ29uZmlnOwotICAgIAlHVF9VMzIgYm9hcmRPZmZzZXQgPSBib2FyZElkICogQTM4WF9OVU1CRVJfT0ZfSU5URVJGQUNFUyAqdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOworICAgIAlHVF9VMzIgYm9hcmRPZmZzZXQgPSBib2FyZElkICogQTM4WF9OVU1CRVJfT0ZfSU5URVJGQUNFUyAqbnVtT2ZCdXNQZXJJbnRlcmZhY2U7CiAKIAkJc3RhdGljQ29uZmlnLnNpbGljb25EZWxheSA9IEEzOHhTaWxpY29uRGVsYXlPZmZzZXRbYm9hcmRJZF07CiAJCXN0YXRpY0NvbmZpZy5wYWNrYWdlVHJhY2VBcnIgPSBBMzh4UGFja2FnZVJvdW5kVHJpcERlbGF5QXJyYXk7CkBAIC01MzIsMTMgKzU4MCwxMSBAQAogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotICAgIHJsVmVyc2lvbiA9IDE7CiAjaWZkZWYgQ09ORklHX0REUjMKICAgICBtYXNrVHVuZUZ1bmMgPSAgICAgKFNFVF9MT1dfRlJFUV9NQVNLX0JJVCB8CiAJCQkJCQlMT0FEX1BBVFRFUk5fTUFTS19CSVQgfAogCQkJCQkJU0VUX01FRElVTV9GUkVRX01BU0tfQklUIHwKIAkJCQkJCVdSSVRFX0xFVkVMSU5HX01BU0tfQklUIHwKLS8vCQkJCQkJTE9BRF9QQVRURVJOXzJfTUFTS19CSVQgfAogCQkJCQkJV1JJVEVfTEVWRUxJTkdfU1VQUF9NQVNLX0JJVCB8CiAJCQkJCQlSRUFEX0xFVkVMSU5HX01BU0tfQklUIHwKIAkJCQkJCVBCU19SWF9NQVNLX0JJVCB8CkBAIC01ODgsMTggKzYzNCwzNiBAQAogCQkpOwogCiAJcmxNaWRGcmVxV0EgPSBHVF9GQUxTRTsKKworCS8qZGV0ZWN0IGlmIFZyZWZDYWxpYiBXQSBuZWVkZWQgYnkgZGV2aWNlIElEKGEzODIgZGlkbid0IG5lZWQgdGhpcyBXQSkqLworCWlmKCAoKE1WX1JFR19SRUFEKERFVl9JRF9SRUcpICYgMHhGRkZGMDAwMCkgPj4gMTYpID09IDB4NjgxMSl7CisJCW12UHJpbnRmKCJ2cmVmQ2FsaWJyYXRpb25XQSBkaXNhYmxlZFxuIik7CisJCXZyZWZDYWxpYnJhdGlvbldBID0gMDsKKwl9CisKKyNpZiAwCisJLypkZXRlY3QgaWYgVnJlZkNhbGliIFdBIG5lZWRlZCBieSByZXZpc2lvbiBJRChhMzkwIEEwIGRpZG4ndCBuZWVkIHRoaXMgV0EpKi8KKwlpZiggKCAoKE1WX1JFR19SRUFEKERFVl9JRF9SRUcpICYgMHhGRkZGMDAwMCkgPj4gMTYpID09IDB4NjkyMCkgJiYKKwkJKCgoTVZfUkVHX1JFQUQoREVWX1ZFUlNJT05fSURfUkVHKSAmIFJFVklTT05fSURfTUFTSykgPj4gUkVWSVNPTl9JRF9PRkZTKSA9PSAweDYpICl7CisJCW12UHJpbnRmKCJ2cmVmQ2FsaWJyYXRpb25XQSBkaXNhYmxlZFxuIik7CisJCXZyZWZDYWxpYnJhdGlvbldBID0gMDsKKwl9CisjZW5kaWYKICNlbmRpZgogCi0JaWYoIGNrRGVsYXkgPT0gLTEgKQorCWlmKCBja0RlbGF5ID09IE1WX1BBUkFNU19VTkRFRklORUQgKQogCQlja0RlbGF5ID0gMTYwOwotCWlmKCBja0RlbGF5XzE2ID09IC0xICkKLQkJY2tEZWxheV8xNiA9IDE2MDsKIAljYURlbGF5ID0gMDsKIAlkZWxheUVuYWJsZSA9IDE7Ci0KKwlmcmVxVmFsW0REUl9GUkVRX0xPV19GUkVRXSA9IGRmc0xvd0ZyZXEgPSAxMjA7CiAJY2FsaWJyYXRpb25VcGRhdGVDb250cm9sID0gMTsKIAotCWluaXRGcmVxID0gdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tmaXJzdEFjdGl2ZUlmXS5tZW1vcnlGcmVxOworI2lmZGVmIENPTkZJR19BUk1BREFfMzhYCisgICAgLyogRm9yIGEzOHggT25seSwgY2hhbmdlIHRvIDJUIG1vZGUgdG8gcmVzb2x2ZSBsb3cgZnJlcSBpbnN0YWJpbGl0eSAqLworICAgIG1vZGUyVCA9IDE7CisjZW5kaWYKKworICAgIGluaXRGcmVxID0gdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tmaXJzdEFjdGl2ZUlmXS5tZW1vcnlGcmVxOwogCiAjaWZkZWYgQ09ORklHX0REUjMKICAgICBkZHIzVGlwQTM4eEdldE1lZGl1bUZyZXEoZGV2TnVtLCAmbWVkaXVtRnJlcSk7CkBAIC02NDUsNTEgKzcwOSw4OSBAQAogICAgIE1WX0hXU19ERFJfRlJFUSAqZnJlcQogKQogewotCUdUX1UzMiB1aVJlZzsKKwlHVF9VMzIgdWlSZWcsIHJlZkNsa1NhdFI7CiAKICAgICAvKiBSZWFkIHNhbXBsZSBhdCByZXNldCBzZXR0aW5nICovCiAgICAgdWlSZWcgPSAoTVZfUkVHX1JFQUQoUkVHX0RFVklDRV9TQVIxX0FERFIpPj4gUlNUMl9DUFVfRERSX0NMT0NLX1NFTEVDVF9JTl9PRkZTRVQpICYgUlNUMl9DUFVfRERSX0NMT0NLX1NFTEVDVF9JTl9NQVNLOwotICAgIHN3aXRjaCh1aVJlZykgeworCisJcmVmQ2xrU2F0UiA9IE1WX1JFR19SRUFEKERFVklDRV9TQU1QTEVfQVRfUkVTRVQyX1JFRyk7CisJaWYoKChyZWZDbGtTYXRSID4+IERFVklDRV9TQU1QTEVfQVRfUkVTRVQyX1JFR19SRUZDTEtfT0ZGU0VUKSAmIDB4MSkgPT0gREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHX1JFRkNMS18yNU1IWil7CisJCXN3aXRjaCh1aVJlZykgeworCSNpZmRlZiBDT05GSUdfRERSMworCQljYXNlIDB4MToKKwkJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9FUlJPUiwgKCJXYXJuaW5nOiBVbnN1cHBvcnRlZCBmcmVxIG1vZGUgZm9yIDMzM01oeiBjb25maWd1cmVkKCVkKVxuIiwgdWlSZWcpKTsKKwkJY2FzZSAweDA6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzMzMzsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4MzoKKwkJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9FUlJPUiwgKCJXYXJuaW5nOiBVbnN1cHBvcnRlZCBmcmVxIG1vZGUgZm9yIDQwME1oeiBjb25maWd1cmVkKCVkKVxuIiwgdWlSZWcpKTsKKwkJY2FzZSAweDI6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzQwMDsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4ZDoKKwkJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9FUlJPUiwgKCJXYXJuaW5nOiBVbnN1cHBvcnRlZCBmcmVxIG1vZGUgZm9yIDUzM01oeiBjb25maWd1cmVkKCVkKVxuIiwgdWlSZWcpKTsKKwkJY2FzZSAweDQ6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzUzMzsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4NjoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfNjAwOworCQkgICAgYnJlYWs7CisJI2VuZGlmCisJCWNhc2UgMHgxMToKKwkJY2FzZSAweDE0OgorCQkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0VSUk9SLCAoIldhcm5pbmc6IFVuc3VwcG9ydGVkIGZyZXEgbW9kZSBmb3IgNjY3TWh6IGNvbmZpZ3VyZWQoJWQpXG4iLCB1aVJlZykpOworCQljYXNlIDB4ODoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfNjY3OworCQkgICAgYnJlYWs7CisJCWNhc2UgMHgxNToKKwkJY2FzZSAweDFiOgorCQkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0VSUk9SLCAoIldhcm5pbmc6IFVuc3VwcG9ydGVkIGZyZXEgbW9kZSBmb3IgODAwTWh6IGNvbmZpZ3VyZWQoJWQpXG4iLCB1aVJlZykpOworCQljYXNlIDB4QzoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfODAwOworCQkgICAgYnJlYWs7CisJCWNhc2UgMHgxMDoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfOTMzOworCQkgICAgYnJlYWs7CisJCWNhc2UgMHgxMjoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfOTAwOworCQkgICAgYnJlYWs7CiAjaWZkZWYgQ09ORklHX0REUjMKLSAgICBjYXNlIDB4MDoKLSAgICBjYXNlIDB4MToKLSAgICAgICAgKmZyZXEgPSBERFJfRlJFUV8zMzM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgyOgotICAgIGNhc2UgMHgzOgotICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzQwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDQ6Ci0gICAgY2FzZSAweGQ6Ci0gICAgICAgICpmcmVxID0gRERSX0ZSRVFfNTMzOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDB4NjoKLSAgICAgICAgKmZyZXEgPSBERFJfRlJFUV82MDA7Ci0gICAgICAgIGJyZWFrOworCQljYXNlIDB4MTM6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzkzMzsKKwkJCWRkcjNBc3luY01vZGVBdFRGID0gR1RfVFJVRTsKKwkJICAgIGJyZWFrOworI2Vsc2UKKwkJY2FzZSAweDEzOgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV8xMDAwOworCQkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0VSUk9SLCAoIldhcm5pbmc6IFVuc3VwcG9ydGVkIGZyZXEgbW9kZSBmb3IgMTAwME1oeiBjb25maWd1cmVkKCVkKVxuIiwgdWlSZWcpKTsKKwkJICAgIGJyZWFrOwogI2VuZGlmCi0gICAgY2FzZSAweDg6Ci0JY2FzZSAweDExOgotCWNhc2UgMHgxNDoKLSAgICAgICAgKmZyZXEgPSBERFJfRlJFUV82Njc7Ci0gICAgICAgIGJyZWFrOwotCWNhc2UgMHhDOgotCWNhc2UgMHgxNToKLQljYXNlIDB4MWI6Ci0gICAgICAgICpmcmVxID0gRERSX0ZSRVFfODAwOwotICAgICAgICBicmVhazsKLQljYXNlIDB4MTA6Ci0gICAgICAgICpmcmVxID0gRERSX0ZSRVFfOTMzOwotICAgICAgICBicmVhazsKLQljYXNlIDB4MTI6Ci0gICAgICAgICpmcmVxID0gRERSX0ZSRVFfOTAwOwotICAgICAgICBicmVhazsKLQljYXNlIDB4MTM6Ci0gICAgICAgICpmcmVxID0gRERSX0ZSRVFfOTAwOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICAqZnJlcSA9IDA7Ci0JICAgIHJldHVybiBNVl9OT1RfU1VQUE9SVEVEOwotICAgIH0KKwkJZGVmYXVsdDoKKwkJICAgICpmcmVxID0gMDsKKwkJCXJldHVybiBNVl9OT1RfU1VQUE9SVEVEOworCQl9CisJfQorCWVsc2V7IC8qUkVGQ0xLIDQwIE1IWiBjYXNlKi8KKwkJc3dpdGNoKHVpUmVnKSB7CisJI2lmZGVmIENPTkZJR19ERFIzCisJCWNhc2UgMHgzOgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV80MDA7CisJCSAgICBicmVhazsKKwkJY2FzZSAweDU6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzUzMzsKKwkJICAgIGJyZWFrOworCSNlbmRpZgorCQljYXNlIDB4QjoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfODAwOworCQkgICAgYnJlYWs7CisJCWNhc2UgMHgxRToKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfOTAwOworCQkgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgICAqZnJlcSA9IDA7CisJCQlyZXR1cm4gTVZfTk9UX1NVUFBPUlRFRDsKKyAgICAJfQorCX0KICAgICByZXR1cm4gR1RfT0s7CiB9CiAKQEAgLTcwMCw1MCArODAyLDc1IEBACiAgICAgTVZfSFdTX0REUl9GUkVRICpmcmVxCiApCiB7Ci0JR1RfVTMyIHVpUmVnOworCUdUX1UzMiB1aVJlZywgcmVmQ2xrU2F0UjsKIAogICAgIC8qIFJlYWQgc2FtcGxlIGF0IHJlc2V0IHNldHRpbmcgKi8KICAgICB1aVJlZyA9IChNVl9SRUdfUkVBRChSRUdfREVWSUNFX1NBUjFfQUREUik+PiBSU1QyX0NQVV9ERFJfQ0xPQ0tfU0VMRUNUX0lOX09GRlNFVCkgJiBSU1QyX0NQVV9ERFJfQ0xPQ0tfU0VMRUNUX0lOX01BU0s7Ci0gICAgc3dpdGNoKHVpUmVnKSB7Ci0gICAgY2FzZSAweDA6Ci0gICAgY2FzZSAweDE6Ci0gICAgICAgICpmcmVxID0gRERSX0ZSRVFfMzMzOyAvKk1lZGl1bSBpcyBzYW1lIGFzIFRGIHRvIHJ1biBQQlMgaW4gdGhpcyBmcmVxKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDI6Ci0gICAgY2FzZSAweDM6Ci0gICAgICAgICpmcmVxID0gRERSX0ZSRVFfNDAwOyAvKk1lZGl1bSBpcyBzYW1lIGFzIFRGIHRvIHJ1biBQQlMgaW4gdGhpcyBmcmVxKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDQ6Ci0gICAgY2FzZSAweGQ6Ci0gICAgICAgICpmcmVxID0gRERSX0ZSRVFfNTMzOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDB4ODoKLQljYXNlIDB4MTE6Ci0JY2FzZSAweDE0OgotICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzMzMzsKLSAgICAgICAgYnJlYWs7Ci0JY2FzZSAweEM6Ci0JY2FzZSAweDE1OgotCWNhc2UgMHgxYjoKLSAgICAgICAgKmZyZXEgPSBERFJfRlJFUV80MDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg2OgotICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzMwMDsKLSAgICAgICAgYnJlYWs7Ci0JY2FzZSAweDEyOgotICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzM2MDsKLSAgICAgICAgYnJlYWs7Ci0JY2FzZSAweDEzOgotICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzQwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgKmZyZXEgPSAwOwotCSAgICByZXR1cm4gTVZfTk9UX1NVUFBPUlRFRDsKLSAgICB9CisKKwlyZWZDbGtTYXRSID0gTVZfUkVHX1JFQUQoREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHKTsKKwlpZigoKHJlZkNsa1NhdFIgPj4gREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHX1JFRkNMS19PRkZTRVQpICYgMHgxKSA9PSBERVZJQ0VfU0FNUExFX0FUX1JFU0VUMl9SRUdfUkVGQ0xLXzI1TUhaKXsKKwkJc3dpdGNoKHVpUmVnKSB7CisJCWNhc2UgMHgxOgorCQljYXNlIDB4MDoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfMzMzOyAvKk1lZGl1bSBpcyBzYW1lIGFzIFRGIHRvIHJ1biBQQlMgaW4gdGhpcyBmcmVxKi8KKwkJICAgIGJyZWFrOworCQljYXNlIDB4MzoKKwkJY2FzZSAweDI6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzQwMDsgLypNZWRpdW0gaXMgc2FtZSBhcyBURiB0byBydW4gUEJTIGluIHRoaXMgZnJlcSovCisJCSAgICBicmVhazsKKwkJY2FzZSAweGQ6CisJCWNhc2UgMHg0OgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV81MzM7LypNZWRpdW0gaXMgc2FtZSBhcyBURiB0byBydW4gUEJTIGluIHRoaXMgZnJlcSovCisJCSAgICBicmVhazsKKwkJY2FzZSAweDg6CisJCWNhc2UgMHgxMToKKwkJY2FzZSAweDE0OgorCQljYXNlIDB4MTA6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzMzMzsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4MTU6CisJCWNhc2UgMHgxYjoKKwkJY2FzZSAweEM6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzQwMDsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4NjoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfMzAwOworCQkgICAgYnJlYWs7CisJCWNhc2UgMHgxMjoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfMzYwOworCQkgICAgYnJlYWs7CisJCWNhc2UgMHgxMzoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfNDAwOworCQkgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgICAqZnJlcSA9IDA7CisJCQlyZXR1cm4gTVZfTk9UX1NVUFBPUlRFRDsKKwkJfQorCX0KKwllbHNleyAvKlJFRkNMSyA0MCBNSFogY2FzZSovCisJCXN3aXRjaCh1aVJlZykgeworCQljYXNlIDB4MzoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfNDAwOy8qTWVkaXVtIGlzIHNhbWUgYXMgVEYgdG8gcnVuIFBCUyBpbiB0aGlzIGZyZXEqLworCQkgICAgYnJlYWs7CisJCWNhc2UgMHg1OgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV81MzM7LypNZWRpdW0gaXMgc2FtZSBhcyBURiB0byBydW4gUEJTIGluIHRoaXMgZnJlcSovCisJCSAgICBicmVhazsKKwkJY2FzZSAweEI6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzQwMDsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4MUU6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzM2MDsKKwkJICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgICAgKmZyZXEgPSAwOworCQkJcmV0dXJuIE1WX05PVF9TVVBQT1JURUQ7CisJCX0KKwl9CiAgICAgcmV0dXJuIEdUX09LOwogfQogI2VuZGlmCiAKKwogR1RfVTMyIGRkcjNUaXBHZXRJbml0RnJlcSgpCiB7CiAgICAgTVZfSFdTX0REUl9GUkVRIGZyZXE7CkBAIC03NjMsNyArODkwLDcgQEAKICkKIHsKIAlHVF9VMzIgZGl2aWRlciA9IDA7Ci0gICAgR1RfVTMyIHNhclZhbDsKKyAgICBHVF9VMzIgc2FyVmFsLCByZWZDbGtTYXRSOwogCiAJaWYgKGludGVyZmFjZUlkICE9IDApIHsKIAkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0VSUk9SLCAoIkEzOHggZG9lcyBub3Qgc3VwcG9ydCBpbnRlcmZhY2UgMHgleFxuIiwgaW50ZXJmYWNlSWQpKTsKQEAgLTc3Myw1MiArOTAwLDgxIEBACiAJLyogZ2V0IFZDTyBmcmVxIGluZGV4ICovCiAJc2FyVmFsID0gKE1WX1JFR19SRUFEKFJFR19ERVZJQ0VfU0FSMV9BRERSKT4+IFJTVDJfQ1BVX0REUl9DTE9DS19TRUxFQ1RfSU5fT0ZGU0VUKSAmIFJTVDJfQ1BVX0REUl9DTE9DS19TRUxFQ1RfSU5fTUFTSzsKIAotICAgIGRpdmlkZXIgPSBBMzh4VmNvRnJlcVBlclNhcltzYXJWYWxdL2ZyZXFWYWxbZnJlcXVlbmN5XTsKLQotCS8qU2V0IFN5bmMgbW9kZSovCi0JQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweDIwMjIwLCAweDAsIDB4MTAwMCkpOwotCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDJGNCwgMHgwLCAweDIwMCkpOwotCi0JLyogY3B1cGxsX2Nsa2Rpdl9yZXNldF9tYXNrICovIAotCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2NCwgMHgxZiwgMHhGRikpOwotCi0JLyogY3B1cGxsX2Nsa2Rpdl9yZWxvYWRfc21vb3RoICovIAotCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2MCwgKDB4MiA8PCA4KSwgKDB4RkYgPDwgOCkpKTsKLQotCS8qIGNwdXBsbF9jbGtkaXZfcmVsYXhfZW4gKi8KLQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjAsICgweDIgPDwgMjQpLCAoMHhGRiA8PCAyNCkpKTsKLQotCS8qIHdyaXRlIHRoZSBkaXZpZGVyICovCi0JQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweEU0MjY4LCAoZGl2aWRlciA8PCA4KSwgKDB4M0YgPDwgOCkpKTsKLQotCS8qIHNldCBjcHVwbGxfY2xrZGl2X3JlbG9hZF9yYXRpbyAqLwotCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2NCwgKDEgPDwgOCksICgxIDw8IDgpKSk7Ci0KLQkvKiB1bmRldCBjcHVwbGxfY2xrZGl2X3JlbG9hZF9yYXRpbyAqLwotCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2NCwgMCwgKDEgPDwgOCkpKTsKLQotCS8qIGNsZWFyIGNwdXBsbF9jbGtkaXZfcmVsb2FkX2ZvcmNlICovCi0JQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweEU0MjYwLCAwLCAoMHhGRiA8PCA4KSkpOwotCi0JLyogY2xlYXIgY3B1cGxsX2Nsa2Rpdl9yZWxheF9lbiAqLwotCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2MCwgMCwgKDB4RkYgPDwgMjQpKSk7Ci0KLQkvKiBjbGVhciBjcHVwbGxfY2xrZGl2X3Jlc2V0X21hc2sgKi8KLQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjQsIDAsIDB4RkYpKTsKLQotCS8qIER1bml0IHRyYWluaW5nIGNsb2NrICsgMToxIG1vZGUgKi8KLQlpZigoZnJlcXVlbmN5ID09IEREUl9GUkVRX0xPV19GUkVRKSB8fCAoZnJlcVZhbFtmcmVxdWVuY3ldIDw9IDQwMCkpIHsKLQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweDE4NDg4LCAoMSA8PCAxNiksICgxIDw8IDE2KSkpOwotCQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4MTUyNCwgKDAgPDwgMTUpLCAoMSA8PCAxNSkpKTsKKwlyZWZDbGtTYXRSID0gTVZfUkVHX1JFQUQoREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHKTsKKwlpZigoKHJlZkNsa1NhdFIgPj4gREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHX1JFRkNMS19PRkZTRVQpICYgMHgxKSA9PSBERVZJQ0VfU0FNUExFX0FUX1JFU0VUMl9SRUdfUkVGQ0xLXzI1TUhaKXsKKyAgICAJZGl2aWRlciA9IEEzOHhWY29GcmVxUGVyU2FyUmVmQ2xrMjVNaHpbc2FyVmFsXS9mcmVxVmFsW2ZyZXF1ZW5jeV07CiAJfQotCWVsc2UgewotCQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4MTg0ODgsIDAsICgxIDw8IDE2KSkpOwotCQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4MTUyNCwgKDEgPDwgMTUpLCAoMSA8PCAxNSkpKTsKKwllbHNleworICAgIAlkaXZpZGVyID0gQTM4eFZjb0ZyZXFQZXJTYXJSZWZDbGs0ME1oeltzYXJWYWxdL2ZyZXFWYWxbZnJlcXVlbmN5XTsKIAl9CiAKKwlpZiggKGRkcjNBc3luY01vZGVBdFRGID09IEdUX1RSVUUpICYmIChmcmVxVmFsW2ZyZXF1ZW5jeV0gPiA0MDApICl7CisKKwkJLypTZXQgQXN5bmMgTW9kZSovCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHgyMDIyMCwgMHgxMDAwLCAweDEwMDApKTsKKwkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweEU0MkY0LCAweDIwMCwgMHgyMDApKTsKKworCQkvKldhaXQgZm9yIEFzdW5jIG1vZGUgc2V0dXAqLworCQltdk9zRGVsYXkoNSk7CisKKwkJLypTZXQgS05MIHZhbHVlcyovCisJCWlmKCBmcmVxdWVuY3kgPT0gRERSX0ZSRVFfOTMzKXsKKwkJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDJGMCwgMHg4MDRBMDAyLCAweEZGRkZGRkZGKSk7CisJCX0KKwl9CisJZWxzZXsKKwkJLypTZXQgU3luYyBtb2RlKi8KKwkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweDIwMjIwLCAweDAsIDB4MTAwMCkpOworCQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyRjQsIDB4MCwgMHgyMDApKTsKKworCQkvKiBjcHVwbGxfY2xrZGl2X3Jlc2V0X21hc2sgKi8KKwkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweEU0MjY0LCAweDFmLCAweEZGKSk7CisKKwkJLyogY3B1cGxsX2Nsa2Rpdl9yZWxvYWRfc21vb3RoICovCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2MCwgKDB4MiA8PCA4KSwgKDB4RkYgPDwgOCkpKTsKKworCQkvKiBjcHVwbGxfY2xrZGl2X3JlbGF4X2VuICovCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2MCwgKDB4MiA8PCAyNCksICgweEZGIDw8IDI0KSkpOworCisJCS8qIHdyaXRlIHRoZSBkaXZpZGVyICovCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2OCwgKGRpdmlkZXIgPDwgOCksICgweDNGIDw8IDgpKSk7CisKKwkJLyogc2V0IGNwdXBsbF9jbGtkaXZfcmVsb2FkX3JhdGlvICovCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2NCwgKDEgPDwgOCksICgxIDw8IDgpKSk7CisKKwkJLyogdW5kZXQgY3B1cGxsX2Nsa2Rpdl9yZWxvYWRfcmF0aW8gKi8KKwkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweEU0MjY0LCAwLCAoMSA8PCA4KSkpOworCisJCS8qIGNsZWFyIGNwdXBsbF9jbGtkaXZfcmVsb2FkX2ZvcmNlICovCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2MCwgMCwgKDB4RkYgPDwgOCkpKTsKKworCQkvKiBjbGVhciBjcHVwbGxfY2xrZGl2X3JlbGF4X2VuICovCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2MCwgMCwgKDB4RkYgPDwgMjQpKSk7CisKKwkJLyogY2xlYXIgY3B1cGxsX2Nsa2Rpdl9yZXNldF9tYXNrICovCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2NCwgMCwgMHhGRikpOworCX0KKworCS8qIER1bml0IHRyYWluaW5nIGNsb2NrICsgMToxLzI6MSBtb2RlICovCisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweDE4NDg4LCAoKGRkcjNUaXBDbG9ja01vZGUoZnJlcXVlbmN5KSAmIDB4MSkgPDwgMTYpLCAoMSA8PCAxNikpKTsKKwlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4MTUyNCwgKChkZHIzVGlwQ2xvY2tNb2RlKGZyZXF1ZW5jeSktMSkgPDwgMTUpLCAoMSA8PCAxNSkpKTsKKwogCXJldHVybiBHVF9PSzsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiByZXR1cm4gMSBvZiBjb3JlL0RVTklUIGNsb2NrIHJhdGlvbiBpcyAxIGZvciBnaXZlbiBmcmVxLCAwIGlmIGNsb2NrIHJhdGlvcyBpcyAyOjEKKyovCitHVF9VOCAgICBkZHIzVGlwQ2xvY2tNb2RlKCBHVF9VMzIgZnJlcXVlbmN5ICkKK3sKKwlpZigoZnJlcXVlbmN5ID09IEREUl9GUkVRX0xPV19GUkVRKSB8fCAoZnJlcVZhbFtmcmVxdWVuY3ldIDw9IDQwMCkpeworCQlyZXR1cm4gMTsKKwl9CisJZWxzZXsKKwkJcmV0dXJuIDI7CisJfQorfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZXh0ZXJuYWwgcmVhZCBmcm9tIG1lbW9yeQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Tb2MvZGRyM19od3NfaHdfdHJhaW5pbmcuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU29jL2RkcjNfaHdzX2h3X3RyYWluaW5nLmMKaW5kZXggODE3Yjg0ZS4uYmUzYjBlOCAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Tb2MvZGRyM19od3NfaHdfdHJhaW5pbmcuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NvYy9kZHIzX2h3c19od190cmFpbmluZy5jCkBAIC0xMTEsMTEgKzExMSwxMCBAQAogCiBNVl9TVEFUVVMgZGRyM0h3c0h3VHJhaW5pbmcodm9pZCkKIHsKLQogCU1WX0hXU19BTEdPX1RZUEUgYWxnb01vZGUgPSBBTEdPX1RZUEVfRFlOQU1JQzsKIAlNVl9TVEFUVVMgc3RhdHVzOwogCUluaXRDbnRyUGFyYW0gaW5pdFBhcmFtOwotCQorCiAJc3RhdHVzID0gZGRyM1NpbGljb25QcmVJbml0KCk7CiAJaWYgKE1WX09LICE9IHN0YXR1cykgewogCQltdlByaW50ZigiRERSMyBQcmUgc2lsaWNvbiBDb25maWcgLSBGQUlMRUQgMHgleFxuIiwgc3RhdHVzKTsKQEAgLTEyMywxMiArMTIyLDEyIEBACiAJfQogCiAJaW5pdFBhcmFtLmRvTXJzUGh5ID0gR1RfVFJVRTsKLSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSAgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKKyNpZiAhZGVmaW5lZCAoQ09ORklHX0JPQkNBVDIpCiAJaW5pdFBhcmFtLmlzQ3RybDY0Qml0ID0gR1RfRkFMU0U7CiAjZWxzZQogCWluaXRQYXJhbS5pc0N0cmw2NEJpdCA9IEdUX1RSVUU7CiAjZW5kaWYKLSNpZiBkZWZpbmVkIChDT05GSUdfQUxMRVlDQVQzKSB8fCBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkKENPTkZJR19BUk1BREFfMzlYKQorI2lmICFkZWZpbmVkIChDT05GSUdfQk9CQ0FUMikKICAgICBpbml0UGFyYW0uaW5pdFBoeSA9IEdUX1RSVUU7CiAjZWxzZQogICAgIGluaXRQYXJhbS5pbml0UGh5ID0gR1RfRkFMU0U7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NvYy9kZHIzX21zeXNfYmMyX3RyYWluaW5nLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NvYy9kZHIzX21zeXNfYmMyX3RyYWluaW5nLmMKaW5kZXggNmUzZjEwNy4uYTc2MDM4OCAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Tb2MvZGRyM19tc3lzX2JjMl90cmFpbmluZy5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU29jL2RkcjNfbXN5c19iYzJfdHJhaW5pbmcuYwpAQCAtMjIyLDcgKzIyMiw2IEBACiAJTVZfU1RBVFVTIHN0YXR1czsKIAogCWdlbmVyaWNJbml0Q29udHJvbGxlciA9IDE7Ci0JbXZQcmludGYoIj4+PiBzZXR0aW5nIGdlbmVyaWNJbml0Q29udHJvbGxlciA9IDFcbiIpOwogCiAJLy9zdGF0dXMgPSBkZHIzVGlwSW5pdEJjMlNpbGljb24oMCwgMSk7CiAJc3RhdHVzID0gZGRyM1RpcEluaXRCYzIoMCwgMCk7CkBAIC0zNTQsOCArMzUzLDYgQEAKIAogCXNlcnZlckJhc2VBZGRyID0gTVZfUkVHX1JFQUQoUkVHX1hCQVJfV0lOXzVfQkFTRV9BRERSKTsKIAotCW12UHJpbnRmKCJjb25maWd1cmVTZXJ2ZXJXaW5kb3dzOiBTZXJ2ZXIgYmFzZSBpcyAweCV4XG4iLCBzZXJ2ZXJCYXNlQWRkcik7Ci0KIAkvKiBpbml0IHNlcnZlciBhY2Nlc3MgKi8KIAlod3NTZXJ2ZXJSZWdTZXRGdW5jUHRyID0gc2VydmVyUmVnU2V0OyAKIAlod3NTZXJ2ZXJSZWdHZXRGdW5jUHRyID0gc2VydmVyUmVnR2V0OwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Tb2MvZGRyM19tc3lzX2JvYmtfdHJhaW5pbmcuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU29jL2RkcjNfbXN5c19ib2JrX3RyYWluaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzczNjRmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU29jL2RkcjNfbXN5c19ib2JrX3RyYWluaW5nLmMKQEAgLTAsMCArMSwzNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDAxLCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorKiBUaGlzIGNvZGUgY29udGFpbnMgY29uZmlkZW50aWFsIGluZm9ybWF0aW9uIG9mIE1hcnZlbGwgc2VtaWNvbmR1Y3RvciwgaW5jLgorKiBubyByaWdodHMgYXJlIGdyYW50ZWQgaGVyZWluIHVuZGVyIGFueSBwYXRlbnQsIG1hc2sgd29yayByaWdodCBvciBjb3B5cmlnaHQKKyogb2YgTWFydmVsbCBvciBhbnkgdGhpcmQgcGFydHkuCisqIE1hcnZlbGwgcmVzZXJ2ZXMgdGhlIHJpZ2h0IGF0IGl0cyBzb2xlIGRpc2NyZXRpb24gdG8gcmVxdWVzdCB0aGF0IHRoaXMgY29kZQorKiBiZSBpbW1lZGlhdGVseSByZXR1cm5lZCB0byBNYXJ2ZWxsLiBUaGlzIGNvZGUgaXMgcHJvdmlkZWQgImFzIGlzIi4KKyogTWFydmVsbCBtYWtlcyBubyB3YXJyYW50aWVzLCBleHByZXNzLCBpbXBsaWVkIG9yIG90aGVyd2lzZSwgcmVnYXJkaW5nIGl0cworKiBhY2N1cmFjeSwgY29tcGxldGVuZXNzIG9yIHBlcmZvcm1hbmNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZGRyM19tc3lzX3RyYWluaW5nLmMKKyoKKyogREVTQ1JJUFRJT046IAorKgorKgorKiBERVBFTkRFTkNJRVM6CisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAkUmV2aXNpb246IDEgJAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAibXZfb3MuaCIKKyNpbmNsdWRlICJkZHIzX21zeXNfYm9iay5oIgorI2luY2x1ZGUgImRkcjNfbXN5c19ib2JrX2NvbmZpZy5oIgorI2luY2x1ZGUgImRkcjNfaHdzX3NpbF90cmFpbmluZy5oIgorI2luY2x1ZGUgIm12U2lsaWNvbklmLmgiCisjaW5jbHVkZSAibXZEZHIzVHJhaW5pbmdJcFBydklmLmgiCisjaW5jbHVkZSAibXZId3NEZHIzQm9iSy5oIgorI2luY2x1ZGUgInNvY19zcGVjLmgiCisjaW5jbHVkZSAicHJpbnRmLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBnbG9iYWxzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIE1WX1NFUlZFUl9SRUdfQUNDRVNTX1NFVCBod3NTZXJ2ZXJSZWdTZXRGdW5jUHRyOworZXh0ZXJuIE1WX1NFUlZFUl9SRUdfQUNDRVNTX0dFVCBod3NTZXJ2ZXJSZWdHZXRGdW5jUHRyOworCitHVF9VMzIgc2VydmVyQmFzZUFkZHIgPSAwOworLyogdGhlIGZvbGxvd2luZyBnbG9iYWwgdmFyaWFibGVzIGFyZSBzZXQgaW4gZGRyM1RpcER5bmFtaWNSZWFkTGV2ZWxpbmcgKi8KKworCitleHRlcm4gR1RfVTMyIGdlbmVyaWNJbml0Q29udHJvbGxlcjsKK2V4dGVybiBHVF9VMzIgZGVidWdCb2JLOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJlLWRlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHVF9TVEFUVVMgICAgZGRyM0R1bml0QWNjZXNzUmVhZAorKAorICAgIEdUX1U4ICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgTVZfSFdTX0FDQ0VTU19UWVBFICAgIGludGVyZmFjZUFjY2VzcywKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgaW50ZXJmYWNlSWQsIAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICByZWdBZGRyLCAKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIG1hc2sgCispOworCitHVF9TVEFUVVMgICAgZGRyM0R1bml0QWNjZXNzV3JpdGUKKygKKyAgICBHVF9VOCAgICAgICAgICAgICAgICAgZGV2TnVtLAorICAgIE1WX0hXU19BQ0NFU1NfVFlQRSAgICBpbnRlcmZhY2VBY2Nlc3MsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIGludGVyZmFjZUlkLCAKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgcmVnQWRkciwgCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIGRhdGFWYWx1ZSwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgbWFzayAKKyk7CisKK0dUX1NUQVRVUyBkZHIzRHVuaXRBY2Nlc3NJbml0CisoCisgICAgR1RfVTMyICBkZXZOdW0sCisgICAgR1RfVTMyICBib2FyZElkCispOworCitNVl9WT0lEIGNvbmZpZ3VyZVNlcnZlcldpbmRvd3Modm9pZCk7CisKK2V4dGVybiBHVF9TVEFUVVMgZGRyM1RpcEJvYktHZXRGcmVxQ29uZmlnCisoCisJR1RfVTgJCQkJCQkJZGV2TnVtLAorICAgIE1WX0hXU19ERFJfRlJFUSAgICAgICAgICAgICAgICAgZnJlcSwKKwlNVl9IV1NfVElQX0ZSRVFfQ09ORklHX0lORk8JCSpmcmVxQ29uZmlnSW5mbworKTsKKworZXh0ZXJuIEdUX1NUQVRVUyBkZHIzVGlwQm9iS1NldERpdmlkZXIKKygKKwlHVF9VOAkJCQkJCQlkZXZOdW0sCisJR1RfVTMyCQkJCQkJCWludGVyZmFjZUlkLAorICAgIE1WX0hXU19ERFJfRlJFUSAgICAgICAgICAgICAgICAgZnJlcQorKTsKKworZXh0ZXJuIEdUX1NUQVRVUyBkZHIzVGlwSW5pdEJvYktTaWxpY29uCisoCisgICAgR1RfVTMyICBkZXZOdW0sCisgICAgR1RfVTMyICBib2FyZElkCispOworZXh0ZXJuIEdUX1NUQVRVUyBkZHIzVGlwQm9iS0dldEluaXRGcmVxCisoCisgICAgR1RfU1RBVFVTICAgICAgIGRldk51bSwKKwlHVF9VMzIJCQlpbnRlcmZhY2VJZCwKKyAgICBNVl9IV1NfRERSX0ZSRVEgKmZyZXEKKyk7CisKK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS1NlbGVjdENQVURkckNvbnRyb2xsZXIKKygKKyAgICBHVF9VOCAgICBkZXZOdW0sCisgICAgR1RfQk9PTCAgZW5hYmxlCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBzZXJ2ZXJSZWdTZXQuCisqIERlc2M6ICAgICBkZWZpbml0aW9uIG9mIHNlcnZlciB3cml0ZSBwcm90b3R5cGUKKyogQXJnczogICAgIFRCRAorKiBOb3RlczoKKyogUmV0dXJuczogIE9LIGlmIHN1Y2Nlc3MsIG90aGVyIGVycm9yIGNvZGUgaWYgZmFpbC4KKyovCitHVF9TVEFUVVMgc2VydmVyUmVnU2V0CisoCisgICAgR1RfVTggZGV2TnVtLAorICAgIEdUX1UzMiBhZGRyLAorICAgIEdUX1UzMiBkYXRhCispCit7CisJaWYoc2VydmVyQmFzZUFkZHIgPT0gMCkgeworCQltdlByaW50ZigiU2VydmVyIHdpbmRvd3Mgd2VyZSBub3QgaW5pdGlhbGl6ZWRcbiIsIDApOworCQlyZXR1cm4gR1RfTk9UX0lOSVRJQUxJWkVEOworCX0KKworCSooKHZvbGF0aWxlIHVuc2lnbmVkIGludCopKHNlcnZlckJhc2VBZGRyK2FkZHIpKSA9IGRhdGE7CisgICAgLy9tdlByaW50Zigic2VydmVyUmVnU2V0IDB4JXggPTB4JXhcbiIsYWRkcixkYXRhKTsKKworCXJldHVybiBHVF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOYW1lOiAgICAgc2VydmVyUmVnR2V0LgorKiBEZXNjOiAgICAgZGVmaW5pdGlvbiBvZiBzZXJ2ZXIgcmVhZCBwcm90b3R5cGUKKyogQXJnczogICAgIFRCRAorKiBOb3RlczogICAgCisqIFJldHVybnM6ICBPSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworR1RfU1RBVFVTIHNlcnZlclJlZ0dldAorKAorICAgIEdUX1U4IGRldk51bSwgCisgICAgR1RfVTMyIGFkZHIsIAorICAgIEdUX1UzMiAqZGF0YQorKQoreworCWlmKHNlcnZlckJhc2VBZGRyID09IDApIHsKKwkJbXZQcmludGYoIlNlcnZlciB3aW5kb3dzIHdlcmUgbm90IGluaXRpYWxpemVkXG4iLCAwKTsKKwkJcmV0dXJuIEdUX05PVF9JTklUSUFMSVpFRDsKKwl9CisKKwkqZGF0YSA9ICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQqKShzZXJ2ZXJCYXNlQWRkcithZGRyKSkpOworCS8vbXZQcmludGYoInNlcnZlclJlZ0dldCAweCV4ID0weCV4XG4iLGFkZHIsKmRhdGEpOworCisJcmV0dXJuIEdUX09LOworfQorCitNVl9TVEFUVVMgZGRyM1NpbGljb25QcmVJbml0KHZvaWQpCit7CisgICAgTVZfU1RBVFVTIHN0YXR1czsKKwkvKiBpbml0aWFsaXplIHdpbmRvdyB0byBzZXJ2ZXIgKi8KKwljb25maWd1cmVTZXJ2ZXJXaW5kb3dzKCk7CisKKyNpZiAwCisJTVZfVTMyIHVpUmVnOworCS8qIHNldCBkdXBpY2F0ZSBDUyBjb25maWd1cmF0aW9uICovCisJc2VydmVyUmVnR2V0KDAsIDB4ZjgyODgsICZ1aVJlZyk7CisJdWlSZWcgfD0gKDEgPDwgMTcpOworCXNlcnZlclJlZ1NldCgwLCAweGY4Mjg4LCB1aVJlZyk7CisjZW5kaWYKKworICAgIHN0YXR1cyA9IGRkcjNTaWxpY29uSW5pdCgpOworCWlmIChNVl9PSyAhPSBzdGF0dXMpIHsKKwkJbXZQcmludGYoIkREUjMgc2lsaWNvbiBpbml0IC0gRkFJTEVEIDB4JXhcbiIsIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcmV0dXJuIE1WX09LOworfQorCitNVl9TVEFUVVMgZGRyM1NpbGljb25Qb3N0SW5pdCh2b2lkKQoreworCXJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogICAgIGRkcjNUaXBJbml0U2lsaWNvbgorICogRGVzYzogICAgIGluaXRpYXRlIHNpbGljb24gcGFyYW1ldGVycworICogQXJnczoKKyAqIE5vdGVzOgorICogUmV0dXJuczogIHJlcXVpcmVkIHZhbHVlCisgKi8KK01WX1NUQVRVUyBkZHIzU2lsaWNvbkluaXQodm9pZCkgeworCisJTVZfU1RBVFVTIHN0YXR1czsKKworCWdlbmVyaWNJbml0Q29udHJvbGxlciA9IDE7CisKKwlzdGF0dXMgPSBkZHIzVGlwSW5pdEJvYksoMCwgMCk7CisJaWYgKE1WX09LICE9IHN0YXR1cykgeworCQltdlByaW50ZigiRERSMyBNc3lzIHNpbGljb24gaW5pdCAtIEZBSUxFRCAweCV4XG4iLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXJldHVybiBNVl9PSzsKK30KKworTVZfU1RBVFVTIGRkcjNQb3N0UnVuQWxnKHZvaWQpCit7CisgICAgTVZfVTMyIHJlYWREZWxheVs1XTsKKwlHVF9VMzIgZ1JlYWRTYW1wbGVEZWxheSA9IDB4MTkxOTE5MTk7CisJR1RfVTMyIGdSZWFkUmVhZHlEZWxheSA9IDB4MTkxOTE5MTk7CisKKyAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKDAsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIDQsIFJFR19SRUFEX0RBVEFfU0FNUExFX0RFTEFZU19BRERSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZERlbGF5LCBNQVNLX0FMTF9CSVRTKSk7CisKKyAgICBnUmVhZFNhbXBsZURlbGF5ID0gcmVhZERlbGF5WzRdOworCisgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZCgwLCBBQ0NFU1NfVFlQRV9VTklDQVNULCA0LCBSRUdfUkVBRF9EQVRBX1JFQURZX0RFTEFZU19BRERSLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWREZWxheSwgTUFTS19BTExfQklUUykpOworCisgICAgZ1JlYWRSZWFkeURlbGF5ID0gcmVhZERlbGF5WzRdOworCisgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VsZWN0Q1BVRGRyQ29udHJvbGxlcigwLCBHVF9GQUxTRSkpOyAvLyBzZXQgbXV4IHRvIG1zeXMKKworICAgIE1WX1JFR19XUklURShSRUdfUkVBRF9EQVRBX1NBTVBMRV9ERUxBWVNfQUREUiwgZ1JlYWRTYW1wbGVEZWxheSk7CisgICAgTVZfUkVHX1dSSVRFKFJFR19SRUFEX0RBVEFfUkVBRFlfREVMQVlTX0FERFIsIGdSZWFkUmVhZHlEZWxheSk7CisJcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKiogTXN5cyBELVVuaXQgQWNjZXNzICAgICoqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworR1RfU1RBVFVTICAgIGRkcjNEdW5pdEFjY2Vzc1dyaXRlCisoCisgICAgR1RfVTggICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgICAgaW50ZXJmYWNlQWNjZXNzLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBpbnRlcmZhY2VJZCwgCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIHJlZ0FkZHIsIAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBkYXRhVmFsdWUsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIG1hc2sgCispCit7CisJR1RfVTMyIHVpRGF0YVJlYWQ7CisgICAgR1RfVTMyIGRhdGFSZWFkW01BWF9JTlRFUkZBQ0VfTlVNXTsKKyNpZmRlZiBXSU4zMgorICAgIG12UHJpbnRmKERFQlVHX0xFVkVMX1RSQUNFLCJkZHIzRHVuaXRBY2Nlc3NXcml0ZSAgIDB4JXg6IDB4JXggKG1hc2sgMHgleClcbiIsIHJlZ0FkZHIsIGRhdGFWYWx1ZSk7CisgICAgcmV0dXJuIEdUX09LOworI2VuZGlmCisgICAgaWYgKG1hc2sgIT0gTUFTS19BTExfQklUUykKKyAgICB7CisgICAgICAgIGlmIChkZWJ1Z0JvYksgPj0gMikKKyAgICAgICAgeworICAgICAgICAgICAgbXZQcmludGYoImRkcjNEdW5pdEFjY2Vzc1dyaXRlIGFjdGl2ZSBpbnRlcmZhY2UgPSAlZFxuIixpbnRlcmZhY2VJZCk7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNEdW5pdEFjY2Vzc1JlYWQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULGludGVyZmFjZUlkLCByZWdBZGRyLCAgZGF0YVJlYWQsIE1BU0tfQUxMX0JJVFMpKTsKKyAgICAgICAgdWlEYXRhUmVhZCA9IGRhdGFSZWFkW2ludGVyZmFjZUlkXTsKKyAgICAgICAgZGF0YVZhbHVlID0gKHVpRGF0YVJlYWQgJiAofm1hc2spKSB8IChkYXRhVmFsdWUgJiBtYXNrKTsKKyAgICB9CisKKyAgICBpZiAoZGVidWdCb2JLID49IDEpCisgICAgeworICAgICAgICBtdlByaW50ZigiMHgleDogMHgleFxuIiwgcmVnQWRkciwgZGF0YVZhbHVlKTsKKyAgICB9CisKKyAgICBNVl9SRUdfV1JJVEUocmVnQWRkciwgZGF0YVZhbHVlKTsKKworICAgIHJldHVybiBHVF9PSzsKK30KKworR1RfU1RBVFVTICAgIGRkcjNEdW5pdEFjY2Vzc1JlYWQKKygKKyAgICBHVF9VOCAgICAgICAgICAgICAgICAgZGV2TnVtLAorICAgIE1WX0hXU19BQ0NFU1NfVFlQRSAgICBpbnRlcmZhY2VBY2Nlc3MsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIGludGVyZmFjZUlkLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgbWFzaworKQoreworI2lmZGVmIFdJTjMyCisgICAgIG12UHJpbnRmKCJkZHIzRHVuaXRBY2Nlc3NSZWFkICAgMHgleDogMHgleCAobWFzayAweCV4KVxuIiwgcmVnQWRkciwgKmRhdGEpOworICAgICByZXR1cm4gR1RfT0s7CisjZW5kaWYKKworCWRhdGFbaW50ZXJmYWNlSWRdID0gTVZfUkVHX1JFQUQocmVnQWRkcikgJiBtYXNrOworCisgICAgcmV0dXJuIEdUX09LOworfQorCitHVF9TVEFUVVMgZGRyM0R1bml0QWNjZXNzSW5pdAorKAorICAgIEdUX1UzMiAgZGV2TnVtLAorICAgIEdUX1UzMiAgYm9hcmRJZAorKQoreworCU1WX0hXU19USVBfQ09ORklHX0ZVTkNfREIgY29uZmlnRnVuYzsKKworICAgIGNvbmZpZ0Z1bmMudGlwRHVuaXRSZWFkRnVuYyA9IGRkcjNEdW5pdEFjY2Vzc1JlYWQ7CisgICAgY29uZmlnRnVuYy50aXBEdW5pdFdyaXRlRnVuYyA9IGRkcjNEdW5pdEFjY2Vzc1dyaXRlOworICAgIGNvbmZpZ0Z1bmMudGlwRHVuaXRNdXhTZWxlY3RGdW5jID0gZGRyM1RpcEJvYktTZWxlY3RDUFVEZHJDb250cm9sbGVyOworICAgIGNvbmZpZ0Z1bmMudGlwU2V0RnJlcURpdmlkZXJGdW5jID0gZGRyM1RpcEJvYktTZXREaXZpZGVyOworICAgIGNvbmZpZ0Z1bmMudGlwR2V0RnJlcUNvbmZpZ0luZm9GdW5jID0gZGRyM1RpcEJvYktHZXRGcmVxQ29uZmlnOworCisgICAgbXZId3NEZHIzVGlwSW5pdENvbmZpZ0Z1bmMoZGV2TnVtLCAmY29uZmlnRnVuYyk7CisKKwlyZXR1cm4gR1RfT0s7Cit9CisKK01WX1ZPSUQgY29uZmlndXJlU2VydmVyV2luZG93cyh2b2lkKQoreworCXN0YXRpYyBNVl9CT09MIGNvbmZpZ0RvbmUgPSBNVl9GQUxTRTsKKworCWlmKGNvbmZpZ0RvbmUgPT0gTVZfVFJVRSkKKwkJcmV0dXJuOworCisgICAgc2VydmVyQmFzZUFkZHIgPSBNVl9SRUdfUkVBRChBSEJfVE9fTUJVU19XSU5fQkFTRV9SRUcoMSkpOworCisgICAgLyogaW5pdCBzZXJ2ZXIgYWNjZXNzICovCisJaHdzU2VydmVyUmVnU2V0RnVuY1B0ciA9IHNlcnZlclJlZ1NldDsKKwlod3NTZXJ2ZXJSZWdHZXRGdW5jUHRyID0gc2VydmVyUmVnR2V0OworCisJY29uZmlnRG9uZSA9IE1WX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dUX1UzMiBkZHIzVGlwR2V0SW5pdEZyZXEoKQoreworICAgIE1WX0hXU19ERFJfRlJFUSBmcmVxOworCisJY29uZmlndXJlU2VydmVyV2luZG93cygpOworCisJZGRyM1RpcEJvYktHZXRJbml0RnJlcSgwLCAwLCAmZnJlcSk7IC8qIEluIEJvYksgaW50ZXJmYWNlIDAgaXMgdGhlIENQVSBpbnRlcmZhY2UqLworCisJcmV0dXJuIGZyZXE7CisKK30KKworCisKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi8uZ2l0aWdub3JlIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjViN2VlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK2RkcjNfdHJhaW5pbmdfYTM4eC5saWIKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHIzX3RyYWluaW5nX2EzOHgubGliIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjNfdHJhaW5pbmdfYTM4eC5saWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YzdlMzIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjNfdHJhaW5pbmdfYTM4eC5saWIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyM190cmFpbmluZ19hMzl4LmxpYiBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHIzX3RyYWluaW5nX2EzOXgubGliCmluZGV4IGY5NWRiZTYuLmZiNGM3NGQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHIzX3RyYWluaW5nX2EzOXgubGliCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHIzX3RyYWluaW5nX2EzOXgubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHIzX3RyYWluaW5nX21zeXNfYWMzLmxpYiBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHIzX3RyYWluaW5nX21zeXNfYWMzLmxpYgppbmRleCAyZDRiMTY1Li4yM2Q0NDA2IDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyM190cmFpbmluZ19tc3lzX2FjMy5saWIKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjNfdHJhaW5pbmdfbXN5c19hYzMubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHIzX3RyYWluaW5nX21zeXNfYmMyLmxpYiBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHIzX3RyYWluaW5nX21zeXNfYmMyLmxpYgppbmRleCBiOTMxZGVlLi41YTBjOGI4IDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyM190cmFpbmluZ19tc3lzX2JjMi5saWIKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjNfdHJhaW5pbmdfbXN5c19iYzIubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHI0X3RyYWluaW5nX2EzOHgubGliIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjRfdHJhaW5pbmdfYTM4eC5saWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwYjk1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHI0X3RyYWluaW5nX2EzOHgubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHI0X3RyYWluaW5nX2EzOHhzdWIubGliIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjRfdHJhaW5pbmdfYTM4eHN1Yi5saWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4NmFiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHI0X3RyYWluaW5nX2EzOHhzdWIubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHI0X3RyYWluaW5nX2EzOXgubGliIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjRfdHJhaW5pbmdfYTM5eC5saWIKaW5kZXggMWU2NDQzYy4uZDcwMTk4OSAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjRfdHJhaW5pbmdfYTM5eC5saWIKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjRfdHJhaW5pbmdfYTM5eC5saWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjRfdHJhaW5pbmdfYTM5eHN1Yi5saWIgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyNF90cmFpbmluZ19hMzl4c3ViLmxpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjJmZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjRfdHJhaW5pbmdfYTM5eHN1Yi5saWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19pbml0L2EzOHgvZ2VuZXJhbEluaXQuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfaW5pdC9hMzh4L2dlbmVyYWxJbml0LmMKaW5kZXggZTM3YTg0OC4uZjA4ODlkMSAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19pbml0L2EzOHgvZ2VuZXJhbEluaXQuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2luaXQvYTM4eC9nZW5lcmFsSW5pdC5jCkBAIC03MCw2ICs3MCw4IEBACiAjaW5jbHVkZSAiZ2VuZXJhbEluaXQuaCIKICNpbmNsdWRlICJwcmludGYuaCIKICNpbmNsdWRlICJtdlN5c0VudkxpYi5oIgorI2luY2x1ZGUgInNvY19zcGVjLmgiCisjaW5jbHVkZSAiYmluX2hkcl90d3NpLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZEZXZpY2VJZENvbmZpZyAtIHNldCBTb0MgVW5pdCBjb25maWd1cmF0aW9uIGFuZCBkZXZpY2UgSUQgYWNjb3JkaW5nIHRvIGRldGVjdGVkIGZsYXZvdXIKQEAgLTExNiwyMiArMTE4LDE5NiBAQAogICAgICAgICBNVl9SRUdfV1JJVEUoTVBQX0NPTlRST0xfUkVHKDIpLCByZWdEYXRhKTsKIH0KIAorLyogdXBkYXRlIFJUQyAoUmVhZCBUaW1pbmcgQ29udHJvbCkgdmFsdWVzIG9mIFBDSWUgbWVtb3J5IHdyYXBwZXJzLgorICogdXNlIHNsb3dlciBtZW1vcnkgUmVhZCBUaW1pbmcsIHRvIGFsbG93IG1vcmUgZWZmaWNpZW50IGVuZXJneSBjb25zdW1wdGlvbiwgaW4gb3JkZXIgdG8gbG93ZXIKKyAqIHRoZSBtaW5pbXVtIFZERCBvZiB0aGUgbWVtb3J5LgorICogVGhpcyB3aWxsIGxlYWQgdG8gbW9yZSByb2J1c3QgbWVtb3J5IHdoZW4gdm9sdGFnZSBkcm9wIG9jY3VycyAoVkREU0VHKQorICovCitNVl9WT0lEIG12UnRjQ29uZmlnKCkKK3sKKwlNVl9VMzIgaSwgcGlwZVNlbGVjdFZhbDsKKworCS8qIEFjdGl2YXRlIHBpcGUwIGZvciByZWFkL3dyaXRlIHRyYW5zYWN0aW9uLCBhbmQgc2V0IFhCQVIgY2xpZW50IG51bWJlciAjMSAqLworCXBpcGVTZWxlY3RWYWwgPSAweDEgPDwgREZYX1BJUEVfU0VMRUNUX1BJUEUwX0FDVElWRV9PRkZTIFwKKwkJCXwgMHgxIDw8IERGWF9QSVBFX1NFTEVDVF9YQkFSX0NMSUVOVF9TRUxfT0ZGUzsKKwlNVl9SRUdfV1JJVEUoREZYX1JFR19CQVNFLCBwaXBlU2VsZWN0VmFsKTsKKworCS8qIFNldCBuZXcgUlRDIHZhbHVlIGZvciBhbGwgbWVtb3J5IHdyYXBwZXJzICovCisJZm9yIChpID0gMDsgaSA8IFJUQ19NRU1PUllfV1JBUFBFUl9DT1VOVDsgaSsrKQorCQlNVl9SRUdfV1JJVEUoUlRDX01FTU9SWV9XUkFQUEVSX1JFRyhpKSwgUlRDX01FTU9SWV9XUkFQUEVSX0NUUkxfVkFMKTsKKworfQorCisjaWZkZWYgQ09ORklHX0FSTUFEQV8zOFgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogaXNTa2lwcGluZ0FWU0Zyb21FZnVzZQorKgorKiBERVNDUklQVElPTjoKKyoJcmVhZCAnYXZzc2tpcCcgZmllbGQgaW4gRUVQUk9NIHRvIGRldGVjdCB3aGV0aGVyIHRvIHNraXAgQVZTCisqCXNlbGVjdGlvbiBmcm9tIEVGVVNFLCBpbiBvcmRlciB0byBhZGQgb3B0aW9uIHRvIHNraXAgQVZTIHNlbGVjdGlvbgorKgl3aXRoIHByb2JsZW1hdGljIEFWUyB2YWx1ZXMgaW4gRUVQUk9NCisqIFJFVFVSTjoKKyoJTVZfVFJVRSwgaWYgYXZzc2tpcCBpcyAxCisqCU1WX0ZBTFNFLCBvdGhlcndpc2UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBpc1NraXBwaW5nQVZTRnJvbUVmdXNlKCkKK3sKKwlNVl9UV1NJX1NMQVZFIHR3c2lTbGF2ZTsKKwlNVl9VOCBkYXRhOworCisJdHdzaVNsYXZlLnNsYXZlQWRkci5hZGRyZXNzID0gMHg1NzsgLy8gRUVQUk9NIEFkZHJlc3MKKwl0d3NpU2xhdmUuc2xhdmVBZGRyLnR5cGUgPSBBRERSN19CSVQ7CisJdHdzaVNsYXZlLnZhbGlkT2Zmc2V0ID0gTVZfVFJVRTsKKwl0d3NpU2xhdmUubW9yZVRoZW4yNTYgPSBNVl9UUlVFOworCXR3c2lTbGF2ZS5vZmZzZXQgPSAyOwkJLyogU1cgRUVQUk9NLCByZWdpc3RlciAyLCBiaXQgNyAqLworCisJaWYgKG12VHdzaVJlYWQoMCwgJnR3c2lTbGF2ZSwgJmRhdGEsIDEpICE9IE1WX09LKSB7CisJCW12UHJpbnRmKCIlczogVFdTSSBSZWFkIG9mICdhdnNza2lwJyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE1WX1RSVUU7IC8qIHNraXAgQVZTIGZyb20gRUZVU0UgaW4gY2FzZSBvZiBlcnJvciAqLworCX0KKwlkYXRhID4+PSA3OyAvKiBCSVQgNyAqLworCWlmIChkYXRhID09IDEpCisJCXJldHVybiBNVl9UUlVFOworCWVsc2UKKwkJcmV0dXJuIE1WX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkdldEF2c1ZhbEZyb21FZnVzZQorKgorKiBERVNDUklQVElPTjoKKyoJcmVhZCBBVlMgdmFsdWUgd3JpdHRlbiB0byBlRnVzZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHNhdHJGcmVxCisqCXRoZXJlIGFyZSAzIEFWUyB2YWx1ZXMgd3JpdHRlbiBpbiBlRnVzZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBmcmVxdWVuY2llcworKgl0aGF0IGxvd2VyIG9yIGVxdWFsIHRvIDE2MDBNSHosIDE4NjZNSHogYW5kIDIwMDBNSHouCisqCUJpdCBtYXBwaW5nIG9mIEVGVVNFX0FWU19BTkRfQklOX1JFRzoKKyoJKy0tLS0tLS0rLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisqCXwgRmllbGQgfCBCaW4gfCBBVlNfVmFsIDJHSHogfCBBVlNfVmFsIDEuODY2R0h6IHwgQVZTX1ZhbCAxLjZHSHogfAorKgkrLS0tLS0tLSstLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyoJfCBiaXRzICB8IDQtNSB8IDYtMTMgICAgICAgICB8IDE0LTIxICAgICAgICAgICAgfCAyMi0yOSAgICAgICAgICB8CisqCSstLS0tLS0tKy0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworKgorKglCaXQgbWFwcGluZyBvZiBFRlVTRV9BVlNfVkVSU0lPTl9SRUc6CisqCSstLS0tLS0tKy0tLS0tLS0tLSsKKyoJfCBGaWVsZCB8IFZlcnNpb24gfAorKgkrLS0tLS0tLSstLS0tLS0tLS0rCisqCXwgYml0cyAgfCAyNC0yNyAgIHwKKyoJKy0tLS0tLS0rLS0tLS0tLS0tKworKiBJTlBVVDoKKyoJc2F0ckZyZXEJLSBjb250cm9sbGVyIENQVSBmcmVxdWVuY3kKKyoKKyogT1VUUFVUOgorKglhdnNWYWwJCS0gQVZTIHZhbHVlIGluIGVGdXNlIGNvcnJlc3BvbmRpbmcgdG8gc2F0ckZyZXEKKyoKKyogUkVUVVJOOgorKglNVl9UUlVFLCBpZiBBVlMgdmFsdWUgZXhpdHMgaW4gZUZ1c2UgKGlmIHZlcnNpb24gaXMgbm90IGVxdWFsIDApLgorKglNVl9GQUxTRSwgb3RoZXJ3aXNlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0JPT0wgbXZHZXRBdnNWYWxGcm9tRWZ1c2UoTVZfVTMyIHNhdHJGcmVxLCBNVl9VMzIgKmF2c1ZhbCkKK3sKKwlNVl9VMzIgdmVyc2lvblZhbCwgYmluVmFsLCBhdnNSZWdDb250cm9sVmFsOworCU1WX0JPQVJEX0FWU19FRlVTRV9NQVAgZWZ1c2VfZnJlcV92YWxbXSA9IEVGVVNFX0ZSRVFfVkFMX0lORk87CisJaW50IGk7CisKKyNpZm5kZWYgQ09ORklHX0FWU19GUk9NX0VGVVNFCisJbXZQcmludGYoIkFWUyBzZWxlY3Rpb24gZnJvbSBFRlVTRSBkaXNhYmxlZCAoU2tpcCByZWFkaW5nIEVGVVNFIHZhbHVlcylcbiIpOworCXJldHVybiBNVl9GQUxTRTsKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCisJLyogRm9yIE1hcnZlbGwgYm9hcmRzIG9ubHk6CisJICogQVZTIGNvbmZpZ3VyYXRpb24gZnJvbSBFRlVTRSBjYW4gYmUgc2tpcHBlZCBmb3IgTWFydmVsbCBib2FyZHMsIGZvcjoKKwkJLSBBbHJlYWR5IGV4aXN0aW5nIFNvQ3Mgd2hpY2ggRUZVU0Ugd2FzIG5vdCBwcmUtYnVybnQgd2l0aCBBVlMgdmFsdWVzCisJCS0gU29DcyB3aXRoIGludmFsaWQgQVZTIEVGVVNFIHZhbHVlcyAqLworCWlmIChpc1NraXBwaW5nQVZTRnJvbUVmdXNlKCkgPT0gTVZfVFJVRSkgeworCQltdlByaW50ZigiU2tpcHBpbmcgQVZTIHNlbGVjdGlvbiBmcm9tIEVGVVNFIChTYXRSIGZpZWxkICdhdnNza2lwJyA9IFllcylcbiIpOworCQlyZXR1cm4gTVZfRkFMU0U7CisJfQorI2VuZGlmCisKKwkvKiBTZXQgTWVtb3J5IEkvTyB3aW5kb3cgKi8KKwlNVl9SRUdfV1JJVEUoQUhCX1RPX01CVVNfV0lOX0NUUkxfUkVHKEVGVVNFX1dJTl9JRCksIEVGVVNFX1dJTl9DVFJMX1ZBTCk7CisJTVZfUkVHX1dSSVRFKEFIQl9UT19NQlVTX1dJTl9CQVNFX1JFRyhFRlVTRV9XSU5fSUQpLCBFRlVTRV9XSU5fQkFTRV9WQUwpOworCU1WX1JFR19XUklURShBSEJfVE9fTUJVU19XSU5fUkVNQVBfTE9XX1JFRyhFRlVTRV9XSU5fSUQpLCAwKTsKKwlNVl9SRUdfV1JJVEUoQUhCX1RPX01CVVNfV0lOX1JFTUFQX0hJR0hfUkVHKEVGVVNFX1dJTl9JRCksIDApOworCisJLyogY2hlY2sgdmVyc2lvbiB2YWx1ZQorCSAqIGlmIGl0IGlzIGVxdWFsIHRvIDAgdGhlbiBBVlMgdmFsdWUgZG9lcyBub3QgZXhpc3QgKi8KKwl2ZXJzaW9uVmFsID0gKE1WX0VGVVNFX1JFR19SRUFEKEVGVVNFX0FWU19WRVJTSU9OX1JFRykgJgorCQkJKEVGVVNFX0FWU19WRVJTSU9OX01BU0sgPDwgRUZVU0VfQVZTX1ZFUlNJT05fT0ZGU0VUKSkgPj4gRUZVU0VfQVZTX1ZFUlNJT05fT0ZGU0VUOworCWlmICh2ZXJzaW9uVmFsID09IDApIHsKKwkJbXZQcmludGYoIkFWUyBmcm9tIGVGdXNlIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCAoJXUpXG4iLCB2ZXJzaW9uVmFsKTsKKwkJcmV0dXJuIE1WX0ZBTFNFOworCX0KKworCS8qIHJlYWQgQmluIHZhbHVlCisJICogYmluIHZhbHVlIGluZGljYXRlcyBoaWdoZXN0IGZyZXF1ZW5jeSB0aGUgZGV2aWNlIG1lZXRzOgorCSAqIC0gMHgzOiAxNjAwTUh6CisJICogLSAweDI6IDE4NjZNSHoKKwkgKiAtIDB4MTogMjAwME1IeiAqLworCWJpblZhbCA9IChNVl9FRlVTRV9SRUdfUkVBRChFRlVTRV9BVlNfQU5EX0JJTl9SRUcpICYKKwkJCShFRlVTRV9BVlNfQklOX01BU0sgPDwgRUZVU0VfQVZTX0JJTl9PRkZTRVQpKSA+PiBFRlVTRV9BVlNfQklOX09GRlNFVDsKKworCS8qIGZldGNoIEFWU19WYWwgYWNjb3JkaW5nIHRvIGZyZXF1ZW5jeQorCSAqIGNoZWNrIGlmIHNlbGVjdGVkIFNAUiB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGZyZXF1ZW5jeSAxODY2LDIwMDAsCisJICogb3IgYmVsb3cgMTYwME1IeiAoMXN0IGNlbGwgaXMgMTYwMCkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRUZVU0VfRlJFUV9WQUxfU0laRTsgKytpKSB7CisJCS8qIGNoZWNrIHRoYXQgU0BSIGZyZXEgbW9kZSBpcyBwZXJtaXR0ZWQgb24gY2hpcDoKKwkJICogY2hlY2sgaWYgQmluIHZhbCBmcm9tIGVGdXNlIGlzIGxvd2VyL2VxdWFsIHRoYW4gdGhlIGJpbiB2YWx1ZQorCQkgKiBjb3JyZXNwb25kaW5nIHdpdGggdGhpcyBTQFIgZnJlcSAqLworCQlpZiAoc2F0ckZyZXEgPT0gZWZ1c2VfZnJlcV92YWxbaV0uY3B1X2ZyZXFfbW9kZQorCQkJCXx8IChpID09IDAgJiYgc2F0ckZyZXEgPCBlZnVzZV9mcmVxX3ZhbFtpXS5jcHVfZnJlcV9tb2RlKSkgeworCQkJaWYgKGJpblZhbCA+IGVmdXNlX2ZyZXFfdmFsW2ldLmF2c19iaW5fdmFsdWUpIHsKKwkJCQkvKiBmb3Igc2VjdXJpdHkgY2hlY2ssIFNAUiBmcmVxdWVuY3kgaXMgbm90IGFsbG93ZWQgYnkgQmluIGZpZWxkCisJCQkJICogd3JpdGUgZGVmYXVsdCB2YWx1ZSBvZiBBVlMgMS4yNVYsIGFuZCBoYWx0IHRoZSBDUFUgKGVtcHR5IGluZmluaXRlIGxvb3ApCisJCQkJICovCisJCQkJbXZQcmludGYoIkVSUk9SOiBBVlMgZnJvbSBFRlVTRSBkb2VzIG5vdCBzdXBwb3J0IGN1cnJlbnQgQ1BVIGZyZXF1bmN5ICgldSBNSHopXG4iLAorCQkJCQkJZWZ1c2VfZnJlcV92YWxbaV0uY3B1X2ZyZXEpOworCQkJCW12UHJpbnRmKCJQbGVhc2UgY29uZmlndXJlIGxvd2VyIGZyZXF1ZW5jeSBtb2RlIGluIFNAUlxuIik7CisJCQkJYXZzUmVnQ29udHJvbFZhbCA9IE1WX1JFR19SRUFEKEFWU19FTkFCTEVEX0NPTlRST0wpOworCQkJCWF2c1JlZ0NvbnRyb2xWYWwgfD0gKChNVl9BVlNfREVGQVVMVF9WQUxVRSA8PCBBVlNfTE9XX1ZERF9MSU1JVF9PRkZTKQorCQkJCQkJCXwgKE1WX0FWU19ERUZBVUxUX1ZBTFVFIDw8IEFWU19ISUdIX1ZERF9MSU1JVF9PRkZTKSk7CisJCQkJTVZfUkVHX1dSSVRFKEFWU19FTkFCTEVEX0NPTlRST0wsIGF2c1JlZ0NvbnRyb2xWYWwpOworCQkJCS8qIGhhbHQgdGhlIENQVSAqLworCQkJCXdoaWxlICgxKQorCQkJCQk7CisJCQl9CisJCQkvKiBpZiBCaW4gdmFsdWUgcGVybWl0cyBzZWxlY3RlZCBmcmVxdWVuY3kgbW9kZSwKKwkJCSAqIHJlYWQgaXQncyBjb3JyZXNwb25kaW5nIEFWUyB2YWx1ZSBmcm9tIEVGVVNFICovCisJCQkqYXZzVmFsID0gKE1WX0VGVVNFX1JFR19SRUFEKEVGVVNFX0FWU19BTkRfQklOX1JFRykgJgorCQkJCQkoRUZVU0VfQVZTX1ZBTF9NQVNLIDw8IEVGVVNFX0FWU19WQUxfT0ZGU0VUX0FUX0lORChpKSkpID4+CisJCQkJCQkJCUVGVVNFX0FWU19WQUxfT0ZGU0VUX0FUX0lORChpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpID09IEVGVVNFX0ZSRVFfVkFMX1NJWkUgJiYgc2F0ckZyZXEgPiBlZnVzZV9mcmVxX3ZhbFswXS5jcHVfZnJlcV9tb2RlKSB7CisJCS8qIGNoZWNrIGlmIGNoaXAgaXMgY29uZmlndXJlZCB0byBDUFUgZnJlcXVlbmN5CisJCSAqIHRoYXQgaXMgdW5zdXBwb3J0ZWQgYnkgQVZTIEAgRUZVU0UgbWFwcGluZyAqLworCQltdlByaW50ZigiRVJST1I6IHNlbGVjdGVkIENQVSBmcmVxdWVuY3kgKG1vZGUgMHglWCkgaXMgbm90IHN1cHBvcnRlZFxuIiwgc2F0ckZyZXEpOworCQlyZXR1cm4gTVZfRkFMU0U7CisJfQorCW12UHJpbnRmKCJTZWxlY3RlZCBBVlMgdmFsdWUgZnJvbSBlRnVzZTogMHglWCAoY29ycmVzcG9uZGluZyB0byBmcmVxdWVuY3kgJXVNSHopICIsCisJCQkqYXZzVmFsLCBlZnVzZV9mcmVxX3ZhbFtpXS5jcHVfZnJlcSk7CisJbXZQcmludGYoIkVGVVNFIHZlcnNpb24gJXVcbiIsIHZlcnNpb25WYWwpOworCXJldHVybiBNVl9UUlVFOworfQorI2VuZGlmIC8qIENPTkZJR19BUk1BREFfMzhYICovCisKIE1WX1NUQVRVUyBtdkdlbmVyYWxJbml0KHZvaWQpCiB7CiAJTVZfVTMyIHJlZ0RhdGE7Ci0KLQkvKiBVcGRhdGUgQVZTIGRlYnVnIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgICAgICAgTVZfUkVHX1dSSVRFKEFWU19ERUJVR19DTlRSX1JFRywgQVZTX0RFQlVHX0NOVFJfREVGQVVMVF9WQUxVRSk7Ci0KLSAgICAgICAgcmVnRGF0YSA9IE1WX1JFR19SRUFEKEFWU19FTkFCTEVEX0NPTlRST0wpOwotICAgICAgICByZWdEYXRhICY9IH4oQVZTX0xPV19WRERfTElNSVRfTUFTSyB8IEFWU19ISUdIX1ZERF9MSU1JVF9NQVNLKTsKLQlyZWdEYXRhIHw9IChBVlNfTE9XX1ZERF9MSU1JVF9WQUwgfCBBVlNfSElHSF9WRERfTElNSVRfVkFMKTsKLSAgICAgICAgTVZfUkVHX1dSSVRFKEFWU19FTkFCTEVEX0NPTlRST0wsIHJlZ0RhdGEpOwotCi0JbXZNcHBDb25maWcoKTsKKyNpZmRlZiBDT05GSUdfQVJNQURBXzM4WAorCU1WX1UzMiBhdnNWYWw7CisjZW5kaWYKKwltdk1wcENvbmZpZygpOyAvKiBNUFAgbXVzdCBiZSBjb25maWd1cmVkIHByaW9yIHRvIFVBUlQvSTJDIGFjY2VzcyAqLwogCiAJLyogLSBJbml0IHRoZSBUV1NJIGJlZm9yZSBhbGwgSTJDIHRyYW5zYWN0aW9uICovCiAJREVCVUdfSU5JVF9GVUxMX1MoIm12R2VuZXJhbEluaXQ6IEluaXQgVFdTSSBpbnRlcmZhY2UuXG4iKTsKKwkvKiBJMkMvVFdTSSB1bml0IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIG12VWFydEluaXQgaXMgY2FsbGVkLAorCSAqIHNpbmNlIFVBUlQgcG9ydCBpcyBzZWxlY3RlZCBhY2NvcmRpbmcgdG8gYm9hcmQgSUQKKwkgKiAocmVhZCBCb2FyZCBJRCBmcm9tIEVFUFJPTSB2aWEgSTJDKSAqLwogCW12SHdzVHdzaUluaXRXcmFwcGVyKCk7CiAKICNpZiAhZGVmaW5lZChNVl9OT19QUklOVCkKQEAgLTEzOSw5ICszMTUsNTYgQEAKIAltdlByaW50ZigiXG5cbkdlbmVyYWwgaW5pdGlhbGl6YXRpb24gLSBWZXJzaW9uOiAiIEdFTkVSQUxfVkVSSU9OICJcbiIpOwogI2VuZGlmCiAKKwkvKiBVcGRhdGUgQVZTIGRlYnVnIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlNVl9SRUdfV1JJVEUoQVZTX0RFQlVHX0NOVFJfUkVHLCBBVlNfREVCVUdfQ05UUl9ERUZBVUxUX1ZBTFVFKTsKKwlNVl9SRUdfV1JJVEUoQVZTX0RFQlVHX0NOVFJfUkVHLCBBVlNfREVCVUdfQ05UUl9ERUZBVUxUX1ZBTFVFKTsKKworCXJlZ0RhdGEgPSBNVl9SRUdfUkVBRChBVlNfRU5BQkxFRF9DT05UUk9MKTsKKwlyZWdEYXRhICY9IH4oQVZTX0xPV19WRERfTElNSVRfTUFTSyB8IEFWU19ISUdIX1ZERF9MSU1JVF9NQVNLKTsKKworI2lmZGVmIENPTkZJR19BUk1BREFfMzhYCisJLyogMS4gQXJtYWRhMzh4IHdhcyBzaWduZWQgb2ZmIGZvciAxNjAwLzgwMCBhdCAxLjE1ViAoQVZTKQorCSAqIDIuIEJhc2VkIG9uIEFURS9zeXN0ZW0gY29ycmVsYXRpb24sIGluIG9yZGVyIHRvIGFjaGlldmUgaGlnaGVyIHNwZWVkcyAoMTg2Nk1IeiwgMjAwME1IeiksCisJICogICAgd2UgbmVlZCB0byBvdmVyZHJpdmUgdGhlIGNoaXAgdG8gMS4yNVYgKEFWUykKKwkgKiAgMy4xLiBJZiBBVlMgdmFsdWVzIGFyZSBub3Qgd3JpdHRlbiBvbiBlRnVzZSwgVGhlIHdyaXRlIHRvIEFWUyBpcworCSAqICAgICAgYmFzZWQgb24gU0BSIChDUFUgPD0gMTYwME1IeiAtLT4gQVZTQCAxLjE1VikKKwkgKiAgMy4yLiBJZiBBVlMgdmFsdWVzIGFyZSB3cml0dGVuIHRvIGVGdXNlICh2ZXJzaW9uIGZpZWxkIGlzIGRpZmZlcmVudCB0aGFuIHplcm8pCisJICogICAgICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZnJlcXVlbmN5IGhhdmUgY29ycmVzcG9uZGluZyBBVlMgdmFsdWUgd3JpdHRlbiB0byBlRnVzZSwKKwkgKiAgICAgIChjb3JyZXNwb25kcyB0byBmcmVxdWVuY3kgYmVsb3cgMTYwME1IeiwgZXF1YWxzIDE4NjZNSHogb3IgZXF1YWxzIDIwMDBNSHopCisJICogICAgICBUaGVuIHdyaXRlIHRoZSBjb3JyZXNwb25kaW5nIEFWUyB2YWx1ZS4KKwkgKiAgICAgIEZvciBzZWN1cml0eSBjaGVjaywgQmluIHZhbHVlIGlzIGJ1cm50LCB0aGF0IHRlbGxzIHdoaWNoIGlzIHRoZSBtYXhpbXVtCisJICogICAgICBhbGxvd2VkIGZyZXF1ZW5jeS4gSWYgdGhlIFNAUiBmcmVxdWVuY3kgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0sIHRoZSBjaGlwIGlzCisJICogICAgICBoYWx0ZWQgKGVtcHR5IGluZmluaXRlIGxvb3ApLCBhbmQgMS4yNVYgaXMgd3JpdHRlbiB0byBBVlMKKwkgKi8KKwl7CisJCU1WX1UzMiBzYXRyRnJlcTsKKwkJc2F0ckZyZXEgPSAoTVZfUkVHX1JFQUQoREVWSUNFX1NBTVBMRV9BVF9SRVNFVDFfUkVHKSA+PiBTQVJfRlJFUV9PRkZTRVQpICYgU0FSX0ZSRVFfTUFTSzsKKworCQlpZiAobXZHZXRBdnNWYWxGcm9tRWZ1c2Uoc2F0ckZyZXEsICZhdnNWYWwpID09IE1WX1RSVUUpIHsKKwkJCXJlZ0RhdGEgfD0gKChhdnNWYWwgPDwgQVZTX0xPV19WRERfTElNSVRfT0ZGUykgfCAoYXZzVmFsIDw8IEFWU19ISUdIX1ZERF9MSU1JVF9PRkZTKSk7CisJCQlNVl9SRUdfV1JJVEUoQVZTX0VOQUJMRURfQ09OVFJPTCwgcmVnRGF0YSk7CisJCX0gZWxzZSB7CisJCQkvKlNldCBBVlMgdmFsdWUgb25seSBmb3Igbm9ybWF0aXZlIGNvcmUgZnJlcSgxNjAwTWh6IGFuZCBsZXNzKSwKKwkJCSAqIGZvciBoaWdoIGZyZXEgbGVhdmUgZGVmYXVsdCB2YWx1ZSovCisJCQlpZiAoc2F0ckZyZXEgPD0gMHhEKSB7CisJCQkJcmVnRGF0YSB8PSAoKEFWU19MSU1JVF9WQUxfU0xPVyA8PCBBVlNfTE9XX1ZERF9MSU1JVF9PRkZTKSB8CisJCQkJCQkoQVZTX0xJTUlUX1ZBTF9TTE9XIDw8IEFWU19ISUdIX1ZERF9MSU1JVF9PRkZTKSk7CisJCQkJTVZfUkVHX1dSSVRFKEFWU19FTkFCTEVEX0NPTlRST0wsIHJlZ0RhdGEpOworCQkJCW12UHJpbnRmKCJPdmVycmlkaW5nIGRlZmF1bHQgQVZTIHZhbHVlIHRvOiAweCVYXG4iLCBBVlNfTElNSVRfVkFMX1NMT1cpOworCQkJfQorCQl9CisJfQorI2Vsc2UKKwkJcmVnRGF0YSB8PSAoIChBVlNfTElNSVRfVkFMIDw8IEFWU19MT1dfVkREX0xJTUlUX09GRlMpIHwgKEFWU19MSU1JVF9WQUwgPDwgQVZTX0hJR0hfVkREX0xJTUlUX09GRlMpKTsKKwkJTVZfUkVHX1dSSVRFKEFWU19FTkFCTEVEX0NPTlRST0wsIHJlZ0RhdGEpOworI2VuZGlmCisKKwltdlJ0Y0NvbmZpZygpOyAvKiB1cGRhdGUgUlRDIChSZWFkIFRpbWluZyBDb250cm9sKSB2YWx1ZXMgb2YgUENJZSBtZW1vcnkgd3JhcHBlcnMqLworCiAJLyogRGV2aWNlIGdlbmVyYWwgY29uZmlndXJhdGlvbiB3YXMgbm90IHN1cHBvcnRlZCBvbiBhMzh4IFowIHJldmlzaW9uICovCiAJaWYgKG12U3lzRW52RGV2aWNlUmV2R2V0KCkgIT0gTVZfODhGNjhYWF9aMV9JRCkKIAkJbXZEZXZpY2VJZENvbmZpZygpOworCW12U3lzRW52VXNiVmJ1c1Jlc2V0KCk7CiAKIAlyZXR1cm4gTVZfT0s7CiB9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2luaXQvYTM4eC9nZW5lcmFsSW5pdC5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19pbml0L2EzOHgvZ2VuZXJhbEluaXQuaAppbmRleCA0MGRlZGMyLi4wYjU4MDA2IDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2luaXQvYTM4eC9nZW5lcmFsSW5pdC5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfaW5pdC9hMzh4L2dlbmVyYWxJbml0LmgKQEAgLTY1LDYgKzY1LDExIEBACiAjaWZuZGVmIF9fSU5DbXZHZW5lcmFsSW5pdGgKICNkZWZpbmUgX19JTkNtdkdlbmVyYWxJbml0aAogCisjaWZkZWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQKKy8qIFZpcnR1YWwgUmVkdWNlZCBmbGF2b3IgRGV2aWNlIElEIGlzIGRlZmluZWQgYnkgUkVEVUNFRF9GTEFWT1IgdmFsdWUgKi8KKy8vI2RlZmluZSBSRURVQ0VEX0ZMQVZPUiAweDM4MyAvKiAweDM4MzogQTM4MyAtIDZXMjEgKi8KKy8vI2RlZmluZSBSRURVQ0VEX0ZMQVZPUiAweDM4NCAvKiAweDM4NDogQTM4NCAtIDZXMjMgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCAqLwogI2RlZmluZSBHRU5FUkFMX1ZFUklPTiAiMS4wLjAiCiAKICNlbmRpZiAvKiBfX0lOQ212R2VuZXJhbEluaXRoICovCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2luaXQvbXN5cy9nZW5lcmFsSW5pdC5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19pbml0L21zeXMvZ2VuZXJhbEluaXQuYwppbmRleCBhNzYxMTc3Li4yM2RmNDNjIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2luaXQvbXN5cy9nZW5lcmFsSW5pdC5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfaW5pdC9tc3lzL2dlbmVyYWxJbml0LmMKQEAgLTY5LDYgKzY5LDcgQEAKICNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAibXZTaWxpY29uSWYuaCIKICNpbmNsdWRlICJnZW5lcmFsSW5pdC5oIgorI2luY2x1ZGUgIm12U3lzRW52TGliLmgiCiAKICNpZiBkZWZpbmVkKE1WX01TWVNfQUMzKQogI2luY2x1ZGUgImRkcjNfbXN5c19hYzMuaCIKQEAgLTE3Miw2ICsxNzMsNyBAQAogCW12VWFydEluaXQoKTsKIAlERUJVR19JTklUX1MoIlxuXG5HZW5lcmFsIGluaXRpYWxpemF0aW9uIC0gVmVyc2lvbjogIiBHRU5FUkFMX1ZFUklPTiAiXG4iKTsKICNlbmRpZgorCW12SHdzVHdzaUluaXRXcmFwcGVyKCk7CiAKIAlyZXR1cm4gTVZfT0s7CiB9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212Q3RybFBleC5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkN0cmxQZXguYwppbmRleCBlYzMyNWExLi40ZmFlYTVlIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212Q3RybFBleC5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZDdHJsUGV4LmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCQlpZiAoKHNlcmRlc1R5cGUgIT0gUEVYMCkgJiYgKHNlcmRlc1R5cGUgIT0gUEVYMSkgJiYgKHNlcmRlc1R5cGUgIT0gUEVYMikgJiYgKHNlcmRlc1R5cGUgIT0gUEVYMykpCiAJCQljb250aW51ZTsKIAotCQlpZiAoKHNlcmRlc1R5cGUgIT0gUEVYMCkgJiYKKwkJaWYgKChzZXJkZXNJZHggIT0gMCkgJiYKIAkJCQkoKHNlcmRlc01hcFtzZXJkZXNJZHhdLnNlcmRlc01vZGUgPT0gUEVYX1JPT1RfQ09NUExFWF94NCkgfHwKIAkJCQkgKHNlcmRlc01hcFtzZXJkZXNJZHhdLnNlcmRlc01vZGUgPT0gUEVYX0VORF9QT0lOVF94NCkpKQogCQl7CkBAIC0xOTcsNyArMTk3LDcgQEAKIAogCWZvciAoc2VyZGVzSWR4ID0gMDsgc2VyZGVzSWR4IDwgbWF4TGFuZU51bTsgc2VyZGVzSWR4KyspIHsKIAkJc2VyZGVzVHlwZSA9IHNlcmRlc01hcFtzZXJkZXNJZHhdLnNlcmRlc1R5cGU7Ci0JCWlmICgoc2VyZGVzVHlwZSAhPSBQRVgwKSAmJgorCQlpZiAoKHNlcmRlc0lkeCAhPSAwKSAmJgogCQkJCSgoc2VyZGVzTWFwW3NlcmRlc0lkeF0uc2VyZGVzTW9kZSA9PSBQRVhfUk9PVF9DT01QTEVYX3g0KSB8fAogCQkJCSAoc2VyZGVzTWFwW3NlcmRlc0lkeF0uc2VyZGVzTW9kZSA9PSBQRVhfRU5EX1BPSU5UX3g0KSkpCiAJCXsKQEAgLTI0NCw3ICsyNDQsNyBAQAogCQlpZiAoKHNlcmRlc1R5cGUgIT0gUEVYMCkgJiYgKHNlcmRlc1R5cGUgIT0gUEVYMSkgJiYgKHNlcmRlc1R5cGUgIT0gUEVYMikgJiYgKHNlcmRlc1R5cGUgIT0gUEVYMykpCiAJCQljb250aW51ZTsKIAotCQlpZiAoKHNlcmRlc1R5cGUgIT0gUEVYMCkgJiYKKwkJaWYgKChzZXJkZXNJZHggIT0gMCkgJiYKIAkJCQkoKHNlcmRlc01hcFtzZXJkZXNJZHhdLnNlcmRlc01vZGUgPT0gUEVYX1JPT1RfQ09NUExFWF94NCkgfHwKIAkJCQkgKHNlcmRlc01hcFtzZXJkZXNJZHhdLnNlcmRlc01vZGUgPT0gUEVYX0VORF9QT0lOVF94NCkpKQogCQl7CkBAIC0zMjQsNyArMzI0LDcgQEAKIAkJaWYgKChzZXJkZXNUeXBlICE9IFBFWDApICYmIChzZXJkZXNUeXBlICE9IFBFWDEpICYmIChzZXJkZXNUeXBlICE9IFBFWDIpICYmIChzZXJkZXNUeXBlICE9IFBFWDMpKQogCQkJY29udGludWU7CiAKLQkJaWYgKChzZXJkZXNUeXBlICE9IFBFWDApICYmCisJCWlmICgoc2VyZGVzSWR4ICE9IDApICYmCiAJCQkJKChzZXJkZXNNYXBbc2VyZGVzSWR4XS5zZXJkZXNNb2RlID09IFBFWF9ST09UX0NPTVBMRVhfeDQpIHx8CiAJCQkJIChzZXJkZXNNYXBbc2VyZGVzSWR4XS5zZXJkZXNNb2RlID09IFBFWF9FTkRfUE9JTlRfeDQpKSkKIAkJewpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkN0cmxQZXguaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZDdHJsUGV4LmgKaW5kZXggODYwMTUwZS4uNjM1N2M0YyAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkN0cmxQZXguaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212Q3RybFBleC5oCkBAIC04OSw2ICs4OSw4IEBACiAjZGVmaW5lIE1BWF9QRVhfQlVTU0VTICAgICAgICAgICAgICAgICAgICAgICAgICAyNTYKIAogI2RlZmluZSBQRVhfQ0FQQUJJTElUSUVTX1JFRyhwZXhJZikJCQkgICAgKChNVl9QRVhfSUZfUkVHU19CQVNFKHBleElmKSkgKyAweDYwKQorI2RlZmluZSBQRVhfTElOS19DQVBBQklMSVRJRVNfUkVHKHBleElmKQkJKChNVl9QRVhfSUZfUkVHU19CQVNFKHBleElmKSkgKyAweDZDKQorI2RlZmluZSBQRVhfTElOS19DVFJMX1NUQVRVU19SRUcocGV4SWYpIAkJKChNVl9QRVhfSUZfUkVHU19CQVNFKHBleElmKSkgKyAweDcwKQogI2RlZmluZSBQRVhfTElOS19DVFJMX1NUQVRVUzJfUkVHKHBleElmKSAgICAgICAgKChNVl9QRVhfSUZfUkVHU19CQVNFKHBleElmKSkgKyAweDkwKQogI2RlZmluZSBQRVhfQ1RSTF9SRUcocGV4SWYpICAgICAgICAgICAgICAgICAgICAgKChNVl9QRVhfSUZfUkVHU19CQVNFKHBleElmKSkgKyAweDFBMDApCiAjZGVmaW5lIFBFWF9TVEFUVVNfUkVHKHBleElmKSAgICAgICAgICAgICAgICAgICAoKE1WX1BFWF9JRl9SRUdTX0JBU0UocGV4SWYpKSArIDB4MUEwNCkKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRFbnZTcGVjLTM4eC5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZEVudlNwZWMtMzh4LmMKaW5kZXggNjNhNmJkMi4uNjM3YWNlYSAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZEVudlNwZWMtMzh4LmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZEVudlNwZWMtMzh4LmMKQEAgLTEyOCwxOSArMTI4LDIxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfVTMyIG12SHdzU2VyZGVzR2V0TWF4TGFuZShNVl9WT0lEKQogewotICAgIHN3aXRjaCAobXZTeXNFbnZEZXZpY2VJZEdldCgpKSB7Ci0gICAgY2FzZSBNVl82ODExOiAvKiBBMzgxL0EzMjgyOiA2ODExLzY4MjE6IHNpbmdsZS9kdWFsIGNwdSAqLwotICAgICAgICByZXR1cm4gNDsKLSAgICBjYXNlIE1WXzY4MTA6Ci0gICAgICAgIHJldHVybiA1OwotICAgIGNhc2UgTVZfNjgyMDoKLSAgICBjYXNlIE1WXzY4Mjg6Ci0gICAgICAgIHJldHVybiA2OwotICAgIGRlZmF1bHQ6ICAgIC8qIG5vdCB0aGUgcmlnaHQgbW9kdWxlICovCi0gICAgICAgIG12UHJpbnRmKCIlczogRGV2aWNlIElEIEVycm9yLCB1c2luZyA0IFNlckRlcyBsYW5lc1xuIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gNDsKLSAgICAgICAgfQotICAgIHJldHVybiA2OworCXN3aXRjaCAobXZTeXNFbnZEZXZpY2VJZEdldCgpKSB7CisJY2FzZSBNVl82ODExOiAvKiBBMzgxL0EzMjgyOiA2ODExLzY4MjE6IHNpbmdsZS9kdWFsIGNwdSAqLworCWNhc2UgTVZfNlcyMjogLyogNlcyMj1BMzgzICovCisJY2FzZSBNVl82VzIzOiAvKiA2VzIzPUEzODQgKi8KKwkJcmV0dXJuIDQ7CisJY2FzZSBNVl82ODEwOgorCQlyZXR1cm4gNTsKKwljYXNlIE1WXzY4MjA6CisJY2FzZSBNVl82ODI4OgorCQlyZXR1cm4gNjsKKwlkZWZhdWx0OiAgICAvKiBub3QgdGhlIHJpZ2h0IG1vZHVsZSAqLworCQltdlByaW50ZigiJXM6IERldmljZSBJRCBFcnJvciwgdXNpbmcgNCBTZXJEZXMgbGFuZXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDQ7CisJfQorCXJldHVybiA2OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZEVudlNwZWMtMzl4LmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkRW52U3BlYy0zOXguYwppbmRleCAxYzdiZTk0Li43MjJiMDFiIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkRW52U3BlYy0zOXguYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkRW52U3BlYy0zOXguYwpAQCAtMjMwLDcgKzIzMCwxMCBAQAogCiAJCS8qIEV4ZWN1dGluZyBwb3dlciB1cCwgcmVmIGNsb2NrIHNldCwgc3BlZWQgY29uZmlnIGFuZCBUWCBjb25maWcgKi8KIAkJc3dpdGNoIChzZXJkZXNUeXBlKSB7Ci0gICAgICAgIGNhc2UgU0dNSUkzOgorICAgICAgICBjYXNlIFNHTUlJdjNfMDoKKwljYXNlIFNHTUlJdjNfMToKKwljYXNlIFNHTUlJdjNfMjoKKwljYXNlIFNHTUlJdjNfMzoKIAkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBTR01JSV9QT1dFUl9VUF9TRVEpKTsKIAkJCUNIRUNLX1NUQVRVUyhtdkh3c1JlZkNsb2NrU2V0KHNlcmRlc051bSwgc2VyZGVzVHlwZSwgcmVmQ2xvY2spKTsKIAkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBzcGVlZFNlcUlkKSk7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkRW52U3BlYy5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZEVudlNwZWMuYwppbmRleCAyZWNkM2Q0Li4wM2U4NTczIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkRW52U3BlYy5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRFbnZTcGVjLmMKQEAgLTExOCw5ICsxMTgsMTEgQEAKIC8qIFNlcmRlc0xhbmVJblVzZUNvdW50IGNvbnRhaW5zIHRoZSBleGFjdCBhbW91bnQgb2Ygc2VyZGVzIGxhbmVzIG5lZWRlZCBwZXIgdHlwZSAqLwogTVZfVTggU2VyZGVzTGFuZUluVXNlQ291bnRbTUFYX1VOSVRTX0lEXVtNQVhfVU5JVF9OVU1CXSA9CiB7CisJLyogaWYgUEVYMCBpcyBkZWZpbmVzIGFzIFBFWHg0IGl0IGNhbiB1c2UgNCBsYW5lczsgaW4gUEVYeDEgb25seSAxCisJdGhlIHZhbHVlIGZvciBQRVggMCBpcyB1cGRhdGVkIGluIG12SHdzU2VyZGVzVG9wb2xvZ3lWZXJpZnkgZnVuY3Rpb24gKi8KIAkvKiAwICAxICAyICAzICAgICovCi0JeyAgMSwgMSwgMSwgMSB9LCAgLyogUEVYICAgICAqLwotCXsgIDEsIDEsIDEsIDEgfSwgIC8qIEVUSF9HSUcgKi8KKwl7ICA0LCAxLCAxLCAxIH0sICAvKiBQRVggICAgICovCisJeyAgMSwgMSwgMSwgMSB9LCAgLyogRVRIX1NHTUlJICovCiAJeyAgMSwgMSwgMCwgMCB9LCAgLyogVVNCM0ggICAqLwogCXsgIDEsIDEsIDEsIDAgfSwgIC8qIFVTQjNEICAgKi8KIAl7ICAxLCAxLCAxLCAxIH0sICAvKiBTQVRBICAgICovCkBAIC0xMzYsNTYgKzEzOCw2MSBAQAogTVZfVTggY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbTEFTVF9TRVJERVNfVFlQRV1bTUFYX1NFUkRFU19MQU5FU10gPQogewogCS8qIDAgICAgICAxICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICovCi0JeyAweDEsICAgMHgxLCAgICBOQSwJIE5BLAkgTkEsCSBOQSwgICAgIE5BICAgfSwgIC8qIFBFWDAgKi8KLQl7IE5BLCAgICBOQSwgICAgIDB4MSwJIE5BLAkgMHgxLAkgTkEsICAgICAweDEgIH0sICAvKiBQRVgxICovCi0JeyBOQSwgICAgTkEsICAgICBOQSwJIE5BLAkgMHg3LAkgMHgxLCAgICBOQQkgIH0sICAvKiBQRVgyICovCi0JeyBOQSwgICAgTkEsICAgICBOQSwJIDB4MSwJIE5BLAkgTkEsICAgICBOQQkgIH0sICAvKiBQRVgzICovCi0JeyAweDIsICAgMHgzLCAgICBOQSwJIE5BLAkgTkEsCSBOQSwgICAgIE5BCSAgfSwgIC8qIFNBVEEwICovCi0JeyBOQSwgICAgTkEsICAgICAweDMsCSBOQSwJIE5BLAkgTkEsICAgICBOQQkgIH0sICAvKiBTQVRBMSAqLwotCXsgTkEsICAgIE5BLCAgICAgTkEsCSBOQSwJIDB4NiwJIDB4MiwgICAgTkEJICB9LCAgLyogU0FUQTIgKi8KLQl7IE5BLAkgTkEsICAgICBOQSwJIDB4MywJIE5BLAkgTkEsICAgICBOQQkgIH0sICAvKiBTQVRBMyAqLwotCXsgMHgzLCAgIDB4NCwgICAgTkEsICAgICBOQSwJIE5BLAkgTkEsICAgICBOQQkgIH0sICAvKiBTR01JSTAgKi8KLQl7IE5BLCAgICAweDUsICAgIDB4NCwgICAgTkEsCSAweDMsCSBOQSwgICAgIE5BCSAgfSwgIC8qIFNHTUlJMSAqLwotCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDQsCSBOQSwJIDB4MywgICAgTkEJICB9LCAgLyogU0dNSUkyICovCi0JeyBOQSwgICAgMHg3LCAgICBOQSwJIE5BLAkgTkEsCSBOQSwgICAgIE5BCSAgfSwgIC8qIFFTR01JSSAqLwotCXsgTkEsICAgIDB4NiwgICAgTkEsCSBOQSwJIDB4NCwJIE5BLCAgICAgTkEJICB9LCAgLyogVVNCM19IT1NUMCAqLwotCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDUsCSBOQSwJIDB4NCwgICAgTkEJICB9LCAgLyogVVNCM19IT1NUMSAqLwotCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDYsCSAweDUsCSAweDUsICAgIE5BCSAgfSwgIC8qIFVTQjNfREVWSUNFICovCisJeyAweDEsICAgMHgxLCAgICBOQSwJIE5BLAkgTkEsCSBOQSwgICAgIE5BCX0sICAvKiBQRVgwICovCisJeyBOQSwgICAgTkEsICAgICAweDEsCSBOQSwJIDB4MSwJIE5BLCAgICAgMHgxCX0sICAvKiBQRVgxICovCisJeyBOQSwgICAgTkEsICAgICBOQSwJIE5BLAkgMHg3LAkgMHgxLCAgICBOQQl9LCAgLyogUEVYMiAqLworCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDEsCSBOQSwJIE5BLCAgICAgTkEJfSwgIC8qIFBFWDMgKi8KKwl7IDB4MiwgICAweDMsICAgIE5BLAkgTkEsCSBOQSwJIE5BLCAgICAgTkEJfSwgIC8qIFNBVEEwICovCisJeyBOQSwgICAgTkEsICAgICAweDMsCSBOQSwJIE5BLAkgTkEsICAgICBOQQl9LCAgLyogU0FUQTEgKi8KKwl7IE5BLCAgICBOQSwgICAgIE5BLAkgTkEsCSAweDYsCSAweDIsICAgIE5BCX0sICAvKiBTQVRBMiAqLworCXsgTkEsCSBOQSwgICAgIE5BLAkgMHgzLAkgTkEsCSBOQSwgICAgIE5BCX0sICAvKiBTQVRBMyAqLworCXsgMHgzLCAgIDB4NCwgICAgTkEsICAgICBOQSwJIE5BLAkgTkEsICAgICBOQQl9LCAgLyogU0dNSUkwICovCisJeyBOQSwgICAgMHg1LCAgICAweDQsICAgIE5BLAkgMHgzLAkgTkEsICAgICBOQQl9LCAgLyogU0dNSUkxICovCisJeyBOQSwgICAgTkEsICAgICBOQSwJIDB4NCwJIE5BLAkgMHgzLCAgICBOQQl9LCAgLyogU0dNSUkyICovCisJeyBOQSwgICAgMHg3LCAgICBOQSwJIE5BLAkgTkEsCSBOQSwgICAgIE5BCX0sICAvKiBRU0dNSUkgKi8KKwl7IE5BLCAgICAweDYsICAgIE5BLAkgTkEsCSAweDQsCSBOQSwgICAgIE5BCX0sICAvKiBVU0IzX0hPU1QwICovCisJeyBOQSwgICAgTkEsICAgICBOQSwJIDB4NSwJIE5BLAkgMHg0LCAgICBOQQl9LCAgLyogVVNCM19IT1NUMSAqLworCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDYsCSAweDUsCSAweDUsICAgIE5BCX0sICAvKiBVU0IzX0RFVklDRSAqLwogI2lmZGVmIE1WODhGNjlYWAotCXsgTkEsICAgIE5BLCAgICAgMHg1LAkgTkEsCSAweDgsCSBOQSwgICAgIDB4MiAgfSwgIC8qIFNHTUlJMyAqLworCXsgMHg0LAkgMHg4LCAgICBOQSwJIE5BLAkgTkEsCSBOQSwgICAgIE5BICAgfSwgIC8qIFNHTUlJdjMtMCAqLworCXsgTkEsICAgIDB4OSwgICAgMHg1LAkgTkEsCSBOQSwJIE5BLCAgICAgTkEgICB9LCAgLyogU0dNSUl2My0xICovCisJeyBOQSwgICAgTkEsICAgICBOQSwJIDB4NywJIE5BLAkgMHg2LCAgICBOQSAgIH0sICAvKiBTR01JSXYzLTIgKi8KKwl7IE5BLCAgICBOQSwgICAgIE5BLAkgTkEsCSAweDgsCSBOQSwgICAgIDB4MiAgfSwgIC8qIFNHTUlJdjMtMyAqLwogCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDgsCSAweDksCSAweDgsICAgIDB4NCAgfSwgIC8qIFhBVUkgKi8KIAl7IE5BLCAgICBOQSwgICAgIE5BLAkgTkEsCSBOQSwJIDB4OCwgICAgMHg0ICB9LCAgLyogUlhBVUkgKi8KICNlbmRpZgotCXsgMHgwLCAgIDB4MCwgICAgMHgwLAkgMHgwLAkgMHgwLAkgMHgwLCAgICBOQQkgIH0gICAvKiBERUZBVUxUX1NFUkRFUyAqLworCXsgMHgwLCAgIDB4MCwgICAgMHgwLAkgMHgwLAkgMHgwLAkgMHgwLCAgICBOQSAgIH0gICAvKiBERUZBVUxUX1NFUkRFUyAqLwogfTsKIAogLyogU2VsZWN0b3IgbWFwcGluZyBmb3IgUEVYIGJ5IDQgY29uZml1cmF0aW9uICovCiBNVl9VOCBjb21tb25QaHlzU2VsZWN0b3JzUGV4Qnk0TGFuZXNbXSA9IHsgMHgxLCAweDIsIDB4MiwgMHgyIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzZXJkZXNUeXBlVG9TdHJpbmdbXSA9IHsKLQkiUENJZTAiLAotCSJQQ0llMSIsCi0JIlBDSWUyIiwKLQkiUENJZTMiLAotCSJTQVRBMCIsCi0JIlNBVEExIiwKLQkiU0FUQTIiLAotCSJTQVRBMyIsCi0JIlNHTUlJMCIsCi0JIlNHTUlJMSIsCi0JIlNHTUlJMiIsCi0JIlFTR01JSSIsCi0JIlVTQjMgSE9TVDAiLAotCSJVU0IzIEhPU1QxIiwKKwkiUENJZTAgICAgICAiLAorCSJQQ0llMSAgICAgICIsCisJIlBDSWUyICAgICAgIiwKKwkiUENJZTMgICAgICAiLAorCSJTQVRBMCAgICAgICIsCisJIlNBVEExICAgICAgIiwKKwkiU0FUQTIgICAgICAiLAorCSJTQVRBMyAgICAgICIsCisJIlNHTUlJMCAgICAgIiwKKwkiU0dNSUkxICAgICAiLAorCSJTR01JSTIgICAgICIsCisJIlFTR01JSSAgICAgIiwKKwkiVVNCMyBIT1NUMCAiLAorCSJVU0IzIEhPU1QxICIsCiAJIlVTQjMgREVWSUNFIiwKLSAgICAiU0dNSUkzIiwKLSAgICAiWEFVSSIsCi0gICAgIlJYQVVJIiwKKwkiU0dNSUl2My0wICAiLAorCSJTR01JSXYzLTEgICIsCisJIlNHTUlJdjMtMiAgIiwKKwkiU0dNSUl2My0zICAiLAorCSJYQVVJICAgICAgICIsCisJIlJYQVVJICAgICAgIiwKIAkiREVGQVVMVCBTRVJERVMiLAogCSJMQVNUX1NFUkRFU19UWVBFIgogfTsKIAotCiB0eXBlZGVmIHN0cnVjdCBzZXJkZXNVbml0RGF0YSB7CiAJTVZfVTggc2VyZGVzVW5pdElkOwogCU1WX1U4IHNlcmRlc1VuaXROdW07CkBAIC0yMDAsMTYgKzIwNywxOSBAQAogCXsJU0FUQV9VTklUX0lELAkxLAl9LAogCXsJU0FUQV9VTklUX0lELAkyLAl9LAogCXsJU0FUQV9VTklUX0lELAkzLAl9LAotCXsJRVRIX0dJR19VTklUX0lELDAsCX0sCi0JewlFVEhfR0lHX1VOSVRfSUQsMSwJfSwKLQl7CUVUSF9HSUdfVU5JVF9JRCwyLAl9LAorCXsJU0dNSUlfVU5JVF9JRCwwLAl9LAorCXsJU0dNSUlfVU5JVF9JRCwxLAl9LAorCXsJU0dNSUlfVU5JVF9JRCwyLAl9LAogCXsJUVNHTUlJX1VOSVRfSUQsCTAsCX0sCiAJewlVU0IzSF9VTklUX0lELAkwLAl9LAogCXsJVVNCM0hfVU5JVF9JRCwJMSwJfSwKIAl7CVVTQjNEX1VOSVRfSUQsCTAsCX0sCi0gICAgewlFVEhfR0lHX1VOSVRfSUQsMywJfSwKLSAgICB7CVhBVUlfVU5JVF9JRCwJMCwJfSwKLSAgICB7CVJYQVVJX1VOSVRfSUQsCTAsCX0sCisJewlTR01JSV9VTklUX0lELDAsCX0sCisJewlTR01JSV9VTklUX0lELDEsCX0sCisJewlTR01JSV9VTklUX0lELDIsCX0sCisJewlTR01JSV9VTklUX0lELDMsCX0sCisJewlYQVVJX1VOSVRfSUQsCTAsCX0sCisJewlSWEFVSV9VTklUX0lELAkwLAl9LAogfTsKIAogCkBAIC0yNDgsNyArMjU4LDcgQEAKIAl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgICAweDI4LCAgICAgICAgICAgMHg5MDAwNiwJeyAweDgwMDAyLAkJMHg4MDAwMiB9LCAJCTAsICAgICAgICAgIDAgICAgICAgfSwgIC8qIFBvd2VyIFVwICovCiAJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgICAgMHgyOCwJCSAgICAweDc4MDAsCQl7IDB4NjAwMCwJCTB4NjAwMCAgfSwgCQkwLAkJICAgIDAgICAgICAgfSwgIC8qIFVucmVzZXQgKi8KIAl7IFBPV0VSX0FORF9QTExfQ1RSTF9SRUcsCSAJICAgIDB4ODAwLAkJICAgIDB4MEUwLAkJeyAweDAsCQkJMHg4MCAgICB9LCAJCTAsCQkgICAgMCAgICAgICB9LCAgLyogUGh5IFNlbGVjdG9yICovCi0gICAgeyBNSVNDX1JFRywJCQkgCQkgICAgICAgIDB4ODAwLAkJICAgIDB4NDQwLAkJeyAweDQ0MCwJICAgIDB4NDAwCX0sICAgICAgMCwJICAgICAgICAwCSAgICB9ICAgLyogUmVmIGNsb2NrIHNvdXJjZSBzZWxlY3QgKi8gCisgICAgeyBNSVNDX1JFRywJCQkgCQkgICAgICAgIDB4ODAwLAkJICAgIDB4NDQwLAkJeyAweDQ0MCwJICAgIDB4NDAwCX0sICAgICAgMCwJICAgICAgICAwCSAgICB9ICAgLyogUmVmIGNsb2NrIHNvdXJjZSBzZWxlY3QgKi8KIH07CiAKIC8qIFNBVEEgYW5kIFNHTUlJIC0gc3BlZWQgY29uZmlnIHNlcSAqLwpAQCAtMzM4LDcgKzM0OCw3IEBACiAgICAgeyBHMl9TRVRUSU5HU18xX1JFRywJCQkweDgwMCwJICAweDNGRiwJeyAweDNEMgkJfSwJMCwJICAgIDAJfSwgIC8qIEcyX1JYIFNFTE1VRkYsIFNFTE1VRkksIFNFTE1VUEYgYW5kIFNFTE1VUEkgKi8KICAgICB7IEczX1NFVFRJTkdTXzBfUkVHLAkJCTB4ODAwLAkgIDB4RkZGRiwJeyAweEU2RQkJfSwJMCwJICAgIDAJfSwgIC8qIEczX1RYIFNMRVcsIEVNUEgxIGFuZCBBTVAgKi8KICAgICB7IEczX1NFVFRJTkdTXzFfUkVHLAkJCTB4ODAwLAkgIDB4NDdGRiwJeyAweDdEMgkJfSwJMCwJICAgIDAJfSwgIC8qIEczX1JYIFNFTE1VRkYsIFNFTE1VRkksIFNFTE1VUEYgYW5kIFNFTE1VUEkgJiBERkVfRW4gR2VuMywgREMgd2FuZGVyIGNhbGlicmF0aW9uIGRpcyAqLwotICAgIHsgUENJRV9SRUcwLCAgICAgICAgCQkJMHg4MDAsICAgIDB4MTAwMCwJeyAweDAJCX0sCTAsCSAgICAwICAgfSwgIC8qIEJpdFsxMl09MHgwIJYgaWRsZV9zeW5jX2VuICovCisgICAgeyBQQ0lFX1JFRzAsICAgICAgICAJCQkweDgwMCwgICAgMHgxMDAwLAl7IDB4MAkJfSwJMCwJICAgIDAgICB9LCAgLyogQml0WzEyXT0weDAgIGlkbGVfc3luY19lbiAqLwogICAgIHsgUlhfUkVHMiwgICAgICAgICAgCQkJMHg4MDAsICAgIDB4RjAsCQl7IDB4NzAsCQl9LAkwLAkgICAgMCAgIH0sICAvKiBEdGwgQ2xhbXBpbmcgZGlzYWJsZSBhbmQgRHRsIGNsYW1waW5nIFNlbCg2MDAwcHBtKSAqLwogICAgIHsgVlRISU1QQ0FMX0NUUkxfUkVHLAkJCTB4ODAwLAkgIDB4RkYwMCwJeyAweDMwMDAJfSwJMCwJICAgIDAJfSwgLyogdHhpbXBjYWxfdGggYW5kIHJ4aW1wY2FsX3RoICovCiAgICAgeyBERkVfUkVHMCwgICAgICAgICAJCQkweDgwMCwgICAgMHhBMDBGLAl7IDB4ODAwQQl9LAkwLAkgICAgMCAgIH0sIC8qIERGRV9TVEVQX0ZJTkVfRlhbMzowXSA9MHhBICovCkBAIC0zODEsMjAgKzM5MSwyMCBAQAogCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9ONF9SRUcsICAgIDB4MjgsCQkJMHgzLAkJCXsgMHgxLAkJICAgIDB4MSAgICAgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAogCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAgIDB4MjgsCQkJMHg3ODAwLAkJCXsgMHg2MDAwLAkgICAgMHhFMDAwICAgICAgfSwJCTAsICAgICAgICAgIDAJICAgIH0sCiAJeyBHTE9CQUxfQ0xLX0NUUkwsCQkJCSAgICAweDgwMCwJCQkweEQsCQkJeyAweDUsCQkgICAgMHgxICAgICAgICAgfSwJCTAsICAgICAgICAgIDAJICAgIH0sCi0JeyBNSVNDX1JFRywJICAgCQkJCQkgICAgMHg4MDAsICAgICAgICAgIDB4NEMwLAkgICAgIAl7IDB4ODAsICAgICAgICAgMHg0QzAgCSAgICB9LCAJICAgIDAsCSAgICAgICAgMCAgICAgICB9ICAvKiBSZWYgY2xvY2sgc291cmNlIHNlbGVjdCAqLyAKKwl7IE1JU0NfUkVHLAkgICAJCQkJCSAgICAweDgwMCwgICAgICAgICAgMHg0QzAsCSAgICAgCXsgMHg4MCwgICAgICAgICAweDRDMCAJICAgIH0sIAkgICAgMCwJICAgICAgICAwICAgICAgIH0gIC8qIFJlZiBjbG9jayBzb3VyY2Ugc2VsZWN0ICovCiB9OwogCiAvKiBQRVggYW5kIFVTQjMgLSBwb3dlciB1cCBzZXEgZm9yIFNlcmRlcyBSZXYgMi4xICovCiBNVl9PUF9QQVJBTVMgcGV4QW5kVXNiM1Bvd2VyVXBTZXJkZXNSZXYyUGFyYW1zW10gPQogewogCS8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICAgICAgICAgIHVuaXRPZmZzZXQgICAgICBtYXNrICAgICAgICAgICAgUEVYIGRhdGEgICAgICAgIFVTQjMgZGF0YSAgICAgICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCi0JeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgICAgMHgyOCwJCSAgICAweDNGQzdGODA2LCAgICAgeyAweDQ0NzE4MDQsICAgIDB4NDQ3OTgwNCAgIH0sICAgICAgMCwgICAgICAgICAgMAkgICAgfSwKLQl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjJfUkVHLCAgICAweDI4LAkJCTB4NUMsCQkgICAgeyAweDU4LAkJICAgIDB4NTggICAgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAotCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9ONF9SRUcsICAgIDB4MjgsCQkJMHgzLAkJCXsgMHgxLAkJICAgIDB4MSAgICAgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAotCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAgIDB4MjgsCQkJMHg3ODAwLAkJCXsgMHg2MDAwLAkgICAgMHhFMDAwICAgICAgfSwJCTAsICAgICAgICAgIDAJICAgIH0sCi0JeyBHTE9CQUxfQ0xLX0NUUkwsCQkJCSAgICAweDgwMCwJCQkweEQsCQkJeyAweDUsCQkgICAgMHgxICAgICAgICAgfSwJCTAsICAgICAgICAgIDAJICAgIH0sCi0JeyBHTE9CQUxfTUlTQ19DVFJMLAkJCQkgICAgMHg4MDAsCQkJMHhDMCwJCQl7IDB4MCwJCSAgICBOT19EQVRBICAgICB9LAkJMCwgICAgICAgICAgMAkgICAgfSwKLQl7IE1JU0NfUkVHLAkgICAJCQkJCSAgICAweDgwMCwJICAgIAkweDRDMCwJICAgICAJeyAweDgwLCAgICAgICAgIDB4NEMwIAkgICAgfSwgCSAgICAwLAkgICAgICAgIDAJCX0gIC8qIFJlZiBjbG9jayBzb3VyY2Ugc2VsZWN0ICovIAorCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAgIDB4MjgsCTB4M0ZDN0Y4MDYsICAgICB7IDB4NDQ3MTgwNCwgICAgMHg0NDc5ODA0ICAgfSwJCTAsICAgICAgICAgIDAJICAgIH0sCisJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04yX1JFRywgICAgMHgyOCwJMHg1QywJCXsgMHg1OCwJCSAgICAweDU4ICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAorCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9ONF9SRUcsICAgIDB4MjgsCTB4MywJCXsgMHgxLAkJICAgIDB4MSAgICAgfSwJCTAsICAgICAgICAgIDAJICAgIH0sCisJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgICAgMHgyOCwJMHg3ODAwLAkJeyAweDYwMDAsCSAgICAweEUwMDAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAorCXsgR0xPQkFMX0NMS19DVFJMLAkJICAgIDB4ODAwLAkweDNELAkJeyAweDM1LAkJICAgIDB4MjEgICAgfSwJCTAsICAgICAgICAgIDAJICAgIH0sCisJeyBHTE9CQUxfTUlTQ19DVFJMLAkJICAgIDB4ODAwLAkweEMwLAkJeyAweDAsCQkgICAgTk9fREFUQSB9LAkJMCwgICAgICAgICAgMAkgICAgfSwKKwl7IE1JU0NfUkVHLAkgICAJCSAgICAweDgwMCwgICAJMHg0QzAsCQl7IDB4ODAsCQkgICAgMHg0QzAgICB9LAkJMCwJICAgIDAJICAgIH0gIC8qIFJlZiBjbG9jayBzb3VyY2Ugc2VsZWN0ICovCiB9OwogCiAvKiBQRVggYW5kIFVTQjMgLSBzcGVlZCBjb25maWcgc2VxICovCkBAIC00MTksMTQgKzQyOSwyNCBAQAogCiBNVl9PUF9QQVJBTVMgdXNiM0VsZWN0cmljYWxDb25maWdTZXJkZXNSZXYyUGFyYW1zW10gPQogewotCXsgTEFORV9DRkc0X1JFRywJCQkweDgwMCwJCTB4ODAsCQl7IDB4ODAgICAgICB9LAkJMCwJCQkwCSAJfSwgLyogU3ByZWFkIFNwZWN0cnVtIENsb2NrIEVuYWJsZSAqLwotCXsgRzJfU0VUVElOR1NfMl9SRUcsCQkweDgwMCwJCTB4RkU0MCwJCXsgMHg0NDQwICAgIH0sCQkwLCAgICAgICAgICAwCSAJfSwgLyogRzJfVFhfU1NDX0FNUFs2OjBdPTQuNWtQUE0gYW5kIFRYIGVtcGhhc2lzIG1vZGU9bVYgKi8KLQl7IEcyX1NFVFRJTkdTXzFfUkVHLAkJMHg4MDAsCQkweDNGRiwJCXsgMHgzRDIgICAgIH0sCQkwLCAgICAgICAgICAwCSAJfSwgLyogRzJfUlggU0VMTVVGRiwgU0VMTVVGSSwgU0VMTVVQRiBhbmQgU0VMTVVQSSAqLwotCXsgUlhfUkVHMiwJCQkJIAkweDgwMCwJCTB4RjAsCQl7IDB4NzAgICAgICB9LAkJMCwgICAgICAgICAgMAkgCX0sIC8qIER0bCBDbGFtcGluZyBkaXNhYmxlIGFuZCBEdGwtY2xhbXBpbmctU2VsKDYwMDBwcG0pICovCi0JeyBSRUZfUkVHMCwJCSAJCQkweDgwMCwJCTB4MzgsCQl7IDB4MjAgICAgICB9LAkJMCwgICAgICAgICAgMAkgCX0sIC8qIHZjb19jYWxfdnRoX3NlbCAqLwotICAgIHsgTEFORV9DRkc1X1JFRywJCQkweDgwMCwJCTB4NCwJCXsgMHg0ICAgICAgIH0sCQkwLAkJCTAJIAl9LCAvKiBTcHJlYWQgU3BlY3RydW0gQ2xvY2sgRW5hYmxlICovCi19OworCXsgTEFORV9DRkc0X1JFRywJCTB4ODAwLAkJMHhDMiwJCXsgMHhDMAkJfSwJMCwJMCAJfSwgLyogQml0WzddPTB4MSAtIFNwcmVhZCBTcGVjdHJ1bSBDbG9jayBFbmFibGUsQml0WzZdLTB4MS0gQ0ZHX0RGRV9PVkVSUklERSxCaXRbMV0tMHgwLVBJTl9ERkVfUEFUX0RJUywgKi8KKwl7IExBTkVfQ0ZHNV9SRUcsCQkweDgwMCwJCTB4MywJCXsgMHgzCQl9LAkJMCwJMCAJfSwgLyogQml0WzFdPTB4MSAtIENGR19TUV9ERVRfU0VMLEJpdFswXT0weDEtQ0ZHX1JYX0lOSVRfU0VMLCAqLworCXsgRzJfU0VUVElOR1NfMl9SRUcsCQkweDgwMCwJCTB4RkU0MCwJCXsgMHg0NDQwCX0sCQkwLCAgICAgIDAgCX0sIC8qIEJpdHNbMTU6OV09IDB4MjIgLUcyX1RYX1NTQ19BTVBbNjowXT00LjVrUFBNLEJpdHNbNl0gPSAweDEgLSBUWCBlbXBoYXNpcyBtb2RlPW1WICovCisJeyBHMl9TRVRUSU5HU18zX1JFRywJCTB4ODAwLAkJMHhGRiwJCXsgMHhFRgkJfSwJCTAsICAgICAgMCAJfSwgLyogQml0WzddID0weDEgIEZGRSBTZXR0aW5nIEZvcmNlO0JpdHNbNjo0XT0weDYgIEZGRV9SRVM7Qml0c1szOjBdID0gMHhGICBGRkVfQ0FQOyAqLworCXsgRzJfU0VUVElOR1NfNF9SRUcsCQkweDgwMCwJCTB4MzAwLAkJeyAweDMwMAkJfSwJCTAsICAgICAgMCAJfSwgLyogQml0c1s5OjhdPTB4MCAtICBHMl9ERkVfUkVTWzE6MF0qLworCXsgUExMSU5UUF9SRUcxLAkgICAgICAgIAkweDgwMCwJCTB4MzAwLAkJeyAweDMwMAkJfSwJCTAsICAgICAgMCAJfSwgLyogQml0c1s5OjhdPTB4MyAgSFBGX0J3WzE6MF0gKi8KKwl7IFZUSElNUENBTF9DVFJMX1JFRywJCTB4ODAwLAkJMHhGRjAwLAkJeyAweDMwMDAJfSwJCTAsCTAgCX0sIC8qIEJpdHNbMTU6MTJdPSAweDMgLSB0eGltcGNhbF90aDtCaXRzWzExOjhdID0gMHgwIC0gUlhJTVBDQUxfVEggKi8KKwl7IExBTkVfQ0ZHNV9SRUcsCQkweDgwMCwJCTB4MywJCXsgMHgzCQl9LAkJMCwJMCAJfSwgLyogQml0WzFdPTB4MSAtIENGR19TUV9ERVRfU0VMLEJpdFswXT0weDEtQ0ZHX1JYX0lOSVRfU0VMLCAqLworCXsgTUlTQ19SRUcsCSAgICAgICAgICAgIAkweDgwMCwJCTB4NDJGLAkJeyAweDQyQQkJfSwJCTAsICAgICAgMCAJfSwgLyogQml0WzEwXT0weDEgLSBSRUZDTEtfU0VMKD0yNU1oeik7Qml0WzVdPTB4MSAgSUNQX0ZPUkNFX0VuO0JpdHNbMzowXT0weEEgIElDUD0weEEoMjEwdUEpOyAqLworCXsgUE9XRVJfQU5EX1BMTF9DVFJMX1JFRywJMHg4MDAsCQkweDFGLAkJeyAweDAyCQl9LAkJMCwgICAgICAwIAl9LCAvKiBCaXRzWzQ6MF0gPTB4MiAtIFJFRl9GUkVGX1NFTCg9MjVNaHopICovCisJeyBHMl9TRVRUSU5HU18xX1JFRywJCTB4ODAwLAkJMHgzRkYsCQl7IDB4M0QyCQl9LAkJMCwgICAgICAwIAl9LCAvKiBCaXRzWzk6OF09MHgzLSBHMl9SWF9TRUxNVUZGO0JpdHNbNzo2XT0weDMtIEcyX1JYX1NFTE1VRkk7Qml0c1s1OjNdPTB4MiAgRzJfUlhfU0VMTVVQRjtCaXRzWzI6MF09MHgyIC0gIEcyX1JYX1NFTE1VUEkqLworCXsgUlhfUkVHMiwJCQkweDgwMCwJCTB4RjAsCQl7IDB4NzAJCX0sCQkwLCAgICAgIDAgCX0sIC8qIER0bCBDbGFtcGluZyBkaXNhYmxlIGFuZCBEdGwtY2xhbXBpbmctU2VsKDYwMDBwcG0pICovCisJeyBQQ0lFX1JFRzEsCQkJMHg4MDAsCQkweEY4MCwJCXsgMHhEMDAJCX0sCQkwLCAgICAgIDAgCX0sIC8qIEJpdHNbMTE6N109MHgxYSAtICB0eF9hbXBfcGlwZV92MFs0OjBdICovCisJeyBSRUZfUkVHMCwJCSAJMHg4MDAsCQkweDM4LAkJeyAweDIwCQl9LAkJMCwgICAgICAwIAl9LCAvKiB2Y29fY2FsX3Z0aF9zZWwgKi8KKwl7IExBTkVfQ0ZHMF9SRUcsCQkweDgwMCwJCTB4MSwJCXsgMHgxCQl9LAkJMCwJMCAJfSwgLyogQml0WzBdPTB4MS0gUFJEX1RYREVFTVBIMCAqLworCXsgR0xPQkFMX1RFU1RfQ1RSTCwJCTB4ODAwLAkJMHg0LAkJeyAweDQJCX0sCQkwLCAgICAgIDAgCX0sIC8qIEJpdFs0XT0weDEtTU9ERV9NQVJHSU5fT1ZFUlJJREUgKi8KIAorfTsKIC8qIFBFWCBhbmQgVVNCMyAtIFRYIGNvbmZpZyBzZXEgKi8KIAogLyogRm9yIFBFWHgxOiB0aGUgcGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMS8yLzMgY29uZmlndXJhdGlvbnMgc2hvdWxkIHJ1bgpAQCAtNDM4LDkgKzQ1OCw2IEBACiAgICAgLyogdW5pdEJhc2VSZWcgICAgdW5pdE9mZnNldCAgICBtYXNrICAgICAgICBQRVggZGF0YSAgICBVU0IzIGRhdGEgICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCiAgICAgeyBHTE9CQUxfQ0xLX0NUUkwsICAweDgwMCwgICAgICAweDEsICAgICAgICB7IDB4MCwgICAgICAweDAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LAogICAgIHsgMHgwLCAgICAgICAgICAgICAgMHgwLCAgICAgICAgMHgwLCAgICAgICAgeyAweDAsICAgICAgMHgwICAgICB9LCAgICAgIDEwLCAgICAgICAgIDAgICAgICAgfSwgLyogMTBtcyBkZWxheSAqLwotICAgIHsgUlhfUkVHMywgICAgICAgICAgMHg4MDAsICAgICAgMHhGRiwgICAgICAgeyAweERDLCAgICAgTk9fREFUQSB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogb3NfcGhfb2Zmc2V0X2ZvcmNlIChhbGlnbiA5MCkgKi8KLSAgICB7IFJYX1JFRzMsICAgICAgICAgIDB4ODAwLCAgICAgIDB4MTAwLCAgICAgIHsgMHgxMDAsICAgIE5PX0RBVEEgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIFNldCBvc19waF92YWxpZCAqLwotICAgIHsgUlhfUkVHMywgICAgICAgICAgMHg4MDAsICAgICAgMHgxMDAsICAgICAgeyAweDAsICAgICAgTk9fREFUQSB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogVW5zZXQgb3NfcGhfdmFsaWQgKi8KIH07CiAKIE1WX09QX1BBUkFNUyBwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMyW10gPQpAQCAtNDUyLDE4ICs0NjksMjEgQEAKIE1WX09QX1BBUkFNUyBwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMzW10gPQogewogCS8qIHVuaXRCYXNlUmVnICAgIHVuaXRPZmZzZXQgICAJbWFzayAgICAgICAgUEVYIGRhdGEgICAgVVNCMyBkYXRhICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwotCXsgUkVTRVRfREZFX1JFRywgICAJMHg4MDAsCQkweDQwMSwgICAgICB7IDB4MCwgICAgICAweDAgICAgIH0sIAkgICAgMCwgICAgICAgICAgMAkJfSwgLyogU2Z0IFJlc2V0IHB1bHNlICovCi0JeyAweDAsCQkgICAJCTB4MCwJCTB4MCwJICAgIHsgMHgwLCAgICAgIDB4MCAgICAgfSwgCSAgICAxMCwJICAgICAgICAwCQl9ICAvKiAxMG1zIGRlbGF5ICovCisJeyBSRVNFVF9ERkVfUkVHLCAgICAweDgwMCwJMHg0MDEsICAgICAgeyAweDAsICAgICAgMHgwICAgICB9LAkwLCAgICAgICAgICAwCQl9LCAvKiBTZnQgUmVzZXQgcHVsc2UgKi8KKwl7IDB4MCwJCSAgICAweDAsCTB4MCwJICAgIHsgMHgwLCAgICAgIDB4MCAgICAgfSwgCTEwLAkgICAgMAkJfSwgLyogMTBtcyBkZWxheSAqLworCXsgUlhfUkVHMywgICAgICAgICAgMHg4MDAsICAgICAgMHhGRiwgICAgICAgeyAweERDLCAgICAgMHhEOCAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgICAgIH0sIC8qIG9zX3BoX29mZnNldF9mb3JjZSAoYWxpZ24gOTApICovCisJeyBSWF9SRUczLCAgICAgICAgICAweDgwMCwgICAgICAweDEwMCwgICAgICB7IDB4MTAwLCAgICAweDEwMCAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICAgICAgfSwgLyogU2V0IG9zX3BoX3ZhbGlkICovCisJeyBSWF9SRUczLCAgICAgICAgICAweDgwMCwgICAgICAweDEwMCwgICAgICB7IDB4MCwgICAgICAweDAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICAgICAgfSwgLyogVW5zZXQgb3NfcGhfdmFsaWQgKi8KIH07CiAKIC8qIFBFWCBieSA0IGNvbmZpZyBzZXEgKi8KIE1WX09QX1BBUkFNUyBwZXhCeTRDb25maWdQYXJhbXNbXSA9CiB7CiAJLyogdW5pdHVuaXRCYXNlUmVnICAgICAgdW5pdE9mZnNldCAgIG1hc2sgICAgICAgICAgIGRhdGEgICAgICAgICAgICAgICAgCQkJd2FpdFRpbWUgICBudW1PZkxvb3BzICovCi0JeyBHTE9CQUxfQ0xLX1NSQ19ISSwJMHg4MDAsICAgICAgIDB4NywgICAgICB7IDB4NSwgMHgwLCAweDAsIDB4MiAJCQl9LCAgICAgCTAsICAgICAgICAgIDAgICAgICAgfSwKLSAgICB7IExBTkVfQUxJR05fUkVHMCwgICAgICAweDgwMCwgICAgICAgMHgxMDAwLCAgIHsgMHgwLCAweDAsIDB4MCwgMHgwIAkJCX0sICAgICAJMCwJICAgICAgICAwICAgICAgIH0sIC8qIExhbmUgQWxpZ25lbWVudCBlbmFibGUgKi8KLQl7IENBTElCUkFUSU9OX0NUUkxfUkVHLAkweDgwMCwgICAgICAgMHgxMDAwLCAgIHsgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwIH0sCQkwLAkgICAgICAgIDAgICAgICAgfSwgLyogTWF4IFBMTCBwaHkgY29uZmlnICovCi0JeyBMQU5FX0NGRzFfUkVHLAkJMHg4MDAsICAgICAgIDB4NjAwLCAgICB7IDB4NjAwLCAweDYwMCwgMHg2MDAsIDB4NjAwIAl9LAkJMCwJICAgICAgICAwICAgICAgIH0sIC8qIE1heCBQTEwgcGlwZSBjb25maWcgKi8KKwl7IEdMT0JBTF9DTEtfU1JDX0hJLAkweDgwMCwgICAgICAgMHg3LCAgICAgIHsgMHg1LCAweDAsIDB4MCwgMHgyIAkJCX0sICAgICAJMCwJCTAgICAgICAgfSwKKwl7IExBTkVfQUxJR05fUkVHMCwgICAgICAweDgwMCwgICAgICAgMHgxMDAwLCAgIHsgMHgwLCAweDAsIDB4MCwgMHgwIAkJCX0sICAgICAJMCwJCTAgICAgICAgfSwgLyogTGFuZSBBbGlnbmVtZW50IGVuYWJsZSAqLworCXsgQ0FMSUJSQVRJT05fQ1RSTF9SRUcsCTB4ODAwLCAgICAgICAweDEwMDAsICAgeyAweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDAJCX0sCTAsCSAgICAgICAgMCAgICAgICB9LCAvKiBNYXggUExMIHBoeSBjb25maWcgKi8KKwl7IExBTkVfQ0ZHMV9SRUcsCTB4ODAwLCAgICAgICAweDYwMCwgICAgeyAweDYwMCwgMHg2MDAsIDB4NjAwLCAweDYwMCAJCX0sCTAsCSAgICAgICAgMCAgICAgICB9LCAvKiBNYXggUExMIHBpcGUgY29uZmlnICovCiB9OwogCiAvKiBVU0IzIGRldmljZSBkb25maWcgc2VxICovCkBAIC01NDgsOSArNTY4LDIxIEBACiAJeyAweEMwMDBDICwgICAgICAgIDB4MCAvKk5BKi8sCTB4MTAwMDAwMCwgIHsweDEwMDAwMDB9LCAgMCwgICAgICAgIDB9LCAvKiBQaHkwIHJlZ2lzdGVyIDMgIC0gVFggQ2hhbm5lbCBjb250cm9sIDAgKi8KIAl7IDB4QzIwMEMgLCAgICAgICAgMHgwIC8qTkEqLywJMHgxMDAwMDAwLCAgezB4MTAwMDAwMH0sICAwLCAgICAgICAgMH0sIC8qIFBoeTAgcmVnaXN0ZXIgMyAgLSBUWCBDaGFubmVsIGNvbnRyb2wgMCAqLwogCXsgMHhDNDAwQyAsICAgICAgICAweDAgLypOQSovLAkweDEwMDAwMDAsICB7MHgxMDAwMDAwfSwgIDAsICAgICAgICAwfSwgLyogUGh5MCByZWdpc3RlciAzICAtIFRYIENoYW5uZWwgY29udHJvbCAwICovCi0JeyAweEMwMDA4ICwgICAgICAgIDB4MCAvKk5BKi8sCTB4ODA4MDAwMDAsIHsweDgwODAwMDAwfSwgMSwgICAgIDEwMDB9LCAvKiBjaGVjayBQTExDQUxfRE9ORSBpcyBzZXQgYW5kIElNUENBTF9ET05FIGlzIHNldCovCi0JeyAweEMwMDE4ICwgICAgICAgIDB4MCAvKk5BKi8sCTB4ODAwMDAwMDAsIHsweDgwMDAwMDAwfSwgMSwgICAgIDEwMDB9LCAvKiBjaGVjayBSRUdfU1FDQUxfRE9ORSAgaXMgc2V0Ki8KLQl7IDB4QzAwMDAgLCAgICAgICAgMHgwIC8qTkEqLywJMHg4MDAwMDAwMCwgezB4ODAwMDAwMDB9LCAxLCAgICAgMTAwMH0gIC8qIGNoZWNrIFBMTF9SRUFEWSAgaXMgc2V0Ki8KKwl7IDB4QzAwMEMgLCAgICAgICAgMHgwIC8qTkEqLywJMHhmMDAwLCAgICAgezB4MTAwMH0sICAgICAwLCAgICAgICAgMH0sIC8qIERlY3JlYXNlIHRoZSBhbXBsaXR1ZGUgb2YgdGhlIGxvdyBzcGVlZCBleWUgdG8gbWVldCB0aGUgc3BlYyAqLworCXsgMHhDMjAwQyAsICAgICAgICAweDAgLypOQSovLAkweGYwMDAsICAgICB7MHgxMDAwfSwgICAgIDAsICAgICAgICAwfSwgLyogRGVjcmVhc2UgdGhlIGFtcGxpdHVkZSBvZiB0aGUgbG93IHNwZWVkIGV5ZSB0byBtZWV0IHRoZSBzcGVjICovCisJeyAweEM0MDBDICwgICAgICAgIDB4MCAvKk5BKi8sCTB4ZjAwMCwgICAgIHsweDEwMDB9LCAgICAgMCwgICAgICAgIDB9LCAvKiBEZWNyZWFzZSB0aGUgYW1wbGl0dWRlIG9mIHRoZSBsb3cgc3BlZWQgZXllIHRvIG1lZXQgdGhlIHNwZWMgKi8KKwl7IDB4QzAwMDggLCAgICAgICAgMHgwIC8qTkEqLywJMHg3MDAsICAgICAgezB4NjAwfSwgICAgICAwLCAgICAgICAgMH0sIC8qIENoYW5nZSB0aGUgSGlnaCBzcGVlZCBpbXBlZGFuY2UgdGhyZXNob2xkICovCisJeyAweEMyMDA4ICwgICAgICAgIDB4MCAvKk5BKi8sCTB4NzAwLCAgICAgIHsweDYwMH0sICAgICAgMCwgICAgICAgIDB9LCAvKiBDaGFuZ2UgdGhlIEhpZ2ggc3BlZWQgaW1wZWRhbmNlIHRocmVzaG9sZCAqLworCXsgMHhDNDAwOCAsICAgICAgICAweDAgLypOQSovLAkweDcwMCwgICAgICB7MHg2MDB9LCAgICAgIDAsICAgICAgICAwfSwgLyogQ2hhbmdlIHRoZSBIaWdoIHNwZWVkIGltcGVkYW5jZSB0aHJlc2hvbGQgKi8KKwl7IDB4QzAwMTQgLCAgICAgICAgMHgwIC8qTkEqLywJMHhmLCAgICAgICAgezB4OH0sICAgICAgICAwLCAgICAgICAgMH0sIC8qIENoYW5nZSB0aGUgc3F1ZWxjaCBsZXZlbCBvZiB0aGUgcmVjZWl2ZXIgdG8gbWVldCB0aGUgcmVjZWl2ZXIgZWxlY3RyaWNhbCBtZWFzdXJlbWVudHMoc3F1ZWxjaCBhbmQgcmVjZWl2ZXIgc2Vuc2l0aXZpdHkgdGVzdHMpICovCisJeyAweEMyMDE0ICwgICAgICAgIDB4MCAvKk5BKi8sCTB4ZiwgICAgICAgIHsweDh9LCAgICAgICAgMCwgICAgICAgIDB9LCAvKiBDaGFuZ2UgdGhlIHNxdWVsY2ggbGV2ZWwgb2YgdGhlIHJlY2VpdmVyIHRvIG1lZXQgdGhlIHJlY2VpdmVyIGVsZWN0cmljYWwgbWVhc3VyZW1lbnRzKHNxdWVsY2ggYW5kIHJlY2VpdmVyIHNlbnNpdGl2aXR5IHRlc3RzKSAqLworCXsgMHhDNDAxNCAsICAgICAgICAweDAgLypOQSovLAkweGYsICAgICAgICB7MHg4fSwgICAgICAgIDAsICAgICAgICAwfSwgLyogQ2hhbmdlIHRoZSBzcXVlbGNoIGxldmVsIG9mIHRoZSByZWNlaXZlciB0byBtZWV0IHRoZSByZWNlaXZlciBlbGVjdHJpY2FsIG1lYXN1cmVtZW50cyhzcXVlbGNoIGFuZCByZWNlaXZlciBzZW5zaXRpdml0eSB0ZXN0cykgKi8KKwl7IDB4QzAwMDggLCAgICAgICAgMHgwIC8qTkEqLywJMHg4MDgwMDAwMCwgezB4ODA4MDAwMDB9LCAxLCAgICAgMTAwMH0sIC8qIENoZWNrIFBMTENBTF9ET05FIGlzIHNldCBhbmQgSU1QQ0FMX0RPTkUgaXMgc2V0Ki8KKwl7IDB4QzAwMTggLCAgICAgICAgMHgwIC8qTkEqLywJMHg4MDAwMDAwMCwgezB4ODAwMDAwMDB9LCAxLCAgICAgMTAwMH0sIC8qIENoZWNrIFJFR19TUUNBTF9ET05FICBpcyBzZXQqLworCXsgMHhDMDAwMCAsICAgICAgICAweDAgLypOQSovLAkweDgwMDAwMDAwLCB7MHg4MDAwMDAwMH0sIDEsICAgICAxMDAwfSwgLyogQ2hlY2sgUExMX1JFQURZICBpcyBzZXQqLworCXsgMHhDMDAwOCAsICAgICAgICAweDAgLypOQSovLAkweDIwMDAsICAgICB7MHgyMDAwfSwgICAgIDAsICAgICAgICAwfSwgLyogU3RhcnQgY2FsaWJyYXRlIG9mIGhpZ2ggc2VlZCBpbXBlZGFuY2UgKi8KKwl7IDB4MCAsICAgICAgICAgICAgMHgwIC8qTkEqLywJMHgwLCAgICAgICAgezB4MH0sICAgICAgICAxMCwgICAgICAgMH0sCisJeyAweEMwMDA4ICwgICAgICAgIDB4MCAvKk5BKi8sCTB4MjAwMCwgICAgIHsweDB9LCAgICAgICAgMCwgICAgICAgIDB9LCAvKiBEZS1hc3NlcnQgIHRoZSBjYWxpYnJhdGlvbiBzaWduYWwgKi8KIH07CiAKIC8qKioqKioqKioqKioqKioqKi8KQEAgLTU2MSw3ICs1OTMsOSBAQAogTVZfT1BfUEFSQU1TIHFzZ21paVBvcnRQb3dlclVwUGFyYW1zW10gPQogewogCS8qIHVuaXRCYXNlUmVnICAgICAgICAgICAgICAgICAgICB1bml0T2Zmc2V0ICAgCW1hc2sgICAgICAgICBRU0dNSUkgZGF0YQkJd2FpdFRpbWUgICBudW1PZkxvb3BzICovCi0JeyBRU0dNSUlfQ09OVFJPTF9SRUcxLAkJCQkweDAsICAJCTB4NDAwMDAwMDAsCXsgMHg0MDAwMDAwMAl9LCAJICAgMCwJCSAgMCB9LAkgIC8qIENvbm5lY3QgdGhlIFFTR01JSSB0byBHaWdhYml0IEV0aGVybmV0IHVuaXRzICovCisJeyBRU0dNSUlfQ09OVFJPTF9SRUcxLAkJCQkweDAsICAJCTB4NDQwMDAwMDAsCXsgMHg0NDAwMDAwMAl9LCAJICAgMCwJCSAgMCB9LAkgIC8qIENvbm5lY3QgUVNHTUlJIHRvIEdpZ2FiaXQgRXRoZXJuZXQgdW5pdHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHNhbXBsaW5nIGVkZ2Ugb2YgVHggUVNHTUlJIHRvIGJlIHBvc2l0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWNoaXZlIHBvcnQgdGhlIHN0YWJpbGl0eSAtIEpJUkEtMTI4MiAgICAqLwogCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsCTB4MjgsICAJCTB4RjAwMDYsCXsgMHg4MDAwMgkJfSwgCSAgIDAsCQkgIDAgfSwJICAvKiBQb3dlciBVcCAqLwogCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsCTB4MjgsCQkweDc4MDAsCSAgICB7IDB4NjAwMAkJfSwgCSAgIDAsCQkgIDAgfSwJICAvKiBVbnJlc2V0ICovCiAJeyBQT1dFUl9BTkRfUExMX0NUUkxfUkVHLAkJCTB4ODAwLAkJMHhGRiwJICAgIHsgMHhGQzgxCQl9LCAJICAgMCwJCSAgMCB9LAkgIC8qIFBoeSBTZWxlY3RvciAqLwpAQCAtNTkxLDkgKzYyNSw5IEBACiAJeyBHTFVFX1JFRywJCQkgICAgICAgICAgICAgIDB4ODAwLAkgIDB4MTgwMCwgICAgIHsgMHg4MDAJCX0sICAgICAwLAkgICAgICAgMAkJICAgfSwKIAl7IFJFU0VUX0RGRV9SRUcsCQkgICAgICAgICAgMHg4MDAsCSAgMHg0MDEsCSAgeyAweDQwMQkJfSwgICAgIDAsCSAgICAgICAwCQkgICB9LCAvKiBTZnQgUmVzZXQgcHVsc2UgKi8KIAl7IFJFU0VUX0RGRV9SRUcsCQkgICAgICAgICAgMHg4MDAsCSAgMHg0MDEsCSAgeyAweDAJCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0sIC8qIFNmdCBSZXNldCBwdWxzZSAqLwotICAgIHsgTEFORV9BTElHTl9SRUcwLCAgICAgICAgICAgICAgICAweDgwMCwJICAweDEwMDAsCSAgeyAweDEwMDAJCX0sICAgICAwLAkgICAgICAgMAkJICAgfSwgLyogTGFuZSBhbGlnbiAqLwotICAgIHsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAweDI4LAkJICAweDcwMDAwLCAgICB7IDB4NzAwMDAJCX0sICAgICAwLAkgICAgICAgMAkJICAgfSwgLyogUG93ZXIgdXAgUExMLCBSWCBhbmQgVFggKi8KLSAgICB7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgMHgyOCwJCSAgMHg4MDAwMCwgICAgeyAweDgwMDAwCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0gIC8qIFR4IGRyaXZlciBvdXRwdXQgaWRsZSAqLworCXsgTEFORV9BTElHTl9SRUcwLCAgICAgICAgICAgICAgICAweDgwMCwJICAweDEwMDAsCSAgeyAweDEwMDAJCX0sICAgICAwLAkgICAgICAgMAkJICAgfSwgLyogTGFuZSBhbGlnbiAqLworCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAweDI4LAkJICAweDcwMDAwLCAgICB7IDB4NzAwMDAJCX0sICAgICAwLAkgICAgICAgMAkJICAgfSwgLyogUG93ZXIgdXAgUExMLCBSWCBhbmQgVFggKi8KKwl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgMHgyOCwJCSAgMHg4MDAwMCwgICAgeyAweDgwMDAwCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0gIC8qIFR4IGRyaXZlciBvdXRwdXQgaWRsZSAqLwogfTsKIAogTVZfT1BfUEFSQU1TIHFzZ21paVBvcnRUeENvbmZpZ1BhcmFtczJbXSA9CkBAIC02NDEsOCArNjc1LDcgQEAKIAogTVZfVTMyIG12SHdzU2VyZGVzVG9wb2xvZ3lWZXJpZnkoU0VSREVTX1RZUEUgc2VyZGVzVHlwZSwgTVZfVTMyIHNlcmRlc0lkLCBTRVJERVNfTU9ERSBzZXJkZXNNb2RlKQogewotCi0JTVZfVTMyIHRlc3RSZXN1bHQgPSAwOworCU1WX1UzMiB0ZXN0UmVzdWx0ID0gVE9QT0xPR1lfVEVTVF9PSzsKIAlNVl9VOCBzZXJkTWF4TnVtYix1bml0TnVtYjsKIAlNVl9VTklUX0lEIHVuaXRJZDsKIApAQCAtNjU0LDQyICs2ODcsNDMgQEAKIAl1bml0TnVtYiA9c2VyZGVzVHlwZVRvVW5pdEluZm9bc2VyZGVzVHlwZV0uc2VyZGVzVW5pdE51bTsKIAlzZXJkTWF4TnVtYiA9IG12U3lzRW52VW5pdE1heE51bUdldCh1bml0SWQpOwogCi0JaWYgKFNlcmRlc0xhbmVJblVzZUNvdW50W3VuaXRJZF1bdW5pdE51bWJdICE9IDApIHsJCS8qIGlmIGRpZG4ndCBleGNlZWQgYW1vdW50IG9mIHJlcXVpcmVkIFNlcmRlcyBsYW5lcyBmb3IgY3VycmVudCB0eXBlICovCi0JCVNlcmRlc0xhbmVJblVzZUNvdW50W3VuaXRJZF1bdW5pdE51bWJdLS07CQkJLyogdXBkYXRlIGFtb3VudCBvZiByZXF1aXJlZCBTZXJkZXMgbGFuZXMgZm9yIGN1cnJlbnQgdHlwZSAqLwotCi0JCWlmIChTZXJkZXNMYW5lSW5Vc2VDb3VudFt1bml0SWRdW3VuaXROdW1iXSA9PSAwKXsJLyogaWYgcmVhY2hlZCB0aGUgZXhhY3QgYW1vdW50IG9mIHJlcXVpcmVkIFNlcmRlcyBsYW5lcyBmb3IgY3VycmVudCB0eXBlICovCi0JCWlmICgoKHNlcmRlc1R5cGUgPD0gUEVYMykpICYmICgoc2VyZGVzTW9kZSA9PSBQRVhfRU5EX1BPSU5UX3g0KSB8fCAoc2VyZGVzTW9kZSA9PSBQRVhfUk9PVF9DT01QTEVYX3g0KSkpCi0JCQlzZXJkZXNVbml0Q291bnRbUEVYX1VOSVRfSURdICs9MjsJCQkJLyogUENpZXg0IHVzZXMgMiBTZXJEZXMgKi8KLQkJZWxzZQotCQkJc2VyZGVzVW5pdENvdW50W3VuaXRJZF0rKzsKLQotCQlpZiAoc2VyZGVzVW5pdENvdW50W3VuaXRJZF0gPiBzZXJkTWF4TnVtYikJCQkvKiB0ZXN0IFNvQyB1bml0IGNvdW50IGxpbWl0YXRpb24gKi8KLQkJCXRlc3RSZXN1bHQgPSBXUk9OR19OVU1CRVJfT0ZfVU5JVFM7Ci0JCWVsc2UgaWYgKHVuaXROdW1iID49IHNlcmRNYXhOdW1iKQkJCQkJLyogdGVzdCBTb0MgdW5pdCBudW1iZXIgbGltaXRhdGlvbiAqLwotCQkJdGVzdFJlc3VsdCA9IFVOSVRfTlVNQkVSX1ZJT0xBVElPTjsKLQkJfQotCX0KLQllbHNlCi0JeworCWlmIChTZXJkZXNMYW5lSW5Vc2VDb3VudFt1bml0SWRdW3VuaXROdW1iXSA9PSAwKSB7CiAJCXRlc3RSZXN1bHQgPSBTRVJERVNfQUxSRUFEWV9JTl9VU0U7Ci0JCWlmICh0ZXN0UmVzdWx0ID09IFNFUkRFU19BTFJFQURZX0lOX1VTRSkKLQkJewotCQkJbXZQcmludGYoIiVzOiBFcnJvcjogc2VyZGVzIGxhbmUgJWQgaXMgY29uZmlndXJlZCB0byB0eXBlICVzOiB0eXBlIGFscmVhZHkgaW4gdXNlXG4iLCBfX2Z1bmNfXywgc2VyZGVzSWQsIHNlcmRlc1R5cGVUb1N0cmluZ1tzZXJkZXNUeXBlXSk7Ci0JCQlyZXR1cm4gTVZfRkFJTDsKKwl9IGVsc2UgeworCS8qIGlmIGRpZG4ndCBleGNlZWQgYW1vdW50IG9mIHJlcXVpcmVkIFNlcmRlcyBsYW5lcyBmb3IgY3VycmVudCB0eXBlICovCisJCWlmIChzZXJkZXNUeXBlID09IFBFWDApeworCQkgICBpZihzZXJkZXNNb2RlICE9IFBFWF9FTkRfUE9JTlRfeDQpeworCQkJICAgaWYoc2VyZGVzTW9kZSAhPSBQRVhfUk9PVF9DT01QTEVYX3g0KXsKKwkJICAgIC8qIFNlcmRlc0xhbmVJblVzZUNvdW50IGZvciBQRVgwID0gNCAsIGJ1dCBpZiBpdCBpcyBQQ0lleDEgb25seSAxIGxhbmUgbWF5IGJlIHVzZWQgICovCisJCQlTZXJkZXNMYW5lSW5Vc2VDb3VudFt1bml0SWRdW3VuaXROdW1iXSA9IDE7CisJCQl9CisJCSAgIH0KIAkJfQotCQllbHNlIGlmICh0ZXN0UmVzdWx0ID09IFdST05HX05VTUJFUl9PRl9VTklUUykKLQkJewotCQkJbXZQcmludGYoIiVzOiBXYXJuaW5nOiBzZXJkZXMgbGFuZSAlZCBpcyBzZXQgdG8gdHlwZSAlcy5cbiIsIF9fZnVuY19fLCBzZXJkZXNJZCxzZXJkZXNUeXBlVG9TdHJpbmdbc2VyZGVzVHlwZV0pOwotCQkJbXZQcmludGYoIiVzOiBNYXhpbXVtIHN1cHBvcnRlZCBsYW5lcyBhcmUgYWxyZWFkeSBzZXQgdG8gdGhpcyB0eXBlIChsaW1pdCA9ICVkKVxuIiwgX19mdW5jX18sIHNlcmRNYXhOdW1iKTsKLQkJCXJldHVybiBNVl9GQUlMOwotCQl9CisJCVNlcmRlc0xhbmVJblVzZUNvdW50W3VuaXRJZF1bdW5pdE51bWJdLS07CQkJLyogdXBkYXRlIGFtb3VudCBvZiByZXF1aXJlZCBTZXJkZXMgbGFuZXMgZm9yIGN1cnJlbnQgdHlwZSAqLworICAgICAgICBpZiAoU2VyZGVzTGFuZUluVXNlQ291bnRbdW5pdElkXVt1bml0TnVtYl0gPT0gMCkvKiBpZiByZWFjaGVkIHRoZSBleGFjdCBhbW91bnQgb2YgcmVxdWlyZWQgU2VyZGVzIGxhbmVzIGZvciBjdXJyZW50IHR5cGUgKi8KKyAgICAgICAgeworCQkgICAgaWYoKHNlcmRlc1R5cGUgPD0gUEVYMykgJiYgKChzZXJkZXNNb2RlID09IFBFWF9FTkRfUE9JTlRfeDQpIHx8IChzZXJkZXNNb2RlID09IFBFWF9ST09UX0NPTVBMRVhfeDQpKSkKKwkJCSAgICBzZXJkZXNVbml0Q291bnRbUEVYX1VOSVRfSURdICs9MjsJCQkJLyogUENpZXg0IHVzZXMgMiBTZXJEZXMgKi8KKwkJICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZXJkZXNVbml0Q291bnRbdW5pdElkXSsrOwogCi0JCWVsc2UgaWYgKHRlc3RSZXN1bHQgPT0gVU5JVF9OVU1CRVJfVklPTEFUSU9OKQotCQl7Ci0JCQltdlByaW50ZigiJXM6IFdhcm5pbmc6IHNlcmRlcyBsYW5lICVkIHR5cGUgaXMgJXM6IGN1cnJlbnQgZGV2aWNlIHN1cHBvcnQgb25seSAlZCB1bml0cyBvZiB0aGlzIHR5cGUuXG4iLCBfX2Z1bmNfXywgc2VyZGVzSWQsIHNlcmRlc1R5cGVUb1N0cmluZ1tzZXJkZXNUeXBlXSxzZXJkTWF4TnVtYiApOwotCQkJcmV0dXJuIE1WX0ZBSUw7CisgICAgICAgICAgICBpZiAoc2VyZGVzVW5pdENvdW50W3VuaXRJZF0gPiBzZXJkTWF4TnVtYikJCQkvKiB0ZXN0IFNvQyB1bml0IGNvdW50IGxpbWl0YXRpb24gKi8KKyAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0ID0gV1JPTkdfTlVNQkVSX09GX1VOSVRTOwogCQl9CiAJfQorCisJaWYgKHRlc3RSZXN1bHQgPT0gU0VSREVTX0FMUkVBRFlfSU5fVVNFKSB7CisJCW12UHJpbnRmKCIlczogRXJyb3I6IHNlcmRlcyBsYW5lICVkIGlzIGNvbmZpZ3VyZWQgIiwgX19mdW5jX18sIHNlcmRlc0lkKTsKKwkJbXZQcmludGYoInRvIHR5cGUgJXM6IHR5cGUgYWxyZWFkeSBpbiB1c2VcbiIsIHNlcmRlc1R5cGVUb1N0cmluZ1tzZXJkZXNUeXBlXSk7CisJCXJldHVybiBNVl9GQUlMOworCX0gZWxzZSBpZiAodGVzdFJlc3VsdCA9PSBXUk9OR19OVU1CRVJfT0ZfVU5JVFMpIHsKKwkJbXZQcmludGYoIiVzOiBXYXJuaW5nOiBzZXJkZXMgbGFuZSAlZCBpcyAiLCBfX2Z1bmNfXywgc2VyZGVzSWQpOworCQltdlByaW50Zigic2V0IHRvIHR5cGUgJXMuXG4iLCBzZXJkZXNUeXBlVG9TdHJpbmdbc2VyZGVzVHlwZV0pOworCQltdlByaW50ZigiJXM6IE1heGltdW0gc3VwcG9ydGVkIGxhbmVzIGFyZSAiLCBfX2Z1bmNfXyk7CisJCW12UHJpbnRmKCJhbHJlYWR5IHNldCB0byB0aGlzIHR5cGUgKGxpbWl0ID0gJWQpXG4iLCBzZXJkTWF4TnVtYik7CisJCXJldHVybiBNVl9GQUlMOworCX0KKwogCXJldHVybiBNVl9PSzsKIH0KIApAQCAtNzA4LDcgKzc0MiwxMyBAQAogIH0KIAogfQotCitNVl9WT0lEIG12SHdzU2VyZGVzUENJWDRUb3BvbG9neVZlcmlmeShNVl9WT0lEICkKK3sKKwlpZiAoU2VyZGVzTGFuZUluVXNlQ291bnRbUEVYX1VOSVRfSURdWzBdICE9IDApIHsKKwkJbXZQcmludGYoIiVzOiBXYXJuaW5nOiB3cm9uZyBudW1iZXIgb2YgbGFuZXMgaXMgc2V0IHRvIFBFWDAgLSAlZFxuIiwgX19mdW5jX18sIFNlcmRlc0xhbmVJblVzZUNvdW50W1BFWF9VTklUX0lEXVswXSk7CisJCW12UHJpbnRmKCIlczogUENJZXg0IGhhcyB0byBiZSBkZWZpbmVkIG9uIDQgbGFuZXNcbiIsIF9fZnVuY19fKTsKKwl9Cit9CiBNVl9TVEFUVVMgbXZId3NTZXJkZXNTZXFEYkluaXQoTVZfVk9JRCkKIHsKIAlERUJVR19JTklUX0ZVTExfUygiXG4jIyMgc2VyZGVzU2VxMzh4SW5pdCAjIyNcbiIpOwpAQCAtOTE3LDcgKzk1Nyw3IEBACiAJCXNlcmRlc1NlcURiW1VTQjNfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHVzYjNFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MlBhcmFtczsKIAkJc2VyZGVzU2VxRGJbVVNCM19FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHVzYjNFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MlBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKIAl9Ci0Jc2VyZGVzU2VxRGJbVVNCM19FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggPSBVU0IzOworCXNlcmRlc1NlcURiW1VTQjNfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ID0gRklSU1RfQ0VMTDsKIAogCS8qIFVTQjNfVFhfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCiAJc2VyZGVzU2VxRGJbVVNCM19UWF9DT05GSUdfU0VRMV0ub3BQYXJhbXNQdHIgPSBwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMxOwpAQCAtMTAyMyw3ICsxMDYzLDEwIEBACiAJY2FzZSBTR01JSTE6CiAJY2FzZSBTR01JSTI6CiAjaWZkZWYgTVY4OEY2OVhYCi0gICAgY2FzZSBTR01JSTM6CisgICAgY2FzZSBTR01JSXYzXzA6CisgICAgY2FzZSBTR01JSXYzXzE6CisgICAgY2FzZSBTR01JSXYzXzI6CisgICAgY2FzZSBTR01JSXYzXzM6CiAjZW5kaWYKICAgICAgICAgaWYgKGJhdWRSYXRlID09IF9fMV8yNUdicHMpCiAJCQlzZXFJZCA9IFNHTUlJX18xXzI1X1NQRUVEX0NPTkZJR19TRVE7CkBAIC0xMDY3LDMzICsxMTEwLDM0IEBACiAKIE1WX1ZPSUQgcHJpbnRUb3BvbG9neURldGFpbHMoU0VSREVTX01BUCAgKnNlcmRlc01hcEFycmF5KQogewotCU1WX1UzMiBsYW5lTnVtOworCU1WX1UzMiBsYW5lTnVtLCBwZXhCeTRMYW5lPTA7CiAKLQlERUJVR19JTklUX1MoImJvYXJkIFNlckRlcyBsYW5lcyB0b3BvbG9neSBkZXRhaWxzOlxuIik7CisJbXZQcmludGYoImJvYXJkIFNlckRlcyBsYW5lcyB0b3BvbG9neSBkZXRhaWxzOlxuIik7CiAKLQlERUJVR19JTklUX1MoIiB8IExhbmUgIyAgfCBTcGVlZCB8ICBUeXBlICAgICAgIHxcbiIpOwotCURFQlVHX0lOSVRfUygiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwltdlByaW50ZigiIHwgTGFuZSAjIHwgU3BlZWR8ICAgIFR5cGUgICAgIHxcbiIpOworCW12UHJpbnRmKCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuIik7CiAJZm9yIChsYW5lTnVtID0gMDsgbGFuZU51bSA8IG12SHdzU2VyZGVzR2V0TWF4TGFuZSgpOyBsYW5lTnVtKyspIHsKIAkJaWYgKHNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1R5cGUgPT0gREVGQVVMVF9TRVJERVMpCiAJCXsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCURFQlVHX0lOSVRfUygiIHwgICAiKTsKLQkJREVCVUdfSU5JVF9EKG12SHdzR2V0UGh5c2ljYWxTZXJkZXNOdW0obGFuZU51bSksIDEpOwotCQlERUJVR19JTklUX1MoIiAgICB8ICAiKTsKLQkJREVCVUdfSU5JVF9EKHNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1NwZWVkLCAyKTsKLQkJREVCVUdfSU5JVF9TKCIgICB8ICAiKTsKLQkJREVCVUdfSU5JVF9TKChjaGFyICopc2VyZGVzVHlwZVRvU3RyaW5nW3NlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1R5cGVdKTsKLQkJREVCVUdfSU5JVF9TKCJcdHxcbiIpOworCQltdlByaW50ZiAoIiB8ICAgJWQgICAgfCAgJWQgICB8ICAiLG12SHdzR2V0UGh5c2ljYWxTZXJkZXNOdW0obGFuZU51bSksc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc2VyZGVzU3BlZWQpOworCQlpZiAoKHNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc01vZGUgPT0gUEVYX0VORF9QT0lOVF94NCkgfHwgKHNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc01vZGUgPT0gUEVYX1JPT1RfQ09NUExFWF94NCkpeworCQkJbXZQcmludGYgKCJQQ0llMHg0LSUwMWQgICIscGV4Qnk0TGFuZSsrICk7CisJCX0KKwkJZWxzZXsKKwkJCW12UHJpbnRmICgiJXMiLHNlcmRlc1R5cGVUb1N0cmluZ1tzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlXSk7CisJCX0KKwkJbXZQcmludGYoInxcbiIpOwogCX0KLQlERUJVR19JTklUX1MoIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJbXZQcmludGYoIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfU1RBVFVTIG12SHdzUHJlU2VyZGVzSW5pdENvbmZpZyhNVl9WT0lEKQogewotICAgIE1WX1UzMiBkYXRhOworICAgIE1WX1UzMiBkYXRhLCByZWZDbGtTYXRSOwogCiAgICAgLyogY29uZmlndXJlIENvcmUgUExMICovCiAgICAgLyoKQEAgLTExMDMsOCArMTE0NywxMyBAQAogICAgIGJpdHNbMjQ6MjFdPTB4NyhDb3JlLVBMTCBWQ08gQmFuZCkKICAgICBiaXRzWzI4OjI1XT0weDEoQ29yZS1QTEwgUmxmKQogICAgIGJpdHNbMzE6MjldPTB4MihDb3JlLVBMTCBjaGFyZ2UtcHVtcCBhZGp1c3QpCisgICAgKHRoZSBjb25maWd1cmF0aW9uIHZhbGlkIG9ubHkgZm9yIHJlZmNsayAyNU1oeiwgZm9yIDQwTWh6IGJldHRlciBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYXQgdGhpcyB0aW1lKQogICAgICovCi0gICAgTVZfUkVHX1dSSVRFKENPUkVfUExMX1BBUkFNRVRFUlNfUkVHLCAweDQyRTlGMDAzKTsKKwlyZWZDbGtTYXRSID0gTVZfUkVHX1JFQUQoREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHKTsKKwlpZigoKHJlZkNsa1NhdFIgPj4gREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHX1JFRkNMS19PRkZTRVQpICYgMHgxKSA9PSBERVZJQ0VfU0FNUExFX0FUX1JFU0VUMl9SRUdfUkVGQ0xLXzI1TUhaKXsKKwkJLypTa2lwIHRoZSBjb25maWd1cmF0aW9uIGluIFJFRkxLIDQwTWh6IG1vZGUqLworCQlNVl9SRUdfV1JJVEUoQ09SRV9QTExfUEFSQU1FVEVSU19SRUcsIDB4NDJFOUYwMDMpOworCX0KIAogICAgIC8qIEVuYWJsZSBQTEwgQ29uZmlndXJhdGlvbiAqLwogICAgIGRhdGEgPSBNVl9SRUdfUkVBRChDT1JFX1BMTF9DT05GSUdfUkVHKTsKQEAgLTExNzIsNiArMTIyMSw5MCBAQAogCXJldHVybiBNVl9PSzsKIH0KIAorTVZfVk9JRCBtdkh3c1VwZGF0ZVNlcmRlc1BoeVNlbGVjdG9yc09wdGlvbnMgICggTVZfVk9JRCkKK3sKKwlNVl9VMzIgZGV2SWQsIGN1cnJUeXBlLGN1cnJMYW5lOworCisgICAgLyogdXBkYXRlIHNlbGVjdG9ycyBvcHRpb25zIGFjY29yZGluZyB0byBEZXZpY2UgbGltaXRhdGlvbiovCisJaWYgKCBtdlN5c0VudkRldmljZVJldkdldCgpID09IE1WXzg4RjY5WFhfWjFfSUQpIC8qIGZvciBaMSBTR01JSSh2MylfMCAgY2Fubm90IGJlIGRlZmluZWQgb24gbGFuZTYgKi8KKwkgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtTR01JSXYzXzBdWzZdID0gTkE7CisKKwkvKiBSZWFkIEhXIGRldmljZSBJRCBmcm9tIFNAUiAqLworCWRldklkID0gbXZTeXNFbnZEZXZpY2VJZEdldCgpOworCisgICAgc3dpdGNoIChkZXZJZCkKKyAgICB7CisJY2FzZSBNVl82ODEwOgorICAgICAgICAvKiBsYW5lIDQgaXMgbm90IGluIHVzZSBpbiA2ODEwKi8KKyAgICAgICAgZm9yIChjdXJyVHlwZSA9IDA7Y3VyclR5cGUgPCBMQVNUX1NFUkRFU19UWVBFOyBjdXJyVHlwZSsrKQorICAgICAgICAgICAgY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbY3VyclR5cGVdWzRdID0gTkE7CisgICAgICAgIC8qIFNBVEEgMiBhbmQgU0FUQSAzIGFyZSBub3QgZnVuY3Rpb25hbCBpbiA2ODEwKi8KKyAgICAgICAgZm9yIChjdXJyTGFuZSA9MDsgY3VyckxhbmUgPCBNQVhfU0VSREVTX0xBTkVTOyBjdXJyTGFuZSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtTQVRBM11bY3VyckxhbmVdID0gTkE7CisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtTQVRBMl1bY3VyckxhbmVdID0gTkE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisJY2FzZSBNVl82ODExOgorICAgICAgICAvKiBubyBRU0dNSUkgaW4gNjgxMSovCisgICAgICAgIGZvciAoY3VyckxhbmUgPTA7IGN1cnJMYW5lIDwgTUFYX1NFUkRFU19MQU5FUzsgY3VyckxhbmUrKykKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW1FTR01JSV1bY3VyckxhbmVdID0gTkE7CisgICAgICAgIC8qIFNBVEEgMiBhbmQgU0FUQSAzIGFuZCBTR01JSTIgYXJlIG5vdCBmdW5jdGlvbmFsIGluIDY4MTEqLworICAgICAgICBmb3IgKGN1cnJMYW5lID0wOyBjdXJyTGFuZSA8IE1BWF9TRVJERVNfTEFORVM7IGN1cnJMYW5lKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW1NBVEEzXVtjdXJyTGFuZV0gPSBOQTsKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW1NBVEEyXVtjdXJyTGFuZV0gPSBOQTsKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW1NHTUlJMl1bY3VyckxhbmVdID0gTkE7CisgICAgICAgIH0KKworICAgICAgICAvKiBubyBsYW5lcyA0IGFuZCA1IGluIDY4MTEgKi8KKyAgICAgICAgZm9yIChjdXJyVHlwZSA9IDA7Y3VyclR5cGUgPCBMQVNUX1NFUkRFU19UWVBFOyBjdXJyVHlwZSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtjdXJyVHlwZV1bNF0gPSBOQTsKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW2N1cnJUeXBlXVs1XSA9IE5BOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCWNhc2UgTVZfNjgyMDoKKyAgICAgICAgLyogU0FUQSAyIGFuZCBTQVRBIDMgYXJlIG5vdCBmdW5jdGlvbmFsIGluIDY4MjAqLworICAgICAgICBmb3IgKGN1cnJMYW5lID0wOyBjdXJyTGFuZSA8IE1BWF9TRVJERVNfTEFORVM7IGN1cnJMYW5lKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW1NBVEEzXVtjdXJyTGFuZV0gPSBOQTsKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW1NBVEEyXVtjdXJyTGFuZV0gPSBOQTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKwljYXNlIE1WXzY4Mjg6CisgICAgICAgIC8qIG5vIGxpbWl0YXRpb25zIGluIDY4MjggKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAvKiA0ICovCU1WX05PTkU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgLyogNSAqL01WXzY5MjA6CisgICAgICAgIC8qIG5vIFNBVEEgLFVTQjNfSE9TVDEsIFVTQjNfREVWSUNFLFFTR01JSSovCisgICAgICAgIGZvciAoY3VyckxhbmUgPTA7IGN1cnJMYW5lIDwgTUFYX1NFUkRFU19MQU5FUzsgY3VyckxhbmUrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbU0FUQTBdW2N1cnJMYW5lXSA9IE5BOworICAgICAgICAgICAgY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbU0FUQTFdW2N1cnJMYW5lXSA9IE5BOworICAgICAgICAgICAgY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbU0FUQTJdW2N1cnJMYW5lXSA9IE5BOworICAgICAgICAgICAgY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbU0FUQTNdW2N1cnJMYW5lXSA9IE5BOworICAgICAgICAgICAgY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbVVNCM19IT1NUMV1bY3VyckxhbmVdID0gTkE7CisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtVU0IzX0RFVklDRV1bY3VyckxhbmVdID0gTkE7CisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtRU0dNSUldW2N1cnJMYW5lXSA9IE5BOworICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICBjYXNlLyogNiAqLwlNVl82OTI4OgorICAgICAgICAvKiBubyBsaW1pdGF0aW9ucyBpbiA2OTI4ICovCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSA3LyogTVZfNjkyNSAqLzoKKyAgICAgICAgLyogU0FUQSAyIGFuZCBTQVRBIDMgYXJlIG5vdCBmdW5jdGlvbmFsIGluIDY5MjUqLworICAgICAgICBmb3IgKGN1cnJMYW5lID0wOyBjdXJyTGFuZSA8IE1BWF9TRVJERVNfTEFORVM7IGN1cnJMYW5lKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW1NBVEEzXVtjdXJyTGFuZV0gPSBOQTsKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW1NBVEEyXVtjdXJyTGFuZV0gPSBOQTsKKyAgICAgICAgfQorCSAgICBicmVhazsKKyAgICB9CisKK30KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9TVEFUVVMgbXZId3NQb3dlclVwU2VyZGVzTGFuZXMoU0VSREVTX01BUCAgKnNlcmRlc0NvbmZpZ01hcCkKIHsKQEAgLTExODgsNiArMTMyMSw5IEBACiAKIAlERUJVR19JTklUX0ZVTExfUygiXG4jIyMgbXZId3NQb3dlclVwU2VyZGVzTGFuZXMgIyMjXG4iKTsKIAorICAgIC8qIHVwZGF0ZSBUYWJsZSBvZiBzZWxlY3RvcnMgb3B0aW9ucyBhY2NvcmRpbmcgdG8gRGV2aWNlIGxpbWl0YXRpb24qLworICAgIG12SHdzVXBkYXRlU2VyZGVzUGh5U2VsZWN0b3JzT3B0aW9ucygpOworCiAJLyogQ09NTU9OIFBIWVMgU0VMRUNUT1JTIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gKi8KIAlERUJVR19JTklUX0ZVTExfUygibXZId3NQb3dlclVwU2VyZGVzTGFuZXM6IFVwZGF0aW5nIENPTU1PTiBQSFlTIFNFTEVDVE9SUyByZWdcbiIpOwogCUNIRUNLX1NUQVRVUyhtdkh3c1VwZGF0ZVNlcmRlc1BoeVNlbGVjdG9ycyhzZXJkZXNDb25maWd1cmF0aW9uTWFwKSk7CkBAIC0xMjU5LDYgKzEzOTUsMzIgQEAKIAlyZXR1cm4gbXZId3NDdHJsSGlnaFNwZWVkU2VyZGVzUGh5Q29uZmlnKCk7IC8vIHN0dWIKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHVwZGF0ZVVzYjNEZXZpY2VDb25maWcKKyogREVTQ1JJUFRJT046IFVwZGF0ZSBVU0IzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaWYgVVNCMyBkZXZpY2UgaXMgZW5hYmxlZAorKiBJTlBVVDoKKyoJdG9wb2xvZ3lDb25maWdQdHIgLSBwb2ludGVyIHRvIHRoZSBTZXJkZXMgbWFwcGluZworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB1cGRhdGVVc2IzRGV2aWNlQ29uZmlnKFNFUkRFU19NQVAgKnNlcmRlc01hcEFycmF5KQoreworCU1WX1UzMiBsYW5lTnVtOworCWZvciAobGFuZU51bSA9IDA7IGxhbmVOdW0gPCBtdkh3c1NlcmRlc0dldE1heExhbmUoKTsgbGFuZU51bSsrKSB7CisJCWlmIChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID09IFVTQjNfREVWSUNFKSB7CisJCQkvKiB3cml0ZSAweDEgdG8gVVNCM19DT05GSUdfUkVHWzA6MV0KKwkJCSAqIEJJVDAgKFVTQjMgRGV2aWNlIFVUTUkgRW4pCTAgOiBVU0IzIERldmljZSBkaXNhYmxlZC4KKwkJCSAqCQkJCSAgICAoVVNCMiBvbiBVVE1JMCwgYW5kIFVTQjMgSG9zdDEgb24gVVRNSTIpCisJCQkgKgkJCSAgICAgLT4gMSA6IFVTQjMgRGV2aWNlIGVuYWJsZWQKKwkJCSAqCisJCQkgKiBCSVQxIChVU0IzIERldmljZSBVVE1JIE11eCkJLT4gMCA6IFVUTUkyOiBVU0IzIERldmljZSBpcyBvbiBVVE1JMgorCQkJICoJCQkJICAgMSA6IFVUTUkwOiBVU0IzIERldmljZSBpcyBvbiBVVE1JMCAqLworCQkJTVZfUkVHX0JJVF9SRVNFVChVU0IzX0NPTkZJR19SRUcsIEJJVDEpOworCQkJTVZfUkVHX0JJVF9TRVQoVVNCM19DT05GSUdfUkVHLCBCSVQwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBNVl9TVEFUVVMgbXZTZXJkZXNQZXhVc2IzUGlwZURlbGF5V0EoTVZfVTMyIHNlcmRlc051bSwgTVZfVTggc2VyZGVzVHlwZSkKIHsKQEAgLTEzODcsMTAgKzE1NDksMTEgQEAKICNpZmRlZiBEQl9MSU5LX0NIRUNLCiAJaW50IGk7CiAjZW5kaWYKLQlNVl9VMzIgc2F0YUlkeCwgcGV4SWR4LCBzYXRhUG9ydDsKKwlNVl9VMzIgc2F0YUlkeCwgcGV4SWR4LHNhdGFQb3J0OwogCVNFUkRFU19TRVEgc3BlZWRTZXFJZDsKIAlNVl9VMzIgcmVnRGF0YTsKIAlNVl9CT09MIGlzUGV4QnkxOworCU1WX1UzMglib2FyZElkID0gbXZCb2FyZElkR2V0KCk7CiAKIAlERUJVR19JTklUX0ZVTExfUygiXG4jIyMgbXZTZXJkZXNQb3dlclVwQ3RybCAjIyNcbiIpOwogCkBAIC0xNDIzLDUxICsxNTg2LDU1IEBACiAJCQlpc1BleEJ5MSA9IChzZXJkZXNNb2RlID09IFBFWF9ST09UX0NPTVBMRVhfeDEpIHx8IChzZXJkZXNNb2RlID09IFBFWF9FTkRfUE9JTlRfeDEpOwogCQkJcGV4SWR4ID0gc2VyZGVzVHlwZSAtIFBFWDA7CiAKLQkJCWlmICgoaXNQZXhCeTEgPT0gTVZfVFJVRSkgfHwgKHNlcmRlc1R5cGUgPT0gUEVYMCkpCisJCQlpZiAoKGlzUGV4QnkxID09IE1WX1RSVUUpIHx8ICgoc2VyZGVzVHlwZSA9PSBQRVgwKSAmJiAoc2VyZGVzTnVtID09IDApKSkKIAkJCXsKLQkJCQkvKiBGb3IgUEVYIGJ5IDQsIGluaXQgb25seSB0aGUgUEVYIDAgKi8KKwkJCQkvKiB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBkb25lIGZvciBQRVh4MSBhbmQgZm9yIFBFWCBieSA0LWZvciB0aGUgZmlyc3QgbGFuZSBvbmx5ICovCiAJCQkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKFNPQ19DT05UUk9MX1JFRzEpOwotCQkJCWlmIChpc1BleEJ5MSA9PSBNVl9UUlVFKSB7CisJCQkJaWYgKGlzUGV4QnkxID09IE1WX1RSVUUpCiAJCQkJCXJlZ0RhdGEgfD0gMHg0MDAwOwotCQkJCX0KLQkJCQllbHNleworCQkJCWVsc2UKIAkJCQkJcmVnRGF0YSAmPSB+MHg0MDAwOwotCQkJCX0KIAkJCQlNVl9SRUdfV1JJVEUoU09DX0NPTlRST0xfUkVHMSwgcmVnRGF0YSk7CiAKLQkJCQlyZWdEYXRhID0gTVZfUkVHX1JFQUQoKChNVl9QRVhfSUZfUkVHU19CQVNFKHBleElkeCkpICsgMHg2YykpOworCQkJCS8qIFNldHVwIGxpbmsgd2lkdGggYml0Wzk6NF0gKi8KKwkJCQlyZWdEYXRhID0gTVZfUkVHX1JFQUQoUEVYX0xJTktfQ0FQQUJJTElUSUVTX1JFRyhwZXhJZHgpKTsKIAkJCQlyZWdEYXRhICY9IH4weDNGMDsKLQkJCQlpZiAoaXNQZXhCeTEgPT0gTVZfVFJVRSkgeworCQkJCWlmIChpc1BleEJ5MSA9PSBNVl9UUlVFKQogCQkJCQlyZWdEYXRhIHw9IDB4MTA7Ci0JCQkJfQotCQkJCWVsc2UgeworCQkJCWVsc2UKIAkJCQkJcmVnRGF0YSB8PSAweDQwOwotCQkJCX0KLQkJCQlNVl9SRUdfV1JJVEUoKChNVl9QRVhfSUZfUkVHU19CQVNFKHBleElkeCkpICsgMHg2YyksIHJlZ0RhdGEpOworCQkJCU1WX1JFR19XUklURShQRVhfTElOS19DQVBBQklMSVRJRVNfUkVHKHBleElkeCksIHJlZ0RhdGEpOwogCi0JCQkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKCgoTVZfUEVYX0lGX1JFR1NfQkFTRShwZXhJZHgpKSArIDB4NmMpKTsKKwkJCQkvKiBTZXR1cCBtYXhpbXVtIGxpbmsgc3BlZWQgYml0WzM6MF0gKi8KKwkJCQlyZWdEYXRhID0gTVZfUkVHX1JFQUQoUEVYX0xJTktfQ0FQQUJJTElUSUVTX1JFRyhwZXhJZHgpKTsKIAkJCQlyZWdEYXRhICY9IH4weEY7Ci0JCQkJcmVnRGF0YSB8PSAweDI7Ci0JCQkJTVZfUkVHX1dSSVRFKCgoTVZfUEVYX0lGX1JFR1NfQkFTRShwZXhJZHgpKSArIDB4NmMpLCByZWdEYXRhKTsKKwkJCQlpZiAoKGJvYXJkSWQgPT0gREJfQU1DXzY4MjBfSUQpICYmIChwZXhJZHggPT0gMCkgJiYKKwkJCQkJbXZCb2FyZEZvcmNlUGNpZUdlbjFHZXQoKSkgeworCQkJCQkvKiBUaGUgV0EgaXMgcmVxdWlyZWQgZm9yIEJDMiBBMCwgc28gU2F0UiBpcyBjb2RlZCBhY2NvcmRpbmdseSAqLworCQkJCQltdlByaW50ZigiRm9yY2luZyBMaW5rIHRvIEdFTjEgb24gUENJZS0lZFxuIiwgcGV4SWR4KTsKKwkJCQkJcmVnRGF0YSB8PSAweDE7IC8qIEdFTjEsIDIuNUcgKi8KKwkJCQl9IGVsc2UKKwkJCQkJcmVnRGF0YSB8PSAweDI7IC8qIEdFTjIsIDVHICovCisJCQkJTVZfUkVHX1dSSVRFKFBFWF9MSU5LX0NBUEFCSUxJVElFU19SRUcocGV4SWR4KSwgcmVnRGF0YSk7CiAKLQkJCQlyZWdEYXRhID0gTVZfUkVHX1JFQUQoKChNVl9QRVhfSUZfUkVHU19CQVNFKHBleElkeCkpICsgMHg3MCkpOworCQkJCS8qIFNldHVwIGNvbW1vbiBjbG9jayBjb25maWd1cmF0aW9uIGJpdFs2XSAqLworCQkJCXJlZ0RhdGEgPSBNVl9SRUdfUkVBRChQRVhfTElOS19DVFJMX1NUQVRVU19SRUcocGV4SWR4KSk7CiAJCQkJcmVnRGF0YSAmPSB+MHg0MDsKIAkJCQlyZWdEYXRhIHw9IDB4NDA7Ci0JCQkJTVZfUkVHX1dSSVRFKCgoTVZfUEVYX0lGX1JFR1NfQkFTRShwZXhJZHgpKSArIDB4NzApLCByZWdEYXRhKTsKKwkJCQlNVl9SRUdfV1JJVEUoUEVYX0xJTktfQ1RSTF9TVEFUVVNfUkVHKHBleElkeCksIHJlZ0RhdGEpOwogCQkJfQogCiAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgUEVYX1BPV0VSX1VQX1NFUSkpOwotICAgICAgICAgICAgaWYgKGlzUGV4QnkxID09IE1WX0ZBTFNFKSB7Ci0gICAgICAgICAgICAgICAgLyogZm9yIFBFWCBieSA0IC0gdXNlIHRoZSBQRVggaW5kZXggYXMgdGhlIHNlcSBhcnJheSBpbmRleCAqLwotICAgICAgICAgICAgICAgIHNlcmRlc1NlcURiW1BFWF9CWV80X0NPTkZJR19TRVFdLmRhdGFBcnJJZHggPSBwZXhJZHg7CisgICAgICAgICAgICAgaWYgKGlzUGV4QnkxID09IE1WX0ZBTFNFKSB7CisgICAgICAgICAgICAgICAgLyogZm9yIFBFWCBieSA0IC0gdXNlIHRoZSBzZXJkZXNOdW0gYXMgdGhlIHNlcSBhcnJheSBpbmRleCAqLworICAgICAgICAgICAgICAgIHNlcmRlc1NlcURiW1BFWF9CWV80X0NPTkZJR19TRVFdLmRhdGFBcnJJZHggPSBzZXJkZXNOdW07CiAgICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFBFWF9CWV80X0NPTkZJR19TRVEpKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzUmVmQ2xvY2tTZXQoc2VyZGVzTnVtLCBzZXJkZXNUeXBlLCByZWZDbG9jaykpOworCSAgICBDSEVDS19TVEFUVVMobXZId3NSZWZDbG9ja1NldChzZXJkZXNOdW0sIHNlcmRlc1R5cGUsIHJlZkNsb2NrKSk7CiAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgc3BlZWRTZXFJZCkpOwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFBFWF9FTEVDVFJJQ0FMX0NPTkZJR19TRVEpKTsKIAotCQkJaWYgKGlzUGV4QnkxID09IE1WX1RSVUUpIHsKKwkgICBpZiAoaXNQZXhCeTEgPT0gTVZfVFJVRSkgewogCQkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBQRVhfVFhfQ09ORklHX1NFUTIpKTsKIAkJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgUEVYX1RYX0NPTkZJR19TRVEzKSk7CiAJCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFBFWF9UWF9DT05GSUdfU0VRMSkpOwpAQCAtMTYyMCw3ICsxNzg3LDEwIEBACiAJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgUVNHTUlJX1RYX0NPTkZJR19TRVExKSk7CiAJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgUVNHTUlJX1RYX0NPTkZJR19TRVEyKSk7CiAgICAgICAgICAgICBicmVhazsKLQkJY2FzZSBTR01JSTM6CisJCWNhc2UgU0dNSUl2M18wOgorCQljYXNlIFNHTUlJdjNfMToKKwkJY2FzZSBTR01JSXYzXzI6CisJCWNhc2UgU0dNSUl2M18zOgogCQljYXNlIFhBVUk6CiAgICAgICAgIGNhc2UgUlhBVUk6CiAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZTZXJkZXNQb3dlclVwQ3RybEV4dChzZXJkZXNOdW0sIHNlcmRlc1Bvd2VyVXAsIHNlcmRlc1R5cGUsIGJhdWRSYXRlLCBzZXJkZXNNb2RlLCByZWZDbG9jaykpOwpAQCAtMTY0NCw3ICsxODE0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9TVEFUVVMgbXZId3NVcGRhdGVTZXJkZXNQaHlTZWxlY3RvcnMoU0VSREVTX01BUCogc2VyZGVzQ29uZmlnTWFwKQogewotCU1WX1UzMiBsYW5lRGF0YSwgc2VyZGVzSWR4LHNlcmRlc0xhbmVId051bSwgcmVnRGF0YSA9IDA7CisJTVZfVTMyIGxhbmVEYXRhLCBzZXJkZXNJZHgsc2VyZGVzTGFuZUh3TnVtLGRldklkLHJlZ0RhdGEgPSAwOwogCVNFUkRFU19UWVBFIHNlcmRlc1R5cGU7CiAJU0VSREVTX01PREUgc2VyZGVzTW9kZTsKIAlNVl9VOCAgICAgICBzZWxlY3RCaXRPZmY7CkBAIC0xNjU5LDYgKzE4MjksOCBAQAogCX0gZWxzZSB7CiAJCXNlbGVjdEJpdE9mZiA9IDQ7CiAJfQorICAgIC8qIFJlYWQgSFcgZGV2aWNlIElEIGZyb20gU0BSICovCisJZGV2SWQgPSBtdlN5c0VudkRldmljZUlkR2V0KCk7CiAKIAkvKiBVcGRhdGluZyBiaXRzIDAtMTcgaW4gdGhlIENPTU1PTiBQSFlTIFNFTEVDVE9SUyByZWdpc3RlciBhY2NvcmRpbmcgdG8gdGhlIHNlcmRlcyB0eXBlcyAqLwogCWZvciAoc2VyZGVzSWR4ID0gMDsgc2VyZGVzSWR4IDwgbXZId3NTZXJkZXNHZXRNYXhMYW5lKCk7IHNlcmRlc0lkeCsrKSB7CkBAIC0xNjY2LDEyICsxODM4LDE5IEBACiAJCXNlcmRlc01vZGUgPSBzZXJkZXNDb25maWdNYXBbc2VyZGVzSWR4XS5zZXJkZXNNb2RlOwogCQlzZXJkZXNMYW5lSHdOdW0gPSBtdkh3c0dldFBoeXNpY2FsU2VyZGVzTnVtKHNlcmRlc0lkeCk7CiAKLQkJbGFuZURhdGEgPSBtdkh3c1NlcmRlc0dldFBoeVNlbGVjdG9yVmFsKHNlcmRlc0xhbmVId051bSwgc2VyZGVzVHlwZSk7CisgICAgICAgIGlmICgoKGRldklkID09IE1WXzY4MTApIHx8IChkZXZJZCA9PSBNVl82ODExKSkgJiYKKyAgICAgICAgICAgKChzZXJkZXNNb2RlID09IFBFWF9FTkRfUE9JTlRfeDQpIHx8IChzZXJkZXNNb2RlID09IFBFWF9ST09UX0NPTVBMRVhfeDQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgbXZQcmludGYoIiVzOiBXYXJuaW5nOiBQQ0llWDQgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZGV2aWNlIFxuIixfX2Z1bmNfXyk7CisJCQlzZXJkZXNDb25maWdNYXBbc2VyZGVzSWR4XS5zZXJkZXNUeXBlID0gREVGQVVMVF9TRVJERVM7CisgICAgICAgIH0KIAogCQlpZihzZXJkZXNUeXBlID09IERFRkFVTFRfU0VSREVTKSB7CiAJCQljb250aW51ZTsKIAkJfQotCQlpZiAobXZId3NTZXJkZXNUb3BvbG9neVZlcmlmeShzZXJkZXNUeXBlLHNlcmRlc0lkeCxzZXJkZXNNb2RlKSAhPSBNVl9PSyl7CisgICAgICAgIGxhbmVEYXRhID0gbXZId3NTZXJkZXNHZXRQaHlTZWxlY3RvclZhbChzZXJkZXNMYW5lSHdOdW0sIHNlcmRlc1R5cGUpOworCisgICAgICAgIGlmIChtdkh3c1NlcmRlc1RvcG9sb2d5VmVyaWZ5KHNlcmRlc1R5cGUsc2VyZGVzSWR4LHNlcmRlc01vZGUpICE9IE1WX09LKXsKIAkJCXNlcmRlc0NvbmZpZ01hcFtzZXJkZXNJZHhdLnNlcmRlc1R5cGUgPSBERUZBVUxUX1NFUkRFUzsKIAkJCW12UHJpbnRmKCIlczogU2VyRGVzIGxhbmUgIyVkIGlzICBkaXNhYmxlZFxuIixfX2Z1bmNfXywgc2VyZGVzTGFuZUh3TnVtKTsKIAkJCXVwZGF0ZWRUb3BvbG9neVByaW50ID0gTVZfVFJVRTsKQEAgLTE2NzksOCArMTg1OCw4IEBACiAJCX0KIAkJLyogQ2hlY2tpbmcgaWYgdGhlIGJvYXJkIHRvcG9sb2d5IGNvbmZpZ3VyYXRpb24gaW5jbHVkZXMgUEVYeDQgLSBmb3IgdGhlIG5leHQgc3RlcCAqLwogCQlpZiAoKHNlcmRlc01vZGUgPT0gUEVYX0VORF9QT0lOVF94NCkgfHwgKHNlcmRlc01vZGUgPT0gUEVYX1JPT1RfQ09NUExFWF94NCkpIHsKLSAgICAgICAgICAgIC8qIHVwZGF0ZSBsYW5lIGRhdGEgdG8gdGhlIDMgbmV4dCBTRVJERVMgbGFuZXMgKi8KLSAgICAgICAgICAgIGxhbmVEYXRhID0gY29tbW9uUGh5c1NlbGVjdG9yc1BleEJ5NExhbmVzW3NlcmRlc0xhbmVId051bV07CisJCQkgLyogdXBkYXRlIGxhbmUgZGF0YSB0byB0aGUgMyBuZXh0IFNFUkRFUyBsYW5lcyAqLworCQkJbGFuZURhdGEgPSBjb21tb25QaHlzU2VsZWN0b3JzUGV4Qnk0TGFuZXNbc2VyZGVzTGFuZUh3TnVtXTsKIAkJCWlmIChzZXJkZXNUeXBlID09IFBFWDApIHsKIAkJCQlpc1BFWHg0ID0gTVZfVFJVRTsKIAkJCX0KQEAgLTE2OTYsNyArMTg3NSw5IEBACiAJCS8qIFVwZGF0aW5nIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSB3cml0dGVuIHRvIENPTU1PTl9QSFlTX1NFTEVDVE9SU19SRUcgKi8KIAkJcmVnRGF0YSB8PSAobGFuZURhdGEgPDwgKHNlbGVjdEJpdE9mZiAqIHNlcmRlc0xhbmVId051bSkpOwogCX0KLQorCS8qIGNoZWNrIHRoYXQgbnVtYmVyIG9mIHVzZWQgbGFuZXMgZm9yIFBFWHg0IGlmIHVzZWQgaXMgcmlnaHQgKi8KKwlpZiAoaXNQRVh4NCkKKwkJbXZId3NTZXJkZXNQQ0lYNFRvcG9sb2d5VmVyaWZ5KCk7CiAJLyogY2hlY2sgdGhhdCBudW1iZXIgb2YgdXNlZCBsYW5lcyBmb3IgWEFVSSBhbmQgUlhBVUkgKGlmIHVzZWQpIGlzIHJpZ2h0ICovCiAJbXZId3NTZXJkZXNYQVVJVG9wb2xvZ3lWZXJpZnkoKTsKIApAQCAtMTc5MCw3ICsxOTcxLDEwIEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAjaWZkZWYgTVY4OEY2OVhYCi0JY2FzZSBTR01JSTM6CisJY2FzZSBTR01JSXYzXzA6CisJY2FzZSBTR01JSXYzXzE6CisgICAgICAgIGNhc2UgU0dNSUl2M18yOgorCWNhc2UgU0dNSUl2M18zOgogCWNhc2UgWEFVSToKIAljYXNlIFJYQVVJOgogICAgICAgICBpZiAocmVmQ2xvY2sgPT0gUkVGX0NMT0NLX18yNU1IeikgewpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZEVudlNwZWMuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRFbnZTcGVjLmgKaW5kZXggNzY4YWRmNy4uMTQyMzgwNyAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZEVudlNwZWMuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkRW52U3BlYy5oCkBAIC0xMTcsNyArMTE3LDEwIEBACiAJVVNCM19IT1NUMCwKIAlVU0IzX0hPU1QxLAogCVVTQjNfREVWSUNFLAotCVNHTUlJMywKKwlTR01JSXYzXzAsCisJU0dNSUl2M18xLAorCVNHTUlJdjNfMiwKKwlTR01JSXYzXzMsCiAJWEFVSSwKIAlSWEFVSSwKIAlERUZBVUxUX1NFUkRFUywKQEAgLTYwMSw0ICs2MDQsMTMgQEAKICogUkVUVVJOUzogICAgICAgICAgICAgIFRydWUgaWYgbGFuZSBpcyBhY3RpdmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX0JPT0wgbXZId3NJc1NlcmRlc0FjdGl2ZShNVl9VOCBsYW5lTnVtKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHVwZGF0ZVVzYjNEZXZpY2VDb25maWcKKyogREVTQ1JJUFRJT046IFVwZGF0ZSBVU0IzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaWYgVVNCMyBkZXZpY2UgaXMgZW5hYmxlZAorKiBJTlBVVDoKKyoJdG9wb2xvZ3lDb25maWdQdHIgLSBwb2ludGVyIHRvIHRoZSBTZXJkZXMgbWFwcGluZworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB1cGRhdGVVc2IzRGV2aWNlQ29uZmlnKFNFUkRFU19NQVAgKnNlcmRlc01hcEFycmF5KTsKICNlbmRpZiAvKiBfTVZfSElHSFNQRUVEX0VOVl9TUEVDX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRUb3BvbG9neVNwZWMtMzh4LmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkVG9wb2xvZ3lTcGVjLTM4eC5jCmluZGV4IDg1OTY2ZjcuLmMyNjcyMTkgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRUb3BvbG9neVNwZWMtMzh4LmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZFRvcG9sb2d5U3BlYy0zOHguYwpAQCAtOTQsNiArOTQsMTQgQEAKIAl7IFNBVEEyLAkJX18zR2JwcywJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAogCXsgVVNCM19IT1NUMSwJX181R2JwcywJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9CiB9LAorewkvKiBTb2xpZFJ1biBDbGVhckZvZy1BMSBSRVYyLjAgVG9wb2xvZ3kgKi8KKwl7IFNBVEEwLAlfXzNHYnBzLAlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBTR01JSTEsCV9fMV8yNUdicHMsCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKwl7IFBFWDEsCSAgCV9fNUdicHMsCVBFWF9ST09UX0NPTVBMRVhfeDEsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKwl7IFVTQjNfSE9TVDEsCV9fNUdicHMsCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKwl7IFBFWDIsCSAgCV9fNUdicHMsCVBFWF9ST09UX0NPTVBMRVhfeDEsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKwl7IFNHTUlJMiwJX18xXzI1R2JwcywJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9Cit9LAogewogCS8qIEdGQ0gxMDAgVG9wb2xvZ3kgKi8KIAl7IFNHTUlJMCwJCV9fMV8yNUdicHMsCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKQEAgLTEyNiw2ICsxMzQsNyBAQAogCQlzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zd2FwVHggICAgICA9ICBDdXN0b21lckJvYXJkVG9wb2xvZ3lDb25maWdbYm9hcmRJZEluZGV4XVtsYW5lTnVtXS5zd2FwVHg7CiAJfQogCisJdXBkYXRlVXNiM0RldmljZUNvbmZpZyhzZXJkZXNNYXBBcnJheSk7CiAJcmV0dXJuIE1WX09LOwogfQogCkBAIC0xMzcsNiArMTQ2LDcgQEAKIHsKIAlsb2FkVG9wb2xvZ3lDdXN0b21lciwgICAJICAvKiBDdXN0b21lciBCb2FyZCAwICovCiAJbG9hZFRvcG9sb2d5Q3VzdG9tZXIsICAgCSAgLyogQ3VzdG9tZXIgQm9hcmQgMSovCisJbG9hZFRvcG9sb2d5Q3VzdG9tZXIsICAgCSAgLyogU29saWRSdW4gQ2xlYXJGb2cgQm9hcmQgKi8KIAlsb2FkVG9wb2xvZ3lDdXN0b21lciwgICAJICAvKiBHRkNIMTAwICovCiB9OwogCkBAIC0yNjIsNTIgKzI3Miw1MiBAQAogLyogQ29uZmlndXJhdGlvbiBvcHRpb25zICovCiBTRVJERVNfTUFQIERiQ29uZmlnRGVmYXVsdFtNQVhfU0VSREVTX0xBTkVTXSA9CiB7Ci0JeyBTQVRBMCwJIF9fM0dicHMsICAgCSAgIFNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLQl7IFBFWDAsIAkgX181R2JwcywgICAJICAgUEVYX1JPT1RfQ09NUExFWF94MSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgUEVYMSwgCSBfXzVHYnBzLCAgIAkgICBQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBTQVRBMywJIF9fM0dicHMsICAgCSAgIFNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLQl7IFVTQjNfSE9TVDAsIF9fNUdicHMsICAJICAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgVVNCM19IT1NUMSwgX181R2JwcywgIAkgICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0KKwl7IFNBVEEwLAlfXzNHYnBzLCAgIAkgICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBQRVgwLCAJX181R2JwcywgICAJICAgUEVYX1JPT1RfQ09NUExFWF94MSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgUEVYMSwgCV9fNUdicHMsICAgCSAgIFBFWF9ST09UX0NPTVBMRVhfeDEsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKwl7IFNBVEEzLAlfXzNHYnBzLCAgIAkgICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBVU0IzX0hPU1QwLAlfXzVHYnBzLCAgCSAgIFNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKwl7IFVTQjNfSE9TVDEsCV9fNUdicHMsICAJICAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9CiB9OwogCiBTRVJERVNfTUFQIERiQ29uZmlnU0xNMTM2M19DW01BWF9TRVJERVNfTEFORVNdID0KIHsKIAl7IFBFWDAsIAkgCSBfXzVHYnBzLCAgCQkJCVBFWF9ST09UX0NPTVBMRVhfeDEsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLQl7IERFRkFVTFRfU0VSREVTLCBMQVNUX1NFUkRFU19TUEVFRCwJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgREVGQVVMVF9TRVJERVMsCUxBU1RfU0VSREVTX1NQRUVELAkJCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIAl7IFBFWDEsIAkgIAlfXzVHYnBzLCAgCQkJCVBFWF9ST09UX0NPTVBMRVhfeDEsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIAl7IFBFWDMsIAkgIAlfXzVHYnBzLCAgCQkJCVBFWF9ST09UX0NPTVBMRVhfeDEsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIAl7IFNBVEEyLAkgIAlfXzNHYnBzLCAgCQkJCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLQl7IERFRkFVTFRfU0VSREVTLCBMQVNUX1NFUkRFU19TUEVFRCwJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgREVGQVVMVF9TRVJERVMsCUxBU1RfU0VSREVTX1NQRUVELAkJCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIH07CiAKIFNFUkRFU19NQVAgRGJDb25maWdTTE0xMzYzX0RbTUFYX1NFUkRFU19MQU5FU10gPQogewogCXsgUEVYMCwgCSAgX181R2JwcywgIAlQRVhfUk9PVF9DT01QTEVYX3g0LAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBQRVgxLCAJICBfXzVHYnBzLCAgCVBFWF9ST09UX0NPTVBMRVhfeDQsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLQl7IFBFWDIsIAkgIF9fNUdicHMsICAJUEVYX1JPT1RfQ09NUExFWF94NCwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgUEVYMywgCSAgX181R2JwcywgIAlQRVhfUk9PVF9DT01QTEVYX3g0LAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBVU0IzX0hPU1QwLCBfXzVHYnBzLAkJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgVVNCM19IT1NUMSwgX181R2JwcywJCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfQorCXsgUEVYMCwgCSAgX181R2JwcywgIAlQRVhfUk9PVF9DT01QTEVYX3g0LAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBQRVgwLCAJICBfXzVHYnBzLCAgCVBFWF9ST09UX0NPTVBMRVhfeDQsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKwl7IFBFWDAsIAkgIF9fNUdicHMsICAJUEVYX1JPT1RfQ09NUExFWF94NCwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgVVNCM19IT1NUMCwJICBfXzVHYnBzLAlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBVU0IzX0hPU1QxLAkgIF9fNUdicHMsCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfQogfTsKIAogU0VSREVTX01BUCBEYkNvbmZpZ1NMTTEzNjNfRVtNQVhfU0VSREVTX0xBTkVTXSA9CiB7CiAJeyBQRVgwLCAJICAJCV9fNUdicHMsICAJCQlQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBVU0IzX0hPU1QwLCAgIAlfXzVHYnBzLCAgCQkJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgVVNCM19IT1NUMCwJCSAgCV9fNUdicHMsICAJCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAJeyBTQVRBMSwJICAJCV9fM0dicHMsICAJCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBVU0IzX0hPU1QxLCAgICAgCV9fNUdicHMsICAJCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBERUZBVUxUX1NFUkRFUywgCUxBU1RfU0VSREVTX1NQRUVELAlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBVU0IzX0hPU1QxLAkJCV9fNUdicHMsICAJCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBERUZBVUxUX1NFUkRFUywgCQlMQVNUX1NFUkRFU19TUEVFRCwJCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIAl7IFNBVEEyLAkgIAkJX18zR2JwcywgIAkJCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfQogfTsKIAogU0VSREVTX01BUCBEYkNvbmZpZ1NMTTEzNjNfRltNQVhfU0VSREVTX0xBTkVTXSA9CiB7CiAJeyBQRVgwLCAJICAJCV9fNUdicHMsICAJCQlQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBERUZBVUxUX1NFUkRFUywgCUxBU1RfU0VSREVTX1NQRUVELAlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBERUZBVUxUX1NFUkRFUywgCQlMQVNUX1NFUkRFU19TUEVFRCwJCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIAl7IFBFWDEsIAkgIAkJX181R2JwcywgIAkJCVBFWF9ST09UX0NPTVBMRVhfeDEsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIAl7IFBFWDMsIAkgIAkJX181R2JwcywgIAkJCVBFWF9ST09UX0NPTVBMRVhfeDEsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIAl7IFNBVEEyLAkgIAkgCV9fM0dicHMsICAJCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBVU0IzX0hPU1QxLCAgICAgICBfXzVHYnBzLCAgCQkJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9CisJeyBVU0IzX0hPU1QxLAkJCV9fNUdicHMsICAJCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0KIH07CiAKIFNFUkRFU19NQVAgRGJDb25maWdTTE0xMzY0X0RbTUFYX1NFUkRFU19MQU5FU10gPQpAQCAtMzI3LDE3ICszMzcsMTcgQEAKIAl7IERFRkFVTFRfU0VSREVTLCAJTEFTVF9TRVJERVNfU1BFRUQsCSAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAogCXsgU0dNSUkyLCAgICAgCQlfXzNfMTI1R2JwcywgIAkgIAkgIFNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIAl7IERFRkFVTFRfU0VSREVTLCAJTEFTVF9TRVJERVNfU1BFRUQsCSAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgUEVYMiwgCSAgCQlfXzVHYnBzLCAgCSAgCQkgIFBFWF9ST09UX0NPTVBMRVhfeDEsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfQorCXsgUEVYMiwgCSAgCV9fNUdicHMsICAJCSAgUEVYX1JPT1RfQ09NUExFWF94MSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9CiB9OwogCiBTRVJERVNfTUFQIERiQ29uZmlnU0xNMTM2NF9GW01BWF9TRVJERVNfTEFORVNdID0KIHsKLQl7IFNHTUlJMCwJIAkJIF9fM18xMjVHYnBzLAkJICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBTR01JSTAsCSAJX18zXzEyNUdicHMsCQkgIFNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIAl7IERFRkFVTFRfU0VSREVTLCAJTEFTVF9TRVJERVNfU1BFRUQsCSAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgU0dNSUkxLAkgIAkJX18zXzEyNUdicHMsCQkgIFNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLQl7IFNHTUlJMiwJICAJCV9fM18xMjVHYnBzLAkJICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBTR01JSTEsCSAgCV9fM18xMjVHYnBzLAkJICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBTR01JSTIsCSAgCV9fM18xMjVHYnBzLAkJICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAJeyBERUZBVUxUX1NFUkRFUywgCUxBU1RfU0VSREVTX1NQRUVELAkgIFNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLQl7IFBFWDIsCQkgIAkJX181R2JwcywJCSAgCSAgUEVYX1JPT1RfQ09NUExFWF94MSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9CisJeyBQRVgyLAkJICAJX181R2JwcywJICAJICBQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQwNyw5ICs0MTcsOSBAQAogU0VSREVTX01BUCBEYkFtY0NvbmZpZ0RlZmF1bHRbTUFYX1NFUkRFU19MQU5FU10gPQogewogLyogMCAqLyB7IFBFWDAsIAkJX181R2JwcywJCVBFWF9ST09UX0NPTVBMRVhfeDQsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLS8qIDEgKi8geyBQRVgxLCAJCV9fNUdicHMsCQlQRVhfUk9PVF9DT01QTEVYX3g0LAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0vKiAyICovIHsgUEVYMiwgCQlfXzVHYnBzLAkJUEVYX1JPT1RfQ09NUExFWF94NCwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotLyogMyAqLyB7IFBFWDMsIAkJX181R2JwcywJCVBFWF9ST09UX0NPTVBMRVhfeDQsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKy8qIDEgKi8geyBQRVgwLCAJCV9fNUdicHMsCQlQRVhfUk9PVF9DT01QTEVYX3g0LAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisvKiAyICovIHsgUEVYMCwgCQlfXzVHYnBzLAkJUEVYX1JPT1RfQ09NUExFWF94NCwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorLyogMyAqLyB7IFBFWDAsIAkJX181R2JwcywJCVBFWF9ST09UX0NPTVBMRVhfeDQsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIC8qIDQgKi8geyBTR01JSTEsCQlfXzNfMTI1R2JwcywJCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIC8qIDUgKi8geyBTR01JSTIsCQlfXzNfMTI1R2JwcywJCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIH07CkBAIC03MTUsOCArNzI1LDY4IEBACiAJTVZfVTMyIERldklkID0gbXZTeXNFbnZEZXZpY2VJZEdldCgpOwogCU1WX1UzMiBCb2FyZElkID0gbXZCb2FyZElkR2V0KCk7CiAKKwlpZiAoQm9hcmRJZCA9PSBEQl9CUF82ODIxX0lEKSB7CisJCXN3aXRjaCAodG9wb2xvZ3lNb2RlKSB7CisJCWNhc2UgREJfMzgxX0NPTkZJR19ERUZBVUxUOgorCQkJaWYgKERldklkICE9IE1WXzZXMjIpCisJCQkJcmV0dXJuIE1WX09LOworCQkJLyogREItODhGNjgyMS1CUCBvbiA2VzIyOiBpZiBsYW5lMSBpcyBTQVRBMCBvciBTR01JSS0xIG9yIFFTR01JSSBzZXQgdG8gZGVmYXVsdCAqLworCQkJLyogLS0+IGRldmljZSBvbmx5IHN1cHBvcnRzIDEgU0FUQSwgMSBTR01JSSBhbmQgbm8gUVNHTUlJIGludGVyZmFjZSAqLworCQkJaWYgKHRvcG9sb2d5Q29uZmlnUHRyWzFdLnNlcmRlc1R5cGUgPT0gU0dNSUkxKSB7CisJCQkJbXZQcmludGYoIkRldmljZSA2VzIyIHN1cHBvcnRzIG9ubHkgb25lIFNHTUlJIGludGVyZmFjZTogU0dNSUktMSBAIGxhbmUxIGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0clsxXSA9IERlZmF1bHRMYW5lOworCQkJfSBlbHNlIGlmICAodG9wb2xvZ3lDb25maWdQdHJbMV0uc2VyZGVzVHlwZSA9PSBRU0dNSUkpIHsKKwkJCQltdlByaW50ZigiRGV2aWNlIDZXMjIgZG9lcyBub3Qgc3VwcG9ydCBRU0dNSUkgaW50ZXJmYWNlOiBRU0dNSUkgQCBsYW5lMSBkaXNhYmxlZFxuIik7CisJCQkJdG9wb2xvZ3lDb25maWdQdHJbMV0gPSBEZWZhdWx0TGFuZTsKKwkJCX0KKwkJCS8qIERCLTg4RjY4MjEtQlAgb24gNlcyMjogaWYgbGFuZTEgaXMgU0FUQTEgb3IgU0dNSUktMSBvciBRU0dNSUkgc2V0IHRvIGRlZmF1bHQgKi8KKwkJCS8qIC0tPiBkZXZpY2Ugb25seSBzdXBwb3J0cyAxIFNBVEEgYW5kIDEgU0dNSUkgaW50ZXJmYWNlICovCisJCQlpZiAodG9wb2xvZ3lDb25maWdQdHJbMl0uc2VyZGVzVHlwZSA9PSBTQVRBMSkgeworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMiBzdXBwb3J0cyBvbmx5IG9uZSBTQVRBICIpOworCQkJCW12UHJpbnRmKCJpbnRlcmZhY2U6IFNBVEEgUG9ydCAxIEAgbGFuZTIgZGlzYWJsZWRcbiIpOworCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzJdID0gRGVmYXVsdExhbmU7CisJCQl9IGVsc2UgaWYgKHRvcG9sb2d5Q29uZmlnUHRyWzJdLnNlcmRlc1R5cGUgPT0gU0dNSUkxKSB7CisJCQkJbXZQcmludGYoIkRldmljZSA2VzIyIHN1cHBvcnRzIG9ubHkgb25lIFNHTUlJICIpOworCQkJCW12UHJpbnRmKCJpbnRlcmZhY2U6IFNHTUlJLTEgQCBsYW5lMiBkaXNhYmxlZFxuIik7CisJCQkJdG9wb2xvZ3lDb25maWdQdHJbMl0gPSBEZWZhdWx0TGFuZTsKKwkJCX0KKwkJCS8qIERCLTg4RjY4MjEtQlA6IGRlZmF1bHQgZm9yIExhbmUzPVVTQjNfSE9TVDEgLS0+IDZXMjIgc3VwcG9ydHMgb25seSBvbmUgVVNCMyBIb3N0Ki8KKwkJCS8qIC0tPiBkZXZpY2Ugb25seSBzdXBwb3J0cyAxIFNBVEEsIFNHTUlJIGFuZCBubyBRU0dNSUkgaW50ZXJmYWNlICovCisJCQltdlByaW50ZigiRGV2aWNlIDZXMjIgc3VwcG9ydHMgb25seSBvbmUgVVNCMyBIb3N0IGludGVyZmFjZTogVVNCMyBQb3J0IDEgQCBsYW5lMyBkaXNhYmxlZFxuIik7CisJCQl0b3BvbG9neUNvbmZpZ1B0clszXSA9IERlZmF1bHRMYW5lOworCQkJYnJlYWs7CisJCWNhc2UgREJfQ09ORklHX1NMTTE0Mjc6CisJCQkvKiBEQi04OEY2ODIxLUJQIG9uIDZXMjI6IGRlZmF1bHQgZm9yIExhbmUyPVNBVEExLExhbmUzPVVTQjNfSE9TVDEgKi8KKwkJCS8qIC0tPiBkZXZpY2Ugc3VwcG9ydHMgb25seSAxIFNBVEEgYW5kIDEgVVNCMyBpbnRlcmZhY2UgKi8KKwkJCWlmIChEZXZJZCA9PSBNVl82VzIyKSB7CisJCQkJbXZQcmludGYoIkRldmljZSA2VzIyIHN1cHBvcnRzIG9ubHkgb25lIFNBVEEgIik7CisJCQkJbXZQcmludGYoImludGVyZmFjZTogU0FUQSBQb3J0IDEgQCBsYW5lMiBkaXNhYmxlZFxuIik7CisJCQkJdG9wb2xvZ3lDb25maWdQdHJbMl0gPSBEZWZhdWx0TGFuZTsKKwkJCQltdlByaW50ZigiRGV2aWNlIDZXMjIgc3VwcG9ydHMgb25seSBvbmUgVVNCMyAiKTsKKwkJCQltdlByaW50ZigiaW50ZXJmYWNlOiBVU0IzIFBvcnQgMSBAIGxhbmUzIGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0clszXSA9IERlZmF1bHRMYW5lOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgREJfQ09ORklHX1NMTTE0MjY6CisJCQkvKiBEQi04OEY2ODIxLUJQIG9uIDZXMjI6IGRlZmF1bHQgZm9yIExhbmUyPVNBVEExLExhbmUzPVNHTUlJLTIgKi8KKwkJCS8qIC0tPiBkZXZpY2Ugc3VwcG9ydHMgb25seSAxIFNBVEEgYW5kIDEgU0dNSUkgaW50ZXJmYWNlICovCisJCQlpZiAoRGV2SWQgPT0gTVZfNlcyMikgeworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMiBzdXBwb3J0cyBvbmx5IG9uZSBTQVRBICIpOworCQkJCW12UHJpbnRmKCJpbnRlcmZhY2U6IFNBVEEgUG9ydCAxIEAgbGFuZTIgZGlzYWJsZWRcbiIpOworCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzJdID0gRGVmYXVsdExhbmU7CisJCQkJbXZQcmludGYoIkRldmljZSA2VzIyIHN1cHBvcnRzIG9ubHkgb25lIFNHTUlJICIpOworCQkJCW12UHJpbnRmKCJpbnRlcmZhY2U6IFNHTUlJLTIgQCBsYW5lMyBkaXNhYmxlZFxuIik7CisJCQkJdG9wb2xvZ3lDb25maWdQdHJbM10gPSBEZWZhdWx0TGFuZTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIE1WX09LOworCX0KIAlzd2l0Y2godG9wb2xvZ3lNb2RlKSB7CiAJY2FzZSBEQl9DT05GSUdfREVGQVVMVDoKKwkvKiB1cGRhdGUgZm9yIERCLUdQLCBEQi1BUCwgREItQU1DLCBBbmQgZm9yIERCIHdpdGggZGVmYXVsdCB0b3BvbG9neSAqLwogCQlzd2l0Y2goRGV2SWQpIHsKIAkJY2FzZSBNVl82ODEwOgogCQkJLyogREItQVAgOiBkZWZhdWx0IGZvciBMYW5lMz1TR01JSTIgLS0+IDY4MTAgc3VwcG9ydHMgb25seSAyIFNHTUlJIGludGVyZmFjZXM6IGxhbmUgMyBkaXNhYmxlZCAqLwpAQCAtNzQxLDExICs4MTEsODIgQEAKIAkJCQl0b3BvbG9neUNvbmZpZ1B0cls0XSA9IERlZmF1bHRMYW5lOwogCQkJfQogCQkJYnJlYWs7CisJCWNhc2UgTVZfNlcyMzoKKwkJCWlmIChCb2FyZElkID09IERCX0dQXzY4WFhfSUQpIHsKKwkJCQkvKiBEQi1HUCBvbiA2VzIzOiBpZiBsYW5lIDIgY2hhbmdlZCB0byBTQVRBMSBieSBTYXRSIGNoYW5nZSB0byBkZWZhdWx0CisJCQkJICogLS0+IDZXMjMgc3VwcG9ydHMgb25seSBvbmUgU0FUQSBpbnRlcmZhY2UgKi8KKwkJCQlpZiAodG9wb2xvZ3lDb25maWdQdHJbMl0uc2VyZGVzVHlwZSA9PSBTQVRBMSkgeworCQkJCQltdlByaW50ZigiRGV2aWNlIDZXMjMgc3VwcG9ydHMgb25seSBvbmUgIik7CisJCQkJCW12UHJpbnRmKCJTQVRBIGludGVyZmFjZTogU0FUQSBQb3J0IDEgQCBsYW5lMiBkaXNhYmxlZFxuIik7CisJCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzJdID0gRGVmYXVsdExhbmU7CisJCQkJfQorCQkJCS8qIERCLUdQIG9uIDZXMjM6IGRlZmF1bHQgZm9yIExhbmUzPVNBVEEzLExhbmU0PVNBVEEyIC0tPgorCQkJCSAqIDZXMjMgc3VwcG9ydHMgb25seSAxIFNBVEEgaW50ZXJmYWNlICovCisJCQkJLyogZGVmYXVsdCBmb3IgTGFuZTU9VVNCM19IT1NUMSAtLT4gNlcyMyBzdXBwb3J0IG9ubHkgNCBTZXJEZXMgbGFuZXMgKi8KKwkJCQltdlByaW50ZigiRGV2aWNlIDZXMjMgc3VwcG9ydHMgb25seSBvbmUgU0FUQSBpbnRlcmZhY2U6IFNBVEEgIik7CisJCQkJbXZQcmludGYoIlBvcnQgMyBAIGxhbmUzIGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0clszXSA9IERlZmF1bHRMYW5lOworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMyBzdXBwb3J0cyBvbmx5IG9uZSBTQVRBIGludGVyZmFjZTogU0FUQSAiKTsKKwkJCQltdlByaW50ZigiUG9ydCAyIEAgbGFuZTQgZGlzYWJsZWRcbiIpOworCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzRdID0gRGVmYXVsdExhbmU7CisJCQkJbXZQcmludGYoIkRldmljZSA2VzIzIHN1cHBvcnRzIG9ubHkgNCBTZXJEZXMgbGFuZXM6IFVTQjMtSG9zdCAiKTsKKwkJCQltdlByaW50ZigiUG9ydCAxIEAgbGFuZTUgZGlzYWJsZWRcbiIpOworCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzVdID0gRGVmYXVsdExhbmU7CisJCQl9IGVsc2UgaWYgKEJvYXJkSWQgPT0gREJfNjhYWF9JRCkgeworCQkJCS8qIERCLUJQIG9uIDZXMjM6IGlmIGxhbmUgaXMgU0dNSUktMSBvciBRU0dNSUkgc2V0IHRvIGRlZmF1bHQgKi8KKwkJCQkvKiAtLT4gZGV2aWNlIG9ubHkgc3VwcG9ydHMgMSBTR01JSSBhbmQgbm8gUVNHTUlJIGludGVyZmFjZSAqLworCQkJCWlmICh0b3BvbG9neUNvbmZpZ1B0clsxXS5zZXJkZXNUeXBlID09IFNHTUlJMSkgeworCQkJCQltdlByaW50ZigiRGV2aWNlIDZXMjMgc3VwcG9ydHMgb25seSBvbmUgU0dNSUkgIik7CisJCQkJCW12UHJpbnRmKCJpbnRlcmZhY2U6IFNHTUlJLTEgQCBsYW5lMSBkaXNhYmxlZFxuIik7CisJCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzFdID0gRGVmYXVsdExhbmU7CisJCQkJfSBlbHNlIGlmICAodG9wb2xvZ3lDb25maWdQdHJbMV0uc2VyZGVzVHlwZSA9PSBRU0dNSUkpIHsKKwkJCQkJbXZQcmludGYoIkRldmljZSA2VzIzIGRvZXMgbm90IHN1cHBvcnQgUVNHTUlJICIpOworCQkJCQltdlByaW50ZigiaW50ZXJmYWNlOiBRU0dNSUkgQCBsYW5lMSBkaXNhYmxlZFxuIik7CisJCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzFdID0gRGVmYXVsdExhbmU7CisJCQkJfQorCQkJCS8qIERCLUJQIG9uIDZXMjM6IGlmIGxhbmUxIGlzIFNBVEExIG9yIFNHTUlJLTEgb3IgUVNHTUlJIHNldCB0byBkZWZhdWx0ICovCisJCQkJLyogLS0+IGRldmljZSBvbmx5IHN1cHBvcnRzIDEgU0FUQSBhbmQgMSBTR01JSSBpbnRlcmZhY2UgKi8KKwkJCQlpZiAodG9wb2xvZ3lDb25maWdQdHJbMl0uc2VyZGVzVHlwZSA9PSBTQVRBMSkgeworCQkJCQltdlByaW50ZigiRGV2aWNlIDZXMjMgc3VwcG9ydHMgb25seSBvbmUgU0FUQSAiKTsKKwkJCQkJbXZQcmludGYoImludGVyZmFjZTogU0FUQSBQb3J0IDEgQCBsYW5lMiBkaXNhYmxlZFxuIik7CisJCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzJdID0gRGVmYXVsdExhbmU7CisJCQkJfSBlbHNlIGlmICh0b3BvbG9neUNvbmZpZ1B0clsyXS5zZXJkZXNUeXBlID09IFNHTUlJMSkgeworCQkJCQltdlByaW50ZigiRGV2aWNlIDZXMjMgc3VwcG9ydHMgb25seSBvbmUgU0dNSUkgIik7CisJCQkJCW12UHJpbnRmKCJpbnRlcmZhY2U6IFNHTUlJLTEgQCBsYW5lMiBkaXNhYmxlZFxuIik7CisJCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzJdID0gRGVmYXVsdExhbmU7CisJCQkJfQorCQkJCS8qIERCLUdQIG9uIDZXMjM6IGRlZmF1bHQgdG8gTGFuZTM9U0FUQTMKKwkJCQkgKiAtLT4gNlcyMyBzdXBwb3J0cyBvbmx5IG9uZSBTQVRBIGludGVyZmFjZSAqLworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMyBzdXBwb3J0cyBvbmx5IG9uZSAiKTsKKwkJCQltdlByaW50ZigiU0FUQSBpbnRlcmZhY2U6IFNBVEEgUG9ydCAzIEAgbGFuZTMgZGlzYWJsZWRcbiIpOworCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzNdID0gRGVmYXVsdExhbmU7CisJCQkJLyogZGVmYXVsdCBmb3IgTGFuZTQ9VVNCM19IT1NUMCxMYW5lNT1VU0IzX0hPU1QxCisJCQkJICogLS0+IDZXMjMgc3VwcG9ydCBvbmx5IDQgU2VyRGVzIGxhbmVzICovCisJCQkJbXZQcmludGYoIkRldmljZSA2VzIzIHN1cHBvcnRzIG9ubHkgNCBTZXJEZXMgbGFuZXM6IFVTQjMtSG9zdCAiKTsKKwkJCQltdlByaW50ZigiUG9ydCAwIEAgbGFuZTQgZGlzYWJsZWRcbiIpOworCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzRdID0gRGVmYXVsdExhbmU7CisJCQkJbXZQcmludGYoIkRldmljZSA2VzIzIHN1cHBvcnRzIG9ubHkgNCBTZXJEZXMgbGFuZXM6IFVTQjMtSG9zdCAiKTsKKwkJCQltdlByaW50ZigiUG9ydCAxIEAgbGFuZTUgZGlzYWJsZWRcbiIpOworCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzVdID0gRGVmYXVsdExhbmU7CisJCQl9IGVsc2UgaWYgKEJvYXJkSWQgPT0gREJfQVBfNjhYWF9JRCkgeworCQkJCS8qIERCLUFQIG9uIDZXMjM6IGRlZmF1bHQgZm9yIExhbmUxPVNHTUlJLTEsIExhbmUzPVNHTUlJLTIgKi8KKwkJCQkvKiAtLT4gZGV2aWNlIG9ubHkgc3VwcG9ydHMgMSBTR01JSSBpbnRlcmZhY2UgKi8KKwkJCQltdlByaW50ZigiRGV2aWNlIDZXMjMgc3VwcG9ydHMgb25seSBvbmUgU0dNSUkgaW50ZXJmYWNlOiBTR01JSS0xIEAgbGFuZTEgZGlzYWJsZWRcbiIpOworCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzFdID0gRGVmYXVsdExhbmU7CisJCQkJbXZQcmludGYoIkRldmljZSA2VzIzIHN1cHBvcnRzIG9ubHkgb25lIFNHTUlJIGludGVyZmFjZTogU0dNSUktMiBAIGxhbmUzIGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0clszXSA9IERlZmF1bHRMYW5lOworCQkJCS8qIGRlZmF1bHQgZm9yIExhbmU0PVVTQjNfSE9TVDAsTGFuZTU9UEVYMgorCQkJCSAqIC0tPiA2VzIzIHN1cHBvcnQgb25seSA0IFNlckRlcyBsYW5lcyAqLworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMyBzdXBwb3J0cyBvbmx5IDQgU2VyRGVzIGxhbmVzOiAiKTsKKwkJCQltdlByaW50ZigiVVNCMy1Ib3N0IFBvcnQgMCBAIGxhbmU0IGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0cls0XSA9IERlZmF1bHRMYW5lOworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMyBzdXBwb3J0cyBvbmx5IDQgU2VyRGVzIGxhbmVzOiAgUG9ydCAxIEAgbGFuZTUgZGlzYWJsZWRcbiIpOworCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzVdID0gRGVmYXVsdExhbmU7CisJCQl9CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKLQogCWRlZmF1bHQ6CiAJCW12UHJpbnRmKCJtdlN5c0VudlVwZGF0ZURldmljZVRvcGxvZ3k6IHNlbGVjdGVkIHRvcG9sb2d5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyByb3V0aW5lXG4iKTsKIAkJYnJlYWs7CkBAIC03NjcsMTQgKzkwOCwxNyBAQAogCS8qIEdldHRpbmcgdGhlIHJlbGV2YW50IHRvcG9sb2d5IG1vZGUgKGluZGV4KSAqLwogCXRvcG9sb2d5TW9kZSA9IHRvcG9sb2d5Q29uZmlnREIzODFNb2RlR2V0KCk7CiAJdG9wb2xvZ3lDb25maWdQdHIgPSB0b3BvbG9neUNvbmZpZ0RCMzgxW3RvcG9sb2d5TW9kZV07Ci0KKwkvKiBpZiBub3QgZGV0ZWN0ZWQgYW55IFNlckRlcyBTaXRlIG1vZHVsZSwgcmVhZCAnU2F0UicgbGFuZSBzZXR1cCAqLworCWlmICh0b3BvbG9neU1vZGUgPT0gREJfMzgxX0NPTkZJR19ERUZBVUxUKQorCQl1cGRhdGVUb3BvbG9neVNhdFIodG9wb2xvZ3lDb25maWdQdHIpOworCS8qIFVwZGF0ZSB0aGUgZGVmYXVsdCBib2FyZCB0b3BvbG9neSBkZXZpY2UgZmxhdm91cnMgKi8KKwlDSEVDS19TVEFUVVMobXZId3NVcGRhdGVEZXZpY2VUb3Bsb2d5KHRvcG9sb2d5Q29uZmlnUHRyLCB0b3BvbG9neU1vZGUpKTsKIAkvKiBSZWFkIFVTQjMuMCBtb2RlOiBIT1NUL0RFVklDRSAqLwogCWlmIChsb2FkVG9wb2xvZ3lVU0JNb2RlR2V0KCZ0d3NpRGF0YSkgPT0gTVZfT0spIHsKIAkJdXNiM0hvc3QwT3JEZXZpY2UgPSAodHdzaURhdGEgJiAweDEpOwogCQlpZiAodXNiM0hvc3QwT3JEZXZpY2UgPT0gMCkgLyogT25seSBvbmUgVVNCMyBkZXZpY2UgaXMgZW5hYmxlZCAqLwogCQkJdXNiM0hvc3QxT3JEZXZpY2UgPSAoKHR3c2lEYXRhID4+IDEpICYgMHgxKTsKIAl9Ci0KIAkvKiBVcGRhdGluZyB0aGUgdG9wb2xvZ3kgbWFwICovCiAJZm9yIChsYW5lTnVtID0gMDsgbGFuZU51bSA8IG12SHdzU2VyZGVzR2V0TWF4TGFuZSgpOyBsYW5lTnVtKyspIHsKIAkJc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc2VyZGVzTW9kZSAgPSB0b3BvbG9neUNvbmZpZ1B0cltsYW5lTnVtXS5zZXJkZXNNb2RlOwpAQCAtNzgyLDIwICs5MjYsMjYgQEAKIAkJc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc2VyZGVzVHlwZSAgPSB0b3BvbG9neUNvbmZpZ1B0cltsYW5lTnVtXS5zZXJkZXNUeXBlOwogCQlzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zd2FwUnggICAgICA9IHRvcG9sb2d5Q29uZmlnUHRyW2xhbmVOdW1dLnN3YXBSeDsKIAkJc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc3dhcFR4ICAgICAgPSB0b3BvbG9neUNvbmZpZ1B0cltsYW5lTnVtXS5zd2FwVHg7Ci0KIAkJLyogVXBkYXRlIFVTQjMgZGV2aWNlIGlmIG5lZWRlZCovCi0JCWlmICh1c2IzSG9zdDBPckRldmljZSA9PSAxICYmIHNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1R5cGUgPT0gVVNCM19IT1NUMCkKLQkJCXNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1R5cGUgPSBVU0IzX0RFVklDRTsKKwkJaWYgKHVzYjNIb3N0ME9yRGV2aWNlID09IDEgJiYgc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc2VyZGVzVHlwZSA9PSBVU0IzX0hPU1QwKSB7CisJCQlpZiAobXZTeXNFbnZEZXZpY2VJZEdldCgpICE9IE1WXzZXMjIpIHsKKwkJCQlzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID0gVVNCM19ERVZJQ0U7CisJCQl9IGVsc2UgeworCQkJCS8qIERldmljZSA2VzIyOiBEaXNhYmxlIFVTQjMtLT5kZXZpY2UgZG9lc24ndCBzdXBwb3J0IGRldmljZSBtb2RlICovCisJCQkJbXZQcmludGYoIkRldmljZSA2VzIyIHN1cHBvcnRzIG9ubHkgVVNCMyBIb3N0ICIpOworCQkJCW12UHJpbnRmKCJtb2RlOiBVU0IzIFBvcnQgMCBAIGxhbmUldSBkaXNhYmxlZFxuIiwgbGFuZU51bSk7CisJCQkJc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0gPSBEZWZhdWx0TGFuZTsKKwkJCX0KKwkJfQogCiAJCWlmICh1c2IzSG9zdDFPckRldmljZSA9PSAxICYmIHNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1R5cGUgPT0gVVNCM19IT1NUMSkKIAkJCXNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1R5cGUgPSBVU0IzX0RFVklDRTsKIAl9Ci0JLyogaWYgbm90IGRldGVjdGVkIGFueSBTZXJEZXMgU2l0ZSBtb2R1bGUsIHJlYWQgJ1NhdFInIGxhbmUgc2V0dXAgKi8KLQlpZiAodG9wb2xvZ3lNb2RlID09IERCXzM4MV9DT05GSUdfREVGQVVMVCkKLQkJdXBkYXRlVG9wb2xvZ3lTYXRSKHNlcmRlc01hcEFycmF5KTsKIAogCS8qIHVwZGF0ZSAnc2dtaWlzcGVlZCcgc2V0dGluZ3MgKi8KIAl1cGRhdGVUb3BvbG9neVNnbWlpU3BlZWQoc2VyZGVzTWFwQXJyYXkpOworCS8qIHVwZGF0ZSBVU0IzIGNvbmZpZyByZWdpc3RlciAqLworCXVwZGF0ZVVzYjNEZXZpY2VDb25maWcoc2VyZGVzTWFwQXJyYXkpOwogCiAJcmV0dXJuIE1WX09LOwogfQpAQCAtODA4LDcgKzk1OCw2IEBACiAJU0VSREVTX01BUCogdG9wb2xvZ3lDb25maWdQdHI7CiAJTVZfVTggdHdzaURhdGE7CiAJTVZfVTggdXNiM0hvc3QwT3JEZXZpY2UgPSAwLCB1c2IzSG9zdDFPckRldmljZSA9IDA7Ci0KIAltdlByaW50ZigiXG5Jbml0aWFsaXplIERCLTg4RjY4MjAtQlAgYm9hcmQgdG9wb2xvZ3lcbiIpOwogCiAJLyogR2V0dGluZyB0aGUgcmVsZXZhbnQgdG9wb2xvZ3kgbW9kZSAoaW5kZXgpICovCkBAIC04MTgsNyArOTY3LDkgQEAKIAkJdG9wb2xvZ3lNb2RlID0gREJfQ09ORklHX0RFRkFVTFQ7CiAKIAl0b3BvbG9neUNvbmZpZ1B0ciA9IHRvcG9sb2d5Q29uZmlnREJbdG9wb2xvZ3lNb2RlXTsKLQorCS8qIGlmIG5vdCBkZXRlY3RlZCBhbnkgU2VyRGVzIFNpdGUgbW9kdWxlLCByZWFkICdTYXRSJyBsYW5lIHNldHVwICovCisJaWYgKHRvcG9sb2d5TW9kZSA9PSBEQl9DT05GSUdfREVGQVVMVCkKKwkJdXBkYXRlVG9wb2xvZ3lTYXRSKHRvcG9sb2d5Q29uZmlnUHRyKTsKIAkvKiBVcGRhdGUgdGhlIGRlZmF1bHQgYm9hcmQgdG9wb2xvZ3kgZGV2aWNlIGZsYXZvdXJzICovCiAJQ0hFQ0tfU1RBVFVTKG12SHdzVXBkYXRlRGV2aWNlVG9wbG9neSh0b3BvbG9neUNvbmZpZ1B0ciwgdG9wb2xvZ3lNb2RlKSk7CiAKQEAgLTgzNywyNCArOTg4LDI4IEBACiAJCXNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnN3YXBSeCAgICAgID0gdG9wb2xvZ3lDb25maWdQdHJbbGFuZU51bV0uc3dhcFJ4OwogCQlzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zd2FwVHggICAgICA9IHRvcG9sb2d5Q29uZmlnUHRyW2xhbmVOdW1dLnN3YXBUeDsKIAotCQkvKiBVcGRhdGUgVVNCMyBkZXZpY2UgaWYgbmVlZGVkIC0gcmVsZXZhbnQgZm9yIGxhbmUgMyw0LDUgb25seSAqLwotCQlpZiAobGFuZU51bSA+PSAzKQotCQl7Ci0JCQlpZiAoKHNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1R5cGUgPT0gVVNCM19IT1NUMCkgJiYKLQkJCQkodXNiM0hvc3QwT3JEZXZpY2UgPT0gMSkpCi0JCQkJCXNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1R5cGUgPSBVU0IzX0RFVklDRTsKLQotCQkJaWYgKChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID09IFVTQjNfSE9TVDEpICYmCi0JCQkJKHVzYjNIb3N0MU9yRGV2aWNlID09IDEpKQotCQkJCQlzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID0gVVNCM19ERVZJQ0U7CisJCS8qIFVwZGF0ZSBVU0IzIGRldmljZSBpZiBuZWVkZWQgKi8KKwkJaWYgKChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID09IFVTQjNfSE9TVDApICYmCisJCQkodXNiM0hvc3QwT3JEZXZpY2UgPT0gMSkpIHsKKwkJCWlmIChtdlN5c0VudkRldmljZUlkR2V0KCkgIT0gTVZfNlcyMykgeworCQkJCXNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1R5cGUgPSBVU0IzX0RFVklDRTsKKwkJCX0gZWxzZSB7CisJCQkJLyogRGV2aWNlIDZXMjM6IERpc2FibGUgVVNCMy0tPmRldmljZSBkb2Vzbid0IHN1cHBvcnQgZGV2aWNlIG1vZGUgKi8KKwkJCQltdlByaW50ZigiRGV2aWNlIDZXMjMgc3VwcG9ydHMgb25seSBVU0IzIEhvc3QgIik7CisJCQkJbXZQcmludGYoIm1vZGU6IFVTQjMgUG9ydCAwIEAgbGFuZSV1IGRpc2FibGVkXG4iLCBsYW5lTnVtKTsKKwkJCQlzZXJkZXNNYXBBcnJheVtsYW5lTnVtXSA9IERlZmF1bHRMYW5lOworCQkJfQogCQl9CisKKwkJaWYgKChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID09IFVTQjNfSE9TVDEpICYmCisJCQkodXNiM0hvc3QxT3JEZXZpY2UgPT0gMSkpCisJCQkJc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc2VyZGVzVHlwZSA9IFVTQjNfREVWSUNFOwogCX0KLQkvKiBpZiBub3QgZGV0ZWN0ZWQgYW55IFNlckRlcyBTaXRlIG1vZHVsZSwgcmVhZCAnU2F0UicgbGFuZSBzZXR1cCAqLwotCWlmICh0b3BvbG9neU1vZGUgPT0gREJfQ09ORklHX0RFRkFVTFQpCi0JCXVwZGF0ZVRvcG9sb2d5U2F0UihzZXJkZXNNYXBBcnJheSk7CiAKIAkvKiB1cGRhdGUgJ3NnbWlpc3BlZWQnIHNldHRpbmdzICovCiAJdXBkYXRlVG9wb2xvZ3lTZ21paVNwZWVkKHNlcmRlc01hcEFycmF5KTsKKwkvKiB1cGRhdGUgVVNCMyBjb25maWcgcmVnaXN0ZXIgKi8KKwl1cGRhdGVVc2IzRGV2aWNlQ29uZmlnKHNlcmRlc01hcEFycmF5KTsKIAogCXJldHVybiBNVl9PSzsKIH0KQEAgLTkwNiw3ICsxMDYxLDggQEAKIAkJdG9wb2xvZ3lDb25maWdQdHJbNV0uc2VyZGVzU3BlZWQgPSAgaXNTZ21paSA/IF9fM18xMjVHYnBzIDogX181R2Jwczs7CiAJCXRvcG9sb2d5Q29uZmlnUHRyWzVdLnNlcmRlc01vZGUgPSBTRVJERVNfREVGQVVMVF9NT0RFOwogCX0KLQorCS8qIHVwZGF0ZSAnZ3BzZXJkZXMxLzInIGxhbmUgY29uZmlndXJhdGlvbiAqLworCXVwZGF0ZVRvcG9sb2d5U2F0Uih0b3BvbG9neUNvbmZpZ1B0cik7CiAJLyogVXBkYXRlIHRoZSBkZWZhdWx0IGJvYXJkIHRvcG9sb2d5IGRldmljZSBmbGF2b3VycyAqLwogCUNIRUNLX1NUQVRVUyhtdkh3c1VwZGF0ZURldmljZVRvcGxvZ3kodG9wb2xvZ3lDb25maWdQdHIsIERCX0NPTkZJR19ERUZBVUxUKSk7CiAKQEAgLTkxOSw4ICsxMDc1LDcgQEAKIAkJc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc3dhcFR4ICAgICAgPSB0b3BvbG9neUNvbmZpZ1B0cltsYW5lTnVtXS5zd2FwVHg7CiAJfQogCi0JLyogdXBkYXRlICdncHNlcmRlczEvMi8zJyBsYW5lIGNvbmZpZ3VyYXRpb24gLCBhbmQgJ3NnbWlpc3BlZWQnIGZvciBTR01JSSBsYW5lcyAqLwotCXVwZGF0ZVRvcG9sb2d5U2F0UihzZXJkZXNNYXBBcnJheSk7CisJLyogdXBkYXRlICdzZ21paXNwZWVkJyBmb3IgU0dNSUkgbGFuZXMgKi8KIAl1cGRhdGVUb3BvbG9neVNnbWlpU3BlZWQoc2VyZGVzTWFwQXJyYXkpOwogCiAJcmV0dXJuIE1WX09LOwpAQCAtOTQ4LDggKzExMDMsNiBAQAogCQlzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zd2FwVHggICAgICA9IHRvcG9sb2d5Q29uZmlnUHRyW2xhbmVOdW1dLnN3YXBUeDsKIAl9CiAKLQl1cGRhdGVUb3BvbG9neVNnbWlpU3BlZWQoc2VyZGVzTWFwQXJyYXkpOwotCiAJcmV0dXJuIE1WX09LOwogfQogCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkVG9wb2xvZ3lTcGVjLTM5eC5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZFRvcG9sb2d5U3BlYy0zOXguYwppbmRleCBhMDYwNTEwLi5lNDk4MDhkIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkVG9wb2xvZ3lTcGVjLTM5eC5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRUb3BvbG9neVNwZWMtMzl4LmMKQEAgLTE4OCw3ICsxODgsMTAgQEAKICAgICBfXzVHYnBzLCAgICAvKiBVU0IzX0hPU1QwICovCiAgICAgX181R2JwcywgICAgLyogVVNCM19IT1NUMSAqLwogICAgIF9fNUdicHMsICAgIC8qIFVTQjNfREVWSUNFICovCi0gICAgX18xXzI1R2JwcywgLyogU0dNSUkzICovCisgICAgX18xXzI1R2JwcywgLyogU0dNSUl2M18wICovCisgICAgX18xXzI1R2JwcywgLyogU0dNSUl2M18xICovCisgICAgX18xXzI1R2JwcywgLyogU0dNSUl2M18yICovCisgICAgX18xXzI1R2JwcywgLyogU0dNSUl2M18wMyAqLwogICAgIF9fM18xMjVHYnBzLC8qIFhBVUkgKi8KICAgICBfXzZfMjVHYnBzLCAvKiBSWEFVSSAqLwogfTsKQEAgLTE5NiwxNCArMTk5LDE0IEBACiAvKiBTZWxlY3RvciB0byBTZXJkZXMgdHlwZSBtYXBwaW5nICovCiBTRVJERVNfVFlQRSBjb21tb25QaHlzVHlwZVtNQVhfU0VSREVTX0xBTkVTXVtNQVhfU0VMRUNUT1JfVkFMXSA9CiB7Ci0vKgkgMFgwICAgMHgxICAgIDB4MiAgICAgIDB4MyAgICAgMHg0ICAgICAgICAgICAgICAgMHg1ICAgICAgICAgMHg2ICAgICAgMHg3ICAgICAweDggICAgIDB4OSAqLwoteyBERUZBVUxUX1NFUkRFUywgUEVYMCwgU0FUQTAsICAgICAgICAgIFNHTUlJMCwgU0dNSUkwLCAgICAgIE5BLCAgICAgICAgICBOQSwgICAgICAgICAgTkEsICAgICBOQSwgICAgIE5BICAgICB9LCAgLyogTGFuZSAwICovCi17IERFRkFVTFRfU0VSREVTLCBQRVgwLCBQRVgxLCAgICAgICAgICAgU0FUQTAsICBTR01JSTAsICAgICAgU0dNSUkxLCAgICAgIFVTQjNfSE9TVDAsICBRU0dNSUksIFNHTUlJMCwgU0dNSUkxIH0sICAvKiBMYW5lIDEgKi8KLXsgREVGQVVMVF9TRVJERVMsIFBFWDEsIFBFWDIsICAgICAgICAgICBTQVRBMSwgIFNHTUlJMSwgICAgICBTR01JSTEsICAgICAgTkEsICAgICAgICAgIE5BLCAgICAgTkEsICAgICBOQSAgICAgfSwgIC8qIExhbmUgMiAqLwoteyBERUZBVUxUX1NFUkRFUywgUEVYMywgUEVYMywgICAgICAgICAgIFNBVEEzLCAgU0dNSUkyLCAgICAgIFVTQjNfSE9TVDEsICBVU0IzX0RFVklDRSwgU0dNSUkyLCBYQVVJLCAgIE5BICAgICB9LCAgLyogTGFuZSAzICovCi17IERFRkFVTFRfU0VSREVTLCBQRVgxLCBERUZBVUxUX1NFUkRFUywgU0dNSUkxLCBVU0IzX0hPU1QwLCAgVVNCM19ERVZJQ0UsIFNBVEEyLCAgICAgICBQRVgyLCAgIFNHTUlJMywgWEFVSSAgIH0sICAvKiBMYW5lIDQgKi8KLXsgREVGQVVMVF9TRVJERVMsIFBFWDIsIFNBVEEyLCAgICAgICAgICBTR01JSTIsIFVTQjNfSE9TVDEsICBVU0IzX0RFVklDRSwgU0dNSUkyLCAgICAgIE5BLCAgICAgWEFVSSwgICBOQSAgICAgfSwgIC8qIExhbmUgNSAqLwoteyBERUZBVUxUX1NFUkRFUywgUEVYMSwgU0dNSUkzLCAgICAgICAgIE5BLCAgICAgWEFVSSwgICAgICAgIE5BLCAgICAgICAgICBOQSwgICAgICAgICAgTkEsICAgICBOQSwgICAgIE5BICAgICB9LCAgLyogTGFuZSA2ICovCisvKgkgMFgwCSAgIDB4MSAgIDB4MgkJMHgzICAgICAweDQgICAgICAgICAgMHg1ICAgICAgICAgMHg2CSAgICAgICAweDcJCTB4OAkJMHg5CQkqLworeyBERUZBVUxUX1NFUkRFUywgUEVYMCwgU0FUQTAsICAgICAgICAgIFNHTUlJMCwgU0dNSUl2M18wLCAgIE5BLCAgICAgICAgICBOQSwgICAgICAgICAgTkEsCQlOQSwJCU5BLAkJfSwgIC8qIExhbmUgMCAqLworeyBERUZBVUxUX1NFUkRFUywgUEVYMCwgUEVYMSwgICAgICAgICAgIFNBVEEwLCAgU0dNSUkwLCAgICAgIFNHTUlJMSwgICAgICBVU0IzX0hPU1QwLCAgUVNHTUlJLAkJU0dNSUl2M18wLAlTR01JSXYzXzEsCX0sICAvKiBMYW5lIDEgKi8KK3sgREVGQVVMVF9TRVJERVMsIFBFWDEsIFBFWDIsICAgICAgICAgICBTQVRBMSwgIFNHTUlJMSwgICAgICBTR01JSXYzXzEsICAgTkEsICAgICAgICAgIE5BLAkJTkEsCQlOQSAsCQl9LCAgLyogTGFuZSAyICovCit7IERFRkFVTFRfU0VSREVTLCBQRVgzLCBQRVgzLCAgICAgICAgICAgU0FUQTMsICBTR01JSTIsICAgICAgVVNCM19IT1NUMSwgIFVTQjNfREVWSUNFLCBTR01JSXYzXzIsCVhBVUksCQlOQSwJCX0sICAvKiBMYW5lIDMgKi8KK3sgREVGQVVMVF9TRVJERVMsIFBFWDEsIERFRkFVTFRfU0VSREVTLCBTR01JSTEsIFVTQjNfSE9TVDAsICBVU0IzX0RFVklDRSwgU0FUQTIsICAgICAgIFBFWDIsCQlTR01JSXYzXzMsCVhBVUksCQl9LCAgLyogTGFuZSA0ICovCit7IERFRkFVTFRfU0VSREVTLCBQRVgyLCBTQVRBMiwgICAgICAgICAgU0dNSUkyLCBVU0IzX0hPU1QxLCAgVVNCM19ERVZJQ0UsIFNHTUlJdjNfMiwgICBOQSwJCVhBVUksCQlOQSwJCX0sICAvKiBMYW5lIDUgKi8KK3sgREVGQVVMVF9TRVJERVMsIFBFWDEsIFNHTUlJdjNfMCwgICAgICBOQSwgICAgIFhBVUksICAgICAgICBOQSwgICAgICAgICAgTkEsICAgICAgICAgIE5BLAkJTkEsCQlOQSwJCX0sICAvKiBMYW5lIDYgKi8KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjE5LDcgKzIyMiw3IEBACiAJeyBTR01JSTIsICAgICAgIF9fMV8yNUdicHMsCQkgICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAJeyBQRVgyLCAgICAgICAgIF9fNUdicHMsCQkgICBQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAJeyBSWEFVSSwgICAgICAgIF9fNl8yNUdicHMsCQkgICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0gICAgeyBSWEFVSSwgICAgICAgIF9fNl8yNUdicHMsCQkgICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0KKwl7IFJYQVVJLCAgICAgICAgX182XzI1R2JwcywJCSAgIFNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBGdW5jdGlvbnMgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMwMyw2ICszMDYsOCBAQAogICAgICAgICBzZWxlY3RvclZhbCA9IG12U3lzRW52Q29uZmlnR2V0KGNvbmZpZ0lkKTsKICAgICAgICAgc2VyZGVzVHlwZSA9IGNvbW1vblBoeXNUeXBlW3NlcmRlc051bV1bc2VsZWN0b3JWYWxdOwogCisKKwogICAgICAgICBpZiAoc2VsZWN0b3JWYWwgPiBNQVhfU0VMRUNUT1JfVkFMKSB7CiAgICAgICAgICAgICBtdlByaW50ZigibXZTeXNVcGRhdGVMYW5lQ29uZmlnOiBFcnJvcjogU2VsZWN0b3IgdmFsdWUgJTB4JXggKFNlcmRlcyAlZCkgaXMgYmlnZ2VyIHRoZW4gbWF4IHZhbHVlICgweCV4KVxuIiwKIAkJCQkJIHNlbGVjdG9yVmFsLCBzZXJkZXNOdW0sIE1BWF9TRUxFQ1RPUl9WQUwpOwpAQCAtMzE3LDcgKzMyMiw3IEBACiAKIAkJc2VyZGVzVG9wb2xvZ3lbc2VyZGVzTnVtXS5zZXJkZXNUeXBlICA9IHNlcmRlc1R5cGU7CiAJCXNlcmRlc1RvcG9sb2d5W3NlcmRlc051bV0uc2VyZGVzU3BlZWQgPSBkZWZhdWx0U2VyZGVzU3BlZWRNYXBbc2VyZGVzVHlwZV07Ci0gICAgICAgIHNlcmRlc1RvcG9sb2d5W3NlcmRlc051bV0uc2VyZGVzTW9kZSAgPSBTRVJERVNfREVGQVVMVF9NT0RFOyAvKiBzZXQgdG8gZGVmYXVsdCAqLworCQlzZXJkZXNUb3BvbG9neVtzZXJkZXNOdW1dLnNlcmRlc01vZGUgID0gU0VSREVTX0RFRkFVTFRfTU9ERTsgLyogc2V0IHRvIGRlZmF1bHQgKi8KIAkJc2VyZGVzVG9wb2xvZ3lbc2VyZGVzTnVtXS5zd2FwUnggICAgICA9IE1WX0ZBTFNFOwogCQlzZXJkZXNUb3BvbG9neVtzZXJkZXNOdW1dLnN3YXBUeCAgICAgID0gTVZfRkFMU0U7CiAKQEAgLTMyNywxMSArMzMyLDIwIEBACiAJCSAgIGlzIFBFWHg0LCBvdGhlcndpc2UgaXQgd2lsbCBiZSBQRVh4MSAodGhpcyBpcyBkb25lIGFmdGVyIGFsbAogCQkgICBTZXJkZXMgdHlwZXMgYXJlIHVwZGF0ZWQpLiAqLwogICAgICAgICBpZihzZXJkZXNUb3BvbG9neVtzZXJkZXNOdW1dLnNlcmRlc1R5cGUgPD0gUEVYMykgewotICAgICAgICAgICAgc2VyZGVzVG9wb2xvZ3lbc2VyZGVzTnVtXS5zZXJkZXNNb2RlID0gKHNlbGVjdG9yVmFsID09IDB4MikgPworICAgICAgICAgICAgc2VyZGVzVG9wb2xvZ3lbc2VyZGVzTnVtXS5zZXJkZXNNb2RlID0gKHNlbGVjdG9yVmFsID09IDB4MikgPyAvKiBmb3IgbGFuZXMgMSwyLGFuZCAzIHNlbGVjdG9yIHZhbGF1ZSBoYXMgdmFsdWU9MSBmb3IgUEVYeDEgYW5kIHZhbHVlPTIgZm9yIFBFWHg0LAorCQkJCQkJCQkJICAgICBmb3IgbGFuZSAwIC0gaXQgaXMgYWx3YXlzIDEsIHNvIHNlcmRlc01vZGUgd2lsbCBiZSB1cGRhdGVkIGxhdGVyICwgd2hlbiBsYW5lIDEgaXMgaGFuZGxlZCAqLwogICAgICAgICAgICAgICAgIFBFWF9ST09UX0NPTVBMRVhfeDQgOiBQRVhfUk9PVF9DT01QTEVYX3gxOwogICAgICAgICB9CiAKLSAgICAgICAgLyogVGhlIFNlbGVjdG9yIG1hcHBpbmcgZm9yIGxhbmVzIDUgYW5kIDYgY2FuIGJlIGVpdGhlciBYQVVJIG9yIFJYQVVJIG1vZGUgdHlwZQorCWlmICgoc2VyZGVzTnVtID49IDEgKSAmJiAoc2VyZGVzVG9wb2xvZ3lbc2VyZGVzTnVtXS5zZXJkZXNNb2RlID09IFBFWF9ST09UX0NPTVBMRVhfeDQpKXsKKworCQlpZihzZXJkZXNUb3BvbG9neVtzZXJkZXNOdW1dLnNlcmRlc1R5cGUgPT0gUEVYMSkKKwkJCS8qIHNldCByaWdodCBtb2RlIGZvciBwcmV2aW91cyBsYW5lIDAgdG9vIC0gc2VlIGNvbW1lbnQgYWJvdmUgKi8KKwkJCXNlcmRlc1RvcG9sb2d5W3NlcmRlc051bS0xXS5zZXJkZXNNb2RlID0gUEVYX1JPT1RfQ09NUExFWF94NDsKKwkJLyogc2V0IHNlcmRlcyB0eXBlIGZvciB4NCBsYW5lcyAxLDIsMyAtIG9ubHkgUEVYMCBjYW4gYmUgc2V0IGFzIFBFWHg0ICAqLworCQlzZXJkZXNUb3BvbG9neVtzZXJkZXNOdW1dLnNlcmRlc1R5cGUgPSBQRVgwOworCX0KKwkvKiBUaGUgU2VsZWN0b3IgbWFwcGluZyBmb3IgbGFuZXMgNSBhbmQgNiBjYW4gYmUgZWl0aGVyIFhBVUkgb3IgUlhBVUkgbW9kZSB0eXBlCiAgICAgICAgICAgIGFuZCBpdCBpcyBkZXBlbmRzIG9uIHByZXZpb3VzIGxhbmVzIDQuCiAJCSAgIElmIHRoZSBTZWxlY3RvciB2YWx1ZSBmb3IgbGFuZXMgNCBpcyAweDksIHRoZW4gdGhlIFNlcmRlcyB0eXBlIGZvciBsYW5lcwogCQkgICA1IGFuZCA2IGlzIFhBVUksIG90aGVyd2lzZSB0aGUgU2VyZGVzIHR5cGUgZm9yIGxhbmVzIDUgYW5kIDYgaXMgUlhBVUkgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L21zeXMvbXZIaWdoU3BlZWRFbnZTcGVjLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9tc3lzL212SGlnaFNwZWVkRW52U3BlYy5jCmluZGV4IDQwNDA3ZTYuLjU4YTg1NDUgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L21zeXMvbXZIaWdoU3BlZWRFbnZTcGVjLmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvbXN5cy9tdkhpZ2hTcGVlZEVudlNwZWMuYwpAQCAtMTEzLDYgKzExMyw4IEBACiAJeyBVU0JfUkVHX1VOSVQsICAgIDB4NTA4MDQsICAgICAweDMsICAgICAgICB7IDB4MiAgICAgICAgfSwgMCwgICAgICAgIDAgfSwgLyogUGh5IG9mZnNldCAweDEgLSBQTExfQ09OVFJPTDEgICovCiAJeyBVU0JfUkVHX1VOSVQsICAgIDB4NTA4MEMsICAgICAweDMwMDAwMDAsICB7IDB4MjAwMDAwMCAgfSwgMCwgICAgICAgIDAgfSwgLyogUGh5IG9mZnNldCAweDMgLSBUWCBDaGFubmVsIGNvbnRyb2wgMCAgKi8KIAl7IFVTQl9SRUdfVU5JVCwgICAgMHg1MDgwMCwgICAgIDB4MUZGMDA3RiwgIHsgMHg2MDAwMDUgICB9LCAwLCAgICAgICAgMCB9LCAvKiBQaHkgb2Zmc2V0IDB4MCAtIFBMTF9DT05UUk9MMCAgKi8KKwl7IFVTQl9SRUdfVU5JVCwgICAgMHg1MDgwQywgICAgIDB4MDAwRjAwMCwgIHsgMHgwMDAxMDAwICB9LCAwLCAgICAgICAgMCB9LCAvKiBEUlZfRU5fTFMgIDB4MSAtIFRYIENoYW5uZWwgY29udHJvbCAwICAqLworCXsgVVNCX1JFR19VTklULCAgICAweDUwODE0LCAgICAgMHgwMDAwMDBGLCAgeyAweDAwMDAwMEQgIH0sIDAsICAgICAgICAwIH0sIC8qIFNRX1RIUkVTSCAgMHhEIC0gVFggQ2hhbm5lbCBjb250cm9sIDAgICovCiAJeyBVU0JfUkVHX1VOSVQsICAgIDB4NTA4MEMsICAgICAweDMwMDAwMDAsICB7IDB4MzAwMDAwMCAgfSwgMCwgICAgICAgIDAgfSwgLyogUGh5IG9mZnNldCAweDMgLSBUWCBDaGFubmVsIGNvbnRyb2wgMCAgKi8KIAl7IFVTQl9SRUdfVU5JVCwgICAgMHg1MDgwNCwgICAgIDB4MywgICAgICAgIHsgMHgzICAgICAgICB9LCAwLCAgICAgICAgMCB9LCAvKiBQaHkgb2Zmc2V0IDB4MSAtIFBMTF9DT05UUk9MMSAgKi8KIAl7IFVTQl9SRUdfVU5JVCwgICAgMHg1MDgwOCwgICAgIDB4ODA4MDAwMDAsIHsgMHg4MDgwMDAwMCB9LCAxLCAgICAgMTAwMCB9LCAvKiBjaGVjayBQTExDQUxfRE9ORSBpcyBzZXQgYW5kIElNUENBTF9ET05FIGlzIHNldCovCkBAIC0yNzIsNiArMjc0LDY3IEBACiBNVl9TVEFUVVMgYm9hcmRUb3BvbG9neUxvYWQoU0VSREVTX01BUCAgKnNlcmRlc01hcEFycmF5KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBGdW5jdGlvbnMgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK212SHdzSW5kaXJlY3RSZWdSZWFkCisgKgorICogREVTQ1JJUFRJT046ICAgICAgICAgSW5kaXJlY3QgcmVhZGZyb20gQ09NUEhZX01fUElQRV9SMlAzXzI4SFBNX1JFR19NSURBU19JTlRFUk5BTF9QQ0lFMDAxCisqCQkJcmVnaXN0ZXJzIHZpYSBQRVhfUEhZX0lORElSRUNUX0FDQ19SRUcKKyogSU5QVVQ6ICAgCQlkZXZOdW0gICAgLSBkZXZpY2UgbnVtYmVyCisqCSAgICAgICAgICAgICAgICByZWdBZGRyICAgLSByZWdpc3RlciBhZGRyZXNzCisqCQkJZGF0YVZhbHVlIC0gcG9pbnRlciB0byByZWFkIGRhdGEKKyoKKyAqIE9VVFBVVDogICAgICAgICAgICAgIE5vbmUuCisgKiBSRVRVUk5TOiAgICAgICAgICAgICBNVl9PSyAgICAgICAgICAgLSAgIGZvciBzdWNjZXNzCisgKgkJCU1WX0ZBSUwgICAgICAgICAtICAgZm9yIGZhaWx1cmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9VMzIgbXZId3NJbmRpcmVjdFJlZ1JlYWQKKygKKyAgICBNVl9VMzIgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9VMzIgICAgICAgICAgICAgIHJlZ0FkZHIsCisgICAgTVZfVTMyICAgICAgICAgICAgICAqZGF0YVZhbHVlCisKKykKK3sKKwlNVl9VMzIgZGF0YTsKKworCWRhdGEgPSAoMSA8PCBQSFlfQUNDRVNTX01PREVfT0ZGU0VUKSArIChyZWdBZGRyIDw8IFBIWV9BRERSRVNTX09GRlNFVCkgOworCU1WX1JFR19XUklURShQRVhfUEhZX0lORElSRUNUX0FDQ19SRUcsZGF0YSk7CisJKmRhdGFWYWx1ZSA9IE1WX1JFR19SRUFEIChQRVhfUEhZX0lORElSRUNUX0FDQ19SRUcpOworCisJcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCittdkh3c0luZGlyZWN0UmVnV3JpdGUKKyAqCisgKiBERVNDUklQVElPTjoJCUluZGlyZWN0IHdyaXRlIHRvIENPTVBIWV9NX1BJUEVfUjJQM18yOEhQTV9SRUdfTUlEQVNfSU5URVJOQUxfUENJRTAwMQorKgkJCXJlZ2lzdGVycyB2aWEgUEVYX1BIWV9JTkRJUkVDVF9BQ0NfUkVHCisqIElOUFVUOiAgIAkJZGV2TnVtICAgIC0gZGV2aWNlIG51bWJlcgorKgkgICAgICAgICAgICAgICAgcmVnQWRkciAgIC0gcmVnaXN0ZXIgYWRkcmVzcworKgkJCWRhdGFWYWx1ZSAtIGRhdGEgdG8gd3JpdGUKKyoJCQltYXNrCSAgLSBtYXNrCisqIE9VVFBVVDoJCU5vbmUuCisqIFJFVFVSTlM6CQlNVl9PSyAgICAgICAgICAgLSAgIGZvciBzdWNjZXNzCisqCQkJTVZfRkFJTCAgICAgICAgIC0gICBmb3IgZmFpbHVyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVTMyIG12SHdzSW5kaXJlY3RSZWdXcml0ZQorKAorICAgIE1WX1UzMiAgICAgICAgICAgICAgZGV2TnVtLAorICAgIE1WX1UzMiAgICAgICAgICAgICAgcmVnQWRkciwKKyAgICBNVl9VMzIgICAgICAgICAgICAgIGRhdGFWYWx1ZSwKKyAgICBNVl9VMzIgICAgICAgICAgICAgIG1hc2sKKworKQoreworCU1WX1UzMiByZWFkRGF0YSxkYXRhOworCisJbXZId3NJbmRpcmVjdFJlZ1JlYWQgKGRldk51bSxyZWdBZGRyLCZyZWFkRGF0YSk7CisJZGF0YVZhbHVlID0gKChyZWFkRGF0YSAmICh+bWFzaykpIHwgKGRhdGFWYWx1ZSAmIG1hc2spKSAmIDB4RkZGRjsKKwlkYXRhID0gKDAgPDwgUEhZX0FDQ0VTU19NT0RFX09GRlNFVCkgKyAocmVnQWRkciA8PCBQSFlfQUREUkVTU19PRkZTRVQpICsgIGRhdGFWYWx1ZTsKKwlNVl9SRUdfV1JJVEUoUEVYX1BIWV9JTkRJUkVDVF9BQ0NfUkVHLGRhdGEpOworCXJldHVybiBNVl9PSzsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIG12SHdzU2VyZGVzTGFzdExhbmVHZXQgLQpAQCAtMzc2LDEwICs0MzksNDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBQzM6IHNldCBQQ0llIENvbXBoeSByZWdpc3RlciBvcHRpbWl6YXRpb25zIGFmdGVyIEVUUCAqLworTVZfVk9JRCBtdkN0cmxQZXhJbXBlZGFuY2VDYWxpYnJhdGlvbihNVl9WT0lEKQoreworCU1WX1UzMiB1aVJlZyA9IDA7CisKKwkvKiBNQUMgc29mdCByZXNldCAqLworCS8qIFJlZyAweDQxYTYwLCBEZWFzc2VydCBzb2Z0X3Jlc2V0WzIwXSB0byAweDAqLworCXVpUmVnID0gTVZfUkVHX1JFQUQoUEVYX0RCR19DVFJMX1JFRygwKSk7CisJdWlSZWcgJj0gfigweDEgPDwgMjApOworCU1WX1JFR19XUklURShQRVhfREJHX0NUUkxfUkVHKDApLCB1aVJlZyk7CisJLypQaXBlIHJlc2V0ICovCisJbXZId3NJbmRpcmVjdFJlZ1dyaXRlICgwLEdMT0JfQ0xLX0NUUkwsMHgxLDB4MSk7CisKKwkvKlBleCBUeCBhbmQgUlggaW1wZWRhbmNlIGFkanVzdCBhbmQgcmVjYWxpYnJhdGUgKi8KKwltdkh3c0luZGlyZWN0UmVnV3JpdGUgKDAsVlRISU1QQ0FMX0NUUkxfUkVHLChUWF9BTkRfUlhfSU1QRURBTkNFX1RIUkVTSElPTEQgPDwgSU1QRURBTkNFX1RIUkVTSElPTERfT0ZGU0VUKSwoMHhGRiA8PElNUEVEQU5DRV9USFJFU0hJT0xEX09GRlNFVCkpOyAvKiBzZXQgdGhyZXNob2xkICovCisKKwltdkh3c0luZGlyZWN0UmVnV3JpdGUgKDAsQ0FMX1JFRzMsKDB4MSA8PCBSWF9DQUxJQlJBVElPTl9PRkZTRVQpLCgweDEgPDxSWF9DQUxJQlJBVElPTl9PRkZTRVQpKTsgIC8qIGNhbGlicmF0ZSBSeCAqLworCW12SHdzSW5kaXJlY3RSZWdXcml0ZSAoMCxDQUxfUkVHMywoMHgwIDw8IFJYX0NBTElCUkFUSU9OX09GRlNFVCksKDB4MSA8PFJYX0NBTElCUkFUSU9OX09GRlNFVCkpOworCW12T3NEZWxheSg1KTsKKwltdkh3c0luZGlyZWN0UmVnV3JpdGUgKDAsQ0FMX1JFRzMsKDB4MSA8PCBUWF9DQUxJQlJBVElPTl9PRkZTRVQpLCgweDEgPDxUWF9DQUxJQlJBVElPTl9PRkZTRVQpKTsvKiBjYWxpYnJhdGUgVHggKi8KKwltdkh3c0luZGlyZWN0UmVnV3JpdGUgKDAsQ0FMX1JFRzMsKDB4MCA8PCBUWF9DQUxJQlJBVElPTl9PRkZTRVQpLCgweDEgPDxUWF9DQUxJQlJBVElPTl9PRkZTRVQpKTsKKworCS8qUGV4IHNsZXcgcmF0ZSBjb250cm9sIGRpc2FibGUgKi8KKwltdkh3c0luZGlyZWN0UmVnV3JpdGUgKDAsRzJfU0VUVElOR18wLCgweDAgPDwgVFhfU0xFV19DTlRSTF9FTkFCTEVfT0ZGU0VUKSwoMHgxIDw8IFRYX1NMRVdfQ05UUkxfRU5BQkxFX09GRlNFVCkpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBBQzM6IHNldCBQQ0llIG1vZGUgYXMgRW5kIFBvaW50ICovCiBNVl9TVEFUVVMgbXZDdHJsUGV4RW5kUG9pbnRDb25maWcoTVZfVk9JRCkKIHsKLQlyZXR1cm4gTVZfT0s7IC8qbm8gRVAgY29uZmlnIGZvciBBQzMqLworCU1WX1UzMiB1aVJlZyA9IDA7CisKKwkvKiBSZWcgMHg0MWEwMCwgU2V0IENvbmZSb290X0NvbXBsZXggdG8gMHgwIHRvIGRlZmluZSBlbmQgcG9pbnQgbW9kZSovCisJdWlSZWcgPSBNVl9SRUdfUkVBRChQRVhfQ1RSTF9SRUcoMCkpOworCXVpUmVnICY9IH4oMHgxIDw8IENPTkZfUk9PVF9DT01QTEVYX09GRlNFVCk7CisKKwlNVl9SRUdfV1JJVEUoUEVYX0NUUkxfUkVHKDApLCB1aVJlZyk7CisJbXZDdHJsUGV4SW1wZWRhbmNlQ2FsaWJyYXRpb24oKTsKKwkvKiB1bnJlc2V0IC0gc2V0IGJpdCAwIHRvIDAgaW4gR0xPQl9DTEtfQ1RSICovCisJbXZId3NJbmRpcmVjdFJlZ1dyaXRlICgwLEdMT0JfQ0xLX0NUUkwsMHgwLDB4MSk7CisKKwlyZXR1cm4gTVZfT0s7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzg4LDIwICs0ODgsMzMgQEAKIHsKIAlNVl9VMzIgdWlSZWcgPSAwOwogCS8qIFJlZyAweDE4MjA0LCBTZXQgUENJZTBuRW5bMF0gdG8gMHgwKi8KKwogCXVpUmVnID0gTVZfUkVHX1JFQUQoU09DX0NUUkxfUkVHKTsKIAl1aVJlZyAmPSB+KDB4MSA8PCAwKTsKIAl1aVJlZyB8PSAoMHgwIDw8IDApOwogCU1WX1JFR19XUklURShTT0NfQ1RSTF9SRUcsIHVpUmVnKTsKIAorCS8qIFJlZyAweDQxYTAwLCBTZXQgQ29uZlJvb3RfQ29tcGxleCB0byAweDEgdG8gZGVmaW5lIFJvb3QgQ29tcGxleCBtb2RlKi8KKwl1aVJlZyA9IE1WX1JFR19SRUFEKFBFWF9DVFJMX1JFRygwKSk7CisJdWlSZWcgJj0gfigweDEgPDwgQ09ORl9ST09UX0NPTVBMRVhfT0ZGU0VUKTsKKwl1aVJlZyB8PSAoMHgxIDw8IENPTkZfUk9PVF9DT01QTEVYX09GRlNFVCk7CisJTVZfUkVHX1dSSVRFKFBFWF9DVFJMX1JFRygwKSwgdWlSZWcpOworCisJbXZDdHJsUGV4SW1wZWRhbmNlQ2FsaWJyYXRpb24oKTsKKwogCS8qIFJlZyAweDQwMDYwLCBTZXQgRGV2VHlwZVsyMzoyMF0gdG8gMHg0KFJvb3QgQ29tcGxleCkqLwogCXVpUmVnID0gTVZfUkVHX1JFQUQoUEVYX0NBUEFCSUxJVElFU19SRUcoMCkpOwogCXVpUmVnICY9IH4oMHhGIDw8IDIwKTsKIAl1aVJlZyB8PSAoMHg0IDw8IDIwKTsKIAlNVl9SRUdfV1JJVEUoUEVYX0NBUEFCSUxJVElFU19SRUcoMCksIHVpUmVnKTsKIAorCS8qIHVucmVzZXQgLSBzZXQgYml0IDAgdG8gMCBpbiBHTE9CX0NMS19DVFIgKi8KKwltdkh3c0luZGlyZWN0UmVnV3JpdGUgKDAsR0xPQl9DTEtfQ1RSTCwweDAsMHgxKTsKKwogCS8qIFJlZyAweDQxYTYwLCBBc3NlcnQgc29mdF9yZXNldFsyMF0gdG8gMHgxLAotCQkJCQlTZXQgRGlzTGlua1Jlc3RhcnRSZWdSc3RbMTldIHRvIDB4MSwKLQkJCQkJU2V0IENvbmZNc2tMbmtSZXN0YXJ0WzE2XSB0byAweDEqLworCSAgIFNldCBEaXNMaW5rUmVzdGFydFJlZ1JzdFsxOV0gdG8gMHgxLAorCSAgIFNldCBDb25mTXNrTG5rUmVzdGFydFsxNl0gdG8gMHgxKi8KKwogCXVpUmVnID0gTVZfUkVHX1JFQUQoUEVYX0RCR19DVFJMX1JFRygwKSk7CiAJdWlSZWcgJj0gMHhGRkU2RkZGRjsKIAl1aVJlZyB8PSAxOTAwMDA7CkBAIC00MDksOCArNTIyLDggQEAKIAogCS8qIFJlZyAweDQxYTAwLCBTZXQgQ29uZlJvb3RfQ29tcGxleCB0byAweDEqLwogCXVpUmVnID0gTVZfUkVHX1JFQUQoUEVYX0NUUkxfUkVHKDApKTsKLQl1aVJlZyAmPSB+KDB4MSA8PCAxKTsKLQl1aVJlZyB8PSAoMHgxIDw8IDEpOworCXVpUmVnICY9IH4oMHgxIDw8IENPTkZfUk9PVF9DT01QTEVYX09GRlNFVCk7CisJdWlSZWcgfD0gKDB4MSA8PCBDT05GX1JPT1RfQ09NUExFWF9PRkZTRVQpOwogCU1WX1JFR19XUklURShQRVhfQ1RSTF9SRUcoMCksIHVpUmVnKTsKIAogCS8qIFJlZyAweDQxYTYwLCBEZWFzc2VydCBzb2Z0X3Jlc2V0WzIwXSB0byAweDAqLwpAQCAtNzY4LDYgKzg4MSwxNSBAQAogewogCU1WX1RXU0lfU0xBVkUJdHdzaVNsYXZlOwogCisJLyogUG9sYXJpdHkgaXMgcmVsZXZhbnQgb25seSBmb3IgREIgYm9hcmQ6CisJICogUENJZSBQb2xhcml0eSBpbnZlcnNpb24gaXMgcmVsZXZhbnQgb25seSBmb3IgUENJZSBzbG90cy4KKwkgKiBvbmx5IEFDMyBEQiBib2FyZCB1c2UgUENJZSB3aXRoIHNsb3QsCisJICogb3RoZXIgYm9hcmRzIHVzZSBQQ0llIHRvIGNvbm5lY3QgZHVhbCBNU1lTIGNwdXMqLworI2lmIGRlZmluZWQgQ09ORklHX0FMTEVZQ0FUMworCWlmIChtdkJvYXJkSWRHZXQoKSAhPSBEQl9BQzNfSUQpCisJCXJldHVybiBNVl9PSzsKKyNlbmRpZgorCiAJLyogSW5pdGlhbGl6aW5nIHR3c2lTbGF2ZSBpbiBvcmRlciB0byByZWFkIGZyb20gdGhlIFRXU0kgYWRkcmVzcyAqLwogCXR3c2lTbGF2ZS5zbGF2ZUFkZHIuYWRkcmVzcyA9IDB4MTg7CS8qIEFkZHJlc3Mgb2YgQUMzIENQTEQgKi8KIAl0d3NpU2xhdmUuc2xhdmVBZGRyLnR5cGUgPSBBRERSN19CSVQ7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9tc3lzL212SGlnaFNwZWVkRW52U3BlYy5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvbXN5cy9tdkhpZ2hTcGVlZEVudlNwZWMuaAppbmRleCA0NmMzYTIxLi5hN2YxMmMwIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9tc3lzL212SGlnaFNwZWVkRW52U3BlYy5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L21zeXMvbXZIaWdoU3BlZWRFbnZTcGVjLmgKQEAgLTc4LDkgKzc4LDI4IEBACiAjZGVmaW5lIExBU1RfTEFORV9OVU0JCQkyMQogI2VuZGlmCiAKLSNkZWZpbmUgTVZfU0VSREVTXzI4Tk1fUkVWXzEJMHgwCi0jZGVmaW5lIE1WX1NFUkRFU18yOE5NX1JFVl8zCTB4MQorI2RlZmluZSBNVl9TRVJERVNfMjhOTV9SRVZfMQkJCQkweDAKKyNkZWZpbmUgTVZfU0VSREVTXzI4Tk1fUkVWXzMJCQkJMHgxCiAKKworI2RlZmluZSBDT05GX1JPT1RfQ09NUExFWF9PRkZTRVQJCQkxCisjZGVmaW5lIFBFWF9QSFlfSU5ESVJFQ1RfQUNDX1JFRwkJCTB4NDFiMDAKKyNkZWZpbmUgUEhZX0FDQ0VTU19NT0RFX09GRlNFVAkJCQkzMQorI2RlZmluZSBQSFlfQUREUkVTU19PRkZTRVQJCQkJMTYKKy8qIENPTVBIWV9NX1BJUEVfUjJQM18yOEhQTV9SRUdfTUlEQVNfSU5URVJOQUxfUENJRTAwMSByZWdpc3RlcnMgLQorICB3aXRoIGluZGlyZWN0IGFjY2VzcyB2aWEgUEVYX1BIWV9JTkRJUkVDVF9BQ0NfUkVHICovCisjZGVmaW5lIEcyX1NFVFRJTkdfMAkJCQkJMHgwMEYKKyNkZWZpbmUgUEhZVFNUX1JFRzAJCQkJCTB4MDE1CisjZGVmaW5lIFZUSElNUENBTF9DVFJMX1JFRwkJCQkweDA0MQorI2RlZmluZSBDQUxfUkVHMwkJCQkJMHgwNTcKKyNkZWZpbmUgR0xPQl9DTEtfQ1RSTAkJCQkJMHgxQzEKKworI2RlZmluZSBUWF9BTkRfUlhfSU1QRURBTkNFX1RIUkVTSElPTEQJCQkweDExCisKKyNkZWZpbmUgSU1QRURBTkNFX1RIUkVTSElPTERfT0ZGU0VUCQkJOAorI2RlZmluZSBSWF9DQUxJQlJBVElPTl9PRkZTRVQJCQkJNworI2RlZmluZSBUWF9DQUxJQlJBVElPTl9PRkZTRVQJCQkJMTQKKyNkZWZpbmUgVFhfU0xFV19DTlRSTF9FTkFCTEVfT0ZGU0VUCQkJMTUKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRW51bSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHR5cGVkZWYgZW51bSB7CiAJUEVYMCwKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcG0vYTM4eC9zdXNwZW5kV2FrZXVwLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BtL2EzOHgvc3VzcGVuZFdha2V1cC5jCmluZGV4IDNlYmVlYjYuLmUxYzVhMGQgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcG0vYTM4eC9zdXNwZW5kV2FrZXVwLmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19wbS9hMzh4L3N1c3BlbmRXYWtldXAuYwpAQCAtODIsOSArODIsNiBAQAogKiBOb3RlczoKICogUmV0dXJuczoJTm9uZS4KICovCi0jZGVmaW5lIEJPT1RfSU5GT19BRERSCQkJCSgweDMwMDApCi0jZGVmaW5lIFNVU1BFTkRfTUFHSUNfV09SRAkJCSgweERFQURCMDAyKQotI2RlZmluZSBSRUdJU1RFUl9MSVNUX0VORAkJCSgweEZGRkZGRkZGKQogTVZfU1RBVFVTIHN1c3BlbmRXYWtldXAodm9pZCkKIHsKIAlpbnQgKmJvb3RfaW5mbyA9IChpbnQqKShCT09UX0lORk9fQUREUik7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2RvaW1hZ2VfbXYvZG9pbWFnZS5jIGIvdG9vbHMvbWFydmVsbC9kb2ltYWdlX212L2RvaW1hZ2UuYwppbmRleCA5OTg2MWE5Li5lMzc2ODA3IDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2RvaW1hZ2VfbXYvZG9pbWFnZS5jCisrKyBiL3Rvb2xzL21hcnZlbGwvZG9pbWFnZV9tdi9kb2ltYWdlLmMKQEAgLTE0ODEsNyArMTQ4MSw3IEBACiAJaW50CQkJaTsKIAlpbnQgCQlvdmVycmlkZVsyXTsKIAljaGFyIAkJKmJ1Zl9pbiA9IE5VTEw7Ci0JaW50IAkJZXJyID0gMTsKKwlpbnQgCQllcnIgPSAwOwogCiAJLyogY2hlY2sgaWYgdGhlIG91dHB1dCBpbWFnZSBleGlzdCAqLwogCXByaW50ZigiICIpOwpAQCAtMTY0MSwxMCArMTY0MSw4IEBACiAJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdyaXRpbmcgJXMgZmlsZSBcbiIsIG9wdC0+Zm5hbWUub3V0KTsKIAkJCWdvdG8gZW5kOwogCQl9Ci0KLQkJZnByaW50ZihzdGRvdXQsICI9PT09Pj4+PiAlcyB3YXMgY3JlYXRlZFxuIiwgb3B0LT5mbmFtZV9hcnJbSU1HX0ZJTEVfSU5EWF0pOwotCiAJfSAvKiBpZiAob3B0LT5oZWFkZXJfbW9kZSAhPSBIRFJfT05MWSkgKi8KKwlmcHJpbnRmKHN0ZG91dCwgIj09PT0+Pj4+ICVzIHdhcyBjcmVhdGVkXG4iLCBvcHQtPmZuYW1lX2FycltJTUdfRklMRV9JTkRYXSk7CiAKIGVuZDoKIAkvKiBjbG9zZSBoYW5kbGVzICovCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2RvaW1hZ2VfbXYvaGRycGFyc2VyLmMgYi90b29scy9tYXJ2ZWxsL2RvaW1hZ2VfbXYvaGRycGFyc2VyLmMKaW5kZXggYjdjMjMwZi4uNWIzODUzOSAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9kb2ltYWdlX212L2hkcnBhcnNlci5jCisrKyBiL3Rvb2xzL21hcnZlbGwvZG9pbWFnZV9tdi9oZHJwYXJzZXIuYwpAQCAtNzksNyArNzksNyBAQAogI2luY2x1ZGUgInBvbGFyc3NsL3JzYS5oIgogLy8jaW5jbHVkZSAicG9sYXJzc2wvYWVzLmgiCiAKLSNkZWZpbmUgVkVSU0lPTl9OVU1CRVIJIjIuMCIKKyNkZWZpbmUgVkVSU0lPTl9OVU1CRVIJIjIuMDEiCiAKIC8qIFNlY3VyaXR5IGNvbnRleHQgKi8KIHR5cGVkZWYgc3RydWN0IHNlY0N0eF90IHsKQEAgLTQ4MSw3ICs0ODEsNyBAQAogCXNlY0N0eC5yc2EubGVuID0gKG1waV9tc2IoJnNlY0N0eC5yc2EuTikgKyA3KSA+PiAzOyAvKiBrZXkgbGVuZ3RoIGluIGJ5dGVzICovCiAKIAkvKiBLZXkgbGVuZ3RoIHNob3VsZCBpbmNsdWRlIDQgYnl0ZXMgb2YgdGhlIGRhdGEgYmxvY2sgaGVhZGVyICovCi0JcnNhS2V5TGVuID0gKCgocFNlY0hkci0+Y3NrQXJyYXlbY3NrX2lkeF0pLktleSlbY3NrX2lkeF0gPDwgOCkgKyAoKHBTZWNIZHItPmNza0FycmF5W2Nza19pZHhdKS5LZXkpWzNdICsgNDsKKwlyc2FLZXlMZW4gPSAoKChwU2VjSGRyLT5jc2tBcnJheVtjc2tfaWR4XSkuS2V5KVsyXSA8PCA4KSArICgocFNlY0hkci0+Y3NrQXJyYXlbY3NrX2lkeF0pLktleSlbM10gKyA0OwogCXNoYTIoKHVuc2lnbmVkIGNoYXIgKikoKHBTZWNIZHItPmNza0FycmF5W2Nza19pZHhdKS5LZXkpLCByc2FLZXlMZW4sIGJ1ZjMyLCAwKTsKIAlmcHJpbnRmKHN0ZG91dCwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCWZwcmludGYoc3Rkb3V0LCJSU0Ega2V5IFNIQTI1NiBkaWdlc3QgZm9yIGVGdXNlIChDU0stJWQpOlxuICBCRSBGVUxMOiAiLCBjc2tfaWR4KTsK