Ci8qCiAqIElCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRGV2aWNlIERyaXZlcgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogKgogKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogKgogKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICoKICovCgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgva3JlZi5oPgojaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgoKLyogRHJpdmVyIGlkZW50aWZpY2F0aW9uICovCiNkZWZpbmUgRFJJVkVSX05BTUUJImlibWFzbSIKI2RlZmluZSBEUklWRVJfVkVSU0lPTiAgIjEuMCIKI2RlZmluZSBEUklWRVJfQVVUSE9SICAgIk1heCBBc2JvY2sgPG1hc2JvY2tAdXMuaWJtLmNvbT4sIFZlcm5vbiBNYXVlcnkgPHZlcm51eEB1cy5pYm0uY29tPiIKI2RlZmluZSBEUklWRVJfREVTQyAgICAgIklCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRHJpdmVyIgoKI2RlZmluZSBlcnIobXNnKSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIG1zZyAiXG4iLCBEUklWRVJfTkFNRSkKI2RlZmluZSBpbmZvKG1zZykgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgbXNnICJcbiIsIERSSVZFUl9OQU1FKQoKZXh0ZXJuIGludCBpYm1hc21fZGVidWc7CiNkZWZpbmUgZGJnKFNUUiwgQVJHUy4uLikJCQkJCVwKCWRvIHsJCQkJCQkJXAoJCWlmIChpYm1hc21fZGVidWcpCQkJCVwKCQkJcHJpbnRrKEtFUk5fREVCVUcgU1RSICwgIyNBUkdTKTsJXAoJfSB3aGlsZSAoMCkKCnN0YXRpYyBpbmxpbmUgY2hhciAqZ2V0X3RpbWVzdGFtcChjaGFyICpidWYpCnsKCXN0cnVjdCB0aW1ldmFsIG5vdzsKCWRvX2dldHRpbWVvZmRheSgmbm93KTsKCXNwcmludGYoYnVmLCAiJWx1LiVsdSIsIG5vdy50dl9zZWMsIG5vdy50dl91c2VjKTsKCXJldHVybiBidWY7Cn0KCiNkZWZpbmUgSUJNQVNNX0NNRF9QRU5ESU5HCTAKI2RlZmluZSBJQk1BU01fQ01EX0NPTVBMRVRFCTEKI2RlZmluZSBJQk1BU01fQ01EX0ZBSUxFRAkyCgojZGVmaW5lIElCTUFTTV9DTURfVElNRU9VVF9OT1JNQUwJNDUKI2RlZmluZSBJQk1BU01fQ01EX1RJTUVPVVRfRVhUUkEJMjQwCgojZGVmaW5lIElCTUFTTV9DTURfTUFYX0JVRkZFUl9TSVpFCTB4ODAwMAoKI2RlZmluZSBSRVZFUlNFX0hFQVJUQkVBVF9USU1FT1VUCTEyMAoKI2RlZmluZSBIRUFSVEJFQVRfQlVGRkVSX1NJWkUJCTB4NDAwCgojaWZkZWYgSUE2NAojZGVmaW5lIElCTUFTTV9EUklWRVJfVlBEICJMaW42NCA2LjA4ICAgICAgIgojZWxzZQojZGVmaW5lIElCTUFTTV9EUklWRVJfVlBEICJMaW4zMiA2LjA4ICAgICAgIgojZW5kaWYKCiNkZWZpbmUgU1lTVEVNX1NUQVRFX09TX1VQICAgICAgNQojZGVmaW5lIFNZU1RFTV9TVEFURV9PU19ET1dOICAgIDQKCiNkZWZpbmUgSUJNQVNNX05BTUVfU0laRQkxNgoKI2RlZmluZSBJQk1BU01fTlVNX0VWRU5UUwkxMAojZGVmaW5lIElCTUFTTV9FVkVOVF9NQVhfU0laRQkyMDQ4dQoKCnN0cnVjdCBjb21tYW5kIHsKCXN0cnVjdCBsaXN0X2hlYWQJcXVldWVfbm9kZTsKCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7Cgl1bnNpZ25lZCBjaGFyCQkqYnVmZmVyOwoJc2l6ZV90CQkJYnVmZmVyX3NpemU7CglpbnQJCQlzdGF0dXM7CglzdHJ1Y3Qga3JlZgkJa3JlZjsKCXNwaW5sb2NrX3QJCSpsb2NrOwp9OwojZGVmaW5lIHRvX2NvbW1hbmQoYykgY29udGFpbmVyX29mKGMsIHN0cnVjdCBjb21tYW5kLCBrcmVmKQoKdm9pZCBpYm1hc21fZnJlZV9jb21tYW5kKHN0cnVjdCBrcmVmICprcmVmKTsKc3RhdGljIGlubGluZSB2b2lkIGNvbW1hbmRfcHV0KHN0cnVjdCBjb21tYW5kICpjbWQpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglzcGlubG9ja190ICpsb2NrID0gY21kLT5sb2NrOwoKCXNwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsKCWtyZWZfcHV0KCZjbWQtPmtyZWYsIGlibWFzbV9mcmVlX2NvbW1hbmQpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjb21tYW5kX2dldChzdHJ1Y3QgY29tbWFuZCAqY21kKQp7CglrcmVmX2dldCgmY21kLT5rcmVmKTsKfQoKCnN0cnVjdCBpYm1hc21fZXZlbnQgewoJdW5zaWduZWQgaW50CXNlcmlhbF9udW1iZXI7Cgl1bnNpZ25lZCBpbnQJZGF0YV9zaXplOwoJdW5zaWduZWQgY2hhcglkYXRhW0lCTUFTTV9FVkVOVF9NQVhfU0laRV07Cn07CgpzdHJ1Y3QgZXZlbnRfYnVmZmVyIHsKCXN0cnVjdCBpYm1hc21fZXZlbnQJZXZlbnRzW0lCTUFTTV9OVU1fRVZFTlRTXTsKCXVuc2lnbmVkIGludAkJbmV4dF9zZXJpYWxfbnVtYmVyOwoJdW5zaWduZWQgaW50CQluZXh0X2luZGV4OwoJc3RydWN0IGxpc3RfaGVhZAlyZWFkZXJzOwp9OwoKc3RydWN0IGV2ZW50X3JlYWRlciB7CglpbnQJCQljYW5jZWxsZWQ7Cgl1bnNpZ25lZCBpbnQJCW5leHRfc2VyaWFsX251bWJlcjsKCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7CglzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7Cgl1bnNpZ25lZCBpbnQJCWRhdGFfc2l6ZTsKCXVuc2lnbmVkIGNoYXIJCWRhdGFbSUJNQVNNX0VWRU5UX01BWF9TSVpFXTsKfTsKCnN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCB7Cgl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OwoJdW5zaWduZWQgaW50CQlzdG9wcGVkOwp9OwoKc3RydWN0IGlibWFzbV9yZW1vdGUgewoJc3RydWN0IGlucHV0X2RldiAqa2V5YmRfZGV2OwoJc3RydWN0IGlucHV0X2RldiAqbW91c2VfZGV2Owp9OwoKc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yIHsKCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKCXNwaW5sb2NrX3QJCWxvY2s7Cgl2b2lkIF9faW9tZW0JCSpiYXNlX2FkZHJlc3M7Cgl1bnNpZ25lZCBpbnQJCWlycTsKCXN0cnVjdCBjb21tYW5kCQkqY3VycmVudF9jb21tYW5kOwoJc3RydWN0IGNvbW1hbmQJCSpoZWFydGJlYXQ7CglzdHJ1Y3QgbGlzdF9oZWFkCWNvbW1hbmRfcXVldWU7CglzdHJ1Y3QgZXZlbnRfYnVmZmVyCSpldmVudF9idWZmZXI7CgljaGFyCQkJZGlybmFtZVtJQk1BU01fTkFNRV9TSVpFXTsKCWNoYXIJCQlkZXZuYW1lW0lCTUFTTV9OQU1FX1NJWkVdOwoJdW5zaWduZWQgaW50CQludW1iZXI7CglzdHJ1Y3QgaWJtYXNtX3JlbW90ZQlyZW1vdGU7CglpbnQJCQlzZXJpYWxfbGluZTsKCXN0cnVjdCBkZXZpY2UJCSpkZXY7Cn07CgovKiBjb21tYW5kIHByb2Nlc3NpbmcgKi8Kc3RydWN0IGNvbW1hbmQgKmlibWFzbV9uZXdfY29tbWFuZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzaXplX3QgYnVmZmVyX3NpemUpOwp2b2lkIGlibWFzbV9leGVjX2NvbW1hbmQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGNvbW1hbmQgKmNtZCk7CnZvaWQgaWJtYXNtX3dhaXRfZm9yX3Jlc3BvbnNlKHN0cnVjdCBjb21tYW5kICpjbWQsIGludCB0aW1lb3V0KTsKdm9pZCBpYm1hc21fcmVjZWl2ZV9jb21tYW5kX3Jlc3BvbnNlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKnJlc3BvbnNlLCAgc2l6ZV90IHNpemUpOwoKLyogZXZlbnQgcHJvY2Vzc2luZyAqLwppbnQgaWJtYXNtX2V2ZW50X2J1ZmZlcl9pbml0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwp2b2lkIGlibWFzbV9ldmVudF9idWZmZXJfZXhpdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKdm9pZCBpYm1hc21fcmVjZWl2ZV9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCB2b2lkICpkYXRhLCAgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSk7CnZvaWQgaWJtYXNtX2V2ZW50X3JlYWRlcl9yZWdpc3RlcihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwp2b2lkIGlibWFzbV9ldmVudF9yZWFkZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwppbnQgaWJtYXNtX2dldF9uZXh0X2V2ZW50KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CnZvaWQgaWJtYXNtX2NhbmNlbF9uZXh0X2V2ZW50KHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CgovKiBoZWFydGJlYXQgLSBmcm9tIFNQIHRvIE9TICovCnZvaWQgaWJtYXNtX3JlZ2lzdGVyX3BhbmljX25vdGlmaWVyKHZvaWQpOwp2b2lkIGlibWFzbV91bnJlZ2lzdGVyX3BhbmljX25vdGlmaWVyKHZvaWQpOwppbnQgaWJtYXNtX2hlYXJ0YmVhdF9pbml0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwp2b2lkIGlibWFzbV9oZWFydGJlYXRfZXhpdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKdm9pZCBpYm1hc21fcmVjZWl2ZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBzaXplKTsKCi8qIHJldmVyc2UgaGVhcnRiZWF0IC0gZnJvbSBPUyB0byBTUCAqLwp2b2lkIGlibWFzbV9pbml0X3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKTsKaW50IGlibWFzbV9zdGFydF9yZXZlcnNlX2hlYXJ0YmVhdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgcmV2ZXJzZV9oZWFydGJlYXQgKnJoYik7CnZvaWQgaWJtYXNtX3N0b3BfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwoKLyogZG90IGNvbW1hbmRzICovCnZvaWQgaWJtYXNtX3JlY2VpdmVfbWVzc2FnZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCB2b2lkICpkYXRhLCBpbnQgZGF0YV9zaXplKTsKaW50IGlibWFzbV9zZW5kX2RyaXZlcl92cGQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmludCBpYm1hc21fc2VuZF9vc19zdGF0ZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBpbnQgb3Nfc3RhdGUpOwoKLyogbG93IGxldmVsIG1lc3NhZ2UgcHJvY2Vzc2luZyAqLwppbnQgaWJtYXNtX3NlbmRfaTJvX21lc3NhZ2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmlycXJldHVybl90IGlibWFzbV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICogZGV2X2lkKTsKCi8qIHJlbW90ZSBjb25zb2xlICovCnZvaWQgaWJtYXNtX2hhbmRsZV9tb3VzZV9pbnRlcnJ1cHQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmludCBpYm1hc21faW5pdF9yZW1vdGVfaW5wdXRfZGV2KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwp2b2lkIGlibWFzbV9mcmVlX3JlbW90ZV9pbnB1dF9kZXYoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CgovKiBmaWxlIHN5c3RlbSAqLwppbnQgaWJtYXNtZnNfcmVnaXN0ZXIodm9pZCk7CnZvaWQgaWJtYXNtZnNfdW5yZWdpc3Rlcih2b2lkKTsKdm9pZCBpYm1hc21mc19hZGRfc3Aoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CgovKiB1YXJ0ICovCiNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKdm9pZCBpYm1hc21fcmVnaXN0ZXJfdWFydChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKdm9pZCBpYm1hc21fdW5yZWdpc3Rlcl91YXJ0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwojZWxzZQojZGVmaW5lIGlibWFzbV9yZWdpc3Rlcl91YXJ0KHNwKQlkbyB7IH0gd2hpbGUoMCkKI2RlZmluZSBpYm1hc21fdW5yZWdpc3Rlcl91YXJ0KHNwKQlkbyB7IH0gd2hpbGUoMCkKI2VuZGlmCg==