Ci8qCiAqIElCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRGV2aWNlIERyaXZlcgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogKgogKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogKgogKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgoKLyogRHJpdmVyIGlkZW50aWZpY2F0aW9uICovCiNkZWZpbmUgRFJJVkVSX05BTUUJImlibWFzbSIKI2RlZmluZSBEUklWRVJfVkVSU0lPTiAgIjEuMCIKI2RlZmluZSBEUklWRVJfQVVUSE9SICAgIk1heCBBc2JvY2sgPG1hc2JvY2tAdXMuaWJtLmNvbT4sIFZlcm5vbiBNYXVlcnkgPHZlcm51eEB1cy5pYm0uY29tPiIKI2RlZmluZSBEUklWRVJfREVTQyAgICAgIklCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRHJpdmVyIgoKI2RlZmluZSBlcnIobXNnKSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIG1zZyAiXG4iLCBEUklWRVJfTkFNRSkKI2RlZmluZSBpbmZvKG1zZykgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgbXNnICJcbiIsIERSSVZFUl9OQU1FKQoKZXh0ZXJuIGludCBpYm1hc21fZGVidWc7CiNkZWZpbmUgZGJnKFNUUiwgQVJHUy4uLikJCQkJCVwKCWRvIHsJCQkJCQkJXAoJCWlmIChpYm1hc21fZGVidWcpCQkJCVwKCQkJcHJpbnRrKEtFUk5fREVCVUcgU1RSICwgIyNBUkdTKTsJXAoJfSB3aGlsZSAoMCkKCnN0YXRpYyBpbmxpbmUgY2hhciAqZ2V0X3RpbWVzdGFtcChjaGFyICpidWYpCnsKCXN0cnVjdCB0aW1ldmFsIG5vdzsKCWRvX2dldHRpbWVvZmRheSgmbm93KTsKCXNwcmludGYoYnVmLCAiJWx1LiVsdSIsIG5vdy50dl9zZWMsIG5vdy50dl91c2VjKTsKCXJldHVybiBidWY7Cn0KCiNkZWZpbmUgSUJNQVNNX0NNRF9QRU5ESU5HCTAJCiNkZWZpbmUgSUJNQVNNX0NNRF9DT01QTEVURQkxCQojZGVmaW5lIElCTUFTTV9DTURfRkFJTEVECTIKCiNkZWZpbmUgSUJNQVNNX0NNRF9USU1FT1VUX05PUk1BTAk0NQojZGVmaW5lIElCTUFTTV9DTURfVElNRU9VVF9FWFRSQQkyNDAKCiNkZWZpbmUgSUJNQVNNX0NNRF9NQVhfQlVGRkVSX1NJWkUJMHg4MDAwCgojZGVmaW5lIFJFVkVSU0VfSEVBUlRCRUFUX1RJTUVPVVQJMTIwCgojZGVmaW5lIEhFQVJUQkVBVF9CVUZGRVJfU0laRQkJMHg0MDAKCiNpZmRlZiBJQTY0CiNkZWZpbmUgSUJNQVNNX0RSSVZFUl9WUEQgIkxpbjY0IDYuMDggICAgICAiCiNlbHNlCiNkZWZpbmUgSUJNQVNNX0RSSVZFUl9WUEQgIkxpbjMyIDYuMDggICAgICAiCiNlbmRpZgoKI2RlZmluZSBTWVNURU1fU1RBVEVfT1NfVVAgICAgICA1CiNkZWZpbmUgU1lTVEVNX1NUQVRFX09TX0RPV04gICAgNAoKI2RlZmluZSBJQk1BU01fTkFNRV9TSVpFCTE2CgojZGVmaW5lIElCTUFTTV9OVU1fRVZFTlRTCTEwCiNkZWZpbmUgSUJNQVNNX0VWRU5UX01BWF9TSVpFCTIwNDh1CgoKc3RydWN0IGNvbW1hbmQgewoJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZV9ub2RlOwoJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKCXVuc2lnbmVkIGNoYXIJCSpidWZmZXI7CglzaXplX3QJCQlidWZmZXJfc2l6ZTsKCWludAkJCXN0YXR1czsKCXN0cnVjdCBrb2JqZWN0CQlrb2JqOwp9OwojZGVmaW5lIHRvX2NvbW1hbmQoYykgY29udGFpbmVyX29mKGMsIHN0cnVjdCBjb21tYW5kLCBrb2JqKQoKc3RhdGljIGlubGluZSB2b2lkIGNvbW1hbmRfcHV0KHN0cnVjdCBjb21tYW5kICpjbWQpCnsKICAgICAgICBrb2JqZWN0X3B1dCgmY21kLT5rb2JqKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNvbW1hbmRfZ2V0KHN0cnVjdCBjb21tYW5kICpjbWQpCnsKICAgICAgICBrb2JqZWN0X2dldCgmY21kLT5rb2JqKTsKfQoKCnN0cnVjdCBpYm1hc21fZXZlbnQgewoJdW5zaWduZWQgaW50CXNlcmlhbF9udW1iZXI7Cgl1bnNpZ25lZCBpbnQJZGF0YV9zaXplOwoJdW5zaWduZWQgY2hhcglkYXRhW0lCTUFTTV9FVkVOVF9NQVhfU0laRV07Cn07CgpzdHJ1Y3QgZXZlbnRfYnVmZmVyIHsKCXN0cnVjdCBpYm1hc21fZXZlbnQJZXZlbnRzW0lCTUFTTV9OVU1fRVZFTlRTXTsKCXVuc2lnbmVkIGludAkJbmV4dF9zZXJpYWxfbnVtYmVyOwoJdW5zaWduZWQgaW50CQluZXh0X2luZGV4OwoJc3RydWN0IGxpc3RfaGVhZAlyZWFkZXJzOwp9OwoKc3RydWN0IGV2ZW50X3JlYWRlciB7CglpbnQJCQljYW5jZWxsZWQ7Cgl1bnNpZ25lZCBpbnQJCW5leHRfc2VyaWFsX251bWJlcjsKCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7CglzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7Cgl1bnNpZ25lZCBpbnQJCWRhdGFfc2l6ZTsKCXVuc2lnbmVkIGNoYXIJCWRhdGFbSUJNQVNNX0VWRU5UX01BWF9TSVpFXTsKfTsKCnN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCB7Cgl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OwoJdW5zaWduZWQgaW50CQlzdG9wcGVkOwp9OwoKc3RydWN0IGlibWFzbV9yZW1vdGUgewoJc3RydWN0IGlucHV0X2RldiBrZXliZF9kZXY7CglzdHJ1Y3QgaW5wdXRfZGV2IG1vdXNlX2RldjsKfTsKCnN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciB7CglzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CglzcGlubG9ja190CQlsb2NrOwoJdm9pZCBfX2lvbWVtCQkqYmFzZV9hZGRyZXNzOwoJdW5zaWduZWQgaW50CQlpcnE7CglzdHJ1Y3QgY29tbWFuZAkJKmN1cnJlbnRfY29tbWFuZDsKCXN0cnVjdCBjb21tYW5kCQkqaGVhcnRiZWF0OwoJc3RydWN0IGxpc3RfaGVhZAljb21tYW5kX3F1ZXVlOwoJc3RydWN0IGV2ZW50X2J1ZmZlcgkqZXZlbnRfYnVmZmVyOwoJY2hhcgkJCWRpcm5hbWVbSUJNQVNNX05BTUVfU0laRV07CgljaGFyCQkJZGV2bmFtZVtJQk1BU01fTkFNRV9TSVpFXTsKCXVuc2lnbmVkIGludAkJbnVtYmVyOwoJc3RydWN0IGlibWFzbV9yZW1vdGUJKnJlbW90ZTsKCWludAkJCXNlcmlhbF9saW5lOwoJc3RydWN0IGRldmljZQkJKmRldjsKfTsKCi8qIGNvbW1hbmQgcHJvY2Vzc2luZyAqLwpleHRlcm4gc3RydWN0IGNvbW1hbmQgKmlibWFzbV9uZXdfY29tbWFuZChzaXplX3QgYnVmZmVyX3NpemUpOwpleHRlcm4gdm9pZCBpYm1hc21fZXhlY19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBjb21tYW5kICpjbWQpOwpleHRlcm4gdm9pZCBpYm1hc21fd2FpdF9mb3JfcmVzcG9uc2Uoc3RydWN0IGNvbW1hbmQgKmNtZCwgaW50IHRpbWVvdXQpOwpleHRlcm4gdm9pZCBpYm1hc21fcmVjZWl2ZV9jb21tYW5kX3Jlc3BvbnNlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKnJlc3BvbnNlLCAgc2l6ZV90IHNpemUpOwoKLyogZXZlbnQgcHJvY2Vzc2luZyAqLwpleHRlcm4gaW50IGlibWFzbV9ldmVudF9idWZmZXJfaW5pdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX2V2ZW50X2J1ZmZlcl9leGl0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gdm9pZCBpYm1hc21fcmVjZWl2ZV9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCB2b2lkICpkYXRhLCAgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSk7CmV4dGVybiB2b2lkIGlibWFzbV9ldmVudF9yZWFkZXJfcmVnaXN0ZXIoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX2V2ZW50X3JlYWRlcl91bnJlZ2lzdGVyKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CmV4dGVybiBpbnQgaWJtYXNtX2dldF9uZXh0X2V2ZW50KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CmV4dGVybiB2b2lkIGlibWFzbV9jYW5jZWxfbmV4dF9ldmVudChzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwoKLyogaGVhcnRiZWF0IC0gZnJvbSBTUCB0byBPUyAqLwpleHRlcm4gdm9pZCBpYm1hc21fcmVnaXN0ZXJfcGFuaWNfbm90aWZpZXIodm9pZCk7CmV4dGVybiB2b2lkIGlibWFzbV91bnJlZ2lzdGVyX3BhbmljX25vdGlmaWVyKHZvaWQpOwpleHRlcm4gaW50IGlibWFzbV9oZWFydGJlYXRfaW5pdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX2hlYXJ0YmVhdF9leGl0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gdm9pZCBpYm1hc21fcmVjZWl2ZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBzaXplKTsKCi8qIHJldmVyc2UgaGVhcnRiZWF0IC0gZnJvbSBPUyB0byBTUCAqLwpleHRlcm4gdm9pZCBpYm1hc21faW5pdF9yZXZlcnNlX2hlYXJ0YmVhdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgcmV2ZXJzZV9oZWFydGJlYXQgKnJoYik7CmV4dGVybiBpbnQgaWJtYXNtX3N0YXJ0X3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3N0b3BfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwoKLyogZG90IGNvbW1hbmRzICovCmV4dGVybiB2b2lkIGlibWFzbV9yZWNlaXZlX21lc3NhZ2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgaW50IGRhdGFfc2l6ZSk7CmV4dGVybiBpbnQgaWJtYXNtX3NlbmRfZHJpdmVyX3ZwZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIGludCBpYm1hc21fc2VuZF9vc19zdGF0ZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBpbnQgb3Nfc3RhdGUpOwoKLyogbG93IGxldmVsIG1lc3NhZ2UgcHJvY2Vzc2luZyAqLwpleHRlcm4gaW50IGlibWFzbV9zZW5kX2kyb19tZXNzYWdlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gaXJxcmV0dXJuX3QgaWJtYXNtX2ludGVycnVwdF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKCi8qIHJlbW90ZSBjb25zb2xlICovCmV4dGVybiB2b2lkIGlibWFzbV9oYW5kbGVfbW91c2VfaW50ZXJydXB0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKZXh0ZXJuIGludCBpYm1hc21faW5pdF9yZW1vdGVfaW5wdXRfZGV2KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gdm9pZCBpYm1hc21fZnJlZV9yZW1vdGVfaW5wdXRfZGV2KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwoKLyogZmlsZSBzeXN0ZW0gKi8KZXh0ZXJuIGludCBpYm1hc21mc19yZWdpc3Rlcih2b2lkKTsKZXh0ZXJuIHZvaWQgaWJtYXNtZnNfdW5yZWdpc3Rlcih2b2lkKTsKZXh0ZXJuIHZvaWQgaWJtYXNtZnNfYWRkX3NwKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwoKLyogdWFydCAqLwojaWZkZWYgQ09ORklHX1NFUklBTF84MjUwCmV4dGVybiB2b2lkIGlibWFzbV9yZWdpc3Rlcl91YXJ0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gdm9pZCBpYm1hc21fdW5yZWdpc3Rlcl91YXJ0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwojZWxzZQojZGVmaW5lIGlibWFzbV9yZWdpc3Rlcl91YXJ0KHNwKQlkbyB7IH0gd2hpbGUoMCkKI2RlZmluZSBpYm1hc21fdW5yZWdpc3Rlcl91YXJ0KHNwKQlkbyB7IH0gd2hpbGUoMCkKI2VuZGlmCg==