LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogV2UgY2FuJ3QgdXNlIHB0aHJlYWRzIGRpcmVjdGx5LCBzbyB3aHkgbm90IGxldCBsaWJjcwogKiB0aGF0IHdhbnQgcHRocmVhZHMgdXNlIFdpbmUncyBvd24gdGhyZWFkaW5nIGluc3RlYWQuLi4KICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndpbmUvcG9ydC5oIgoKI2RlZmluZSBfR05VX1NPVVJDRSAvKiB3ZSBtYXkgbmVlZCB0byBvdmVycmlkZSBzb21lIEdOVSBleHRlbnNpb25zICovCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpZmRlZiBIQVZFX1VOSVNURF9ICiMgaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAidGhyZWFkLmgiCiNpbmNsdWRlICJ3aW50ZXJubC5oIgoKc3RhdGljIGludCBpbml0X2RvbmU7Cgp2b2lkIFBUSFJFQURfaW5pdF9kb25lKHZvaWQpCnsKICAgIGluaXRfZG9uZSA9IDE7Cn0KCi8qIEN1cnJlbnRseSB0aGlzIHByb2JhYmx5IHdvcmtzIG9ubHkgZm9yIGdsaWJjMiwKICogd2hpY2ggY2hlY2tzIGZvciB0aGUgcHJlc2VuY2Ugb2YgZG91YmxlLXVuZGVyc2NvcmUtcHJlcGVuZGVkCiAqIHB0aHJlYWQgcHJpbWl0aXZlcywgYW5kIHVzZSB0aGVtIGlmIGF2YWlsYWJsZS4KICogSWYgdGhleSBhcmUgbm90IGF2YWlsYWJsZSwgdGhlIGxpYmMgZGVmYXVsdHMgdG8KICogbm9uLXRocmVhZHNhZmUgb3BlcmF0aW9uIChub3QgZ29vZCkuICovCgojaWYgZGVmaW5lZChfX0dMSUJDX18pCiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KCiNkZWZpbmUgUFNUUihzdHIpIF9fQVNNX05BTUUoI3N0cikKCi8qIGFkYXB0IGFzIG5lY2Vzc2FyeSAoYSBjb25zdHJ1Y3QgbGlrZSB0aGlzIGlzIHVzZWQgaW4gZ2xpYmMgc291cmNlcykgKi8KI2RlZmluZSBzdHJvbmdfYWxpYXMob3JpZywgYWxpYXMpIFwKIGFzbSgiLmdsb2JsICIgUFNUUihhbGlhcykgIlxuIiBcCiAgICAgIlx0LnNldCAiIFBTVFIoYWxpYXMpICIsIiBQU1RSKG9yaWcpKQoKLyogc3Ryb25nX2FsaWFzIGRvZXMgbm90IHdvcmsgb24gZXh0ZXJuYWwgc3ltYm9scyAoLm8gZm9ybWF0IGxpbWl0YXRpb24/KSwKICogc28gZm9yIHRob3NlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgcG9nbyBzdGljayAqLwojaWYgZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX19QSUNfXykKLyogRklYTUU6IFBJQyAqLwojZGVmaW5lIGp1bXBfYWxpYXMob3JpZywgYWxpYXMpIF9fQVNNX0dMT0JBTF9GVU5DKCBhbGlhcywgImptcCAiIFBTVFIob3JpZykpCiNlbmRpZgoKLyogZ2V0IG5lY2Vzc2FyeSBsaWJjIHN5bWJvbHMgKi8KI2lmIChfX0dMSUJDX18gPT0gMikgJiYgKF9fR0xJQkNfTUlOT1JfXyA+PSAxKSAmJiBkZWZpbmVkKEhBVkVfX19MSUJDX0ZPUkspCiNkZWZpbmUgTElCQ19GT1JLIF9fbGliY19mb3JrCiNkZWZpbmUgUFRIUkVBRF9GT1JLIF9fZm9yawojZGVmaW5lIEFMSUFTX0ZPUksKI2Vsc2UKI2RlZmluZSBMSUJDX0ZPUksgX19mb3JrCiNkZWZpbmUgUFRIUkVBRF9GT1JLIGZvcmsKI2VuZGlmCmV4dGVybiBwaWRfdCBMSUJDX0ZPUksodm9pZCk7CgojZGVmaW5lIExJQkNfU0lHQUNUSU9OIF9fc2lnYWN0aW9uCmV4dGVybiBpbnQgTElCQ19TSUdBQ1RJT04oaW50IHNpZ251bSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKmFjdCwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gKm9sZGFjdCk7CgovKiBOT1RFOiBUaGlzIGlzIGEgdHJ1bHkgZXh0cmVtZWx5IGluY3JlZGlibHkgdWdseSBoYWNrIQogKiBCdXQgaXQgZG9lcyBzZWVtIHRvIHdvcmsuLi4gKi8KCi8qIGFzc3VtZSB0aGF0IHB0aHJlYWRfbXV0ZXhfdCBoYXMgcm9vbSBmb3IgYXQgbGVhc3Qgb25lIHBvaW50ZXIsCiAqIGFuZCBob3BlIHRoYXQgdGhlIHVzZXJzIG9mIHB0aHJlYWRfbXV0ZXhfdCBjb25zaWRlcnMgaXQgb3BhcXVlCiAqIChuZXZlciBjaGVja3Mgd2hhdCdzIGluIGl0KQogKiBhbHNvOiBhc3N1bWUgdGhhdCBzdGF0aWMgaW5pdGlhbGl6ZXIgc2V0cyBwb2ludGVyIHRvIE5VTEwKICovCnR5cGVkZWYgc3RydWN0IHsKICBDUklUSUNBTF9TRUNUSU9OICpjcml0c2VjdDsKfSAqd2luZV9tdXRleDsKCi8qIHNlZSB3aW5lX211dGV4IGFib3ZlIGZvciBjb21tZW50cyAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgUlRMX1JXTE9DSyAqbG9jazsKfSAqd2luZV9yd2xvY2s7Cgp0eXBlZGVmIHN0cnVjdCBfd2luZV9jbGVhbnVwIHsKICB2b2lkICgqcm91dGluZSkodm9pZCAqKTsKICB2b2lkICphcmc7Cn0gKndpbmVfY2xlYW51cDsKCnR5cGVkZWYgY29uc3Qgdm9pZCAqa2V5X2RhdGE7CgojZGVmaW5lIEZJUlNUX0tFWSAwCiNkZWZpbmUgTUFYX0tFWVMgMTYgLyogbGliYzYgZG9lc24ndCB1c2UgdGhhdCBtYW55LCBidXQuLi4gKi8KCiNkZWZpbmUgUF9PVVRQVVQoc3R1ZmYpIHdyaXRlKDIsc3R1ZmYsc3RybGVuKHN0dWZmKSkKCnZvaWQgX19wdGhyZWFkX2luaXRpYWxpemUodm9pZCkKewp9CgpzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdCB7Cgkgdm9pZCogKCpzdGFydF9yb3V0aW5lKSh2b2lkKik7Cgkgdm9pZCogYXJnOwp9OwoKc3RhdGljIERXT1JEIENBTExCQUNLIHB0aHJlYWRfdGhyZWFkX3N0YXJ0KExQVk9JRCBkYXRhKQp7CiAgc3RydWN0IHB0aHJlYWRfdGhyZWFkX2luaXQgaW5pdCA9ICooc3RydWN0IHB0aHJlYWRfdGhyZWFkX2luaXQqKWRhdGE7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGRhdGEpOwogIHJldHVybiAoRFdPUkQpaW5pdC5zdGFydF9yb3V0aW5lKGluaXQuYXJnKTsKfQoKaW50IHB0aHJlYWRfY3JlYXRlKHB0aHJlYWRfdCogdGhyZWFkLCBjb25zdCBwdGhyZWFkX2F0dHJfdCogYXR0ciwgdm9pZCoKICAgICAgICAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQgKiksIHZvaWQqIGFyZykKewogIEhBTkRMRSBoVGhyZWFkOwogIHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0KiBpZGF0YSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAoJCXNpemVvZihzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdCkpOwoKICBpZGF0YS0+c3RhcnRfcm91dGluZSA9IHN0YXJ0X3JvdXRpbmU7CiAgaWRhdGEtPmFyZyA9IGFyZzsKICBoVGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsIDAsIHB0aHJlYWRfdGhyZWFkX3N0YXJ0LCBpZGF0YSwgMCwgdGhyZWFkKTsKCiAgaWYoaFRocmVhZCkKICAgIENsb3NlSGFuZGxlKGhUaHJlYWQpOwogIGVsc2UKICB7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsaWRhdGEpOyAvKiBmcmVlIGlkYXRhIHN0cnVjdCBvbiBmYWlsdXJlICovCiAgICByZXR1cm4gRUFHQUlOOwogIH0KCiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NhbmNlbChwdGhyZWFkX3QgdGhyZWFkKQp7CiAgSEFORExFIGhUaHJlYWQgPSBPcGVuVGhyZWFkKFRIUkVBRF9BTExfQUNDRVNTLCBGQUxTRSwgdGhyZWFkKTsKCiAgaWYoIVRlcm1pbmF0ZVRocmVhZChoVGhyZWFkLCAwKSkKICB7CiAgICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKICAgIHJldHVybiBFSU5WQUw7ICAgICAgLyogcmV0dXJuIGVycm9yICovCiAgfQoKICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKCiAgcmV0dXJuIDA7ICAgICAgICAgICAgIC8qIHJldHVybiBzdWNjZXNzICovCn0KCmludCBwdGhyZWFkX2pvaW4ocHRocmVhZF90IHRocmVhZCwgdm9pZCAqKnZhbHVlX3B0cikKewogIEhBTkRMRSBoVGhyZWFkID0gT3BlblRocmVhZChUSFJFQURfQUxMX0FDQ0VTUywgRkFMU0UsIHRocmVhZCk7CgogIFdhaXRGb3JTaW5nbGVPYmplY3QoaFRocmVhZCwgSU5GSU5JVEUpOwogIGlmKCFHZXRFeGl0Q29kZVRocmVhZChoVGhyZWFkLCAoTFBEV09SRCl2YWx1ZV9wdHIpKQogIHsKICAgIENsb3NlSGFuZGxlKGhUaHJlYWQpOwogICAgcmV0dXJuIEVJTlZBTDsgLyogRklYTUU6IG1ha2UgdGhpcyBtb3JlIGNvcnJlY3RseSBtYXRjaCAqLwogIH0gICAgICAgICAgICAgICAgLyogd2luZG93cyBlcnJvcnMgKi8KCiAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgcmV0dXJuIDA7Cn0KCi8qRklYTUU6IG5vdCBzdXJlIHdoYXQgdG8gZG8gd2l0aCB0aGlzIG9uZS4uLiAqLwppbnQgcHRocmVhZF9kZXRhY2gocHRocmVhZF90IHRocmVhZCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2RldGFjaFxuIik7CiAgcmV0dXJuIDA7Cn0KCi8qIEZJWE1FOiB3ZSBoYXZlIG5vIGVxdWl2YWxlbnRzIGluIHdpbjMyIGZvciB0aGUgcG9saWN5cyAqLwovKiBzbyBqdXN0IGtlZXAgdGhpcyBhcyBhIHN0dWIgKi8KaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeShwdGhyZWFkX2F0dHJfdCAqYXR0ciwgaW50IHBvbGljeSkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3lcbiIpOwogIHJldHVybiAwOwp9CgovKiBGSVhNRTogbm8gd2luMzIgZXF1aXZhbGVudCBmb3Igc2NvcGUgKi8KaW50IHB0aHJlYWRfYXR0cl9zZXRzY29wZShwdGhyZWFkX2F0dHJfdCAqYXR0ciwgaW50IHNjb3BlKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfYXR0cl9zZXRzY29wZVxuIik7CiAgcmV0dXJuIDA7IC8qIHJldHVybiBzdWNjZXNzICovCn0KCi8qIEZJWE1FOiBubyB3aW4zMiBlcXVpdmFsZW50IGZvciBzY2hlZHVsZSBwYXJhbSAqLwppbnQgcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0ocHRocmVhZF9hdHRyX3QgKmF0dHIsCiAgICBjb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKnBhcmFtKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtXG4iKTsKICByZXR1cm4gMDsgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQoKaW50IF9fcHRocmVhZF9vbmNlKHB0aHJlYWRfb25jZV90ICpvbmNlX2NvbnRyb2wsIHZvaWQgKCppbml0X3JvdXRpbmUpKHZvaWQpKQp7CiAgc3RhdGljIHB0aHJlYWRfb25jZV90IHRoZV9vbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CiAgTE9ORyBvbmNlX25vdyA9ICooTE9ORyAqKSZ0aGVfb25jZTsKCiAgaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKChMT05HKilvbmNlX2NvbnRyb2wsIG9uY2Vfbm93KzEsIG9uY2Vfbm93KSA9PSBvbmNlX25vdykKICAgICgqaW5pdF9yb3V0aW5lKSgpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfb25jZSwgcHRocmVhZF9vbmNlKTsKCnZvaWQgX19wdGhyZWFkX2tpbGxfb3RoZXJfdGhyZWFkc19ucCh2b2lkKQp7CiAgICAvKiB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUgKi8KfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tpbGxfb3RoZXJfdGhyZWFkc19ucCwgcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnApOwoKLyoqKioqIGF0Zm9yayAqKioqKi8KCiNkZWZpbmUgTUFYX0FURk9SSyA4ICAvKiBsaWJjIGRvZXNuJ3QgbmVlZCB0aGF0IG1hbnkgYW55d2F5ICovCgpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBhdGZvcmtfc2VjdGlvbiA9IENSSVRJQ0FMX1NFQ1RJT05fSU5JVCgiYXRmb3JrX3NlY3Rpb24iKTsKdHlwZWRlZiB2b2lkICgqYXRmb3JrX2hhbmRsZXIpKCk7CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfcHJlcGFyZVtNQVhfQVRGT1JLXTsKc3RhdGljIGF0Zm9ya19oYW5kbGVyIGF0Zm9ya19wYXJlbnRbTUFYX0FURk9SS107CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfY2hpbGRbTUFYX0FURk9SS107CnN0YXRpYyBpbnQgYXRmb3JrX2NvdW50OwoKaW50IF9fcHRocmVhZF9hdGZvcmsodm9pZCAoKnByZXBhcmUpKHZvaWQpLAoJCSAgICAgdm9pZCAoKnBhcmVudCkodm9pZCksCgkJICAgICB2b2lkICgqY2hpbGQpKHZvaWQpKQp7CiAgICBpZiAoaW5pdF9kb25lKSBFbnRlckNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICBhc3NlcnQoIGF0Zm9ya19jb3VudCA8IE1BWF9BVEZPUksgKTsKICAgIGF0Zm9ya19wcmVwYXJlW2F0Zm9ya19jb3VudF0gPSBwcmVwYXJlOwogICAgYXRmb3JrX3BhcmVudFthdGZvcmtfY291bnRdID0gcGFyZW50OwogICAgYXRmb3JrX2NoaWxkW2F0Zm9ya19jb3VudF0gPSBjaGlsZDsKICAgIGF0Zm9ya19jb3VudCsrOwogICAgaWYgKGluaXRfZG9uZSkgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9hdGZvcmssIHB0aHJlYWRfYXRmb3JrKTsKCnBpZF90IFBUSFJFQURfRk9SSyh2b2lkKQp7CiAgICBwaWRfdCBwaWQ7CiAgICBpbnQgaTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICAvKiBwcmVwYXJlIGhhbmRsZXJzIGFyZSBjYWxsZWQgaW4gcmV2ZXJzZSBpbnNlcnRpb24gb3JkZXIgKi8KICAgIGZvciAoaSA9IGF0Zm9ya19jb3VudCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoYXRmb3JrX3ByZXBhcmVbaV0pIGF0Zm9ya19wcmVwYXJlW2ldKCk7CiAgICBpZiAoIShwaWQgPSBMSUJDX0ZPUksoKSkpCiAgICB7CiAgICAgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0Zm9ya19jb3VudDsgaSsrKSBpZiAoYXRmb3JrX2NoaWxkW2ldKSBhdGZvcmtfY2hpbGRbaV0oKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRmb3JrX2NvdW50OyBpKyspIGlmIChhdGZvcmtfcGFyZW50W2ldKSBhdGZvcmtfcGFyZW50W2ldKCk7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgfQogICAgcmV0dXJuIHBpZDsKfQojaWZkZWYgQUxJQVNfRk9SSwpzdHJvbmdfYWxpYXMoUFRIUkVBRF9GT1JLLCBmb3JrKTsKI2VuZGlmCgovKioqKiogTVVURVhFUyAqKioqKi8KCmludCBfX3B0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4X3QgKm11dGV4LAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICptdXRleGF0dHIpCnsKICAvKiBnbGliYyBoYXMgYSB0ZW5kZW5jeSB0byBpbml0aWFsaXplIG11dGV4ZXMgdmVyeSBvZnRlbiwgZXZlbgogICAgIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhleSBhcmUgbm90IHJlYWxseSB1c2VkIGxhdGVyIG9uLgoKICAgICBBcyBmb3IgdXMsIGluaXRpYWxpemluZyBhIG11dGV4IGlzIHZlcnkgZXhwZW5zaXZlLCB3ZSBwb3N0cG9uZQogICAgIHRoZSByZWFsIGluaXRpYWxpemF0aW9uIHVudGlsIHRoZSB0aW1lIHRoZSBtdXRleCBpcyBmaXJzdCB1c2VkLiAqLwoKICAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9pbml0LCBwdGhyZWFkX211dGV4X2luaXQpOwoKc3RhdGljIHZvaWQgbXV0ZXhfcmVhbF9pbml0KCBwdGhyZWFkX211dGV4X3QgKm11dGV4ICkKewogIENSSVRJQ0FMX1NFQ1RJT04gKmNyaXRzZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihDUklUSUNBTF9TRUNUSU9OKSk7CiAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihjcml0c2VjdCk7CgogIGlmIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZVBvaW50ZXIoKHZvaWQqKikmKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSxjcml0c2VjdCxOVUxMKSAhPSBOVUxMKSB7CiAgICAvKiB0b28gbGF0ZSwgc29tZSBvdGhlciB0aHJlYWQgYWxyZWFkeSBkaWQgaXQgKi8KICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbihjcml0c2VjdCk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBjcml0c2VjdCk7CiAgfQp9CgppbnQgX19wdGhyZWFkX211dGV4X2xvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKewogIGlmICghaW5pdF9kb25lKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KQogICAgbXV0ZXhfcmVhbF9pbml0KCBtdXRleCApOwoKICBFbnRlckNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9sb2NrLCBwdGhyZWFkX211dGV4X2xvY2spOwoKaW50IF9fcHRocmVhZF9tdXRleF90cnlsb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoIWluaXRfZG9uZSkgcmV0dXJuIDA7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkKICAgIG11dGV4X3JlYWxfaW5pdCggbXV0ZXggKTsKCiAgaWYgKCFUcnlFbnRlckNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkpIHsKICAgIGVycm5vID0gRUJVU1k7CiAgICByZXR1cm4gLTE7CiAgfQogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaywgcHRocmVhZF9tdXRleF90cnlsb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSByZXR1cm4gMDsKICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF91bmxvY2ssIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveShwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkgcmV0dXJuIDA7CiAgaWYgKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0LT5SZWN1cnNpb25Db3VudCkgewojaWYgMCAvKiB0aGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiBsaWJjNiB0aGF0IG1ha2VzIHRoaXMgYSBiYWQgaWRlYSAqLwogICAgcmV0dXJuIEVCVVNZOwojZWxzZQogICAgd2hpbGUgKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0LT5SZWN1cnNpb25Db3VudCkKICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwojZW5kaWYKICB9CiAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9kZXN0cm95LCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kpOwoKCi8qKioqKiBNVVRFWCBBVFRSSUJVVEVTICoqKioqLwovKiBqdXN0IGR1bW1pZXMsIHNpbmNlIGNyaXRpY2FsIHNlY3Rpb25zIGFyZSBhbHdheXMgcmVjdXJzaXZlICovCgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9pbml0KHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9pbml0LCBwdGhyZWFkX211dGV4YXR0cl9pbml0KTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3ksIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQga2luZCkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnAsIHB0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnApOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0a2luZF9ucChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQgKmtpbmQpCnsKICAqa2luZCA9IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnAsIHB0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnApOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQga2luZCkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUsIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQgKmtpbmQpCnsKICAqa2luZCA9IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUsIHB0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUpOwoKCi8qKioqKiBUSFJFQUQtU1BFQ0lGSUMgVkFSSUFCTEVTIChLRVlTKSAqKioqKi8KCmludCBfX3B0aHJlYWRfa2V5X2NyZWF0ZShwdGhyZWFkX2tleV90ICprZXksIHZvaWQgKCpkZXN0cl9mdW5jdGlvbikodm9pZCAqKSkKewogIHN0YXRpYyBMT05HIGtleWNudCA9IEZJUlNUX0tFWTsKICAqa2V5ID0gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgma2V5Y250LCAxKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tleV9jcmVhdGUsIHB0aHJlYWRfa2V5X2NyZWF0ZSk7CgppbnQgX19wdGhyZWFkX2tleV9kZWxldGUocHRocmVhZF9rZXlfdCBrZXkpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tleV9kZWxldGUsIHB0aHJlYWRfa2V5X2RlbGV0ZSk7CgppbnQgX19wdGhyZWFkX3NldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5LCBjb25zdCB2b2lkICpwb2ludGVyKQp7CiAgVEVCICp0ZWIgPSBOdEN1cnJlbnRUZWIoKTsKICBpZiAoIXRlYi0+cHRocmVhZF9kYXRhKSB7CiAgICB0ZWItPnB0aHJlYWRfZGF0YSA9IGNhbGxvYyhNQVhfS0VZUyxzaXplb2Yoa2V5X2RhdGEpKTsKICB9CiAgKChrZXlfZGF0YSopKHRlYi0+cHRocmVhZF9kYXRhKSlba2V5XSA9IHBvaW50ZXI7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9zZXRzcGVjaWZpYywgcHRocmVhZF9zZXRzcGVjaWZpYyk7Cgp2b2lkICpfX3B0aHJlYWRfZ2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXkpCnsKICBURUIgKnRlYiA9IE50Q3VycmVudFRlYigpOwogIGlmICghdGViKSByZXR1cm4gTlVMTDsKICBpZiAoIXRlYi0+cHRocmVhZF9kYXRhKSByZXR1cm4gTlVMTDsKICByZXR1cm4gKHZvaWQgKikoKChrZXlfZGF0YSopKHRlYi0+cHRocmVhZF9kYXRhKSlba2V5XSk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9nZXRzcGVjaWZpYywgcHRocmVhZF9nZXRzcGVjaWZpYyk7CgoKLyoqKioqICJFWENFUFRJT04iIEZSQU1FUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3B1c2goc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIHZvaWQgKCpyb3V0aW5lKSh2b2lkICopLCB2b2lkICphcmcpCnsKICAoKHdpbmVfY2xlYW51cClidWZmZXIpLT5yb3V0aW5lID0gcm91dGluZTsKICAoKHdpbmVfY2xlYW51cClidWZmZXIpLT5hcmcgPSBhcmc7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3Aoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIGludCBleGVjdXRlKQp7CiAgaWYgKGV4ZWN1dGUpICgqKCgod2luZV9jbGVhbnVwKWJ1ZmZlciktPnJvdXRpbmUpKSgoKHdpbmVfY2xlYW51cClidWZmZXIpLT5hcmcpOwp9Cgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcihzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKiksIHZvaWQgKmFyZykKewogIF9wdGhyZWFkX2NsZWFudXBfcHVzaChidWZmZXIsIHJvdXRpbmUsIGFyZyk7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZShzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgaW50IGV4ZWN1dGUpCnsKICBfcHRocmVhZF9jbGVhbnVwX3BvcChidWZmZXIsIGV4ZWN1dGUpOwp9CgoKLyoqKioqIENPTkRJVElPTlMgKioqKiovCi8qIG5vdCBpbXBsZW1lbnRlZCByaWdodCBub3cgKi8KCmludCBwdGhyZWFkX2NvbmRfaW5pdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgY29uc3QgcHRocmVhZF9jb25kYXR0cl90ICpjb25kX2F0dHIpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2luaXRcbiIpOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kX2Rlc3Ryb3kocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2Rlc3Ryb3lcbiIpOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kX3NpZ25hbChwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfc2lnbmFsXG4iKTsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfY29uZF9icm9hZGNhc3QocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2Jyb2FkY2FzdFxuIik7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NvbmRfd2FpdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfd2FpdFxuIik7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KHB0aHJlYWRfY29uZF90ICpjb25kLCBwdGhyZWFkX211dGV4X3QgKm11dGV4LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmFic3RpbWUpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX3RpbWVkd2FpdFxuIik7CiAgcmV0dXJuIDA7Cn0KCi8qKioqIENPTkRJVElPTiBBVFRSSUJVVEVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgcHRocmVhZF9jb25kYXR0cl9pbml0KHB0aHJlYWRfY29uZGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kYXR0cl9kZXN0cm95KHB0aHJlYWRfY29uZGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgojaWYgKF9fR0xJQkNfXyA9PSAyKSAmJiAoX19HTElCQ19NSU5PUl9fID49IDIpCi8qKioqKiBSRUFELVdSSVRFIExPQ0tTICoqKioqLwoKc3RhdGljIHZvaWQgcndsb2NrX3JlYWxfaW5pdChwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBSVExfUldMT0NLICpsb2NrID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihSVExfUldMT0NLKSk7CiAgUnRsSW5pdGlhbGl6ZVJlc291cmNlKGxvY2spOwoKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKCh2b2lkKiopJigoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spLGxvY2ssTlVMTCkgIT0gTlVMTCkgewogICAgLyogdG9vIGxhdGUsIHNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgZGlkIGl0ICovCiAgICBSdGxEZWxldGVSZXNvdXJjZShsb2NrKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGxvY2spOwogIH0KfQoKaW50IF9fcHRocmVhZF9yd2xvY2tfaW5pdChwdGhyZWFkX3J3bG9ja190ICpyd2xvY2ssIGNvbnN0IHB0aHJlYWRfcndsb2NrYXR0cl90ICpyd2xvY2tfYXR0cikKewogICgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jayA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfaW5pdCwgcHRocmVhZF9yd2xvY2tfaW5pdCk7CgppbnQgX19wdGhyZWFkX3J3bG9ja19kZXN0cm95KHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKSByZXR1cm4gMDsKICBSdGxEZWxldGVSZXNvdXJjZSgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jayk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveSwgcHRocmVhZF9yd2xvY2tfZGVzdHJveSk7CgppbnQgX19wdGhyZWFkX3J3bG9ja19yZGxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCFpbml0X2RvbmUpIHJldHVybiAwOwogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIHdoaWxlKFRSVUUpCiAgICBpZiAoUnRsQWNxdWlyZVJlc291cmNlU2hhcmVkKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgVFJVRSkpCiAgICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3JkbG9jaywgcHRocmVhZF9yd2xvY2tfcmRsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoIWluaXRfZG9uZSkgcmV0dXJuIDA7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spCiAgICByd2xvY2tfcmVhbF9pbml0KCByd2xvY2sgKTsKCiAgaWYgKCFSdGxBY3F1aXJlUmVzb3VyY2VTaGFyZWQoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrLCBGQUxTRSkpIHsKICAgIGVycm5vID0gRUJVU1k7CiAgICByZXR1cm4gLTE7CiAgfQogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaywgcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3dybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoIWluaXRfZG9uZSkgcmV0dXJuIDA7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spCiAgICByd2xvY2tfcmVhbF9pbml0KCByd2xvY2sgKTsKCiAgd2hpbGUoVFJVRSkKICAgIGlmIChSdGxBY3F1aXJlUmVzb3VyY2VFeGNsdXNpdmUoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrLCBUUlVFKSkKICAgICAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfd3Jsb2NrLCBwdGhyZWFkX3J3bG9ja193cmxvY2spOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghaW5pdF9kb25lKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykKICAgIHJ3bG9ja19yZWFsX2luaXQoIHJ3bG9jayApOwoKICBpZiAoIVJ0bEFjcXVpcmVSZXNvdXJjZUV4Y2x1c2l2ZSgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2ssIEZBTFNFKSkgewogICAgZXJybm8gPSBFQlVTWTsKICAgIHJldHVybiAtMTsKICB9CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrLCBwdGhyZWFkX3J3bG9ja190cnl3cmxvY2spOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfdW5sb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKSByZXR1cm4gMDsKICBSdGxSZWxlYXNlUmVzb3VyY2UoICgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jayApOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3VubG9jaywgcHRocmVhZF9yd2xvY2tfdW5sb2NrKTsKCi8qKioqIFJFQUQtV1JJVEUgTE9DSyBBVFRSSUJVVEVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgcHRocmVhZF9yd2xvY2thdHRyX2luaXQocHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQoKaW50IF9fcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3kocHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja2F0dHJfZGVzdHJveSwgcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3kpOwoKaW50IHB0aHJlYWRfcndsb2NrYXR0cl9nZXRraW5kX25wKGNvbnN0IHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyLCBpbnQgKnByZWYpCnsKICAqcHJlZiA9IDA7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX3J3bG9ja2F0dHJfc2V0a2luZF9ucChwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0ciwgaW50IHByZWYpCnsKICByZXR1cm4gMDsKfQojZW5kaWYgLyogZ2xpYmMgMi4yICovCgovKioqKiogTUlTQyAqKioqKi8KCnB0aHJlYWRfdCBwdGhyZWFkX3NlbGYodm9pZCkKewogIHJldHVybiAocHRocmVhZF90KUdldEN1cnJlbnRUaHJlYWRJZCgpOwp9CgppbnQgcHRocmVhZF9lcXVhbChwdGhyZWFkX3QgdGhyZWFkMSwgcHRocmVhZF90IHRocmVhZDIpCnsKICByZXR1cm4gKERXT1JEKXRocmVhZDEgPT0gKERXT1JEKXRocmVhZDI7Cn0KCnZvaWQgcHRocmVhZF9leGl0KHZvaWQgKnJldHZhbCkKewogIC8qIEZJWE1FOiBwdGhyZWFkIGNsZWFudXAgKi8KICBFeGl0VGhyZWFkKChEV09SRClyZXR2YWwpOwp9CgppbnQgcHRocmVhZF9zZXRjYW5jZWx0eXBlKGludCB0eXBlLCBpbnQgKm9sZHR5cGUpCnsKICBpZiAob2xkdHlwZSkgKm9sZHR5cGUgPSBQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVM7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKiBBTlRJLU9WRVJSSURFUyAqKioqKi8KLyogcHRocmVhZHMgdHJpZXMgdG8gb3ZlcnJpZGUgdGhlc2UsIHBvaW50IHRoZW0gYmFjayB0byBsaWJjICovCgojaWZkZWYganVtcF9hbGlhcwpqdW1wX2FsaWFzKExJQkNfU0lHQUNUSU9OLCBzaWdhY3Rpb24pOwojZWxzZQppbnQgc2lnYWN0aW9uKGludCBzaWdudW0sIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKmFjdCwgc3RydWN0IHNpZ2FjdGlvbiAqb2xkYWN0KQp7CiAgcmV0dXJuIExJQkNfU0lHQUNUSU9OKHNpZ251bSwgYWN0LCBvbGRhY3QpOwp9CiNlbmRpZgoKI2VuZGlmIC8qIF9fR0xJQkNfXyAqLwo=