I2lmbmRlZiBsb2FkX2tlcm5lbF9oCiNkZWZpbmUgbG9hZF9rZXJuZWxfaAovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRmlsZW5hbWU6ICAgICAgbG9hZF9rZXJuZWwuaAogKiBWZXJzaW9uOiAgICAgICAkSWQ6IGxvYWRfa2VybmVsLmgsdiAxLjMgMjAwMi8wMS8yNSAwMTozNDoxMSBueWV0IEV4cCAkCiAqIENvcHlyaWdodDogICAgIENvcHlyaWdodCAoQykgMjAwMSwgUnVzcyBEaWxsCiAqIEF1dGhvcjogICAgICAgIFJ1c3MgRGlsbCA8UnVzcy5EaWxsQGFzdS5lZHU+CiAqIERlc2NyaXB0aW9uOiAgIGhlYWRlciBmb3IgbG9hZCBrZXJuZWwgbW9kdWxlcwogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyoKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKi8KCi8qIHRoaXMgc3RydWN0IGlzIHZlcnkgc2ltaWxhciB0byBtdGRfaW5mbyAqLwpzdHJ1Y3QgcGFydF9pbmZvIHsKCXUzMiBzaXplOwkgLyogVG90YWwgc2l6ZSBvZiB0aGUgUGFydGl0aW9uICovCgoJLyogIk1ham9yIiBlcmFzZSBzaXplIGZvciB0aGUgZGV2aWNlLiBOYe92ZSB1c2VycyBtYXkgdGFrZSB0aGlzCgkgKiB0byBiZSB0aGUgb25seSBlcmFzZSBzaXplIGF2YWlsYWJsZSwgb3IgbWF5IHVzZSB0aGUgbW9yZSBkZXRhaWxlZAoJICogaW5mb3JtYXRpb24gYmVsb3cgaWYgdGhleSBkZXNpcmUKCSAqLwoJdTMyIGVyYXNlc2l6ZTsKCgkvKiBXaGVyZSBpbiBtZW1vcnkgZG9lcyB0aGlzIHBhcnRpdGlvbiBzdGFydD8gKi8KCWNoYXIgKm9mZnNldDsKCgkvKiB1c2VkIGJ5IGpmZnMyIHNldCB0byBOVUxMICovCgl2b2lkICpqZmZzMl9wcml2OwoKCS8qIHByaXZhdGUgZmlsZWQgdXNlZCBieSB1c2VyICovCgl2b2lkICp1c3JfcHJpdjsKfTsKCnN0cnVjdCBwYXJ0X2luZm8qCmpmZnMyX3BhcnRfaW5mbyhpbnQgcGFydF9udW0pOwoKc3RydWN0IGtlcm5lbF9sb2FkZXIgewoKCS8qIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEga2VybmVsIGNvbnRhaW5lZCBhdCBzcmMgKi8KCWludCAoKiBjaGVja19tYWdpYykoc3RydWN0IHBhcnRfaW5mbyAqcGFydCk7CgoJLyogbG9hZCB0aGUga2VybmVsIGZyb20gdGhlIHBhcnRpdGlvbiBwYXJ0IHRvIGRzdCwgcmV0dXJuIHRoZSBudW1iZXIKCSAqIG9mIGJ5dGVzIGNvcGllZCBpZiBzdWNjZXNzZnVsLCB6ZXJvIGlmIG5vdCAqLwoJdTMyICgqIGxvYWRfa2VybmVsKSh1MzIgKmRzdCwgc3RydWN0IHBhcnRfaW5mbyAqcGFydCwgY29uc3QgY2hhciAqa2VybmVsX2ZpbGVuYW1lKTsKCgkvKiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBtb2R1bGUgKGllLCAiY3JhbWZzIikgKi8KCWNoYXIgKm5hbWU7Cn07CgojZGVmaW5lIGxkcl9zdHJsZW4Jc3RybGVuCiNkZWZpbmUgbGRyX3N0cm5jbXAJc3RybmNtcAojZGVmaW5lIGxkcl9tZW1jcHkJbWVtY3B5CiNkZWZpbmUgcHV0c3RyKHgpCXByaW50ZigiJXMiLCB4KQojZGVmaW5lIG1tYWxsb2MJCW1hbGxvYwojZGVmaW5lIFVERUJVRwkJcHJpbnRmCgojZGVmaW5lIHB1dG5zdHIoc3RyLCBzaXplKQlwcmludGYoIiUqLipzIiwgc2l6ZSwgc2l6ZSwgc3RyKQojZGVmaW5lIGxkcl9vdXRwdXRfc3RyaW5nKHgpCXB1dHMoeCkKI2RlZmluZSBwdXRMYWJlbGVkV29yZCh4LCB5KQlwcmludGYoIiVzICUwOHhcbiIsIHgsICh1bnNpZ25lZCBpbnQpeSkKI2RlZmluZSBsZWRfYmxpbmsoeCwgeSwgeiwgYSkKCiNlbmRpZiAvKiBsb2FkX2tlcm5lbF9oICovCg==