LyoKICogaXNkbmhkbGMuaCAgLS0gIEdlbmVyYWwgcHVycG9zZSBJU0ROIEhETEMgZGVjb2Rlci4KICoKICogSW1wbGVtZW50YXRpb24gb2YgYSBIRExDIGRlY29kZXIvZW5jb2RlciBpbiBzb2Z0d2FyZS4KICogTmVjY2Vzc2FyeSBiZWNhdXNlIHNvbWUgSVNETiBkZXZpY2VzIGRvbid0IGhhdmUgSERMQwogKiBjb250cm9sbGVycy4gQWxzbyBpbmNsdWRlZDogYSBiaXQgcmV2ZXJzYWwgdGFibGUuCiAqCiAqQ29weXJpZ2h0IChDKSAyMDAyICAgIFdvbGZnYW5nIE38ZXMgICAgICA8d29sZmdhbmdAaWtzdy1tdWVlcy5kZT4KICoJCTIwMDEgCUZyb2RlIElzYWtzZW4gICAgICA8ZmlzYWtzZW5AYmV3YW4uY29tPgogKiAgICAgICAgICAgICAgMjAwMSAJS2FpIEdlcm1hc2NoZXdza2kgIDxrYWkuZ2VybWFzY2hld3NraUBnbXguZGU+CiAqCiAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCgojaWZuZGVmIF9fSVNETkhETENfSF9fCiNkZWZpbmUgX19JU0ROSERMQ19IX18KCnN0cnVjdCBpc2RuaGRsY192YXJzIHsKCWludCBiaXRfc2hpZnQ7CglpbnQgaGRsY19iaXRzMTsKCWludCBkYXRhX2JpdHM7CglpbnQgZmZiaXRfc2hpZnQ7IAkvLyBlbmNvZGluZyBvbmx5CglpbnQgc3RhdGU7CglpbnQgZHN0cG9zOwoKCXVuc2lnbmVkIHNob3J0IGNyYzsKCgl1bnNpZ25lZCBjaGFyIGNiaW47Cgl1bnNpZ25lZCBjaGFyIHNoaWZ0X3JlZzsKCXVuc2lnbmVkIGNoYXIgZmZ2YWx1ZTsKCglpbnQgZGF0YV9yZWNlaXZlZDoxOyAJLy8gc2V0IGlmIHRyYW5zZmVycmluZyBkYXRhCglpbnQgZGNoYW5uZWw6MTsgCS8vIHNldCBpZiBEIGNoYW5uZWwgKHNlbmQgaWRsZSBpbnN0ZWFkIG9mIGZsYWdzKQoJaW50IGRvX2FkYXB0NTY6MTsgCS8vIHNldCBpZiA1NksgYWRhcHRhdGlvbgogICAgICAgIGludCBkb19jbG9zaW5nOjE7IAkvLyBzZXQgaWYgaW4gY2xvc2luZyBwaGFzZSAobmVlZCB0byBzZW5kIENSQyArIGZsYWcKfTsKCgovKgogIFRoZSByZXR1cm4gdmFsdWUgZnJvbSBpc2RuaGRsY19kZWNvZGUgaXMKICB0aGUgZnJhbWUgbGVuZ3RoLCAwIGlmIG5vIGNvbXBsZXRlIGZyYW1lIHdhcyBkZWNvZGVkLAogIG9yIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyCiovCiNkZWZpbmUgSERMQ19GUkFNSU5HX0VSUk9SICAgICAxCiNkZWZpbmUgSERMQ19DUkNfRVJST1IgICAgICAgICAyCiNkZWZpbmUgSERMQ19MRU5HVEhfRVJST1IgICAgICAzCgpleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBpc2RuaGRsY19iaXRfcmV2X3RhYlsyNTZdOwoKZXh0ZXJuIHZvaWQgaXNkbmhkbGNfcmN2X2luaXQgKHN0cnVjdCBpc2RuaGRsY192YXJzICpoZGxjLCBpbnQgZG9fYWRhcHQ1Nik7CgpleHRlcm4gaW50IGlzZG5oZGxjX2RlY29kZSAoc3RydWN0IGlzZG5oZGxjX3ZhcnMgKmhkbGMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNsZW4saW50ICpjb3VudCwKCSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHNpemUpOwoKZXh0ZXJuIHZvaWQgaXNkbmhkbGNfb3V0X2luaXQgKHN0cnVjdCBpc2RuaGRsY192YXJzICpoZGxjLGludCBpc19kX2NoYW5uZWwsaW50IGRvX2FkYXB0NTYpOwoKZXh0ZXJuIGludCBpc2RuaGRsY19lbmNvZGUgKHN0cnVjdCBpc2RuaGRsY192YXJzICpoZGxjLGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyx1bnNpZ25lZCBzaG9ydCBzbGVuLGludCAqY291bnQsCgkgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCxpbnQgZHNpemUpOwoKI2VuZGlmIC8qIF9fSVNETkhETENfSF9fICovCg==