ZGlmZiAtLWdpdCBhL2NwdS9pMzg2L01ha2VmaWxlIGIvY3B1L2kzODYvTWFrZWZpbGUKaW5kZXggMTQ4MjM5OC4uNzA2N2EwNiAxMDA2NDQKLS0tIGEvY3B1L2kzODYvTWFrZWZpbGUKKysrIGIvY3B1L2kzODYvTWFrZWZpbGUKQEAgLTI2LDE3ICsyNiwxOCBAQAogTElCCT0gbGliJChDUFUpLmEKIAogU1RBUlQJPSBzdGFydC5vIHN0YXJ0MTYubyByZXNldC5vIAotT0JKUwk9IHNlcmlhbC5vIGludGVycnVwdHMubyBjcHUubyB0aW1lci5vCi0JICAKK0NPQkpTCT0gc2VyaWFsLm8gaW50ZXJydXB0cy5vIGNwdS5vIHRpbWVyLm8gc2M1MjAubyAKK0FPQkpTCT0gc2M1MjBfYXNtLm8KKwkKIGFsbDoJLmRlcGVuZCAkKFNUQVJUKSAkKExJQikKIAotJChMSUIpOgkkKE9CSlMpCi0JJChBUikgY3J2ICRAICQoT0JKUykKKyQoTElCKToJJChDT0JKUykgJChBT0JKUykKKwkkKEFSKSBjcnYgJEAgJChDT0JKUykgJChBT0JKUykKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi0uZGVwZW5kOglNYWtlZmlsZSAkKFNUQVJUOi5vPS5TKSAkKE9CSlM6Lm89LmMpCi0JCSQoQ0MpIC1NICQoQ0ZMQUdTKSAkKFNUQVJUOi5vPS5TKSAkKE9CSlM6Lm89LmMpID4gJEAKKy5kZXBlbmQ6CU1ha2VmaWxlICQoU1RBUlQ6Lm89LlMpICQoQ09CSlM6Lm89LmMpICQoQU9CSlM6Lm89LlMpCisJCSQoQ0MpIC1NICQoQ0ZMQUdTKSAkKFNUQVJUOi5vPS5TKSAkKENPQkpTOi5vPS5jKSAkKEFPQkpTOi5vPS5TKSA+ICRACiAKIHNpbmNsdWRlIC5kZXBlbmQKIApkaWZmIC0tZ2l0IGEvY3B1L2kzODYvY29uZmlnLm1rIGIvY3B1L2kzODYvY29uZmlnLm1rCmluZGV4IDcwY2FlYjIuLmM3Y2YxNTEgMTAwNjQ0Ci0tLSBhL2NwdS9pMzg2L2NvbmZpZy5taworKysgYi9jcHUvaTM4Ni9jb25maWcubWsKQEAgLTIxLDYgKzIxLDYgQEAKICMgTUEgMDIxMTEtMTMwNyBVU0EKICMKIAotUExBVEZPUk1fUkVMRkxBR1MgKz0gIyAtcGlwZSAtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0yIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgLW5vc3RkbGliCitQTEFURk9STV9SRUxGTEFHUyArPSAKIAotUExBVEZPUk1fQ1BQRkxBR1MgKz0gLW1hcmNoPWkzODYKK1BMQVRGT1JNX0NQUEZMQUdTICs9IC1tYXJjaD1pMzg2IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2NwdS9pMzg2L2NwdS5jIGIvY3B1L2kzODYvY3B1LmMKaW5kZXggNjY5ODIzZi4uM2M2N2MxMiAxMDA2NDQKLS0tIGEvY3B1L2kzODYvY3B1LmMKKysrIGIvY3B1L2kzODYvY3B1LmMKQEAgLTM4LDYgKzM4LDEzIEBACiAKIGludCBjcHVfaW5pdCh2b2lkKQogeworCS8qIGluaXRpYWxpemUgRlBVLCByZXNldCBFTSwgc2V0IE1QIGFuZCBORSAqLworCWFzbSAoImZuaW5pdFxuIiBcCisgICAgICAgICAgICAgIm1vdmwgJWNyMCwgJWVheFxuIiBcCisgICAgICAgICAgICAgImFuZGwgJH4weDQsICVlYXhcbiIgXAorICAgICAgICAgICAgICJvcmwgICQweDIyLCAlZWF4XG4iIFwKKyAgICAgICAgICAgICAibW92bCAlZWF4LCAlY3IwXG4iICk7CisJCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2NwdS9pMzg2L2ludGVycnVwdHMuYyBiL2NwdS9pMzg2L2ludGVycnVwdHMuYwppbmRleCA4MWQ2ODgxLi42MTRkNDA4IDEwMDY0NAotLS0gYS9jcHUvaTM4Ni9pbnRlcnJ1cHRzLmMKKysrIGIvY3B1L2kzODYvaW50ZXJydXB0cy5jCkBAIC0yOSwyMiArMjksNiBAQAogI2luY2x1ZGUgPGFzbS9pYm1wYy5oPgogCiAKLSNpZiAwCi0vKiBkb25lICovCi1pbnQJaW50ZXJydXB0X2luaXQgICAgICh2b2lkKTsKLXZvaWQJaXJxX2luc3RhbGxfaGFuZGxlcihpbnQsIGludGVycnVwdF9oYW5kbGVyX3QgKiwgdm9pZCAqKTsKLXZvaWQJaXJxX2ZyZWVfaGFuZGxlciAgIChpbnQpOwotdm9pZAllbmFibGVfaW50ZXJydXB0cyAgKHZvaWQpOwotaW50CWRpc2FibGVfaW50ZXJydXB0cyAodm9pZCk7Ci0KLS8qIHRvZG8gKi8KLXZvaWQJdGltZXJfaW50ZXJydXB0ICAgIChzdHJ1Y3QgcHRfcmVncyAqKTsKLXZvaWQJZXh0ZXJuYWxfaW50ZXJydXB0IChzdHJ1Y3QgcHRfcmVncyAqKTsKLXZvaWQJcmVzZXRfdGltZXIJICAgKHZvaWQpOwotdWxvbmcJZ2V0X3RpbWVyCSAgICh1bG9uZyBiYXNlKTsKLXZvaWQJc2V0X3RpbWVyCSAgICh1bG9uZyB0KTsKLQotI2VuZGlmCiAKIHN0cnVjdCBpZHRfZW50cnkgewogCXUxNgliYXNlX2xvdzsKQEAgLTc2LDQzICs2MCwzMCBAQAogc3RhdGljIGlycV9kZXNjX3QgaXJxX3RhYmxlW01BWF9JUlFdOwogCiAKLS8qIHN5c2NhbGwgc3R1ZmYsIHZlcnkgdW50ZXN0ZWQgCi0gKiB0aGUgY3VycmVudCBhcHByb2FjaCB3aGljaCBpbmNsdWRlcyBjb3B5aW5nCi0gKiBwYXJ0IG9mIHRoZSBzdGFjayB3aWxsIHdvcmsgYmFkbHkgZm9yIAotICogdmFyYXJncyBmdW5jdGlvbnMuCi0gKiBpZiB3ZSB3ZXJlIHRvIHN0b3JlIHRoZSB0b3AgdGhyZWUgd29yZHMgb24gdGhlCi0gKiBzdGFjayAoZWlwLCBzcywgZWZsYWdzKSBzb213aGVyZSBhbmQgYWRkIDE0IHRvCi0gKiAlZXNwIC4uLi4KLSAqLworCiBhc20oIi5nbG9ibCBzeXNjYWxsX2VudHJ5XG4iIFwKICAgICAgICAgInN5c2NhbGxfZW50cnk6XG4iIFwKLSAgICAgICAgIm1vdmwgICAxMiglZXNwKSwgJWVheFxuIiBcCi0JIm1vdmwgICAlZXNwLCAlZWJ4XG4iIFwKLSAgICAgICAgImFkZGwgICAkMTYsICVlYnhcbiIgXAotICAgICAgICAicHVzaGwgICVlYnhcbiIgXAotICAgICAgICAicHVzaGwgICVlYXhcbiIgXAotICAgICAgICAiY2FsbCAgIGRvX3N5c2NhbGxcbiIgXAotICAgICAgICAiYWRkbCAgICQ4LCAlZXNwXG4iIFwKLSAgICAgICAgImlyZXRcbiIpOworICAgICAgICAicG9wbCAgICVlYnhcbiIgICAgICAgIC8qIHRocm93IGF3YXkgdGhlIHJldHVybiBhZGRyZXNzLCBmbGFncyAgKi8gXAorICAgICAgICAicG9wbCAgICVlYnhcbiIgICAgICAgIC8qIGFuZCBzZWdtZW50IHRoYXQgdGhlIElOVCBpbnN0cnVjdGlvbiBwdXNoZWQgKi8gXAorICAgICAgICAicG9wbCAgICVlYnhcbiIgICAgICAgIC8qIG9uIHRvIHRoZSBzdGFjayAqLyBcCisgICAgICAgICJtb3ZsICAgJWVheCwgJWVjeFxuIiAgLyogbG9hZCB0aGUgc3lzY2FsbCBuciBhcmd1bWVudCovIFwKKyAgICAgICAgIm1vdmwgICBzeXNjYWxsX3RibCwgJWVheFxuIiAvKiBsb2FkIHN0YXJ0IG9mIHN5c2NhbGwgdGFibGUgKi8gXAorICAgICAgICAiY21wbCAgICQoMTEtMSksICVlY3hcbiIgIC8qIEZpeE1lOiBmaW5kIGEgd2F5IHRvIHVzZSBOUl9TWVNDQUxMUyBtYWNybyBoZXJlICovIFwKKyAgICAgICAgImphICAgICBiYWRfc3lzY2FsbFxuIiBcCisgICAgICAgICJtb3ZsICAgKCVlYXgsICVlY3gsIDQpLCAlZWF4XG4iIC8qIGxvYWQgdGhlIGhhbmRsZXIgb2YgdGhlIHN5c2NhbGwqLyBcCisgICAgICAgICJ0ZXN0ICAgJWVheCwgJWVheFxuIiAvKiB0ZXN0IGZvciBudWxsICovIFwKKyAgICAgICAgImplICAgICBiYWRfc3lzY2FsbFxuIiBcCisgICAgICAgICJwb3BsICAgJWVjeFxuIiBcCisgICAgICAgICJwb3BsICAgJWVieFxuIiBcCisgICAgICAgICJzdGkgICAgXG4iIFwKKyAgICAgICAgImptcCAgICAqJWVheFxuIiBcCisiYmFkX3N5c2NhbGw6IG1vdmwgJDB4ZmZmZmZmZmYsICVlYXhcbiIgXAorICAgICAgICAicG9wbCAgICVlY3hcbiIgXAorICAgICAgICAicG9wbCAgICVlYnhcbiIgXAorICAgICAgICAicmV0Iik7CiAKIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBzeXNjYWxsX2VudHJ5KHZvaWQpOwogCi1pbnQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBkb19zeXNjYWxsKHUzMiBuciwgdTMyICpzdGFjaykKLXsKLQlpZiAobnI8TlJfU1lTQ0FMTFMpIHsKLQkJLyogV2UgY29weSA4IGFyZ3Mgb2YgdGhlIHN5c2NhbGwsCi0JCSAqIHRoaXMgd2lsbCBiZSBhIHByb2JsZW0gd2l0aCB0aGUgCi0JCSAqIHByaW50ZiBzeXNjYWxsIC4uLi4gKi8KLQkJaW50ICgqZnApKHUzMiwgdTMyLCB1MzIsIHUzMiwKLQkJCSAgdTMyLCB1MzIsIHUzMiwgdTMyKTsKLQkJZnAgPSBzeXNjYWxsX3RibFtucl07Ci0JCXJldHVybiBmcChzdGFja1swXSwgc3RhY2tbMV0sIHN0YWNrWzJdLCBzdGFja1szXSwKLQkJCQkJICAgICBzdGFja1s0XSwgc3RhY2tbNV0sIHN0YWNrWzZdLCBzdGFja1s3XSk7Ci0JfQotCQotCXJldHVybiAtMTsKLX0KLQkKIAogYXNtICgiaXJxX3JldHVybjpcbiIKICAgICAgIiAgICAgYWRkbCAgJDQsICVlc3BcbiIKZGlmZiAtLWdpdCBhL2NwdS9pMzg2L3NjNTIwLmMgYi9jcHUvaTM4Ni9zYzUyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMDA4OWEKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvaTM4Ni9zYzUyMC5jCkBAIC0wLDAgKzEsNTAyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiA8ZGFuaWVsQG9taWNyb24uc2U+LgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIHN0dWZmIHNwZWNpZmljIGZvciB0aGUgc2M1MjAsCisgKiBidXQgaWRlcGVuZGVudCBvZiBpbXBsZW1lbnRhdGlvbiAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfU0M1MjAKKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgPHNzaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaWMvc2M1MjAuaD4KKworLyogCisgKiB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYm9hcmRzIGJhc2VkIG9uIHRoZSBBTUQgc2M1MjAgCisgKiAKKyAqIHZvaWQgd3JpdGVfbW1jcl9ieXRlKHUxNiBtbWNyLCB1OCBkYXRhKQorICogdm9pZCB3cml0ZV9tbWNyX3dvcmQodTE2IG1tY3IsIHUxNiBkYXRhKQorICogdm9pZCB3cml0ZV9tbWNyX2xvbmcodTE2IG1tY3IsIHUzMiBkYXRhKQorICogCisgKiB1OCAgIHJlYWRfbW1jcl9ieXRlKHUxNiBtbWNyKQorICogdTE2ICByZWFkX21tY3Jfd29yZCh1MTYgbW1jcikKKyAqIHUzMiAgcmVhZF9tbWNyX2xvbmcodTE2IG1tY3IpCisgKiAKKyAqIHZvaWQgaW5pdF9zYzUyMCh2b2lkKQorICogdW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKKyAqIHZvaWQgcGNpX3NjNTIwX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQorICogCisgKiB2b2lkIHJlc2V0X3RpbWVyKHZvaWQpCisgKiB1bG9uZyBnZXRfdGltZXIodWxvbmcgYmFzZSkKKyAqIHZvaWQgc2V0X3RpbWVyKHVsb25nIHQpCisgKiB2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpCisgKiAKKyAqLworCitzdGF0aWMgdTMyIG1tY3JfYmFzZT0gMHhmZmZlZjAwMDsKKwordm9pZCB3cml0ZV9tbWNyX2J5dGUodTE2IG1tY3IsIHU4IGRhdGEpCit7CisJd3JpdGViKGRhdGEsIG1tY3IrbW1jcl9iYXNlKTsKK30KKwordm9pZCB3cml0ZV9tbWNyX3dvcmQodTE2IG1tY3IsIHUxNiBkYXRhKQoreworCXdyaXRldyhkYXRhLCBtbWNyK21tY3JfYmFzZSk7CQorfQorCit2b2lkIHdyaXRlX21tY3JfbG9uZyh1MTYgbW1jciwgdTMyIGRhdGEpCit7CisJd3JpdGVsKGRhdGEsIG1tY3IrbW1jcl9iYXNlKTsKK30KKwordTggcmVhZF9tbWNyX2J5dGUodTE2IG1tY3IpCit7CisJcmV0dXJuIHJlYWRiKG1tY3IrbW1jcl9iYXNlKTsKK30KKwordTE2IHJlYWRfbW1jcl93b3JkKHUxNiBtbWNyKQoreworCXJldHVybiByZWFkdyhtbWNyK21tY3JfYmFzZSk7CQorfQorCit1MzIgcmVhZF9tbWNyX2xvbmcodTE2IG1tY3IpCit7CisJcmV0dXJuIHJlYWRsKG1tY3IrbW1jcl9iYXNlKTsKK30KKworCit2b2lkIGluaXRfc2M1MjAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwkKKwkvKiBTZXQgdGhlIFVBUlR4Q1RMIHJlZ2lzdGVyIGF0IGl0J3Mgc2xvd2VyLAorCSAqIGJhdWQgY2xvY2sgZ2l2aW5nIHVzIGEgMS44NDMyIE1IeiByZWZlcmVuY2UgCisJICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1VBUlQxQ1RMLCA3KTsKKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDJDVEwsIDcpOworCQorCS8qIGZpcnN0IHNldCB0aGUgdGltZXIgcGluIG1hcHBpbmcgKi8KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ0xLU0VMLCAweDcyKTsJLyogbm8gY2xvY2sgZnJlcXVlbmN5IHNlbGVjdGVkLCB1c2UgMS4xODkyTUh6ICovCisJCisJLyogZW5hYmxlIFBDSSBidXMgYXJiaXRyZXIgKi8KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1lTQVJCQ1RMLDB4MDIpOyAgLyogZW5hYmxlIGNvbmN1cnJlbnQgbW9kZSAqLworCQorCXdyaXRlX21tY3Jfd29yZChTQzUyMF9TWVNBUkJNRU5CLDB4MWYpOyAvKiBlbmFibGUgZXh0ZXJuYWwgZ3JhbnRzICovCisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0hCQ1RMLDB4MDQpOyAgICAgIC8qIGVuYWJsZSBwb3N0ZWQtd3JpdGVzICovCisKKworCWlmIChDRkdfU0M1MjBfSElHSF9TUEVFRCkgeworCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ1BVQ1RMLCAweDIpOwkvKiBzZXQgaXQgdG8gMTMzIE1IeiBhbmQgd3JpdGUgYmFjayAqLworCQlnZC0+Y3B1X2NsayA9IDEzMzAwMDAwMDsKKwkJcHJpbnRmKCIjIyBDUFUgU3BlZWQgc2V0IHRvIDEzM01IelxuIik7CisJfSBlbHNlIHsKKwkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0NQVUNUTCwgMSk7CS8qIHNldCBDUFUgdG8gMTAwIE1IeiBhbmQgd3JpdGUgYmFjayBjYWNoZSAqLworCQlwcmludGYoIiMjIENQVSBTcGVlZCBzZXQgdG8gMTAwTUh6XG4iKTsKKwkJZ2QtPmNwdV9jbGsgPSAxMDAwMDAwMDA7CisJfQorCQorCisJLyogd2FpdCBhdCBsZWFzdCBvbmUgbWlsbGlzZWNvbmQgKi8KKyAgICAgICAgYXNtKCJtb3ZsCSQweDIwMDAsJSVlY3hcbiIKKwkgICAgIndhaXRfbG9vcDoJcHVzaGwgJSVlY3hcbiIKKwkgICAgInBvcGwJJSVlY3hcbiIKKwkgICAgImxvb3Agd2FpdF9sb29wXG4iOiA6IDogImVjeCIpOworCisJLyogdHVybiBvbiB0aGUgU0RSQU0gd3JpdGUgYnVmZmVyICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0RCQ1RMLCAweDExKTsKKworCS8qIHR1cm4gb24gdGhlIGNhY2hlIGFuZCBkaXNhYmxlIHdyaXRlIHRocm91Z2ggKi8KKwlhc20oIm1vdmwJJSVjcjAsICUlZWF4XG4iCisJICAgICJhbmRsCSQweDlmZmZmZmZmLCAlJWVheFxuIgorCSAgICAibW92bAklJWVheCwgJSVjcjBcbiIgIDogOiA6ICJlYXgiKTsKK30KKwordW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwliZF90ICpiZCA9IGdkLT5iZDsKKwkKKwl1MzIgZHJhbV9wcmVzZW50PTA7CisJdTMyIGRyYW1fY3RybDsKKworCWludCB2YWw7CisJCisJaW50IGNhc19wcmVjaGFyZ2VfZGVsYXkgPSBDRkdfU0RSQU1fUFJFQ0hBUkdFX0RFTEFZOwkKKwlpbnQgcmVmcmVzaF9yYXRlICAgICAgICA9IENGR19TRFJBTV9SRUZSRVNIX1JBVEU7CQorCWludCByYXNfY2FzX2RlbGF5ICAgICAgID0gQ0ZHX1NEUkFNX1JBU19DQVNfREVMQVk7CisJCisJLyogc2V0IFNEUkFNIHNwZWVkIGhlcmUgKi8KKwkKKwlyZWZyZXNoX3JhdGUvPTc4OwkKKwlpZiAocmVmcmVzaF9yYXRlPD0xKSB7CisJCXZhbCA9IDA7ICAvKiA3Ljh1cyAqLworCX0gZWxzZSBpZiAocmVmcmVzaF9yYXRlPT0yKSB7CisJCXZhbCA9IDE7ICAvKiAxNS42dXMgKi8KKwl9IGVsc2UgaWYgKHJlZnJlc2hfcmF0ZT09MyB8fCByZWZyZXNoX3JhdGU9PTQpIHsKKwkJdmFsID0gMjsgIC8qIDMxLjJ1cyAqLworCX0gZWxzZSB7CisJCXZhbCA9IDM7ICAvKiA2Mi40dXMgKi8KKwl9CisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0RSQ0NUTCwgKHJlYWRfbW1jcl9ieXRlKFNDNTIwX0RSQ0NUTCkgJiAweGNmKSB8ICh2YWw8PDQpKTsKKwkKKwl2YWwgPSByZWFkX21tY3JfYnl0ZShTQzUyMF9EUkNUTUNUTCk7CisJdmFsICY9IDB4ZjA7CisJCisJaWYgKGNhc19wcmVjaGFyZ2VfZGVsYXk9PTMpIHsJCQorCQl2YWwgfD0gMHgwNDsgICAvKiAzVCAqLworCX0gZWxzZSBpZiAoY2FzX3ByZWNoYXJnZV9kZWxheT09NCkgewkJCisJCXZhbCB8PSAweDA4OyAgIC8qIDRUICovCisJfSBlbHNlIGlmIChjYXNfcHJlY2hhcmdlX2RlbGF5PjQpIHsJCQorCQl2YWwgfD0gMHgwYzsKKwl9IAorCQorCWlmIChyYXNfY2FzX2RlbGF5ID4gMykgeworCQl2YWwgfD0gMjsgCisJfSBlbHNlIHsKKwkJdmFsIHw9IDE7IAorCX0KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfRFJDVE1DVEwsIHZhbCk7CisKKworCS8qIFdlIHJlYWQtYmFjayB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZHJhbQorCSAqIGNvbnRyb2xsZXIgdGhhdCB0aGUgYXNzZW1ibHkgY29kZSB3cm90ZSAqLworCWRyYW1fY3RybCA9IHJlYWRfbW1jcl9sb25nKFNDNTIwX0RSQ0JFTkRBRFIpOworCQorCisJYmQtPmJpX2RyYW1bMF0uc3RhcnQgPSAwOworCWlmIChkcmFtX2N0cmwgJiAweDgwKSB7CisJCS8qIGJhbmsgMCBlbmFibGVkICovCisJCWRyYW1fcHJlc2VudCA9IGJkLT5iaV9kcmFtWzFdLnN0YXJ0ID0gKGRyYW1fY3RybCAmIDB4N2YpIDw8IDIyOworCQliZC0+YmlfZHJhbVswXS5zaXplID0gYmQtPmJpX2RyYW1bMV0uc3RhcnQ7IAorCisJfSBlbHNlIHsKKwkJYmQtPmJpX2RyYW1bMF0uc2l6ZSA9IDA7CisJCWJkLT5iaV9kcmFtWzFdLnN0YXJ0ID0gYmQtPmJpX2RyYW1bMF0uc3RhcnQ7CisJfQorCQorCWlmIChkcmFtX2N0cmwgJiAweDgwMDApIHsKKwkJLyogYmFuayAxIGVuYWJsZWQgKi8KKwkJZHJhbV9wcmVzZW50ID0gYmQtPmJpX2RyYW1bMl0uc3RhcnQgPSAoZHJhbV9jdHJsICYgMHg3ZjAwKSA8PCAxNDsKKwkJYmQtPmJpX2RyYW1bMV0uc2l6ZSA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0IC0gIGJkLT5iaV9kcmFtWzFdLnN0YXJ0OyAKKwl9IGVsc2UgeworCQliZC0+YmlfZHJhbVsxXS5zaXplID0gMDsKKwkJYmQtPmJpX2RyYW1bMl0uc3RhcnQgPSBiZC0+YmlfZHJhbVsxXS5zdGFydDsKKwl9CisJCisJaWYgKGRyYW1fY3RybCAmIDB4ODAwMDAwKSB7CisJCS8qIGJhbmsgMiBlbmFibGVkICovCisJCWRyYW1fcHJlc2VudCA9IGJkLT5iaV9kcmFtWzNdLnN0YXJ0ID0gKGRyYW1fY3RybCAmIDB4N2YwMDAwKSA8PCA2OworCQliZC0+YmlfZHJhbVsyXS5zaXplID0gYmQtPmJpX2RyYW1bM10uc3RhcnQgLSAgYmQtPmJpX2RyYW1bMl0uc3RhcnQ7IAorCX0gZWxzZSB7CisJCWJkLT5iaV9kcmFtWzJdLnNpemUgPSAwOworCQliZC0+YmlfZHJhbVszXS5zdGFydCA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0OworCX0gCisJCisJaWYgKGRyYW1fY3RybCAmIDB4ODAwMDAwMDApIHsKKwkJLyogYmFuayAzIGVuYWJsZWQgKi8KKwkJZHJhbV9wcmVzZW50ICA9IChkcmFtX2N0cmwgJiAweDdmMDAwMDAwKSA+PiAyOworCQliZC0+YmlfZHJhbVszXS5zaXplID0gZHJhbV9wcmVzZW50IC0gIGJkLT5iaV9kcmFtWzNdLnN0YXJ0OworCX0gZWxzZSB7CisJCWJkLT5iaV9kcmFtWzNdLnNpemUgPSAwOworCX0KKworCQorI2lmIDAJCisJcHJpbnRmKCJDb25maWd1cmVkICVkIGJ5dGVzIG9mIGRyYW1cbiIsIGRyYW1fcHJlc2VudCk7CisjZW5kaWYJCisJZ2QtPnJhbV9zaXplID0gZHJhbV9wcmVzZW50OworCQorCXJldHVybiBkcmFtX3ByZXNlbnQ7Cit9CisKKworI2lmZGVmIENPTkZJR19QQ0kKKworCitzdGF0aWMgc3RydWN0IHsKKwl1OCBwcmlvcml0eTsKKwl1MTYgbGV2ZWxfcmVnOworCXU4IGxldmVsX2JpdDsKK30gc2M1MjBfaXJxW10gPSB7CisJeyBTQzUyMF9JUlEwLCAgU0M1MjBfTVBJQ01PREUsICAweDAxIH0sCisJeyBTQzUyMF9JUlExLCAgU0M1MjBfTVBJQ01PREUsICAweDAyIH0sCisJeyBTQzUyMF9JUlEyLCAgU0M1MjBfU0wxUElDTU9ERSwgMHgwMiB9LAorCXsgU0M1MjBfSVJRMywgIFNDNTIwX01QSUNNT0RFLCAgMHgwOCB9LAorCXsgU0M1MjBfSVJRNCwgIFNDNTIwX01QSUNNT0RFLCAgMHgxMCB9LAorCXsgU0M1MjBfSVJRNSwgIFNDNTIwX01QSUNNT0RFLCAgMHgyMCB9LAorCXsgU0M1MjBfSVJRNiwgIFNDNTIwX01QSUNNT0RFLCAgMHg0MCB9LAorCXsgU0M1MjBfSVJRNywgIFNDNTIwX01QSUNNT0RFLCAgMHg4MCB9LAorCisJeyBTQzUyMF9JUlE4LCAgU0M1MjBfU0wxUElDTU9ERSwgMHgwMSB9LAorCXsgU0M1MjBfSVJROSwgIFNDNTIwX1NMMVBJQ01PREUsIDB4MDIgfSwKKwl7IFNDNTIwX0lSUTEwLCBTQzUyMF9TTDFQSUNNT0RFLCAweDA0IH0sCisJeyBTQzUyMF9JUlExMSwgU0M1MjBfU0wxUElDTU9ERSwgMHgwOCB9LAorCXsgU0M1MjBfSVJRMTIsIFNDNTIwX1NMMVBJQ01PREUsIDB4MTAgfSwKKwl7IFNDNTIwX0lSUTEzLCBTQzUyMF9TTDFQSUNNT0RFLCAweDIwIH0sCisJeyBTQzUyMF9JUlExNCwgU0M1MjBfU0wxUElDTU9ERSwgMHg0MCB9LAorCXsgU0M1MjBfSVJRMTUsIFNDNTIwX1NMMVBJQ01PREUsIDB4ODAgfQorfTsKKworCisvKiBUaGUgaW50ZXJydXB0IHVzZWQgZm9yIFBDSSBJTlRBLUlOVEQgICovCitpbnQgc2M1MjBfcGNpX2ludHNbMTVdID0geyAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xCit9OworCisvKiB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSBhIHBjaSBpbnRlcnJ1cHQgKi8KK2ludCBwY2lfc2M1MjBfc2V0X2lycShpbnQgcGNpX3BpbiwgaW50IGlycSkgCit7CisJaW50IGk7CisJCisjIGlmIDAKKwlwcmludGYoInNldF9pcnEoKTogbWFwIElOVCVjIHRvIElSUSVkXG4iLCBwY2lfcGluICsgJ0EnLCBpcnEpOworI2VuZGlmCQorCWlmIChpcnEgPCAwIHx8IGlycSA+IDE1KSB7CisJCXJldHVybiAtMTsgLyogaWxsZWdhbCBpcnEgKi8KKwl9CisKKwlpZiAocGNpX3BpbiA8IDAgfHwgcGNpX3BpbiA+IDE1KSB7CisJCXJldHVybiAtMTsgLyogaWxsZWdhbCBwY2kgaW50IHBpbiAqLworCX0KKworCS8qIGZpcnN0IGRpc2FibGUgYW55IG5vbi1wY2kgaW50ZXJydXB0IHNvdXJjZSB0aGF0IHVzZSAKKwkgKiB0aGlzIGxldmVsICovCisJZm9yIChpPVNDNTIwX0dQVE1SME1BUDtpPD1TQzUyMF9HUDEwSU1BUDtpKyspIHsKKwkJaWYgKGk+PVNDNTIwX1BDSUlOVEFNQVAmJmk8PVNDNTIwX1BDSUlOVERNQVApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChyZWFkX21tY3JfYnl0ZShpKSA9PSBzYzUyMF9pcnFbaXJxXS5wcmlvcml0eSkgeworCQkJd3JpdGVfbW1jcl9ieXRlKGksIFNDNTIwX0lSUV9ESVNBQkxFRCk7CisJCX0KKwl9CisJCisJLyogU2V0IHRoZSB0cmlnZ2VyIHRvIGxldmVsICovCisJd3JpdGVfbW1jcl9ieXRlKHNjNTIwX2lycVtpcnFdLmxldmVsX3JlZywgCisJCQlyZWFkX21tY3JfYnl0ZShzYzUyMF9pcnFbaXJxXS5sZXZlbF9yZWcpIHwgc2M1MjBfaXJxW2lycV0ubGV2ZWxfYml0KTsKKwkKKwkKKwlpZiAocGNpX3BpbiA8IDQpIHsKKwkJLyogUENJIElOVEEtSU5URCAqLworCQkvKiByb3V0ZSB0aGUgaW50ZXJydXB0ICovCisJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRBTUFQICsgcGNpX3Bpbiwgc2M1MjBfaXJxW2lycV0ucHJpb3JpdHkpOworCQkKKwkJCisJfSBlbHNlIHsKKwkJLyogR1BJUlEwLUdQSVJRMTAgdXNlZCBmb3IgYWRkaXRpb25hbCBQQ0kgSU5UUyAqLworCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AwSU1BUCArIHBjaV9waW4gLSA0LCBzYzUyMF9pcnFbaXJxXS5wcmlvcml0eSk7CisJCQorCQkvKiBhbHNvIHNldCB0aGUgcG9sYXJpdHkgaW4gdGhpcyBjYXNlICovCisJCXdyaXRlX21tY3Jfd29yZChTQzUyMF9JTlRQSU5QT0wsIAorCQkJCXJlYWRfbW1jcl93b3JkKFNDNTIwX0lOVFBJTlBPTCkgfCAoMSA8PCAocGNpX3Bpbi00KSkpOworCQkKKwl9CisJCisJLyogcmVnaXN0ZXIgdGhlIHBpbiAqLwkJCisJc2M1MjBfcGNpX2ludHNbcGNpX3Bpbl0gPSBpcnE7CisJCisKKwlyZXR1cm4gMDsgLyogT0sgKi8KK30KKwordm9pZCBwY2lfc2M1MjBfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJaG9zZS0+Zmlyc3RfYnVzbm8gPSAwOworCWhvc2UtPmxhc3RfYnVzbm8gPSAweGZmOworCisJLyogU3lzdGVtIG1lbW9yeSBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAwLCAKKwkJICAgICAgIFNDNTIwX1BDSV9NRU1PUllfQlVTLAorCQkgICAgICAgU0M1MjBfUENJX01FTU9SWV9QSFlTLAorCQkgICAgICAgU0M1MjBfUENJX01FTU9SWV9TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CisKKwkvKiBQQ0kgbWVtb3J5IHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsIAorCQkgICAgICAgU0M1MjBfUENJX01FTV9CVVMsCisJCSAgICAgICBTQzUyMF9QQ0lfTUVNX1BIWVMsCisJCSAgICAgICBTQzUyMF9QQ0lfTUVNX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkvKiBJU0EvUENJIG1lbW9yeSBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLCAKKwkJICAgICAgIFNDNTIwX0lTQV9NRU1fQlVTLAorCQkgICAgICAgU0M1MjBfSVNBX01FTV9QSFlTLAorCQkgICAgICAgU0M1MjBfSVNBX01FTV9TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9NRU0pOworCisJLyogUENJIEkvTyBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAzLCAKKwkJICAgICAgIFNDNTIwX1BDSV9JT19CVVMsCisJCSAgICAgICBTQzUyMF9QQ0lfSU9fUEhZUywKKwkJICAgICAgIFNDNTIwX1BDSV9JT19TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwkvKiBJU0EvUENJIEkvTyBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyA0LCAKKwkJICAgICAgIFNDNTIwX0lTQV9JT19CVVMsCisJCSAgICAgICBTQzUyMF9JU0FfSU9fUEhZUywKKwkJICAgICAgIFNDNTIwX0lTQV9JT19TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwlob3NlLT5yZWdpb25fY291bnQgPSA1OworCisJcGNpX3NldHVwX3R5cGUxKGhvc2UsCisJCQlTQzUyMF9SRUdfQUREUiwKKwkJCVNDNTIwX1JFR19EQVRBKTsKKworCXBjaV9yZWdpc3Rlcl9ob3NlKGhvc2UpOworCisJaG9zZS0+bGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4oaG9zZSk7CisJCisJLyogZW5hYmxlIHRhcmdldCBtZW1vcnkgYWNjZXNlcyBvbiBob3N0IGJyaWdlICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKDAsIFBDSV9DT01NQU5ELCAKKwkJCSAgICAgIFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUik7CisKK30KKworCisKKyNlbmRpZgorCisjaWZkZWYgQ0ZHX1RJTUVSX1NDNTIwCisKKwordm9pZCByZXNldF90aW1lcih2b2lkKQoreworCXdyaXRlX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDTlQsIDApOworCXdyaXRlX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDVEwsIDB4NjAwMSk7CisJCit9CisKK3Vsb25nIGdldF90aW1lcih1bG9uZyBiYXNlKQoreworCS8qIGZpeG1lOiAzMCBvciAzMyAqLworCXJldHVybiAJcmVhZF9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ05UKSAvIDMzOworfQorCit2b2lkIHNldF90aW1lcih1bG9uZyB0KQoreworCS8qIEZpeE1lOiB1c2UgdHdvIGNhc2NhZGUgY291cGxlZCB0aW1lcnMgKi8KKwl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ1RMLCAweDQwMDEpOworCXdyaXRlX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDTlQsIHQqMzMpOworCXdyaXRlX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDVEwsIDB4NjAwMSk7Cit9CisKKwordm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjKQoreworCWludCBtPTA7CisJbG9uZyB1OworCQorCXJlYWRfbW1jcl93b3JkKFNDNTIwX1NXVE1STUlMTEkpOworCXJlYWRfbW1jcl93b3JkKFNDNTIwX1NXVE1STUlDUk8pOworCSAgICAgCisjaWYgMAorCS8qIGRvIG5vdCBlbmFibGUgdGhpcyBsaW5lLCB1ZGVsYXkgaXMgdXNlZCBpbiB0aGUgc2VyaWFsIGRyaXZlciAtPiByZWN1cnNpb24gKi8KKwlwcmludGYoInVkZWxheTogJWxkIG0udSAlZC4lZCAgdG0udHUgJWQuJWRcbiIsIHVzZWMsIG0sIHUsIHRtLCB0dSk7CisjZW5kaWYJCisJd2hpbGUgKDEpIHsKKwkJCisJCW0gKz0gcmVhZF9tbWNyX3dvcmQoU0M1MjBfU1dUTVJNSUxMSSk7CisJCXUgPSByZWFkX21tY3Jfd29yZChTQzUyMF9TV1RNUk1JQ1JPKSArIChtICogMTAwMCk7CisJCQorCQlpZiAodXNlYyA8PSB1KSB7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworI2VuZGlmCisKK2ludCBzc2lfc2V0X2ludGVyZmFjZShpbnQgZnJlcSwgaW50IGxzYl9maXJzdCwgaW50IGludl9jbG9jaywgaW50IGludl9waGFzZSkKK3sKKwl1OCB0ZW1wPTA7CisKKwlpZiAoZnJlcSA+PSA4MTkyKSB7CisJCXRlbXAgfD0gQ1RMX0NMS19TRUxfNDsgCisJfSBlbHNlIGlmIChmcmVxID49IDQwOTYpIHsKKwkJdGVtcCB8PSBDVExfQ0xLX1NFTF84OyAgICAgICAgCisJfSBlbHNlIGlmIChmcmVxID49IDIwNDgpIHsKKwkJdGVtcCB8PSBDVExfQ0xLX1NFTF8xNjsgIAorCX0gZWxzZSBpZiAoZnJlcSA+PSAxMDI0KSB7CisJCXRlbXAgfD0gQ1RMX0NMS19TRUxfMzI7ICAKKwl9IGVsc2UgaWYgKGZyZXEgPj0gNTEyKSB7CisJCXRlbXAgfD0gQ1RMX0NMS19TRUxfNjQ7CisJfSBlbHNlIGlmIChmcmVxID49IDI1NikgeworCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzEyODsKKwl9IGVsc2UgaWYgKGZyZXEgPj0gMTI4KSB7CisJCXRlbXAgfD0gQ1RMX0NMS19TRUxfMjU2OworCX0gZWxzZSB7CisJCXRlbXAgfD0gQ1RMX0NMS19TRUxfNTEyOworCX0KKwkKKwlpZiAoIWxzYl9maXJzdCkgeworCQl0ZW1wIHw9IE1TQkZfRU5COworCX0KKwkJCisJaWYgKGludl9jbG9jaykgeworCQl0ZW1wIHw9IENMS19JTlZfRU5COworCX0KKwkKKwlpZiAoaW52X3BoYXNlKSB7CisJCXRlbXAgfD0gUEhTX0lOVl9FTkI7CisJfQorCQkKKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJQ1RMLCB0ZW1wKTsKKwkKKwlyZXR1cm4gMDsKK30KKwordTggc3NpX3R4cnhfYnl0ZSh1OCBkYXRhKSAKK3sKKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJWE1JVCwgZGF0YSk7CisJd2hpbGUgKChyZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lTVEEpKSAmIFNTSVNUQV9CU1kpOworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lDTUQsIFNTSUNNRF9DTURfU0VMX1hNSVRSQ1YpOworCXdoaWxlICgocmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJU1RBKSkgJiBTU0lTVEFfQlNZKTsKKwlyZXR1cm4gcmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJUkNWKTsJCit9ICAgICAgCisKKwordm9pZCBzc2lfdHhfYnl0ZSh1OCBkYXRhKSAKK3sKKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJWE1JVCwgZGF0YSk7CisJd2hpbGUgKChyZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lTVEEpKSAmIFNTSVNUQV9CU1kpOyAKKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJQ01ELCBTU0lDTURfQ01EX1NFTF9YTUlUKTsKK30KKwordTggc3NpX3J4X2J5dGUodm9pZCkgCit7CisJd2hpbGUgKChyZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lTVEEpKSAmIFNTSVNUQV9CU1kpOworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lDTUQsIFNTSUNNRF9DTURfU0VMX1JDVik7CisJd2hpbGUgKChyZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lTVEEpKSAmIFNTSVNUQV9CU1kpOworCXJldHVybiByZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lSQ1YpOworfSAKKworI2VuZGlmIC8qIENPTkZJR19TQzUyMCAqLwpkaWZmIC0tZ2l0IGEvY3B1L2kzODYvc2M1MjBfYXNtLlMgYi9jcHUvaTM4Ni9zYzUyMF9hc20uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTk1N2M3Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L2kzODYvc2M1MjBfYXNtLlMKQEAgLTAsMCArMSw1MzYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogVGhpcyBmaWxlIGlzIGxhcmdlbHkgYmFzZWQgb24gY29kZSBvYnRuZWQgZnJvbSBBTUQuIEFNRCdzIG9yaWdpbmFsCisgKiBjb3B5cmlnaHQgaXMgaW5jbHVkZWQgYmVsb3cgCisgKi8KKworLyoKKyAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgQ29weXJpZ2h0IDE5OTkgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFRoaXMgc29mdHdhcmUgaXMgdGhlIHByb3BlcnR5IG9mIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYyAgKEFNRCkgIHdoaWNoIAorICogIHNwZWNpZmljYWxseSBncmFudHMgdGhlIHVzZXIgdGhlIHJpZ2h0IHRvIG1vZGlmeSwgdXNlIGFuZCBkaXN0cmlidXRlIHRoaXMgCisgKiAgc29mdHdhcmUgcHJvdmlkZWQgdGhpcyBDT1BZUklHSFQgTk9USUNFIGlzIG5vdCByZW1vdmVkIG9yIGFsdGVyZWQuICBBbGwgCisgKiAgb3RoZXIgcmlnaHRzIGFyZSByZXNlcnZlZCBieSBBTUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRZIAorICogIE9GIEFOWSBLSU5EIElOQ0xVRElORyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5UIE9GIAorICogIFRISVJELVBBUlRZIElOVEVMTEVDVFVBTCBQUk9QRVJUWSwgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBBTUQgT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIKKyAqICAoSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1MgT0YgUFJPRklUUywgQlVTSU5FU1MKKyAqICBJTlRFUlJVUFRJT04sIExPU1MgT0YgSU5GT1JNQUlUT04pIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgT1IgSU5BQklMSVRZCisgKiAgVE8gVVNFIFRIRSBNQVRFUklBTFMsIEVWRU4gSUYgQU1EIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiAgU1VDSCBEQU1BR0VTLiAgQkVDQVVTRSBTT01FIEpVUlNJRElDVElPTlMgUFJPSElCSVQgVEhFIEVYQ0xVU0lPTiBPUgorICogIExJTUlUQVRJT04gT0YgTElBQklMSVRZIEZPUiBDT05TRVFVRU5USUFMIE9SIElOQ0lERU5UQUwgREFNQUdFUywgVEhFIEFCT1ZFCisgKiAgTElNSVRBVElPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KKyAqIAorICogIEFNRCBkb2VzIG5vdCBhc3N1bWUgYW55IHJlc3BvbnNpYmlsaXR5IGZvciBhbnkgZXJyb3JzIHRoYXQgbWF5IGFwcGVhciBpbgorICogIHRoZSBNYXRlcmlhbHMgbm9yIGFueSByZXNwb25zaWJpbGl0eSB0byBzdXBwb3J0IG9yIHVwZGF0ZSB0aGUgTWF0ZXJpYWxzLgorICogIEFNRCByZXRhaW5zIHRoZSByaWdodCB0byBtYWtlIGNoYW5nZXMgdG8gaXRzIHRlc3Qgc3BlY2lmaWNhdGlvbnMgYXQgYW55CisgKiAgdGltZSwgd2l0aG91dCBub3RpY2UuCisgKiAKKyAqICBTbyB0aGF0IGFsbCBtYXkgYmVuZWZpdCBmcm9tIHlvdXIgZXhwZXJpZW5jZSwgcGxlYXNlIHJlcG9ydCAgYW55ICBwcm9ibGVtcyAKKyAqICBvciBzdWdnZXN0aW9ucyBhYm91dCB0aGlzIHNvZnR3YXJlIGJhY2sgdG8gQU1ELiAgUGxlYXNlIGluY2x1ZGUgeW91ciBuYW1lLCAKKyAqICBjb21wYW55LCAgdGVsZXBob25lIG51bWJlciwgIEFNRCBwcm9kdWN0IHJlcXVpcmluZyBzdXBwb3J0IGFuZCBxdWVzdGlvbiBvciAKKyAqICBwcm9ibGVtIGVuY291bnRlcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuICAgICAgICAgV29ybGR3aWRlIHN1cHBvcnQgYW5kIGNvbnRhY3QgICAgICAgICAgIAorICogIEVtYmVkZGVkIFByb2Nlc3NvciBEaXZpc2lvbiAgICAgICAgICAgIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBhdDogICAgICAgICAgICAgICAKKyAqICBTeXN0ZW1zIEVuZ2luZWVyaW5nICAgICAgICAgICAgICAgICAgICAgICBlcGQuc3VwcG9ydEBhbWQuY29tCisgKiAgNTIwNCBFLiBCZW4gV2hpdGUgQmx2ZC4gICAgICAgICAgICAgICAgICAgICAgICAgIC1vci0KKyAqICBBdXN0aW4sIFRYIDc4NzQxICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYW1kLmNvbS9odG1sL3N1cHBvcnQvdGVjaHN1cC5odG1sCisgKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSBBVVRIT1IgICAgICA6IEJ1ZGR5IEZleSAtIE9yaWdpbmFsLiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgRlVOQ1RJT05BTCBERVNDUklQVElPTjoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gYXV0b2RldGVjdCB0aGUgZ2VvbWV0cnkgb2YgdGhlIERSQU0uCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjb2x1bW4gYml0cyBmb3IgdGhlIERSQU0KKyAqIGRldmljZXMgaW4gdGhpcyBleHRlcm5hbCBiYW5rLiBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IHRoZSBleHRlcm5hbCBiYW5rCisgKiBoYXMgYmVlbiBjb25maWd1cmVkIGZvciBhbiAxMS1iaXQgY29sdW1uIGFuZCBmb3IgNCBpbnRlcm5hbCBiYW5rcy4gVGhpcyBnaXZlcworICogdXMgdGhlIG1heGltdW0gYWRkcmVzcyByZWFjaCBpbiBtZW1vcnkuIEJ5IHdyaXRpbmcgYSB0ZXN0IHZhbHVlIHRvIHRoZSBtYXgKKyAqIGFkZHJlc3MgYW5kIGxvY2F0aW5nIHdoZXJlIGl0IGFsaWFzZXMgdG8sIHdlIGNhbiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiB2YWxpZAorICogY29sdW1uIGJpdHMuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBpbnRlcm5hbCBiYW5rcyBlYWNoIERSQU0KKyAqIGRldmljZSBoYXMuIFRoZSBleHRlcm5hbCBiYW5rICh1bmRlciB0ZXN0KSBpcyBjb25maWd1cmVkIGZvciBtYXhpbXVtIHJlYWNoCisgKiB3aXRoIDExLWJpdCBjb2x1bW5zIGFuZCA0IGludGVybmFsIGJhbmtzLiBUaGlzIHJvdXRpbmUgd2lsbCB3cml0ZSB0byBhIG1heAorICogYWRkcmVzcyAoQkExIGFuZCBCQTAgPSAxKSBhbmQgdGhlbiByZWFkIGZyb20gYW4gYWRkcmVzcyB3aXRoIEJBMT0wIHRvIHNlZSBpZgorICogdGhhdCBjb2x1bW4gaXMgYSAiZG9uJ3QgY2FyZSIuIElmIEJBMSBkb2VzIG5vdCBhZmZlY3Qgd3JpdGUvcmVhZCBvZiBkYXRhLAorICogdGhlbiB0aGlzIGRldmljZSBoYXMgb25seSAyIGludGVybmFsIGJhbmtzLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZGV0ZXJtaW5lIHRoZSBlbmRpbmcgYWRkcmVzcyBmb3IgdGhpcyBleHRlcm5hbAorICogYmFuayBvZiBTRFJBTS4gV2Ugd3JpdGUgdG8gYSBtYXggYWRkcmVzcyB3aXRoIGEgZGF0YSB2YWx1ZSBhbmQgdGhlbiBkaXNhYmxlCisgKiByb3cgYWRkcmVzcyBiaXRzIGxvb2tpbmcgZm9yICJkb24ndCBjYXJlIiBsb2NhdGlvbnMuIEVhY2ggImRvbid0IGNhcmUiIGJpdAorICogcmVwcmVzZW50cyBhIGRpdmlkaW5nIG9mIHRoZSBtYXhpbXVtIGRlbnNpdHkgKDEyOE0pIGJ5IDIuIEJ5IGRpdmlkaW5nIHRoZQorICogbWF4aW11bSBvZiAzMiA0TSBjaHVua3MgaW4gYW4gZXh0ZXJuYWwgYmFuayBkb3duIGJ5IGFsbCB0aGUgImRvbid0IGNhcmUiIGJpdHMKKyAqIGRldGVybWluZWQgZHVyaW5nIHNpemluZywgd2Ugc2V0IHRoZSBwcm9wZXIgZGVuc2l0eS4KKyAqCisgKiBXQVJOSU5HUy4KKyAqIGJwIG11c3QgYmUgcHJlc2VydmVkIGJlY2F1c2UgaXQgaXMgdXNlZCBmb3IgcmV0dXJuIGxpbmthZ2UuCisgKgorICogRVhJVAorICogbm90aGluZyByZXR1cm5lZCAtIGJ1dCB0aGUgbWVtb3J5IHN1YnN5c3RlbSBpcyBlbmFibGVkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpZmRlZiBDT05GSUdfU0M1MjAKKworLnNlY3Rpb24gLnRleHQKKy5lcXUgICAgICAgICAgICBEUkNDVEwsICAgICAweDBmZmZlZjAxMCAgIC8qIERSQU0gY29udHJvbCByZWdpc3RlciAqLworLmVxdSAgICAgICAgICAgIERSQ1RNQ1RMLCAgIDB4MGZmZmVmMDEyICAgLyogRFJBTSB0aW1pbmcgY29udHJvbCByZWdpc3RlciAqLworLmVxdSAgICAgICAgICAgIERSQ0NGRywgICAgIDB4MGZmZmVmMDE0ICAgLyogRFJBTSBiYW5rIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKy5lcXUgICAgICAgICAgICBEUkNCRU5EQURSLCAweDBmZmZlZjAxOCAgIC8qIERSQU0gYmFuayBlbmRpbmcgYWRkcmVzcyByZWdpc3RlciAqLworLmVxdSAgICAgICAgICAgIEVDQ0NUTCwgICAgIDB4MGZmZmVmMDIwICAgLyogRFJBTSBFQ0MgY29udHJvbCByZWdpc3RlciAqLworLmVxdSAgICAgICAgICAgIERCQ1RMLCAgICAgIDB4MGZmZmVmMDQwICAgLyogRFJBTSBidWZmZXIgY29udHJvbCByZWdpc3RlciAqLworCisuZXF1ICAgICAgICAgICAgQ0FDSEVMSU5FU1osIDB4MDAwMDAwMTAgICAvKiBzaXplIG9mIG91ciBjYWNoZSBsaW5lIChyZWFkIGJ1ZmZlcikgKi8KKy5lcXUgICAgICAgICAgICBDT0wxMV9BRFIsICAweDBlMDAxZTAwICAgIC8qIDExIGNvbCBhZGRycyAqLworLmVxdSAgICAgICAgICAgIENPTDEwX0FEUiwgIDB4MGUwMDBlMDAgICAgLyogMTAgY29sIGFkZHJzICovCisuZXF1ICAgICAgICAgICAgQ09MMDlfQURSLCAgMHgwZTAwMDYwMCAgICAvKiAgOSBjb2wgYWRkcnMgKi8KKy5lcXUgICAgICAgICAgICBDT0wwOF9BRFIsICAweDBlMDAwMjAwICAgIC8qICA4IGNvbCBhZGRycyAqLworLmVxdSAgICAgICAgICAgIFJPVzE0X0FEUiwgIDB4MGYwMDAwMDAgICAgLyogMTQgcm93IGFkZHJzICovCisuZXF1ICAgICAgICAgICAgUk9XMTNfQURSLCAgMHgwNzAwMDAwMCAgICAvKiAxMyByb3cgYWRkcnMgKi8KKy5lcXUgICAgICAgICAgICBST1cxMl9BRFIsICAweDAzMDAwMDAwICAgIC8qIDEyIHJvdyBhZGRycyAqLworLmVxdSAgICAgICAgICAgIFJPVzExX0FEUiwgIDB4MDEwMDAwMDAgICAgLyogMTEgcm93IGFkZHJzL2Fsc28gYmFuayBzd2l0Y2ggKi8KKy5lcXUgICAgICAgICAgICBST1cxMF9BRFIsICAweDAwMDAwMDAwICAgIC8qIDEwIHJvdyBhZGRycy9hbHNvIGJhbmsgc3dpdGNoICovCisuZXF1ICAgICAgICAgICAgQ09MMTFfREFUQSwgMHgwYjBiMGIwYiAgICAvKiAxMSBjb2wgYWRkcnMgKi8KKy5lcXUgICAgICAgICAgICBDT0wxMF9EQVRBLCAweDBhMGEwYTBhICAgIC8qIDEwIGNvbCBkYXRhICovCisuZXF1ICAgICAgICAgICAgQ09MMDlfREFUQSwgMHgwOTA5MDkwOSAgICAvKiAgOSBjb2wgZGF0YSAqLworLmVxdSAgICAgICAgICAgIENPTDA4X0RBVEEsIDB4MDgwODA4MDggICAgLyogIDggY29sIGRhdGEgKi8KKy5lcXUgICAgICAgICAgICBST1cxNF9EQVRBLCAweDNmM2YzZjNmICAgIC8qIDE0IHJvdyBkYXRhIChNQVNLKSAqLworLmVxdSAgICAgICAgICAgIFJPVzEzX0RBVEEsIDB4MWYxZjFmMWYgICAgLyogMTMgcm93IGRhdGEgKE1BU0spICovCisuZXF1ICAgICAgICAgICAgUk9XMTJfREFUQSwgMHgwZjBmMGYwZiAgICAvKiAxMiByb3cgZGF0YSAoTUFTSykgKi8KKy5lcXUgICAgICAgICAgICBST1cxMV9EQVRBLCAweDA3MDcwNzA3ICAgIC8qIDExIHJvdyBkYXRhL2Fsc28gYmFuayBzd2l0Y2ggKE1BU0spICovCisuZXF1ICAgICAgICAgICAgUk9XMTBfREFUQSwgMHhhYWFhYWFhYSAgICAvKiAxMCByb3cgZGF0YS9hbHNvIGJhbmsgc3dpdGNoIChNQVNLKSAqLworCisKKyAvKgorICAqIGluaXRpYWxpemUgZHJhbSBjb250cm9sbGVyIHJlZ2lzdGVycworICAqLworLmdsb2JsIG1lbV9pbml0CittZW1faW5pdDogCisgICAgICAgIHhvcncgICAgJWF4LCVheAorICAgICAgICBtb3ZsICAgICREQkNUTCwgJWVkaSAgICAgICAgICAgICAKKwltb3ZiICAgICAlYWwsICglZWRpKSAgICAgICAgICAgICAvKiBkaXNhYmxlIHdyaXRlIGJ1ZmZlciAqLworCisgICAgICAgIG1vdmwgICAgJEVDQ0NUTCwgJWVkaSAgICAgICAgICAgIAorCW1vdmIgICAgICVhbCwgKCVlZGkpICAgICAgICAgICAgIC8qIGRpc2FibGUgRUNDICovCisKKyAgICAgICAgbW92bCAgICAkRFJDVE1DVEwsICVlZGkgICAgICAgICAgIAorICAgICAgICBtb3ZiICAgICQweDFFLCVhbCAgICAgICAgICAgICAgICAvKiBTZXQgU0RSQU0gdGltaW5nIGZvciBzbG93ZXN0ICovCisJbW92YiAgICAgJWFsLCAoJWVkaSkKKworIC8qCisgICogc2V0dXAgbG9vcCB0byBkbyA0IGV4dGVybmFsIGJhbmtzIHN0YXJ0aW5nIHdpdGggYmFuayAzCisgICovCisgICAgICAgIG1vdmwgICAgJDB4ZmYwMDAwMDAsJWVheCAgICAgICAgIC8qIGVuYWJsZSBsYXN0IGJhbmsgYW5kIHNldHVwICovCisgICAgICAgIG1vdmwgICAgJERSQ0JFTkRBRFIsICVlZGkgICAgICAgIC8qIGVuZGluZyBhZGRyZXNzIHJlZ2lzdGVyICovCisJbW92bCAgICAgJWVheCwgKCVlZGkpCisKKyAgICAgICAgbW92bCAgICAkRFJDQ0ZHLCAlZWRpICAgICAgICAgICAgLyogc2V0dXAgKi8KKyAgICAgICAgbW92dyAgICAkMHhiYmJiLCVheCAgICAgICAgICAgICAgLyogZHJhbSBjb25maWcgcmVnaXN0ZXIgZm9yICAqLworCW1vdncgICAgJWF4LCAoJWVkaSkKKworIC8qCisgICogaXNzdWUgYSBOT1AgdG8gYWxsIERSQU1zCisgICovCisgICAgICAgIG1vdmwgICAgJERSQ0NUTCwgJWVkaSAgICAgICAgICAgIC8qIHNldHVwIERSQU0gY29udHJvbCByZWdpc3RlciB3aXRoICovCisgICAgICAgIG1vdmIgICAgJDB4MSwlYWwgICAgICAgICAgICAgICAgIC8qIERpc2FibGUgcmVmcmVzaCxkaXNhYmxlIHdyaXRlIGJ1ZmZlciAqLyAKKwltb3ZiICAgICAlYWwsICglZWRpKQorICAgICAgICBtb3ZsICAgICRDQUNIRUxJTkVTWiwgJWVzaSAgICAgICAvKiBqdXN0IGEgZHVtbXkgYWRkcmVzcyB0byB3cml0ZSBmb3IgKi8gCisJbW92dyAgICAgJWF4LCAoJWVzaSkKKyAvKgorICAqIGRlbGF5IGZvciAxMDAgdXNlYz8gMjAwPworICAqICoqKioqKnRoaXMgaXMgYSBjbHVkZ2UgZm9yIG5vdyAqKioqKioqKioqKioqCisgICovCisgICAgICAgIG1vdncgICAgJDEwMCwlY3gKK3NpemRlbGF5OiAKKyAgICAgICAgbG9vcCAgICBzaXpkZWxheSAgICAgICAgICAgICAgICAgLyogd2UgbmVlZCAxMDAgdXNlYyBoZXJlICovCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgLyoKKyAgKiBpc3N1ZSBhbGwgYmFua3MgcHJlY2hhcmdlCisgICovCisgICAgICAgIG1vdmIgICAgJDB4MiwlYWwgICAgICAgICAgICAgICAgIC8qIEFsbCBiYW5rcyBwcmVjaGFyZ2UgKi8KKwltb3ZiICAgICAlYWwsICglZWRpKQorCW1vdncgICAgICVheCwgKCVlc2kpCisKKyAvKgorICAqIGlzc3VlIDIgYXV0byByZWZyZXNoZXMgdG8gYWxsIGJhbmtzIAorICAqLworICAgICAgICBtb3ZiICAgICQweDQsJWFsICAgICAgICAgICAgICAgICAvKiBBdXRvIHJlZnJlc2ggY21kICovCisJbW92YiAgICAgJWFsLCAoJWVkaSkKKyAgICAgICAgbW92dyAgICAkMiwlY3gKK3JlZnJlc2gxOiAKKwltb3Z3ICAgICAlYXgsICglZXNpKQorICAgICAgICBsb29wICAgIHJlZnJlc2gxCisKKyAvKgorICAqIGlzc3VlIExPQUQgTU9ERSBSRUdJU1RFUiBjb21tYW5kCisgICovCisgICAgICAgIG1vdmIgICAgJDB4MywlYWwgICAgICAgICAgICAgICAgIC8qIExvYWQgbW9kZSByZWdpc3RlciBjbWQgKi8KKwltb3ZiICAgICAlYWwsICglZWRpKQorCW1vdncgICAgICVheCwgKCVlc2kpCisKKyAvKgorICAqIGlzc3VlIDggbW9yZSBhdXRvIHJlZnJlc2hlcyB0byBhbGwgYmFua3MgCisgICovIAorICAgICAgICBtb3ZiICAgICQweDQsJWFsICAgICAgICAgICAgICAgICAvKiBBdXRvIHJlZnJlc2ggY21kICovCisJbW92YiAgICAgJWFsLCAoJWVkaSkKKyAgICAgICAgbW92dyAgICAkOCwlY3gKK3JlZnJlc2gyOiAKKwltb3Z3ICAgICAlYXgsICglZXNpKQorICAgICAgICBsb29wICAgIHJlZnJlc2gyCisKKyAvKgorICAqIHNldCBjb250cm9sIHJlZ2lzdGVyIHRvIE5PUk1BTCBtb2RlIAorICAqLworICAgICAgICBtb3ZiICAgICQweDAsJWFsICAgICAgICAgICAgICAgICAvKiBOb3JtYWwgbW9kZSB2YWx1ZSAqLworCW1vdmIgICAgICVhbCwgKCVlZGkpCisKKyAvKgorICAqIHNpemUgZHJhbSBzdGFydGluZyB3aXRoIGV4dGVybmFsIGJhbmsgMyBtb3ZpbmcgdG8gZXh0ZXJuYWwgYmFuayAwCisgICovCisgICAgICAgIG1vdmwgICAgJDB4MywlZWN4ICAgICAgICAgICAgICAgIC8qIHN0YXJ0IHdpdGggZXh0ZXJuYWwgYmFuayAzICovCisKK25leHRiYW5rOiAKKworIC8qCisgICogd3JpdGUgY29sIDExIHdyYXAgYWRyCisgICovCisgICAgICAgIG1vdmwgICAgJENPTDExX0FEUiwgJWVzaSAgICAgICAgIC8qIHNldCBhZGRyZXNzIHRvIG1heCBjb2wgKDExKSB3cmFwIGFkZHIgKi8KKyAgICAgICAgbW92bCAgICAkQ09MMTFfREFUQSwgJWVheCAgICAgICAgLyogcGF0dGVybiBmb3IgbWF4IHN1cHBvcnRlZCBjb2x1bW5zKDExKSAqLworCW1vdmwgICAgJWVheCwgKCVlc2kpICAgICAgICAgICAgIC8qIHdyaXRlIG1heCBjb2wgcGF0dGVybiBhdCBtYXggY29sIGFkciAqLworCW1vdmwgICAgKCVlc2kpLCAlZWJ4ICAgICAgICAgICAgIC8qIG9wdGlvbmFsIHJlYWQgKi8KKyAgICAgICAgY21wbCAgICAlZWJ4LCVlYXggICAgICAgICAgICAgICAgLyogdG8gdmVyaWZ5IHdyaXRlICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbSAgICAgICAgICAgICAgICAgIC8qIHRoaXMgcmFtIGlzIGJhZCAqLworIC8qCisgICogd3JpdGUgY29sIDEwIHdyYXAgYWRyCisgICovCisKKyAgICAgICAgbW92bCAgICAkQ09MMTBfQURSLCAlZXNpICAgICAgICAgLyogc2V0IGFkZHJlc3MgdG8gMTAgY29sIHdyYXAgYWRkcmVzcyAqLworICAgICAgICBtb3ZsICAgICRDT0wxMF9EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciAxMCBjb2wgd3JhcCAqLworCW1vdmwgICAgJWVheCwgKCVlc2kpICAgICAgICAgICAgIC8qIHdyaXRlIDEwIGNvbCBwYXR0ZXJuIEAgMTAgY29sIHdyYXAgYWRyICovCisJbW92bCAgICAoJWVzaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSBjb2wgOSB3cmFwIGFkcgorICAqLworICAgICAgICBtb3ZsICAgICRDT0wwOV9BRFIsICVlc2kgICAgICAgICAvKiBzZXQgYWRkcmVzcyB0byA5IGNvbCB3cmFwIGFkZHJlc3MgKi8KKyAgICAgICAgbW92bCAgICAkQ09MMDlfREFUQSwgJWVheCAgICAgICAgLyogcGF0dGVybiBmb3IgOSBjb2wgd3JhcCAqLworCW1vdmwgICAgJWVheCwgKCVlc2kpICAgICAgICAgICAgIC8qIHdyaXRlIDkgY29sIHBhdHRlcm4gQCA5IGNvbCB3cmFwIGFkciAqLworCW1vdmwgICAgKCVlc2kpLCAlZWJ4ICAgICAgICAgICAgIC8qIG9wdGlvbmFsIHJlYWQgKi8KKyAgICAgICAgY21wbCAgICAlZWJ4LCVlYXggICAgICAgICAgICAgICAgLyogdG8gdmVyaWZ5IHdyaXRlICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbSAgICAgICAgICAgICAgICAgIC8qIHRoaXMgcmFtIGlzIGJhZCAqLworIC8qCisgICogd3JpdGUgY29sIDggd3JhcCBhZHIKKyAgKi8KKyAgICAgICAgbW92bCAgICAkQ09MMDhfQURSLCAlZXNpICAgICAgICAgLyogc2V0IGFkZHJlc3MgdG8gbWluKDgpIGNvbCB3cmFwIGFkZHJlc3MgKi8KKyAgICAgICAgbW92bCAgICAkQ09MMDhfREFUQSwgJWVheCAgICAgICAgLyogcGF0dGVybiBmb3IgbWluICg4KSBjb2wgd3JhcCAqLworCW1vdmwgICAgJWVheCwgKCVlc2kpICAgICAgICAgICAgIC8qIHdyaXRlIG1pbiBjb2wgcGF0dGVybiBAIG1pbiBjb2wgYWRyICovCisJbW92bCAgICAoJWVzaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSByb3cgMTQgd3JhcCBhZHIKKyAgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTRfQURSLCAlZXNpICAgICAgICAgLyogc2V0IGFkZHJlc3MgdG8gbWF4IHJvdyAoMTQpIHdyYXAgYWRkciAqLworICAgICAgICBtb3ZsICAgICRST1cxNF9EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciBtYXggc3VwcG9ydGVkIHJvd3MoMTQpICovCisJbW92bCAgICAlZWF4LCAoJWVzaSkgICAgICAgICAgICAgLyogd3JpdGUgbWF4IHJvdyBwYXR0ZXJuIGF0IG1heCByb3cgYWRyICovCisJbW92bCAgICAoJWVzaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSByb3cgMTMgd3JhcCBhZHIKKyAgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTNfQURSLCAlZXNpICAgICAgICAgLyogc2V0IGFkZHJlc3MgdG8gMTMgcm93IHdyYXAgYWRkcmVzcyAqLworICAgICAgICBtb3ZsICAgICRST1cxM19EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciAxMyByb3cgd3JhcCAqLworCW1vdmwgICAgJWVheCwgKCVlc2kpICAgICAgICAgICAgIC8qIHdyaXRlIDEzIHJvdyBwYXR0ZXJuIEAgMTMgcm93IHdyYXAgYWRyICovCisJbW92bCAgICAoJWVzaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSByb3cgMTIgd3JhcCBhZHIKKyAgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTJfQURSLCAlZXNpICAgICAgICAgLyogc2V0IGFkZHJlc3MgdG8gMTIgcm93IHdyYXAgYWRkcmVzcyAqLworICAgICAgICBtb3ZsICAgICRST1cxMl9EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciAxMiByb3cgd3JhcCAqLworCW1vdmwgICAgJWVheCwgKCVlc2kpICAgICAgICAgICAgIC8qIHdyaXRlIDEyIHJvdyBwYXR0ZXJuIEAgMTIgcm93IHdyYXAgYWRyICovCisJbW92bCAgICAoJWVzaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSByb3cgMTEgd3JhcCBhZHIKKyAgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTFfQURSLCAlZWRpICAgICAgICAgLyogc2V0IGFkZHJlc3MgdG8gMTEgcm93IHdyYXAgYWRkcmVzcyAqLworICAgICAgICBtb3ZsICAgICRST1cxMV9EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciAxMSByb3cgd3JhcCAqLworCW1vdmwgICAgJWVheCwgKCVlZGkpICAgICAgICAgICAgIC8qIHdyaXRlIDExIHJvdyBwYXR0ZXJuIEAgMTEgcm93IHdyYXAgYWRyICovCisJbW92bCAgICAoJWVkaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSByb3cgMTAgd3JhcCBhZHIgLS0tIHRoaXMgd3JpdGUgaXMgcmVhbGx5IHRvIGRldGVybWluZSBudW1iZXIgb2YgYmFua3MKKyAgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTBfQURSLCAlZWRpICAgICAgICAgLyogc2V0IGFkZHJlc3MgdG8gMTAgcm93IHdyYXAgYWRkcmVzcyAqLworICAgICAgICBtb3ZsICAgICRST1cxMF9EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciAxMCByb3cgd3JhcCAoQUEpICovCisJbW92bCAgICAlZWF4LCAoJWVkaSkgICAgICAgICAgICAgLyogd3JpdGUgMTAgcm93IHBhdHRlcm4gQCAxMCByb3cgd3JhcCBhZHIgKi8KKwltb3ZsICAgICglZWRpKSwgJWVieCAgICAgICAgICAgICAvKiBvcHRpb25hbCByZWFkICovCisgICAgICAgIGNtcGwgICAgJWVieCwlZWF4ICAgICAgICAgICAgICAgIC8qIHRvIHZlcmlmeSB3cml0ZSAqLworICAgICAgICBqbnogICAgIGJhZF9yYW0gICAgICAgICAgICAgICAgICAvKiB0aGlzIHJhbSBpcyBiYWQgKi8KKyAvKgorICAqIHJlYWQgZGF0YSBAIHJvdyAxMiB3cmFwIGFkciB0byBkZXRlcm1pbmUgICogYmFua3MsIAorICAqIGFuZCByZWFkIGRhdGEgQCByb3cgMTQgd3JhcCBhZHIgdG8gZGV0ZXJtaW5lICAqIHJvd3MuCisgICogaWYgZGF0YSBAIHJvdyAxMiB3cmFwIGFkciBpcyBub3QgQUEsIDExIG9yIDEyIHdlIGhhdmUgYmFkIFJBTS4KKyAgKiBpZiBkYXRhIEAgcm93IDEyIHdyYXAgPT0gQUEsIHdlIG9ubHkgaGF2ZSAyIGJhbmtzLCBOT1QgNCAKKyAgKiBpZiBkYXRhIEAgcm93IDEyIHdyYXAgPT0gMTEgb3IgMTIsIHdlIGhhdmUgNCBiYW5rcywKKyAgKi8KKyAgICAgICAgeG9ydyAgICAlZGksJWRpICAgICAgICAgICAgICAgICAgLyogdmFsdWUgZm9yIDIgYmFua3MgaW4gREkgKi8KKwltb3ZsICAgICglZXNpKSwgJWVieCAgICAgICAgICAgICAvKiByZWFkIGZyb20gMTIgcm93IHdyYXAgdG8gY2hlY2sgYmFua3MgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChlc2kgaXMgc2V0dXAgZnJvbSB0aGUgd3JpdGUgdG8gcm93IDEyIHdyYXApICovCisgICAgICAgIGNtcGwgICAgJWVieCwlZWF4ICAgICAgICAgICAgICAgIC8qIGNoZWNrIGZvciBBQSBwYXR0ZXJuICAoZWF4IGhvbGRzIHRoZSBhYSBwYXR0ZXJuKSAqLworICAgICAgICBqeiAgICAgIG9ubHkyICAgICAgICAgICAgICAgICAgICAvKiBpZiBwYXR0ZXJuID09IEFBLCB3ZSBvbmx5IGhhdmUgMiBiYW5rcyAqLworCisJLyogNCBiYW5rcyAqLworCQorICAgICAgICBtb3Z3ICAgICQ4LCVkaSAgICAgICAgICAgICAgICAgICAvKiB2YWx1ZSBmb3IgNCBiYW5rcyBpbiBESSAoQk5LX0NOVCBiaXQpICovCisgICAgICAgIGNtcGwgICAgJFJPVzExX0RBVEEsICVlYnggICAgICAgIC8qIG9ubHkgb3RoZXIgbGVnaXRpbWF0ZSB2YWx1ZXMgYXJlIDExICovCisgICAgICAgIGp6ICAgICAgb25seTIKKyAgICAgICAgY21wbCAgICAkUk9XMTJfREFUQSwgJWVieCAgICAgICAgLyogYW5kIDEyICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbSAgICAgICAgICAgICAgICAgIC8qIGl0cyBiYWQgaWYgbm90IDExIG9yIDEyISAqLworCQorCS8qIGZhbGwgdGhyb3VnaCAqLworb25seTI6IAorIC8qCisgICogdmFsaWRhdGUgcm93IG1hc2sKKyAgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTRfQURSLCAlZXNpICAgICAgICAgLyogc2V0IGFkZHJlc3MgYmFjayB0byBtYXggcm93IHdyYXAgYWRkciAqLworCW1vdmwgICAgKCVlc2kpLCAlZWF4ICAgICAgICAgICAgIC8qIHJlYWQgYWN0dWFsIG51bWJlciBvZiByb3dzIEAgcm93MTQgYWRyICovCisKKyAgICAgICAgY21wbCAgICAkUk9XMTFfREFUQSwgJWVheCAgICAgICAgLyogcm93IG11c3QgYmUgZ3JlYXRlciB0aGFuIDExIHBhdHRlcm4gKi8KKyAgICAgICAgamIgICAgICBiYWRfcmFtCisKKyAgICAgICAgY21wbCAgICAkUk9XMTRfREFUQSwgJWVheCAgICAgICAgLyogYW5kIHJvdyBtdXN0IGJlIGxlc3MgdGhhbiAxNCBwYXR0ZXJuICovCisgICAgICAgIGphICAgICAgYmFkX3JhbQorCisgICAgICAgIGNtcGIgICAgJWFoLCVhbCAgICAgICAgICAgICAgICAgIC8qIHZlcmlmeSBhbGwgNCBieXRlcyBvZiBkd29yZCBzYW1lICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbQorICAgICAgICBtb3ZsICAgICVlYXgsJWVieAorICAgICAgICBzaHJsICAgICQxNiwlZWJ4CisgICAgICAgIGNtcHcgICAgJWJ4LCVheAorICAgICAgICBqbnogICAgIGJhZF9yYW0KKyAvKgorICAqIHJlYWQgY29sIDExIHdyYXAgYWRyIGZvciByZWFsIGNvbHVtbiBkYXRhIHZhbHVlCisgICovCisgICAgICAgIG1vdmwgICAgJENPTDExX0FEUiwgJWVzaSAgICAgICAgIC8qIHNldCBhZGRyZXNzIHRvIG1heCBjb2wgKDExKSB3cmFwIGFkZHIgKi8KKwltb3ZsICAgICglZXNpKSwgJWVheCAgICAgICAgICAgICAvKiByZWFkIHJlYWwgY29sIG51bWJlciBhdCBtYXggY29sIGFkciAqLworIC8qCisgICogdmFsaWRhdGUgY29sdW1uIGRhdGEKKyAgKi8KKyAgICAgICAgY21wbCAgICAkQ09MMDhfREFUQSwgJWVheCAgICAgICAgLyogY29sIG11c3QgYmUgZ3JlYXRlciB0aGFuIDggcGF0dGVybiAqLworICAgICAgICBqYiAgICAgIGJhZF9yYW0KKworICAgICAgICBjbXBsICAgICRDT0wxMV9EQVRBLCAlZWF4ICAgICAgICAvKiBhbmQgcm93IG11c3QgYmUgbGVzcyB0aGFuIDExIHBhdHRlcm4gKi8KKyAgICAgICAgamEgICAgICBiYWRfcmFtCisKKyAgICAgICAgc3VibCAgICAkQ09MMDhfREFUQSwgJWVheCAgICAgICAgLyogbm9ybWFsaXplIGNvbHVtbiBkYXRhIHRvIHplcm8gKi8KKyAgICAgICAgamMgICAgICBiYWRfcmFtCisgICAgICAgIGNtcGIgICAgJWFoLCVhbCAgICAgICAgICAgICAgICAgIC8qIHZlcmlmeSBhbGwgNCBieXRlcyBvZiBkd29yZCBlcXVhbCAqLworICAgICAgICBqbnogICAgIGJhZF9yYW0KKyAgICAgICAgbW92bCAgICAlZWF4LCVlZHgKKyAgICAgICAgc2hybCAgICAkMTYsJWVkeAorICAgICAgICBjbXB3ICAgICVkeCwlYXgKKyAgICAgICAgam56ICAgICBiYWRfcmFtCisgLyoKKyAgKiBtZXJnZSBiYW5rIGFuZCBjb2wgZGF0YSB0b2dldGhlcgorICAqLworICAgICAgICBhZGR3ICAgICVkaSwlZHggICAgICAgICAgICAgICAgICAvKiBtZXJnZSBvZiBiYW5rIGFuZCBjb2wgaW5mbyBpbiBkbCAqLworIC8qCisgICogZml4IGVuZGluZyBhZGRyIG1hc2sgYmFzZWQgdXBvbiBjb2wgaW5mbworICAqLworICAgICAgICBtb3ZiICAgICQzLCVhbAorICAgICAgICBzdWJiICAgICVkaCwlYWwgICAgICAgICAgICAgICAgICAvKiBkaCBjb250YWlucyB0aGUgb3ZlcmZsb3cgZnJvbSB0aGUgYmFuay9jb2wgbWVyZ2UgICovCisgICAgICAgIG1vdmIgICAgJWJsLCVkaCAgICAgICAgICAgICAgICAgIC8qIGJsIGNvbnRhaW5zIHRoZSByb3cgbWFzayAoYWEsIDA3LCAwZiwgMWYgb3IgM2YpICovCisgICAgICAgIHhjaGd3ICAgJWN4LCVheCAgICAgICAgICAgICAgICAgIC8qIGN4ID0gYXggPSAzIG9yIDIgZGVwZW5kaW5nIG9uIDIgb3IgNCBiYW5rIGRldmljZSAqLworICAgICAgICBzaHJiICAgICVjbCwlZGgJICAgICAgICAgICAgICAgICAvKiAgKi8KKyAgICAgICAgaW5jYiAgICAlZGggICAgICAgICAgICAgICAgICAgICAgLyogZW5kaW5nIGFkZHIgaXMgMSBncmVhdGVyIHRoYW4gcmVhbCBlbmQgKi8KKyAgICAgICAgeGNoZ3cgICAlY3gsJWF4ICAgICAgICAgICAgICAgICAgLyogY3ggaXMgYmFuayBudW1iZXIgYWdhaW4gKi8KKyAvKgorICAqIGlzc3VlIGFsbCBiYW5rcyBwcmVjaGFyZ2UKKyAgKi8KK2JhZF9yZWludDogCisgICAgICAgIG1vdmwgICAgJERSQ0NUTCwgJWVzaSAgICAgICAgICAgIC8qIHNldHVwIERSQU0gY29udHJvbCByZWdpc3RlciB3aXRoICovCisgICAgICAgIG1vdmIgICAgJDB4MiwlYWwgICAgICAgICAgICAgICAgIC8qIEFsbCBiYW5rcyBwcmVjaGFyZ2UgKi8KKwltb3ZiICAgICAlYWwsICglZXNpKQorICAgICAgICBtb3ZsICAgICRDQUNIRUxJTkVTWiwgJWVzaSAgICAgICAvKiBhZGRyZXNzIHRvIGluaXQgcmVhZCBidWZmZXIgKi8KKwltb3Z3ICAgICAlYXgsICglZXNpKQorCisgLyoKKyAgKiB1cGRhdGUgRU5ESU5HIEFERFJFU1MgUkVHSVNURVIKKyAgKi8KKyAgICAgICAgbW92bCAgICAkRFJDQkVOREFEUiwgJWVkaSAgICAgICAgLyogRFJBTSBlbmRpbmcgYWRkcmVzcyByZWdpc3RlciAqLworICAgICAgICBtb3ZsICAgICVlY3gsJWVieAorCWFkZGwJJWVieCwgJWVkaQorCW1vdmIgICAgJWRoLCAoJWVkaSkKKyAvKgorICAqIHVwZGF0ZSBDT05GSUcgUkVHSVNURVIKKyAgKi8KKyAgICAgICAgeG9yYiAgICAlZGgsJWRoCisgICAgICAgIG1vdncgICAgJDB4MDBmLCVieAorICAgICAgICBtb3Z3ICAgICVjeCwlYXgKKyAgICAgICAgc2hsdyAgICAkMiwlYXgKKyAgICAgICAgeGNoZ3cgICAlY3gsJWF4CisgICAgICAgIHNobHcgICAgJWNsLCVkeAorICAgICAgICBzaGx3ICAgICVjbCwlYngKKyAgICAgICAgbm90dyAgICAlYngKKyAgICAgICAgeGNoZ3cgICAlY3gsJWF4CisgICAgICAgIG1vdmwgICAgJERSQ0NGRywgJWVkaQorCW1vdiAgICAgKCVlZGkpLCAlYXgKKyAgICAgICAgYW5kdyAgICAlYngsJWF4CisgICAgICAgIG9ydyAgICAgJWR4LCVheAorCW1vdncgICAgJWF4LCAoJWVkaSkKKyAgICAgICAgamN4eiAgICBjbGVhbnVwCisKKyAgICAgICAgZGVjdyAgICAlY3gKKyAgICAgICAgbW92bCAgICAlZWN4LCVlYngKKyAgICAgICAgbW92bCAgICAkRFJDQkVOREFEUiwgJWVkaSAgICAgICAgLyogRFJBTSBlbmRpbmcgYWRkcmVzcyByZWdpc3RlciAqLworICAgICAgICBtb3ZiICAgICQweGZmLCVhbAorCWFkZGwJJWVieCwgJWVkaQorCW1vdmIgICAgJWFsLCAoJWVkaSkKKyAvKgorICAqIHNldCBjb250cm9sIHJlZ2lzdGVyIHRvIE5PUk1BTCBtb2RlIAorICAqLworICAgICAgICBtb3ZsICAgICREUkNDVEwsICVlc2kgICAgICAgICAgICAvKiBzZXR1cCBEUkFNIGNvbnRyb2wgcmVnaXN0ZXIgd2l0aCAqLworICAgICAgICBtb3ZiICAgICQweDAsJWFsICAgICAgICAgICAgICAgICAvKiBOb3JtYWwgbW9kZSB2YWx1ZSAqLworCW1vdmIgICAgJWFsLCAoJWVzaSkKKyAgICAgICAgbW92bCAgICAkQ0FDSEVMSU5FU1osICVlc2kgICAgICAgLyogYWRkcmVzcyB0byBpbml0IHJlYWQgYnVmZmVyICovCisJbW92dyAgICAlYXgsICglZXNpKQorICAgICAgICBqbXAgICAgIG5leHRiYW5rCisKK2NsZWFudXA6IAorICAgICAgICBtb3ZsICAgICREUkNCRU5EQURSLCAlZWRpICAgICAgICAvKiBEUkFNIGVuZGluZyBhZGRyZXNzIHJlZ2lzdGVyICAqLworICAgICAgICBtb3Z3ICAgICQ0LCVjeAorICAgICAgICB4b3J3ICAgICVheCwlYXgKK2NsZWFudXBscDogCisJbW92YiAgICglZWRpKSwgJWFsCisgICAgICAgIG9yYiAgICAgJWFsLCVhbAorICAgICAgICBqeiAgICAgIGVtcHR5YmFuaworCisgICAgICAgIGFkZGIgICAgJWFoLCVhbAorICAgICAgICBqbnMgICAgIG5vdHRvb211Y2gKKworICAgICAgICBtb3ZiICAgICQweDdmLCVhbAorbm90dG9vbXVjaDogCisgICAgICAgIG1vdmIgICAgJWFsLCVhaAorICAgICAgICBvcmIgICAgICQweDgwLCVhbAorCW1vdmIgICAgJWFsLCAoJWVkaSkKK2VtcHR5YmFuazogCisgICAgICAgIGluY2wgICAgJWVkaQorICAgICAgICBsb29wICAgIGNsZWFudXBscAorCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fQ0FTX0xBVEVOQ1lfMlQpIHx8IGRlZmluZWQoQ0ZHX1NEUkFNX0NBU19MQVRFTkNZXzNUKQorCS8qIHNldCB0aGUgQ0FTIGxhdGVuY3kgbm93IHNpbmNlIGl0IGlzIGhhcmQgdG8gZG8KKwkgKiB3aGVuIHdlIHJ1biBmcm9tIHRoZSBSQU0gKi8KKwltb3ZsICAgICREUkNUTUNUTCwgJWVkaSAgICAgICAgICAvKiBEUkFNIHRpbWluZyByZWdpc3RlciAqLworCW1vdmIgICAgKCVlZGkpLCAlYWwJCisjaWZkZWYgQ0ZHX1NEUkFNX0NBU19MQVRFTkNZXzJUCisJYW5kYiAgICAkMHhlZiwgJWFsCisjZW5kaWYKKyNpZmRlZiBDRkdfU0RSQU1fQ0FTX0xBVEVOQ1lfM1QKKwlvcmIgICAgICQweDEwLCAlYWwKKyNlbmRpZgkgCisJbW92YiAgICAlYWwsICglZWRpKQorI2VuZGlmCisgICAgICAgIG1vdmwgICAgJERSQ0NUTCwgJWVkaSAgICAgICAgICAgIC8qIERSQU0gQ29udHJvbCByZWdpc3RlciAqLworICAgICAgICBtb3ZiICAgICQweDMsJWFsICAgICAgICAgICAgICAgICAvKiBMb2FkIG1vZGUgcmVnaXN0ZXIgY21kICovCisJbW92YiAgICAgJWFsLCAoJWVkaSkKKwltb3Z3ICAgICAlYXgsICglZXNpKQorCisKKyAgICAgICAgbW92bCAgICAkRFJDQ1RMLCAlZWRpICAgICAgICAgICAgLyogRFJBTSBDb250cm9sIHJlZ2lzdGVyICovCisgICAgICAgIG1vdmIgICAgJDB4MTgsJWFsICAgICAgICAgICAgICAgIC8qICBFbmFibGUgcmVmcmVzaCBhbmQgTk9STUFMIG1vZGUgKi8KKwltb3ZiICAgICVhbCwgKCVlZGkpCisKKyAgICAgICAgam1wICAgICBkcmFtX2RvbmUKKworYmFkX3JhbTogCisgICAgICAgIHhvcmwgICAgJWVkeCwlZWR4CisgICAgICAgIHhvcmwgICAgJWVkaSwlZWRpCisgICAgICAgIGptcCAgICAgYmFkX3JlaW50CisKK2RyYW1fZG9uZTogCisJCisJLyogcmVhZGJhY2sgRFJDQkVOREFEUiBhbmQgcmV0dXJuIHRoZSBudW1iZXIKKwkgKiBvZiBhdmFpbGFibGUgcmFtIGJ5dGVzIGluICVlYXggKi8gCisKKyAgICAgICAgbW92bCAgICAkRFJDQkVOREFEUiwgJWVkaSAgICAgICAgLyogRFJBTSBlbmRpbmcgYWRkcmVzcyByZWdpc3RlciAgKi8KKwkKKwltb3ZsCSglZWRpKSwgJWVheAorCW1vdmwJJWVheCwgJWVjeAorCWFuZGwJJDB4ODAwMDAwMDAsICVlY3gKKwlqegliYW5rMgorCWFuZGwJJDB4N2YwMDAwMDAsICVlYXgKKwlzaHJsCSQyLCAlZWF4IAorCW1vdmwJJWVheCwgJWVieAorCitiYW5rMjogCW1vdmwJKCVlZGkpLCAlZWF4CisJbW92bAklZWF4LCAlZWN4CisJYW5kbAkkMHgwMDgwMDAwMCwgJWVjeAorCWp6CWJhbmsxCisJYW5kbAkkMHgwMDdmMDAwMCwgJWVheAorCXNobGwJJDYsICVlYXggCisJbW92bAklZWF4LCAlZWJ4CisKK2JhbmsxOiAJbW92bAkoJWVkaSksICVlYXgKKwltb3ZsCSVlYXgsICVlY3gKKwlhbmRsCSQweDAwMDA4MDAwLCAlZWN4CisJanoJYmFuazAKKwlhbmRsCSQweDAwMDA3ZjAwLCAlZWF4CisJc2hsbAkkMTQsICVlYXggCisJbW92bAklZWF4LCAlZWJ4CisKK2JhbmswOiAJbW92bAkoJWVkaSksICVlYXgKKwltb3ZsCSVlYXgsICVlY3gKKwlhbmRsCSQweDAwMDAwMDgwLCAlZWN4CisJanoJZG9uZQorCWFuZGwJJDB4MDAwMDAwN2YsICVlYXgKKwlzaGxsCSQyMiwgJWVheCAKKwltb3ZsCSVlYXgsICVlYngKKworZG9uZToJbW92bAklZWJ4LCAlZWF4CisKKwlqbXAJKiVlYnAKKworCisjZW5kaWYgLyogQ09ORklHX1NDNTIwICovCmRpZmYgLS1naXQgYS9jcHUvaTM4Ni9zZXJpYWwuYyBiL2NwdS9pMzg2L3NlcmlhbC5jCmluZGV4IGMwZDJlOGEuLjIyYzNjMmEgMTAwNjQ0Ci0tLSBhL2NwdS9pMzg2L3NlcmlhbC5jCisrKyBiL2NwdS9pMzg2L3NlcmlhbC5jCkBAIC0yNCw2ICsyNCw3IEBACiAgKiBNQSAwMjExMS0xMzA3IFVTQQogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgKi8KKwogLyoKICAqIFRoaXMgc291cmNlIGNvZGUgaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUgdG8geW91IGJ5IElCTSBvbiBhbiBBUy1JUwogICogYmFzaXMuICBBbnlvbmUgcmVjZWl2aW5nIHRoaXMgc291cmNlIGlzIGxpY2Vuc2VkIHVuZGVyIElCTQpAQCAtODksMTMgKzkwLDE1IEBACiAJY2hhciAqcnhfYnVmZmVyOwogCXVsb25nIHJ4X3B1dDsKIAl1bG9uZyByeF9nZXQ7CisJaW50IGN0czsKIH0gc2VyaWFsX2J1ZmZlcl90OwogCi12b2xhdGlsZSBzdGF0aWMgc2VyaWFsX2J1ZmZlcl90IGJ1Zl9pbmZvOwordm9sYXRpbGUgc2VyaWFsX2J1ZmZlcl90IGJ1Zl9pbmZvOworc3RhdGljIGludCBzZXJpYWxfYnVmZmVyX2FjdGl2ZT0wOwogI2VuZGlmCiAKIAotc3RhdGljIGludCBzZXJpYWxfZGl2IChpbnQgYmF1ZHJhdGUgKQorc3RhdGljIGludCBzZXJpYWxfZGl2KGludCBiYXVkcmF0ZSkKIHsKIAkKIAlzd2l0Y2ggKGJhdWRyYXRlKSB7CkBAIC0xMTIsNyArMTE1LDggQEAKIAljYXNlIDExNTIwMDoKIAkJcmV0dXJuIDE7CQkKIAl9Ci0JaGFuZyAoKTsKKwkKKwlyZXR1cm4gMTI7CiB9CiAKIApAQCAtMTIxLDcgKzEyNSw3IEBACiAgKiBhcyBzZXJpYWwgY29uc29sZSBpbnRlcmZhY2UuCiAgKi8KIAotaW50IHNlcmlhbF9pbml0ICh2b2lkKQoraW50IHNlcmlhbF9pbml0KHZvaWQpCiB7CiAJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKQEAgLTEzNCwyNCArMTM4LDI0IEBACiAJb3V0YihiZGl2LCBVQVJUMF9CQVNFICsgVUFSVF9ETEwpOwkvKiBzZXQgYmF1ZHJhdGUgZGl2aXNvciAqLwogCW91dGIoYmRpdiA+PiA4LCBVQVJUMF9CQVNFICsgVUFSVF9ETE0pOy8qIHNldCBiYXVkcmF0ZSBkaXZpc29yICovCiAJb3V0YigweDAzLCBVQVJUMF9CQVNFICsgVUFSVF9MQ1IpOwkvKiBjbGVhciBETEFCOyBzZXQgOCBiaXRzLCBubyBwYXJpdHkgKi8KLQlvdXRiKDB4MDAsIFVBUlQwX0JBU0UgKyBVQVJUX0ZDUik7CS8qIGRpc2FibGUgRklGTyAqLwotCW91dGIoMHgwMCwgVUFSVDBfQkFTRSArIFVBUlRfTUNSKTsJLyogbm8gbW9kZW0gY29udHJvbCBEVFIgUlRTICovCisJb3V0YigweDAxLCBVQVJUMF9CQVNFICsgVUFSVF9GQ1IpOwkvKiBlbmFibGUgRklGTyAqLworCW91dGIoMHgwYiwgVUFSVDBfQkFTRSArIFVBUlRfTUNSKTsJLyogU2V0IERUUiBhbmQgUlRTIGFjdGl2ZSAqLwogCXZhbCA9IGluYihVQVJUMF9CQVNFICsgVUFSVF9MU1IpOwkvKiBjbGVhciBsaW5lIHN0YXR1cyAqLwogCXZhbCA9IGluYihVQVJUMF9CQVNFICsgVUFSVF9SQlIpOwkvKiByZWFkIHJlY2VpdmUgYnVmZmVyICovCiAJb3V0YigweDAwLCBVQVJUMF9CQVNFICsgVUFSVF9TQ1IpOwkvKiBzZXQgc2NyYXRjaHBhZCAqLwogCW91dGIoMHgwMCwgVUFSVDBfQkFTRSArIFVBUlRfSUVSKTsJLyogc2V0IGludGVycnVwdCBlbmFibGUgcmVnICovCiAKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiAKLXZvaWQgc2VyaWFsX3NldGJyZyAodm9pZCkKK3ZvaWQgc2VyaWFsX3NldGJyZyh2b2lkKQogewogCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCiAJdW5zaWduZWQgc2hvcnQgYmRpdjsKIAkKLQliZGl2ID0gc2VyaWFsX2RpdiAoZ2QtPmJhdWRyYXRlKTsKKwliZGl2ID0gc2VyaWFsX2RpdihnZC0+YmF1ZHJhdGUpOwogCiAJb3V0YigweDgwLCBVQVJUMF9CQVNFICsgVUFSVF9MQ1IpOwkvKiBzZXQgRExBQiBiaXQgKi8KIAlvdXRiKGJkaXYmMHhmZiwgVUFSVDBfQkFTRSArIFVBUlRfRExMKTsJLyogc2V0IGJhdWRyYXRlIGRpdmlzb3IgKi8KQEAgLTE2MCw3ICsxNjQsNyBAQAogfQogCiAKLXZvaWQgc2VyaWFsX3B1dGMgKGNvbnN0IGNoYXIgYykKK3ZvaWQgc2VyaWFsX3B1dGMoY29uc3QgY2hhciBjKQogewogCWludCBpOwogCkBAIC0xNjksMzEgKzE3MywzOCBAQAogCiAJLyogY2hlY2sgVEhSRSBiaXQsIHdhaXQgZm9yIHRyYW5zbWl0ZXIgYXZhaWxhYmxlICovCiAJZm9yIChpID0gMTsgaSA8IDM1MDA7IGkrKykgewotCQlpZiAoKGluYiAoVUFSVDBfQkFTRSArIFVBUlRfTFNSKSAmIDB4MjApID09IDB4MjApCisJCWlmICgoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9MU1IpICYgMHgyMCkgPT0gMHgyMCkgewogCQkJYnJlYWs7Ci0JCXVkZWxheSAoMTAwKTsKKwkJfQorCQl1ZGVsYXkoMTAwKTsKIAl9CiAJb3V0YihjLCBVQVJUMF9CQVNFICsgVUFSVF9USFIpOwkvKiBwdXQgY2hhcmFjdGVyIG91dCAqLwogfQogCiAKLXZvaWQgc2VyaWFsX3B1dHMgKGNvbnN0IGNoYXIgKnMpCit2b2lkIHNlcmlhbF9wdXRzKGNvbnN0IGNoYXIgKnMpCiB7CiAJd2hpbGUgKCpzKSB7Ci0JCXNlcmlhbF9wdXRjICgqcysrKTsKKwkJc2VyaWFsX3B1dGMoKnMrKyk7CiAJfQogfQogCiAKLWludCBzZXJpYWxfZ2V0YyAoKQoraW50IHNlcmlhbF9nZXRjKHZvaWQpCiB7CiAJdW5zaWduZWQgY2hhciBzdGF0dXMgPSAwOwogCisjaWYgQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPCisJaWYgKHNlcmlhbF9idWZmZXJfYWN0aXZlKSB7CisJCXJldHVybiBzZXJpYWxfYnVmZmVyZWRfZ2V0YygpOworCX0KKyNlbmRpZgorCQogCXdoaWxlICgxKSB7CiAjaWYgZGVmaW5lZChDT05GSUdfSFdfV0FUQ0hET0cpCi0JCVdBVENIRE9HX1JFU0VUICgpOwkvKiBSZXNldCBIVyBXYXRjaGRvZywgaWYgbmVlZGVkICovCisJCVdBVENIRE9HX1JFU0VUKCk7CS8qIFJlc2V0IEhXIFdhdGNoZG9nLCBpZiBuZWVkZWQgKi8KICNlbmRpZgkvKiBDT05GSUdfSFdfV0FUQ0hET0cgKi8KLQkJc3RhdHVzID0gaW5iIChVQVJUMF9CQVNFICsgVUFSVF9MU1IpOworCQlzdGF0dXMgPSBpbmIoVUFSVDBfQkFTRSArIFVBUlRfTFNSKTsKIAkJaWYgKChzdGF0dXMgJiBhc3luY0xTUkRhdGFSZWFkeTEpICE9IDB4MCkgewogCQkJYnJlYWs7CiAJCX0KQEAgLTIxMSwxMSArMjIyLDE3IEBACiB9CiAKIAotaW50IHNlcmlhbF90c3RjICgpCitpbnQgc2VyaWFsX3RzdGModm9pZCkKIHsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAotCXN0YXR1cyA9IGluYiAoVUFSVDBfQkFTRSArIFVBUlRfTFNSKTsKKyNpZiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KKwlpZiAoc2VyaWFsX2J1ZmZlcl9hY3RpdmUpIHsKKwkJcmV0dXJuIHNlcmlhbF9idWZmZXJlZF90c3RjKCk7CisJfQorI2VuZGlmCisKKwlzdGF0dXMgPSBpbmIoVUFSVDBfQkFTRSArIFVBUlRfTFNSKTsKIAlpZiAoKHN0YXR1cyAmIGFzeW5jTFNSRGF0YVJlYWR5MSkgIT0gMHgwKSB7CiAJCXJldHVybiAoMSk7CiAJfQpAQCAtMjM0LDM2ICsyNTEsNTAgQEAKIAogI2lmIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTwogCi12b2lkIHNlcmlhbF9pc3IgKHZvaWQgKmFyZykKK3ZvaWQgc2VyaWFsX2lzcih2b2lkICphcmcpCiB7CiAJaW50IHNwYWNlOwogCWludCBjOwotCWNvbnN0IGludCByeF9nZXQgPSBidWZfaW5mby5yeF9nZXQ7CiAJaW50IHJ4X3B1dCA9IGJ1Zl9pbmZvLnJ4X3B1dDsKIAotCWlmIChyeF9nZXQgPD0gcnhfcHV0KSB7Ci0JCXNwYWNlID0gQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPIC0gKHJ4X3B1dCAtIHJ4X2dldCk7CisJaWYgKGJ1Zl9pbmZvLnJ4X2dldCA8PSByeF9wdXQpIHsKKwkJc3BhY2UgPSBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8gLSAocnhfcHV0IC0gYnVmX2luZm8ucnhfZ2V0KTsKIAl9IGVsc2UgewotCQlzcGFjZSA9IHJ4X2dldCAtIHJ4X3B1dDsKKwkJc3BhY2UgPSBidWZfaW5mby5yeF9nZXQgLSByeF9wdXQ7CiAJfQotCXdoaWxlIChzZXJpYWxfdHN0YyAoKSkgewotCQljID0gc2VyaWFsX2dldGMgKCk7CisJCisJd2hpbGUgKGluYihVQVJUMF9CQVNFICsgVUFSVF9MU1IpICYgMSkgeworCQljID0gaW5iKFVBUlQwX0JBU0UpOwogCQlpZiAoc3BhY2UpIHsKIAkJCWJ1Zl9pbmZvLnJ4X2J1ZmZlcltyeF9wdXQrK10gPSBjOwogCQkJc3BhY2UtLTsKKwkJCQorCQkJaWYgKHJ4X3B1dCA9PSBidWZfaW5mby5yeF9nZXQpIHsKKwkJCQlidWZfaW5mby5yeF9nZXQrKzsKKwkJCQlpZiAocnhfcHV0ID09IENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTykgeworCQkJCQlidWZfaW5mby5yeF9nZXQgPSAwOworCQkJCX0KKwkJCX0KKwkJCQorCQkJaWYgKHJ4X3B1dCA9PSBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8pIHsKKwkJCQlyeF9wdXQgPSAwOworCQkJCWlmICgwID09IGJ1Zl9pbmZvLnJ4X2dldCkgeworCQkJCQlidWZfaW5mby5yeF9nZXQgPSAxOworCQkJCX0KKwkJCQorCQkJfQorCQkJCiAJCX0KLQkJaWYgKHJ4X3B1dCA9PSBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8pCi0JCQlyeF9wdXQgPSAwOwogCQlpZiAoc3BhY2UgPCBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8gLyA0KSB7CiAJCQkvKiBTdG9wIGZsb3cgYnkgc2V0dGluZyBSVFMgaW5hY3RpdmUgKi8KLQkJCW91dGIoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9NQ1IpICYgKDB4RkYgXiAweDAyKSwKKwkJCW91dGIoaW5iKFVBUlQwX0JBU0UgKyBVQVJUX01DUikgJiAoMHhGRiBeIDB4MDIpLAogCQkJICAgICAgVUFSVDBfQkFTRSArIFVBUlRfTUNSKTsKIAkJfQogCX0KIAlidWZfaW5mby5yeF9wdXQgPSByeF9wdXQ7CiB9CiAKLXZvaWQgc2VyaWFsX2J1ZmZlcmVkX2luaXQgKHZvaWQpCit2b2lkIHNlcmlhbF9idWZmZXJlZF9pbml0KHZvaWQpCiB7CiAJc2VyaWFsX3B1dHMgKCJTd2l0Y2hpbmcgdG8gaW50ZXJydXB0IGRyaXZlbiBzZXJpYWwgaW5wdXQgbW9kZS5cbiIpOwogCWJ1Zl9pbmZvLnJ4X2J1ZmZlciA9IG1hbGxvYyAoQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPKTsKQEAgLTI3Miw4ICszMDMsMTAgQEAKIAogCWlmIChpbmIgKFVBUlQwX0JBU0UgKyBVQVJUX01TUikgJiAweDEwKSB7CiAJCXNlcmlhbF9wdXRzICgiQ2hlY2sgQ1RTIHNpZ25hbCBwcmVzZW50IG9uIHNlcmlhbCBwb3J0OiBPSy5cbiIpOworCQlidWZfaW5mby5jdHMgPSAxOwogCX0gZWxzZSB7CiAJCXNlcmlhbF9wdXRzICgiV0FSTklORzogQ1RTIHNpZ25hbCBub3QgcHJlc2VudCBvbiBzZXJpYWwgcG9ydC5cbiIpOworCQlidWZfaW5mby5jdHMgPSAwOwogCX0KIAogCWlycV9pbnN0YWxsX2hhbmRsZXIgKCBWRUNOVU1fVTAgLypVQVJUMCAqLy8qaW50IHZlYyAqLyAsCkBAIC0yODMsMzIgKzMxNiw0OSBAQAogCS8qIEVuYWJsZSAiUlggRGF0YSBBdmFpbGFibGUiIEludGVycnVwdCBvbiBVQVJUICovCiAJLyogb3V0YihpbmIoVUFSVDBfQkFTRSArIFVBUlRfSUVSKSB8MHgwMSwgVUFSVDBfQkFTRSArIFVBUlRfSUVSKTsgKi8KIAlvdXRiKDB4MDEsIFVBUlQwX0JBU0UgKyBVQVJUX0lFUik7Ci0JLyogU2V0IERUUiBhY3RpdmUgKi8KLQlvdXRiKGluYiAoVUFSVDBfQkFTRSArIFVBUlRfTUNSKSB8IDB4MDEsIFVBUlQwX0JBU0UgKyBVQVJUX01DUik7Ci0JLyogU3RhcnQgZmxvdyBieSBzZXR0aW5nIFJUUyBhY3RpdmUgKi8KLQlvdXRiKGluYiAoVUFSVDBfQkFTRSArIFVBUlRfTUNSKSB8IDB4MDIsIFVBUlQwX0JBU0UgKyBVQVJUX01DUik7Ci0JLyogU2V0dXAgVUFSVCBGSUZPOiBSWCB0cmlnZ2VyIGxldmVsOiA0IGJ5dGUsIEVuYWJsZSBGSUZPICovCi0Jb3V0YigoMSA8PCA2KSB8IDEsIFVBUlQwX0JBU0UgKyBVQVJUX0ZDUik7CisJCisJLyogU2V0IERUUiBhbmQgUlRTIGFjdGl2ZSwgZW5hYmxlIGludGVycnVwdHMgICovCisJb3V0YihpbmIgKFVBUlQwX0JBU0UgKyBVQVJUX01DUikgfCAweDBiLCBVQVJUMF9CQVNFICsgVUFSVF9NQ1IpOworCQorCS8qIFNldHVwIFVBUlQgRklGTzogUlggdHJpZ2dlciBsZXZlbDogMSBieXRlLCBFbmFibGUgRklGTyAqLworCW91dGIoIC8qKDEgPDwgNikgfCovICAxLCBVQVJUMF9CQVNFICsgVUFSVF9GQ1IpOworCQorCXNlcmlhbF9idWZmZXJfYWN0aXZlID0gMTsKIH0KIAogdm9pZCBzZXJpYWxfYnVmZmVyZWRfcHV0YyAoY29uc3QgY2hhciBjKQogeworCWludCBpOwogCS8qIFdhaXQgZm9yIENUUyAqLwogI2lmIGRlZmluZWQoQ09ORklHX0hXX1dBVENIRE9HKQogCXdoaWxlICghKGluYiAoVUFSVDBfQkFTRSArIFVBUlRfTVNSKSAmIDB4MTApKQogCQlXQVRDSERPR19SRVNFVCAoKTsKICNlbHNlCi0Jd2hpbGUgKCEoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9NU1IpICYgMHgxMCkpOworCWlmIChidWZfaW5mby5jdHMpICB7CisJCWZvciAoaT0wO2k8MTAwMDtpKyspIHsKKwkJCWlmICgoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9NU1IpICYgMHgxMCkpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaSE9MTAwMCkgeworCQkJYnVmX2luZm8uY3RzID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9NU1IpICYgMHgxMCkpIHsKKwkJCWJ1Zl9pbmZvLmN0cyA9IDE7CisJCX0KKwl9CisJCQogI2VuZGlmCiAJc2VyaWFsX3B1dGMgKGMpOwogfQogCi12b2lkIHNlcmlhbF9idWZmZXJlZF9wdXRzIChjb25zdCBjaGFyICpzKQordm9pZCBzZXJpYWxfYnVmZmVyZWRfcHV0cyhjb25zdCBjaGFyICpzKQogewogCXNlcmlhbF9wdXRzIChzKTsKIH0KIAotaW50IHNlcmlhbF9idWZmZXJlZF9nZXRjICh2b2lkKQoraW50IHNlcmlhbF9idWZmZXJlZF9nZXRjKHZvaWQpCiB7CiAJaW50IHNwYWNlOwogCWludCBjOwpAQCAtMzIyLDggKzM3Miw5IEBACiAJd2hpbGUgKHJ4X2dldCA9PSBidWZfaW5mby5yeF9wdXQpOwogI2VuZGlmCiAJYyA9IGJ1Zl9pbmZvLnJ4X2J1ZmZlcltyeF9nZXQrK107Ci0JaWYgKHJ4X2dldCA9PSBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8pCisJaWYgKHJ4X2dldCA9PSBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8pIHsKIAkJcnhfZ2V0ID0gMDsKKwl9CiAJYnVmX2luZm8ucnhfZ2V0ID0gcnhfZ2V0OwogCiAJcnhfcHV0ID0gYnVmX2luZm8ucnhfcHV0OwpAQCAtMzQwLDcgKzM5MSw3IEBACiAJcmV0dXJuIGM7CiB9CiAKLWludCBzZXJpYWxfYnVmZmVyZWRfdHN0YyAodm9pZCkKK2ludCBzZXJpYWxfYnVmZmVyZWRfdHN0Yyh2b2lkKQogewogCXJldHVybiAoYnVmX2luZm8ucnhfZ2V0ICE9IGJ1Zl9pbmZvLnJ4X3B1dCkgPyAxIDogMDsKIH0KQEAgLTM1OCw3ICs0MDksNyBAQAogICBjb25maWd1cmUgcG9ydCAxIGZvciBzZXJpYWwgSS9PIHdpdGggcmF0ZSA9IENPTkZJR19LR0RCX0JBVURSQVRFCiAqLwogI2lmIChDT05GSUdfS0dEQl9TRVJfSU5ERVggJiAyKQotdm9pZCBrZ2RiX3NlcmlhbF9pbml0ICh2b2lkKQordm9pZCBrZ2RiX3NlcmlhbF9pbml0KHZvaWQpCiB7CiAJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKQEAgLTM4MSw3ICs0MzIsNyBAQAogfQogCiAKLXZvaWQgcHV0RGVidWdDaGFyIChjb25zdCBjaGFyIGMpCit2b2lkIHB1dERlYnVnQ2hhcihjb25zdCBjaGFyIGMpCiB7CiAJaWYgKGMgPT0gJ1xuJykKIAkJc2VyaWFsX3B1dGMgKCdccicpOwpAQCAtMzkzLDcgKzQ0NCw3IEBACiB9CiAKIAotdm9pZCBwdXREZWJ1Z1N0ciAoY29uc3QgY2hhciAqcykKK3ZvaWQgcHV0RGVidWdTdHIoY29uc3QgY2hhciAqcykKIHsKIAl3aGlsZSAoKnMpIHsKIAkJc2VyaWFsX3B1dGMoKnMrKyk7CkBAIC00MDEsNyArNDUyLDcgQEAKIH0KIAogCi1pbnQgZ2V0RGVidWdDaGFyICh2b2lkKQoraW50IGdldERlYnVnQ2hhcih2b2lkKQogewogCXVuc2lnbmVkIGNoYXIgc3RhdHVzID0gMDsKIApAQCAtNDI0LDM0ICs0NzUsMzQgQEAKIH0KIAogCi12b2lkIGtnZGJfaW50ZXJydXB0aWJsZSAoaW50IHllcykKK3ZvaWQga2dkYl9pbnRlcnJ1cHRpYmxlKGludCB5ZXMpCiB7CiAJcmV0dXJuOwogfQogCiAjZWxzZQkvKiAhIChDT05GSUdfS0dEQl9TRVJfSU5ERVggJiAyKSAqLwogCi12b2lkIGtnZGJfc2VyaWFsX2luaXQgKHZvaWQpCit2b2lkIGtnZGJfc2VyaWFsX2luaXQodm9pZCkKIHsKIAlzZXJpYWxfcHJpbnRmICgiW29uIHNlcmlhbF0gIik7CiB9CiAKLXZvaWQgcHV0RGVidWdDaGFyIChpbnQgYykKK3ZvaWQgcHV0RGVidWdDaGFyKGludCBjKQogewogCXNlcmlhbF9wdXRjIChjKTsKIH0KIAotdm9pZCBwdXREZWJ1Z1N0ciAoY29uc3QgY2hhciAqc3RyKQordm9pZCBwdXREZWJ1Z1N0cihjb25zdCBjaGFyICpzdHIpCiB7CiAJc2VyaWFsX3B1dHMgKHN0cik7CiB9CiAKLWludCBnZXREZWJ1Z0NoYXIgKHZvaWQpCitpbnQgZ2V0RGVidWdDaGFyKHZvaWQpCiB7CiAJcmV0dXJuIHNlcmlhbF9nZXRjICgpOwogfQogCi12b2lkIGtnZGJfaW50ZXJydXB0aWJsZSAoaW50IHllcykKK3ZvaWQga2dkYl9pbnRlcnJ1cHRpYmxlKGludCB5ZXMpCiB7CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvY3B1L2kzODYvc3RhcnQxNi5TIGIvY3B1L2kzODYvc3RhcnQxNi5TCmluZGV4IDU5MGE1YTYuLmEzNDY0MmYgMTAwNjQ0Ci0tLSBhL2NwdS9pMzg2L3N0YXJ0MTYuUworKysgYi9jcHUvaTM4Ni9zdGFydDE2LlMKQEAgLTEsNyArMSw3IEBACiAvKgogICogIFUtYm9vdCAtIGkzODYgU3RhcnR1cCBDb2RlIAogICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDIJT21pY3JvbiBDZXRpIEFCLCBEYW5pZWwgRW5nc3Ry9m0gPGRlbmFpZWxAb21pY3Jvbi5zZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgT21pY3JvbiBDZXRpIEFCLCBEYW5pZWwgRW5nc3Ry9m0gPGRlbmFpZWxAb21pY3Jvbi5zZT4KICAqCiAgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogICogcHJvamVjdC4KQEAgLTQwLDcgKzQwLDcgQEAKIAkKIAkvKiBUdXJuIG9mIGNhY2hlICh0aGlzIG1pZ2h0IHJlcXVpcmUgYSA0ODYtY2xhc3MgQ1BVKSAqLwogICAgICAgICBtb3ZsICAgICVjcjAsICVlYXgKLSAgICAgICAgb3JsICAgICAkMDYwMDAwMDAwLCVlYXgKKyAgICAgICAgb3JsICAgICAkMHg2MDAwMDAwMCwlZWF4CiAgICAgICAgIG1vdmwgICAgJWVheCwgJWNyMAogICAgICAgICB3YmludmQgIAkJICAgICAKIAkK