LyogVGhpcyBmaWxlIGlzIG9iai1ldmF4LmgKICAgQ29weXJpZ2h0IDE5OTYsIDIwMDAsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkgb2YKICAgICBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueS4KCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCgogICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCiAgIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwKICAgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KCi8qCiAqIFRoaXMgZmlsZSBpcyBvYmotZXZheC5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgogKiBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KICovCgovKiBkZWZpbmUgYW4gb2JqIHNwZWNpZmljIG1hY3JvIG9mZiB3aGljaCB0YXJnZXQgY3B1IGJhY2sgZW5kcyBtYXkga2V5LiAgKi8KI2RlZmluZSBPQkpfRVZBWCAxCgovKiBpbmNsdWRlIHdoYXRldmVyIHRhcmdldCBjcHUgaXMgYXBwcm9wcmlhdGUuICAqLwojaW5jbHVkZSAidGFyZy1jcHUuaCIKCiNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgoKLyoKICogU1lNQk9MUwogKi8KCi8qCiAqIElmIHlvdXIgb2JqZWN0IGZvcm1hdCBuZWVkcyB0byByZW9yZGVyIHN5bWJvbHMsIGRlZmluZSB0aGlzLiAgV2hlbgogKiBkZWZpbmVkLCBzeW1ib2xzIGFyZSBrZXB0IG9uIGEgZG91Ymx5IGxpbmtlZCBsaXN0IGFuZCBmdW5jdGlvbnMgYXJlCiAqIG1hZGUgYXZhaWxhYmxlIGZvciBwdXNoLCBpbnNlcnQsIGFwcGVuZCwgYW5kIGRlbGV0ZS4gIElmIG5vdCBkZWZpbmVkLAogKiBzeW1ib2xzIGFyZSBrZXB0IG9uIGEgc2luZ2x5IGxpbmtlZCBsaXN0LCBvbmx5IHRoZSBhcHBlbmQgYW5kIGNsZWFyCiAqIGZhY2lsaXRpZXMgYXJlIGF2YWlsYWJsZSwgYW5kIHRoZXkgYXJlIG1hY3Jvcy4KICovCgovKiAjZGVmaW5lIFNZTUJPTFNfTkVFRF9QQUNLUE9JTlRFUlMgKi8KCi8qICAqLwp0eXBlZGVmIHN0cnVjdAogIHsKICAgIHZvaWQgKm5vdGhpbmc7CiAgfQpvYmpfc3ltYm9sX3R5cGU7CQkvKiBzaG91bGQgYmUgdGhlIGZvcm1hdCdzIHN5bWJvbCBzdHJ1Y3R1cmUgKi8KCnR5cGVkZWYgdm9pZCAqb2JqZWN0X2hlYWRlcnM7CgojZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLGIsYykJLyogbXVzdCBiZSAqc29tZXRoaW5nKi4gIFRoaXMgbm8tb3AncyBpdCBvdXQuICAqLwoKI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rKHMpICAgICAgICB7O30KCiNkZWZpbmUgU19TRVRfT1RIRVIoUyxWKQojZGVmaW5lIFNfU0VUX1RZUEUoUyxUKQojZGVmaW5lIFNfU0VUX0RFU0MoUyxEKQojZGVmaW5lIFNfR0VUX09USEVSKFMpCTAKI2RlZmluZSBTX0dFVF9UWVBFKFMpCTAKI2RlZmluZSBTX0dFVF9ERVNDKFMpCTAKCiNkZWZpbmUgUERTQ19TX0tfS0lORF9GUF9TVEFDSyA5CiNkZWZpbmUgUERTQ19TX0tfS0lORF9GUF9SRUdJU1RFUiAxMAojZGVmaW5lIFBEU0NfU19LX0tJTkRfTlVMTCA4CgojZGVmaW5lIFBEU0NfU19LX01JTl9TVEFDS19TSVpFIDMyCiNkZWZpbmUgUERTQ19TX0tfTUlOX1JFR0lTVEVSX1NJWkUgMjQKI2RlZmluZSBQRFNDX1NfS19OVUxMX1NJWkUgMTYKCiNkZWZpbmUgUERTQ19TX01fQkFTRV9SRUdfSVNfRlAgMHg4MAkvKiBsb3cgYnl0ZSAqLwojZGVmaW5lIFBEU0NfU19NX05BVElWRSAweDEwCQkvKiBoaWdoIGJ5dGUgKi8KI2RlZmluZSBQRFNDX1NfTV9OT19KQUNLRVQgMHgyMAkJLyogaGlnaCBieXRlICovCgojZGVmaW5lIExLUF9TX0tfU0laRSAxNgoKI2RlZmluZSBUQ19JTVBMSUNJVF9MQ09NTV9BTElHTk1FTlQoU0laRSwgUDJWQVIpIChQMlZBUikgPSAzCgovKgogKiBMb2NhbCBWYXJpYWJsZXM6CiAqIGNvbW1lbnQtY29sdW1uOiAwCiAqIGZpbGwtY29sdW1uOiAxMzEKICogRW5kOgogKi8K