AAAAbQAAACYAcQBzAHEAbABlAGQAaQB0AG8AcgBmAGEAYwB0AG8AcgB5AC4AaAAACbkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVNRTEVESVRPUkZBQ1RPUllfSAojZGVmaW5lIFFTUUxFRElUT1JGQUNUT1JZX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicWVkaXRvcmZhY3RvcnkuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZiAhZGVmaW5lZCggUVRfTU9EVUxFX1NRTCApIHx8IGRlZmluZWQoIFFUX0xJQ0VOU0VfUFJPRkVTU0lPTkFMICkKI2RlZmluZSBRTV9FWFBPUlRfU1FMCiNlbHNlCiNkZWZpbmUgUU1fRVhQT1JUX1NRTCBRX0VYUE9SVAojZW5kaWYKCiNpZm5kZWYgUVRfTk9fU1FMX0VESVRfV0lER0VUUwoKY2xhc3MgUVNxbEZpZWxkOwoKY2xhc3MgUU1fRVhQT1JUX1NRTCBRU3FsRWRpdG9yRmFjdG9yeSA6IHB1YmxpYyBRRWRpdG9yRmFjdG9yeQp7CnB1YmxpYzoKICAgIFFTcWxFZGl0b3JGYWN0b3J5ICggUU9iamVjdCAqIHBhcmVudCA9IDAsIGNvbnN0IGNoYXIgKiBuYW1lID0gMCApOwogICAgflFTcWxFZGl0b3JGYWN0b3J5KCk7CiAgICB2aXJ0dWFsIFFXaWRnZXQgKiBjcmVhdGVFZGl0b3IoIFFXaWRnZXQgKiBwYXJlbnQsIGNvbnN0IFFWYXJpYW50ICYgdmFyaWFudCApOwogICAgdmlydHVhbCBRV2lkZ2V0ICogY3JlYXRlRWRpdG9yKCBRV2lkZ2V0ICogcGFyZW50LCBjb25zdCBRU3FsRmllbGQgKiBmaWVsZCApOwoKICAgIHN0YXRpYyBRU3FsRWRpdG9yRmFjdG9yeSAqIGRlZmF1bHRGYWN0b3J5KCk7CiAgICBzdGF0aWMgdm9pZCBpbnN0YWxsRGVmYXVsdEZhY3RvcnkoIFFTcWxFZGl0b3JGYWN0b3J5ICogZmFjdG9yeSApOwoKcHJpdmF0ZToKI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpIC8vIERpc2FibGVkIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPQogICAgUVNxbEVkaXRvckZhY3RvcnkoIGNvbnN0IFFTcWxFZGl0b3JGYWN0b3J5ICYgKTsKICAgIFFTcWxFZGl0b3JGYWN0b3J5ICZvcGVyYXRvcj0oIGNvbnN0IFFTcWxFZGl0b3JGYWN0b3J5ICYgKTsKI2VuZGlmCn07CgojZW5kaWYgLy8gUVRfTk9fU1FMCiNlbmRpZiAvLyBRU1FMRURJVE9SRkFDVE9SWV9ICgAAACQAcQBzAHEAbABkAHIAaQB2AGUAcgBwAGwAdQBnAGkAbgAuAGgAAAgpLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFTUUxEUklWRVJQTFVHSU5fSAojZGVmaW5lIFFTUUxEUklWRVJQTFVHSU5fSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxZ3BsdWdpbi5oIgojaW5jbHVkZSAicXN0cmluZ2xpc3QuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fU1FMCiNpZm5kZWYgUVRfTk9fQ09NUE9ORU5UCgpjbGFzcyBRU3FsRHJpdmVyOwpjbGFzcyBRU3FsRHJpdmVyUGx1Z2luUHJpdmF0ZTsKCmNsYXNzIFFfRVhQT1JUIFFTcWxEcml2ZXJQbHVnaW4gOiBwdWJsaWMgUUdQbHVnaW4KewogICAgUV9PQkpFQ1QKcHVibGljOgogICAgUVNxbERyaXZlclBsdWdpbigpOwogICAgflFTcWxEcml2ZXJQbHVnaW4oKTsKCiAgICB2aXJ0dWFsIFFTdHJpbmdMaXN0IGtleXMoKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIFFTcWxEcml2ZXIgKmNyZWF0ZSggY29uc3QgUVN0cmluZyAma2V5ICkgPSAwOwoKcHJpdmF0ZToKICAgIFFTcWxEcml2ZXJQbHVnaW5Qcml2YXRlICpkOwp9OwoKI2VuZGlmIC8vIFFUX05PX0NPTVBPTkVOVAojZW5kaWYgLy8gUVRfTk9fU1FMCgojZW5kaWYgLy8gUVNRTERSSVZFUlBMVUdJTl9ICgAAABQAcQB3AG0AYQB0AHIAaQB4AC4AaAAAEMMvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRV01BVFJJWF9ICiNkZWZpbmUgUVdNQVRSSVhfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxd2luZG93ZGVmcy5oIgojaW5jbHVkZSAicXBvaW50YXJyYXkuaCIKI2luY2x1ZGUgInFyZWN0LmgiCiNpbmNsdWRlICJxcmVnaW9uLmgiCiNlbmRpZiAvLyBRVF9ICgojaWZuZGVmIFFUX05PX1dNQVRSSVgKCgpjbGFzcyBRX0VYUE9SVCBRV01hdHJpeAkJCQkJLy8gMkQgdHJhbnNmb3JtIG1hdHJpeAp7CnB1YmxpYzoKICAgIFFXTWF0cml4KCk7CiAgICBRV01hdHJpeCggZG91YmxlIG0xMSwgZG91YmxlIG0xMiwgZG91YmxlIG0yMSwgZG91YmxlIG0yMiwKCSAgICAgIGRvdWJsZSBkeCwgZG91YmxlIGR5ICk7CgogICAgdm9pZAlzZXRNYXRyaXgoIGRvdWJsZSBtMTEsIGRvdWJsZSBtMTIsIGRvdWJsZSBtMjEsIGRvdWJsZSBtMjIsCgkJCSAgIGRvdWJsZSBkeCwgIGRvdWJsZSBkeSApOwoKICAgIGRvdWJsZQltMTEoKSBjb25zdCB7IHJldHVybiBfbTExOyB9CiAgICBkb3VibGUJbTEyKCkgY29uc3QgeyByZXR1cm4gX20xMjsgfQogICAgZG91YmxlCW0yMSgpIGNvbnN0IHsgcmV0dXJuIF9tMjE7IH0KICAgIGRvdWJsZQltMjIoKSBjb25zdCB7IHJldHVybiBfbTIyOyB9CiAgICBkb3VibGUJZHgoKSAgY29uc3QgeyByZXR1cm4gX2R4OyB9CiAgICBkb3VibGUJZHkoKSAgY29uc3QgeyByZXR1cm4gX2R5OyB9CgogICAgdm9pZAltYXAoIGludCB4LCBpbnQgeSwgaW50ICp0eCwgaW50ICp0eSApCSAgICAgIGNvbnN0OwogICAgdm9pZAltYXAoIGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlICp0eCwgZG91YmxlICp0eSApIGNvbnN0OwogICAgUVJlY3QJbWFwUmVjdCggY29uc3QgUVJlY3QgJiApCWNvbnN0OwoKICAgIFFQb2ludAltYXAoIGNvbnN0IFFQb2ludCAmcCApCWNvbnN0IHsgcmV0dXJuIG9wZXJhdG9yICooIHAgKTsgfQogICAgUVJlY3QJbWFwKCBjb25zdCBRUmVjdCAmciApCWNvbnN0IHsgcmV0dXJuIG1hcFJlY3QgKCByICk7IH0KICAgIFFQb2ludEFycmF5IG1hcCggY29uc3QgUVBvaW50QXJyYXkgJmEgKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciAqICggYSApOyB9CiAgICBRUmVnaW9uICAgICBtYXAoIGNvbnN0IFFSZWdpb24gJnIgKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciAqKCByICk7IH0KICAgIFFSZWdpb24gICAgIG1hcFRvUmVnaW9uKCBjb25zdCBRUmVjdCAmciApIGNvbnN0IHsgcmV0dXJuIG9wZXJhdG9yICooIHIgKTsgfQogICAgUVBvaW50QXJyYXkJbWFwVG9Qb2x5Z29uKCBjb25zdCBRUmVjdCAmciApCWNvbnN0OwoKICAgIHZvaWQJcmVzZXQoKTsKICAgIGJvb2wJaXNJZGVudGl0eSgpIGNvbnN0OwoKICAgIFFXTWF0cml4ICAgJnRyYW5zbGF0ZSggZG91YmxlIGR4LCBkb3VibGUgZHkgKTsKICAgIFFXTWF0cml4ICAgJnNjYWxlKCBkb3VibGUgc3gsIGRvdWJsZSBzeSApOwogICAgUVdNYXRyaXggICAmc2hlYXIoIGRvdWJsZSBzaCwgZG91YmxlIHN2ICk7CiAgICBRV01hdHJpeCAgICZyb3RhdGUoIGRvdWJsZSBhICk7CgogICAgYm9vbCBpc0ludmVydGlibGUoKSBjb25zdCB7IHJldHVybiAoX20xMSpfbTIyIC0gX20xMipfbTIxKSAhPSAwOyB9CiAgICBkb3VibGUgZGV0KCkgY29uc3QgeyByZXR1cm4gX20xMSpfbTIyIC0gX20xMipfbTIxOyB9CgogICAgUVdNYXRyaXgJaW52ZXJ0KCBib29sICogPSAwICkgY29uc3Q7CgogICAgYm9vbAlvcGVyYXRvcj09KCBjb25zdCBRV01hdHJpeCAmICkgY29uc3Q7CiAgICBib29sCW9wZXJhdG9yIT0oIGNvbnN0IFFXTWF0cml4ICYgKSBjb25zdDsKICAgIFFXTWF0cml4ICAgJm9wZXJhdG9yKj0oIGNvbnN0IFFXTWF0cml4ICYgKTsKCiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBRUG9pbnQgb3BlcmF0b3IgKiAoY29uc3QgUVBvaW50ICYgKSBjb25zdDsKICAgIFFSZWdpb24gb3BlcmF0b3IgKiAoY29uc3QgUVJlY3QgJiApIGNvbnN0OwogICAgUVJlZ2lvbiBvcGVyYXRvciAqIChjb25zdCBRUmVnaW9uICYgKSBjb25zdDsKICAgIFFQb2ludEFycmF5IG9wZXJhdG9yICogICggY29uc3QgUVBvaW50QXJyYXkgJmEgKSBjb25zdDsKCiAgICBlbnVtIFRyYW5zZm9ybWF0aW9uTW9kZSB7CglQb2ludHMsIEFyZWFzCiAgICB9OwogICAgc3RhdGljIHZvaWQgc2V0VHJhbnNmb3JtYXRpb25Nb2RlKCBRV01hdHJpeDo6VHJhbnNmb3JtYXRpb25Nb2RlIG0gKTsKICAgIHN0YXRpYyBUcmFuc2Zvcm1hdGlvbk1vZGUgdHJhbnNmb3JtYXRpb25Nb2RlKCk7CnByaXZhdGU6CiAgICBkb3VibGUJX20xMSwgX20xMjsKICAgIGRvdWJsZQlfbTIxLCBfbTIyOwogICAgZG91YmxlCV9keCwgIF9keTsKfTsKClFfRVhQT1JUIFFXTWF0cml4IG9wZXJhdG9yKiggY29uc3QgUVdNYXRyaXggJiwgY29uc3QgUVdNYXRyaXggJiApOwoKCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKUV9FWFBPUlQgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFXTWF0cml4ICYgKTsKUV9FWFBPUlQgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFXTWF0cml4ICYgKTsKCgojZW5kaWYgLy8gUVRfTk9fV01BVFJJWAoKI2VuZGlmIC8vIFFXTUFUUklYX0gKAAAAEgBxAHQAXwBtAGEAYwA5AC4AaAAACVkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFUX01BQzlfSAojZGVmaW5lIFFUX01BQzlfSAoKI2luY2x1ZGUgInFnbG9iYWwuaCIKI2lmZGVmIFFfV1NfTUFDOQoKLy90aGVzZSBkb24ndCBiZWxvbmcgaGVyZSwgYnV0IHdpbGwgYmUgbW92ZWQgdG8gYW4KLy9hcHByb3ByaWF0ZSBwbGFjZSBsYXRlcgovL2ZlYXR1cmVzCiNpZm5kZWYgUVRfTk9fSU1BR0VJT19KUEVHCiNkZWZpbmUgUVRfTk9fSU1BR0VJT19KUEVHCiNlbmRpZgojaWZuZGVmIFFUX05PX0lNQUdFSU9fTU5HCiNkZWZpbmUgUVRfTk9fSU1BR0VJT19NTkcKI2VuZGlmCiNpZm5kZWYgUVRfTk9fU1FMCiNkZWZpbmUgUVRfTk9fU1FMCiNlbmRpZgojZGVmaW5lIFFUX0ZBVEFMX0FTU0VSVAojZGVmaW5lIFFUX05PX1hJTkVSQU1BCiNkZWZpbmUgUVRfTk9fT1BFTkdMCiNkZWZpbmUgUVRfTk9fU1RZTEVfV0lORE9XU1hQIAoKLy9tYWMgdGhpbmd5CiNpZm5kZWYgUU1BQ19PTkVfUElYRUxfTE9DSwojZGVmaW5lIFFNQUNfT05FX1BJWEVMX0xPQ0sKI2VuZGlmCi8vY2FyYm9uIHRoaW5ncwojZGVmaW5lIEFMTE9XX09MRF9DQVJCT04KI2RlZmluZSBfRVZFTlRfSEFORExFUlMgMAojZGVmaW5lIEFMTE9XX09MRF9DUkVBVEVfRk9PX0NPTlRST0xfUEFSQU1FVEVSUyAwCiNkZWZpbmUgQ0FSQk9OX09OX01BQ19PIDEKI2RlZmluZSBBTExPV19PTERfQkxPQ0tJTkdfQVBJUyAwCgovL2hhY2tzIHRvIHdvcmsgYXJvdW5kIHdjaGFyIHByb2JsZW1zCiNkZWZpbmUgX19XQ0hBUlRERUZfXwovLyNkZWZpbmUgX19OT19XSURFX0NIQVIgMQojdW5kZWYgd2NoYXJfdAp0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGhpZGVfd2NoYXJfdDsgCiNkZWZpbmUgd2NoYXJfdCBoaWRlX3djaGFyX3QKCiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgPGNzdGRsaWI+IC8vcHVsbCBpbiBzb21lIHBvc2l4IHN0dWZmCnVzaW5nIHN0ZDo6Y2FsbG9jOwp1c2luZyBzdGQ6OmZyZWU7CnVzaW5nIHN0ZDo6cmVhbGxvYzsKCi8vaGFja3MgdG8gd29yayBhcm91bmQgbWFsbG9jKDApIHJldHVybmluZyBOVUxMCnN0YXRpYyBpbmxpbmUgdm9pZCAqX21hYzlfbWFsbG9jKHNpemVfdCBzKSB7IHJldHVybiBzdGQ6Om1hbGxvYyhzID8gcyA6IDEpOyB9CiNkZWZpbmUgbWFsbG9jKHgpIF9tYWM5X21hbGxvYyh4KQoKI2VuZGlmIC8vTUFDOQoKI2VuZGlmIC8vTUFDOV9ICgAAABIAcQB3AGkAZABnAGUAdAAuAGgAAICJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdJREdFVF9ICiNkZWZpbmUgUVdJREdFVF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInF3aW5kb3dkZWZzLmgiCiNpbmNsdWRlICJxb2JqZWN0LmgiCiNpbmNsdWRlICJxcGFpbnRkZXZpY2UuaCIKI2luY2x1ZGUgInFwYWxldHRlLmgiCiNpbmNsdWRlICJxZm9udC5oIgojaW5jbHVkZSAicWZvbnRtZXRyaWNzLmgiCiNpbmNsdWRlICJxZm9udGluZm8uaCIKI2luY2x1ZGUgInFzaXplcG9saWN5LmgiCiNlbmRpZiAvLyBRVF9ICgpjbGFzcyBRTGF5b3V0OwpzdHJ1Y3QgUVdFeHRyYTsKc3RydWN0IFFUTFdFeHRyYTsKY2xhc3MgUUZvY3VzRGF0YTsKY2xhc3MgUUN1cnNvcjsKY2xhc3MgUVdTUmVnaW9uTWFuYWdlcjsKY2xhc3MgUVN0eWxlOwoKY2xhc3MgUV9FWFBPUlQgUVdpZGdldCA6IHB1YmxpYyBRT2JqZWN0LCBwdWJsaWMgUVBhaW50RGV2aWNlCnsKICAgIFFfT0JKRUNUCiAgICBRX0VOVU1TKCBCYWNrZ3JvdW5kTW9kZSBGb2N1c1BvbGljeSBCYWNrZ3JvdW5kT3JpZ2luICkKICAgIFFfUFJPUEVSVFkoIGJvb2wgaXNUb3BMZXZlbCBSRUFEIGlzVG9wTGV2ZWwgKQogICAgUV9QUk9QRVJUWSggYm9vbCBpc0RpYWxvZyBSRUFEIGlzRGlhbG9nICkKICAgIFFfUFJPUEVSVFkoIGJvb2wgaXNNb2RhbCBSRUFEIGlzTW9kYWwgKQogICAgUV9QUk9QRVJUWSggYm9vbCBpc1BvcHVwIFJFQUQgaXNQb3B1cCApCiAgICBRX1BST1BFUlRZKCBib29sIGlzRGVza3RvcCBSRUFEIGlzRGVza3RvcCApCiAgICBRX1BST1BFUlRZKCBib29sIGVuYWJsZWQgUkVBRCBpc0VuYWJsZWQgV1JJVEUgc2V0RW5hYmxlZCApCiAgICBRX1BST1BFUlRZKCBRUmVjdCBnZW9tZXRyeSBSRUFEIGdlb21ldHJ5IFdSSVRFIHNldEdlb21ldHJ5ICkKICAgIFFfUFJPUEVSVFkoIFFSZWN0IGZyYW1lR2VvbWV0cnkgUkVBRCBmcmFtZUdlb21ldHJ5ICkKICAgIFFfUFJPUEVSVFkoIGludCB4IFJFQUQgeCApCiAgICBRX1BST1BFUlRZKCBpbnQgeSBSRUFEIHkgKQogICAgUV9QUk9QRVJUWSggUVBvaW50IHBvcyBSRUFEIHBvcyBXUklURSBtb3ZlIERFU0lHTkFCTEUgZmFsc2UgU1RPUkVEIGZhbHNlICkKICAgIFFfUFJPUEVSVFkoIFFTaXplIGZyYW1lU2l6ZSBSRUFEIGZyYW1lU2l6ZSApCiAgICBRX1BST1BFUlRZKCBRU2l6ZSBzaXplIFJFQUQgc2l6ZSBXUklURSByZXNpemUgREVTSUdOQUJMRSBmYWxzZSBTVE9SRUQgZmFsc2UgKQogICAgUV9QUk9QRVJUWSggaW50IHdpZHRoIFJFQUQgd2lkdGggKQogICAgUV9QUk9QRVJUWSggaW50IGhlaWdodCBSRUFEIGhlaWdodCApCiAgICBRX1BST1BFUlRZKCBRUmVjdCByZWN0IFJFQUQgcmVjdCApCiAgICBRX1BST1BFUlRZKCBRUmVjdCBjaGlsZHJlblJlY3QgUkVBRCBjaGlsZHJlblJlY3QgKQogICAgUV9QUk9QRVJUWSggUVJlZ2lvbiBjaGlsZHJlblJlZ2lvbiBSRUFEIGNoaWxkcmVuUmVnaW9uICkKICAgIFFfUFJPUEVSVFkoIFFTaXplUG9saWN5IHNpemVQb2xpY3kgUkVBRCBzaXplUG9saWN5IFdSSVRFIHNldFNpemVQb2xpY3kgKQogICAgUV9QUk9QRVJUWSggUVNpemUgbWluaW11bVNpemUgUkVBRCBtaW5pbXVtU2l6ZSBXUklURSBzZXRNaW5pbXVtU2l6ZSApCiAgICBRX1BST1BFUlRZKCBRU2l6ZSBtYXhpbXVtU2l6ZSBSRUFEIG1heGltdW1TaXplIFdSSVRFIHNldE1heGltdW1TaXplICkKICAgIFFfUFJPUEVSVFkoIGludCBtaW5pbXVtV2lkdGggUkVBRCBtaW5pbXVtV2lkdGggV1JJVEUgc2V0TWluaW11bVdpZHRoIFNUT1JFRCBmYWxzZSBERVNJR05BQkxFIGZhbHNlICkKICAgIFFfUFJPUEVSVFkoIGludCBtaW5pbXVtSGVpZ2h0IFJFQUQgbWluaW11bUhlaWdodCBXUklURSBzZXRNaW5pbXVtSGVpZ2h0IFNUT1JFRCBmYWxzZSBERVNJR05BQkxFIGZhbHNlICkKICAgIFFfUFJPUEVSVFkoIGludCBtYXhpbXVtV2lkdGggUkVBRCBtYXhpbXVtV2lkdGggV1JJVEUgc2V0TWF4aW11bVdpZHRoIFNUT1JFRCBmYWxzZSBERVNJR05BQkxFIGZhbHNlICkKICAgIFFfUFJPUEVSVFkoIGludCBtYXhpbXVtSGVpZ2h0IFJFQUQgbWF4aW11bUhlaWdodCBXUklURSBzZXRNYXhpbXVtSGVpZ2h0IFNUT1JFRCBmYWxzZSBERVNJR05BQkxFIGZhbHNlICkKICAgIFFfUFJPUEVSVFkoIFFTaXplIHNpemVJbmNyZW1lbnQgUkVBRCBzaXplSW5jcmVtZW50IFdSSVRFIHNldFNpemVJbmNyZW1lbnQgKQogICAgUV9QUk9QRVJUWSggUVNpemUgYmFzZVNpemUgUkVBRCBiYXNlU2l6ZSBXUklURSBzZXRCYXNlU2l6ZSApCiAgICBRX1BST1BFUlRZKCBCYWNrZ3JvdW5kTW9kZSBiYWNrZ3JvdW5kTW9kZSBSRUFEIGJhY2tncm91bmRNb2RlIFdSSVRFIHNldEJhY2tncm91bmRNb2RlIERFU0lHTkFCTEUgZmFsc2UgKQogICAgUV9QUk9QRVJUWSggUUNvbG9yIHBhbGV0dGVGb3JlZ3JvdW5kQ29sb3IgUkVBRCBwYWxldHRlRm9yZWdyb3VuZENvbG9yIFdSSVRFIHNldFBhbGV0dGVGb3JlZ3JvdW5kQ29sb3IgUkVTRVQgdW5zZXRQYWxldHRlICkKICAgIFFfUFJPUEVSVFkoIFFDb2xvciBwYWxldHRlQmFja2dyb3VuZENvbG9yIFJFQUQgcGFsZXR0ZUJhY2tncm91bmRDb2xvciBXUklURSBzZXRQYWxldHRlQmFja2dyb3VuZENvbG9yIFJFU0VUIHVuc2V0UGFsZXR0ZSApCiAgICBRX1BST1BFUlRZKCBRUGl4bWFwIHBhbGV0dGVCYWNrZ3JvdW5kUGl4bWFwIFJFQUQgcGFsZXR0ZUJhY2tncm91bmRQaXhtYXAgV1JJVEUgc2V0UGFsZXR0ZUJhY2tncm91bmRQaXhtYXAgUkVTRVQgdW5zZXRQYWxldHRlICkKICAgIFFfUFJPUEVSVFkoIFFCcnVzaCBiYWNrZ3JvdW5kQnJ1c2ggUkVBRCBiYWNrZ3JvdW5kQnJ1c2ggKQogICAgUV9QUk9QRVJUWSggUUNvbG9yR3JvdXAgY29sb3JHcm91cCBSRUFEIGNvbG9yR3JvdXAgKQogICAgUV9QUk9QRVJUWSggUVBhbGV0dGUgcGFsZXR0ZSBSRUFEIHBhbGV0dGUgV1JJVEUgc2V0UGFsZXR0ZSBSRVNFVCB1bnNldFBhbGV0dGUgIFNUT1JFRCBvd25QYWxldHRlICkKICAgIFFfUFJPUEVSVFkoIEJhY2tncm91bmRPcmlnaW4gYmFja2dyb3VuZE9yaWdpbiBSRUFEIGJhY2tncm91bmRPcmlnaW4gV1JJVEUgc2V0QmFja2dyb3VuZE9yaWdpbiApCiAgICBRX1BST1BFUlRZKCBib29sIG93blBhbGV0dGUgUkVBRCBvd25QYWxldHRlICkKICAgIFFfUFJPUEVSVFkoIFFGb250IGZvbnQgUkVBRCBmb250IFdSSVRFIHNldEZvbnQgUkVTRVQgdW5zZXRGb250IFNUT1JFRCBvd25Gb250ICkKICAgIFFfUFJPUEVSVFkoIGJvb2wgb3duRm9udCBSRUFEIG93bkZvbnQgKQojaWZuZGVmIFFUX05PX0NVUlNPUgogICAgUV9QUk9QRVJUWSggUUN1cnNvciBjdXJzb3IgUkVBRCBjdXJzb3IgV1JJVEUgc2V0Q3Vyc29yIFJFU0VUIHVuc2V0Q3Vyc29yIFNUT1JFRCBvd25DdXJzb3IgKQogICAgUV9QUk9QRVJUWSggYm9vbCBvd25DdXJzb3IgUkVBRCBvd25DdXJzb3IgKQojZW5kaWYKI2lmbmRlZiBRVF9OT19XSURHRVRfVE9QRVhUUkEKICAgIFFfUFJPUEVSVFkoIFFTdHJpbmcgY2FwdGlvbiBSRUFEIGNhcHRpb24gV1JJVEUgc2V0Q2FwdGlvbiApCiAgICBRX1BST1BFUlRZKCBRUGl4bWFwIGljb24gUkVBRCBpY29uIFdSSVRFIHNldEljb24gKQogICAgUV9QUk9QRVJUWSggUVN0cmluZyBpY29uVGV4dCBSRUFEIGljb25UZXh0IFdSSVRFIHNldEljb25UZXh0ICkKI2VuZGlmCiAgICBRX1BST1BFUlRZKCBib29sIG1vdXNlVHJhY2tpbmcgUkVBRCBoYXNNb3VzZVRyYWNraW5nIFdSSVRFIHNldE1vdXNlVHJhY2tpbmcgKQogICAgUV9QUk9QRVJUWSggYm9vbCB1bmRlck1vdXNlIFJFQUQgaGFzTW91c2UgKQogICAgUV9QUk9QRVJUWSggYm9vbCBpc0FjdGl2ZVdpbmRvdyBSRUFEIGlzQWN0aXZlV2luZG93ICkKICAgIFFfUFJPUEVSVFkoIGJvb2wgZm9jdXNFbmFibGVkIFJFQUQgaXNGb2N1c0VuYWJsZWQgKQogICAgUV9QUk9QRVJUWSggRm9jdXNQb2xpY3kgZm9jdXNQb2xpY3kgUkVBRCBmb2N1c1BvbGljeSBXUklURSBzZXRGb2N1c1BvbGljeSApCiAgICBRX1BST1BFUlRZKCBib29sIGZvY3VzIFJFQUQgaGFzRm9jdXMgKQogICAgUV9QUk9QRVJUWSggYm9vbCB1cGRhdGVzRW5hYmxlZCBSRUFEIGlzVXBkYXRlc0VuYWJsZWQgV1JJVEUgc2V0VXBkYXRlc0VuYWJsZWQgREVTSUdOQUJMRSBmYWxzZSApCiAgICBRX1BST1BFUlRZKCBib29sIHZpc2libGUgUkVBRCBpc1Zpc2libGUgKQogICAgUV9QUk9QRVJUWSggUVJlY3QgdmlzaWJsZVJlY3QgUkVBRCB2aXNpYmxlUmVjdCApIC8vIG9ic29sZXRlCiAgICBRX1BST1BFUlRZKCBib29sIGhpZGRlbiBSRUFEIGlzSGlkZGVuIFdSSVRFIHNldEhpZGRlbiBERVNJR05BQkxFIGZhbHNlIFNDUklQVEFCTEUgZmFsc2UgKQogICAgUV9QUk9QRVJUWSggYm9vbCBzaG93biBSRUFEIGlzU2hvd24gV1JJVEUgc2V0U2hvd24gREVTSUdOQUJMRSBmYWxzZSBTQ1JJUFRBQkxFIGZhbHNlICkKICAgIFFfUFJPUEVSVFkoIGJvb2wgbWluaW1pemVkIFJFQUQgaXNNaW5pbWl6ZWQgKQogICAgUV9QUk9QRVJUWSggYm9vbCBtYXhpbWl6ZWQgUkVBRCBpc01heGltaXplZCApCiAgICBRX1BST1BFUlRZKCBib29sIGZ1bGxTY3JlZW4gUkVBRCBpc0Z1bGxTY3JlZW4gKQogICAgUV9QUk9QRVJUWSggUVNpemUgc2l6ZUhpbnQgUkVBRCBzaXplSGludCApCiAgICBRX1BST1BFUlRZKCBRU2l6ZSBtaW5pbXVtU2l6ZUhpbnQgUkVBRCBtaW5pbXVtU2l6ZUhpbnQgKQogICAgUV9QUk9QRVJUWSggUVJlY3QgbWljcm9Gb2N1c0hpbnQgUkVBRCBtaWNyb0ZvY3VzSGludCApCiAgICBRX1BST1BFUlRZKCBib29sIGFjY2VwdERyb3BzIFJFQUQgYWNjZXB0RHJvcHMgV1JJVEUgc2V0QWNjZXB0RHJvcHMgKQogICAgUV9QUk9QRVJUWSggYm9vbCBhdXRvTWFzayBSRUFEIGF1dG9NYXNrIFdSSVRFIHNldEF1dG9NYXNrIERFU0lHTkFCTEUgZmFsc2UgU0NSSVBUQUJMRSBmYWxzZSApCiAgICBRX1BST1BFUlRZKCBib29sIGN1c3RvbVdoYXRzVGhpcyBSRUFEIGN1c3RvbVdoYXRzVGhpcyApCiAgICBRX1BST1BFUlRZKCBib29sIGlucHV0TWV0aG9kRW5hYmxlZCBSRUFEIGlzSW5wdXRNZXRob2RFbmFibGVkIFdSSVRFIHNldElucHV0TWV0aG9kRW5hYmxlZCBERVNJR05BQkxFIGZhbHNlIFNDUklQVEFCTEUgZmFsc2UgKQogICAgUV9QUk9QRVJUWSggZG91YmxlIHdpbmRvd09wYWNpdHkgUkVBRCB3aW5kb3dPcGFjaXR5IFdSSVRFIHNldFdpbmRvd09wYWNpdHkgREVTSUdOQUJMRSBmYWxzZSApCgpwdWJsaWM6CiAgICBRX0VYUExJQ0lUIFFXaWRnZXQoIFFXaWRnZXQqIHBhcmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAsIFdGbGFncyBmPTAgKTsKICAgIH5RV2lkZ2V0KCk7CgogICAgV0lkCQkgd2luSWQoKSBjb25zdDsKICAgIHZvaWQJIHNldE5hbWUoIGNvbnN0IGNoYXIgKm5hbWUgKTsKI2lmbmRlZiBRVF9OT19TVFlMRQogICAgLy8gR1VJIHN0eWxlIHNldHRpbmcKCiAgICBRU3R5bGUgICAgICZzdHlsZSgpIGNvbnN0OwogICAgdm9pZCAgICAgICAgc2V0U3R5bGUoIFFTdHlsZSAqICk7CiAgICBRU3R5bGUqCXNldFN0eWxlKCBjb25zdCBRU3RyaW5nJiApOwojZW5kaWYKICAgIC8vIFdpZGdldCB0eXBlcyBhbmQgc3RhdGVzCgogICAgYm9vbAkgaXNUb3BMZXZlbCgpCWNvbnN0OwogICAgYm9vbAkgaXNEaWFsb2coKQljb25zdDsKICAgIGJvb2wJIGlzUG9wdXAoKQljb25zdDsKICAgIGJvb2wJIGlzRGVza3RvcCgpCWNvbnN0OwogICAgYm9vbAkgaXNNb2RhbCgpCWNvbnN0OwoKICAgIGJvb2wJIGlzRW5hYmxlZCgpCWNvbnN0OwogICAgYm9vbAkgaXNFbmFibGVkVG8oUVdpZGdldCopIGNvbnN0OwogICAgYm9vbAkgaXNFbmFibGVkVG9UTFcoKSBjb25zdDsKCnB1YmxpYyBzbG90czoKICAgIHZpcnR1YWwgdm9pZCBzZXRFbmFibGVkKCBib29sICk7CiAgICB2b2lkIHNldERpc2FibGVkKCBib29sICk7CgogICAgLy8gV2lkZ2V0IGNvb3JkaW5hdGVzCgpwdWJsaWM6CiAgICBRUmVjdAkgZnJhbWVHZW9tZXRyeSgpIGNvbnN0OwogICAgY29uc3QgUVJlY3QgJmdlb21ldHJ5KCkJY29uc3Q7CiAgICBpbnQJCSB4KCkJCWNvbnN0OwogICAgaW50CQkgeSgpCQljb25zdDsKICAgIFFQb2ludAkgcG9zKCkJCWNvbnN0OwogICAgUVNpemUJIGZyYW1lU2l6ZSgpICAgIGNvbnN0OwogICAgUVNpemUJIHNpemUoKQkJY29uc3Q7CiAgICBpbnQJCSB3aWR0aCgpCWNvbnN0OwogICAgaW50CQkgaGVpZ2h0KCkJY29uc3Q7CiAgICBRUmVjdAkgcmVjdCgpCQljb25zdDsKICAgIFFSZWN0CSBjaGlsZHJlblJlY3QoKSBjb25zdDsKICAgIFFSZWdpb24JIGNoaWxkcmVuUmVnaW9uKCkgY29uc3Q7CgogICAgUVNpemUJIG1pbmltdW1TaXplKCkJIGNvbnN0OwogICAgUVNpemUJIG1heGltdW1TaXplKCkJIGNvbnN0OwogICAgaW50CQkgbWluaW11bVdpZHRoKCkJIGNvbnN0OwogICAgaW50CQkgbWluaW11bUhlaWdodCgpIGNvbnN0OwogICAgaW50CQkgbWF4aW11bVdpZHRoKCkJIGNvbnN0OwogICAgaW50CQkgbWF4aW11bUhlaWdodCgpIGNvbnN0OwogICAgdm9pZAkgc2V0TWluaW11bVNpemUoIGNvbnN0IFFTaXplICYgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRNaW5pbXVtU2l6ZSggaW50IG1pbncsIGludCBtaW5oICk7CiAgICB2b2lkCSBzZXRNYXhpbXVtU2l6ZSggY29uc3QgUVNpemUgJiApOwogICAgdmlydHVhbCB2b2lkIHNldE1heGltdW1TaXplKCBpbnQgbWF4dywgaW50IG1heGggKTsKICAgIHZvaWQJIHNldE1pbmltdW1XaWR0aCggaW50IG1pbncgKTsKICAgIHZvaWQJIHNldE1pbmltdW1IZWlnaHQoIGludCBtaW5oICk7CiAgICB2b2lkCSBzZXRNYXhpbXVtV2lkdGgoIGludCBtYXh3ICk7CiAgICB2b2lkCSBzZXRNYXhpbXVtSGVpZ2h0KCBpbnQgbWF4aCApOwoKICAgIFFTaXplCSBzaXplSW5jcmVtZW50KCkgY29uc3Q7CiAgICB2b2lkCSBzZXRTaXplSW5jcmVtZW50KCBjb25zdCBRU2l6ZSAmICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0U2l6ZUluY3JlbWVudCggaW50IHcsIGludCBoICk7CiAgICBRU2l6ZQkgYmFzZVNpemUoKSBjb25zdDsKICAgIHZvaWQJIHNldEJhc2VTaXplKCBjb25zdCBRU2l6ZSAmICk7CiAgICB2b2lkCSBzZXRCYXNlU2l6ZSggaW50IGJhc2V3LCBpbnQgYmFzZWggKTsKCiAgICB2b2lkCXNldEZpeGVkU2l6ZSggY29uc3QgUVNpemUgJiApOwogICAgdm9pZAlzZXRGaXhlZFNpemUoIGludCB3LCBpbnQgaCApOwogICAgdm9pZAlzZXRGaXhlZFdpZHRoKCBpbnQgdyApOwogICAgdm9pZAlzZXRGaXhlZEhlaWdodCggaW50IGggKTsKCiAgICAvLyBXaWRnZXQgY29vcmRpbmF0ZSBtYXBwaW5nCgogICAgUVBvaW50CSBtYXBUb0dsb2JhbCggY29uc3QgUVBvaW50ICYgKQkgY29uc3Q7CiAgICBRUG9pbnQJIG1hcEZyb21HbG9iYWwoIGNvbnN0IFFQb2ludCAmICkgY29uc3Q7CiAgICBRUG9pbnQJIG1hcFRvUGFyZW50KCBjb25zdCBRUG9pbnQgJiApCSBjb25zdDsKICAgIFFQb2ludAkgbWFwRnJvbVBhcmVudCggY29uc3QgUVBvaW50ICYgKSBjb25zdDsKICAgIFFQb2ludAkgbWFwVG8oIFFXaWRnZXQgKiwgY29uc3QgUVBvaW50ICYgKSBjb25zdDsKICAgIFFQb2ludAkgbWFwRnJvbSggUVdpZGdldCAqLCBjb25zdCBRUG9pbnQgJiApIGNvbnN0OwoKICAgIFFXaWRnZXQJKnRvcExldmVsV2lkZ2V0KCkgICBjb25zdDsKCiAgICAvLyBXaWRnZXQgYXR0cmlidXRlIGZ1bmN0aW9ucwoKICAgIEJhY2tncm91bmRNb2RlCWJhY2tncm91bmRNb2RlKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQJc2V0QmFja2dyb3VuZE1vZGUoIEJhY2tncm91bmRNb2RlICk7CiAgICB2b2lkIAkJc2V0QmFja2dyb3VuZE1vZGUoIEJhY2tncm91bmRNb2RlLCBCYWNrZ3JvdW5kTW9kZSApOwoKICAgIGNvbnN0IFFDb2xvciAmCWZvcmVncm91bmRDb2xvcigpIGNvbnN0OwoKICAgIGNvbnN0IFFDb2xvciAmCWVyYXNlQ29sb3IoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZAlzZXRFcmFzZUNvbG9yKCBjb25zdCBRQ29sb3IgJiApOwoKICAgIGNvbnN0IFFQaXhtYXAgKgllcmFzZVBpeG1hcCgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkCXNldEVyYXNlUGl4bWFwKCBjb25zdCBRUGl4bWFwICYgKTsKCiNpZm5kZWYgUVRfTk9fUEFMRVRURQogICAgY29uc3QgUUNvbG9yR3JvdXAgJiBjb2xvckdyb3VwKCkgY29uc3Q7CiAgICBjb25zdCBRUGFsZXR0ZSAmCXBhbGV0dGUoKSAgICBjb25zdDsKICAgIGJvb2wJCW93blBhbGV0dGUoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZAlzZXRQYWxldHRlKCBjb25zdCBRUGFsZXR0ZSAmICk7CiAgICB2b2lkCQl1bnNldFBhbGV0dGUoKTsKI2VuZGlmCgogICAgY29uc3QgUUNvbG9yICYJcGFsZXR0ZUZvcmVncm91bmRDb2xvcigpIGNvbnN0OwogICAgdm9pZAkJc2V0UGFsZXR0ZUZvcmVncm91bmRDb2xvciggY29uc3QgUUNvbG9yICYgKTsKCiAgICBjb25zdCBRQ29sb3IgJglwYWxldHRlQmFja2dyb3VuZENvbG9yKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQJc2V0UGFsZXR0ZUJhY2tncm91bmRDb2xvciggY29uc3QgUUNvbG9yICYgKTsKCiAgICBjb25zdCBRUGl4bWFwICoJcGFsZXR0ZUJhY2tncm91bmRQaXhtYXAoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCAJc2V0UGFsZXR0ZUJhY2tncm91bmRQaXhtYXAoIGNvbnN0IFFQaXhtYXAgJiApOwoKICAgIGNvbnN0IFFCcnVzaCYJYmFja2dyb3VuZEJydXNoKCkgY29uc3Q7CgogICAgUUZvbnQJCWZvbnQoKSBjb25zdDsKICAgIGJvb2wJCW93bkZvbnQoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZAlzZXRGb250KCBjb25zdCBRRm9udCAmICk7CiAgICB2b2lkCQl1bnNldEZvbnQoKTsKICAgIFFGb250TWV0cmljcwlmb250TWV0cmljcygpIGNvbnN0OwogICAgUUZvbnRJbmZvCSAJZm9udEluZm8oKSBjb25zdDsKCiNpZm5kZWYgUVRfTk9fQ1VSU09SCiAgICBjb25zdCBRQ3Vyc29yICAgICAgJmN1cnNvcigpIGNvbnN0OwogICAgYm9vbAkJb3duQ3Vyc29yKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQJc2V0Q3Vyc29yKCBjb25zdCBRQ3Vyc29yICYgKTsKICAgIHZpcnR1YWwgdm9pZAl1bnNldEN1cnNvcigpOwojZW5kaWYKI2lmbmRlZiBRVF9OT19XSURHRVRfVE9QRVhUUkEKICAgIFFTdHJpbmcJCWNhcHRpb24oKSBjb25zdDsKICAgIGNvbnN0IFFQaXhtYXAgICAgICAqaWNvbigpIGNvbnN0OwogICAgUVN0cmluZwkJaWNvblRleHQoKSBjb25zdDsKI2VuZGlmCiAgICBib29sCQloYXNNb3VzZVRyYWNraW5nKCkgY29uc3Q7CiAgICBib29sCQloYXNNb3VzZSgpIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZAlzZXRNYXNrKCBjb25zdCBRQml0bWFwICYgKTsKICAgIHZpcnR1YWwgdm9pZAlzZXRNYXNrKCBjb25zdCBRUmVnaW9uICYgKTsKICAgIHZvaWQJCWNsZWFyTWFzaygpOwoKICAgIGNvbnN0IFFDb2xvciAmCWJhY2tncm91bmRDb2xvcigpIGNvbnN0OyAvLyBvYnNvbGV0ZSwgdXNlIGVyYXNlQ29sb3IoKQogICAgdmlydHVhbCB2b2lkCXNldEJhY2tncm91bmRDb2xvciggY29uc3QgUUNvbG9yICYgKTsgLy8gb2Jzb2xldGUsIHVzZSBzZXRFcmFzZUNvbG9yKCkKICAgIGNvbnN0IFFQaXhtYXAgKgliYWNrZ3JvdW5kUGl4bWFwKCkgY29uc3Q7IC8vIG9ic29sZXRlLCB1c2UgZXJhc2VQaXhtYXAoKQogICAgdmlydHVhbCB2b2lkCXNldEJhY2tncm91bmRQaXhtYXAoIGNvbnN0IFFQaXhtYXAgJiApOyAvLyBvYnNvbGV0ZSwgdXNlIHNldEVyYXNlUGl4bWFwKCkKCnB1YmxpYyBzbG90czoKI2lmbmRlZiBRVF9OT19XSURHRVRfVE9QRVhUUkEKICAgIHZpcnR1YWwgdm9pZAlzZXRDYXB0aW9uKCBjb25zdCBRU3RyaW5nICYpOwogICAgdmlydHVhbCB2b2lkCXNldEljb24oIGNvbnN0IFFQaXhtYXAgJiApOwogICAgdmlydHVhbCB2b2lkCXNldEljb25UZXh0KCBjb25zdCBRU3RyaW5nICYpOwojZW5kaWYKICAgIHZpcnR1YWwgdm9pZAlzZXRNb3VzZVRyYWNraW5nKCBib29sIGVuYWJsZSApOwoKICAgIC8vIEtleWJvYXJkIGlucHV0IGZvY3VzIGZ1bmN0aW9ucwoKICAgIHZpcnR1YWwgdm9pZAlzZXRGb2N1cygpOwogICAgdm9pZAkJY2xlYXJGb2N1cygpOwoKcHVibGljOgogICAgZW51bSBGb2N1c1BvbGljeSB7CglOb0ZvY3VzID0gMCwKCVRhYkZvY3VzID0gMHgxLAoJQ2xpY2tGb2N1cyA9IDB4MiwKCVN0cm9uZ0ZvY3VzID0gVGFiRm9jdXMgfCBDbGlja0ZvY3VzIHwgMHg4LAoJV2hlZWxGb2N1cyA9IFN0cm9uZ0ZvY3VzIHwgMHg0CiAgICB9OwoKICAgIGJvb2wJCWlzQWN0aXZlV2luZG93KCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQJc2V0QWN0aXZlV2luZG93KCk7CiAgICBib29sCQlpc0ZvY3VzRW5hYmxlZCgpIGNvbnN0OwoKICAgIEZvY3VzUG9saWN5CQlmb2N1c1BvbGljeSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkCXNldEZvY3VzUG9saWN5KCBGb2N1c1BvbGljeSApOwogICAgYm9vbAkJaGFzRm9jdXMoKSBjb25zdDsKICAgIHN0YXRpYyB2b2lkCQlzZXRUYWJPcmRlciggUVdpZGdldCAqLCBRV2lkZ2V0ICogKTsKICAgIHZpcnR1YWwgdm9pZAlzZXRGb2N1c1Byb3h5KCBRV2lkZ2V0ICogKTsKICAgIFFXaWRnZXQgKgkJZm9jdXNQcm94eSgpIGNvbnN0OwoKICAgIHZvaWQgc2V0SW5wdXRNZXRob2RFbmFibGVkKCBib29sIGIgKTsKICAgIGJvb2wgaXNJbnB1dE1ldGhvZEVuYWJsZWQoKSBjb25zdDsKICAgIC8vIEdyYWIgZnVuY3Rpb25zCgogICAgdm9pZAkJZ3JhYk1vdXNlKCk7CiNpZm5kZWYgUVRfTk9fQ1VSU09SCiAgICB2b2lkCQlncmFiTW91c2UoIGNvbnN0IFFDdXJzb3IgJiApOwojZW5kaWYKICAgIHZvaWQJCXJlbGVhc2VNb3VzZSgpOwogICAgdm9pZAkJZ3JhYktleWJvYXJkKCk7CiAgICB2b2lkCQlyZWxlYXNlS2V5Ym9hcmQoKTsKICAgIHN0YXRpYyBRV2lkZ2V0ICoJbW91c2VHcmFiYmVyKCk7CiAgICBzdGF0aWMgUVdpZGdldCAqCWtleWJvYXJkR3JhYmJlcigpOwoKICAgIC8vIFVwZGF0ZS9yZWZyZXNoIGZ1bmN0aW9ucwoKICAgIGJvb2wJIAlpc1VwZGF0ZXNFbmFibGVkKCkgY29uc3Q7CgojaWYgMCAvL2RlZiBRX1dTX1FXUwogICAgdm9pZAkJcmVwYWludFVuY2xpcHBlZCggY29uc3QgUVJlZ2lvbiAmLCBib29sIGVyYXNlID0gVFJVRSApOwojZW5kaWYKcHVibGljIHNsb3RzOgogICAgdmlydHVhbCB2b2lkCXNldFVwZGF0ZXNFbmFibGVkKCBib29sIGVuYWJsZSApOwogICAgdm9pZAkJdXBkYXRlKCk7CiAgICB2b2lkCQl1cGRhdGUoIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoICk7CiAgICB2b2lkCQl1cGRhdGUoIGNvbnN0IFFSZWN0JiApOwogICAgdm9pZAkJcmVwYWludCgpOwogICAgdm9pZAkJcmVwYWludCggYm9vbCBlcmFzZSApOwogICAgdm9pZAkJcmVwYWludCggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGJvb2wgZXJhc2U9VFJVRSApOwogICAgdm9pZAkJcmVwYWludCggY29uc3QgUVJlY3QgJiwgYm9vbCBlcmFzZSA9IFRSVUUgKTsKICAgIHZvaWQJCXJlcGFpbnQoIGNvbnN0IFFSZWdpb24gJiwgYm9vbCBlcmFzZSA9IFRSVUUgKTsKCiAgICAvLyBXaWRnZXQgbWFuYWdlbWVudCBmdW5jdGlvbnMKCiAgICB2aXJ0dWFsIHZvaWQJc2hvdygpOwogICAgdmlydHVhbCB2b2lkCWhpZGUoKTsKICAgIHZvaWQJCXNldFNob3duKCBib29sIHNob3cgKTsKICAgIHZvaWQJCXNldEhpZGRlbiggYm9vbCBoaWRlICk7CiNpZm5kZWYgUVRfTk9fQ09NUEFUCiAgICB2b2lkCQlpY29uaWZ5KCkgeyBzaG93TWluaW1pemVkKCk7IH0KI2VuZGlmCiAgICB2aXJ0dWFsIHZvaWQJc2hvd01pbmltaXplZCgpOwogICAgdmlydHVhbCB2b2lkCXNob3dNYXhpbWl6ZWQoKTsKICAgIHZvaWQJCXNob3dGdWxsU2NyZWVuKCk7CiAgICB2aXJ0dWFsIHZvaWQJc2hvd05vcm1hbCgpOwogICAgdmlydHVhbCB2b2lkCXBvbGlzaCgpOwogICAgdm9pZCAJCWNvbnN0UG9saXNoKCkgY29uc3Q7CiAgICBib29sCQljbG9zZSgpOwoKICAgIHZvaWQJCXJhaXNlKCk7CiAgICB2b2lkCQlsb3dlcigpOwogICAgdm9pZAkJc3RhY2tVbmRlciggUVdpZGdldCogKTsKICAgIHZpcnR1YWwgdm9pZAltb3ZlKCBpbnQgeCwgaW50IHkgKTsKICAgIHZvaWQJCW1vdmUoIGNvbnN0IFFQb2ludCAmICk7CiAgICB2aXJ0dWFsIHZvaWQJcmVzaXplKCBpbnQgdywgaW50IGggKTsKICAgIHZvaWQJCXJlc2l6ZSggY29uc3QgUVNpemUgJiApOwogICAgdmlydHVhbCB2b2lkCXNldEdlb21ldHJ5KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCApOwogICAgdmlydHVhbCB2b2lkCXNldEdlb21ldHJ5KCBjb25zdCBRUmVjdCAmICk7IC8vICMjIyBtYWtlIG5vbiB2aXJ0dWFsIGluIFF0IDQ/CgpwdWJsaWM6CiAgICB2aXJ0dWFsIGJvb2wJY2xvc2UoIGJvb2wgYWxzb0RlbGV0ZSApOwogICAgYm9vbAkJaXNWaXNpYmxlKCkJY29uc3Q7CiAgICBib29sCQlpc1Zpc2libGVUbyhRV2lkZ2V0KikgY29uc3Q7CiAgICBib29sCQlpc1Zpc2libGVUb1RMVygpIGNvbnN0OyAvLyBvYnNvbGV0ZQogICAgUVJlY3QJCXZpc2libGVSZWN0KCkgY29uc3Q7IC8vIG9ic29sZXRlCiAgICBib29sIAkJaXNIaWRkZW4oKSBjb25zdDsKICAgIGJvb2wgCQlpc1Nob3duKCkgY29uc3Q7CiAgICBib29sCQlpc01pbmltaXplZCgpIGNvbnN0OwogICAgYm9vbAkJaXNNYXhpbWl6ZWQoKSBjb25zdDsKICAgIGJvb2wJCWlzRnVsbFNjcmVlbigpIGNvbnN0OwoKICAgIHVpbnQgd2luZG93U3RhdGUoKSBjb25zdDsKICAgIHZvaWQgc2V0V2luZG93U3RhdGUodWludCB3aW5kb3dTdGF0ZSk7CgogICAgdmlydHVhbCBRU2l6ZQlzaXplSGludCgpIGNvbnN0OwogICAgdmlydHVhbCBRU2l6ZQltaW5pbXVtU2l6ZUhpbnQoKSBjb25zdDsKICAgIHZpcnR1YWwgUVNpemVQb2xpY3kJc2l6ZVBvbGljeSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkCXNldFNpemVQb2xpY3koIFFTaXplUG9saWN5ICk7CiAgICB2b2lkIAkJc2V0U2l6ZVBvbGljeSggUVNpemVQb2xpY3k6OlNpemVUeXBlIGhvciwgUVNpemVQb2xpY3k6OlNpemVUeXBlIHZlciwgYm9vbCBoZncgPSBGQUxTRSApOwogICAgdmlydHVhbCBpbnQgaGVpZ2h0Rm9yV2lkdGgoaW50KSBjb25zdDsKCiAgICBRUmVnaW9uCWNsaXBSZWdpb24oKSBjb25zdDsKCi8vICMjIyBtb3ZlIHRvZ2V0aGVyIHdpdGggb3RoZXIgc2xvdHMgaW4gUXQgNC4wCnB1YmxpYyBzbG90czoKICAgIHZpcnR1YWwgdm9pZCAgCWFkanVzdFNpemUoKTsKCnB1YmxpYzoKI2lmbmRlZiBRVF9OT19MQVlPVVQKICAgIFFMYXlvdXQgKgkJbGF5b3V0KCkgY29uc3QgeyByZXR1cm4gbGF5X291dDsgfQojZW5kaWYKICAgIHZvaWQJCXVwZGF0ZUdlb21ldHJ5KCk7CiAgICB2aXJ0dWFsIHZvaWQgCXJlcGFyZW50KCBRV2lkZ2V0ICpwYXJlbnQsIFdGbGFncywgY29uc3QgUVBvaW50ICYsCgkJCQkgIGJvb2wgc2hvd0l0PUZBTFNFICk7CiAgICB2b2lkCQlyZXBhcmVudCggUVdpZGdldCAqcGFyZW50LCBjb25zdCBRUG9pbnQgJiwKCQkJCSAgYm9vbCBzaG93SXQ9RkFMU0UgKTsKI2lmbmRlZiBRVF9OT19DT01QQVQKICAgIHZvaWQJCXJlY3JlYXRlKCBRV2lkZ2V0ICpwYXJlbnQsIFdGbGFncyBmLCBjb25zdCBRUG9pbnQgJiBwLAoJCQkJICBib29sIHNob3dJdD1GQUxTRSApIHsgcmVwYXJlbnQocGFyZW50LGYscCxzaG93SXQpOyB9CiNlbmRpZgoKICAgIHZvaWQJCWVyYXNlKCk7CiAgICB2b2lkCQllcmFzZSggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGggKTsKICAgIHZvaWQJCWVyYXNlKCBjb25zdCBRUmVjdCAmICk7CiAgICB2b2lkCQllcmFzZSggY29uc3QgUVJlZ2lvbiAmICk7CiAgICB2b2lkCQlzY3JvbGwoIGludCBkeCwgaW50IGR5ICk7CiAgICB2b2lkCQlzY3JvbGwoIGludCBkeCwgaW50IGR5LCBjb25zdCBRUmVjdCYgKTsKCiAgICB2b2lkCQlkcmF3VGV4dCggaW50IHgsIGludCB5LCBjb25zdCBRU3RyaW5nICYpOwogICAgdm9pZAkJZHJhd1RleHQoIGNvbnN0IFFQb2ludCAmLCBjb25zdCBRU3RyaW5nICYpOwoKICAgIC8vIE1pc2MuIGZ1bmN0aW9ucwoKICAgIFFXaWRnZXQgKgkJZm9jdXNXaWRnZXQoKSBjb25zdDsKICAgIFFSZWN0ICAgICAgICAgICAgICAgbWljcm9Gb2N1c0hpbnQoKSBjb25zdDsKCiAgICAvLyBkcmFnIGFuZCBkcm9wCgogICAgYm9vbAkJYWNjZXB0RHJvcHMoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZAlzZXRBY2NlcHREcm9wcyggYm9vbCBvbiApOwoKICAgIC8vIHRyYW5zcGFyZW5jeSBhbmQgcHNldWRvIHRyYW5zcGFyZW5jeQoKICAgIHZpcnR1YWwgdm9pZAlzZXRBdXRvTWFzayhib29sKTsKICAgIGJvb2wJCWF1dG9NYXNrKCkgY29uc3Q7CgogICAgZW51bSBCYWNrZ3JvdW5kT3JpZ2luIHsgV2lkZ2V0T3JpZ2luLCBQYXJlbnRPcmlnaW4sIFdpbmRvd09yaWdpbiwgQW5jZXN0b3JPcmlnaW4gfTsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0QmFja2dyb3VuZE9yaWdpbiggQmFja2dyb3VuZE9yaWdpbiApOwogICAgQmFja2dyb3VuZE9yaWdpbiBiYWNrZ3JvdW5kT3JpZ2luKCkgY29uc3Q7CiAgICBRUG9pbnQgYmFja2dyb3VuZE9mZnNldCgpIGNvbnN0OwoKICAgIC8vIHdoYXRzIHRoaXMgaGVscAogICAgdmlydHVhbCBib29sIGN1c3RvbVdoYXRzVGhpcygpIGNvbnN0OwoKICAgIFFXaWRnZXQgKgkJcGFyZW50V2lkZ2V0KCBib29sIHNhbWVXaW5kb3cgPSBGQUxTRSApIGNvbnN0OwogICAgV1N0YXRlCQl0ZXN0V1N0YXRlKCBXU3RhdGUgcyApIGNvbnN0OwogICAgV0ZsYWdzCQl0ZXN0V0ZsYWdzKCBXRmxhZ3MgZiApIGNvbnN0OwogICAgc3RhdGljIFFXaWRnZXQgKglmaW5kKCBXSWQgKTsKICAgIHN0YXRpYyBRV2lkZ2V0TWFwcGVyICp3bWFwcGVyKCk7CgogICAgUVdpZGdldCAgKmNoaWxkQXQoIGludCB4LCBpbnQgeSwgYm9vbCBpbmNsdWRlVGhpcyA9IEZBTFNFICkgY29uc3Q7CiAgICBRV2lkZ2V0ICAqY2hpbGRBdCggY29uc3QgUVBvaW50ICYsIGJvb2wgaW5jbHVkZVRoaXMgPSBGQUxTRSApIGNvbnN0OwoKI2lmIGRlZmluZWQoUV9XU19RV1MpCiAgICB2aXJ0dWFsIFFHZnggKiBncmFwaGljc0NvbnRleHQoYm9vbCBjbGlwX2NoaWxkcmVuPVRSVUUpIGNvbnN0OwojZW5kaWYKI2lmIGRlZmluZWQoUV9XU19NQUMpCiAgICBRUmVnaW9uIGNsaXBwZWRSZWdpb24oYm9vbCBkb19jaGlsZHJlbj1UUlVFKTsKICAgIHVpbnQgY2xpcHBlZFNlcmlhbChib29sIGRvX2NoaWxkcmVuPVRSVUUpOwojaWZuZGVmIFFNQUNfTk9fUVVBUlRaCiAgICBDR0NvbnRleHRSZWYgbWFjQ0dDb250ZXh0KGJvb2wgY2xpcHBlZD1UUlVFKSBjb25zdDsKI2VuZGlmCiNlbmRpZgoKICAgIHZvaWQgc2V0V2luZG93T3BhY2l0eShkb3VibGUgbGV2ZWwpOwogICAgZG91YmxlIHdpbmRvd09wYWNpdHkoKSBjb25zdDsKCnByb3RlY3RlZDoKICAgIC8vIEV2ZW50IGhhbmRsZXJzCiAgICBib29sCSBldmVudCggUUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBtb3VzZVByZXNzRXZlbnQoIFFNb3VzZUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBtb3VzZVJlbGVhc2VFdmVudCggUU1vdXNlRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIG1vdXNlRG91YmxlQ2xpY2tFdmVudCggUU1vdXNlRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIG1vdXNlTW92ZUV2ZW50KCBRTW91c2VFdmVudCAqICk7CiNpZm5kZWYgUVRfTk9fV0hFRUxFVkVOVAogICAgdmlydHVhbCB2b2lkIHdoZWVsRXZlbnQoIFFXaGVlbEV2ZW50ICogKTsKI2VuZGlmCiAgICB2aXJ0dWFsIHZvaWQga2V5UHJlc3NFdmVudCggUUtleUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBrZXlSZWxlYXNlRXZlbnQoIFFLZXlFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgZm9jdXNJbkV2ZW50KCBRRm9jdXNFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgZm9jdXNPdXRFdmVudCggUUZvY3VzRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIGVudGVyRXZlbnQoIFFFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgbGVhdmVFdmVudCggUUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBwYWludEV2ZW50KCBRUGFpbnRFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgbW92ZUV2ZW50KCBRTW92ZUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCByZXNpemVFdmVudCggUVJlc2l6ZUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBjbG9zZUV2ZW50KCBRQ2xvc2VFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgY29udGV4dE1lbnVFdmVudCggUUNvbnRleHRNZW51RXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIGltU3RhcnRFdmVudCggUUlNRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIGltQ29tcG9zZUV2ZW50KCBRSU1FdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgaW1FbmRFdmVudCggUUlNRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIHRhYmxldEV2ZW50KCBRVGFibGV0RXZlbnQgKiApOwoKI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAogICAgdmlydHVhbCB2b2lkIGRyYWdFbnRlckV2ZW50KCBRRHJhZ0VudGVyRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIGRyYWdNb3ZlRXZlbnQoIFFEcmFnTW92ZUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBkcmFnTGVhdmVFdmVudCggUURyYWdMZWF2ZUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBkcm9wRXZlbnQoIFFEcm9wRXZlbnQgKiApOwojZW5kaWYKCiAgICB2aXJ0dWFsIHZvaWQgc2hvd0V2ZW50KCBRU2hvd0V2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBoaWRlRXZlbnQoIFFIaWRlRXZlbnQgKiApOwoKI2lmIGRlZmluZWQoUV9XU19NQUMpCiAgICB2aXJ0dWFsIGJvb2wgbWFjRXZlbnQoIE1TRyAqICk7CiNlbmRpZgojaWYgZGVmaW5lZChRX1dTX1dJTikKICAgIHZpcnR1YWwgYm9vbCB3aW5FdmVudCggTVNHICogKTsKI2VuZGlmCiNpZiBkZWZpbmVkKFFfV1NfWDExKQogICAgdmlydHVhbCBib29sIHgxMUV2ZW50KCBYRXZlbnQgKiApOwojZW5kaWYKI2lmIGRlZmluZWQoUV9XU19RV1MpCiAgICB2aXJ0dWFsIGJvb2wgcXdzRXZlbnQoIFFXU0V2ZW50ICogKTsKICAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciAqc2NhbkxpbmUoIGludCApIGNvbnN0OwogICAgdmlydHVhbCBpbnQgYnl0ZXNQZXJMaW5lKCkgY29uc3Q7CiNlbmRpZgoKICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVNYXNrKCk7CgogICAgLy8gTWlzYy4gcHJvdGVjdGVkIGZ1bmN0aW9ucwoKI2lmbmRlZiBRVF9OT19TVFlMRQogICAgdmlydHVhbCB2b2lkIHN0eWxlQ2hhbmdlKCBRU3R5bGUmICk7CiNlbmRpZgogICAgdmlydHVhbCB2b2lkIGVuYWJsZWRDaGFuZ2UoIGJvb2wgb2xkRW5hYmxlZCApOwojaWZuZGVmIFFUX05PX1BBTEVUVEUKICAgIHZpcnR1YWwgdm9pZCBwYWxldHRlQ2hhbmdlKCBjb25zdCBRUGFsZXR0ZSAmICk7CiNlbmRpZgogICAgdmlydHVhbCB2b2lkIGZvbnRDaGFuZ2UoIGNvbnN0IFFGb250ICYgKTsKICAgIHZpcnR1YWwgdm9pZCB3aW5kb3dBY3RpdmF0aW9uQ2hhbmdlKCBib29sIG9sZEFjdGl2ZSApOwoKICAgIGludAkJIG1ldHJpYyggaW50ICkJY29uc3Q7CgogICAgdm9pZAkgcmVzZXRJbnB1dENvbnRleHQoKTsKCiAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlKCBXSWQgPSAwLCBib29sIGluaXRpYWxpemVXaW5kb3cgPSBUUlVFLAoJCQkgYm9vbCBkZXN0cm95T2xkV2luZG93ID0gVFJVRSApOwogICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koIGJvb2wgZGVzdHJveVdpbmRvdyA9IFRSVUUsCgkJCSAgYm9vbCBkZXN0cm95U3ViV2luZG93cyA9IFRSVUUgKTsKICAgIHVpbnQJIGdldFdTdGF0ZSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFdTdGF0ZSggdWludCApOwogICAgdm9pZAkgY2xlYXJXU3RhdGUoIHVpbnQgbiApOwogICAgV0ZsYWdzCSBnZXRXRmxhZ3MoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRXRmxhZ3MoIFdGbGFncyApOwogICAgdm9pZAkgY2xlYXJXRmxhZ3MoIFdGbGFncyBuICk7CgogICAgdmlydHVhbCBib29sIGZvY3VzTmV4dFByZXZDaGlsZCggYm9vbCBuZXh0ICk7CgogICAgUVdFeHRyYQkqZXh0cmFEYXRhKCk7CiAgICBRVExXRXh0cmEJKnRvcERhdGEoKTsKICAgIFFGb2N1c0RhdGEJKmZvY3VzRGF0YSgpOwoKICAgIHZpcnR1YWwgdm9pZCBzZXRLZXlDb21wcmVzc2lvbihib29sKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRNaWNyb0ZvY3VzSGludChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgYm9vbCB0ZXh0PVRSVUUsIFFGb250ICpmID0gMCk7CgojaWYgZGVmaW5lZChRX1dTX01BQykKICAgIHZvaWQgZGlydHlDbGlwcGVkUmVnaW9uKGJvb2wpOwogICAgYm9vbCBpc0NsaXBwZWRSZWdpb25EaXJ0eSgpOwogICAgdmlydHVhbCB2b2lkIHNldFJlZ2lvbkRpcnR5KGJvb2wpOwogICAgdmlydHVhbCB2b2lkIG1hY1dpZGdldENoYW5nZWRXaW5kb3coKTsKI2VuZGlmCgpwcml2YXRlIHNsb3RzOgogICAgdm9pZAkgZm9jdXNQcm94eURlc3Ryb3llZCgpOwoKcHJpdmF0ZToKICAgIHZvaWQJIHNldEZvbnRTeXMoIFFGb250ICpmID0gMCApOwojaWYgZGVmaW5lZChRX1dTX1gxMSkKICAgIHZvaWQJIGNyZWF0ZUlucHV0Q29udGV4dCgpOwogICAgdm9pZAkgZGVzdHJveUlucHV0Q29udGV4dCgpOwogICAgdm9pZAkgZm9jdXNJbnB1dENvbnRleHQoKTsKICAgIHZvaWQJIGNoZWNrQ2hpbGRyZW5EbmQoKTsKI2VsaWYgZGVmaW5lZChRX1dTX01BQykKICAgIHVpbnQgICAgb3duX2lkIDogMSwgbWFjRHJvcEVuYWJsZWQgOiAxOwogICAgRXZlbnRIYW5kbGVyUmVmIHdpbmRvd19ldmVudDsKICAgIC8vbWFjIGV2ZW50IGZ1bmN0aW9ucwogICAgdm9pZCAgICBwcm9wYWdhdGVVcGRhdGVzKGJvb2wgdXBkYXRlX3Jnbj1UUlVFKTsKICAgIHZvaWQgICAgdXBkYXRlKCBjb25zdCBRUmVnaW9uJiApOwogICAgLy9mcmllbmRzLCB3YXkgdG9vIG1hbnkgLSBmaXggdGhpcyBpbW1lZGlhdGVseSEKICAgIGZyaWVuZCB2b2lkIHF0X2NsZWFuX3Jvb3Rfd2luKCk7CiAgICBmcmllbmQgYm9vbCBxdF9yZWNyZWF0ZV9yb290X3dpbigpOwogICAgZnJpZW5kIFFQb2ludCBwb3NJbldpbmRvdyhRV2lkZ2V0ICopOwogICAgZnJpZW5kIGJvb2wgcXRfbWFjX3VwZGF0ZV9zaXplcihRV2lkZ2V0ICosIGludCk7CiAgICBmcmllbmQgUVdpZGdldCAqcXRfcmVjdXJzaXZlX21hdGNoKFFXaWRnZXQgKndpZGcsIGludCB4LCBpbnQgeSk7CiAgICBmcmllbmQgYm9vbCBxdF9wYWludF9jaGlsZHJlbihRV2lkZ2V0ICosUVJlZ2lvbiAmLCB1Y2hhciBvcHMpOwogICAgZnJpZW5kIFFNQUNfUEFTQ0FMIE9TU3RhdHVzIHF0X3dpbmRvd19ldmVudChFdmVudEhhbmRsZXJDYWxsUmVmIGVyLCBFdmVudFJlZiBldmVudCwgdm9pZCAqKTsKICAgIGZyaWVuZCB2b2lkIHF0X2V2ZW50X3JlcXVlc3RfdXBkYXRlcyhRV2lkZ2V0ICosIGNvbnN0IFFSZWdpb24gJiwgYm9vbCBzdWJ0cmFjdCk7CiAgICBmcmllbmQgYm9vbCBxdF93aW5kb3dfcmduKFdJZCwgc2hvcnQsIFJnbkhhbmRsZSwgYm9vbCk7CiAgICBmcmllbmQgY2xhc3MgUURyYWdNYW5hZ2VyOwojZW5kaWYKCiNpZm5kZWYgUVRfTk9fTEFZT1VUCiAgICB2b2lkIAkgc2V0TGF5b3V0KCBRTGF5b3V0ICpsICk7CiNlbmRpZgogICAgdm9pZAkgc2V0V2luSWQoIFdJZCApOwogICAgdm9pZAkgc2hvd1dpbmRvdygpOwogICAgdm9pZAkgaGlkZVdpbmRvdygpOwogICAgdm9pZAkgc2hvd0NoaWxkcmVuKCBib29sIHNwb250YW5lb3VzICk7CiAgICB2b2lkCSBoaWRlQ2hpbGRyZW4oIGJvb2wgc3BvbnRhbmVvdXMgKTsKICAgIHZvaWQJIHJlcGFyZW50U3lzKCBRV2lkZ2V0ICpwYXJlbnQsIFdGbGFncywgY29uc3QgUVBvaW50ICYsICBib29sIHNob3dJdCk7CiAgICB2b2lkCSBjcmVhdGVUTEV4dHJhKCk7CiAgICB2b2lkCSBjcmVhdGVFeHRyYSgpOwogICAgdm9pZAkgZGVsZXRlRXh0cmEoKTsKICAgIHZvaWQJIGNyZWF0ZVN5c0V4dHJhKCk7CiAgICB2b2lkCSBkZWxldGVTeXNFeHRyYSgpOwogICAgdm9pZAkgY3JlYXRlVExTeXNFeHRyYSgpOwogICAgdm9pZAkgZGVsZXRlVExTeXNFeHRyYSgpOwogICAgdm9pZAkgZGVhY3RpdmF0ZVdpZGdldENsZWFudXAoKTsKICAgIHZvaWQJIGludGVybmFsU2V0R2VvbWV0cnkoIGludCwgaW50LCBpbnQsIGludCwgYm9vbCApOwogICAgdm9pZAkgcmVwYXJlbnRGb2N1c1dpZGdldHMoIFFXaWRnZXQgKiApOwogICAgUUZvY3VzRGF0YQkqZm9jdXNEYXRhKCBib29sIGNyZWF0ZSApOwogICAgdm9pZCAgICAgICAgIHNldEJhY2tncm91bmRGcm9tTW9kZSgpOwogICAgdm9pZCAgICAgICAgIHNldEJhY2tncm91bmRDb2xvckRpcmVjdCggY29uc3QgUUNvbG9yICYgKTsKICAgIHZvaWQgICAJIHNldEJhY2tncm91bmRQaXhtYXBEaXJlY3QoIGNvbnN0IFFQaXhtYXAgJiApOwogICAgdm9pZCAgICAgICAgIHNldEJhY2tncm91bmRNb2RlRGlyZWN0KCBCYWNrZ3JvdW5kTW9kZSApOwogICAgdm9pZCAgICAgICAgIHNldEJhY2tncm91bmRFbXB0eSgpOwogICAgdm9pZAkgdXBkYXRlRnJhbWVTdHJ1dCgpIGNvbnN0OwojaWYgZGVmaW5lZChRX1dTX1gxMSkKICAgIHZvaWQgICAgICAgICBzZXRCYWNrZ3JvdW5kWDExUmVsYXRpdmUoKTsKI2VuZGlmCgogICAgV0lkCQkgd2luaWQ7CiAgICB1aW50CSB3aWRnZXRfc3RhdGU7CiAgICB1aW50CSB3aWRnZXRfZmxhZ3M7CiAgICB1aW50CSBmb2N1c19wb2xpY3kgOiA0OwogICAgdWludCAJIG93bl9mb250IDoxOwogICAgdWludCAJIG93bl9wYWxldHRlIDoxOwogICAgdWludCAJIHNpemVoaW50X2ZvcmNlZCA6MTsKICAgIHVpbnQgCSBpc19jbG9zaW5nIDoxOwogICAgdWludCAJIGluX3Nob3cgOiAxOwogICAgdWludCAJIGluX3Nob3dfbWF4aW1pemVkIDogMTsKICAgIHVpbnQJIGZzdHJ1dF9kaXJ0eSA6IDE7CiAgICB1aW50CSBpbV9lbmFibGVkIDogMTsKICAgIFFSZWN0CSBjcmVjdDsKICAgIFFDb2xvcgkgYmdfY29sOwojaWZuZGVmIFFUX05PX1BBTEVUVEUKICAgIFFQYWxldHRlCSBwYWw7CiNlbmRpZgogICAgUUZvbnQJIGZudDsKI2lmbmRlZiBRVF9OT19MQVlPVVQKICAgIFFMYXlvdXQgCSpsYXlfb3V0OwojZW5kaWYKICAgIFFXRXh0cmEJKmV4dHJhOwojaWYgZGVmaW5lZChRX1dTX1FXUykKICAgIFFSZWdpb24JIHJlcV9yZWdpb247CQkJLy8gUmVxdWVzdGVkIHJlZ2lvbgogICAgbXV0YWJsZSBRUmVnaW9uCSBwYWludGFibGVfcmVnaW9uOwkvLyBQYWludGFibGUgcmVnaW9uCiAgICBtdXRhYmxlIGJvb2wgICAgICAgICBwYWludGFibGVfcmVnaW9uX2RpcnR5Oy8vIG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZAogICAgbXV0YWJsZSBRUmVnaW9uICAgICAgYWxsb2NfcmVnaW9uOyAgICAgICAgICAvLyBBbGxvY2F0ZWQgcmVnaW9uCiAgICBtdXRhYmxlIGJvb2wgICAgICAgICBhbGxvY19yZWdpb25fZGlydHk7ICAgIC8vIG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZAogICAgbXV0YWJsZSBpbnQgICAgICAgICAgb3ZlcmxhcHBpbmdfY2hpbGRyZW47ICAvLyBIYW5kbGUgb3ZlcmxhcHBpbmcgY2hpbGRyZW4KCiAgICBpbnQJCSBhbGxvY19yZWdpb25faW5kZXg7CiAgICBpbnQJCSBhbGxvY19yZWdpb25fcmV2aXNpb247CgogICAgdm9pZCB1cGRhdGVPdmVybGFwcGluZ0NoaWxkcmVuKCkgY29uc3Q7CiAgICB2b2lkIHNldENoaWxkcmVuQWxsb2NhdGVkRGlydHkoKTsKICAgIHZvaWQgc2V0Q2hpbGRyZW5BbGxvY2F0ZWREaXJ0eSggY29uc3QgUVJlZ2lvbiAmciwgY29uc3QgUVdpZGdldCAqZGlydHk9MCApOwogICAgYm9vbCBpc0FsbG9jYXRlZFJlZ2lvbkRpcnR5KCkgY29uc3Q7CiAgICB2b2lkIHVwZGF0ZVJlcXVlc3RlZFJlZ2lvbiggY29uc3QgUVBvaW50ICZncG9zICk7CiAgICBRUmVnaW9uIHJlcXVlc3RlZFJlZ2lvbigpIGNvbnN0OwogICAgUVJlZ2lvbiBhbGxvY2F0ZWRSZWdpb24oKSBjb25zdDsKICAgIFFSZWdpb24gcGFpbnRhYmxlUmVnaW9uKCkgY29uc3Q7CgogICAgdm9pZCB1cGRhdGVHcmFwaGljc0NvbnRleHQoIFFHZnggKnFnZnhfcXdzLCBib29sIGNsaXBfY2hpbGRyZW4gKSBjb25zdDsKI2lmbmRlZiBRVF9OT19DVVJTT1IKICAgIHZvaWQgdXBkYXRlQ3Vyc29yKCBjb25zdCBRUmVnaW9uICZyICkgY29uc3Q7CiNlbmRpZgoKICAgIC8vIHVzZWQgdG8gYWNjdW11bGF0ZSBkaXJ0eSByZWdpb24gd2hlbiBjaGlsZHJlbiBtb3ZlZC9yZXNpemVkLgogICAgUVJlZ2lvbiBkaXJ0eUNoaWxkcmVuOwogICAgYm9vbCBpc1NldHRpbmdHZW9tZXRyeTsKICAgIGZyaWVuZCBjbGFzcyBRV1NNYW5hZ2VyOwojZW5kaWYKICAgIHN0YXRpYyBpbnQgaW5zdGFuY2VDb3VudGVyOyAgLy8gQ3VycmVudCBudW1iZXIgb2Ygd2lkZ2V0IGluc3RhbmNlcwogICAgc3RhdGljIGludCBtYXhJbnN0YW5jZXM7ICAgICAvLyBNYXhpbXVtIG51bWJlciBvZiB3aWRnZXQgaW5zdGFuY2VzCgogICAgc3RhdGljIHZvaWQJIGNyZWF0ZU1hcHBlcigpOwogICAgc3RhdGljIHZvaWQJIGRlc3Ryb3lNYXBwZXIoKTsKICAgIHN0YXRpYyBRV2lkZ2V0TGlzdAkgKndMaXN0KCk7CiAgICBzdGF0aWMgUVdpZGdldExpc3QJICp0bHdMaXN0KCk7CiAgICBzdGF0aWMgUVdpZGdldE1hcHBlciAqbWFwcGVyOwogICAgZnJpZW5kIGNsYXNzIFFBcHBsaWNhdGlvbjsKICAgIGZyaWVuZCBjbGFzcyBRQmFzZUFwcGxpY2F0aW9uOwogICAgZnJpZW5kIGNsYXNzIFFQYWludGVyOwogICAgZnJpZW5kIGNsYXNzIFFGb250TWV0cmljczsKICAgIGZyaWVuZCBjbGFzcyBRRm9udEluZm87CiAgICBmcmllbmQgY2xhc3MgUUVUV2lkZ2V0OwogICAgZnJpZW5kIGNsYXNzIFFMYXlvdXQ7Cgpwcml2YXRlOgkvLyBEaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRV2lkZ2V0KCBjb25zdCBRV2lkZ2V0ICYgKTsKICAgIFFXaWRnZXQgJm9wZXJhdG9yPSggY29uc3QgUVdpZGdldCAmICk7CiNlbmRpZgoKcHVibGljOiAvLyBvYnNvbGV0ZSBmdW5jdGlvbnMgdG8gZGlzc2FwcGVhciBvciB0byBiZWNvbWUgaW5saW5lIGluIDMuMAojaWZuZGVmIFFUX05PX1BBTEVUVEUKICAgIHZvaWQgc2V0UGFsZXR0ZSggY29uc3QgUVBhbGV0dGUgJnAsIGJvb2wgKSB7IHNldFBhbGV0dGUoIHAgKTsgfQojZW5kaWYKICAgIHZvaWQgc2V0Rm9udCggY29uc3QgUUZvbnQgJmYsIGJvb2wgKSB7IHNldEZvbnQoIGYgKTsgfQp9OwoKCmlubGluZSBRdDo6V1N0YXRlIFFXaWRnZXQ6OnRlc3RXU3RhdGUoIFdTdGF0ZSBzICkgY29uc3QKeyByZXR1cm4gKHdpZGdldF9zdGF0ZSAmIHMpOyB9CgppbmxpbmUgUXQ6OldGbGFncyBRV2lkZ2V0Ojp0ZXN0V0ZsYWdzKCBXRmxhZ3MgZiApIGNvbnN0CnsgcmV0dXJuICh3aWRnZXRfZmxhZ3MgJiBmKTsgfQoKCmlubGluZSBXSWQgUVdpZGdldDo6d2luSWQoKSBjb25zdAp7IHJldHVybiB3aW5pZDsgfQoKaW5saW5lIGJvb2wgUVdpZGdldDo6aXNUb3BMZXZlbCgpIGNvbnN0CnsgcmV0dXJuIHRlc3RXRmxhZ3MoV1R5cGVfVG9wTGV2ZWwpOyB9CgppbmxpbmUgYm9vbCBRV2lkZ2V0Ojppc0RpYWxvZygpIGNvbnN0CnsgcmV0dXJuIHRlc3RXRmxhZ3MoV1R5cGVfRGlhbG9nKTsgfQoKaW5saW5lIGJvb2wgUVdpZGdldDo6aXNQb3B1cCgpIGNvbnN0CnsgcmV0dXJuIHRlc3RXRmxhZ3MoV1R5cGVfUG9wdXApOyB9CgppbmxpbmUgYm9vbCBRV2lkZ2V0Ojppc0Rlc2t0b3AoKSBjb25zdAp7IHJldHVybiB0ZXN0V0ZsYWdzKFdUeXBlX0Rlc2t0b3ApOyB9CgppbmxpbmUgYm9vbCBRV2lkZ2V0Ojppc0VuYWJsZWQoKSBjb25zdAp7IHJldHVybiAhdGVzdFdTdGF0ZShXU3RhdGVfRGlzYWJsZWQpOyB9CgppbmxpbmUgYm9vbCBRV2lkZ2V0Ojppc01vZGFsKCkgY29uc3QKeyByZXR1cm4gdGVzdFdGbGFncyhXU2hvd01vZGFsKTsgfQoKaW5saW5lIGJvb2wgUVdpZGdldDo6aXNFbmFibGVkVG9UTFcoKSBjb25zdAp7IHJldHVybiBpc0VuYWJsZWQoKTsgfQoKaW5saW5lIGNvbnN0IFFSZWN0ICZRV2lkZ2V0OjpnZW9tZXRyeSgpIGNvbnN0CnsgcmV0dXJuIGNyZWN0OyB9CgppbmxpbmUgUVNpemUgUVdpZGdldDo6c2l6ZSgpIGNvbnN0CnsgcmV0dXJuIGNyZWN0LnNpemUoKTsgfQoKaW5saW5lIGludCBRV2lkZ2V0Ojp3aWR0aCgpIGNvbnN0CnsgcmV0dXJuIGNyZWN0LndpZHRoKCk7IH0KCmlubGluZSBpbnQgUVdpZGdldDo6aGVpZ2h0KCkgY29uc3QKeyByZXR1cm4gY3JlY3QuaGVpZ2h0KCk7IH0KCmlubGluZSBRUmVjdCBRV2lkZ2V0OjpyZWN0KCkgY29uc3QKeyByZXR1cm4gUVJlY3QoMCwwLGNyZWN0LndpZHRoKCksY3JlY3QuaGVpZ2h0KCkpOyB9CgppbmxpbmUgaW50IFFXaWRnZXQ6Om1pbmltdW1XaWR0aCgpIGNvbnN0CnsgcmV0dXJuIG1pbmltdW1TaXplKCkud2lkdGgoKTsgfQoKaW5saW5lIGludCBRV2lkZ2V0OjptaW5pbXVtSGVpZ2h0KCkgY29uc3QKeyByZXR1cm4gbWluaW11bVNpemUoKS5oZWlnaHQoKTsgfQoKaW5saW5lIGludCBRV2lkZ2V0OjptYXhpbXVtV2lkdGgoKSBjb25zdAp7IHJldHVybiBtYXhpbXVtU2l6ZSgpLndpZHRoKCk7IH0KCmlubGluZSBpbnQgUVdpZGdldDo6bWF4aW11bUhlaWdodCgpIGNvbnN0CnsgcmV0dXJuIG1heGltdW1TaXplKCkuaGVpZ2h0KCk7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OnNldE1pbmltdW1TaXplKCBjb25zdCBRU2l6ZSAmcyApCnsgc2V0TWluaW11bVNpemUocy53aWR0aCgpLHMuaGVpZ2h0KCkpOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0OjpzZXRNYXhpbXVtU2l6ZSggY29uc3QgUVNpemUgJnMgKQp7IHNldE1heGltdW1TaXplKHMud2lkdGgoKSxzLmhlaWdodCgpKTsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6c2V0U2l6ZUluY3JlbWVudCggY29uc3QgUVNpemUgJnMgKQp7IHNldFNpemVJbmNyZW1lbnQocy53aWR0aCgpLHMuaGVpZ2h0KCkpOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0OjpzZXRCYXNlU2l6ZSggY29uc3QgUVNpemUgJnMgKQp7IHNldEJhc2VTaXplKHMud2lkdGgoKSxzLmhlaWdodCgpKTsgfQoKaW5saW5lIGNvbnN0IFFDb2xvciAmUVdpZGdldDo6ZXJhc2VDb2xvcigpIGNvbnN0CnsgcmV0dXJuIGJnX2NvbDsgfQoKI2lmbmRlZiBRVF9OT19QQUxFVFRFCmlubGluZSBjb25zdCBRUGFsZXR0ZSAmUVdpZGdldDo6cGFsZXR0ZSgpIGNvbnN0CnsgcmV0dXJuIHBhbDsgfQojZW5kaWYKCmlubGluZSBRRm9udCBRV2lkZ2V0Ojpmb250KCkgY29uc3QKeyByZXR1cm4gZm50OyB9CgppbmxpbmUgUUZvbnRNZXRyaWNzIFFXaWRnZXQ6OmZvbnRNZXRyaWNzKCkgY29uc3QKeyByZXR1cm4gUUZvbnRNZXRyaWNzKGZvbnQoKSk7IH0KCmlubGluZSBRRm9udEluZm8gUVdpZGdldDo6Zm9udEluZm8oKSBjb25zdAp7IHJldHVybiBRRm9udEluZm8oZm9udCgpKTsgfQoKaW5saW5lIGJvb2wgUVdpZGdldDo6aGFzTW91c2VUcmFja2luZygpIGNvbnN0CnsgcmV0dXJuIHRlc3RXU3RhdGUoV1N0YXRlX01vdXNlVHJhY2tpbmcpOyB9CgppbmxpbmUgYm9vbCBRV2lkZ2V0OjpoYXNNb3VzZSgpIGNvbnN0CnsgcmV0dXJuIHRlc3RXU3RhdGUoV1N0YXRlX0hhc01vdXNlKTsgfQoKaW5saW5lIGJvb2wgIFFXaWRnZXQ6OmlzRm9jdXNFbmFibGVkKCkgY29uc3QKeyByZXR1cm4gKEZvY3VzUG9saWN5KWZvY3VzX3BvbGljeSAhPSBOb0ZvY3VzOyB9CgppbmxpbmUgUVdpZGdldDo6Rm9jdXNQb2xpY3kgUVdpZGdldDo6Zm9jdXNQb2xpY3koKSBjb25zdAp7IHJldHVybiAoRm9jdXNQb2xpY3kpZm9jdXNfcG9saWN5OyB9CgppbmxpbmUgYm9vbCBRV2lkZ2V0Ojppc1VwZGF0ZXNFbmFibGVkKCkgY29uc3QKeyByZXR1cm4gIXRlc3RXU3RhdGUoV1N0YXRlX0Jsb2NrVXBkYXRlcyk7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OnVwZGF0ZSggY29uc3QgUVJlY3QgJnIgKQp7IHVwZGF0ZSggci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkgKTsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6cmVwYWludCgpCnsgcmVwYWludCggVFJVRSApOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0OjpyZXBhaW50KCBjb25zdCBRUmVjdCAmciwgYm9vbCBlcmFzZSApCnsgcmVwYWludCggci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCksIGVyYXNlICk7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OmVyYXNlKCkKeyBlcmFzZSggMCwgMCwgY3JlY3Qud2lkdGgoKSwgY3JlY3QuaGVpZ2h0KCkgKTsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6ZXJhc2UoIGNvbnN0IFFSZWN0ICZyICkKeyBlcmFzZSggci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkgKTsgfQoKaW5saW5lIGJvb2wgUVdpZGdldDo6Y2xvc2UoKQp7IHJldHVybiBjbG9zZSggRkFMU0UgKTsgfQoKaW5saW5lIGJvb2wgUVdpZGdldDo6aXNWaXNpYmxlKCkgY29uc3QKeyByZXR1cm4gdGVzdFdTdGF0ZShXU3RhdGVfVmlzaWJsZSk7IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmlzVmlzaWJsZVRvVExXKCkgY29uc3QgLy8gb2Jzb2xldGUKeyByZXR1cm4gaXNWaXNpYmxlKCk7IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmlzSGlkZGVuKCkgY29uc3QKeyByZXR1cm4gdGVzdFdTdGF0ZShXU3RhdGVfRm9yY2VIaWRlKTsgfQoKaW5saW5lIGJvb2wgUVdpZGdldDo6aXNTaG93bigpIGNvbnN0CnsgcmV0dXJuICF0ZXN0V1N0YXRlKFdTdGF0ZV9Gb3JjZUhpZGUpOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0Ojptb3ZlKCBjb25zdCBRUG9pbnQgJnAgKQp7IG1vdmUoIHAueCgpLCBwLnkoKSApOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0OjpyZXNpemUoIGNvbnN0IFFTaXplICZzICkKeyByZXNpemUoIHMud2lkdGgoKSwgcy5oZWlnaHQoKSk7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OnNldEdlb21ldHJ5KCBjb25zdCBRUmVjdCAmciApCnsgc2V0R2VvbWV0cnkoIHIubGVmdCgpLCByLnRvcCgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkgKTsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6ZHJhd1RleHQoIGNvbnN0IFFQb2ludCAmcCwgY29uc3QgUVN0cmluZyAmcyApCnsgZHJhd1RleHQoIHAueCgpLCBwLnkoKSwgcyApOyB9CgppbmxpbmUgUVdpZGdldCAqUVdpZGdldDo6cGFyZW50V2lkZ2V0KCBib29sIHNhbWVXaW5kb3cgKSBjb25zdAp7CiAgICBpZiAoIHNhbWVXaW5kb3cgKQoJcmV0dXJuIGlzVG9wTGV2ZWwoKSA/IDAgOiAoUVdpZGdldCAqKVFPYmplY3Q6OnBhcmVudCgpOwogICAgcmV0dXJuIChRV2lkZ2V0ICopUU9iamVjdDo6cGFyZW50KCk7Cn0KCmlubGluZSBRV2lkZ2V0TWFwcGVyICpRV2lkZ2V0Ojp3bWFwcGVyKCkKeyByZXR1cm4gbWFwcGVyOyB9CgppbmxpbmUgdWludCBRV2lkZ2V0OjpnZXRXU3RhdGUoKSBjb25zdAp7IHJldHVybiB3aWRnZXRfc3RhdGU7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OnNldFdTdGF0ZSggdWludCBmICkKeyB3aWRnZXRfc3RhdGUgfD0gZjsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6Y2xlYXJXU3RhdGUoIHVpbnQgZiApCnsgd2lkZ2V0X3N0YXRlICY9IH5mOyB9CgppbmxpbmUgUXQ6OldGbGFncyBRV2lkZ2V0OjpnZXRXRmxhZ3MoKSBjb25zdAp7IHJldHVybiB3aWRnZXRfZmxhZ3M7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OnNldFdGbGFncyggV0ZsYWdzIGYgKQp7IHdpZGdldF9mbGFncyB8PSBmOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0OjpjbGVhcldGbGFncyggV0ZsYWdzIGYgKQp7IHdpZGdldF9mbGFncyAmPSB+ZjsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6Y29uc3RQb2xpc2goKSBjb25zdAp7CiAgICBpZiAoICF0ZXN0V1N0YXRlKFdTdGF0ZV9Qb2xpc2hlZCkgKSB7CglRV2lkZ2V0KiB0aGF0ID0gKFFXaWRnZXQqKSB0aGlzOwoJdGhhdC0+cG9saXNoKCk7CiAgICAgICAgdGhhdC0+c2V0V1N0YXRlKFdTdGF0ZV9Qb2xpc2hlZCk7IC8vIGJlIG9uIHRoZSBzYWZlIHNpZGUuLi4KICAgIH0KfQojaWZuZGVmIFFUX05PX0NVUlNPUgppbmxpbmUgYm9vbCBRV2lkZ2V0Ojpvd25DdXJzb3IoKSBjb25zdAp7CiAgICByZXR1cm4gdGVzdFdTdGF0ZSggV1N0YXRlX093bkN1cnNvciApOwp9CiNlbmRpZgppbmxpbmUgYm9vbCBRV2lkZ2V0Ojpvd25Gb250KCkgY29uc3QKewogICAgcmV0dXJuIG93bl9mb250Owp9CiNpZm5kZWYgUVRfTk9fUEFMRVRURQppbmxpbmUgYm9vbCBRV2lkZ2V0Ojpvd25QYWxldHRlKCkgY29uc3QKewogICAgcmV0dXJuIG93bl9wYWxldHRlOwp9CiNlbmRpZgoKaW5saW5lIHZvaWQgUVdpZGdldDo6c2V0U2l6ZVBvbGljeSggUVNpemVQb2xpY3k6OlNpemVUeXBlIGhvciwgUVNpemVQb2xpY3k6OlNpemVUeXBlIHZlciwgYm9vbCBoZncgKQp7CiAgICBzZXRTaXplUG9saWN5KCBRU2l6ZVBvbGljeSggaG9yLCB2ZXIsIGhmdykgKTsKfQoKaW5saW5lIGJvb2wgUVdpZGdldDo6aXNJbnB1dE1ldGhvZEVuYWJsZWQoKSBjb25zdAp7CiAgICByZXR1cm4gKGJvb2wpaW1fZW5hYmxlZDsKfQoKLy8gRXh0cmEgUVdpZGdldCBkYXRhCi8vICAtIHRvIG1pbmltaXplIG1lbW9yeSB1c2FnZSBmb3IgbWVtYmVycyB0aGF0IGFyZSBzZWxkb20gdXNlZC4KLy8gIC0gdG9wLWxldmVsIHdpZGdldHMgaGF2ZSBleHRyYSBleHRyYSBkYXRhIHRvIHJlZHVjZSBjb3N0IGZ1cnRoZXIKCmNsYXNzIFFGb2N1c0RhdGE7CmNsYXNzIFFXU01hbmFnZXI7CiNpZiBkZWZpbmVkKFFfV1NfV0lOKQpjbGFzcyBRT2xlRHJvcFRhcmdldDsKI2VuZGlmCiNpZiBkZWZpbmVkKFFfV1NfTUFDKQpjbGFzcyBRTWFjRG5kRXh0cmE7CiNlbmRpZgoKc3RydWN0IFFfRVhQT1JUIFFUTFdFeHRyYSB7CiNpZm5kZWYgUVRfTk9fV0lER0VUX1RPUEVYVFJBCiAgICBRU3RyaW5nICBjYXB0aW9uOwkJCQkvLyB3aWRnZXQgY2FwdGlvbgogICAgUVN0cmluZyAgaWNvblRleHQ7CQkJCS8vIHdpZGdldCBpY29uIHRleHQKICAgIFFQaXhtYXAgKmljb247CQkJCS8vIHdpZGdldCBpY29uCiNlbmRpZgogICAgUUZvY3VzRGF0YSAqZm9jdXNEYXRhOwkJCS8vIGZvY3VzIGRhdGEgKGZvciBUTFcpCiAgICBzaG9ydCAgICBpbmN3LCBpbmNoOwkJCS8vIHNpemUgaW5jcmVtZW50cwogICAgLy8gZnJhbWUgc3RydXQKICAgIHVsb25nICAgIGZsZWZ0LCBmcmlnaHQsIGZ0b3AsIGZib3R0b207CiAgICB1aW50ICAgICB1bnVzZWQgOiA4OyAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHVzZWQgYXQgdGhpcyBwb2ludC4uLgojaWYgZGVmaW5lZCggUV9XU19XSU4gKSB8fCBkZWZpbmVkKCBRX1dTX01BQyApCiAgICB1aW50ICAgICBvcGFjaXR5IDogODsJCSAgICAgICAvLyBTdG9yZXMgb3BhY2l0eSBsZXZlbCBvbiBXaW5kb3dzL01hYyBPUyBYLgojZW5kaWYKICAgIHVpbnQgICAgIHNhdmVkRmxhZ3M7CQkJLy8gU2F2ZSB3aWRnZXRmbGFncyB3aGlsZSBzaG93aW5nIGZ1bGxzY3JlZW4KICAgIHNob3J0ICAgIGJhc2V3LCBiYXNlaDsJCQkvLyBiYXNlIHNpemVzCiNpZiBkZWZpbmVkKFFfV1NfWDExKQogICAgV0lkICBwYXJlbnRXaW5JZDsJCQkJLy8gcGFyZW50IHdpbmRvdyBJZCAodmFsaWQgYWZ0ZXIgcmVwYXJlbnRpbmcpCiAgICB1aW50ICAgICBlbWJlZGRlZCA6IDE7CQkJLy8gd2luZG93IGlzIGVtYmVkZGVkIGluIGFub3RoZXIgUXQgYXBwbGljYXRpb24KICAgIHVpbnQgICAgIHNwb250X3VubWFwcGVkOiAxOwkJCS8vIHdpbmRvdyB3YXMgc3BvbnRhbmVvdXNseSB1bm1hcHBlZAogICAgdWludCAgICAgcmVzZXJ2ZWQ6IDE7CQkJLy8gcmVzZXJ2ZWQKICAgIHVpbnQgICAgIGRuZCA6IDE7CQkJCS8vIERORCBwcm9wZXJ0aWVzIGluc3RhbGxlZAogICAgdWludCAgICAgdXNwb3MgOiAxOwkJCQkvLyBVc2VyIGRlZmluZWQgcG9zaXRpb24KICAgIHVpbnQgICAgIHVzc2l6ZSA6IDE7CQkJLy8gVXNlciBkZWZpbmVkIHNpemUKICAgIHZvaWQgICAgKnhpYzsJCQkJLy8gWElNIElucHV0IENvbnRleHQKI2VuZGlmCiNpZiBkZWZpbmVkKFFfV1NfTUFDKQogICAgV2luZG93R3JvdXBSZWYgZ3JvdXA7CiAgICB1aW50ICAgICBpc19tb3ZlZDogMTsKICAgIHVpbnQgICAgIHJlc2l6ZXIgOiA0OwojZW5kaWYKI2lmIGRlZmluZWQoUV9XU19RV1MpICYmICFkZWZpbmVkICggUVRfTk9fUVdTX01BTkFHRVIgKQogICAgUVJlZ2lvbiBkZWNvcl9hbGxvY2F0ZWRfcmVnaW9uOwkJLy8gZGVjb3JhdGlvbiBhbGxvY2F0ZWQgcmVnaW9uCiAgICBRV1NNYW5hZ2VyICpxd3NNYW5hZ2VyOwojZW5kaWYKI2lmIGRlZmluZWQoUV9XU19XSU4pCiAgICBISUNPTiAgICB3aW5JY29uOwkJCQkvLyBpbnRlcm5hbCBXaW5kb3dzIGljb24KI2VuZGlmCiAgICBRUmVjdCAgICBub3JtYWxHZW9tZXRyeTsJCQkvLyB1c2VkIGJ5IHNob3dNaW4vbWF4aW1pemVkL0Z1bGxTY3JlZW4KfTsKCgojZGVmaW5lIFFXSURHRVRTSVpFX01BWCAzMjc2NwoKLy8gZGVhciB1c2VyOiB5b3UgY2FuIHNlZSB0aGlzIHN0cnVjdCwgYnV0IGl0IGlzIGludGVybmFsLiBkbyBub3QgdG91Y2guCgpzdHJ1Y3QgUV9FWFBPUlQgUVdFeHRyYSB7CiAgICBRX0lOVDE2ICBtaW53LCBtaW5oOwkJCS8vIG1pbmltdW0gc2l6ZQogICAgUV9JTlQxNiAgbWF4dywgbWF4aDsJCQkvLyBtYXhpbXVtIHNpemUKICAgIFFQaXhtYXAgKmJnX3BpeDsJCQkJLy8gYmFja2dyb3VuZCBwaXhtYXAKICAgIFFXaWRnZXQgKmZvY3VzX3Byb3h5OwojaWZuZGVmIFFUX05PX0NVUlNPUgogICAgUUN1cnNvciAqY3VyczsKI2VuZGlmCiAgICBRVExXRXh0cmEgKnRvcGV4dHJhOwkJCS8vIG9ubHkgdXNlZnVsIGZvciBUTFdzCiNpZiBkZWZpbmVkKFFfV1NfV0lOKQogICAgUU9sZURyb3BUYXJnZXQgKmRyb3BUYXJnZXQ7CQkJLy8gZHJvcCB0YXJnZXQKI2VuZGlmCiNpZiBkZWZpbmVkKFFfV1NfWDExKQogICAgV0lkIHhEbmRQcm94eTsJCQkJLy8gWERORCBmb3J3YXJkaW5nIHRvIGVtYmVkZGVkIHdpbmRvd3MKI2VuZGlmCiNpZiBkZWZpbmVkKFFfV1NfTUFDKQogICAgUVJlZ2lvbiBjbGlwX3NhdmVkLCBjbGlwX3NpYnMsIGNsaXBfY2hpbGRyZW47CiAgICBRTWFjRG5kRXh0cmEgKm1hY0RuZEV4dHJhOwogICAgUVJlZ2lvbiBkaXJ0eV9hcmVhOwogICAgdWludCBjbGlwX2RpcnR5IDogMSwgY2xpcF9zZXJpYWwgOiAxNTsKICAgIHVpbnQgY2hpbGRfZGlydHkgOiAxLCBjaGlsZF9zZXJpYWwgOiAxNTsKI2lmbmRlZiBRTUFDX05PX1FVQVJUWgogICAgdWludCBjdHhfY2hpbGRyZW5fY2xpcHBlZDoxOwojZW5kaWYgLy8gUU1BQ19OT19RVUFSVFoKICAgIHVpbnQgaGFzX2RpcnR5X2FyZWE6MTsKI2VuZGlmIC8vIFFfV1NfTUFDCiAgICB1aW50IGJnX29yaWdpbiA6IDI7CiNpZiBkZWZpbmVkKFFfV1NfWDExKQogICAgdWludCBjaGlsZHJlbl91c2VfZG5kIDogMTsKICAgIHVpbnQgY29tcHJlc3NfZXZlbnRzIDogMTsKI2VuZGlmCiNpZiBkZWZpbmVkKFFfV1NfUVdTKSB8fCBkZWZpbmVkKFFfV1NfTUFDKQogICAgUVJlZ2lvbiBtYXNrOwkJCQkvLyB3aWRnZXQgbWFzawojZW5kaWYKICAgIGNoYXIgICAgIGJnX21vZGU7CQkJCS8vIGJhY2tncm91bmQgbW9kZQogICAgY2hhciAgICAgYmdfbW9kZV92aXN1YWw7CQkJLy8gdmlzdWFsIGJhY2tncm91bmQgbW9kZQojaWZuZGVmIFFUX05PX1NUWUxFCiAgICBRU3R5bGUqIHN0eWxlOwojZW5kaWYKICAgIFFSZWN0IG1pY3JvX2ZvY3VzX2hpbnQ7CQkJLy8gbWljcm8gZm9jdXMgaGludAogICAgUVNpemVQb2xpY3kgc2l6ZV9wb2xpY3k7Cn07CgojZGVmaW5lIFFfREVGSU5FRF9RV0lER0VUCiNpbmNsdWRlICJxd2luZXhwb3J0LmgiCgojZW5kaWYgLy8gUVdJREdFVF9ICgAAABYAcQB4AHQAdwBpAGQAZwBlAHQALgBoAAAH3C8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVhUV0lER0VUX0gKI2RlZmluZSBRWFRXSURHRVRfSAoKI2luY2x1ZGUgPHF3aWRnZXQuaD4KCiNpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+CgoKY2xhc3MgUVh0V2lkZ2V0IDogcHVibGljIFFXaWRnZXQgewogICAgUV9PQkpFQ1QKICAgIFdpZGdldCB4dHc7CiAgICBXaWRnZXQgeHRwYXJlbnQ7CiAgICBib29sICAgbmVlZF9yZXJvb3Q7CiAgICB2b2lkIGluaXQoY29uc3QgY2hhciogbmFtZSwgV2lkZ2V0Q2xhc3Mgd2lkZ2V0X2NsYXNzLAoJICAgICAgV2lkZ2V0IHBhcmVudCwgUVdpZGdldCogcXBhcmVudCwKCSAgICAgIEFyZ0xpc3QgYXJncywgQ2FyZGluYWwgbnVtX2FyZ3MsCgkgICAgICBib29sIG1hbmFnZWQpOwogICAgZnJpZW5kIHZvaWQgcXdpZGdldF9yZWFsaXplKCBXaWRnZXQgd2lkZ2V0LCBYdFZhbHVlTWFzayogbWFzaywKCQkJCSBYU2V0V2luZG93QXR0cmlidXRlcyogYXR0cmlidXRlcyApOwoKcHVibGljOgogICAgUVh0V2lkZ2V0KGNvbnN0IGNoYXIqIG5hbWUsIFdpZGdldCBwYXJlbnQsIGJvb2wgbWFuYWdlZD1GQUxTRSk7CiAgICBRWHRXaWRnZXQoY29uc3QgY2hhciogbmFtZSwgV2lkZ2V0Q2xhc3Mgd2lkZ2V0X2NsYXNzLAoJICAgICAgUVdpZGdldCAqcGFyZW50PTAsIEFyZ0xpc3QgYXJncz0wLCBDYXJkaW5hbCBudW1fYXJncz0wLAoJICAgICAgYm9vbCBtYW5hZ2VkPUZBTFNFKTsKICAgIH5RWHRXaWRnZXQoKTsKCiAgICBXaWRnZXQgeHRXaWRnZXQoKSBjb25zdCB7IHJldHVybiB4dHc7IH0KICAgIGJvb2wgaXNBY3RpdmVXaW5kb3coKSBjb25zdDsKICAgIHZvaWQgc2V0QWN0aXZlV2luZG93KCk7Cgpwcm90ZWN0ZWQ6CiAgICB2b2lkIG1vdmVFdmVudCggUU1vdmVFdmVudCogKTsKICAgIHZvaWQgcmVzaXplRXZlbnQoIFFSZXNpemVFdmVudCogKTsKICAgIGJvb2wgeDExRXZlbnQoIFhFdmVudCAqICk7Cn07CgojZW5kaWYgLy8gUVhUV0lER0VUX0gKAAAAGgBxAHQAbwBvAGwAYgB1AHQAdABvAG4ALgBoAAAWAi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRVE9PTEJVVFRPTl9ICiNkZWZpbmUgUVRPT0xCVVRUT05fSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxYnV0dG9uLmgiCiNpbmNsdWRlICJxc3RyaW5nLmgiCiNpbmNsdWRlICJxcGl4bWFwLmgiCiNpbmNsdWRlICJxaWNvbnNldC5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19UT09MQlVUVE9OCgpjbGFzcyBRVG9vbEJ1dHRvblByaXZhdGU7CmNsYXNzIFFUb29sQmFyOwpjbGFzcyBRUG9wdXBNZW51OwoKY2xhc3MgUV9FWFBPUlQgUVRvb2xCdXR0b24gOiBwdWJsaWMgUUJ1dHRvbgp7CiAgICBRX09CSkVDVAogICAgUV9FTlVNUyggVGV4dFBvc2l0aW9uICkKCiAgICBRX1BST1BFUlRZKCBRSWNvblNldCBpY29uU2V0IFJFQUQgaWNvblNldCBXUklURSBzZXRJY29uU2V0ICkKICAgIFFfUFJPUEVSVFkoIFFJY29uU2V0IG9uSWNvblNldCBSRUFEIG9uSWNvblNldCBXUklURSBzZXRPbkljb25TZXQgREVTSUdOQUJMRSBmYWxzZSBTVE9SRUQgZmFsc2UgKQogICAgUV9QUk9QRVJUWSggUUljb25TZXQgb2ZmSWNvblNldCBSRUFEIG9mZkljb25TZXQgV1JJVEUgc2V0T2ZmSWNvblNldCBERVNJR05BQkxFIGZhbHNlIFNUT1JFRCBmYWxzZSApCiAgICBRX1BST1BFUlRZKCBib29sIHVzZXNCaWdQaXhtYXAgUkVBRCB1c2VzQmlnUGl4bWFwIFdSSVRFIHNldFVzZXNCaWdQaXhtYXAgKQogICAgUV9QUk9QRVJUWSggYm9vbCB1c2VzVGV4dExhYmVsIFJFQUQgdXNlc1RleHRMYWJlbCBXUklURSBzZXRVc2VzVGV4dExhYmVsICkKICAgIFFfUFJPUEVSVFkoIFFTdHJpbmcgdGV4dExhYmVsIFJFQUQgdGV4dExhYmVsIFdSSVRFIHNldFRleHRMYWJlbCApCiAgICBRX1BST1BFUlRZKCBpbnQgcG9wdXBEZWxheSBSRUFEIHBvcHVwRGVsYXkgV1JJVEUgc2V0UG9wdXBEZWxheSApCiAgICBRX1BST1BFUlRZKCBib29sIGF1dG9SYWlzZSBSRUFEIGF1dG9SYWlzZSBXUklURSBzZXRBdXRvUmFpc2UgKQogICAgUV9QUk9QRVJUWSggVGV4dFBvc2l0aW9uIHRleHRQb3NpdGlvbiBSRUFEIHRleHRQb3NpdGlvbiBXUklURSBzZXRUZXh0UG9zaXRpb24gKQoKICAgIFFfT1ZFUlJJREUoIGJvb2wgdG9nZ2xlQnV0dG9uIFdSSVRFIHNldFRvZ2dsZUJ1dHRvbiApCiAgICBRX09WRVJSSURFKCBib29sIG9uIFdSSVRFIHNldE9uICkKICAgIFFfT1ZFUlJJREUoIFFQaXhtYXAgcGl4bWFwIERFU0lHTkFCTEUgZmFsc2UgU1RPUkVEIGZhbHNlICkKICAgIFFfT1ZFUlJJREUoIEJhY2tncm91bmRNb2RlIGJhY2tncm91bmRNb2RlIERFU0lHTkFCTEUgdHJ1ZSkKCnB1YmxpYzoKICAgIGVudW0gVGV4dFBvc2l0aW9uIHsKCUJlc2lkZUljb24sCglCZWxvd0ljb24sCglSaWdodCA9IEJlc2lkZUljb24sIC8vIG9ic29sZXRlCglVbmRlciA9IEJlbG93SWNvbiAvLyBvYnNvbGV0ZQogICAgfTsKICAgIFFUb29sQnV0dG9uKCBRV2lkZ2V0ICogcGFyZW50LCBjb25zdCBjaGFyKiBuYW1lPTAgKTsKI2lmbmRlZiBRVF9OT19UT09MQkFSCiAgICBRVG9vbEJ1dHRvbiggY29uc3QgUUljb25TZXQmIHMsIGNvbnN0IFFTdHJpbmcgJnRleHRMYWJlbCwKCQkgY29uc3QgUVN0cmluZyYgZ3JvdXB0ZXh0LAoJCSBRT2JqZWN0ICogcmVjZWl2ZXIsIGNvbnN0IGNoYXIqIHNsb3QsCgkJIFFUb29sQmFyICogcGFyZW50LCBjb25zdCBjaGFyKiBuYW1lPTAgKTsKI2VuZGlmCiAgICBRVG9vbEJ1dHRvbiggQXJyb3dUeXBlIHR5cGUsIFFXaWRnZXQgKnBhcmVudCwgY29uc3QgY2hhciogbmFtZT0wICk7CiAgICB+UVRvb2xCdXR0b24oKTsKCiAgICBRU2l6ZSBzaXplSGludCgpIGNvbnN0OwogICAgUVNpemUgbWluaW11bVNpemVIaW50KCkgY29uc3Q7CgojaWZuZGVmIFFUX05PX0NPTVBBVAogICAgdm9pZCBzZXRPbkljb25TZXQoIGNvbnN0IFFJY29uU2V0JiApOwogICAgdm9pZCBzZXRPZmZJY29uU2V0KCBjb25zdCBRSWNvblNldCYgKTsKICAgIHZvaWQgc2V0SWNvblNldCggY29uc3QgUUljb25TZXQgJiwgYm9vbCBvbiApOwogICAgUUljb25TZXQgb25JY29uU2V0KCkgY29uc3Q7CiAgICBRSWNvblNldCBvZmZJY29uU2V0KCApIGNvbnN0OwogICAgUUljb25TZXQgaWNvblNldCggYm9vbCBvbiApIGNvbnN0OwojZW5kaWYKICAgIHZpcnR1YWwgdm9pZCBzZXRJY29uU2V0KCBjb25zdCBRSWNvblNldCAmICk7CiAgICBRSWNvblNldCBpY29uU2V0KCkgY29uc3Q7CgogICAgYm9vbCB1c2VzQmlnUGl4bWFwKCkgY29uc3QgeyByZXR1cm4gdWJwOyB9CiAgICBib29sIHVzZXNUZXh0TGFiZWwoKSBjb25zdCB7IHJldHVybiB1dGw7IH0KICAgIFFTdHJpbmcgdGV4dExhYmVsKCkgY29uc3QgeyByZXR1cm4gdGw7IH0KCiNpZm5kZWYgUVRfTk9fUE9QVVBNRU5VCiAgICB2b2lkIHNldFBvcHVwKCBRUG9wdXBNZW51KiBwb3B1cCApOwogICAgUVBvcHVwTWVudSogcG9wdXAoKSBjb25zdDsKCiAgICB2b2lkIHNldFBvcHVwRGVsYXkoIGludCBkZWxheSApOwogICAgaW50IHBvcHVwRGVsYXkoKSBjb25zdDsKCiAgICB2b2lkIG9wZW5Qb3B1cCgpOwojZW5kaWYKCiAgICB2b2lkIHNldEF1dG9SYWlzZSggYm9vbCBlbmFibGUgKTsKICAgIGJvb2wgYXV0b1JhaXNlKCkgY29uc3Q7CiAgICBUZXh0UG9zaXRpb24gdGV4dFBvc2l0aW9uKCkgY29uc3Q7CgogICAgdm9pZCBzZXRUZXh0KCBjb25zdCBRU3RyaW5nICZ0eHQgKTsKCnB1YmxpYyBzbG90czoKICAgIHZpcnR1YWwgdm9pZCBzZXRVc2VzQmlnUGl4bWFwKCBib29sIGVuYWJsZSApOwogICAgdmlydHVhbCB2b2lkIHNldFVzZXNUZXh0TGFiZWwoIGJvb2wgZW5hYmxlICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0VGV4dExhYmVsKCBjb25zdCBRU3RyaW5nICYsIGJvb2wgKTsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0VG9nZ2xlQnV0dG9uKCBib29sIGVuYWJsZSApOwoKICAgIHZpcnR1YWwgdm9pZCBzZXRPbiggYm9vbCBlbmFibGUgKTsKICAgIHZvaWQgdG9nZ2xlKCk7CiAgICB2b2lkIHNldFRleHRMYWJlbCggY29uc3QgUVN0cmluZyAmICk7CiAgICB2b2lkIHNldFRleHRQb3NpdGlvbiggVGV4dFBvc2l0aW9uIHBvcyApOwoKcHJvdGVjdGVkOgogICAgdm9pZCBtb3VzZVByZXNzRXZlbnQoIFFNb3VzZUV2ZW50ICogKTsKICAgIHZvaWQgZHJhd0J1dHRvbiggUVBhaW50ZXIgKiApOwogICAgdm9pZCBkcmF3QnV0dG9uTGFiZWwoUVBhaW50ZXIgKik7CgogICAgdm9pZCBlbnRlckV2ZW50KCBRRXZlbnQgKiApOwogICAgdm9pZCBsZWF2ZUV2ZW50KCBRRXZlbnQgKiApOwogICAgdm9pZCBtb3ZlRXZlbnQoIFFNb3ZlRXZlbnQgKiApOwoKICAgIC8vICMjIyBNYWtlIHZpcnR1YWwgaW4gNC4wLCBtYXliZSBhY3QgbGlrZSBRUHVzaEJ1dHRvbiB3aXRoCiAgICAvLyByZWdhcmRzIHRvIHNldEZsYXQoKSBpbnN0ZWFkPyAgQW5keQogICAgYm9vbCB1c2VzM0QoKSBjb25zdDsKI2lmIChRVF9WRVJTSU9OID49IDB4MDQwMDAwKQojZXJyb3IgIlNvbWUgZnVuY3Rpb25zIG5lZWQgdG8gYmUgY2hhbmdlZCB0byB2aXJ0dWFsIGZvciBRdCA0LjAiCiNlbmRpZgoKICAgIGJvb2wgZXZlbnRGaWx0ZXIoIFFPYmplY3QgKm8sIFFFdmVudCAqZSApOwoKI2lmbmRlZiBRVF9OT19QQUxFVFRFCiAgICB2b2lkIHBhbGV0dGVDaGFuZ2UoIGNvbnN0IFFQYWxldHRlICYgKTsKI2VuZGlmCgpwcml2YXRlIHNsb3RzOgogICAgdm9pZCBwb3B1cFRpbWVyRG9uZSgpOwogICAgdm9pZCBwb3B1cFByZXNzZWQoKTsKCnByaXZhdGU6CiAgICB2b2lkIGluaXQoKTsKCiAgICBRUGl4bWFwIGJwOwogICAgaW50IGJwSUQ7CiAgICBRUGl4bWFwIHNwOwogICAgaW50IHNwSUQ7CgogICAgUVN0cmluZyB0bDsKCiAgICBRVG9vbEJ1dHRvblByaXZhdGUgKmQ7CiAgICBRSWNvblNldCAqczsKCiAgICB1aW50IHV0bCA6IDE7CiAgICB1aW50IHVicCA6IDE7CiAgICB1aW50IGhhc0Fycm93IDogMTsKCnByaXZhdGU6CS8vIERpc2FibGVkIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPQojaWYgZGVmaW5lZChRX0RJU0FCTEVfQ09QWSkKICAgIFFUb29sQnV0dG9uKCBjb25zdCBRVG9vbEJ1dHRvbiAmICk7CiAgICBRVG9vbEJ1dHRvbiYgb3BlcmF0b3I9KCBjb25zdCBRVG9vbEJ1dHRvbiAmICk7CiNlbmRpZgp9OwoKI2VuZGlmIC8vIFFUX05PX1RPT0xCVVRUT04KCiNlbmRpZiAvLyBRVE9PTEJVVFRPTl9ICgAAABAAcQBzAHQAYQBjAGsALgBoAAAEQS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojaWZuZGVmIFFTVEFDS19ICiNkZWZpbmUgUVNUQUNLX0gKI2lmbmRlZiBRVF9OT19DT01QQVQKI2luY2x1ZGUgInFwdHJzdGFjay5oIgojZW5kaWYKI2VuZGlmCgAAABQAcQB0AG8AbwBsAGIAYQByAC4AaAAADEIvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVRPT0xCQVJfSAojZGVmaW5lIFFUT09MQkFSX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicWRvY2t3aW5kb3cuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fVE9PTEJBUgoKY2xhc3MgUU1haW5XaW5kb3c7CmNsYXNzIFFCdXR0b247CmNsYXNzIFFCb3hMYXlvdXQ7CmNsYXNzIFFUb29sQmFyUHJpdmF0ZTsKCmNsYXNzIFFfRVhQT1JUIFFUb29sQmFyOiBwdWJsaWMgUURvY2tXaW5kb3cKewogICAgUV9PQkpFQ1QKICAgIFFfUFJPUEVSVFkoIFFTdHJpbmcgbGFiZWwgUkVBRCBsYWJlbCBXUklURSBzZXRMYWJlbCApCgpwdWJsaWM6CiAgICBRVG9vbEJhciggY29uc3QgUVN0cmluZyAmbGFiZWwsCgkgICAgICBRTWFpbldpbmRvdyAqLCBUb29sQmFyRG9jayA9IERvY2tUb3AsCgkgICAgICBib29sIG5ld0xpbmUgPSBGQUxTRSwgY29uc3QgY2hhciogbmFtZT0wICk7CiAgICBRVG9vbEJhciggY29uc3QgUVN0cmluZyAmbGFiZWwsIFFNYWluV2luZG93ICosIFFXaWRnZXQgKiwKCSAgICAgIGJvb2wgbmV3TGluZSA9IEZBTFNFLCBjb25zdCBjaGFyKiBuYW1lPTAsIFdGbGFncyBmID0gMCApOwogICAgUVRvb2xCYXIoIFFNYWluV2luZG93KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wICk7CiAgICB+UVRvb2xCYXIoKTsKCiAgICB2b2lkIGFkZFNlcGFyYXRvcigpOwoKICAgIHZvaWQgc2hvdygpOwogICAgdm9pZCBoaWRlKCk7CgogICAgUU1haW5XaW5kb3cgKiBtYWluV2luZG93KCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldFN0cmV0Y2hhYmxlV2lkZ2V0KCBRV2lkZ2V0ICogKTsKCiAgICBib29sIGV2ZW50KCBRRXZlbnQgKiBlICk7CgogICAgdmlydHVhbCB2b2lkIHNldExhYmVsKCBjb25zdCBRU3RyaW5nICYgKTsKICAgIFFTdHJpbmcgbGFiZWwoKSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKTsKCiAgICBRU2l6ZSBtaW5pbXVtU2l6ZSgpIGNvbnN0OwogICAgUVNpemUgbWluaW11bVNpemVIaW50KCkgY29uc3Q7CgogICAgdm9pZCBzZXRPcmllbnRhdGlvbiggT3JpZW50YXRpb24gbyApOwogICAgdm9pZCBzZXRNaW5pbXVtU2l6ZSggaW50IG1pbncsIGludCBtaW5oICk7Cgpwcm90ZWN0ZWQ6CiAgICB2b2lkIHJlc2l6ZUV2ZW50KCBRUmVzaXplRXZlbnQgKmUgKTsKICAgIHZvaWQgc3R5bGVDaGFuZ2UoIFFTdHlsZSAmICk7Cgpwcml2YXRlIHNsb3RzOgogICAgdm9pZCBjcmVhdGVQb3B1cCgpOwoKcHJpdmF0ZToKICAgIHZvaWQgaW5pdCgpOwogICAgdm9pZCBjaGVja0ZvckV4dGVuc2lvbiggY29uc3QgUVNpemUgJnN6ICk7CiAgICBRVG9vbEJhclByaXZhdGUgKiBkOwogICAgUU1haW5XaW5kb3cgKiBtdzsKICAgIFFXaWRnZXQgKiBzdzsKICAgIFFTdHJpbmcgbDsKCiAgICBmcmllbmQgY2xhc3MgUU1haW5XaW5kb3c7Cgpwcml2YXRlOgkvLyBEaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRVG9vbEJhciggY29uc3QgUVRvb2xCYXIgJiApOwogICAgUVRvb2xCYXImIG9wZXJhdG9yPSggY29uc3QgUVRvb2xCYXIgJiApOwojZW5kaWYKfTsKCiNlbmRpZiAvLyBRVF9OT19UT09MQkFSCgojZW5kaWYgLy8gUVRPT0xCQVJfSAoAAAAcAHEAdwBpAGQAZwBlAHQAcwB0AGEAYwBrAC4AaAAAC4wvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFXSURHRVRTVEFDS19ICiNkZWZpbmUgUVdJREdFVFNUQUNLX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicWZyYW1lLmgiCiNpbmNsdWRlICJxaW50ZGljdC5oIgojaW5jbHVkZSAicXB0cmRpY3QuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fV0lER0VUU1RBQ0sKCgpjbGFzcyBRV2lkZ2V0U3RhY2tQcml2YXRlOwoKCmNsYXNzIFFfRVhQT1JUIFFXaWRnZXRTdGFjazogcHVibGljIFFGcmFtZQp7CiAgICBRX09CSkVDVApwdWJsaWM6CiAgICBRV2lkZ2V0U3RhY2soIFFXaWRnZXQqIHBhcmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAgKTsKICAgIFFXaWRnZXRTdGFjayggUVdpZGdldCogcGFyZW50LCBjb25zdCBjaGFyKiBuYW1lLCBXRmxhZ3MgZik7CgogICAgflFXaWRnZXRTdGFjaygpOwoKICAgIGludCBhZGRXaWRnZXQoIFFXaWRnZXQgKiwgaW50ID0gLTEgKTsKICAgIHZvaWQgcmVtb3ZlV2lkZ2V0KCBRV2lkZ2V0ICogKTsKCiAgICBRU2l6ZSBzaXplSGludCgpIGNvbnN0OwogICAgUVNpemUgbWluaW11bVNpemVIaW50KCkgY29uc3Q7CiAgICB2b2lkIHNob3coKTsKCiAgICBRV2lkZ2V0ICogd2lkZ2V0KCBpbnQgKSBjb25zdDsKICAgIGludCBpZCggUVdpZGdldCAqICkgY29uc3Q7CgogICAgUVdpZGdldCAqIHZpc2libGVXaWRnZXQoKSBjb25zdDsKCiAgICB2b2lkIHNldEZyYW1lUmVjdCggY29uc3QgUVJlY3QgJiApOwoKc2lnbmFsczoKICAgIHZvaWQgYWJvdXRUb1Nob3coIGludCApOwogICAgdm9pZCBhYm91dFRvU2hvdyggUVdpZGdldCAqICk7CgpwdWJsaWMgc2xvdHM6CiAgICB2b2lkIHJhaXNlV2lkZ2V0KCBpbnQgKTsKICAgIHZvaWQgcmFpc2VXaWRnZXQoIFFXaWRnZXQgKiApOwoKcHJvdGVjdGVkOgogICAgdm9pZCBmcmFtZUNoYW5nZWQoKTsKICAgIHZvaWQgcmVzaXplRXZlbnQoIFFSZXNpemVFdmVudCAqICk7CgogICAgdmlydHVhbCB2b2lkIHNldENoaWxkR2VvbWV0cmllcygpOwogICAgdm9pZCBjaGlsZEV2ZW50KCBRQ2hpbGRFdmVudCAqICk7Cgpwcml2YXRlOgogICAgdm9pZCBpbml0KCk7CgogICAgUVdpZGdldFN0YWNrUHJpdmF0ZSAqIGQ7CiAgICBRSW50RGljdDxRV2lkZ2V0PiAqIGRpY3Q7CiAgICBRUHRyRGljdDxRV2lkZ2V0PiAqIGZvY3VzV2lkZ2V0czsKICAgIFFXaWRnZXQgKiB0b3BXaWRnZXQ7CiAgICBRV2lkZ2V0ICogaW52aXNpYmxlOwoKcHJpdmF0ZToJLy8gRGlzYWJsZWQgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9CiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUVdpZGdldFN0YWNrKCBjb25zdCBRV2lkZ2V0U3RhY2sgJiApOwogICAgUVdpZGdldFN0YWNrJiBvcGVyYXRvcj0oIGNvbnN0IFFXaWRnZXRTdGFjayAmICk7CiNlbmRpZgp9OwoKI2VuZGlmIC8vIFFUX05PX1dJREdFVFNUQUNLCgojZW5kaWYgLy8gUVdJREdFVFNUQUNLX0gKAAAAIABxAHcAaQBkAGcAZQB0AGYAYQBjAHQAbwByAHkALgBoAAAa5i8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRV0lER0VURkFDVE9SWV9ICiNkZWZpbmUgUVdJREdFVEZBQ1RPUllfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlIDxxc3RyaW5nLmg+CiNpbmNsdWRlIDxxcHRybGlzdC5oPgojaW5jbHVkZSA8cWltYWdlLmg+CiNpbmNsdWRlIDxxcGl4bWFwLmg+CiNpbmNsdWRlIDxxdmFsdWVsaXN0Lmg+CiNpbmNsdWRlIDxxbWFwLmg+CiNpbmNsdWRlIDxxYWN0aW9uLmg+CiNlbmRpZiAvLyBRVF9ICgpjbGFzcyBRRG9tRG9jdW1lbnQ7CmNsYXNzIFFEb21FbGVtZW50OwpjbGFzcyBRTGF5b3V0OwpjbGFzcyBRTGlzdFZpZXc7CmNsYXNzIFFMaXN0Vmlld0l0ZW07CmNsYXNzIFFNZW51QmFyOwpjbGFzcyBRVGFibGU7CmNsYXNzIFFXaWRnZXQ7CmNsYXNzIFFXaWRnZXRGYWN0b3J5UHJpdmF0ZTsKY2xhc3MgVWliU3RyVGFibGU7CgpjbGFzcyBRV2lkZ2V0RmFjdG9yeQp7CnB1YmxpYzoKICAgIFFXaWRnZXRGYWN0b3J5KCk7CiAgICB2aXJ0dWFsIH5RV2lkZ2V0RmFjdG9yeSgpOwoKICAgIHN0YXRpYyBRV2lkZ2V0ICpjcmVhdGUoIGNvbnN0IFFTdHJpbmcgJnVpRmlsZSwgUU9iamVjdCAqY29ubmVjdG9yID0gMCwgUVdpZGdldCAqcGFyZW50ID0gMCwgY29uc3QgY2hhciAqbmFtZSA9IDAgKTsKICAgIHN0YXRpYyBRV2lkZ2V0ICpjcmVhdGUoIFFJT0RldmljZSAqZGV2LCBRT2JqZWN0ICpjb25uZWN0b3IgPSAwLCBRV2lkZ2V0ICpwYXJlbnQgPSAwLCBjb25zdCBjaGFyICpuYW1lID0gMCApOwogICAgc3RhdGljIHZvaWQgYWRkV2lkZ2V0RmFjdG9yeSggUVdpZGdldEZhY3RvcnkgKmZhY3RvcnkgKTsKICAgIHN0YXRpYyB2b2lkIGxvYWRJbWFnZXMoIGNvbnN0IFFTdHJpbmcgJmRpciApOwoKICAgIHZpcnR1YWwgUVdpZGdldCAqY3JlYXRlV2lkZ2V0KCBjb25zdCBRU3RyaW5nICZjbGFzc05hbWUsIFFXaWRnZXQgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSApIGNvbnN0OwogICAgc3RhdGljIFFTdHJpbmdMaXN0IHdpZGdldHMoKTsKICAgIHN0YXRpYyBib29sIHN1cHBvcnRzV2lkZ2V0KCBjb25zdCBRU3RyaW5nICZ3aWRnZXQgKTsKCnByaXZhdGU6CiAgICBlbnVtIExheW91dFR5cGUgeyBIQm94LCBWQm94LCBHcmlkLCBOb0xheW91dCB9OwogICAgdm9pZCBsb2FkSW1hZ2VDb2xsZWN0aW9uKCBjb25zdCBRRG9tRWxlbWVudCAmZSApOwogICAgdm9pZCBsb2FkQ29ubmVjdGlvbnMoIGNvbnN0IFFEb21FbGVtZW50ICZlLCBRT2JqZWN0ICpjb25uZWN0b3IgKTsKICAgIHZvaWQgbG9hZFRhYk9yZGVyKCBjb25zdCBRRG9tRWxlbWVudCAmZSApOwogICAgUVdpZGdldCAqY3JlYXRlV2lkZ2V0SW50ZXJuYWwoIGNvbnN0IFFEb21FbGVtZW50ICZlLCBRV2lkZ2V0ICpwYXJlbnQsIFFMYXlvdXQqIGxheW91dCwgY29uc3QgUVN0cmluZyAmY2xhc3NOYW1lQXJnICk7CiAgICBRTGF5b3V0ICpjcmVhdGVMYXlvdXQoIFFXaWRnZXQgKndpZGdldCwgUUxheW91dCogIGxheW91dCwgTGF5b3V0VHlwZSB0eXBlLCBib29sIGlzUUxheW91dFdpZGdldCA9IEZBTFNFICk7CiAgICBMYXlvdXRUeXBlIGxheW91dFR5cGUoIFFMYXlvdXQgKmwgKSBjb25zdDsKICAgIHZvaWQgc2V0UHJvcGVydHkoIFFPYmplY3QqIHdpZGdldCwgY29uc3QgUVN0cmluZyAmcHJvcCwgUVZhcmlhbnQgdmFsdWUgKTsKICAgIHZvaWQgc2V0UHJvcGVydHkoIFFPYmplY3QqIHdpZGdldCwgY29uc3QgUVN0cmluZyAmcHJvcCwgY29uc3QgUURvbUVsZW1lbnQgJmUgKTsKICAgIHZvaWQgY3JlYXRlU3BhY2VyKCBjb25zdCBRRG9tRWxlbWVudCAmZSwgUUxheW91dCAqbGF5b3V0ICk7CiAgICBRSW1hZ2UgbG9hZEZyb21Db2xsZWN0aW9uKCBjb25zdCBRU3RyaW5nICZuYW1lICk7CiAgICBRUGl4bWFwIGxvYWRQaXhtYXAoIGNvbnN0IFFTdHJpbmcgJm5hbWUgKTsKICAgIFFQaXhtYXAgbG9hZFBpeG1hcCggY29uc3QgUURvbUVsZW1lbnQgJmUgKTsKICAgIFFDb2xvckdyb3VwIGxvYWRDb2xvckdyb3VwKCBjb25zdCBRRG9tRWxlbWVudCAmZSApOwogICAgdm9pZCBjcmVhdGVMaXN0Vmlld0NvbHVtbiggUUxpc3RWaWV3ICpsdiwgY29uc3QgUVN0cmluZyYgdHh0LAoJCQkgICAgICAgY29uc3QgUVBpeG1hcCYgcGl4LCBib29sIGNsaWNrYWJsZSwKCQkJICAgICAgIGJvb2wgcmVzaXphYmxlICk7CiNpZm5kZWYgUVRfTk9fVEFCTEUKICAgIHZvaWQgY3JlYXRlVGFibGVDb2x1bW5PclJvdyggUVRhYmxlICp0YWJsZSwgY29uc3QgUVN0cmluZyYgdHh0LAoJCQkJIGNvbnN0IFFQaXhtYXAmIHBpeCwgY29uc3QgUVN0cmluZyYgZmllbGQsCgkJCQkgYm9vbCBpc1JvdyApOwojZW5kaWYKICAgIHZvaWQgY3JlYXRlQ29sdW1uKCBjb25zdCBRRG9tRWxlbWVudCAmZSwgUVdpZGdldCAqd2lkZ2V0ICk7CiAgICB2b2lkIGxvYWRJdGVtKCBjb25zdCBRRG9tRWxlbWVudCAmZSwgUVBpeG1hcCAmcGl4LCBRU3RyaW5nICZ0eHQsIGJvb2wgJmhhc1BpeG1hcCApOwogICAgdm9pZCBjcmVhdGVJdGVtKCBjb25zdCBRRG9tRWxlbWVudCAmZSwgUVdpZGdldCAqd2lkZ2V0LCBRTGlzdFZpZXdJdGVtICppID0gMCApOwogICAgdm9pZCBsb2FkQ2hpbGRBY3Rpb24oIFFPYmplY3QgKnBhcmVudCwgY29uc3QgUURvbUVsZW1lbnQgJmUgKTsKICAgIHZvaWQgbG9hZEFjdGlvbnMoIGNvbnN0IFFEb21FbGVtZW50ICZlICk7CiAgICB2b2lkIGxvYWRUb29sQmFycyggY29uc3QgUURvbUVsZW1lbnQgJmUgKTsKICAgIHZvaWQgbG9hZE1lbnVCYXIoIGNvbnN0IFFEb21FbGVtZW50ICZlICk7CiAgICB2b2lkIGxvYWRQb3B1cE1lbnUoIFFQb3B1cE1lbnUgKnAsIGNvbnN0IFFEb21FbGVtZW50ICZlICk7CiAgICB2b2lkIGxvYWRGdW5jdGlvbnMoIGNvbnN0IFFEb21FbGVtZW50ICZlICk7CiAgICBRQWN0aW9uICpmaW5kQWN0aW9uKCBjb25zdCBRU3RyaW5nICZuYW1lICk7CiAgICB2b2lkIGxvYWRFeHRyYVNvdXJjZSgpOwogICAgUVN0cmluZyB0cmFuc2xhdGUoIGNvbnN0IGNoYXIgKnNvdXJjZVRleHQsIGNvbnN0IGNoYXIgKmNvbW1lbnQgPSAiIiApOwogICAgUVN0cmluZyB0cmFuc2xhdGUoIGNvbnN0IFFTdHJpbmcmIHNvdXJjZVRleHQsIGNvbnN0IFFTdHJpbmcmIGNvbW1lbnQgPSBRU3RyaW5nOjpudWxsICk7CgogICAgdm9pZCB1bnBhY2tVSW50MTYoIFFEYXRhU3RyZWFtJiBpbiwgUV9VSU5UMTYmIG4gKTsKICAgIHZvaWQgdW5wYWNrVUludDMyKCBRRGF0YVN0cmVhbSYgaW4sIFFfVUlOVDMyJiBuICk7CiAgICB2b2lkIHVucGFja0J5dGVBcnJheSggUURhdGFTdHJlYW0mIGluLCBRQnl0ZUFycmF5JiBhcnJheSApOwogICAgdm9pZCB1bnBhY2tDU3RyaW5nKCBjb25zdCBVaWJTdHJUYWJsZSYgc3RyaW5ncywgUURhdGFTdHJlYW0mIGluLAoJCQlRQ1N0cmluZyYgY3N0ciApOwogICAgdm9pZCB1bnBhY2tTdHJpbmcoIGNvbnN0IFVpYlN0clRhYmxlJiBzdHJpbmdzLCBRRGF0YVN0cmVhbSYgaW4sCgkJICAgICAgIFFTdHJpbmcmIHN0ciApOwogICAgdm9pZCB1bnBhY2tTdHJpbmdTcGxpdCggY29uc3QgVWliU3RyVGFibGUmIHN0cmluZ3MsIFFEYXRhU3RyZWFtJiBpbiwKCQkJICAgIFFTdHJpbmcmIHN0ciApOwogICAgdm9pZCB1bnBhY2tWYXJpYW50KCBjb25zdCBVaWJTdHJUYWJsZSYgc3RyaW5ncywgUURhdGFTdHJlYW0mIGluLAoJCQlRVmFyaWFudCYgdmFsdWUgKTsKICAgIHZvaWQgaW5wdXRTcGFjZXIoIGNvbnN0IFVpYlN0clRhYmxlJiBzdHJpbmdzLCBRRGF0YVN0cmVhbSYgaW4sCgkJICAgICAgUUxheW91dCAqcGFyZW50ICk7CiAgICB2b2lkIGlucHV0Q29sdW1uT3JSb3coIGNvbnN0IFVpYlN0clRhYmxlJiBzdHJpbmdzLCBRRGF0YVN0cmVhbSYgaW4sCgkJCSAgIFFPYmplY3QgKnBhcmVudCwgYm9vbCBpc1JvdyApOwogICAgdm9pZCBpbnB1dEl0ZW0oIGNvbnN0IFVpYlN0clRhYmxlJiBzdHJpbmdzLCBRRGF0YVN0cmVhbSYgaW4sCgkJICAgIFFPYmplY3QgKnBhcmVudCwgUUxpc3RWaWV3SXRlbSAqcGFyZW50SXRlbSA9IDAgKTsKICAgIHZvaWQgaW5wdXRNZW51SXRlbSggUU9iamVjdCAqKm9iamVjdHMsIGNvbnN0IFVpYlN0clRhYmxlJiBzdHJpbmdzLAoJCQlRRGF0YVN0cmVhbSYgaW4sIFFNZW51QmFyICptZW51QmFyICk7CiAgICBRT2JqZWN0ICppbnB1dE9iamVjdCggUU9iamVjdCAqKm9iamVjdHMsIGludCYgbnVtT2JqZWN0cywKCQkJICBjb25zdCBVaWJTdHJUYWJsZSYgc3RyaW5ncywgUURhdGFTdHJlYW0mIGluLAoJCQkgIFFXaWRnZXQgKmFuY2VzdG9yV2lkZ2V0LCBRT2JqZWN0ICpwYXJlbnQsCgkJCSAgUUNTdHJpbmcgY2xhc3NOYW1lID0gIiIgKTsKICAgIFFXaWRnZXQgKmNyZWF0ZUZyb21VaUZpbGUoIFFEb21Eb2N1bWVudCBkb2MsIFFPYmplY3QgKmNvbm5lY3RvciwKCQkJICAgICAgIFFXaWRnZXQgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSApOwogICAgUVdpZGdldCAqY3JlYXRlRnJvbVVpYkZpbGUoIFFEYXRhU3RyZWFtJiBpbiwgUU9iamVjdCAqY29ubmVjdG9yLAoJCQkJUVdpZGdldCAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lICk7Cgpwcml2YXRlOgogICAgc3RydWN0IEltYWdlIHsKCVFJbWFnZSBpbWc7CglRU3RyaW5nIG5hbWU7Cglib29sIG9wZXJhdG9yPT0oICBjb25zdCBJbWFnZSAmaSApIGNvbnN0IHsKCSAgICByZXR1cm4gKCBpLm5hbWUgPT0gbmFtZSAmJgoJCSAgICAgaS5pbWcgPT0gaW1nICk7Cgl9CiAgICB9OwoKICAgIHN0cnVjdCBGaWVsZAogICAgewoJRmllbGQoKSB7fQoJRmllbGQoIGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBRUGl4bWFwICZwLCBjb25zdCBRU3RyaW5nICZzMiApIDogbmFtZSggczEgKSwgcGl4KCBwICksIGZpZWxkKCBzMiApIHt9CglRU3RyaW5nIG5hbWU7CglRUGl4bWFwIHBpeDsKCVFTdHJpbmcgZmllbGQ7CglRX0RVTU1ZX0NPTVBBUklTT05fT1BFUkFUT1IoIEZpZWxkICkKICAgIH07CgogICAgc3RydWN0IFNxbFdpZGdldENvbm5lY3Rpb24KICAgIHsKCVNxbFdpZGdldENvbm5lY3Rpb24oKSB7fQoJU3FsV2lkZ2V0Q29ubmVjdGlvbiggY29uc3QgUVN0cmluZyAmYywgY29uc3QgUVN0cmluZyAmdCApCgkgICAgOiBjb25uKCBjICksIHRhYmxlKCB0ICksIGRiQ29udHJvbHMoIG5ldyBRTWFwPFFTdHJpbmcsIFFTdHJpbmc+KCkgKSB7fQoJUVN0cmluZyBjb25uOwoJUVN0cmluZyB0YWJsZTsKCVFNYXA8UVN0cmluZywgUVN0cmluZz4gKmRiQ29udHJvbHM7CglRX0RVTU1ZX0NPTVBBUklTT05fT1BFUkFUT1IoIFNxbFdpZGdldENvbm5lY3Rpb24gKQogICAgfTsKCiAgICBRVmFsdWVMaXN0PEltYWdlPiBpbWFnZXM7CiAgICBRV2lkZ2V0ICp0b3BsZXZlbDsKICAgIFFXaWRnZXRGYWN0b3J5UHJpdmF0ZSAqZDsKICAgIFFNYXA8UVN0cmluZywgUVN0cmluZz4gKmRiQ29udHJvbHM7CiAgICBRTWFwPFFTdHJpbmcsIFFTdHJpbmdMaXN0PiBkYlRhYmxlczsKICAgIFFNYXA8UVdpZGdldCosIFNxbFdpZGdldENvbm5lY3Rpb24+IHNxbFdpZGdldENvbm5lY3Rpb25zOwogICAgUU1hcDxRU3RyaW5nLCBRU3RyaW5nPiBidWRkaWVzOwogICAgUU1hcDxRVGFibGUqLCBRVmFsdWVMaXN0PEZpZWxkPiA+IGZpZWxkTWFwczsKICAgIFFQdHJMaXN0PFFBY3Rpb24+IGFjdGlvbkxpc3Q7CiAgICBRTWFwPFFTdHJpbmcsIFFTdHJpbmc+IGxhbmd1YWdlU2xvdHM7CiAgICBRU3RyaW5nTGlzdCBub0RhdGFiYXNlV2lkZ2V0czsKICAgIGJvb2wgdXNlUGl4bWFwQ29sbGVjdGlvbjsKICAgIGludCBkZWZNYXJnaW47CiAgICBpbnQgZGVmU3BhY2luZzsKICAgIFFTdHJpbmcgY29kZTsKICAgIFFTdHJpbmcgdWlGaWxlVmVyc2lvbjsKfTsKCiNlbmRpZgoAAAAeAHEAdwBpAG4AZABvAHcAcwBzAHQAeQBsAGUALgBoAAAPGy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdJTkRPV1NTVFlMRV9ICiNkZWZpbmUgUVdJTkRPV1NTVFlMRV9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFjb21tb25zdHlsZS5oIgojZW5kaWYgLy8gUVRfSAoKI2lmICFkZWZpbmVkKFFUX05PX1NUWUxFX1dJTkRPV1MpIHx8IGRlZmluZWQoUVRfUExVR0lOKQoKI2lmIGRlZmluZWQoUVRfUExVR0lOKQojZGVmaW5lIFFfRVhQT1JUX1NUWUxFX1dJTkRPV1MKI2Vsc2UKI2RlZmluZSBRX0VYUE9SVF9TVFlMRV9XSU5ET1dTIFFfRVhQT1JUCiNlbmRpZgoKCmNsYXNzIFFfRVhQT1JUX1NUWUxFX1dJTkRPV1MgUVdpbmRvd3NTdHlsZSA6IHB1YmxpYyBRQ29tbW9uU3R5bGUKewogICAgUV9PQkpFQ1QKcHVibGljOgogICAgUVdpbmRvd3NTdHlsZSgpOwogICAgflFXaW5kb3dzU3R5bGUoKTsKCiAgICB2b2lkIHBvbGlzaChRQXBwbGljYXRpb24qKTsKICAgIHZvaWQgdW5Qb2xpc2goUUFwcGxpY2F0aW9uKik7CgogICAgdm9pZCBwb2xpc2goUVdpZGdldCopOwogICAgdm9pZCB1blBvbGlzaChRV2lkZ2V0Kik7CgogICAgdm9pZCBwb2xpc2goIFFQYWxldHRlICYgKTsKCiAgICB2aXJ0dWFsIHZvaWQgcG9saXNoUG9wdXBNZW51KCBRUG9wdXBNZW51KiApOwoKICAgIC8vIG5ldyBzdHVmZgogICAgdm9pZCBkcmF3UHJpbWl0aXZlKCBQcmltaXRpdmVFbGVtZW50IHBlLAoJCQlRUGFpbnRlciAqcCwKCQkJY29uc3QgUVJlY3QgJnIsCgkJCWNvbnN0IFFDb2xvckdyb3VwICZjZywKCQkJU0ZsYWdzIGZsYWdzID0gU3R5bGVfRGVmYXVsdCwKCQkJY29uc3QgUVN0eWxlT3B0aW9uJiA9IFFTdHlsZU9wdGlvbjo6RGVmYXVsdCApIGNvbnN0OwoKICAgIHZvaWQgZHJhd0NvbnRyb2woIENvbnRyb2xFbGVtZW50IGVsZW1lbnQsCgkJICAgICAgUVBhaW50ZXIgKnAsCgkJICAgICAgY29uc3QgUVdpZGdldCAqd2lkZ2V0LAoJCSAgICAgIGNvbnN0IFFSZWN0ICZyLAoJCSAgICAgIGNvbnN0IFFDb2xvckdyb3VwICZjZywKCQkgICAgICBTRmxhZ3MgZmxhZ3MgPSBTdHlsZV9EZWZhdWx0LAoJCSAgICAgIGNvbnN0IFFTdHlsZU9wdGlvbiYgPSBRU3R5bGVPcHRpb246OkRlZmF1bHQgKSBjb25zdDsKCiAgICB2b2lkIGRyYXdDb21wbGV4Q29udHJvbCggQ29tcGxleENvbnRyb2wgY29udHJvbCwKCQkJICAgICBRUGFpbnRlciogcCwKCQkJICAgICBjb25zdCBRV2lkZ2V0KiB3aWRnZXQsCgkJCSAgICAgY29uc3QgUVJlY3QmIHIsCgkJCSAgICAgY29uc3QgUUNvbG9yR3JvdXAmIGNnLAoJCQkgICAgIFNGbGFncyBmbGFncyA9IFN0eWxlX0RlZmF1bHQsCiNpZmRlZiBRX1FET0MKCQkJICAgICBTQ0ZsYWdzIHN1YiA9IFNDX0FsbCwKI2Vsc2UKCQkJICAgICBTQ0ZsYWdzIHN1YiA9ICh1aW50KVNDX0FsbCwKI2VuZGlmCgkJCSAgICAgU0NGbGFncyBzdWJBY3RpdmUgPSBTQ19Ob25lLAoJCQkgICAgIGNvbnN0IFFTdHlsZU9wdGlvbiYgPSBRU3R5bGVPcHRpb246OkRlZmF1bHQgKSBjb25zdDsKCiAgICBpbnQgcGl4ZWxNZXRyaWMoIFBpeGVsTWV0cmljIG1ldHJpYywKCQkgICAgIGNvbnN0IFFXaWRnZXQgKndpZGdldCA9IDAgKSBjb25zdDsKCiAgICBRU2l6ZSBzaXplRnJvbUNvbnRlbnRzKCBDb250ZW50c1R5cGUgY29udGVudHMsCgkJCSAgICBjb25zdCBRV2lkZ2V0ICp3aWRnZXQsCgkJCSAgICBjb25zdCBRU2l6ZSAmY29udGVudHNTaXplLAoJCQkgICAgY29uc3QgUVN0eWxlT3B0aW9uJiA9IFFTdHlsZU9wdGlvbjo6RGVmYXVsdCApIGNvbnN0OwoKICAgIGludCBzdHlsZUhpbnQoU3R5bGVIaW50IHNoLCBjb25zdCBRV2lkZ2V0ICosIGNvbnN0IFFTdHlsZU9wdGlvbiAmID0gUVN0eWxlT3B0aW9uOjpEZWZhdWx0LAoJCSAgUVN0eWxlSGludFJldHVybiogPSAwKSBjb25zdDsKCiAgICBRUGl4bWFwIHN0eWxlUGl4bWFwKCBTdHlsZVBpeG1hcCBzdHlsZXBpeG1hcCwKCQkJIGNvbnN0IFFXaWRnZXQgKndpZGdldCA9IDAsCgkJCSBjb25zdCBRU3R5bGVPcHRpb24mID0gUVN0eWxlT3B0aW9uOjpEZWZhdWx0ICkgY29uc3Q7CgogICAgUVJlY3Qgc3ViUmVjdCggU3ViUmVjdCByLCBjb25zdCBRV2lkZ2V0ICp3aWRnZXQgKSBjb25zdDsKCgpwcml2YXRlOgogICAgY2xhc3MgUHJpdmF0ZTsKICAgIFByaXZhdGUgKmQ7CgogICAgLy8gRGlzYWJsZWQgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9CiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUVdpbmRvd3NTdHlsZSggY29uc3QgUVdpbmRvd3NTdHlsZSAmICk7CiAgICBRV2luZG93c1N0eWxlJiBvcGVyYXRvcj0oIGNvbnN0IFFXaW5kb3dzU3R5bGUgJiApOwojZW5kaWYKfTsKCiNlbmRpZiAvLyBRVF9OT19TVFlMRV9XSU5ET1dTCgojZW5kaWYgLy8gUVdJTkRPV1NTVFlMRV9ICgAAABIAcQB3AGkAegBhAHIAZAAuAGgAAA7xLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdJWkFSRERJQUxPR19ICiNkZWZpbmUgUVdJWkFSRERJQUxPR19ICgoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxZGlhbG9nLmgiCiNlbmRpZiAvLyBRVF9ICgojaWZuZGVmIFFUX05PX1dJWkFSRAoKY2xhc3MgUUhCb3hMYXlvdXQ7CmNsYXNzIFFXaXphcmRQcml2YXRlOwoKY2xhc3MgUV9FWFBPUlQgUVdpemFyZCA6IHB1YmxpYyBRRGlhbG9nCnsKICAgIFFfT0JKRUNUCiAgICBRX1BST1BFUlRZKCBRRm9udCB0aXRsZUZvbnQgUkVBRCB0aXRsZUZvbnQgV1JJVEUgc2V0VGl0bGVGb250ICkKCnB1YmxpYzoKICAgIFFXaXphcmQoIFFXaWRnZXQqIHBhcmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAsIGJvb2wgbW9kYWw9RkFMU0UsCgkgICAgIFdGbGFncyBmPTAgKTsKICAgIH5RV2l6YXJkKCk7CgogICAgdm9pZCBzaG93KCk7CgogICAgdm9pZCBzZXRGb250KCBjb25zdCBRRm9udCAmIGZvbnQgKTsKCiAgICB2aXJ0dWFsIHZvaWQgYWRkUGFnZSggUVdpZGdldCAqLCBjb25zdCBRU3RyaW5nICYgKTsKICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRQYWdlKCBRV2lkZ2V0KiwgY29uc3QgUVN0cmluZyYsIGludCApOwogICAgdmlydHVhbCB2b2lkIHJlbW92ZVBhZ2UoIFFXaWRnZXQgKiApOwoKICAgIFFTdHJpbmcgdGl0bGUoIFFXaWRnZXQgKiApIGNvbnN0OwogICAgdm9pZCBzZXRUaXRsZSggUVdpZGdldCAqLCBjb25zdCBRU3RyaW5nICYgKTsKICAgIFFGb250IHRpdGxlRm9udCgpIGNvbnN0OwogICAgdm9pZCBzZXRUaXRsZUZvbnQoIGNvbnN0IFFGb250ICYgKTsKCiAgICB2aXJ0dWFsIHZvaWQgc2hvd1BhZ2UoIFFXaWRnZXQgKiApOwoKICAgIFFXaWRnZXQgKiBjdXJyZW50UGFnZSgpIGNvbnN0OwoKICAgIFFXaWRnZXQqIHBhZ2UoIGludCApIGNvbnN0OwogICAgaW50IHBhZ2VDb3VudCgpIGNvbnN0OwogICAgaW50IGluZGV4T2YoIFFXaWRnZXQqICkgY29uc3Q7CgogICAgdmlydHVhbCBib29sIGFwcHJvcHJpYXRlKCBRV2lkZ2V0ICogKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRBcHByb3ByaWF0ZSggUVdpZGdldCAqLCBib29sICk7CgogICAgUVB1c2hCdXR0b24gKiBiYWNrQnV0dG9uKCkgY29uc3Q7CiAgICBRUHVzaEJ1dHRvbiAqIG5leHRCdXR0b24oKSBjb25zdDsKICAgIFFQdXNoQnV0dG9uICogZmluaXNoQnV0dG9uKCkgY29uc3Q7CiAgICBRUHVzaEJ1dHRvbiAqIGNhbmNlbEJ1dHRvbigpIGNvbnN0OwogICAgUVB1c2hCdXR0b24gKiBoZWxwQnV0dG9uKCkgY29uc3Q7CgogICAgYm9vbCBldmVudEZpbHRlciggUU9iamVjdCAqLCBRRXZlbnQgKiApOwoKcHVibGljIHNsb3RzOgogICAgdmlydHVhbCB2b2lkIHNldEJhY2tFbmFibGVkKCBRV2lkZ2V0ICosIGJvb2wgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXROZXh0RW5hYmxlZCggUVdpZGdldCAqLCBib29sICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0RmluaXNoRW5hYmxlZCggUVdpZGdldCAqLCBib29sICk7CgogICAgdmlydHVhbCB2b2lkIHNldEhlbHBFbmFibGVkKCBRV2lkZ2V0ICosIGJvb2wgKTsKCiAgICAvLyBvYnNvbGV0ZQogICAgdmlydHVhbCB2b2lkIHNldEZpbmlzaCggIFFXaWRnZXQgKiwgYm9vbCApIHt9Cgpwcm90ZWN0ZWQgc2xvdHM6CiAgICB2aXJ0dWFsIHZvaWQgYmFjaygpOwogICAgdmlydHVhbCB2b2lkIG5leHQoKTsKICAgIHZpcnR1YWwgdm9pZCBoZWxwKCk7CgpzaWduYWxzOgogICAgdm9pZCBoZWxwQ2xpY2tlZCgpOwogICAgdm9pZCBzZWxlY3RlZCggY29uc3QgUVN0cmluZyYgKTsKCnByb3RlY3RlZDoKICAgIHZpcnR1YWwgdm9pZCBsYXlPdXRCdXR0b25Sb3coIFFIQm94TGF5b3V0ICogKTsKICAgIHZpcnR1YWwgdm9pZCBsYXlPdXRUaXRsZVJvdyggUUhCb3hMYXlvdXQgKiwgY29uc3QgUVN0cmluZyAmICk7Cgpwcml2YXRlOgogICAgdm9pZCBzZXRCYWNrRW5hYmxlZCggYm9vbCApOwogICAgdm9pZCBzZXROZXh0RW5hYmxlZCggYm9vbCApOwoKICAgIHZvaWQgc2V0SGVscEVuYWJsZWQoIGJvb2wgKTsKCiAgICB2b2lkIHNldE5leHRQYWdlKCBRV2lkZ2V0ICogKTsKCiAgICB2b2lkIHVwZGF0ZUJ1dHRvbnMoKTsKCiAgICB2b2lkIGxheU91dCgpOwoKICAgIFFXaXphcmRQcml2YXRlICpkOwoKcHJpdmF0ZToJLy8gRGlzYWJsZWQgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9CiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUVdpemFyZCggY29uc3QgUVdpemFyZCAmICk7CiAgICBRV2l6YXJkJiBvcGVyYXRvcj0oIGNvbnN0IFFXaXphcmQgJiApOwojZW5kaWYKfTsKCiNlbmRpZiAvLyBRVF9OT19XSVpBUkQKCiNlbmRpZiAvLyBRV0laQVJEX0gKAAAAMABxAHcAcwBoAHkAZAByAG8AZABlAGMAbwByAGEAdABpAG8AbgBfAHEAdwBzAC4AaAAACIYvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRV1NIWURST0RFQ09SQVRJT05fUVdTX0gKI2RlZmluZSBRV1NIWURST0RFQ09SQVRJT05fUVdTX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXdzZGVmYXVsdGRlY29yYXRpb25fcXdzLmgiCiNlbmRpZiAvLyBRVF9ICgoKI2lmbmRlZiBRVF9OT19RV1NfSFlEUk9fV01fU1RZTEUKCgpjbGFzcyBRV1NIeWRyb0RlY29yYXRpb24gOiBwdWJsaWMgUVdTRGVmYXVsdERlY29yYXRpb24KewpwdWJsaWM6CiAgICBRV1NIeWRyb0RlY29yYXRpb24oKTsKICAgIHZpcnR1YWwgflFXU0h5ZHJvRGVjb3JhdGlvbigpOwoKICAgIHZpcnR1YWwgUVJlZ2lvbiByZWdpb24oY29uc3QgUVdpZGdldCAqLCBjb25zdCBRUmVjdCAmcmVjdCwgUmVnaW9uKTsKICAgIHZpcnR1YWwgdm9pZCBwYWludChRUGFpbnRlciAqLCBjb25zdCBRV2lkZ2V0ICopOwogICAgdmlydHVhbCB2b2lkIHBhaW50QnV0dG9uKFFQYWludGVyICosIGNvbnN0IFFXaWRnZXQgKiwgUmVnaW9uLCBpbnQgc3RhdGUpOwpwcm90ZWN0ZWQ6Ci8vICAgIHZpcnR1YWwgaW50IGdldFRpdGxlV2lkdGgoY29uc3QgUVdpZGdldCAqKTsKICAgIHZpcnR1YWwgaW50IGdldFRpdGxlSGVpZ2h0KGNvbnN0IFFXaWRnZXQgKik7CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiptZW51UGl4bWFwKCk7CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKipjbG9zZVBpeG1hcCgpOwogICAgdmlydHVhbCBjb25zdCBjaGFyICoqbWluaW1pemVQaXhtYXAoKTsKICAgIHZpcnR1YWwgY29uc3QgY2hhciAqKm1heGltaXplUGl4bWFwKCk7CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKipub3JtYWxpemVQaXhtYXAoKTsKfTsKCiNlbmRpZiAvLyBRVF9OT19RV1NfSFlEUk9fV01fU1RZTEUKCiNlbmRpZiAvLyBRV1NIWURST0RFQ09SQVRJT05fUVdTX0gKAAAACgBxAHgAdAAuAGgAAAtRLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFYVF9ICiNkZWZpbmUgUVhUX0gKCiNpbmNsdWRlIDxxYXBwbGljYXRpb24uaD4KI2luY2x1ZGUgPHF3aWRnZXQuaD4KCiNpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+CgojaWZkZWYgQm9vbAojdW5kZWYgQm9vbAojZW5kaWYgLy8gQm9vbAoKY2xhc3MgUVh0QXBwbGljYXRpb24gOiBwdWJsaWMgUUFwcGxpY2F0aW9uIHsKICAgIFFfT0JKRUNUCiAgICB2b2lkIGluaXQoKTsKCnB1YmxpYzoKICAgIFFYdEFwcGxpY2F0aW9uKGludCYgYXJnYywgY2hhcioqIGFyZ3YsCgljb25zdCBjaGFyKiBhcHBjbGFzcz0wLAoJWHJtT3B0aW9uRGVzY1JlYyAqb3B0aW9ucz0wLCBpbnQgbnVtX29wdGlvbnM9MCwKCWNvbnN0IGNoYXIqKiByZXNvdXJjZXM9MCk7CiAgICBRWHRBcHBsaWNhdGlvbihEaXNwbGF5ICosIEhBTkRMRSA9IDAsIEhBTkRMRSA9IDApOwogICAgUVh0QXBwbGljYXRpb24oRGlzcGxheSAqLCBpbnQsIGNoYXIgKiosIEhBTkRMRSA9IDAsIEhBTkRMRSA9IDApOwogICAgflFYdEFwcGxpY2F0aW9uKCk7Cn07CgpjbGFzcyBRWHRXaWRnZXQgOiBwdWJsaWMgUVdpZGdldCB7CiAgICBRX09CSkVDVAogICAgV2lkZ2V0IHh0dzsKICAgIFdpZGdldCB4dHBhcmVudDsKICAgIGJvb2wgICBuZWVkX3Jlcm9vdDsKICAgIHZvaWQgaW5pdChjb25zdCBjaGFyKiBuYW1lLCBXaWRnZXRDbGFzcyB3aWRnZXRfY2xhc3MsCgkJICAgIFdpZGdldCBwYXJlbnQsIFFXaWRnZXQqIHFwYXJlbnQsCgkJICAgIEFyZ0xpc3QgYXJncywgQ2FyZGluYWwgbnVtX2FyZ3MsCgkJICAgIGJvb2wgbWFuYWdlZCk7CiAgICBmcmllbmQgdm9pZCBxd2lkZ2V0X3JlYWxpemUoIFdpZGdldCB3aWRnZXQsIFh0VmFsdWVNYXNrKiBtYXNrLAoJCQkJIFhTZXRXaW5kb3dBdHRyaWJ1dGVzKiBhdHRyaWJ1dGVzICk7CgpwdWJsaWM6CiAgICBRWHRXaWRnZXQoY29uc3QgY2hhciogbmFtZSwgV2lkZ2V0IHBhcmVudCwgYm9vbCBtYW5hZ2VkPUZBTFNFKTsKICAgIFFYdFdpZGdldChjb25zdCBjaGFyKiBuYW1lLCBXaWRnZXRDbGFzcyB3aWRnZXRfY2xhc3MsCgkgICAgICBRV2lkZ2V0ICpwYXJlbnQ9MCwgQXJnTGlzdCBhcmdzPTAsIENhcmRpbmFsIG51bV9hcmdzPTAsCgkgICAgICBib29sIG1hbmFnZWQ9RkFMU0UpOwogICAgflFYdFdpZGdldCgpOwoKICAgIFdpZGdldCB4dFdpZGdldCgpIGNvbnN0IHsgcmV0dXJuIHh0dzsgfQogICAgYm9vbCBpc0FjdGl2ZVdpbmRvdygpIGNvbnN0OwogICAgdm9pZCBzZXRBY3RpdmVXaW5kb3coKTsKCnByb3RlY3RlZDoKICAgIHZvaWQgbW92ZUV2ZW50KCBRTW92ZUV2ZW50KiApOwogICAgdm9pZCByZXNpemVFdmVudCggUVJlc2l6ZUV2ZW50KiApOwogICAgYm9vbCB4MTFFdmVudCggWEV2ZW50ICogKTsKfTsKCiNlbmRpZgoAAAAYAHEAdABhAGIAdwBpAGQAZwBlAHQALgBoAAATQi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFUQUJXSURHRVRfSAojZGVmaW5lIFFUQUJXSURHRVRfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxd2lkZ2V0LmgiCiNpbmNsdWRlICJxaWNvbnNldC5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19UQUJXSURHRVQKCmNsYXNzIFFUYWJCYXI7CmNsYXNzIFFUYWJXaWRnZXREYXRhOwpjbGFzcyBRVGFiOwpjbGFzcyBRV2lkZ2V0U3RhY2s7CgoKY2xhc3MgUV9FWFBPUlQgUVRhYldpZGdldCA6IHB1YmxpYyBRV2lkZ2V0CnsKICAgIFFfT0JKRUNUCiAgICBRX0VOVU1TKCBUYWJQb3NpdGlvbiApCiAgICBRX0VOVU1TKCBUYWJTaGFwZSApCiAgICBRX1BST1BFUlRZKCBUYWJQb3NpdGlvbiB0YWJQb3NpdGlvbiBSRUFEIHRhYlBvc2l0aW9uIFdSSVRFIHNldFRhYlBvc2l0aW9uICkKICAgIFFfUFJPUEVSVFkoIFRhYlNoYXBlIHRhYlNoYXBlIFJFQUQgdGFiU2hhcGUgV1JJVEUgc2V0VGFiU2hhcGUgKQogICAgUV9QUk9QRVJUWSggaW50IG1hcmdpbiBSRUFEIG1hcmdpbiBXUklURSBzZXRNYXJnaW4gKQogICAgUV9QUk9QRVJUWSggaW50IGN1cnJlbnRQYWdlIFJFQUQgY3VycmVudFBhZ2VJbmRleCBXUklURSBzZXRDdXJyZW50UGFnZSApCiAgICBRX1BST1BFUlRZKCBpbnQgY291bnQgUkVBRCBjb3VudCApCiAgICBRX09WRVJSSURFKCBib29sIGF1dG9NYXNrIERFU0lHTkFCTEUgdHJ1ZSBTQ1JJUFRBQkxFIHRydWUgKQoKcHVibGljOgogICAgUVRhYldpZGdldCggUVdpZGdldCAqcGFyZW50ID0gMCwgY29uc3QgY2hhciAqbmFtZSA9IDAsIFdGbGFncyBmID0gMCApOwogICAgflFUYWJXaWRnZXQoKTsKCiAgICB2aXJ0dWFsIHZvaWQgYWRkVGFiKCBRV2lkZ2V0ICosIGNvbnN0IFFTdHJpbmcgJiApOyAvLyAjIyMgbWFrZSB0aGVzZSBpbmxpbmUgaW4gNC4wCiAgICB2aXJ0dWFsIHZvaWQgYWRkVGFiKCBRV2lkZ2V0ICpjaGlsZCwgY29uc3QgUUljb25TZXQmIGljb25zZXQsCgkJCSBjb25zdCBRU3RyaW5nICZsYWJlbCApOwogICAgdmlydHVhbCB2b2lkIGFkZFRhYiggUVdpZGdldCAqLCBRVGFiKiApOwoKICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRUYWIoIFFXaWRnZXQgKiwgY29uc3QgUVN0cmluZyAmLCBpbnQgaW5kZXggPSAtMSApOwogICAgdmlydHVhbCB2b2lkIGluc2VydFRhYiggUVdpZGdldCAqY2hpbGQsIGNvbnN0IFFJY29uU2V0JiBpY29uc2V0LAoJCQkgICAgY29uc3QgUVN0cmluZyAmbGFiZWwsIGludCBpbmRleCA9IC0xICk7CiAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0VGFiKCBRV2lkZ2V0ICosIFFUYWIqLCBpbnQgaW5kZXggPSAtMSApOwoKICAgIHZvaWQgY2hhbmdlVGFiKCBRV2lkZ2V0ICosIGNvbnN0IFFTdHJpbmcgJik7CiAgICB2b2lkIGNoYW5nZVRhYiggUVdpZGdldCAqY2hpbGQsIGNvbnN0IFFJY29uU2V0JiBpY29uc2V0LAoJCSAgICBjb25zdCBRU3RyaW5nICZsYWJlbCApOwoKICAgIGJvb2wgaXNUYWJFbmFibGVkKCAgUVdpZGdldCAqICkgY29uc3Q7CiAgICB2b2lkIHNldFRhYkVuYWJsZWQoIFFXaWRnZXQgKiwgYm9vbCApOwoKICAgIHZvaWQgc2V0Q29ybmVyV2lkZ2V0KCBRV2lkZ2V0ICogdywgUXQ6OkNvcm5lciBjb3JuZXIgPSBRdDo6VG9wUmlnaHQgKTsKICAgIFFXaWRnZXQgKiBjb3JuZXJXaWRnZXQoIFF0OjpDb3JuZXIgY29ybmVyID0gUXQ6OlRvcFJpZ2h0ICkgY29uc3Q7CgogICAgUVN0cmluZyB0YWJMYWJlbCggUVdpZGdldCAqICkgY29uc3Q7CiAgICB2b2lkIHNldFRhYkxhYmVsKCBRV2lkZ2V0ICpwLCBjb25zdCBRU3RyaW5nICZsICk7CgogICAgUUljb25TZXQgdGFiSWNvblNldCggUVdpZGdldCAqIHcgKSBjb25zdDsKICAgIHZvaWQgc2V0VGFiSWNvblNldCggUVdpZGdldCAqIHcsIGNvbnN0IFFJY29uU2V0ICYgaWNvbnNldCApOwoKICAgIHZvaWQgcmVtb3ZlVGFiVG9vbFRpcCggUVdpZGdldCAqIHcgKTsKICAgIHZvaWQgc2V0VGFiVG9vbFRpcCggUVdpZGdldCAqIHcsIGNvbnN0IFFTdHJpbmcgJiB0aXAgKTsKICAgIFFTdHJpbmcgdGFiVG9vbFRpcCggUVdpZGdldCAqIHcgKSBjb25zdDsKCiAgICBRV2lkZ2V0ICogY3VycmVudFBhZ2UoKSBjb25zdDsKICAgIFFXaWRnZXQgKnBhZ2UoIGludCApIGNvbnN0OwogICAgUVN0cmluZyBsYWJlbCggaW50ICkgY29uc3Q7CiAgICBpbnQgY3VycmVudFBhZ2VJbmRleCgpIGNvbnN0OwogICAgaW50IGluZGV4T2YoIFFXaWRnZXQgKiApIGNvbnN0OwoKICAgIFFTaXplIHNpemVIaW50KCkgY29uc3Q7CiAgICBRU2l6ZSBtaW5pbXVtU2l6ZUhpbnQoKSBjb25zdDsKCiAgICBlbnVtIFRhYlBvc2l0aW9uIHsgVG9wLCBCb3R0b20gfTsKICAgIFRhYlBvc2l0aW9uIHRhYlBvc2l0aW9uKCkgY29uc3Q7CiAgICB2b2lkIHNldFRhYlBvc2l0aW9uKCBUYWJQb3NpdGlvbiApOwoKICAgIGVudW0gVGFiU2hhcGUgeyBSb3VuZGVkLCBUcmlhbmd1bGFyIH07CiAgICBUYWJTaGFwZSB0YWJTaGFwZSgpIGNvbnN0OwogICAgdm9pZCBzZXRUYWJTaGFwZSggVGFiU2hhcGUgcyApOwoKICAgIGludCBtYXJnaW4oKSBjb25zdDsKICAgIHZvaWQgc2V0TWFyZ2luKCBpbnQgKTsKCiAgICBpbnQgY291bnQoKSBjb25zdDsKCnB1YmxpYyBzbG90czoKICAgIHZvaWQgc2V0Q3VycmVudFBhZ2UoIGludCApOwogICAgdmlydHVhbCB2b2lkIHNob3dQYWdlKCBRV2lkZ2V0ICogKTsKICAgIHZpcnR1YWwgdm9pZCByZW1vdmVQYWdlKCBRV2lkZ2V0ICogKTsKCnByb3RlY3RlZDoKICAgIHZvaWQgc2hvd0V2ZW50KCBRU2hvd0V2ZW50ICogKTsKICAgIHZvaWQgcmVzaXplRXZlbnQoIFFSZXNpemVFdmVudCAqICk7CiAgICB2b2lkIHNldFRhYkJhciggUVRhYkJhciAqICk7CiAgICBRVGFiQmFyKiB0YWJCYXIoKSBjb25zdDsKICAgIHZvaWQgc3R5bGVDaGFuZ2UoIFFTdHlsZSYgKTsKICAgIHZvaWQgdXBkYXRlTWFzaygpOwogICAgYm9vbCBldmVudEZpbHRlciggUU9iamVjdCAqLCBRRXZlbnQgKiApOwoKc2lnbmFsczoKICAgIHZvaWQgY3VycmVudENoYW5nZWQoIFFXaWRnZXQgKiApOwojaWZuZGVmIFFfUURPQwogICAgdm9pZCBzZWxlY3RlZCggY29uc3QgUVN0cmluZyYgKTsKI2VuZGlmCgpwcml2YXRlIHNsb3RzOgogICAgdm9pZCBzaG93VGFiKCBpbnQgKTsKCnByaXZhdGU6CiAgICBRVGFiV2lkZ2V0RGF0YSAqZDsKICAgIHZvaWQgc2V0VXBMYXlvdXQoIGJvb2wgPSBGQUxTRSApOwogICAgZnJpZW5kIGNsYXNzIFFUYWJEaWFsb2c7Cgpwcml2YXRlOgkvLyBEaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRVGFiV2lkZ2V0KCBjb25zdCBRVGFiV2lkZ2V0ICYgKTsKICAgIFFUYWJXaWRnZXQmIG9wZXJhdG9yPSggY29uc3QgUVRhYldpZGdldCAmICk7CiNlbmRpZgp9OwoKI2VuZGlmIC8vIFFUX05PX1RBQldJREdFVAoKI2VuZGlmIC8vIFFUQUJXSURHRVRfSAoAAAAaAHEAdwBpAG4AZABvAHcAZABlAGYAcwAuAGgAABQBLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFXSU5ET1dERUZTX0gKI2RlZmluZSBRV0lORE9XREVGU19ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFvYmplY3RkZWZzLmgiCiNpbmNsdWRlICJxc3RyaW5nLmgiCiNpbmNsdWRlICJxbmFtZXNwYWNlLmgiCiNlbmRpZiAvLyBRVF9ICgovLyBDbGFzcyBmb3J3YXJkIGRlZmluaXRpb25zCgpjbGFzcyBRUGFpbnREZXZpY2U7CmNsYXNzIFFQYWludERldmljZU1ldHJpY3M7CmNsYXNzIFFXaWRnZXQ7CmNsYXNzIFFXaWRnZXRNYXBwZXI7CmNsYXNzIFFEaWFsb2c7CmNsYXNzIFFDb2xvcjsKY2xhc3MgUUNvbG9yR3JvdXA7CmNsYXNzIFFQYWxldHRlOwpjbGFzcyBRQ3Vyc29yOwpjbGFzcyBRUG9pbnQ7CmNsYXNzIFFTaXplOwpjbGFzcyBRUmVjdDsKY2xhc3MgUVBvaW50QXJyYXk7CmNsYXNzIFFQYWludGVyOwpjbGFzcyBRUmVnaW9uOwpjbGFzcyBRRm9udDsKY2xhc3MgUUZvbnRNZXRyaWNzOwpjbGFzcyBRRm9udEluZm87CmNsYXNzIFFQZW47CmNsYXNzIFFCcnVzaDsKY2xhc3MgUVdNYXRyaXg7CmNsYXNzIFFQaXhtYXA7CmNsYXNzIFFCaXRtYXA7CmNsYXNzIFFNb3ZpZTsKY2xhc3MgUUltYWdlOwpjbGFzcyBRSW1hZ2VJTzsKY2xhc3MgUVBpY3R1cmU7CmNsYXNzIFFQcmludGVyOwpjbGFzcyBRQWNjZWw7CmNsYXNzIFFUaW1lcjsKY2xhc3MgUVRpbWU7CmNsYXNzIFFDbGlwYm9hcmQ7CgoKLy8gV2lkZ2V0IGxpc3QgKGRlZmluZWQgaW4gcXdpZGdldGxpc3QuaCkKCmNsYXNzIFFXaWRnZXRMaXN0OwpjbGFzcyBRV2lkZ2V0TGlzdEl0OwoKCi8vIFdpbmRvdyBzeXN0ZW0gZGVwZW5kZW50IGRlZmluaXRpb25zCgojaWYgZGVmaW5lZChRX1dTX01BQykKI2lmIFFUX01BQ09TWF9WRVJTSU9OIDwgMHgxMDIwCnR5cGVkZWYgc3RydWN0IE9wYXF1ZUV2ZW50TG9vcFRpbWVyUmVmKiBFdmVudExvb3BUaW1lclJlZjsKdHlwZWRlZiBzdHJ1Y3QgT3BhcXVlTWVudUhhbmRsZSAqTWVudVJlZjsKI2Vsc2UKdHlwZWRlZiBzdHJ1Y3QgX19FdmVudExvb3BUaW1lciogICAgICAgIEV2ZW50TG9vcFRpbWVyUmVmOwp0eXBlZGVmIHN0cnVjdCBPcGFxdWVNZW51UmVmKiAgICAgICAgTWVudVJlZjsKI2VuZGlmCgojaWZuZGVmIFFfV1NfTUFDWAp0eXBlZGVmIHN0cnVjdCBDR0NvbnRleHQgKkNHQ29udGV4dFJlZjsKI2VuZGlmCnR5cGVkZWYgc3RydWN0IE9wYXF1ZVdpbmRvd0dyb3VwUmVmICpXaW5kb3dHcm91cFJlZjsKdHlwZWRlZiBzdHJ1Y3QgT3BhcXVlR3JhZlB0ciAqQ0dyYWZQdHI7CnR5cGVkZWYgc3RydWN0IE9wYXF1ZVBNUHJpbnRTZXNzaW9uICpQTVByaW50U2Vzc2lvbjsKdHlwZWRlZiBzdHJ1Y3QgT3BhcXVlUE1QcmludFNldHRpbmdzICpQTVByaW50U2V0dGluZ3M7CnR5cGVkZWYgc3RydWN0IE9wYXF1ZVBNUGFnZUZvcm1hdCAqUE1QYWdlRm9ybWF0Owp0eXBlZGVmIHN0cnVjdCBQb2ludCBQb2ludDsKdHlwZWRlZiBzdHJ1Y3QgT3BhcXVlRXZlbnRIYW5kbGVyUmVmKiAgIEV2ZW50SGFuZGxlclJlZjsKdHlwZWRlZiBzdHJ1Y3QgT3BhcXVlRXZlbnRIYW5kbGVyQ2FsbFJlZiogIEV2ZW50SGFuZGxlckNhbGxSZWY7CnR5cGVkZWYgc3RydWN0IE9wYXF1ZUV2ZW50UmVmKiAgICAgICAgICBFdmVudFJlZjsKdHlwZWRlZiBsb25nIGludCBPU1N0YXR1czsKdHlwZWRlZiBzdHJ1Y3QgT3BhcXVlU2NyYXBSZWYgKlNjcmFwUmVmOwp0eXBlZGVmIHN0cnVjdCBPcGFxdWVSZ25IYW5kbGUgKlJnbkhhbmRsZTsKdHlwZWRlZiBzdHJ1Y3QgT3BhcXVlV2luZG93UHRyICpXaW5kb3dQdHI7CnR5cGVkZWYgV2luZG93UHRyIFdpbmRvd1JlZjsKdHlwZWRlZiBzdHJ1Y3QgT3BhcXVlR3JhZlB0ciAqR1dvcmxkUHRyOwp0eXBlZGVmIEdXb3JsZFB0ciBHcmFmUHRyOwp0eXBlZGVmIHN0cnVjdCBHRGV2aWNlICoqR0RIYW5kbGU7CnR5cGVkZWYgc3RydWN0IENvbG9yVGFibGUgQ29sb3JUYWJsZTsKdHlwZWRlZiBzdHJ1Y3QgQml0TWFwIEJpdE1hcDsKdHlwZWRlZiBzdHJ1Y3QgRXZlbnRSZWNvcmQgRXZlbnRSZWNvcmQ7CnR5cGVkZWYgdm9pZCAqIE1TRzsKdHlwZWRlZiBpbnQgV0lkOwp0eXBlZGVmIHN0cnVjdCBBRURlc2MgQXBwbGVFdmVudDsKCiNlbmRpZiAvLyBRX1dTX01BQwoKI2lmIGRlZmluZWQoUV9XU19XSU4pCiNpbmNsdWRlICJxd2luZG93ZGVmc193aW4uaCIKI2VuZGlmIC8vIFFfV1NfV0lOCgoKI2lmIGRlZmluZWQoUV9PU19URU1QKQojaW5jbHVkZSAicXdpbmZ1bmN0aW9uc193Y2UuaCIKI2VuZGlmIC8vIFFfT1NfVEVNUAoKI2lmIGRlZmluZWQoUV9XU19YMTEpCgp0eXBlZGVmIHN0cnVjdCBfWERpc3BsYXkgRGlzcGxheTsKdHlwZWRlZiB1bmlvbiAgX1hFdmVudCBYRXZlbnQ7CnR5cGVkZWYgc3RydWN0IF9YR0MgKkdDOwp0eXBlZGVmIHN0cnVjdCBfWFJlZ2lvbiAqUmVnaW9uOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIFdJZDsKClFfRVhQT1JUIERpc3BsYXkgKnF0X3hkaXNwbGF5KCk7ClFfRVhQT1JUIGludAkgcXRfeHNjcmVlbigpOwpRX0VYUE9SVCBXSWQJIHF0X3hyb290d2luKCk7IC8vICMjIyBSRU1PVkUgNC4wClFfRVhQT1JUIFdJZAkgcXRfeHJvb3R3aW4oIGludCBzY3JuICk7IC8vICMjIyA0LjAgYWRkIGRlZmF1bHQgYXJnIG9mIC0xClFfRVhQT1JUIEdDCSBxdF94Z2V0X3JlYWRvbmx5X2djKCBpbnQgc2NybiwgYm9vbCBtb25vY2hyb21lICk7ClFfRVhQT1JUIEdDCSBxdF94Z2V0X3RlbXBfZ2MoIGludCBzY3JuLCBib29sIG1vbm9jaHJvbWUgKTsKClFfRVhQT1JUIGNvbnN0IGNoYXIgKnFBcHBDbGFzcygpOwkJLy8gZ2V0IGFwcGxpY2F0aW9uIGNsYXNzCgojZW5kaWYgLy8gUV9XU19YMTEKCiNpZiBkZWZpbmVkKFFfV1NfUVdTKQoKdHlwZWRlZiB1bnNpZ25lZCBsb25nICBXSWQ7CnN0cnVjdCBRV1NFdmVudDsKY2xhc3MgUUdmeDsKCiNlbmRpZiAvLyBRX1dTX1FXUwoKY2xhc3MgUUFwcGxpY2F0aW9uOwoKI2lmIGRlZmluZWQoTkVFRFNfUU1BSU4pCiNkZWZpbmUgbWFpbiBxTWFpbgojZW5kaWYKCi8vIEdsb2JhbCBwbGF0Zm9ybS1pbmRlcGVuZGVudCB0eXBlcyBhbmQgZnVuY3Rpb25zCgp0eXBlZGVmIFFfSU5UMzIgUUNPT1JEOwkJCQkvLyBjb29yZGluYXRlIHR5cGUKY29uc3QgUUNPT1JEIFFDT09SRF9NQVggPSAgMjE0NzQ4MzY0NzsKY29uc3QgUUNPT1JEIFFDT09SRF9NSU4gPSAtUUNPT1JEX01BWCAtIDE7Cgp0eXBlZGVmIHVuc2lnbmVkIGludCBRUmdiOwkJCS8vIFJHQiB0cmlwbGV0CgpRX0VYUE9SVCBjb25zdCBjaGFyICpxQXBwTmFtZSgpOwkJLy8gZ2V0IGFwcGxpY2F0aW9uIG5hbWUKCi8vIE1pc2MgZnVuY3Rpb25zCgp0eXBlZGVmIHZvaWQgKCpRdENsZWFuVXBGdW5jdGlvbikoKTsKUV9FWFBPUlQgdm9pZCBxQWRkUG9zdFJvdXRpbmUoIFF0Q2xlYW5VcEZ1bmN0aW9uICk7ClFfRVhQT1JUIHZvaWQgcVJlbW92ZVBvc3RSb3V0aW5lKCBRdENsZWFuVXBGdW5jdGlvbiApOwoKI2lmICFkZWZpbmVkKFFUX0NMRUFOX05BTUVTUEFDRSkKLy8gc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCBRdCAyLngKdHlwZWRlZiBRdENsZWFuVXBGdW5jdGlvbiBRX0NsZWFuVXBGdW5jdGlvbjsKI2VuZGlmCgoKI2VuZGlmIC8vIFFXSU5ET1dERUZTX0gKAAAAGgBxAHQAcwBjAGkAaQBjAG8AZABlAGMALgBoAAAOFC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKLy8gTW9zdCBvZiB0aGUgY29kZSBoZXJlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSGFucyBQZXR0ZXIgQmlla2VyLAovLyBhbmQgaXMgaW5jbHVkZWQgaW4gUXQgd2l0aCB0aGUgYXV0aG9yJ3MgcGVybWlzc2lvbiwgYW5kIHRoZSBncmF0ZWZ1bAovLyB0aGFua3Mgb2YgdGhlIFRyb2xsdGVjaCB0ZWFtLgoKLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFUU0NJSUNPREVDX0gKI2RlZmluZSBRVFNDSUlDT0RFQ19ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInF0ZXh0Y29kZWMuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fQ09ERUNTCgpjbGFzcyBRX0VYUE9SVCBRVHNjaWlDb2RlYyA6IHB1YmxpYyBRVGV4dENvZGVjIHsKcHVibGljOgogICAgdmlydHVhbCBpbnQgbWliRW51bSgpIGNvbnN0OwogICAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OwoKI2lmICFkZWZpbmVkKFFfTk9fVVNJTkdfS0VZV09SRCkKICAgIHVzaW5nIFFUZXh0Q29kZWM6OmZyb21Vbmljb2RlOwojZW5kaWYKICAgIFFDU3RyaW5nIGZyb21Vbmljb2RlKGNvbnN0IFFTdHJpbmcmIHVjLCBpbnQmIGxlbkluT3V0KSBjb25zdDsKICAgIFFTdHJpbmcgdG9Vbmljb2RlKGNvbnN0IGNoYXIqIGNoYXJzLCBpbnQgbGVuKSBjb25zdDsKCiAgICBpbnQgaGV1cmlzdGljQ29udGVudE1hdGNoKGNvbnN0IGNoYXIqIGNoYXJzLCBpbnQgbGVuKSBjb25zdDsKICAgIGludCBoZXVyaXN0aWNOYW1lTWF0Y2goY29uc3QgY2hhciogaGludCkgY29uc3Q7Cn07CgojZW5kaWYKCiNlbmRpZgoAAAAgAHEAdABoAHIAZQBhAGQAcwB0AG8AcgBhAGcAZQAuAGgAAAoyLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFUSFJFQURTVE9SQUdFX0gKI2RlZmluZSBRVEhSRUFEU1RPUkFHRV9ICgojaWZkZWYgUVRfVEhSRUFEX1NVUFBPUlQKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicWdsb2JhbC5oIgojZW5kaWYgLy8gUVRfSAoKY2xhc3MgUV9FWFBPUlQgUVRocmVhZFN0b3JhZ2VEYXRhCnsKcHVibGljOgogICAgUVRocmVhZFN0b3JhZ2VEYXRhKCB2b2lkICgqZnVuYykodm9pZCAqKSApOwogICAgflFUaHJlYWRTdG9yYWdlRGF0YSgpOwoKICAgIHZvaWQqKiBnZXQoKSBjb25zdDsKICAgIHZvaWQqKiBzZXQoIHZvaWQqIHAgKTsKCiAgICBzdGF0aWMgdm9pZCBmaW5pc2goIHZvaWQqKiApOwogICAgaW50IGlkOwp9OwoKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBRVGhyZWFkU3RvcmFnZQp7CnByaXZhdGU6CiAgICBRVGhyZWFkU3RvcmFnZURhdGEgZDsKCiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgLy8gZGlzYWJsZSBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KICAgIFFUaHJlYWRTdG9yYWdlKCBjb25zdCBRVGhyZWFkU3RvcmFnZSAmICk7CiAgICBRVGhyZWFkU3RvcmFnZSAmb3BlcmF0b3I9KCBjb25zdCBRVGhyZWFkU3RvcmFnZSAmICk7CiNlbmRpZiAvLyBRX0RJU0FCTEVfQ09QWQoKICAgIHN0YXRpYyB2b2lkIGRlbGV0ZURhdGEoIHZvaWQgKnggKSB7IGRlbGV0ZSAoVCl4OyB9CgpwdWJsaWM6CiAgICBpbmxpbmUgUVRocmVhZFN0b3JhZ2UoKSA6IGQoIGRlbGV0ZURhdGEgKSB7ICB9CiAgICBpbmxpbmUgflFUaHJlYWRTdG9yYWdlKCkgeyB9CgogICAgaW5saW5lIGJvb2wgaGFzTG9jYWxEYXRhKCkgY29uc3QKICAgIHsgcmV0dXJuIGQuZ2V0KCkgIT0gMDsgfQoKICAgIGlubGluZSBUJiBsb2NhbERhdGEoKQogICAgeyB2b2lkICoqdiA9IGQuZ2V0KCk7IGlmICggIXYgKSB2ID0gZC5zZXQoIDAgKTsgcmV0dXJuICooVCopdjsgfQoKICAgIGlubGluZSBUIGxvY2FsRGF0YSgpIGNvbnN0CiAgICB7IHZvaWQgKip2ID0gZC5nZXQoKTsgcmV0dXJuICggdiA/ICooVCopdiA6IDAgKTsgfQoKICAgIGlubGluZSB2b2lkIHNldExvY2FsRGF0YSggVCB0ICkKICAgIHsgKHZvaWQpIGQuc2V0KCB0ICk7IH0KfTsKCiNlbmRpZiAvLyBRVF9USFJFQURfU1VQUE9SVAoKI2VuZGlmIC8vIFFUSFJFQURTVE9SQUdFX0gKAAAAGABxAHQAXwB3AGkAbgBkAG8AdwBzAC4AaAAACxcvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRVF9XSU5ET1dTX0gKI2RlZmluZSBRVF9XSU5ET1dTX0gKCiNpZiBkZWZpbmVkKFFfQ0NfQk9SKQovLyBCb3JsYW5kJ3Mgd2luZG93cy5oIGRvZXMgbm90IHNldCB0aGVzZSBjb3JyZWN0bHksIHJlc3VsdGluZyBpbgovLyB1bnVzYWJsZSBXaW5TREsgc3RhbmRhcmQgZGlhbG9ncwojaWZuZGVmIFdJTlZFUgojZGVmaW5lIFdJTlZFUiAweDQwMAojZW5kaWYKI2lmbmRlZiBfV0lOMzJfV0lOTlQKI2RlZmluZSBfV0lOMzJfV0lOTlQgMHg0MDAKI2VuZGlmCiNlbmRpZgoKI2luY2x1ZGUgInF3aW5kb3dkZWZzLmgiCgojaW5jbHVkZSA8d2luZG93cy5oPgojaWYgZGVmaW5lZChRX0NDX0JPUikKLy8gd2luZGVmLmggKGluY2x1ZGVkIGJ5IHdpbmRvd3MuaCkgZGVmaW5lcyBGQUxTRSBhbmQgVFJVRSB0byAwIHJlc3AuIDEgLS0gd2l0aAovLyB0aGVzZSBkZWZpbmVzLCBCb3JsYW5kIEJ1aWxkZXIgNiBoYXMgcHJvYmxlbXMgZGlzdGluZ3Vpc2hpbmcgdGhlIGRpZmZlcmVudAovLyBvdmVybG9hZHMgb2YgdGhlIFFCaXRtYXAgY29uc3RydWN0b3JzLgojdW5kZWYgVFJVRQojdW5kZWYgRkFMU0UKI2VuZGlmCgovLyBhbHJlYWR5IGRlZmluZWQgd2hlbiBjb21waWxlZCB3aXRoIFdJTlZFUiA+PSAweDA1MDAKLy8gYW5kIHdlIG9ubHkgdXNlIHRoZW0gaW4gV1ZfMjAwMCBhbmQgV1ZfOTgKI2lmbmRlZiBTUElfU0VUTUVOVUFOSU1BVElPTgojZGVmaW5lIFNQSV9TRVRNRU5VQU5JTUFUSU9OIDB4MTAwMwojZW5kaWYKI2lmbmRlZiBTUElfU0VUTUVOVUZBREUKI2RlZmluZSBTUElfU0VUTUVOVUZBREUgMHgxMDEzCiNlbmRpZgojaWZuZGVmIFNQSV9TRVRDT01CT0JPWEFOSU1BVElPTgojZGVmaW5lIFNQSV9TRVRDT01CT0JPWEFOSU1BVElPTiAweDEwMDUKI2VuZGlmCiNpZm5kZWYgU1BJX1NFVFRPT0xUSVBBTklNQVRJT04KI2RlZmluZSBTUElfU0VUVE9PTFRJUEFOSU1BVElPTiAweDEwMTcKI2VuZGlmCiNpZm5kZWYgU1BJX1NFVFRPT0xUSVBGQURFCiNkZWZpbmUgU1BJX1NFVFRPT0xUSVBGQURFIDB4MTAxOQojZW5kaWYKI2lmbmRlZiBTUElfU0VUVUlFRkZFQ1RTIAojZGVmaW5lIFNQSV9TRVRVSUVGRkVDVFMgMHgxMDNGCiNlbmRpZgojaWZuZGVmIFNQSV9HRVRNRU5VQU5JTUFUSU9OCiNkZWZpbmUgU1BJX0dFVE1FTlVBTklNQVRJT04gMHgxMDAyCiNlbmRpZgojaWZuZGVmIFNQSV9HRVRNRU5VRkFERQojZGVmaW5lIFNQSV9HRVRNRU5VRkFERSAweDEwMTIKI2VuZGlmCiNpZm5kZWYgU1BJX0dFVENPTUJPQk9YQU5JTUFUSU9OCiNkZWZpbmUgU1BJX0dFVENPTUJPQk9YQU5JTUFUSU9OIDB4MTAwNAojZW5kaWYKI2lmbmRlZiBTUElfR0VUVE9PTFRJUEFOSU1BVElPTgojZGVmaW5lIFNQSV9HRVRUT09MVElQQU5JTUFUSU9OIDB4MTAxNgojZW5kaWYKI2lmbmRlZiBTUElfR0VUVE9PTFRJUEZBREUKI2RlZmluZSBTUElfR0VUVE9PTFRJUEZBREUgMHgxMDE4CiNlbmRpZgojaWZuZGVmIFNQSV9HRVRVSUVGRkVDVFMgCiNkZWZpbmUgU1BJX0dFVFVJRUZGRUNUUyAweDEwM0UKI2VuZGlmCiNpZm5kZWYgU1BJX0dFVEtFWUJPQVJEQ1VFUwojZGVmaW5lIFNQSV9HRVRLRVlCT0FSRENVRVMgMHgxMDBBCiNlbmRpZgojaWZuZGVmIElEQ19IQU5ECiNkZWZpbmUgSURDX0hBTkQgICAgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI2NDkpCiNlbmRpZgojaWZuZGVmIFdNX01PVVNFV0hFRUwKI2RlZmluZSBXTV9NT1VTRVdIRUVMCTB4MDIwQQojZW5kaWYKCiNlbmRpZiAvLyBRVF9XSU5ET1dTX0gKAAAAGABxAHMAcQBsAHIAZQBjAG8AcgBkAC4AaAAAEsYvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRU1FMUkVDT1JEX0gKI2RlZmluZSBRU1FMUkVDT1JEX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXN0cmluZy5oIgojaW5jbHVkZSAicXN0cmluZ2xpc3QuaCIKI2luY2x1ZGUgInF2YXJpYW50LmgiCiNpbmNsdWRlICJxc3FsZmllbGQuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fU1FMCgpjbGFzcyBRU3FsUmVjb3JkUHJpdmF0ZTsKCmNsYXNzIFFTcWxSZWNvcmRTaGFyZWQgOiBwdWJsaWMgUVNoYXJlZAp7CnB1YmxpYzoKICAgIFFTcWxSZWNvcmRTaGFyZWQoIFFTcWxSZWNvcmRQcml2YXRlKiBzcWxSZWNvcmRQcml2YXRlICkKICAgIDogZCggc3FsUmVjb3JkUHJpdmF0ZSApCiAgICB7fQogICAgdmlydHVhbCB+UVNxbFJlY29yZFNoYXJlZCgpOwogICAgUVNxbFJlY29yZFByaXZhdGUqIGQ7Cn07CgpjbGFzcyBRX0VYUE9SVCBRU3FsUmVjb3JkCnsKcHVibGljOgogICAgUVNxbFJlY29yZCgpOwogICAgUVNxbFJlY29yZCggY29uc3QgUVNxbFJlY29yZCYgb3RoZXIgKTsKICAgIFFTcWxSZWNvcmQmIG9wZXJhdG9yPSggY29uc3QgUVNxbFJlY29yZCYgb3RoZXIgKTsKICAgIHZpcnR1YWwgflFTcWxSZWNvcmQoKTsKICAgIHZpcnR1YWwgUVZhcmlhbnQgICAgIHZhbHVlKCBpbnQgaSApIGNvbnN0OwogICAgdmlydHVhbCBRVmFyaWFudCAgICAgdmFsdWUoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCAgICAgICAgIHNldFZhbHVlKCBpbnQgaSwgY29uc3QgUVZhcmlhbnQmIHZhbCApOwogICAgdmlydHVhbCB2b2lkICAgICAgICAgc2V0VmFsdWUoIGNvbnN0IFFTdHJpbmcmIG5hbWUsIGNvbnN0IFFWYXJpYW50JiB2YWwgKTsKICAgIGJvb2wgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGVkKCBpbnQgaSApIGNvbnN0OwogICAgYm9vbCAgICAgICAgICAgICAgICAgaXNHZW5lcmF0ZWQoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCAgICAgICAgIHNldEdlbmVyYXRlZCggY29uc3QgUVN0cmluZyYgbmFtZSwgYm9vbCBnZW5lcmF0ZWQgKTsKICAgIHZpcnR1YWwgdm9pZCAgICAgICAgIHNldEdlbmVyYXRlZCggaW50IGksIGJvb2wgZ2VuZXJhdGVkICk7CiAgICB2aXJ0dWFsIHZvaWQgICAgICAgICBzZXROdWxsKCBpbnQgaSApOwogICAgdmlydHVhbCB2b2lkICAgICAgICAgc2V0TnVsbCggY29uc3QgUVN0cmluZyYgbmFtZSApOwogICAgYm9vbCAgICAgICAgICAgICAgICAgaXNOdWxsKCBpbnQgaSApOyAvLyByZW1vdmUgaW4gNC4wCiAgICBib29sICAgICAgICAgICAgICAgICBpc051bGwoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKTsgLy8gcmVtb3ZlIGluIDQuMAogICAgYm9vbCAgICAgICAgICAgICAgICAgaXNOdWxsKCBpbnQgaSApIGNvbnN0OwogICAgYm9vbCAgICAgICAgICAgICAgICAgaXNOdWxsKCBjb25zdCBRU3RyaW5nJiBuYW1lICkgY29uc3Q7CgogICAgaW50ICAgICAgICAgICAgICAgICAgcG9zaXRpb24oIGNvbnN0IFFTdHJpbmcmIG5hbWUgKSBjb25zdDsKICAgIFFTdHJpbmcgICAgICAgICAgICAgIGZpZWxkTmFtZSggaW50IGkgKSBjb25zdDsKICAgIFFTcWxGaWVsZCogICAgICAgICAgIGZpZWxkKCBpbnQgaSApOwogICAgUVNxbEZpZWxkKiAgICAgICAgICAgZmllbGQoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKTsKICAgIGNvbnN0IFFTcWxGaWVsZCogICAgIGZpZWxkKCBpbnQgaSApIGNvbnN0OwogICAgY29uc3QgUVNxbEZpZWxkKiAgICAgZmllbGQoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQgICAgICAgICBhcHBlbmQoIGNvbnN0IFFTcWxGaWVsZCYgZmllbGQgKTsKICAgIHZpcnR1YWwgdm9pZCAgICAgICAgIGluc2VydCggaW50IHBvcywgY29uc3QgUVNxbEZpZWxkJiBmaWVsZCApOwogICAgdmlydHVhbCB2b2lkICAgICAgICAgcmVtb3ZlKCBpbnQgcG9zICk7CgogICAgYm9vbCAgICAgICAgICAgICAgICAgaXNFbXB0eSgpIGNvbnN0OwogICAgYm9vbCAgICAgICAgICAgICAgICAgY29udGFpbnMoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCAgICAgICAgIGNsZWFyKCk7CiAgICB2aXJ0dWFsIHZvaWQgICAgICAgICBjbGVhclZhbHVlcyggYm9vbCBudWxsaWZ5ID0gRkFMU0UgKTsKICAgIHVpbnQgICAgICAgICAgICAgICAgIGNvdW50KCkgY29uc3Q7CiAgICB2aXJ0dWFsIFFTdHJpbmcgICAgICB0b1N0cmluZyggY29uc3QgUVN0cmluZyYgcHJlZml4ID0gUVN0cmluZzo6bnVsbCwKCQkJCSAgIGNvbnN0IFFTdHJpbmcmIHNlcCA9ICIsIiApIGNvbnN0OwogICAgdmlydHVhbCBRU3RyaW5nTGlzdCAgdG9TdHJpbmdMaXN0KCBjb25zdCBRU3RyaW5nJiBwcmVmaXggPSBRU3RyaW5nOjpudWxsICkgY29uc3Q7Cgpwcml2YXRlOgogICAgUVN0cmluZyAgICAgICAgICAgICAgY3JlYXRlRmllbGQoIGludCBpLCBjb25zdCBRU3RyaW5nJiBwcmVmaXggKSBjb25zdDsKICAgIHZvaWQgICAgICAgICAgICAgICAgIGRlcmVmKCk7CiAgICBib29sICAgICAgICAgICAgICAgICBjaGVja0RldGFjaCgpOwogICAgUVNxbFJlY29yZFNoYXJlZCogICAgc2g7Cn07CgovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmIGRlZmluZWQoUV9URU1QTEFURURMTCkKLy8gTU9DX1NLSVBfQkVHSU4KUV9URU1QTEFURV9FWFRFUk4gdGVtcGxhdGUgY2xhc3MgUV9FWFBPUlQgUVZhbHVlTGlzdDxRU3FsRmllbGRJbmZvPjsKLy8gTU9DX1NLSVBfRU5ECiNlbmRpZgoKdHlwZWRlZiBRVmFsdWVMaXN0PFFTcWxGaWVsZEluZm8+IFFTcWxGaWVsZEluZm9MaXN0OwoKY2xhc3MgUV9FWFBPUlQgUVNxbFJlY29yZEluZm86IHB1YmxpYyBRU3FsRmllbGRJbmZvTGlzdAp7CnB1YmxpYzoKICAgIFFTcWxSZWNvcmRJbmZvKCk6IFFTcWxGaWVsZEluZm9MaXN0KCkge30KICAgIFFTcWxSZWNvcmRJbmZvKCBjb25zdCBRU3FsRmllbGRJbmZvTGlzdCYgb3RoZXIgKTogUVNxbEZpZWxkSW5mb0xpc3QoIG90aGVyICkge30KICAgIFFTcWxSZWNvcmRJbmZvKCBjb25zdCBRU3FsUmVjb3JkJiBvdGhlciApOwoKICAgIHNpemVfdHlwZSBjb250YWlucyggY29uc3QgUVN0cmluZyYgZmllbGROYW1lICkgY29uc3Q7CiAgICBRU3FsRmllbGRJbmZvIGZpbmQoIGNvbnN0IFFTdHJpbmcmIGZpZWxkTmFtZSApIGNvbnN0OwogICAgUVNxbFJlY29yZCB0b1JlY29yZCgpIGNvbnN0OwoKfTsKCgojZW5kaWYJLy8gUVRfTk9fU1FMCiNlbmRpZgoAAAAIAHEAdAAuAGgAACRULyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFUX0gKI2RlZmluZSBRVF9ICiNpbmNsdWRlICJxZ2xvYmFsLmgiCiNpbmNsdWRlICJxZmVhdHVyZXMuaCIKI2luY2x1ZGUgInFzaGFyZWQuaCIKI2luY2x1ZGUgInFwdHJjb2xsZWN0aW9uLmgiCiNpbmNsdWRlICJxZ2xpc3QuaCIKI2luY2x1ZGUgInFvYmplY3RkZWZzLmgiCiNpbmNsdWRlICJxbmFtZXNwYWNlLmgiCiNpbmNsdWRlICJxZ2FycmF5LmgiCiNpbmNsdWRlICJxbWVtYXJyYXkuaCIKI2luY2x1ZGUgInFjc3RyaW5nLmgiCiNpbmNsdWRlICJxc3RyaW5nLmgiCiNpbmNsdWRlICJxcHRybGlzdC5oIgojaW5jbHVkZSAicWlvZGV2aWNlLmgiCiNpbmNsdWRlICJxa2V5c2VxdWVuY2UuaCIKI2luY2x1ZGUgInF3aW5kb3dkZWZzLmgiCiNpbmNsdWRlICJxZ2RpY3QuaCIKI2luY2x1ZGUgInFmb250LmgiCiNpbmNsdWRlICJxZGF0YXN0cmVhbS5oIgojaW5jbHVkZSAicXBhaXIuaCIKI2luY2x1ZGUgInFwb2ludC5oIgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgInF0ZXh0c3RyZWFtLmgiCiNpbmNsdWRlICJxZm9udGluZm8uaCIKI2luY2x1ZGUgInFzaXplcG9saWN5LmgiCiNpbmNsdWRlICJxdGwuaCIKI2luY2x1ZGUgInFzaXplLmgiCiNpbmNsdWRlICJxcmVjdC5oIgojaW5jbHVkZSAicWJpdGFycmF5LmgiCiNpbmNsdWRlICJxcmVnaW9uLmgiCiNpbmNsdWRlICJxc3FsLmgiCiNpbmNsdWRlICJxc3RybGlzdC5oIgojaW5jbHVkZSAicXZhbHVlbGlzdC5oIgojaW5jbHVkZSAicW1hcC5oIgojaW5jbHVkZSAicWRhdGV0aW1lLmgiCiNpbmNsdWRlICJxbWltZS5oIgojaW5jbHVkZSAicWFzY2lpZGljdC5oIgojaW5jbHVkZSAicXBhaW50ZGV2aWNlLmgiCiNpbmNsdWRlICJxZm9udG1ldHJpY3MuaCIKI2luY2x1ZGUgInFkaWN0LmgiCiNpbmNsdWRlICJxZXZlbnQuaCIKI2luY2x1ZGUgInFob3N0YWRkcmVzcy5oIgojaW5jbHVkZSAicXN0cmluZ2xpc3QuaCIKI2luY2x1ZGUgInFjb2xvci5oIgojaW5jbHVkZSA8cWRvbS5oPgojaW5jbHVkZSAicW9iamVjdC5oIgojaW5jbHVkZSA8cWRyYXd1dGlsLmg+CiNpbmNsdWRlICJxYnJ1c2guaCIKI2luY2x1ZGUgInFwYWxldHRlLmgiCiNpbmNsdWRlICJxd2lkZ2V0LmgiCiNpbmNsdWRlICJxanB1bmljb2RlLmgiCiNpbmNsdWRlICJxdGV4dGNvZGVjLmgiCiNpbmNsdWRlICJxc3R5bGUuaCIKI2luY2x1ZGUgInFmcmFtZS5oIgojaW5jbHVkZSAicWZpbGUuaCIKI2luY2x1ZGUgInFmaWxlaW5mby5oIgojaW5jbHVkZSAicXVybGluZm8uaCIKI2luY2x1ZGUgInF3aWRnZXRsaXN0LmgiCiNpbmNsdWRlIDxxY29tYm9ib3guaD4KI2luY2x1ZGUgInFncm91cGJveC5oIgojaW5jbHVkZSAicWRpYWxvZy5oIgojaW5jbHVkZSA8cWRhdGF2aWV3Lmg+CiNpbmNsdWRlICJxZG9ja3dpbmRvdy5oIgojaW5jbHVkZSAicWNvbW1vbnN0eWxlLmgiCiNpbmNsdWRlICJxbmV0d29ya3Byb3RvY29sLmgiCiNpbmNsdWRlIDxxZXVja3Jjb2RlYy5oPgojaW5jbHVkZSA8cWdiMTgwMzBjb2RlYy5oPgojaW5jbHVkZSAicWdjYWNoZS5oIgojaW5jbHVkZSAicXBpeG1hcC5oIgojaW5jbHVkZSA8cWdpZi5oPgojaW5jbHVkZSA8cWdsY29sb3JtYXAuaD4KI2luY2x1ZGUgPHFjYWNoZS5oPgojaW5jbHVkZSA8cWRyb3BzaXRlLmg+CiNpbmNsdWRlICJxZ3BsdWdpbi5oIgojaW5jbHVkZSA8cWdyaWQuaD4KI2luY2x1ZGUgInFyYW5nZWNvbnRyb2wuaCIKI2luY2x1ZGUgInFidXR0b25ncm91cC5oIgojaW5jbHVkZSA8cWRhdGV0aW1lZWRpdC5oPgojaW5jbHVkZSAicWd2ZWN0b3IuaCIKI2luY2x1ZGUgInFoYm94LmgiCiNpbmNsdWRlIDxxaGJ1dHRvbmdyb3VwLmg+CiNpbmNsdWRlICJxaWNvbnNldC5oIgojaW5jbHVkZSA8cWhncm91cGJveC5oPgojaW5jbHVkZSAicXNvY2tldG5vdGlmaWVyLmgiCiNpbmNsdWRlIDxxZXZlbnRsb29wLmg+CiNpbmNsdWRlIDxxaHR0cC5oPgojaW5jbHVkZSA8cWFjdGlvbi5oPgojaW5jbHVkZSAicWJ1ZmZlci5oIgojaW5jbHVkZSAicWltYWdlLmgiCiNpbmNsdWRlIDxxaW1hZ2Vmb3JtYXRwbHVnaW4uaD4KI2luY2x1ZGUgInFsaW5lZWRpdC5oIgojaW5jbHVkZSA8cWludGNhY2hlLmg+CiNpbmNsdWRlICJxaW50ZGljdC5oIgojaW5jbHVkZSAicW1vdGlmc3R5bGUuaCIKI2luY2x1ZGUgInFwaWN0dXJlLmgiCiNpbmNsdWRlIDxxamlzY29kZWMuaD4KI2luY2x1ZGUgPHFldWNqcGNvZGVjLmg+CiNpbmNsdWRlIDxxa2V5Y29kZS5oPgojaW5jbHVkZSA8cWFjY2VsLmg+CiNpbmNsdWRlICJxbGFiZWwuaCIKI2luY2x1ZGUgInFsYXlvdXQuaCIKI2luY2x1ZGUgPHFsY2RudW1iZXIuaD4KI2luY2x1ZGUgPHFsaWJyYXJ5Lmg+CiNpbmNsdWRlIDxxaW5wdXRkaWFsb2cuaD4KI2luY2x1ZGUgInFzY3JvbGxiYXIuaCIKI2luY2x1ZGUgInFzY3JvbGx2aWV3LmgiCiNpbmNsdWRlICJxZGlyLmgiCiNpbmNsdWRlICJxd2luZG93c3N0eWxlLmgiCiNpbmNsdWRlICJxY29ubmVjdGlvbi5oIgojaW5jbHVkZSAicWJpdG1hcC5oIgojaW5jbHVkZSAicXZhcmlhbnQuaCIKI2luY2x1ZGUgInFzaWduYWwuaCIKI2luY2x1ZGUgPHFtZXNzYWdlYm94Lmg+CiNpbmNsdWRlICJxbWV0YW9iamVjdC5oIgojaW5jbHVkZSAicWhlYWRlci5oIgojaW5jbHVkZSA8cW1vdGlmcGx1c3N0eWxlLmg+CiNpbmNsdWRlIDxxY2Rlc3R5bGUuaD4KI2luY2x1ZGUgPHFtb3ZpZS5oPgojaW5jbHVkZSAicXB0cnZlY3Rvci5oIgojaW5jbHVkZSAicW11dGV4LmgiCiNpbmNsdWRlICJxYnV0dG9uLmgiCiNpbmNsdWRlIDxxbmV0d29yay5oPgojaW5jbHVkZSA8cWZ0cC5oPgojaW5jbHVkZSAicWd1YXJkZWRwdHIuaCIKI2luY2x1ZGUgPHFvYmplY3RjbGVhbnVwaGFuZGxlci5oPgojaW5jbHVkZSAicXNxbGZpZWxkLmgiCiNpbmNsdWRlIDxxb2JqZWN0ZGljdC5oPgojaW5jbHVkZSA8cW9iamVjdGxpc3QuaD4KI2luY2x1ZGUgPHFjb2xvcmRpYWxvZy5oPgojaW5jbHVkZSA8cXBhaW50ZGV2aWNlbWV0cmljcy5oPgojaW5jbHVkZSAicXBvaW50YXJyYXkuaCIKI2luY2x1ZGUgInFtZW51ZGF0YS5oIgojaW5jbHVkZSA8cWxpc3R2aWV3Lmg+CiNpbmNsdWRlICJxcGVuLmgiCiNpbmNsdWRlICJxZHJhZ29iamVjdC5oIgojaW5jbHVkZSA8cWljb252aWV3Lmg+CiNpbmNsdWRlIDxxcGl4bWFwY2FjaGUuaD4KI2luY2x1ZGUgPHFwbGF0aW51bXN0eWxlLmg+CiNpbmNsdWRlIDxxcG5naW8uaD4KI2luY2x1ZGUgPHFjdXJzb3IuaD4KI2luY2x1ZGUgPHFlcnJvcm1lc3NhZ2UuaD4KI2luY2x1ZGUgPHFwb2x5Z29uc2Nhbm5lci5oPgojaW5jbHVkZSAicXBvcHVwbWVudS5oIgojaW5jbHVkZSA8cXByaW50ZGlhbG9nLmg+CiNpbmNsdWRlIDxxcHJpbnRlci5oPgojaW5jbHVkZSA8cXByb2Nlc3MuaD4KI2luY2x1ZGUgInFwcm9ncmVzc2Jhci5oIgojaW5jbHVkZSAicXNlbWltb2RhbC5oIgojaW5jbHVkZSA8cWFzY2lpY2FjaGUuaD4KI2luY2x1ZGUgInFwdHJkaWN0LmgiCiNpbmNsdWRlIDxxY2xlYW51cGhhbmRsZXIuaD4KI2luY2x1ZGUgPHFwdHJxdWV1ZS5oPgojaW5jbHVkZSA8cXB0cnN0YWNrLmg+CiNpbmNsdWRlICJxc3R5bGVzaGVldC5oIgojaW5jbHVkZSA8cXB1c2hidXR0b24uaD4KI2luY2x1ZGUgPHFyYWRpb2J1dHRvbi5oPgojaW5jbHVkZSA8cWRpYWwuaD4KI2luY2x1ZGUgPHFkb2NrYXJlYS5oPgojaW5jbHVkZSAicXJlZ2V4cC5oIgojaW5jbHVkZSA8cWNsaXBib2FyZC5oPgojaW5jbHVkZSA8cXJ0bGNvZGVjLmg+CiNpbmNsdWRlIDxxbGlzdGJveC5oPgojaW5jbHVkZSA8cWdyaWR2aWV3Lmg+CiNpbmNsdWRlICJxc2VtYXBob3JlLmgiCiNpbmNsdWRlIDxxcHJvZ3Jlc3NkaWFsb2cuaD4KI2luY2x1ZGUgInFzb2NrZXRkZXZpY2UuaCIKI2luY2x1ZGUgPHFzZXNzaW9ubWFuYWdlci5oPgojaW5jbHVkZSA8cXNldHRpbmdzLmg+CiNpbmNsdWRlIDxxc2dpc3R5bGUuaD4KI2luY2x1ZGUgPHFmb250ZGlhbG9nLmg+CiNpbmNsdWRlICJxdGltZXIuaCIKI2luY2x1ZGUgPHFzaWduYWxtYXBwZXIuaD4KI2luY2x1ZGUgPHFzaWduYWxzbG90aW1wLmg+CiNpbmNsdWRlIDxxc2ltcGxlcmljaHRleHQuaD4KI2luY2x1ZGUgInF3bWF0cml4LmgiCiNpbmNsdWRlIDxxc2l6ZWdyaXAuaD4KI2luY2x1ZGUgPHFhYnN0cmFjdGxheW91dC5oPgojaW5jbHVkZSA8cXNqaXNjb2RlYy5oPgojaW5jbHVkZSA8cXNsaWRlci5oPgojaW5jbHVkZSA8cXNvY2tldC5oPgojaW5jbHVkZSA8cXNlcnZlcnNvY2tldC5oPgojaW5jbHVkZSA8cWRucy5oPgojaW5jbHVkZSA8cXNvcnRlZGxpc3QuaD4KI2luY2x1ZGUgPHFzb3VuZC5oPgojaW5jbHVkZSA8cXNwaW5ib3guaD4KI2luY2x1ZGUgPHFzcGxhc2hzY3JlZW4uaD4KI2luY2x1ZGUgPHFzcGxpdHRlci5oPgojaW5jbHVkZSAicXNxbGVycm9yLmgiCiNpbmNsdWRlICJxZWRpdG9yZmFjdG9yeS5oIgojaW5jbHVkZSAicXNxbHF1ZXJ5LmgiCiNpbmNsdWRlICJxc3FscmVjb3JkLmgiCiNpbmNsdWRlIDxxc3FsZHJpdmVycGx1Z2luLmg+CiNpbmNsdWRlICJxc3FsaW5kZXguaCIKI2luY2x1ZGUgInFzcWxjdXJzb3IuaCIKI2luY2x1ZGUgPHFzcWxkcml2ZXIuaD4KI2luY2x1ZGUgPHFzcWxmb3JtLmg+CiNpbmNsdWRlICJxdGFibGUuaCIKI2luY2x1ZGUgPHFzcWxwcm9wZXJ0eW1hcC5oPgojaW5jbHVkZSA8cXNxbGRhdGFiYXNlLmg+CiNpbmNsdWRlIDxxZGF0YWJyb3dzZXIuaD4KI2luY2x1ZGUgPHFzcWxyZXN1bHQuaD4KI2luY2x1ZGUgPHFzcWxzZWxlY3RjdXJzb3IuaD4KI2luY2x1ZGUgPHFzdGF0dXNiYXIuaD4KI2luY2x1ZGUgPHFtZW51YmFyLmg+CiNpbmNsdWRlIDxxY2FudmFzLmg+CiNpbmNsdWRlICJxdHJhbnNsYXRvci5oIgojaW5jbHVkZSA8cXN0cnZlYy5oPgojaW5jbHVkZSA8cWludGVybGFjZXN0eWxlLmg+CiNpbmNsdWRlIDxxc3R5bGVmYWN0b3J5Lmg+CiNpbmNsdWRlIDxxc3R5bGVwbHVnaW4uaD4KI2luY2x1ZGUgInF0ZXh0ZWRpdC5oIgojaW5jbHVkZSA8cXN5bnRheGhpZ2hsaWdodGVyLmg+CiNpbmNsdWRlIDxxdGFiYmFyLmg+CiNpbmNsdWRlIDxxdGFiZGlhbG9nLmg+CiNpbmNsdWRlICJxc3FsZWRpdG9yZmFjdG9yeS5oIgojaW5jbHVkZSA8cXRhYndpZGdldC5oPgojaW5jbHVkZSA8cXRleHRicm93c2VyLmg+CiNpbmNsdWRlIDxxYmlnNWNvZGVjLmg+CiNpbmNsdWRlIDxxdGV4dGNvZGVjZmFjdG9yeS5oPgojaW5jbHVkZSA8cXRleHRjb2RlY3BsdWdpbi5oPgojaW5jbHVkZSA8cW11bHRpbGluZWVkaXQuaD4KI2luY2x1ZGUgInF0b29sYmFyLmgiCiNpbmNsdWRlIDxxdGV4dHZpZXcuaD4KI2luY2x1ZGUgInF3YWl0Y29uZGl0aW9uLmgiCiNpbmNsdWRlIDxxYXN5bmNpby5oPgojaW5jbHVkZSA8cWZvbnRkYXRhYmFzZS5oPgojaW5jbHVkZSA8cW1haW53aW5kb3cuaD4KI2luY2x1ZGUgPHF0b29sYm94Lmg+CiNpbmNsdWRlIDxxdG9vbGJ1dHRvbi5oPgojaW5jbHVkZSA8cXRvb2x0aXAuaD4KI2luY2x1ZGUgInFkZXNrdG9wd2lkZ2V0LmgiCiNpbmNsdWRlIDxxdHNjaWljb2RlYy5oPgojaW5jbHVkZSAicXVybC5oIgojaW5jbHVkZSAicXVybG9wZXJhdG9yLmgiCiNpbmNsdWRlIDxxZmlsZWRpYWxvZy5oPgojaW5jbHVkZSA8cXV0ZmNvZGVjLmg+CiNpbmNsdWRlIDxxdXVpZC5oPgojaW5jbHVkZSA8cXZhbGlkYXRvci5oPgojaW5jbHVkZSA8cWFzeW5jaW1hZ2Vpby5oPgojaW5jbHVkZSA8cXZhbHVlc3RhY2suaD4KI2luY2x1ZGUgPHF2YWx1ZXZlY3Rvci5oPgojaW5jbHVkZSA8cWRhdGF0YWJsZS5oPgojaW5jbHVkZSA8cXZib3guaD4KI2luY2x1ZGUgPHF2YnV0dG9uZ3JvdXAuaD4KI2luY2x1ZGUgPHF2ZmJoZHIuaD4KI2luY2x1ZGUgPHF2Z3JvdXBib3guaD4KI2luY2x1ZGUgPHF0aHJlYWQuaD4KI2luY2x1ZGUgPHF3aGF0c3RoaXMuaD4KI2luY2x1ZGUgPHFhcHBsaWNhdGlvbi5oPgojaW5jbHVkZSA8cXdpZGdldGludGRpY3QuaD4KI2luY2x1ZGUgPHFmb2N1c2RhdGEuaD4KI2luY2x1ZGUgPHF3aWRnZXRwbHVnaW4uaD4KI2luY2x1ZGUgPHF3aWRnZXRzdGFjay5oPgojaW5jbHVkZSA8cWNoZWNrYm94Lmg+CiNpbmNsdWRlIDxxY29tcGFjdHN0eWxlLmg+CiNpbmNsdWRlIDxxd2l6YXJkLmg+CiNpbmNsdWRlIDxxcGFpbnRlci5oPgojaW5jbHVkZSA8cXdvcmtzcGFjZS5oPgojaW5jbHVkZSA8cWxvY2FsZnMuaD4KI2luY2x1ZGUgPHF4bWwuaD4KCiNpZiBkZWZpbmVkKCBRVF9NT0NfQ1BQICkgfHwgZGVmaW5lZCggUVRfSF9DUFAgKSB8fCBkZWZpbmVkKCBRX09TX01BQ1ggKQojaW5jbHVkZSA8cHJpdmF0ZS9xY29tX3AuaD4KI2luY2x1ZGUgPHByaXZhdGUvcXVjb21fcC5oPgojaW5jbHVkZSAicHJpdmF0ZS9xZ2Z4ZHJpdmVyaW50ZXJmYWNlX3AuaCIKI2luY2x1ZGUgInByaXZhdGUvcWNvbV9wLmgiCiNpbmNsdWRlICJwcml2YXRlL3FpbWFnZWZvcm1hdGludGVyZmFjZV9wLmgiCiNpbmNsdWRlICJwcml2YXRlL3Fpc2NpaWNvZGVjX3AuaCIKI2luY2x1ZGUgInByaXZhdGUvcWtiZGRyaXZlcmludGVyZmFjZV9wLmgiCiNpbmNsdWRlICJwcml2YXRlL3FsYXlvdXRlbmdpbmVfcC5oIgojaW5jbHVkZSAicHJpdmF0ZS9xY29tbGlicmFyeV9wLmgiCiNpbmNsdWRlICJwcml2YXRlL3Ftb3VzZWRyaXZlcmludGVyZmFjZV9wLmgiCiNpbmNsdWRlICJwcml2YXRlL3FlZmZlY3RzX3AuaCIKI2luY2x1ZGUgInByaXZhdGUvcWdwbHVnaW5tYW5hZ2VyX3AuaCIKI2luY2x1ZGUgInByaXZhdGUvcWludGVybmFsX3AuaCIKI2luY2x1ZGUgInByaXZhdGUvcXNxbGRyaXZlcmludGVyZmFjZV9wLmgiCiNpbmNsdWRlICJwcml2YXRlL3FzcWxtYW5hZ2VyX3AuaCIKI2luY2x1ZGUgInByaXZhdGUvcWxvY2tfcC5oIgojaW5jbHVkZSAicHJpdmF0ZS9xY29tcG9uZW50ZmFjdG9yeV9wLmgiCiNpbmNsdWRlICJwcml2YXRlL3FzdHlsZWludGVyZmFjZV9wLmgiCiNpbmNsdWRlICJwcml2YXRlL3FyaWNodGV4dF9wLmgiCiNpbmNsdWRlICJwcml2YXRlL3FzdmdkZXZpY2VfcC5oIgojaW5jbHVkZSAicHJpdmF0ZS9xZm9udGNvZGVjc19wLmgiCiNpbmNsdWRlICJwcml2YXRlL3F0ZXh0Y29kZWNpbnRlcmZhY2VfcC5oIgojaW5jbHVkZSAicHJpdmF0ZS9xcHNwcmludGVyX3AuaCIKI2luY2x1ZGUgInByaXZhdGUvcXRpdGxlYmFyX3AuaCIKI2luY2x1ZGUgInByaXZhdGUvcXVjb21fcC5oIgojaW5jbHVkZSAicHJpdmF0ZS9xdWNvbWV4dHJhX3AuaCIKI2luY2x1ZGUgInByaXZhdGUvcXBsdWdpbm1hbmFnZXJfcC5oIgojaW5jbHVkZSAicHJpdmF0ZS9xZGlyX3AuaCIKI2luY2x1ZGUgInByaXZhdGUvcXNldHRpbmdzX3AuaCIKI2luY2x1ZGUgInByaXZhdGUvcXNxbGV4dGVuc2lvbl9wLmgiCiNpbmNsdWRlICJwcml2YXRlL3FkaWFsb2didXR0b25zX3AuaCIKI2luY2x1ZGUgInByaXZhdGUvcXdpZGdldGludGVyZmFjZV9wLmgiCiNpbmNsdWRlICJwcml2YXRlL3F3aWRnZXRyZXNpemVoYW5kbGVyX3AuaCIKI2luY2x1ZGUgInByaXZhdGUvcWxpYnJhcnlfcC5oIgojZW5kaWYgLy8gUHJpdmF0ZSBoZWFkZXJzCgoKI2lmZGVmIFFfV1NfTUFDCiNpbmNsdWRlIDxxYXF1YXN0eWxlLmg+CiNpbmNsdWRlIDxxbWFjc3R5bGVfbWFjLmg+CiNlbmRpZiAvLyBRX1dTX01BQwoKI2lmZGVmIFFfV1NfV0lOCiNpbmNsdWRlIDxxd2luZG93c3hwc3R5bGUuaD4KI2VuZGlmCgojaWZkZWYgUV9XU19RV1MKI2luY2x1ZGUgPHByaXZhdGUvcXRleHRlbmdpbmVfcC5oPgojaW5jbHVkZSAicWZvbnRtYW5hZ2VyX3F3cy5oIgojaW5jbHVkZSA8cWZvbnRmYWN0b3J5YmRmX3F3cy5oPgojaW5jbHVkZSA8cWdmeHZvb2Rvb2RlZnNfcXdzLmg+CiNpbmNsdWRlIDxxZ2Z4bWF0cm94ZGVmc19xd3MuaD4KI2luY2x1ZGUgPHFnZnhkcml2ZXJwbHVnaW5fcXdzLmg+CiNpbmNsdWRlIDxxa2JkZHJpdmVyZmFjdG9yeV9xd3MuaD4KI2luY2x1ZGUgPHFrYmRkcml2ZXJwbHVnaW5fcXdzLmg+CiNpbmNsdWRlIDxxbW91c2Vkcml2ZXJmYWN0b3J5X3F3cy5oPgojaW5jbHVkZSA8cW1vdXNlZHJpdmVycGx1Z2luX3F3cy5oPgojaW5jbHVkZSA8cWNvcGNoYW5uZWxfcXdzLmg+CiNpbmNsdWRlIDxxZGlyZWN0cGFpbnRlcl9xd3MuaD4KI2luY2x1ZGUgInFtZW1vcnltYW5hZ2VyX3F3cy5oIgojaW5jbHVkZSA8cW1vdXNlX3F3cy5oPgojaW5jbHVkZSA8cWZvbnRmYWN0b3J5dHRmX3F3cy5oPgojaWZuZGVmIFFfT1NfTUFDCiMgaW5jbHVkZSA8cXNvdW5kcXNzX3F3cy5oPgojZW5kaWYKI2luY2x1ZGUgInFnZnhfcXdzLmgiCiNpbmNsdWRlIDxxZ2Z4ZHJpdmVyZmFjdG9yeV9xd3MuaD4KI2luY2x1ZGUgInF3c2Rpc3BsYXlfcXdzLmgiCiNpbmNsdWRlICJxd3Nzb2NrZXRfcXdzLmgiCiNpbmNsdWRlICJxd3NkZWNvcmF0aW9uX3F3cy5oIgojaW5jbHVkZSAicXdzdXRpbHNfcXdzLmgiCiNpbmNsdWRlIDxxd3NjdXJzb3JfcXdzLmg+CiNpbmNsdWRlICJxd3NtYW5hZ2VyX3F3cy5oIgojaW5jbHVkZSAicXdzZGVmYXVsdGRlY29yYXRpb25fcXdzLmgiCiNpbmNsdWRlIDxxZ2Z4cmFzdGVyX3F3cy5oPgojaW5jbHVkZSAicXdzY29tbWFuZF9xd3MuaCIKI2luY2x1ZGUgPHF3c2h5ZHJvZGVjb3JhdGlvbl9xd3MuaD4KI2luY2x1ZGUgPHF3c2tkZTJkZWNvcmF0aW9uX3F3cy5oPgojaW5jbHVkZSA8cXdza2RlZGVjb3JhdGlvbl9xd3MuaD4KI2luY2x1ZGUgPHF3c2Jlb3NkZWNvcmF0aW9uX3F3cy5oPgojaW5jbHVkZSAicXdzcHJvcGVydHlfcXdzLmgiCiNpbmNsdWRlIDxxd3NyZWdpb25tYW5hZ2VyX3F3cy5oPgojaW5jbHVkZSAicXdzZXZlbnRfcXdzLmgiCiNpbmNsdWRlIDxxd2luZG93c3lzdGVtX3F3cy5oPgojaW5jbHVkZSA8cXdzd2luZG93c2RlY29yYXRpb25fcXdzLmg+CiNlbmRpZiAvLyBRX1dTX1FXUwoKCiNpZmRlZiBRX1dTX1dDRQojaW5jbHVkZSA8cXBvY2tldHBjc3R5bGVfd2NlLmg+CiNlbmRpZiAvLyBRX1dTX1dDRQoKI2VuZGlmIC8vIFFUX0gKAAAAIABxAHcAYQBpAHQAYwBvAG4AZABpAHQAaQBvAG4ALgBoAAAIrS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFXQUlUQ09ORElUSU9OX0gKI2RlZmluZSBRV0FJVENPTkRJVElPTl9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFnbG9iYWwuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZiBkZWZpbmVkKFFUX1RIUkVBRF9TVVBQT1JUKQoKI2luY2x1ZGUgPGxpbWl0cy5oPgoKY2xhc3MgUVdhaXRDb25kaXRpb25Qcml2YXRlOwpjbGFzcyBRTXV0ZXg7CgpjbGFzcyBRX0VYUE9SVCBRV2FpdENvbmRpdGlvbgp7CnB1YmxpYzoKICAgIFFXYWl0Q29uZGl0aW9uKCk7CiAgICB2aXJ0dWFsIH5RV2FpdENvbmRpdGlvbigpOwoKICAgIC8vIGRlZmF1bHQgYXJndW1lbnQgY2F1c2VzIHRocmVhZCB0byBibG9jayBpbmRlZmluYXRlbHkKICAgIGJvb2wgd2FpdCggdW5zaWduZWQgbG9uZyB0aW1lID0gVUxPTkdfTUFYICk7CiAgICBib29sIHdhaXQoIFFNdXRleCAqbXV0ZXgsIHVuc2lnbmVkIGxvbmcgdGltZSA9IFVMT05HX01BWCApOwoKICAgIHZvaWQgd2FrZU9uZSgpOwogICAgdm9pZCB3YWtlQWxsKCk7Cgpwcml2YXRlOgogICAgUVdhaXRDb25kaXRpb25Qcml2YXRlICogZDsKCiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUVdhaXRDb25kaXRpb24oIGNvbnN0IFFXYWl0Q29uZGl0aW9uICYgKTsKICAgIFFXYWl0Q29uZGl0aW9uICZvcGVyYXRvcj0oIGNvbnN0IFFXYWl0Q29uZGl0aW9uICYgKTsKI2VuZGlmCn07CgojZW5kaWYKCiNlbmRpZgoAAAAUAHEAdABzAHQAcgBlAGEAbQAuAGgAAAQrLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNpZm5kZWYgUVRTVFJFQU1fSAojZGVmaW5lIFFUU1RSRUFNX0gKI2luY2x1ZGUgInF0ZXh0c3RyZWFtLmgiCiNlbmRpZgoAAAAcAHEAdwBzAGUAdgBlAG4AdABfAHEAdwBzAC4AaAAAHkIvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdTRVZFTlRfUVdTX0gKI2RlZmluZSBRV1NFVkVOVF9RV1NfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxd3N1dGlsc19xd3MuaCIKI2luY2x1ZGUgInF3c2NvbW1hbmRfcXdzLmgiIC8vUVdTUHJvdG9jb2xJdGVtIGxpdmVzIHRoZXJlLCBmb3Igbm93CiNlbmRpZiAvLyBRVF9ICgpzdHJ1Y3QgUVdTTW91c2VFdmVudDsKCnN0cnVjdCBRV1NFdmVudCA6IFFXU1Byb3RvY29sSXRlbSB7CgogICAgUVdTRXZlbnQoIGludCB0LCBpbnQgbGVuLCBjaGFyICpwdHIgKSA6IFFXU1Byb3RvY29sSXRlbSh0LGxlbixwdHIpIHt9CgogICAgZW51bSBUeXBlIHsKCU5vRXZlbnQsCglDb25uZWN0ZWQsCglNb3VzZSwgRm9jdXMsIEtleSwKCVJlZ2lvbk1vZGlmaWVkLAoJQ3JlYXRpb24sCglQcm9wZXJ0eU5vdGlmeSwKCVByb3BlcnR5UmVwbHksCglTZWxlY3Rpb25DbGVhciwKCVNlbGVjdGlvblJlcXVlc3QsCglTZWxlY3Rpb25Ob3RpZnksCglNYXhXaW5kb3dSZWN0LAoJUUNvcE1lc3NhZ2UsCglXaW5kb3dPcGVyYXRpb24sCglJTUV2ZW50LAoJTkV2ZW50CiAgICB9OwoKICAgIFFXU01vdXNlRXZlbnQgKmFzTW91c2UoKQoJeyByZXR1cm4gdHlwZSA9PSBNb3VzZSA/IChRV1NNb3VzZUV2ZW50Kil0aGlzIDogMDsgfQogICAgaW50IHdpbmRvdygpIHsgcmV0dXJuICooKGludCopc2ltcGxlRGF0YVB0cik7IH0KICAgIHN0YXRpYyBRV1NFdmVudCAqZmFjdG9yeSggaW50IHR5cGUgKTsKfTsKCgovL0FsbCBldmVudHMgbXVzdCBzdGFydCB3aXRoIHdpbmRvd0lECgpzdHJ1Y3QgUVdTQ29ubmVjdGVkRXZlbnQgOiBRV1NFdmVudCB7CiAgICBRV1NDb25uZWN0ZWRFdmVudCgpCgk6IFFXU0V2ZW50KCBRV1NFdmVudDo6Q29ubmVjdGVkLCBzaXplb2YoIHNpbXBsZURhdGEgKSwKCQkoY2hhciopJnNpbXBsZURhdGEgKSB7fQoKICAgIHZvaWQgc2V0RGF0YSggY2hhciAqZCwgaW50IGxlbiwgYm9vbCBhbGxvY2F0ZU1lbSA9IFRSVUUgKSB7CglRV1NFdmVudDo6c2V0RGF0YSggZCwgbGVuLCBhbGxvY2F0ZU1lbSApOwoJZGlzcGxheSA9IChjaGFyKilyYXdEYXRhUHRyOwogICAgfQoKICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCB3aW5kb3c7CglpbnQgbGVuOwoJaW50IGNsaWVudElkOwogICAgfSBzaW1wbGVEYXRhOwoKICAgIGNoYXIgKmRpc3BsYXk7Cn07CgpzdHJ1Y3QgUVdTTWF4V2luZG93UmVjdEV2ZW50IDogUVdTRXZlbnQgewogICAgUVdTTWF4V2luZG93UmVjdEV2ZW50KCkKCTogUVdTRXZlbnQoIE1heFdpbmRvd1JlY3QsIHNpemVvZiggc2ltcGxlRGF0YSApLCAoY2hhciopJnNpbXBsZURhdGEgKSB7IH0KICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCB3aW5kb3c7CglRUmVjdCByZWN0OwogICAgfSBzaW1wbGVEYXRhOwp9OwoKc3RydWN0IFFXU01vdXNlRXZlbnQgOiBRV1NFdmVudCB7CiAgICBRV1NNb3VzZUV2ZW50KCkKCTogUVdTRXZlbnQoIFFXU0V2ZW50OjpNb3VzZSwgc2l6ZW9mKCBzaW1wbGVEYXRhICksCgkJKGNoYXIqKSZzaW1wbGVEYXRhICkge30KICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCB3aW5kb3c7CglpbnQgeF9yb290LCB5X3Jvb3QsIHN0YXRlOwoJaW50IHRpbWU7IC8vIG1pbGxpc2Vjb25kcwogICAgfSBzaW1wbGVEYXRhOwp9OwoKc3RydWN0IFFXU0ZvY3VzRXZlbnQgOiBRV1NFdmVudCB7CiAgICBRV1NGb2N1c0V2ZW50KCkKCTogUVdTRXZlbnQoIFFXU0V2ZW50OjpGb2N1cywgc2l6ZW9mKCBzaW1wbGVEYXRhICksIChjaGFyKikmc2ltcGxlRGF0YSApCgl7IG1lbXNldCgoY2hhciopJnNpbXBsZURhdGEsMCxzaXplb2Yoc2ltcGxlRGF0YSkpOyB9CiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7CglpbnQgd2luZG93OwoJdWludCBnZXRfZm9jdXM6MTsKICAgIH0gc2ltcGxlRGF0YTsKfTsKCnN0cnVjdCBRV1NLZXlFdmVudDogUVdTRXZlbnQgewogICAgUVdTS2V5RXZlbnQoKQoJOiBRV1NFdmVudCggUVdTRXZlbnQ6OktleSwgc2l6ZW9mKCBzaW1wbGVEYXRhICksCgkgICAgICAoY2hhciopJnNpbXBsZURhdGEgKSB7fQogICAgc3RydWN0IFNpbXBsZURhdGEgewoJaW50IHdpbmRvdzsKCXVzaG9ydCB1bmljb2RlOwoJdXNob3J0IGtleWNvZGU7CglpbnQgbW9kaWZpZXJzOwoJdWludCBpc19wcmVzczoxOwoJdWludCBpc19hdXRvX3JlcGVhdDoxOwogICAgfSBzaW1wbGVEYXRhOwp9OwoKCnN0cnVjdCBRV1NDcmVhdGlvbkV2ZW50IDogUVdTRXZlbnQgewogICAgUVdTQ3JlYXRpb25FdmVudCgpCgk6IFFXU0V2ZW50KCBRV1NFdmVudDo6Q3JlYXRpb24sIHNpemVvZiggc2ltcGxlRGF0YSApLAoJICAgICAgKGNoYXIqKSZzaW1wbGVEYXRhICkge30KICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCBvYmplY3RpZDsKICAgIH0gc2ltcGxlRGF0YTsJCn07CgojaWZuZGVmIFFUX05PX1FXU19QUk9QRVJUSUVTCnN0cnVjdCBRV1NQcm9wZXJ0eU5vdGlmeUV2ZW50IDogUVdTRXZlbnQgewogICAgUVdTUHJvcGVydHlOb3RpZnlFdmVudCgpCgk6IFFXU0V2ZW50KCBRV1NFdmVudDo6UHJvcGVydHlOb3RpZnksIHNpemVvZiggc2ltcGxlRGF0YSApLAoJICAgICAgKGNoYXIqKSZzaW1wbGVEYXRhICkge30KICAgIGVudW0gU3RhdGUgewogICAgICAgIFByb3BlcnR5TmV3VmFsdWUsCiAgICAgICAgUHJvcGVydHlEZWxldGVkCiAgICB9OwogICAgc3RydWN0IFNpbXBsZURhdGEgewoJaW50IHdpbmRvdzsKCWludCBwcm9wZXJ0eTsKCWludCBzdGF0ZTsKICAgIH0gc2ltcGxlRGF0YTsKfTsKI2VuZGlmCgpzdHJ1Y3QgUVdTU2VsZWN0aW9uQ2xlYXJFdmVudCA6IFFXU0V2ZW50IHsKICAgIFFXU1NlbGVjdGlvbkNsZWFyRXZlbnQoKQoJOiBRV1NFdmVudCggUVdTRXZlbnQ6OlNlbGVjdGlvbkNsZWFyLCBzaXplb2YoIHNpbXBsZURhdGEgKSwKCSAgICAgIChjaGFyKikmc2ltcGxlRGF0YSApIHt9CiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7CglpbnQgd2luZG93OwogICAgfSBzaW1wbGVEYXRhOwp9OwoKc3RydWN0IFFXU1NlbGVjdGlvblJlcXVlc3RFdmVudCA6IFFXU0V2ZW50IHsKICAgIFFXU1NlbGVjdGlvblJlcXVlc3RFdmVudCgpCgk6IFFXU0V2ZW50KCBRV1NFdmVudDo6U2VsZWN0aW9uUmVxdWVzdCwgc2l6ZW9mKCBzaW1wbGVEYXRhICksCgkgICAgICAoY2hhciopJnNpbXBsZURhdGEgKSB7fQogICAgc3RydWN0IFNpbXBsZURhdGEgewoJaW50IHdpbmRvdzsKCWludCByZXF1ZXN0b3I7IC8vIHdpbmRvdyB3aGljaCB3YW50cyB0aGUgc2VsZWN0aW9uCglpbnQgcHJvcGVydHk7IC8vIHByb3BlcnR5IG9uIHJlcXVlc3RvciBpbnRvIHdoaWNoIHRoZSBzZWxlY3Rpb24gc2hvdWxkIGJlIHN0b3JlZCwgbm9ybWFsbHkgUVdTUHJvcGVydHk6OlByb3BTZWxlY3Rpb24KCWludCBtaW1lVHlwZXM7IC8vIFZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgcHJvcGVydHkgbWltZVR5cGUgb24gdGhlIHJlcXVlc3RvciB3aW5kb3cuIFRoaXMgdmFsdWUgbWF5IGNvbnRhaW4KCS8vIG11bHRpcGxlIG1pbWVUeXBlcyBzZXBhcmF0ZWQgYnkgOzsgd2hlcmUgdGhlIG9yZGVyIHJlZmxlY3RzIHRoZSBwcmlvcml0eQogICAgfSBzaW1wbGVEYXRhOwp9OwoKc3RydWN0IFFXU1NlbGVjdGlvbk5vdGlmeUV2ZW50IDogUVdTRXZlbnQgewogICAgUVdTU2VsZWN0aW9uTm90aWZ5RXZlbnQoKQoJOiBRV1NFdmVudCggUVdTRXZlbnQ6OlNlbGVjdGlvbk5vdGlmeSwgc2l6ZW9mKCBzaW1wbGVEYXRhICksCgkgICAgICAoY2hhciopJnNpbXBsZURhdGEgKSB7fQogICAgc3RydWN0IFNpbXBsZURhdGEgewoJaW50IHdpbmRvdzsKCWludCByZXF1ZXN0b3I7IC8vIHRoZSB3aW5kb3cgd2hpY2ggd2FudGVkIHRoZSBzZWxlY3Rpb24gYW5kIHRvIHdoaWNoIHRoaXMgZXZlbnQgaXMgc2VudAoJaW50IHByb3BlcnR5OyAvLyBwcm9wZXJ0eSBvZiByZXF1ZXN0b3IgaW4gd2hpY2ggdGhlIGRhdGEgb2YgdGhlIHNlbGVjdGlvbiBpcyBzdG9yZWQKCWludCBtaW1lVHlwZTsgLy8gYSBwcm9wZXJ0eSBvbiB0aGUgcmVxdWVzdG9yIGluIHdoaWNoIHRoZSBtaW1lIHR5cGUgaW4gd2hpY2ggdGhlIHNlbGVjdGlvbiBpcywgaXMgc3RvcmVkCiAgICB9IHNpbXBsZURhdGE7Cn07CgovL2NvbXBsZXggZXZlbnRzOgoKc3RydWN0IFFXU1JlZ2lvbk1vZGlmaWVkRXZlbnQgOiBRV1NFdmVudCB7CiAgICBRV1NSZWdpb25Nb2RpZmllZEV2ZW50KCkKCTogUVdTRXZlbnQoIFFXU0V2ZW50OjpSZWdpb25Nb2RpZmllZCwgc2l6ZW9mKCBzaW1wbGVEYXRhICksCgkJKGNoYXIqKSZzaW1wbGVEYXRhICkKCXsgbWVtc2V0KChjaGFyKikmc2ltcGxlRGF0YSwwLHNpemVvZihzaW1wbGVEYXRhKSk7IH0KCiAgICB2b2lkIHNldERhdGEoIGNoYXIgKmQsIGludCBsZW4sIGJvb2wgYWxsb2NhdGVNZW0gPSBUUlVFICkgewoJUVdTRXZlbnQ6OnNldERhdGEoIGQsIGxlbiwgYWxsb2NhdGVNZW0gKTsKCXJlY3RhbmdsZXMgPSAoUVJlY3QqKXJhd0RhdGFQdHI7CiAgICB9CgogICAgc3RydWN0IFNpbXBsZURhdGEgewoJaW50IHdpbmRvdzsKCWludCBucmVjdGFuZ2xlczsKCXVpbnQgaXNfYWNrOjE7CiAgICB9IHNpbXBsZURhdGE7CgogICAgUVJlY3QgKnJlY3RhbmdsZXM7Cn07CiNpZm5kZWYgUVRfTk9fUVdTX1BST1BFUlRJRVMKc3RydWN0IFFXU1Byb3BlcnR5UmVwbHlFdmVudCA6IFFXU0V2ZW50IHsKICAgIFFXU1Byb3BlcnR5UmVwbHlFdmVudCgpCgk6IFFXU0V2ZW50KCBRV1NFdmVudDo6UHJvcGVydHlSZXBseSwgc2l6ZW9mKCBzaW1wbGVEYXRhICksCgkJKGNoYXIqKSZzaW1wbGVEYXRhICkge30KCiAgICB2b2lkIHNldERhdGEoIGNoYXIgKmQsIGludCBsZW4sIGJvb2wgYWxsb2NhdGVNZW0gPSBUUlVFICkgewoJUVdTRXZlbnQ6OnNldERhdGEoIGQsIGxlbiwgYWxsb2NhdGVNZW0gKTsKCWRhdGEgPSAoY2hhciopcmF3RGF0YVB0cjsKICAgIH0KCiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7CglpbnQgd2luZG93OwoJaW50IHByb3BlcnR5OwoJaW50IGxlbjsKICAgIH0gc2ltcGxlRGF0YTsKICAgIGNoYXIgKmRhdGE7Cn07CiNlbmRpZiAvL1FUX05PX1FXU19QUk9QRVJUSUVTCgojaWZuZGVmIFFUX05PX0NPUApzdHJ1Y3QgUVdTUUNvcE1lc3NhZ2VFdmVudCA6IFFXU0V2ZW50IHsKICAgIFFXU1FDb3BNZXNzYWdlRXZlbnQoKQoJOiBRV1NFdmVudCggUVdTRXZlbnQ6OlFDb3BNZXNzYWdlLCBzaXplb2YoIHNpbXBsZURhdGEgKSwKCQkoY2hhciopJnNpbXBsZURhdGEgKQoJeyBtZW1zZXQoKGNoYXIqKSZzaW1wbGVEYXRhLDAsc2l6ZW9mKHNpbXBsZURhdGEpKTsgfQoKICAgIHZvaWQgc2V0RGF0YSggY2hhciAqZCwgaW50IGxlbiwgYm9vbCBhbGxvY2F0ZU1lbSA9IFRSVUUgKSB7CglRV1NFdmVudDo6c2V0RGF0YSggZCwgbGVuLCBhbGxvY2F0ZU1lbSApOwoJY2hhciogcCA9IChjaGFyKikgcmF3RGF0YVB0cjsKCWNoYW5uZWwgPSBRQ1N0cmluZyggcCwgc2ltcGxlRGF0YS5sY2hhbm5lbCArIDEgKTsKCXAgKz0gc2ltcGxlRGF0YS5sY2hhbm5lbDsKCW1lc3NhZ2UgPSBRQ1N0cmluZyggcCwgc2ltcGxlRGF0YS5sbWVzc2FnZSArIDEgKTsKCXAgKz0gc2ltcGxlRGF0YS5sbWVzc2FnZTsKCWRhdGEuZHVwbGljYXRlKCBwLCBzaW1wbGVEYXRhLmxkYXRhICk7CiAgICB9CgogICAgc3RydWN0IFNpbXBsZURhdGEgewoJYm9vbCBpc19yZXNwb25zZTsKCWludCBsY2hhbm5lbDsKCWludCBsbWVzc2FnZTsKCWludCBsZGF0YTsKICAgIH0gc2ltcGxlRGF0YTsKCiAgICBRQ1N0cmluZyBjaGFubmVsOwogICAgUUNTdHJpbmcgbWVzc2FnZTsKICAgIFFCeXRlQXJyYXkgZGF0YTsKfTsKCiNlbmRpZgoKc3RydWN0IFFXU1dpbmRvd09wZXJhdGlvbkV2ZW50IDogUVdTRXZlbnQgewogICAgUVdTV2luZG93T3BlcmF0aW9uRXZlbnQoKQoJOiBRV1NFdmVudCggV2luZG93T3BlcmF0aW9uLCBzaXplb2YoIHNpbXBsZURhdGEgKSwgKGNoYXIqKSZzaW1wbGVEYXRhICkgeyB9CgogICAgZW51bSBPcGVyYXRpb24geyBTaG93LCBIaWRlLCBTaG93TWF4aW1pemVkLCBTaG93Tm9ybWFsLCBTaG93TWluaW1pemVkLCBDbG9zZSB9OwogICAgc3RydWN0IFNpbXBsZURhdGEgewoJaW50IHdpbmRvdzsKCU9wZXJhdGlvbiBvcDsKICAgIH0gc2ltcGxlRGF0YTsKfTsKCiNpZm5kZWYgUVRfTk9fUVdTX0lNCnN0cnVjdCBRV1NJTUV2ZW50IDogUVdTRXZlbnQgewogICAgUVdTSU1FdmVudCgpCgk6IFFXU0V2ZW50KCBJTUV2ZW50LCBzaXplb2YoIHNpbXBsZURhdGEgKSwgKGNoYXIqKSZzaW1wbGVEYXRhICkgeyB9CgogICAgc3RydWN0IFNpbXBsZURhdGEgewoJaW50IHdpbmRvdzsKCWludCB0eXBlOwoJaW50IGNwb3M7CglpbnQgc2VsTGVuOwoJaW50IHRleHRMZW47CiAgICB9IHNpbXBsZURhdGE7CgogICAgdm9pZCBzZXREYXRhKCBjaGFyICpkLCBpbnQgbGVuLCBib29sIGFsbG9jYXRlTWVtID0gVFJVRSApIHsKCVFXU0V2ZW50OjpzZXREYXRhKCBkLCBsZW4sIGFsbG9jYXRlTWVtICk7Cgl0ZXh0ID0gKFFDaGFyKilyYXdEYXRhUHRyOwogICAgfQoKICAgIFFDaGFyICp0ZXh0Owp9OwojZW5kaWYKCiNlbmRpZiAvLyBRV1NFVkVOVF9RV1NfSAoAAAAcAHEAdQByAGwAbwBwAGUAcgBhAHQAbwByAC4AaAAAEd0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVVSTE9QRVJBVE9SX0gKI2RlZmluZSBRVVJMT1BFUkFUT1JfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxb2JqZWN0LmgiCiNpbmNsdWRlICJxdXJsLmgiCiNpbmNsdWRlICJxcHRybGlzdC5oIgojaW5jbHVkZSAicW5ldHdvcmtwcm90b2NvbC5oIgojaW5jbHVkZSAicXN0cmluZ2xpc3QuaCIgLy8gUVN0cmluZy0+UVN0cmluZ0xpc3QgY29udmVyc2lvbgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19ORVRXT1JLUFJPVE9DT0wKCmNsYXNzIFFVcmxJbmZvOwpjbGFzcyBRVXJsT3BlcmF0b3JQcml2YXRlOwoKY2xhc3MgUV9FWFBPUlQgUVVybE9wZXJhdG9yIDogcHVibGljIFFPYmplY3QsIHB1YmxpYyBRVXJsCnsKICAgIGZyaWVuZCBjbGFzcyBRTmV0d29ya1Byb3RvY29sOwoKICAgIFFfT0JKRUNUCgpwdWJsaWM6CiAgICBRVXJsT3BlcmF0b3IoKTsKICAgIFFVcmxPcGVyYXRvciggY29uc3QgUVN0cmluZyAmdXJMICk7CiAgICBRVXJsT3BlcmF0b3IoIGNvbnN0IFFVcmxPcGVyYXRvciYgdXJsICk7CiAgICBRVXJsT3BlcmF0b3IoIGNvbnN0IFFVcmxPcGVyYXRvciYgdXJsLCBjb25zdCBRU3RyaW5nJiByZWxVcmwsIGJvb2wgY2hlY2tTbGFzaCA9IEZBTFNFICk7CiAgICB2aXJ0dWFsIH5RVXJsT3BlcmF0b3IoKTsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0UGF0aCggY29uc3QgUVN0cmluZyYgcGF0aCApOwogICAgdmlydHVhbCBib29sIGNkVXAoKTsKCiAgICB2aXJ0dWFsIGNvbnN0IFFOZXR3b3JrT3BlcmF0aW9uICpsaXN0Q2hpbGRyZW4oKTsKICAgIHZpcnR1YWwgY29uc3QgUU5ldHdvcmtPcGVyYXRpb24gKm1rZGlyKCBjb25zdCBRU3RyaW5nICZkaXJuYW1lICk7CiAgICB2aXJ0dWFsIGNvbnN0IFFOZXR3b3JrT3BlcmF0aW9uICpyZW1vdmUoIGNvbnN0IFFTdHJpbmcgJmZpbGVuYW1lICk7CiAgICB2aXJ0dWFsIGNvbnN0IFFOZXR3b3JrT3BlcmF0aW9uICpyZW5hbWUoIGNvbnN0IFFTdHJpbmcgJm9sZG5hbWUsIGNvbnN0IFFTdHJpbmcgJm5ld25hbWUgKTsKICAgIHZpcnR1YWwgY29uc3QgUU5ldHdvcmtPcGVyYXRpb24gKmdldCggY29uc3QgUVN0cmluZyAmbG9jYXRpb24gPSBRU3RyaW5nOjpudWxsICk7CiAgICB2aXJ0dWFsIGNvbnN0IFFOZXR3b3JrT3BlcmF0aW9uICpwdXQoIGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEsIGNvbnN0IFFTdHJpbmcgJmxvY2F0aW9uID0gUVN0cmluZzo6bnVsbCAgKTsKICAgIHZpcnR1YWwgUVB0ckxpc3Q8UU5ldHdvcmtPcGVyYXRpb24+IGNvcHkoIGNvbnN0IFFTdHJpbmcgJmZyb20sIGNvbnN0IFFTdHJpbmcgJnRvLCBib29sIG1vdmUgPSBGQUxTRSwgYm9vbCB0b1BhdGggPSBUUlVFICk7CiAgICB2aXJ0dWFsIHZvaWQgY29weSggY29uc3QgUVN0cmluZ0xpc3QgJmZpbGVzLCBjb25zdCBRU3RyaW5nICZkZXN0LCBib29sIG1vdmUgPSBGQUxTRSApOwogICAgdmlydHVhbCBib29sIGlzRGlyKCBib29sICpvayA9IDAgKTsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0TmFtZUZpbHRlciggY29uc3QgUVN0cmluZyAmbmFtZUZpbHRlciApOwogICAgUVN0cmluZyBuYW1lRmlsdGVyKCkgY29uc3Q7CgogICAgdmlydHVhbCBRVXJsSW5mbyBpbmZvKCBjb25zdCBRU3RyaW5nICZlbnRyeSApIGNvbnN0OwoKICAgIFFVcmxPcGVyYXRvciYgb3BlcmF0b3I9KCBjb25zdCBRVXJsT3BlcmF0b3IgJnVybCApOwogICAgUVVybE9wZXJhdG9yJiBvcGVyYXRvcj0oIGNvbnN0IFFTdHJpbmcgJnVybCApOwoKICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CgpzaWduYWxzOgogICAgdm9pZCBuZXdDaGlsZHJlbiggY29uc3QgUVZhbHVlTGlzdDxRVXJsSW5mbz4gJiwgUU5ldHdvcmtPcGVyYXRpb24gKnJlcyApOwogICAgdm9pZCBmaW5pc2hlZCggUU5ldHdvcmtPcGVyYXRpb24gKnJlcyApOwogICAgdm9pZCBzdGFydCggUU5ldHdvcmtPcGVyYXRpb24gKnJlcyApOwogICAgdm9pZCBjcmVhdGVkRGlyZWN0b3J5KCBjb25zdCBRVXJsSW5mbyAmLCBRTmV0d29ya09wZXJhdGlvbiAqcmVzICk7CiAgICB2b2lkIHJlbW92ZWQoIFFOZXR3b3JrT3BlcmF0aW9uICpyZXMgKTsKICAgIHZvaWQgaXRlbUNoYW5nZWQoIFFOZXR3b3JrT3BlcmF0aW9uICpyZXMgKTsKICAgIHZvaWQgZGF0YSggY29uc3QgUUJ5dGVBcnJheSAmLCBRTmV0d29ya09wZXJhdGlvbiAqcmVzICk7CiAgICB2b2lkIGRhdGFUcmFuc2ZlclByb2dyZXNzKCBpbnQgYnl0ZXNEb25lLCBpbnQgYnl0ZXNUb3RhbCwgUU5ldHdvcmtPcGVyYXRpb24gKnJlcyApOwogICAgdm9pZCBzdGFydGVkTmV4dENvcHkoIGNvbnN0IFFQdHJMaXN0PFFOZXR3b3JrT3BlcmF0aW9uPiAmbHN0ICk7CiAgICB2b2lkIGNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoIGludCBzdGF0ZSwgY29uc3QgUVN0cmluZyAmZGF0YSApOwoKcHJvdGVjdGVkOgogICAgdm9pZCByZXNldCgpOwogICAgYm9vbCBwYXJzZSggY29uc3QgUVN0cmluZyYgdXJsICk7CiAgICB2aXJ0dWFsIGJvb2wgY2hlY2tWYWxpZCgpOwogICAgdmlydHVhbCB2b2lkIGNsZWFyRW50cmllcygpOwogICAgdm9pZCBnZXROZXR3b3JrUHJvdG9jb2woKTsKICAgIHZvaWQgZGVsZXRlTmV0d29ya1Byb3RvY29sKCk7Cgpwcml2YXRlIHNsb3RzOgogICAgY29uc3QgUU5ldHdvcmtPcGVyYXRpb24gKnN0YXJ0T3BlcmF0aW9uKCBRTmV0d29ya09wZXJhdGlvbiAqb3AgKTsKICAgIHZvaWQgY29weUdvdERhdGEoIGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEsIFFOZXR3b3JrT3BlcmF0aW9uICpvcCApOwogICAgdm9pZCBjb250aW51ZUNvcHkoIFFOZXR3b3JrT3BlcmF0aW9uICpvcCApOwogICAgdm9pZCBmaW5pc2hlZENvcHkoKTsKICAgIHZvaWQgYWRkRW50cnkoIGNvbnN0IFFWYWx1ZUxpc3Q8UVVybEluZm8+ICZpICk7CiAgICB2b2lkIHNsb3RJdGVtQ2hhbmdlZCggUU5ldHdvcmtPcGVyYXRpb24gKm9wICk7Cgpwcml2YXRlOgogICAgdm9pZCBkZWxldGVPcGVyYXRpb24oIFFOZXR3b3JrT3BlcmF0aW9uICpvcCApOwoKICAgIFFVcmxPcGVyYXRvclByaXZhdGUgKmQ7Cn07CgojZW5kaWYgLy8gUVRfTk9fTkVUV09SS1BST1RPQ09MCgojZW5kaWYgLy8gUVVSTE9QRVJBVE9SX0gKAAAALABxAHcAcwBrAGQAZQBkAGUAYwBvAHIAYQB0AGkAbwBuAF8AcQB3AHMALgBoAAAIdy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRV1NLREVERUNPUkFUSU9OX1FXU19ICiNkZWZpbmUgUVdTS0RFREVDT1JBVElPTl9RV1NfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxd3NkZWZhdWx0ZGVjb3JhdGlvbl9xd3MuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fUVdTX0tERV9XTV9TVFlMRQoKCmNsYXNzIFFXU0tERURlY29yYXRpb24gOiBwdWJsaWMgUVdTRGVmYXVsdERlY29yYXRpb24KewpwdWJsaWM6CiAgICBRV1NLREVEZWNvcmF0aW9uKCk7CiAgICB2aXJ0dWFsIH5RV1NLREVEZWNvcmF0aW9uKCk7CgogICAgdmlydHVhbCBRUmVnaW9uIHJlZ2lvbihjb25zdCBRV2lkZ2V0ICosIGNvbnN0IFFSZWN0ICZyZWN0LCBSZWdpb24pOwogICAgdmlydHVhbCB2b2lkIHBhaW50KFFQYWludGVyICosIGNvbnN0IFFXaWRnZXQgKik7CiAgICB2aXJ0dWFsIHZvaWQgcGFpbnRCdXR0b24oUVBhaW50ZXIgKiwgY29uc3QgUVdpZGdldCAqLCBSZWdpb24sIGludCBzdGF0ZSk7CnByb3RlY3RlZDoKLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KfTsKCiNlbmRpZiAvLyBRVF9OT19RV1NfS0RFX1dNX1NUWUxFCgojZW5kaWYgLy8gUVdTS0RFREVDT1JBVElPTl9RV1NfSAoAAAAoAHEAcwB5AG4AdABhAHgAaABpAGcAaABsAGkAZwBoAHQAZQByAC4AaAAACbAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRU1lOVEFYSElHSExJR0hURVJfSAojZGVmaW5lIFFTWU5UQVhISUdITElHSFRFUl9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFmb250LmgiCiNpbmNsdWRlICJxY29sb3IuaCIKI2luY2x1ZGUgInFzdHJpbmcuaCIKI2VuZGlmIC8vIFFUX0gKCmNsYXNzIFFUZXh0RWRpdDsKY2xhc3MgUVN5bnRheEhpZ2hsaWdodGVySW50ZXJuYWw7CmNsYXNzIFFTeW50YXhIaWdobGlnaHRlclByaXZhdGU7CmNsYXNzIFFUZXh0UGFyYWdyYXBoOwoKY2xhc3MgUV9FWFBPUlQgUVN5bnRheEhpZ2hsaWdodGVyIDogcHVibGljIFF0CnsKICAgIGZyaWVuZCBjbGFzcyBRU3ludGF4SGlnaGxpZ2h0ZXJJbnRlcm5hbDsKCnB1YmxpYzoKICAgIFFTeW50YXhIaWdobGlnaHRlciggUVRleHRFZGl0ICp0ZXh0RWRpdCApOwogICAgdmlydHVhbCB+UVN5bnRheEhpZ2hsaWdodGVyKCk7CgogICAgdmlydHVhbCBpbnQgaGlnaGxpZ2h0UGFyYWdyYXBoKCBjb25zdCBRU3RyaW5nICZ0ZXh0LCBpbnQgZW5kU3RhdGVPZkxhc3RQYXJhICkgPSAwOwoKICAgIHZvaWQgc2V0Rm9ybWF0KCBpbnQgc3RhcnQsIGludCBjb3VudCwgY29uc3QgUUZvbnQgJmZvbnQsIGNvbnN0IFFDb2xvciAmY29sb3IgKTsKICAgIHZvaWQgc2V0Rm9ybWF0KCBpbnQgc3RhcnQsIGludCBjb3VudCwgY29uc3QgUUNvbG9yICZjb2xvciApOwogICAgdm9pZCBzZXRGb3JtYXQoIGludCBzdGFydCwgaW50IGNvdW50LCBjb25zdCBRRm9udCAmZm9udCApOwogICAgUVRleHRFZGl0ICp0ZXh0RWRpdCgpIGNvbnN0IHsgcmV0dXJuIGVkaXQ7IH0KCiAgICB2b2lkIHJlaGlnaGxpZ2h0KCk7CgogICAgaW50IGN1cnJlbnRQYXJhZ3JhcGgoKSBjb25zdDsKCnByaXZhdGU6CiAgICBRVGV4dFBhcmFncmFwaCAqcGFyYTsKICAgIFFUZXh0RWRpdCAqZWRpdDsKICAgIFFTeW50YXhIaWdobGlnaHRlclByaXZhdGUgKmQ7Cgp9OwoKI2VuZGlmCgAAABAAcQB0AGEAYgBsAGUALgBoAABINS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFUQUJMRV9ICiNkZWZpbmUgUVRBQkxFX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXNjcm9sbHZpZXcuaCIKI2luY2x1ZGUgInFwaXhtYXAuaCIKI2luY2x1ZGUgInFwdHJ2ZWN0b3IuaCIKI2luY2x1ZGUgInFoZWFkZXIuaCIKI2luY2x1ZGUgInFtZW1hcnJheS5oIgojaW5jbHVkZSAicXB0cmxpc3QuaCIKI2luY2x1ZGUgInFndWFyZGVkcHRyLmgiCiNpbmNsdWRlICJxc2hhcmVkLmgiCiNpbmNsdWRlICJxaW50ZGljdC5oIgojaW5jbHVkZSAicXN0cmluZ2xpc3QuaCIKI2VuZGlmIC8vIFFUX0gKCgojaWZuZGVmIFFUX05PX1RBQkxFCgojaWYgIWRlZmluZWQoIFFUX01PRFVMRV9UQUJMRSApIHx8IGRlZmluZWQoIFFUX0xJQ0VOU0VfUFJPRkVTU0lPTkFMICkgfHwgZGVmaW5lZCggUVRfSU5URVJOQUxfVEFCTEUgKQojZGVmaW5lIFFNX0VYUE9SVF9UQUJMRQojaWZuZGVmIFFNX1RFTVBMQVRFX0VYVEVSTl9UQUJMRQojICAgZGVmaW5lIFFNX1RFTVBMQVRFX0VYVEVSTl9UQUJMRQojZW5kaWYKI2Vsc2UKI2RlZmluZSBRTV9FWFBPUlRfVEFCTEUgUV9FWFBPUlQKI2RlZmluZSBRTV9URU1QTEFURV9FWFRFUk5fVEFCTEUgUV9URU1QTEFURV9FWFRFUk4KI2VuZGlmCgpjbGFzcyBRVGFibGVIZWFkZXI7CmNsYXNzIFFWYWxpZGF0b3I7CmNsYXNzIFFUYWJsZTsKY2xhc3MgUVBhaW50RXZlbnQ7CmNsYXNzIFFUaW1lcjsKY2xhc3MgUVJlc2l6ZUV2ZW50OwpjbGFzcyBRQ29tYm9Cb3g7CmNsYXNzIFFDaGVja0JveDsKY2xhc3MgUURyYWdPYmplY3Q7CgpzdHJ1Y3QgUVRhYmxlUHJpdmF0ZTsKc3RydWN0IFFUYWJsZUhlYWRlclByaXZhdGU7CgoKY2xhc3MgUU1fRVhQT1JUX1RBQkxFIFFUYWJsZVNlbGVjdGlvbgp7CnB1YmxpYzoKICAgIFFUYWJsZVNlbGVjdGlvbigpOwogICAgUVRhYmxlU2VsZWN0aW9uKCBpbnQgc3RhcnRfcm93LCBpbnQgc3RhcnRfY29sLCBpbnQgZW5kX3JvdywgaW50IGVuZF9jb2wgKTsKICAgIHZvaWQgaW5pdCggaW50IHJvdywgaW50IGNvbCApOwogICAgdm9pZCBleHBhbmRUbyggaW50IHJvdywgaW50IGNvbCApOwogICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBRVGFibGVTZWxlY3Rpb24gJnMgKSBjb25zdDsKICAgIGJvb2wgb3BlcmF0b3IhPSggY29uc3QgUVRhYmxlU2VsZWN0aW9uICZzICkgY29uc3QgeyByZXR1cm4gIShvcGVyYXRvcj09KHMpKTsgfQoKICAgIGludCB0b3BSb3coKSBjb25zdCB7IHJldHVybiB0Um93OyB9CiAgICBpbnQgYm90dG9tUm93KCkgY29uc3QgeyByZXR1cm4gYlJvdzsgfQogICAgaW50IGxlZnRDb2woKSBjb25zdCB7IHJldHVybiBsQ29sOyB9CiAgICBpbnQgcmlnaHRDb2woKSBjb25zdCB7IHJldHVybiByQ29sOyB9CiAgICBpbnQgYW5jaG9yUm93KCkgY29uc3QgeyByZXR1cm4gYVJvdzsgfQogICAgaW50IGFuY2hvckNvbCgpIGNvbnN0IHsgcmV0dXJuIGFDb2w7IH0KICAgIGludCBudW1Sb3dzKCkgY29uc3Q7CiAgICBpbnQgbnVtQ29scygpIGNvbnN0OwoKICAgIGJvb2wgaXNBY3RpdmUoKSBjb25zdCB7IHJldHVybiBhY3RpdmU7IH0KICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG51bVJvd3MoKSA9PSAwOyB9Cgpwcml2YXRlOgogICAgdWludCBhY3RpdmUgOiAxOwogICAgdWludCBpbml0ZWQgOiAxOwogICAgaW50IHRSb3csIGxDb2wsIGJSb3csIHJDb2w7CiAgICBpbnQgYVJvdywgYUNvbDsKfTsKCiNkZWZpbmUgUV9ERUZJTkVEX1FUQUJMRV9TRUxFQ1RJT04KI2luY2x1ZGUgInF3aW5leHBvcnQuaCIKCmNsYXNzIFFNX0VYUE9SVF9UQUJMRSBRVGFibGVJdGVtIDogcHVibGljIFF0CnsKICAgIGZyaWVuZCBjbGFzcyBRVGFibGU7CgpwdWJsaWM6CiAgICBlbnVtIEVkaXRUeXBlIHsgTmV2ZXIsIE9uVHlwaW5nLCBXaGVuQ3VycmVudCwgQWx3YXlzIH07CgogICAgUVRhYmxlSXRlbSggUVRhYmxlICp0YWJsZSwgRWRpdFR5cGUgZXQgKTsKICAgIFFUYWJsZUl0ZW0oIFFUYWJsZSAqdGFibGUsIEVkaXRUeXBlIGV0LCBjb25zdCBRU3RyaW5nICZ0ZXh0ICk7CiAgICBRVGFibGVJdGVtKCBRVGFibGUgKnRhYmxlLCBFZGl0VHlwZSBldCwgY29uc3QgUVN0cmluZyAmdGV4dCwKICAgICAgICAgICAgICAgIGNvbnN0IFFQaXhtYXAgJnAgKTsKICAgIHZpcnR1YWwgflFUYWJsZUl0ZW0oKTsKCiAgICB2aXJ0dWFsIFFQaXhtYXAgcGl4bWFwKCkgY29uc3Q7CiAgICB2aXJ0dWFsIFFTdHJpbmcgdGV4dCgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFBpeG1hcCggY29uc3QgUVBpeG1hcCAmcCApOwogICAgdmlydHVhbCB2b2lkIHNldFRleHQoIGNvbnN0IFFTdHJpbmcgJnQgKTsKICAgIFFUYWJsZSAqdGFibGUoKSBjb25zdCB7IHJldHVybiB0OyB9CgogICAgdmlydHVhbCBpbnQgYWxpZ25tZW50KCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0V29yZFdyYXAoIGJvb2wgYiApOwogICAgYm9vbCB3b3JkV3JhcCgpIGNvbnN0OwoKICAgIEVkaXRUeXBlIGVkaXRUeXBlKCkgY29uc3Q7CiAgICB2aXJ0dWFsIFFXaWRnZXQgKmNyZWF0ZUVkaXRvcigpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRGcm9tRWRpdG9yKCBRV2lkZ2V0ICp3ICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0UmVwbGFjZWFibGUoIGJvb2wgKTsKICAgIGJvb2wgaXNSZXBsYWNlYWJsZSgpIGNvbnN0OwoKICAgIHZpcnR1YWwgUVN0cmluZyBrZXkoKSBjb25zdDsKICAgIHZpcnR1YWwgUVNpemUgc2l6ZUhpbnQoKSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0U3BhbiggaW50IHJzLCBpbnQgY3MgKTsKICAgIGludCByb3dTcGFuKCkgY29uc3Q7CiAgICBpbnQgY29sU3BhbigpIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCBzZXRSb3coIGludCByICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0Q29sKCBpbnQgYyApOwogICAgaW50IHJvdygpIGNvbnN0OwogICAgaW50IGNvbCgpIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCBwYWludCggUVBhaW50ZXIgKnAsIGNvbnN0IFFDb2xvckdyb3VwICZjZywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVJlY3QgJmNyLCBib29sIHNlbGVjdGVkICk7CgogICAgdm9pZCB1cGRhdGVFZGl0b3IoIGludCBvbGRSb3csIGludCBvbGRDb2wgKTsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0RW5hYmxlZCggYm9vbCBiICk7CiAgICBib29sIGlzRW5hYmxlZCgpIGNvbnN0OwoKICAgIHZpcnR1YWwgaW50IHJ0dGkoKSBjb25zdDsKICAgIHN0YXRpYyBpbnQgUlRUSTsKCnByaXZhdGU6CiAgICBRU3RyaW5nIHR4dDsKICAgIFFQaXhtYXAgcGl4OwogICAgUVRhYmxlICp0OwogICAgRWRpdFR5cGUgZWRUeXBlOwogICAgdWludCB3b3Jkd3JhcCA6IDE7CiAgICB1aW50IHRjaGEgOiAxOwogICAgdWludCBlbmFibGVkIDogMTsKICAgIGludCBydywgY2w7CiAgICBpbnQgcm93c3BhbiwgY29sc3BhbjsKI2lmIChRVF9WRVJTSU9OID49IDB4MDQwMDAwKQojZXJyb3IgIkFkZCBhIHNldEFsaWdubWVudCgpIGZ1bmN0aW9uIGluIDQuMCAoYnV0IG5vIGQgcG9pbnRlcikiCiNlbmRpZgp9OwoKI2RlZmluZSBRX0RFRklORURfUVRBQkxFX0lURU0KI2luY2x1ZGUgInF3aW5leHBvcnQuaCIKCmNsYXNzIFFNX0VYUE9SVF9UQUJMRSBRQ29tYm9UYWJsZUl0ZW0gOiBwdWJsaWMgUVRhYmxlSXRlbQp7CnB1YmxpYzoKICAgIFFDb21ib1RhYmxlSXRlbSggUVRhYmxlICp0YWJsZSwgY29uc3QgUVN0cmluZ0xpc3QgJmxpc3QsIGJvb2wgZWRpdGFibGUgPSBGQUxTRSApOwogICAgflFDb21ib1RhYmxlSXRlbSgpOwogICAgdmlydHVhbCBRV2lkZ2V0ICpjcmVhdGVFZGl0b3IoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50RnJvbUVkaXRvciggUVdpZGdldCAqdyApOwogICAgdmlydHVhbCB2b2lkIHBhaW50KCBRUGFpbnRlciAqcCwgY29uc3QgUUNvbG9yR3JvdXAgJmNnLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRUmVjdCAmY3IsIGJvb2wgc2VsZWN0ZWQgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRDdXJyZW50SXRlbSggaW50IGkgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRDdXJyZW50SXRlbSggY29uc3QgUVN0cmluZyAmaSApOwogICAgaW50IGN1cnJlbnRJdGVtKCkgY29uc3Q7CiAgICBRU3RyaW5nIGN1cnJlbnRUZXh0KCkgY29uc3Q7CiAgICBpbnQgY291bnQoKSBjb25zdDsKI2lmICFkZWZpbmVkKFFfTk9fVVNJTkdfS0VZV09SRCkKICAgIHVzaW5nIFFUYWJsZUl0ZW06OnRleHQ7CiNlbmRpZgogICAgUVN0cmluZyB0ZXh0KCBpbnQgaSApIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldEVkaXRhYmxlKCBib29sIGIgKTsKICAgIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFN0cmluZ0xpc3QoIGNvbnN0IFFTdHJpbmdMaXN0ICZsICk7CgogICAgaW50IHJ0dGkoKSBjb25zdDsKICAgIHN0YXRpYyBpbnQgUlRUSTsKCiAgICBRU2l6ZSBzaXplSGludCgpIGNvbnN0OwoKcHJpdmF0ZToKICAgIFFDb21ib0JveCAqY2I7CiAgICBRU3RyaW5nTGlzdCBlbnRyaWVzOwogICAgaW50IGN1cnJlbnQ7CiAgICBib29sIGVkaXQ7CiAgICBzdGF0aWMgUUNvbWJvQm94ICpmYWtlQ29tYm87CiAgICBzdGF0aWMgUVdpZGdldCAqZmFrZUNvbWJvV2lkZ2V0OwogICAgc3RhdGljIGludCBmYWtlUmVmOwoKfTsKCmNsYXNzIFFNX0VYUE9SVF9UQUJMRSBRQ2hlY2tUYWJsZUl0ZW0gOiBwdWJsaWMgUVRhYmxlSXRlbQp7CnB1YmxpYzoKICAgIFFDaGVja1RhYmxlSXRlbSggUVRhYmxlICp0YWJsZSwgY29uc3QgUVN0cmluZyAmdHh0ICk7CiAgICB2b2lkIHNldFRleHQoIGNvbnN0IFFTdHJpbmcgJnQgKTsKICAgIHZpcnR1YWwgUVdpZGdldCAqY3JlYXRlRWRpdG9yKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudEZyb21FZGl0b3IoIFFXaWRnZXQgKncgKTsKICAgIHZpcnR1YWwgdm9pZCBwYWludCggUVBhaW50ZXIgKnAsIGNvbnN0IFFDb2xvckdyb3VwICZjZywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVJlY3QgJmNyLCBib29sIHNlbGVjdGVkICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hlY2tlZCggYm9vbCBiICk7CiAgICBib29sIGlzQ2hlY2tlZCgpIGNvbnN0OwoKICAgIGludCBydHRpKCkgY29uc3Q7CiAgICBzdGF0aWMgaW50IFJUVEk7CgogICAgUVNpemUgc2l6ZUhpbnQoKSBjb25zdDsKCnByaXZhdGU6CiAgICBRQ2hlY2tCb3ggKmNiOwogICAgYm9vbCBjaGVja2VkOwoKfTsKCmNsYXNzIFFNX0VYUE9SVF9UQUJMRSBRVGFibGUgOiBwdWJsaWMgUVNjcm9sbFZpZXcKewogICAgUV9PQkpFQ1QKICAgIFFfRU5VTVMoIFNlbGVjdGlvbk1vZGUgRm9jdXNTdHlsZSApCiAgICBRX1BST1BFUlRZKCBpbnQgbnVtUm93cyBSRUFEIG51bVJvd3MgV1JJVEUgc2V0TnVtUm93cyApCiAgICBRX1BST1BFUlRZKCBpbnQgbnVtQ29scyBSRUFEIG51bUNvbHMgV1JJVEUgc2V0TnVtQ29scyApCiAgICBRX1BST1BFUlRZKCBib29sIHNob3dHcmlkIFJFQUQgc2hvd0dyaWQgV1JJVEUgc2V0U2hvd0dyaWQgKQogICAgUV9QUk9QRVJUWSggYm9vbCByb3dNb3ZpbmdFbmFibGVkIFJFQUQgcm93TW92aW5nRW5hYmxlZCBXUklURSBzZXRSb3dNb3ZpbmdFbmFibGVkICkKICAgIFFfUFJPUEVSVFkoIGJvb2wgY29sdW1uTW92aW5nRW5hYmxlZCBSRUFEIGNvbHVtbk1vdmluZ0VuYWJsZWQgV1JJVEUgc2V0Q29sdW1uTW92aW5nRW5hYmxlZCApCiAgICBRX1BST1BFUlRZKCBib29sIHJlYWRPbmx5IFJFQUQgaXNSZWFkT25seSBXUklURSBzZXRSZWFkT25seSApCiAgICBRX1BST1BFUlRZKCBib29sIHNvcnRpbmcgUkVBRCBzb3J0aW5nIFdSSVRFIHNldFNvcnRpbmcgKQogICAgUV9QUk9QRVJUWSggU2VsZWN0aW9uTW9kZSBzZWxlY3Rpb25Nb2RlIFJFQUQgc2VsZWN0aW9uTW9kZSBXUklURSBzZXRTZWxlY3Rpb25Nb2RlICkKICAgIFFfUFJPUEVSVFkoIEZvY3VzU3R5bGUgZm9jdXNTdHlsZSBSRUFEIGZvY3VzU3R5bGUgV1JJVEUgc2V0Rm9jdXNTdHlsZSApCiAgICBRX1BST1BFUlRZKCBpbnQgbnVtU2VsZWN0aW9ucyBSRUFEIG51bVNlbGVjdGlvbnMgKQoKICAgIGZyaWVuZCBjbGFzcyBRVGFibGVIZWFkZXI7CiAgICBmcmllbmQgY2xhc3MgUUNvbWJvVGFibGVJdGVtOwogICAgZnJpZW5kIGNsYXNzIFFDaGVja1RhYmxlSXRlbTsKICAgIGZyaWVuZCBjbGFzcyBRVGFibGVJdGVtOwoKcHVibGljOgogICAgUVRhYmxlKCBRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wICk7CiAgICBRVGFibGUoIGludCBudW1Sb3dzLCBpbnQgbnVtQ29scywKICAgICAgICAgICAgUVdpZGdldCogcGFyZW50PTAsIGNvbnN0IGNoYXIqIG5hbWU9MCApOwogICAgflFUYWJsZSgpOwoKICAgIFFIZWFkZXIgKmhvcml6b250YWxIZWFkZXIoKSBjb25zdDsKICAgIFFIZWFkZXIgKnZlcnRpY2FsSGVhZGVyKCkgY29uc3Q7CgogICAgZW51bSBTZWxlY3Rpb25Nb2RlIHsgU2luZ2xlLCBNdWx0aSwgU2luZ2xlUm93LCBNdWx0aVJvdywgTm9TZWxlY3Rpb24gfTsKICAgIHZpcnR1YWwgdm9pZCBzZXRTZWxlY3Rpb25Nb2RlKCBTZWxlY3Rpb25Nb2RlIG1vZGUgKTsKICAgIFNlbGVjdGlvbk1vZGUgc2VsZWN0aW9uTW9kZSgpIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCBzZXRJdGVtKCBpbnQgcm93LCBpbnQgY29sLCBRVGFibGVJdGVtICppdGVtICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0VGV4dCggaW50IHJvdywgaW50IGNvbCwgY29uc3QgUVN0cmluZyAmdGV4dCApOwogICAgdmlydHVhbCB2b2lkIHNldFBpeG1hcCggaW50IHJvdywgaW50IGNvbCwgY29uc3QgUVBpeG1hcCAmcGl4ICk7CiAgICB2aXJ0dWFsIFFUYWJsZUl0ZW0gKml0ZW0oIGludCByb3csIGludCBjb2wgKSBjb25zdDsKICAgIHZpcnR1YWwgUVN0cmluZyB0ZXh0KCBpbnQgcm93LCBpbnQgY29sICkgY29uc3Q7CiAgICB2aXJ0dWFsIFFQaXhtYXAgcGl4bWFwKCBpbnQgcm93LCBpbnQgY29sICkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDZWxsKCBpbnQgcm93LCBpbnQgY29sICk7CgogICAgdmlydHVhbCBRUmVjdCBjZWxsR2VvbWV0cnkoIGludCByb3csIGludCBjb2wgKSBjb25zdDsKICAgIHZpcnR1YWwgaW50IGNvbHVtbldpZHRoKCBpbnQgY29sICkgY29uc3Q7CiAgICB2aXJ0dWFsIGludCByb3dIZWlnaHQoIGludCByb3cgKSBjb25zdDsKICAgIHZpcnR1YWwgaW50IGNvbHVtblBvcyggaW50IGNvbCApIGNvbnN0OwogICAgdmlydHVhbCBpbnQgcm93UG9zKCBpbnQgcm93ICkgY29uc3Q7CiAgICB2aXJ0dWFsIGludCBjb2x1bW5BdCggaW50IHggKSBjb25zdDsKICAgIHZpcnR1YWwgaW50IHJvd0F0KCBpbnQgeSApIGNvbnN0OwoKICAgIHZpcnR1YWwgaW50IG51bVJvd3MoKSBjb25zdDsKICAgIHZpcnR1YWwgaW50IG51bUNvbHMoKSBjb25zdDsKCiAgICB2b2lkIHVwZGF0ZUNlbGwoIGludCByb3csIGludCBjb2wgKTsKCiAgICBib29sIGV2ZW50RmlsdGVyKCBRT2JqZWN0ICogbywgUUV2ZW50ICogKTsKCiAgICBpbnQgY3VycmVudFJvdygpIGNvbnN0IHsgcmV0dXJuIGN1clJvdzsgfQogICAgaW50IGN1cnJlbnRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBjdXJDb2w7IH0KICAgIHZvaWQgZW5zdXJlQ2VsbFZpc2libGUoIGludCByb3csIGludCBjb2wgKTsKCiAgICBib29sIGlzU2VsZWN0ZWQoIGludCByb3csIGludCBjb2wgKSBjb25zdDsKICAgIGJvb2wgaXNSb3dTZWxlY3RlZCggaW50IHJvdywgYm9vbCBmdWxsID0gRkFMU0UgKSBjb25zdDsKICAgIGJvb2wgaXNDb2x1bW5TZWxlY3RlZCggaW50IGNvbCwgYm9vbCBmdWxsID0gRkFMU0UgKSBjb25zdDsKICAgIGludCBudW1TZWxlY3Rpb25zKCkgY29uc3Q7CiAgICBRVGFibGVTZWxlY3Rpb24gc2VsZWN0aW9uKCBpbnQgbnVtICkgY29uc3Q7CiAgICB2aXJ0dWFsIGludCBhZGRTZWxlY3Rpb24oIGNvbnN0IFFUYWJsZVNlbGVjdGlvbiAmcyApOwogICAgdmlydHVhbCB2b2lkIHJlbW92ZVNlbGVjdGlvbiggY29uc3QgUVRhYmxlU2VsZWN0aW9uICZzICk7CiAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlU2VsZWN0aW9uKCBpbnQgbnVtICk7CiAgICB2aXJ0dWFsIGludCBjdXJyZW50U2VsZWN0aW9uKCkgY29uc3Q7CgogICAgdm9pZCBzZWxlY3RDZWxscyggaW50IHN0YXJ0X3JvdywgaW50IHN0YXJ0X2NvbCwgaW50IGVuZF9yb3csIGludCBlbmRfY29sICk7CiAgICB2b2lkIHNlbGVjdFJvdyggaW50IHJvdyApOwogICAgdm9pZCBzZWxlY3RDb2x1bW4oIGludCBjb2wgKTsKCiAgICBib29sIHNob3dHcmlkKCkgY29uc3Q7CgogICAgYm9vbCBjb2x1bW5Nb3ZpbmdFbmFibGVkKCkgY29uc3Q7CiAgICBib29sIHJvd01vdmluZ0VuYWJsZWQoKSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQgc29ydENvbHVtbiggaW50IGNvbCwgYm9vbCBhc2NlbmRpbmcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2hvbGVSb3dzID0gRkFMU0UgKTsKICAgIGJvb2wgc29ydGluZygpIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCB0YWtlSXRlbSggUVRhYmxlSXRlbSAqaSApOwoKICAgIHZpcnR1YWwgdm9pZCBzZXRDZWxsV2lkZ2V0KCBpbnQgcm93LCBpbnQgY29sLCBRV2lkZ2V0ICplICk7CiAgICB2aXJ0dWFsIFFXaWRnZXQgKmNlbGxXaWRnZXQoIGludCByb3csIGludCBjb2wgKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBjbGVhckNlbGxXaWRnZXQoIGludCByb3csIGludCBjb2wgKTsKCiAgICB2aXJ0dWFsIFFSZWN0IGNlbGxSZWN0KCBpbnQgcm93LCBpbnQgY29sICkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHBhaW50Q2VsbCggUVBhaW50ZXIgKnAsIGludCByb3csIGludCBjb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRUmVjdCAmY3IsIGJvb2wgc2VsZWN0ZWQgKTsKICAgIHZpcnR1YWwgdm9pZCBwYWludENlbGwoIFFQYWludGVyICpwLCBpbnQgcm93LCBpbnQgY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVJlY3QgJmNyLCBib29sIHNlbGVjdGVkLCBjb25zdCBRQ29sb3JHcm91cCAmY2cgKTsKICAgIHZpcnR1YWwgdm9pZCBwYWludEZvY3VzKCBRUGFpbnRlciAqcCwgY29uc3QgUVJlY3QgJnIgKTsKICAgIFFTaXplIHNpemVIaW50KCkgY29uc3Q7CgogICAgYm9vbCBpc1JlYWRPbmx5KCkgY29uc3Q7CiAgICBib29sIGlzUm93UmVhZE9ubHkoIGludCByb3cgKSBjb25zdDsKICAgIGJvb2wgaXNDb2x1bW5SZWFkT25seSggaW50IGNvbCApIGNvbnN0OwoKICAgIHZvaWQgc2V0RW5hYmxlZCggYm9vbCBiICk7CgogICAgdm9pZCByZXBhaW50U2VsZWN0aW9ucygpOwoKICAgIGVudW0gRm9jdXNTdHlsZSB7IEZvbGxvd1N0eWxlLCBTcHJlYWRTaGVldCB9OwogICAgdmlydHVhbCB2b2lkIHNldEZvY3VzU3R5bGUoIEZvY3VzU3R5bGUgZnMgKTsKICAgIEZvY3VzU3R5bGUgZm9jdXNTdHlsZSgpIGNvbnN0OwoKICAgIHZvaWQgdXBkYXRlSGVhZGVyU3RhdGVzKCk7CgpwdWJsaWMgc2xvdHM6CiAgICB2aXJ0dWFsIHZvaWQgc2V0TnVtUm93cyggaW50IHIgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXROdW1Db2xzKCBpbnQgciApOwogICAgdmlydHVhbCB2b2lkIHNldFNob3dHcmlkKCBib29sIGIgKTsKICAgIHZpcnR1YWwgdm9pZCBoaWRlUm93KCBpbnQgcm93ICk7CiAgICB2aXJ0dWFsIHZvaWQgaGlkZUNvbHVtbiggaW50IGNvbCApOwogICAgdmlydHVhbCB2b2lkIHNob3dSb3coIGludCByb3cgKTsKICAgIHZpcnR1YWwgdm9pZCBzaG93Q29sdW1uKCBpbnQgY29sICk7CiAgICBib29sIGlzUm93SGlkZGVuKCBpbnQgcm93ICkgY29uc3Q7CiAgICBib29sIGlzQ29sdW1uSGlkZGVuKCBpbnQgY29sICkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldENvbHVtbldpZHRoKCBpbnQgY29sLCBpbnQgdyApOwogICAgdmlydHVhbCB2b2lkIHNldFJvd0hlaWdodCggaW50IHJvdywgaW50IGggKTsKCiAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0Q29sdW1uKCBpbnQgY29sICk7CiAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0Um93KCBpbnQgcm93ICk7CgogICAgdmlydHVhbCB2b2lkIHNldENvbHVtblN0cmV0Y2hhYmxlKCBpbnQgY29sLCBib29sIHN0cmV0Y2ggKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRSb3dTdHJldGNoYWJsZSggaW50IHJvdywgYm9vbCBzdHJldGNoICk7CiAgICBib29sIGlzQ29sdW1uU3RyZXRjaGFibGUoIGludCBjb2wgKSBjb25zdDsKICAgIGJvb2wgaXNSb3dTdHJldGNoYWJsZSggaW50IHJvdyApIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFNvcnRpbmcoIGJvb2wgYiApOwogICAgdmlydHVhbCB2b2lkIHN3YXBSb3dzKCBpbnQgcm93MSwgaW50IHJvdzIsIGJvb2wgc3dhcEhlYWRlciA9IEZBTFNFICk7CiAgICB2aXJ0dWFsIHZvaWQgc3dhcENvbHVtbnMoIGludCBjb2wxLCBpbnQgY29sMiwgYm9vbCBzd2FwSGVhZGVyID0gRkFMU0UgKTsKICAgIHZpcnR1YWwgdm9pZCBzd2FwQ2VsbHMoIGludCByb3cxLCBpbnQgY29sMSwgaW50IHJvdzIsIGludCBjb2wyICk7CgogICAgdmlydHVhbCB2b2lkIHNldExlZnRNYXJnaW4oIGludCBtICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0VG9wTWFyZ2luKCBpbnQgbSApOwogICAgdmlydHVhbCB2b2lkIHNldEN1cnJlbnRDZWxsKCBpbnQgcm93LCBpbnQgY29sICk7CiAgICB2b2lkIGNsZWFyU2VsZWN0aW9uKCBib29sIHJlcGFpbnQgPSBUUlVFICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0Q29sdW1uTW92aW5nRW5hYmxlZCggYm9vbCBiICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0Um93TW92aW5nRW5hYmxlZCggYm9vbCBiICk7CgogICAgdmlydHVhbCB2b2lkIHNldFJlYWRPbmx5KCBib29sIGIgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRSb3dSZWFkT25seSggaW50IHJvdywgYm9vbCBybyApOwogICAgdmlydHVhbCB2b2lkIHNldENvbHVtblJlYWRPbmx5KCBpbnQgY29sLCBib29sIHJvICk7CgogICAgdmlydHVhbCB2b2lkIHNldERyYWdFbmFibGVkKCBib29sIGIgKTsKICAgIGJvb2wgZHJhZ0VuYWJsZWQoKSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0Um93cyggaW50IHJvdywgaW50IGNvdW50ID0gMSApOwogICAgdmlydHVhbCB2b2lkIGluc2VydENvbHVtbnMoIGludCBjb2wsIGludCBjb3VudCA9IDEgKTsKICAgIHZpcnR1YWwgdm9pZCByZW1vdmVSb3coIGludCByb3cgKTsKICAgIHZpcnR1YWwgdm9pZCByZW1vdmVSb3dzKCBjb25zdCBRTWVtQXJyYXk8aW50PiAmcm93cyApOwogICAgdmlydHVhbCB2b2lkIHJlbW92ZUNvbHVtbiggaW50IGNvbCApOwogICAgdmlydHVhbCB2b2lkIHJlbW92ZUNvbHVtbnMoIGNvbnN0IFFNZW1BcnJheTxpbnQ+ICZjb2xzICk7CgogICAgdmlydHVhbCB2b2lkIGVkaXRDZWxsKCBpbnQgcm93LCBpbnQgY29sLCBib29sIHJlcGxhY2UgPSBGQUxTRSApOwoKICAgIHZvaWQgc2V0Um93TGFiZWxzKCBjb25zdCBRU3RyaW5nTGlzdCAmbGFiZWxzICk7CiAgICB2b2lkIHNldENvbHVtbkxhYmVscyggY29uc3QgUVN0cmluZ0xpc3QgJmxhYmVscyApOwoKcHJvdGVjdGVkOgogICAgZW51bSBFZGl0TW9kZSB7IE5vdEVkaXRpbmcsIEVkaXRpbmcsIFJlcGxhY2luZyB9OwogICAgdm9pZCBkcmF3Q29udGVudHMoIFFQYWludGVyICpwLCBpbnQgY3gsIGludCBjeSwgaW50IGN3LCBpbnQgY2ggKTsKICAgIHZvaWQgY29udGVudHNNb3VzZVByZXNzRXZlbnQoIFFNb3VzZUV2ZW50KiApOwogICAgdm9pZCBjb250ZW50c01vdXNlTW92ZUV2ZW50KCBRTW91c2VFdmVudCogKTsKICAgIHZvaWQgY29udGVudHNNb3VzZURvdWJsZUNsaWNrRXZlbnQoIFFNb3VzZUV2ZW50KiApOwogICAgdm9pZCBjb250ZW50c01vdXNlUmVsZWFzZUV2ZW50KCBRTW91c2VFdmVudCogKTsKICAgIHZvaWQgY29udGVudHNDb250ZXh0TWVudUV2ZW50KCBRQ29udGV4dE1lbnVFdmVudCAqIGUgKTsKICAgIHZvaWQga2V5UHJlc3NFdmVudCggUUtleUV2ZW50KiApOwogICAgdm9pZCBmb2N1c0luRXZlbnQoIFFGb2N1c0V2ZW50KiApOwogICAgdm9pZCBmb2N1c091dEV2ZW50KCBRRm9jdXNFdmVudCogKTsKICAgIHZvaWQgdmlld3BvcnRSZXNpemVFdmVudCggUVJlc2l6ZUV2ZW50ICogKTsKICAgIHZvaWQgc2hvd0V2ZW50KCBRU2hvd0V2ZW50ICplICk7CiAgICB2b2lkIHBhaW50RXZlbnQoIFFQYWludEV2ZW50ICplICk7CiAgICB2b2lkIHNldEVkaXRNb2RlKCBFZGl0TW9kZSBtb2RlLCBpbnQgcm93LCBpbnQgY29sICk7CiNpZm5kZWYgUVRfTk9fRFJBR0FORERST1AKICAgIHZpcnR1YWwgdm9pZCBjb250ZW50c0RyYWdFbnRlckV2ZW50KCBRRHJhZ0VudGVyRXZlbnQgKmUgKTsKICAgIHZpcnR1YWwgdm9pZCBjb250ZW50c0RyYWdNb3ZlRXZlbnQoIFFEcmFnTW92ZUV2ZW50ICplICk7CiAgICB2aXJ0dWFsIHZvaWQgY29udGVudHNEcmFnTGVhdmVFdmVudCggUURyYWdMZWF2ZUV2ZW50ICplICk7CiAgICB2aXJ0dWFsIHZvaWQgY29udGVudHNEcm9wRXZlbnQoIFFEcm9wRXZlbnQgKmUgKTsKICAgIHZpcnR1YWwgUURyYWdPYmplY3QgKmRyYWdPYmplY3QoKTsKICAgIHZpcnR1YWwgdm9pZCBzdGFydERyYWcoKTsKI2VuZGlmCgogICAgdmlydHVhbCB2b2lkIHBhaW50RW1wdHlBcmVhKCBRUGFpbnRlciAqcCwgaW50IGN4LCBpbnQgY3ksIGludCBjdywgaW50IGNoICk7CiAgICB2aXJ0dWFsIHZvaWQgYWN0aXZhdGVOZXh0Q2VsbCgpOwogICAgdmlydHVhbCBRV2lkZ2V0ICpjcmVhdGVFZGl0b3IoIGludCByb3csIGludCBjb2wsIGJvb2wgaW5pdEZyb21DZWxsICkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0Q2VsbENvbnRlbnRGcm9tRWRpdG9yKCBpbnQgcm93LCBpbnQgY29sICk7CiAgICB2aXJ0dWFsIFFXaWRnZXQgKmJlZ2luRWRpdCggaW50IHJvdywgaW50IGNvbCwgYm9vbCByZXBsYWNlICk7CiAgICB2aXJ0dWFsIHZvaWQgZW5kRWRpdCggaW50IHJvdywgaW50IGNvbCwgYm9vbCBhY2NlcHQsIGJvb2wgcmVwbGFjZSApOwoKICAgIHZpcnR1YWwgdm9pZCByZXNpemVEYXRhKCBpbnQgbGVuICk7CiAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0V2lkZ2V0KCBpbnQgcm93LCBpbnQgY29sLCBRV2lkZ2V0ICp3ICk7CiAgICBpbnQgaW5kZXhPZiggaW50IHJvdywgaW50IGNvbCApIGNvbnN0OwoKICAgIHZvaWQgd2luZG93QWN0aXZhdGlvbkNoYW5nZSggYm9vbCApOwogICAgYm9vbCBpc0VkaXRpbmcoKSBjb25zdDsKICAgIEVkaXRNb2RlIGVkaXRNb2RlKCkgY29uc3Q7CiAgICBpbnQgY3VyckVkaXRSb3coKSBjb25zdDsKICAgIGludCBjdXJyRWRpdENvbCgpIGNvbnN0OwoKcHJvdGVjdGVkIHNsb3RzOgogICAgdmlydHVhbCB2b2lkIGNvbHVtbldpZHRoQ2hhbmdlZCggaW50IGNvbCApOwogICAgdmlydHVhbCB2b2lkIHJvd0hlaWdodENoYW5nZWQoIGludCByb3cgKTsKICAgIHZpcnR1YWwgdm9pZCBjb2x1bW5JbmRleENoYW5nZWQoIGludCBzZWN0aW9uLCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCApOwogICAgdmlydHVhbCB2b2lkIHJvd0luZGV4Q2hhbmdlZCggaW50IHNlY3Rpb24sIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4ICk7CiAgICB2aXJ0dWFsIHZvaWQgY29sdW1uQ2xpY2tlZCggaW50IGNvbCApOwoKc2lnbmFsczoKICAgIHZvaWQgY3VycmVudENoYW5nZWQoIGludCByb3csIGludCBjb2wgKTsKICAgIHZvaWQgY2xpY2tlZCggaW50IHJvdywgaW50IGNvbCwgaW50IGJ1dHRvbiwgY29uc3QgUVBvaW50ICZtb3VzZVBvcyApOwogICAgdm9pZCBkb3VibGVDbGlja2VkKCBpbnQgcm93LCBpbnQgY29sLCBpbnQgYnV0dG9uLCBjb25zdCBRUG9pbnQgJm1vdXNlUG9zICk7CiAgICB2b2lkIHByZXNzZWQoIGludCByb3csIGludCBjb2wsIGludCBidXR0b24sIGNvbnN0IFFQb2ludCAmbW91c2VQb3MgKTsKICAgIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgpOwogICAgdm9pZCB2YWx1ZUNoYW5nZWQoIGludCByb3csIGludCBjb2wgKTsKICAgIHZvaWQgY29udGV4dE1lbnVSZXF1ZXN0ZWQoIGludCByb3csIGludCBjb2wsIGNvbnN0IFFQb2ludCAmcG9zICk7CiNpZm5kZWYgUVRfTk9fRFJBR0FORERST1AKICAgIHZvaWQgZHJvcHBlZCggUURyb3BFdmVudCAqZSApOwojZW5kaWYKCnByaXZhdGUgc2xvdHM6CiAgICB2b2lkIGRvQXV0b1Njcm9sbCgpOwogICAgdm9pZCBkb1ZhbHVlQ2hhbmdlZCgpOwogICAgdm9pZCB1cGRhdGVHZW9tZXRyaWVzU2xvdCgpOwoKcHJpdmF0ZToKICAgIHZvaWQgY29udGVudHNNb3VzZVByZXNzRXZlbnRFeCggUU1vdXNlRXZlbnQqICk7CiAgICB2b2lkIGRyYXdDb250ZW50cyggUVBhaW50ZXIqICk7CiAgICB2b2lkIHVwZGF0ZUdlb21ldHJpZXMoKTsKICAgIHZvaWQgcmVwYWludFNlbGVjdGlvbnMoIFFUYWJsZVNlbGVjdGlvbiAqb2xkU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUVRhYmxlU2VsZWN0aW9uICpuZXdTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVwZGF0ZVZlcnRpY2FsID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXBkYXRlSG9yaXpvbnRhbCA9IFRSVUUgKTsKICAgIFFSZWN0IHJhbmdlR2VvbWV0cnkoIGludCB0b3BSb3csIGludCBsZWZ0Q29sLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbVJvdywgaW50IHJpZ2h0Q29sLCBib29sICZvcHRpbWl6ZSApOwogICAgdm9pZCBmaXhSb3coIGludCAmcm93LCBpbnQgeSApOwogICAgdm9pZCBmaXhDb2woIGludCAmY29sLCBpbnQgeCApOwoKICAgIHZvaWQgaW5pdCggaW50IG51bVJvd3MsIGludCBudW1Db2xzICk7CiAgICBRU2l6ZSB0YWJsZVNpemUoKSBjb25zdDsKICAgIHZvaWQgcmVwYWludENlbGwoIGludCByb3csIGludCBjb2wgKTsKICAgIHZvaWQgY29udGVudHNUb1ZpZXdwb3J0MiggaW50IHgsIGludCB5LCBpbnQmIHZ4LCBpbnQmIHZ5ICk7CiAgICBRUG9pbnQgY29udGVudHNUb1ZpZXdwb3J0MiggY29uc3QgUVBvaW50ICZwICk7CiAgICB2b2lkIHZpZXdwb3J0VG9Db250ZW50czIoIGludCB2eCwgaW50IHZ5LCBpbnQmIHgsIGludCYgeSApOwogICAgUVBvaW50IHZpZXdwb3J0VG9Db250ZW50czIoIGNvbnN0IFFQb2ludCAmcCApOwoKICAgIHZvaWQgdXBkYXRlUm93V2lkZ2V0cyggaW50IHJvdyApOwogICAgdm9pZCB1cGRhdGVDb2xXaWRnZXRzKCBpbnQgY29sICk7CiAgICBib29sIGlzU2VsZWN0ZWQoIGludCByb3csIGludCBjb2wsIGJvb2wgaW5jbHVkZUN1cnJlbnQgKSBjb25zdDsKICAgIHZvaWQgc2V0Q3VycmVudENlbGwoIGludCByb3csIGludCBjb2wsIGJvb2wgdXBkYXRlU2VsZWN0aW9ucywgYm9vbCBlbnN1cmVWaXNpYmxlID0gRkFMU0UgKTsKICAgIHZvaWQgZml4Q2VsbCggaW50ICZyb3csIGludCAmY29sLCBpbnQga2V5ICk7CiAgICB2b2lkIGRlbGF5ZWRVcGRhdGVHZW9tZXRyaWVzKCk7CiAgICBzdHJ1Y3QgVGFibGVXaWRnZXQKICAgIHsKCVRhYmxlV2lkZ2V0KCBRV2lkZ2V0ICp3LCBpbnQgciwgaW50IGMgKSA6IHdpZCggdyApLCByb3coIHIgKSwgY29sICggYyApIHt9CglRV2lkZ2V0ICp3aWQ7CglpbnQgcm93LCBjb2w7CiAgICB9OwogICAgdm9pZCBzYXZlQ29udGVudHMoIFFQdHJWZWN0b3I8UVRhYmxlSXRlbT4gJnRtcCwKCQkgICAgICAgUVB0clZlY3RvcjxUYWJsZVdpZGdldD4gJnRtcDIgKTsKICAgIHZvaWQgdXBkYXRlSGVhZGVyQW5kUmVzaXplQ29udGVudHMoIFFUYWJsZUhlYWRlciAqaGVhZGVyLAoJCQkJCWludCBudW0sIGludCBjb2xSb3csCgkJCQkJaW50IHdpZHRoLCBib29sICZ1cGRhdGVCZWZvcmUgKTsKICAgIHZvaWQgcmVzdG9yZUNvbnRlbnRzKCBRUHRyVmVjdG9yPFFUYWJsZUl0ZW0+ICZ0bXAsCgkJCSAgUVB0clZlY3RvcjxUYWJsZVdpZGdldD4gJnRtcDIgKTsKICAgIHZvaWQgZmluaXNoQ29udGVudHNSZXN6ZSggYm9vbCB1cGRhdGVCZWZvcmUgKTsKCnByaXZhdGU6CiAgICBRUHRyVmVjdG9yPFFUYWJsZUl0ZW0+IGNvbnRlbnRzOwogICAgUVB0clZlY3RvcjxRV2lkZ2V0PiB3aWRnZXRzOwogICAgaW50IGN1clJvdzsKICAgIGludCBjdXJDb2w7CiAgICBRVGFibGVIZWFkZXIgKmxlZnRIZWFkZXIsICp0b3BIZWFkZXI7CiAgICBFZGl0TW9kZSBlZE1vZGU7CiAgICBpbnQgZWRpdENvbCwgZWRpdFJvdzsKICAgIFFQdHJMaXN0PFFUYWJsZVNlbGVjdGlvbj4gc2VsZWN0aW9uczsKICAgIFFUYWJsZVNlbGVjdGlvbiAqY3VycmVudFNlbDsKICAgIFFUaW1lciAqYXV0b1Njcm9sbFRpbWVyOwogICAgaW50IGxhc3RTb3J0Q29sOwogICAgYm9vbCBzR3JpZCA6IDE7CiAgICBib29sIG1Sb3dzIDogMTsKICAgIGJvb2wgbUNvbHMgOiAxOwogICAgYm9vbCBhc2MgOiAxOwogICAgYm9vbCBkb1NvcnQgOiAxOwogICAgYm9vbCB1bnVzZWQgOiAxOwogICAgYm9vbCByZWFkT25seSA6IDE7CiAgICBib29sIHNob3VsZENsZWFyU2VsZWN0aW9uIDogMTsKICAgIGJvb2wgZEVuYWJsZWQgOiAxOwogICAgYm9vbCBjb250ZXh0X21lbnUgOiAxOwogICAgYm9vbCBkcmF3QWN0aXZlU2VsZWN0aW9uIDogMTsKICAgIGJvb2wgd2FzX3Zpc2libGUgOiAxOwogICAgU2VsZWN0aW9uTW9kZSBzZWxNb2RlOwogICAgaW50IHByZXNzZWRSb3csIHByZXNzZWRDb2w7CiAgICBRVGFibGVQcml2YXRlICpkOwogICAgUUludERpY3Q8aW50PiByb1Jvd3M7CiAgICBRSW50RGljdDxpbnQ+IHJvQ29sczsKICAgIGludCBzdGFydERyYWdSb3c7CiAgICBpbnQgc3RhcnREcmFnQ29sOwogICAgUVBvaW50IGRyYWdTdGFydFBvczsKICAgIGludCBvbGRDdXJyZW50Um93LCBvbGRDdXJyZW50Q29sOwogICAgUVdpZGdldCAqdW51c2VkX3RvcExlZnRDb3JuZXI7IC8vIyMjIHJlbW92ZSBpbiA0LjAKICAgIEZvY3VzU3R5bGUgZm9jdXNTdGw7CiAgICBRU2l6ZSB1bnVzZWRfY2FjaGVkU2l6ZUhpbnQ7IC8vICMjIyByZW1vdmUgaW4gNC4wCgojaWYgZGVmaW5lZChRX0RJU0FCTEVfQ09QWSkKICAgIFFUYWJsZSggY29uc3QgUVRhYmxlICYgKTsKICAgIFFUYWJsZSAmb3BlcmF0b3I9KCBjb25zdCBRVGFibGUgJiApOwojZW5kaWYKfTsKCiNkZWZpbmUgUV9ERUZJTkVEX1FUQUJMRQojaW5jbHVkZSAicXdpbmV4cG9ydC5oIgojZW5kaWYgLy8gUVRfTk9fVEFCTEUKI2VuZGlmIC8vIFRBQkxFX0gKAAAAIABxAHcAaQBkAGcAZQB0AGkAbgB0AGQAaQBjAHQALgBoAAAJrC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFXSURHRVRJTlRESUNUX0gKI2RlZmluZSBRV0lER0VUSU5URElDVF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInF3aWRnZXQuaCIKI2luY2x1ZGUgInFpbnRkaWN0LmgiCiNlbmRpZiAvLyBRVF9ICgoKI2lmIGRlZmluZWQoUV9URU1QTEFURURMTCkKLy9RX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRSW50RGljdDxRV2lkZ2V0PjsKLy9RX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRSW50RGljdEl0ZXJhdG9yPFFXaWRnZXQ+OwojZW5kaWYKCgpjbGFzcyBRX0VYUE9SVCBRV2lkZ2V0SW50RGljdCA6IHB1YmxpYyBRSW50RGljdDxRV2lkZ2V0Pgp7CnB1YmxpYzoKICAgIFFXaWRnZXRJbnREaWN0KGludCBzaXplPTE3KSA6IFFJbnREaWN0PFFXaWRnZXQ+KHNpemUpIHt9CiAgICBRV2lkZ2V0SW50RGljdCggY29uc3QgUVdpZGdldEludERpY3QgJmRpY3QgKSA6IFFJbnREaWN0PFFXaWRnZXQ+KGRpY3QpIHt9CiAgIH5RV2lkZ2V0SW50RGljdCgpIHsgY2xlYXIoKTsgfQogICAgUVdpZGdldEludERpY3QgJm9wZXJhdG9yPShjb25zdCBRV2lkZ2V0SW50RGljdCAmZGljdCkKCXsgcmV0dXJuIChRV2lkZ2V0SW50RGljdCYpUUludERpY3Q8UVdpZGdldD46Om9wZXJhdG9yPShkaWN0KTsgfQp9OwoKY2xhc3MgUV9FWFBPUlQgUVdpZGdldEludERpY3RJdCA6IHB1YmxpYyBRSW50RGljdEl0ZXJhdG9yPFFXaWRnZXQ+CnsKcHVibGljOgogICAgUVdpZGdldEludERpY3RJdCggY29uc3QgUVdpZGdldEludERpY3QgJmQgKSA6IFFJbnREaWN0SXRlcmF0b3I8UVdpZGdldD4oZCkge30KICAgIFFXaWRnZXRJbnREaWN0SXQgJm9wZXJhdG9yPShjb25zdCBRV2lkZ2V0SW50RGljdEl0ICZpKQoJeyByZXR1cm4gKFFXaWRnZXRJbnREaWN0SXQmKVFJbnREaWN0SXRlcmF0b3I8UVdpZGdldD46Om9wZXJhdG9yPShpKTsgfQp9OwoKCiNlbmRpZgoAAAAaAHEAcwB0AHkAbABlAHMAaABlAGUAdAAuAGgAABjZLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFTVFlMRVNIRUVUX0gKI2RlZmluZSBRU1RZTEVTSEVFVF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFzdHJpbmcuaCIKI2luY2x1ZGUgInF2YWx1ZWxpc3QuaCIKI2luY2x1ZGUgInFwdHJ2ZWN0b3IuaCIKI2luY2x1ZGUgInFkaWN0LmgiCiNpbmNsdWRlICJxb2JqZWN0LmgiCiNlbmRpZiAvLyBRVF9ICgojaWZuZGVmIFFUX05PX1JJQ0hURVhUCgpjbGFzcyBRU3R5bGVTaGVldDsKY2xhc3MgUVRleHREb2N1bWVudDsKdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBUPiBjbGFzcyBRTWFwOwpjbGFzcyBRU3R5bGVTaGVldEl0ZW1EYXRhOwoKY2xhc3MgUV9FWFBPUlQgUVN0eWxlU2hlZXRJdGVtIDogcHVibGljIFF0CnsKcHVibGljOgogICAgUVN0eWxlU2hlZXRJdGVtKCBRU3R5bGVTaGVldCogcGFyZW50LCBjb25zdCBRU3RyaW5nJiBuYW1lICk7CiAgICBRU3R5bGVTaGVldEl0ZW0oIGNvbnN0IFFTdHlsZVNoZWV0SXRlbSAmICk7CiAgICB+UVN0eWxlU2hlZXRJdGVtKCk7CgogICAgUVN0eWxlU2hlZXRJdGVtJiBvcGVyYXRvcj0oIGNvbnN0IFFTdHlsZVNoZWV0SXRlbSYgb3RoZXIgKTsKCiAgICBRU3RyaW5nIG5hbWUoKSBjb25zdDsKCiAgICBRU3R5bGVTaGVldCogc3R5bGVTaGVldCgpOwogICAgY29uc3QgUVN0eWxlU2hlZXQqIHN0eWxlU2hlZXQoKSBjb25zdDsKCiAgICBlbnVtIEFkZGl0aW9uYWxTdHlsZVZhbHVlcyB7IFVuZGVmaW5lZCAgPSAtIDF9OwoKICAgIGVudW0gRGlzcGxheU1vZGUgewoJRGlzcGxheUJsb2NrLAoJRGlzcGxheUlubGluZSwKCURpc3BsYXlMaXN0SXRlbSwKCURpc3BsYXlOb25lCiNpZm5kZWYgUV9RRE9DCgksIERpc3BsYXlNb2RlVW5kZWZpbmVkID0gLTEKI2VuZGlmCiAgICB9OwoKICAgIERpc3BsYXlNb2RlIGRpc3BsYXlNb2RlKCkgY29uc3Q7CiAgICB2b2lkIHNldERpc3BsYXlNb2RlKERpc3BsYXlNb2RlIG0pOwoKICAgIGludCBhbGlnbm1lbnQoKSBjb25zdDsKICAgIHZvaWQgc2V0QWxpZ25tZW50KCBpbnQgZik7CgogICAgZW51bSBWZXJ0aWNhbEFsaWdubWVudCB7CglWQWxpZ25CYXNlbGluZSwKCVZBbGlnblN1YiwKCVZBbGlnblN1cGVyCiAgICB9OwoKICAgIFZlcnRpY2FsQWxpZ25tZW50IHZlcnRpY2FsQWxpZ25tZW50KCkgY29uc3Q7CiAgICB2b2lkIHNldFZlcnRpY2FsQWxpZ25tZW50KCBWZXJ0aWNhbEFsaWdubWVudCB2YWxpZ24gKTsKCiAgICBpbnQgZm9udFdlaWdodCgpIGNvbnN0OwogICAgdm9pZCBzZXRGb250V2VpZ2h0KGludCB3KTsKCiAgICBpbnQgbG9naWNhbEZvbnRTaXplKCkgY29uc3Q7CiAgICB2b2lkIHNldExvZ2ljYWxGb250U2l6ZShpbnQgcyk7CgogICAgaW50IGxvZ2ljYWxGb250U2l6ZVN0ZXAoKSBjb25zdDsKICAgIHZvaWQgc2V0TG9naWNhbEZvbnRTaXplU3RlcCggaW50IHMgKTsKCiAgICBpbnQgZm9udFNpemUoKSBjb25zdDsKICAgIHZvaWQgc2V0Rm9udFNpemUoaW50IHMpOwoKICAgIFFTdHJpbmcgZm9udEZhbWlseSgpIGNvbnN0OwogICAgdm9pZCBzZXRGb250RmFtaWx5KCBjb25zdCBRU3RyaW5nJiApOwoKICAgIGludCBudW1iZXJPZkNvbHVtbnMoKSBjb25zdDsKICAgIHZvaWQgc2V0TnVtYmVyT2ZDb2x1bW5zKGludCBuY29scyk7CgogICAgUUNvbG9yIGNvbG9yKCkgY29uc3Q7CiAgICB2b2lkIHNldENvbG9yKCBjb25zdCBRQ29sb3IgJik7CgogICAgYm9vbCBmb250SXRhbGljKCkgY29uc3Q7CiAgICB2b2lkIHNldEZvbnRJdGFsaWMoIGJvb2wgKTsKICAgIGJvb2wgZGVmaW5lc0ZvbnRJdGFsaWMoKSBjb25zdDsKCiAgICBib29sIGZvbnRVbmRlcmxpbmUoKSBjb25zdDsKICAgIHZvaWQgc2V0Rm9udFVuZGVybGluZSggYm9vbCApOwogICAgYm9vbCBkZWZpbmVzRm9udFVuZGVybGluZSgpIGNvbnN0OwoKICAgIGJvb2wgZm9udFN0cmlrZU91dCgpIGNvbnN0OwogICAgdm9pZCBzZXRGb250U3RyaWtlT3V0KCBib29sICk7CiAgICBib29sIGRlZmluZXNGb250U3RyaWtlT3V0KCkgY29uc3Q7CgogICAgYm9vbCBpc0FuY2hvcigpIGNvbnN0OwogICAgdm9pZCBzZXRBbmNob3IoYm9vbCBhbmMpOwoKICAgIGVudW0gV2hpdGVTcGFjZU1vZGUgewoJV2hpdGVTcGFjZU5vcm1hbCwKCVdoaXRlU3BhY2VQcmUsCglXaGl0ZVNwYWNlTm9XcmFwCiNpZm5kZWYgUV9RRE9DCgksIFdoaXRlU3BhY2VNb2RlVW5kZWZpbmVkID0gLTEKI2VuZGlmCiAgICB9OwogICAgV2hpdGVTcGFjZU1vZGUgd2hpdGVTcGFjZU1vZGUoKSBjb25zdDsKICAgIHZvaWQgc2V0V2hpdGVTcGFjZU1vZGUoV2hpdGVTcGFjZU1vZGUgbSk7CgogICAgZW51bSBNYXJnaW4gewoJTWFyZ2luTGVmdCwKCU1hcmdpblJpZ2h0LAoJTWFyZ2luVG9wLAoJTWFyZ2luQm90dG9tLAoJTWFyZ2luRmlyc3RMaW5lLAoJTWFyZ2luQWxsLAoJTWFyZ2luVmVydGljYWwsCglNYXJnaW5Ib3Jpem9udGFsCiNpZm5kZWYgUV9RRE9DCgksIE1hcmdpblVuZGVmaW5lZCA9IC0xCiNlbmRpZgogICAgfTsKCiAgICBpbnQgbWFyZ2luKCBNYXJnaW4gbSkgY29uc3Q7CiAgICB2b2lkIHNldE1hcmdpbiggTWFyZ2luLCBpbnQpOwoKICAgIGVudW0gTGlzdFN0eWxlIHsKCUxpc3REaXNjLAoJTGlzdENpcmNsZSwKCUxpc3RTcXVhcmUsCglMaXN0RGVjaW1hbCwKCUxpc3RMb3dlckFscGhhLAoJTGlzdFVwcGVyQWxwaGEKI2lmbmRlZiBRX1FET0MKCSwgTGlzdFN0eWxlVW5kZWZpbmVkID0gLTEKI2VuZGlmCiAgICB9OwoKICAgIExpc3RTdHlsZSBsaXN0U3R5bGUoKSBjb25zdDsKICAgIHZvaWQgc2V0TGlzdFN0eWxlKCBMaXN0U3R5bGUgKTsKCiAgICBRU3RyaW5nIGNvbnRleHRzKCkgY29uc3Q7CiAgICB2b2lkIHNldENvbnRleHRzKCBjb25zdCBRU3RyaW5nJiApOwogICAgYm9vbCBhbGxvd2VkSW5Db250ZXh0KCBjb25zdCBRU3R5bGVTaGVldEl0ZW0qICkgY29uc3Q7CgogICAgYm9vbCBzZWxmTmVzdGluZygpIGNvbnN0OwogICAgdm9pZCBzZXRTZWxmTmVzdGluZyggYm9vbCApOwoKICAgIHZvaWQgc2V0TGluZVNwYWNpbmcoIGludCBscyApOwogICAgaW50IGxpbmVTcGFjaW5nKCkgY29uc3Q7Cgpwcml2YXRlOgogICAgdm9pZCBpbml0KCk7CiAgICBRU3R5bGVTaGVldEl0ZW1EYXRhKiBkOwp9OwoKCiNpZiBkZWZpbmVkKFFfVEVNUExBVEVETEwpCi8vIE1PQ19TS0lQX0JFR0lOClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFEaWN0PFFTdHlsZVNoZWV0SXRlbT47ClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFWYWx1ZUxpc3Q8IFFQdHJWZWN0b3I8UVN0eWxlU2hlZXRJdGVtPiA+OwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRUHRyVmVjdG9yPFFTdHlsZVNoZWV0SXRlbT47ClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFWYWx1ZUxpc3Q8UVN0eWxlU2hlZXRJdGVtOjpMaXN0U3R5bGU+OwovLyBNT0NfU0tJUF9FTkQKI2VuZGlmCgojaWZuZGVmIFFUX05PX1RFWFRDVVNUT01JVEVNCmNsYXNzIFFUZXh0Q3VzdG9tSXRlbTsKI2VuZGlmCgpjbGFzcyBRX0VYUE9SVCBRU3R5bGVTaGVldCA6IHB1YmxpYyBRT2JqZWN0CnsKICAgIFFfT0JKRUNUCnB1YmxpYzoKICAgIFFTdHlsZVNoZWV0KCBRT2JqZWN0ICpwYXJlbnQ9MCwgY29uc3QgY2hhciAqbmFtZT0wICk7CiAgICB2aXJ0dWFsIH5RU3R5bGVTaGVldCgpOwoKICAgIHN0YXRpYyBRU3R5bGVTaGVldCogZGVmYXVsdFNoZWV0KCk7CiAgICBzdGF0aWMgdm9pZCBzZXREZWZhdWx0U2hlZXQoIFFTdHlsZVNoZWV0KiApOwoKCiAgICBRU3R5bGVTaGVldEl0ZW0qIGl0ZW0oIGNvbnN0IFFTdHJpbmcmIG5hbWUpOwogICAgY29uc3QgUVN0eWxlU2hlZXRJdGVtKiBpdGVtKCBjb25zdCBRU3RyaW5nJiBuYW1lKSBjb25zdDsKCiAgICB2b2lkIGluc2VydCggUVN0eWxlU2hlZXRJdGVtKiBpdGVtKTsKCiNpZm5kZWYgUVRfTk9fVEVYVENVU1RPTUlURU0KICAgIHZpcnR1YWwgUVRleHRDdXN0b21JdGVtKiB0YWcoIGNvbnN0IFFTdHJpbmcmIG5hbWUsCgkJCQkgIGNvbnN0IFFNYXA8UVN0cmluZywgUVN0cmluZz4gJmF0dHIsCgkJCQkgIGNvbnN0IFFTdHJpbmcmIGNvbnRleHQsCgkJCQkgIGNvbnN0IFFNaW1lU291cmNlRmFjdG9yeSYgZmFjdG9yeSwKCQkJCSAgYm9vbCBlbXB0eVRhZywgUVRleHREb2N1bWVudCAqZG9jICkgY29uc3Q7CiNlbmRpZgogICAgc3RhdGljIFFTdHJpbmcgZXNjYXBlKCBjb25zdCBRU3RyaW5nJiApOwogICAgc3RhdGljIFFTdHJpbmcgY29udmVydEZyb21QbGFpblRleHQoIGNvbnN0IFFTdHJpbmcmLAoJCQkJCSBRU3R5bGVTaGVldEl0ZW06OldoaXRlU3BhY2VNb2RlIG1vZGUgPSBRU3R5bGVTaGVldEl0ZW06OldoaXRlU3BhY2VQcmUgKTsKICAgIHN0YXRpYyBib29sIG1pZ2h0QmVSaWNoVGV4dCggY29uc3QgUVN0cmluZyYgKTsKCiAgICB2aXJ0dWFsIHZvaWQgc2NhbGVGb250KCBRRm9udCYgZm9udCwgaW50IGxvZ2ljYWxTaXplICkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIGVycm9yKCBjb25zdCBRU3RyaW5nJiApIGNvbnN0OwoKcHJpdmF0ZToKICAgIHZvaWQgaW5pdCgpOwogICAgUURpY3Q8UVN0eWxlU2hlZXRJdGVtPiBzdHlsZXM7CiAgICBRU3R5bGVTaGVldEl0ZW0qIG51bGxzdHlsZTsKcHJpdmF0ZToJLy8gRGlzYWJsZWQgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9CiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUVN0eWxlU2hlZXQoIGNvbnN0IFFTdHlsZVNoZWV0ICYgKTsKICAgIFFTdHlsZVNoZWV0ICZvcGVyYXRvcj0oIGNvbnN0IFFTdHlsZVNoZWV0ICYgKTsKI2VuZGlmCn07CgojZW5kaWYgLy8gUVRfTk9fUklDSFRFWFQKCiNlbmRpZiAvLyBRU1RZTEVTSEVFVF9ICgAAABIAcQB0AGgAcgBlAGEAZAAuAGgAAAwHLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRVEhSRUFEX0gKI2RlZmluZSBRVEhSRUFEX0gKCiNpZiBkZWZpbmVkKFFUX1RIUkVBRF9TVVBQT1JUKQoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxd2luZG93ZGVmcy5oIgojaWZuZGVmIFFUX05PX0NPTVBBVAojaW5jbHVkZSAicW11dGV4LmgiCiNpbmNsdWRlICJxc2VtYXBob3JlLmgiCiNpbmNsdWRlICJxd2FpdGNvbmRpdGlvbi5oIgojZW5kaWYgLy8gUVRfTk9fQ09NUEFUCiNlbmRpZiAvLyBRVF9ICgojaW5jbHVkZSA8bGltaXRzLmg+CgpjbGFzcyBRVGhyZWFkSW5zdGFuY2U7CgpjbGFzcyBRX0VYUE9SVCBRVGhyZWFkIDogcHVibGljIFF0CnsKcHVibGljOgogICAgc3RhdGljIFF0OjpIQU5ETEUgY3VycmVudFRocmVhZCgpOwoKI2lmbmRlZiBRVF9OT19DT01QQVQKICAgIHN0YXRpYyB2b2lkIHBvc3RFdmVudCggUU9iamVjdCAqLFFFdmVudCAqICk7CiNlbmRpZgoKICAgIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoKTsKICAgIHN0YXRpYyB2b2lkIGNsZWFudXAoKTsKCiAgICBzdGF0aWMgdm9pZCBleGl0KCk7CgojaWZkZWYgUV9RRE9DCiAgICBRVGhyZWFkKCB1bnNpZ25lZCBpbnQgc3RhY2tTaXplID0gMCApOwojZWxzZQogICAgUVRocmVhZCggdW5zaWduZWQgaW50IHN0YWNrU2l6ZSApOwogICAgUVRocmVhZCgpOwojZW5kaWYKCiAgICB2aXJ0dWFsIH5RVGhyZWFkKCk7CgogICAgLy8gZGVmYXVsdCBhcmd1bWVudCBjYXVzZXMgdGhyZWFkIHRvIGJsb2NrIGluZGVmaW5hdGVseQogICAgYm9vbCB3YWl0KCB1bnNpZ25lZCBsb25nIHRpbWUgPSBVTE9OR19NQVggKTsKCiAgICBlbnVtIFByaW9yaXR5IHsKCUlkbGVQcmlvcml0eSwKCglMb3dlc3RQcmlvcml0eSwKCUxvd1ByaW9yaXR5LAoJTm9ybWFsUHJpb3JpdHksCglIaWdoUHJpb3JpdHksCglIaWdoZXN0UHJpb3JpdHksCgoJVGltZUNyaXRpY2FsUHJpb3JpdHksCgoJSW5oZXJpdFByaW9yaXR5CiAgICB9OwoKI2lmZGVmIFFfUURPQwogICAgdm9pZCBzdGFydCggUHJpb3JpdHkgPSBJbmhlcml0UHJpb3JpdHkgKTsKI2Vsc2UKICAgIHZvaWQgc3RhcnQoIFByaW9yaXR5ICk7CiAgICB2b2lkIHN0YXJ0KCk7CiNlbmRpZgoKICAgIHZvaWQgdGVybWluYXRlKCk7CgogICAgYm9vbCBmaW5pc2hlZCgpIGNvbnN0OwogICAgYm9vbCBydW5uaW5nKCkgY29uc3Q7Cgpwcm90ZWN0ZWQ6CiAgICB2aXJ0dWFsIHZvaWQgcnVuKCkgPSAwOwoKICAgIHN0YXRpYyB2b2lkIHNsZWVwKCB1bnNpZ25lZCBsb25nICk7CiAgICBzdGF0aWMgdm9pZCBtc2xlZXAoIHVuc2lnbmVkIGxvbmcgKTsKICAgIHN0YXRpYyB2b2lkIHVzbGVlcCggdW5zaWduZWQgbG9uZyApOwoKcHJpdmF0ZToKICAgIFFUaHJlYWRJbnN0YW5jZSAqIGQ7CiAgICBmcmllbmQgY2xhc3MgUVRocmVhZEluc3RhbmNlOwoKI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRVGhyZWFkKCBjb25zdCBRVGhyZWFkICYgKTsKICAgIFFUaHJlYWQgJm9wZXJhdG9yPSggY29uc3QgUVRocmVhZCAmICk7CiNlbmRpZiAvLyBRX0RJU0FCTEVfQ09QWQp9OwoKI2VuZGlmIC8vIFFUX1RIUkVBRF9TVVBQT1JUCgojZW5kaWYgLy8gUVRIUkVBRF9ICgAAABgAcQB2AGcAcgBvAHUAcABiAG8AeAAuAGgAAAgqLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiogJElkOiAkCioqCioqIERlZmluaXRpb24gb2YgUVZHcm91cEJveCB3aWRnZXQgY2xhc3MKKioKKiogQ3JlYXRlZCA6IDk5MDYwMgoqKgoqKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBUcm9sbHRlY2ggQVMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoqKgoqKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgd2lkZ2V0cyBtb2R1bGUgb2YgdGhlIFF0IEdVSSBUb29sa2l0LgoqKgoqKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgUSBQdWJsaWMgTGljZW5zZQoqKiBhcyBkZWZpbmVkIGJ5IFRyb2xsdGVjaCBBUyBvZiBOb3J3YXkgYW5kIGFwcGVhcmluZyBpbiB0aGUgZmlsZQoqKiBMSUNFTlNFLlFQTCBpbmNsdWRlZCBpbiB0aGUgcGFja2FnaW5nIG9mIHRoaXMgZmlsZS4KKioKKiogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQoqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCioqIEZvdW5kYXRpb24gYW5kIGFwcGVhcmluZyBpbiB0aGUgZmlsZSBMSUNFTlNFLkdQTCBpbmNsdWRlZCBpbiB0aGUKKiogcGFja2FnaW5nIG9mIHRoaXMgZmlsZS4KKioKKiogTGljZW5zZWVzIGhvbGRpbmcgdmFsaWQgUXQgRW50ZXJwcmlzZSBFZGl0aW9uIG9yIFF0IFByb2Zlc3Npb25hbCBFZGl0aW9uCioqIGxpY2Vuc2VzIG1heSB1c2UgdGhpcyBmaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgUXQgQ29tbWVyY2lhbCBMaWNlbnNlCioqIEFncmVlbWVudCBwcm92aWRlZCB3aXRoIHRoZSBTb2Z0d2FyZS4KKioKKiogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIEFTIElTIHdpdGggTk8gV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIElOQ0xVRElORyBUSEUKKiogV0FSUkFOVFkgT0YgREVTSUdOLCBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgoqKgoqKiBTZWUgaHR0cDovL3d3dy50cm9sbHRlY2guY29tL3ByaWNpbmcuaHRtbCBvciBlbWFpbCBzYWxlc0B0cm9sbHRlY2guY29tIGZvcgoqKiAgIGluZm9ybWF0aW9uIGFib3V0IFF0IENvbW1lcmNpYWwgTGljZW5zZSBBZ3JlZW1lbnRzLgoqKiBTZWUgaHR0cDovL3d3dy50cm9sbHRlY2guY29tL3FwbC8gZm9yIFFQTCBsaWNlbnNpbmcgaW5mb3JtYXRpb24uCioqIFNlZSBodHRwOi8vd3d3LnRyb2xsdGVjaC5jb20vZ3BsLyBmb3IgR1BMIGxpY2Vuc2luZyBpbmZvcm1hdGlvbi4KKioKKiogQ29udGFjdCBpbmZvQHRyb2xsdGVjaC5jb20gaWYgYW55IGNvbmRpdGlvbnMgb2YgdGhpcyBsaWNlbnNpbmcgYXJlCioqIG5vdCBjbGVhciB0byB5b3UuCioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWZuZGVmIFFWR1JPVVBCT1hfSAojZGVmaW5lIFFWR1JPVVBCT1hfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxZ3JvdXBib3guaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fVkdST1VQQk9YCgpjbGFzcyBRX0VYUE9SVCBRVkdyb3VwQm94IDogcHVibGljIFFHcm91cEJveAp7CiAgICBRX09CSkVDVApwdWJsaWM6CiAgICBRVkdyb3VwQm94KCBRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wICk7CiAgICBRVkdyb3VwQm94KCBjb25zdCBRU3RyaW5nICZ0aXRsZSwgUVdpZGdldCogcGFyZW50PTAsIGNvbnN0IGNoYXIqIG5hbWU9MCApOwoKICAgIH5RVkdyb3VwQm94KCk7Cgpwcml2YXRlOgkvLyBEaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRVkdyb3VwQm94KCBjb25zdCBRVkdyb3VwQm94ICYgKTsKICAgIFFWR3JvdXBCb3ggJm9wZXJhdG9yPSggY29uc3QgUVZHcm91cEJveCAmICk7CiNlbmRpZgp9OwoKI2VuZGlmIC8vIFFUX05PX1ZHUk9VUEJPWAoKI2VuZGlmIC8vIFFWR1JPVVBCT1hfSAoAAAAWAHEAcwBxAGwAZgBpAGUAbABkAC4AaAAAEIAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFTUUxGSUVMRF9ICiNkZWZpbmUgUVNRTEZJRUxEX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXN0cmluZy5oIgojaW5jbHVkZSAicXZhcmlhbnQuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZiAhZGVmaW5lZCggUVRfTU9EVUxFX1NRTCApIHx8IGRlZmluZWQoIFFUX0xJQ0VOU0VfUFJPRkVTU0lPTkFMICkKI2RlZmluZSBRTV9FWFBPUlRfU1FMCiNlbHNlCiNkZWZpbmUgUU1fRVhQT1JUX1NRTCBRX0VYUE9SVAojZW5kaWYKCiNpZm5kZWYgUVRfTk9fU1FMCgpjbGFzcyBRU3FsRmllbGRQcml2YXRlCnsKcHVibGljOgogICAgUVZhcmlhbnQ6OlR5cGUgdHlwZTsKfTsKCmNsYXNzIFFNX0VYUE9SVF9TUUwgUVNxbEZpZWxkCnsKcHVibGljOgogICAgUVNxbEZpZWxkKCBjb25zdCBRU3RyaW5nJiBmaWVsZE5hbWUgPSBRU3RyaW5nOjpudWxsLCBRVmFyaWFudDo6VHlwZSB0eXBlID0gUVZhcmlhbnQ6OkludmFsaWQgKTsKICAgIFFTcWxGaWVsZCggY29uc3QgUVNxbEZpZWxkJiBvdGhlciApOwogICAgUVNxbEZpZWxkJiBvcGVyYXRvcj0oIGNvbnN0IFFTcWxGaWVsZCYgb3RoZXIgKTsKICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBRU3FsRmllbGQmIG90aGVyKSBjb25zdDsKICAgIHZpcnR1YWwgflFTcWxGaWVsZCgpOwoKICAgIHZpcnR1YWwgdm9pZAlzZXRWYWx1ZSggY29uc3QgUVZhcmlhbnQmIHZhbHVlICk7CiAgICB2aXJ0dWFsIFFWYXJpYW50CXZhbHVlKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQJc2V0TmFtZSggY29uc3QgUVN0cmluZyYgbmFtZSApOwogICAgUVN0cmluZwkJbmFtZSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkCXNldE51bGwoKTsKICAgIGJvb2wJCWlzTnVsbCgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkCXNldFJlYWRPbmx5KCBib29sIHJlYWRPbmx5ICk7CiAgICBib29sCQlpc1JlYWRPbmx5KCkgY29uc3Q7CiAgICB2b2lkCQljbGVhciggYm9vbCBudWxsaWZ5ID0gVFJVRSApOwogICAgUVZhcmlhbnQ6OlR5cGUJdHlwZSgpIGNvbnN0OwoKcHJpdmF0ZToKICAgIFFTdHJpbmcgICAgICAgbm07CiAgICBRVmFyaWFudCAgICAgIHZhbDsKICAgIHVpbnQgICAgICAgICAgcm86IDE7CiAgICB1aW50ICAgICAgICAgIG51bDogMTsKICAgIFFTcWxGaWVsZFByaXZhdGUqIGQ7Cn07CgppbmxpbmUgUVZhcmlhbnQgUVNxbEZpZWxkOjp2YWx1ZSgpIGNvbnN0CnsgcmV0dXJuIHZhbDsgfQoKaW5saW5lIFFTdHJpbmcgUVNxbEZpZWxkOjpuYW1lKCkgY29uc3QKeyByZXR1cm4gbm07IH0KCmlubGluZSBib29sIFFTcWxGaWVsZDo6aXNOdWxsKCkgY29uc3QKeyByZXR1cm4gbnVsOyB9CgppbmxpbmUgYm9vbCBRU3FsRmllbGQ6OmlzUmVhZE9ubHkoKSBjb25zdAp7IHJldHVybiBybzsgfQoKaW5saW5lIFFWYXJpYW50OjpUeXBlIFFTcWxGaWVsZDo6dHlwZSgpIGNvbnN0CnsgcmV0dXJuIGQtPnR5cGU7IH0KCgovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKc3RydWN0IFFTcWxGaWVsZEluZm9Qcml2YXRlOwoKY2xhc3MgUU1fRVhQT1JUX1NRTCBRU3FsRmllbGRJbmZvCnsKcHVibGljOgogICAgUVNxbEZpZWxkSW5mbyggY29uc3QgUVN0cmluZyYgbmFtZSA9IFFTdHJpbmc6Om51bGwsCgkJICAgUVZhcmlhbnQ6OlR5cGUgdHlwID0gUVZhcmlhbnQ6OkludmFsaWQsCgkJICAgaW50IHJlcXVpcmVkID0gLTEsCgkJICAgaW50IGxlbiA9IC0xLAoJCSAgIGludCBwcmVjID0gLTEsCgkJICAgY29uc3QgUVZhcmlhbnQmIGRlZlZhbHVlID0gUVZhcmlhbnQoKSwKCQkgICBpbnQgc3FsVHlwZSA9IDAsCgkJICAgYm9vbCBnZW5lcmF0ZWQgPSBUUlVFLAoJCSAgIGJvb2wgdHJpbSA9IEZBTFNFLAoJCSAgIGJvb2wgY2FsY3VsYXRlZCA9IEZBTFNFICk7CiAgICBRU3FsRmllbGRJbmZvKCBjb25zdCBRU3FsRmllbGRJbmZvICYgb3RoZXIgKTsKICAgIFFTcWxGaWVsZEluZm8oIGNvbnN0IFFTcWxGaWVsZCAmIG90aGVyLCBib29sIGdlbmVyYXRlZCA9IFRSVUUgKTsKICAgIHZpcnR1YWwgflFTcWxGaWVsZEluZm8oKTsKICAgIFFTcWxGaWVsZEluZm8mIG9wZXJhdG9yPSggY29uc3QgUVNxbEZpZWxkSW5mbyYgb3RoZXIgKTsKICAgIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUVNxbEZpZWxkSW5mbyYgZiApIGNvbnN0OwoKICAgIFFTcWxGaWVsZAkJdG9GaWVsZCgpIGNvbnN0OwogICAgaW50CQkJaXNSZXF1aXJlZCgpIGNvbnN0OwogICAgUVZhcmlhbnQ6OlR5cGUJdHlwZSgpIGNvbnN0OwogICAgaW50CQkJbGVuZ3RoKCkgY29uc3Q7CiAgICBpbnQJCQlwcmVjaXNpb24oKSBjb25zdDsKICAgIFFWYXJpYW50CQlkZWZhdWx0VmFsdWUoKSBjb25zdDsKICAgIFFTdHJpbmcJCW5hbWUoKSBjb25zdDsKICAgIGludAkJCXR5cGVJRCgpIGNvbnN0OwogICAgYm9vbAkJaXNHZW5lcmF0ZWQoKSBjb25zdDsKICAgIGJvb2wJCWlzVHJpbSgpIGNvbnN0OwogICAgYm9vbAkJaXNDYWxjdWxhdGVkKCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkCXNldFRyaW0oIGJvb2wgdHJpbSApOwogICAgdmlydHVhbCB2b2lkCXNldEdlbmVyYXRlZCggYm9vbCBnZW4gKTsKICAgIHZpcnR1YWwgdm9pZAlzZXRDYWxjdWxhdGVkKCBib29sIGNhbGMgKTsKCnByaXZhdGU6CiAgICBRU3FsRmllbGRJbmZvUHJpdmF0ZSogZDsKfTsKCgojZW5kaWYJLy8gUVRfTk9fU1FMCiNlbmRpZgoAAAAYAHEAcwB0AGEAdAB1AHMAYgBhAHIALgBoAAAKfC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFTVEFUVVNCQVJfSAojZGVmaW5lIFFTVEFUVVNCQVJfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxd2lkZ2V0LmgiCiNlbmRpZiAvLyBRVF9ICgojaWZuZGVmIFFUX05PX1NUQVRVU0JBUgoKCmNsYXNzIFFTdGF0dXNCYXJQcml2YXRlOwoKCmNsYXNzIFFfRVhQT1JUIFFTdGF0dXNCYXI6IHB1YmxpYyBRV2lkZ2V0CnsKICAgIFFfT0JKRUNUCiAgICBRX1BST1BFUlRZKCBib29sIHNpemVHcmlwRW5hYmxlZCBSRUFEIGlzU2l6ZUdyaXBFbmFibGVkIFdSSVRFIHNldFNpemVHcmlwRW5hYmxlZCApCgpwdWJsaWM6CiAgICBRU3RhdHVzQmFyKCBRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wICk7CiAgICB2aXJ0dWFsIH5RU3RhdHVzQmFyKCk7CgogICAgdmlydHVhbCB2b2lkIGFkZFdpZGdldCggUVdpZGdldCAqLCBpbnQgc3RyZXRjaCA9IDAsIGJvb2wgPSBGQUxTRSApOwogICAgdmlydHVhbCB2b2lkIHJlbW92ZVdpZGdldCggUVdpZGdldCAqICk7CgogICAgdm9pZCBzZXRTaXplR3JpcEVuYWJsZWQoYm9vbCk7CiAgICBib29sIGlzU2l6ZUdyaXBFbmFibGVkKCkgY29uc3Q7CgpwdWJsaWMgc2xvdHM6CiAgICB2b2lkIG1lc3NhZ2UoIGNvbnN0IFFTdHJpbmcgJik7CiAgICB2b2lkIG1lc3NhZ2UoIGNvbnN0IFFTdHJpbmcgJiwgaW50ICk7CiAgICB2b2lkIGNsZWFyKCk7CgpzaWduYWxzOgogICAgdm9pZCBtZXNzYWdlQ2hhbmdlZCggY29uc3QgUVN0cmluZyAmdGV4dCApOwoKcHJvdGVjdGVkOgogICAgdm9pZCBwYWludEV2ZW50KCBRUGFpbnRFdmVudCAqICk7CiAgICB2b2lkIHJlc2l6ZUV2ZW50KCBRUmVzaXplRXZlbnQgKiApOwoKICAgIHZvaWQgcmVmb3JtYXQoKTsKICAgIHZvaWQgaGlkZU9yU2hvdygpOwogICAgYm9vbCBldmVudCggUUV2ZW50ICopOwoKcHJpdmF0ZToKICAgIFFTdGF0dXNCYXJQcml2YXRlICogZDsKcHJpdmF0ZToJLy8gRGlzYWJsZWQgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9CiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUVN0YXR1c0JhciggY29uc3QgUVN0YXR1c0JhciAmICk7CiAgICBRU3RhdHVzQmFyJiBvcGVyYXRvcj0oIGNvbnN0IFFTdGF0dXNCYXIgJiApOwojZW5kaWYKfTsKCiNlbmRpZiAvLyBRVF9OT19TVEFUVVNCQVIKCiNlbmRpZiAvLyBRU1RBVFVTQkFSX0gKAAAAGABxAHcAbwByAGsAcwBwAGEAYwBlAC4AaAAAEksvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRV09SS1NQQUNFX0gKI2RlZmluZSBRV09SS1NQQUNFX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXdpZGdldC5oIgojaW5jbHVkZSAicXdpZGdldGxpc3QuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fV09SS1NQQUNFCgojaWYgIWRlZmluZWQoIFFUX01PRFVMRV9XT1JLU1BBQ0UgKSB8fCBkZWZpbmVkKCBRVF9JTlRFUk5BTF9XT1JLU1BBQ0UgKQojZGVmaW5lIFFNX0VYUE9SVF9XT1JLU1BBQ0UKI2Vsc2UKI2RlZmluZSBRTV9FWFBPUlRfV09SS1NQQUNFIFFfRVhQT1JUCiNlbmRpZgoKY2xhc3MgUVdvcmtzcGFjZUNoaWxkOwpjbGFzcyBRU2hvd0V2ZW50OwpjbGFzcyBRV29ya3NwYWNlUHJpdmF0ZTsKY2xhc3MgUVBvcHVwTWVudTsKY2xhc3MgUURvY2tXaW5kb3c7CgpjbGFzcyBRTV9FWFBPUlRfV09SS1NQQUNFIFFXb3Jrc3BhY2UgOiBwdWJsaWMgUVdpZGdldAp7CiAgICBRX09CSkVDVAogICAgUV9QUk9QRVJUWSggYm9vbCBzY3JvbGxCYXJzRW5hYmxlZCBSRUFEIHNjcm9sbEJhcnNFbmFibGVkIFdSSVRFIHNldFNjcm9sbEJhcnNFbmFibGVkICkKCiNpZmRlZiBRVF9XT1JLU1BBQ0VfV0lORE9XTU9ERQpwdWJsaWM6CiNlbmRpZgogICAgZW51bSBXaW5kb3dNb2RlIHsgVG9wTGV2ZWwsIE1ESSwgQXV0b0RldGVjdCB9OwogICAgV2luZG93TW9kZSB3aW5kb3dNb2RlKCkgY29uc3Q7CiNpZmRlZiBRVF9XT1JLU1BBQ0VfV0lORE9XTU9ERQpwcml2YXRlOgojZW5kaWYKCnB1YmxpYzoKI2lmZGVmIFFUX1dPUktTUEFDRV9XSU5ET1dNT0RFCiAgICBRV29ya3NwYWNlKCBXaW5kb3dNb2RlIG1vZGUsIFFXaWRnZXQqIHBhcmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAgKTsKI2VuZGlmCiAgICBRV29ya3NwYWNlKCBRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wICk7CgogICAgflFXb3Jrc3BhY2UoKTsKCiAgICBlbnVtIFdpbmRvd09yZGVyIHsgQ3JlYXRpb25PcmRlciwgU3RhY2tpbmdPcmRlciB9OwoKICAgIFFXaWRnZXQqIGFjdGl2ZVdpbmRvdygpIGNvbnN0OwogICAgUVdpZGdldExpc3Qgd2luZG93TGlzdCgpIGNvbnN0OyAvLyAjIyMgbWVyZ2Ugd2l0aCBiZWxvdyBpbiA0LjAKICAgIFFXaWRnZXRMaXN0IHdpbmRvd0xpc3QoIFdpbmRvd09yZGVyIG9yZGVyICkgY29uc3Q7CgogICAgUVNpemUgc2l6ZUhpbnQoKSBjb25zdDsKCiAgICBib29sIHNjcm9sbEJhcnNFbmFibGVkKCkgY29uc3Q7CiAgICB2b2lkIHNldFNjcm9sbEJhcnNFbmFibGVkKCBib29sIGVuYWJsZSApOwoKICAgIHZvaWQgc2V0UGFsZXR0ZUJhY2tncm91bmRDb2xvciggY29uc3QgUUNvbG9yICYgKTsKICAgIHZvaWQgc2V0UGFsZXR0ZUJhY2tncm91bmRQaXhtYXAoIGNvbnN0IFFQaXhtYXAgJiApOwoKc2lnbmFsczoKICAgIHZvaWQgd2luZG93QWN0aXZhdGVkKCBRV2lkZ2V0KiB3KTsKCnB1YmxpYyBzbG90czoKICAgIHZvaWQgY2FzY2FkZSgpOwogICAgdm9pZCB0aWxlKCk7CiAgICB2b2lkIGNsb3NlQWN0aXZlV2luZG93KCk7CiAgICB2b2lkIGNsb3NlQWxsV2luZG93cygpOwogICAgdm9pZCBhY3RpdmF0ZU5leHRXaW5kb3coKTsKICAgIHZvaWQgYWN0aXZhdGVQcmV2V2luZG93KCk7Cgpwcm90ZWN0ZWQ6CiNpZm5kZWYgUVRfTk9fU1RZTEUKICAgIHZvaWQgc3R5bGVDaGFuZ2UoIFFTdHlsZSYgKTsKI2VuZGlmCiAgICB2b2lkIGNoaWxkRXZlbnQoIFFDaGlsZEV2ZW50ICogKTsKICAgIHZvaWQgcmVzaXplRXZlbnQoIFFSZXNpemVFdmVudCAqICk7CiAgICBib29sIGV2ZW50RmlsdGVyKCBRT2JqZWN0ICosIFFFdmVudCAqICk7CiAgICB2b2lkIHNob3dFdmVudCggUVNob3dFdmVudCAqZSApOwogICAgdm9pZCBoaWRlRXZlbnQoIFFIaWRlRXZlbnQgKmUgKTsKI2lmbmRlZiBRVF9OT19XSEVFTEVWRU5UCiAgICB2b2lkIHdoZWVsRXZlbnQoIFFXaGVlbEV2ZW50ICplICk7CiNlbmRpZgoKcHJpdmF0ZSBzbG90czoKICAgIHZvaWQgbm9ybWFsaXplQWN0aXZlV2luZG93KCk7CiAgICB2b2lkIG1pbmltaXplQWN0aXZlV2luZG93KCk7CiAgICB2b2lkIHNob3dPcGVyYXRpb25NZW51KCk7CiAgICB2b2lkIHBvcHVwT3BlcmF0aW9uTWVudSggY29uc3QgUVBvaW50JiApOwogICAgdm9pZCBvcGVyYXRpb25NZW51QWN0aXZhdGVkKCBpbnQgKTsKICAgIHZvaWQgb3BlcmF0aW9uTWVudUFib3V0VG9TaG93KCk7CiAgICB2b2lkIHRvb2xNZW51QWJvdXRUb1Nob3coKTsKICAgIHZvaWQgYWN0aXZhdGVQcmV2aW91c1dpbmRvdygpOyAvLyAjIyMgcmVtb3ZlIGluIFF0IDQuMAogICAgdm9pZCBkb2NrV2luZG93c1Nob3coKTsKICAgIHZvaWQgc2Nyb2xsQmFyQ2hhbmdlZCgpOwoKcHJpdmF0ZToKICAgIHZvaWQgaW5pdCgpOwogICAgdm9pZCBoYW5kbGVVbmRvY2soIFFEb2NrV2luZG93KiB3KTsKICAgIHZvaWQgaW5zZXJ0SWNvbiggUVdpZGdldCogdyk7CiAgICB2b2lkIHJlbW92ZUljb24oIFFXaWRnZXQqIHcpOwogICAgdm9pZCBwbGFjZSggUVdpZGdldCogKTsKCiAgICBRV29ya3NwYWNlQ2hpbGQqIGZpbmRDaGlsZCggUVdpZGdldCogdyk7CiAgICB2b2lkIHNob3dNYXhpbWl6ZUNvbnRyb2xzKCk7CiAgICB2b2lkIGhpZGVNYXhpbWl6ZUNvbnRyb2xzKCk7CiAgICB2b2lkIGFjdGl2YXRlV2luZG93KCBRV2lkZ2V0KiB3LCBib29sIGNoYW5nZV9mb2N1cyA9IFRSVUUgKTsKICAgIHZvaWQgc2hvd1dpbmRvdyggUVdpZGdldCogdyk7CiAgICB2b2lkIG1heGltaXplV2luZG93KCBRV2lkZ2V0KiB3KTsKICAgIHZvaWQgbWluaW1pemVXaW5kb3coIFFXaWRnZXQqIHcpOwogICAgdm9pZCBub3JtYWxpemVXaW5kb3coIFFXaWRnZXQqIHcpOwoKICAgIFFSZWN0IHVwZGF0ZVdvcmtzcGFjZSgpOwoKICAgIFFQb3B1cE1lbnUqIHBvcHVwOwogICAgUVdvcmtzcGFjZVByaXZhdGUqIGQ7CgogICAgZnJpZW5kIGNsYXNzIFFXb3Jrc3BhY2VQcml2YXRlOwogICAgZnJpZW5kIGNsYXNzIFFXb3Jrc3BhY2VDaGlsZDsKCnByaXZhdGU6CS8vIERpc2FibGVkIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPQojaWYgZGVmaW5lZChRX0RJU0FCTEVfQ09QWSkKICAgIFFXb3Jrc3BhY2UoIGNvbnN0IFFXb3Jrc3BhY2UgJiApOwogICAgUVdvcmtzcGFjZSYgb3BlcmF0b3I9KCBjb25zdCBRV29ya3NwYWNlICYgKTsKI2VuZGlmCn07CgoKI2VuZGlmIC8vIFFUX05PX1dPUktTUEFDRQoKI2VuZGlmIC8vIFFXT1JLU1BBQ0VfSAoAAAAYAHEAdwBpAG4AZQB4AHAAbwByAHQALgBoAAAoqS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmIGRlZmluZWQoUV9URU1QTEFURURMTCkgJiYgKCAhZGVmaW5lZChRX0NDX0JPUikgfHwgIWRlZmluZWQoUVRfTUFLRURMTCkgfHwgZGVmaW5lZChRX0VYUE9SVF9URU1QTEFURVMpICkKLy8gTU9DX1NLSVBfQkVHSU4KCiNpZiBkZWZpbmVkKFFfREVGSU5FRF9RQVNDSUlESUNUKSAmJiBkZWZpbmVkKFFfREVGSU5FRF9RQ09OTkVDVElPTl9MSVNUKSAmJiAhZGVmaW5lZChRX0VYUE9SVEVEX1FBU0NJSURJQ1RfVEVNUExBVEVTKQojZGVmaW5lIFFfRVhQT1JURURfUUFTQ0lJRElDVF9URU1QTEFURVMKUV9URU1QTEFURV9FWFRFUk4gdGVtcGxhdGUgY2xhc3MgUV9FWFBPUlQgUUFzY2lpRGljdEl0ZXJhdG9yPFFDb25uZWN0aW9uTGlzdD47ClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFBc2NpaURpY3Q8UUNvbm5lY3Rpb25MaXN0PjsKI2VuZGlmCgojaWYgZGVmaW5lZChRX0RFRklORURfUVNUWUxFU0hFRVQpICYmIGRlZmluZWQoUV9ERUZJTkVEX1FESUNUKSAmJiAhZGVmaW5lZChRX0VYUE9SVEVEX1FTVFlMRVNIRUVUX1RFTVBMQVRFUykKI2RlZmluZSBRX0VYUE9SVEVEX1FTVFlMRVNIRUVUX1RFTVBMQVRFUwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRRGljdDxRU3R5bGVTaGVldEl0ZW0+OwojZW5kaWYKCiNpZiBkZWZpbmVkKFFfREVGSU5FRF9RTElCUkFSWSkgJiYgZGVmaW5lZChRX0RFRklORURfUURJQ1QpICYmICFkZWZpbmVkKFFfRVhQT1JURURfUURJQ1RMSUJSQVJZX1RFTVBMQVRFUykKI2RlZmluZSBRX0VYUE9SVEVEX1FESUNUTElCUkFSWV9URU1QTEFURVMKUV9URU1QTEFURV9FWFRFUk4gdGVtcGxhdGUgY2xhc3MgUV9FWFBPUlQgUURpY3Q8UUxpYnJhcnk+OyAvLyBmb3IgUXRvcGlhCiNlbmRpZgoKI2lmIGRlZmluZWQoUV9ERUZJTkVEX1FHVUFSREVEUFRSKSAmJiBkZWZpbmVkKFFfREVGSU5FRF9RT0JKRUNUKSAmJiAhZGVmaW5lZChRX0VYUE9SVEVEX1FHVUFSREVEUFRST0JKRUNUX1RFTVBMQVRFUykKI2RlZmluZSBRX0VYUE9SVEVEX1FHVUFSREVEUFRST0JKRUNUX1RFTVBMQVRFUwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRR3VhcmRlZFB0cjxRT2JqZWN0PjsKI2VuZGlmCgovLyBuZWVkZWQgZm9yIFF0b3BpYQojaWYgZGVmaW5lZChRX0RFRklORURfUUdVQVJERURQVFIpICYmIGRlZmluZWQoUV9ERUZJTkVEX1FXSURHRVQpICYmICFkZWZpbmVkKFFfRVhQT1JURURfUUdVQVJERURQVFJRV0lER0VUX1RFTVBMQVRFUykKI2RlZmluZSBRX0VYUE9SVEVEX1FHVUFSREVEUFRSUVdJREdFVF9URU1QTEFURVMKUV9URU1QTEFURV9FWFRFUk4gdGVtcGxhdGUgY2xhc3MgUV9FWFBPUlQgUUd1YXJkZWRQdHI8UVdpZGdldD47CiNlbmRpZgoKI2lmIGRlZmluZWQoUV9ERUZJTkVEX1FHVUFSREVEUFRSKSAmJiBkZWZpbmVkKFFfREVGSU5FRF9RQUNDRVNTSUJMRV9PQkpFQ1QpICYmICFkZWZpbmVkKFFfRVhQT1JURURfUUFDQ0VTU0lCTEVPQkpFQ1RfVEVNUExBVEVTKQojZGVmaW5lIFFfRVhQT1JURURfUUFDQ0VTU0lCTEVPQkpFQ1RfVEVNUExBVEVTClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFHdWFyZGVkUHRyPFFBY2Nlc3NpYmxlT2JqZWN0PjsKI2VuZGlmCgojaWYgZGVmaW5lZChRX0RFRklORURfUUlOVERJQ1QpICYmICFkZWZpbmVkKFFfRVhQT1JURURfUUlOVERJQ1RfVEVNUExBVEVTKQojZGVmaW5lIFFfRVhQT1JURURfUUlOVERJQ1RfVEVNUExBVEVTClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFJbnREaWN0PGludD47CiNlbmRpZgoKI2lmIGRlZmluZWQoUV9ERUZJTkVEX1FJTlRESUNUKSAmJiBkZWZpbmVkKFFfREVGSU5FRF9RV0lER0VUKSAmJiAhZGVmaW5lZChRX0VYUE9SVEVEX19URU1QTEFURVMpCiNkZWZpbmUgUV9FWFBPUlRFRF9fVEVNUExBVEVTClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFJbnREaWN0SXRlcmF0b3I8UVdpZGdldD47ClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFJbnREaWN0PFFXaWRnZXQ+OwojZW5kaWYKCiNpZiBkZWZpbmVkKFFfREVGSU5FRF9RTUFQKSAmJiAhZGVmaW5lZChRX0VYUE9SVEVEX1FNQVBCQVNJQ19URU1QTEFURVMpCiNkZWZpbmUgUV9FWFBPUlRFRF9RTUFQQkFTSUNfVEVNUExBVEVTClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFNYXA8aW50LCBpbnQ+OyAvLyBmb3IgUXRvcGlhClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFNYXA8aW50LCBib29sPjsgLy8gZm9yIFF0b3BpYQojZW5kaWYKCiNpZiBkZWZpbmVkKFFfREVGSU5FRF9RTUFQKSAmJiBkZWZpbmVkKFFfREVGSU5FRF9RU1RSSU5HKSAmJiAhZGVmaW5lZChRX0VYUE9SVEVEX1FNQVBRU1RSSU5HX1RFTVBMQVRFUykKI2RlZmluZSBRX0VYUE9SVEVEX1FNQVBRU1RSSU5HX1RFTVBMQVRFUwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRTWFwPFFTdHJpbmcsIFFTdHJpbmc+OwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRTWFwPFFTdHJpbmcsIGludD47IC8vIGZvciBRdG9waWEKUV9URU1QTEFURV9FWFRFUk4gdGVtcGxhdGUgY2xhc3MgUV9FWFBPUlQgUU1hcDxpbnQsIFFTdHJpbmc+OyAvLyBmb3IgUXRvcGlhCiNlbmRpZgoKI2lmIGRlZmluZWQoUV9ERUZJTkVEX1FNRU1BUlJBWSkgICYmICFkZWZpbmVkKFFfRVhQT1JURURfUU1FTUFSUkFZX0JBU0lDX1RFTVBMQVRFUykKI2RlZmluZSBRX0VYUE9SVEVEX1FNRU1BUlJBWV9CQVNJQ19URU1QTEFURVMKUV9URU1QTEFURV9FWFRFUk4gdGVtcGxhdGUgY2xhc3MgUV9FWFBPUlQgUU1lbUFycmF5PGludD47ClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFNZW1BcnJheTxib29sPjsKUV9URU1QTEFURV9FWFRFUk4gdGVtcGxhdGUgY2xhc3MgUV9FWFBPUlQgUU1lbUFycmF5PGNoYXI+OwojZW5kaWYKCiNpZiBkZWZpbmVkKFFfREVGSU5FRF9RTUVNQVJSQVkpICYmIGRlZmluZWQoUV9ERUZJTkVEX1FQT0lOVCkgICYmICFkZWZpbmVkKFFfRVhQT1JURURfUU1FTUFSQVlQT0lOVF9URU1QTEFURVMpCiNkZWZpbmUgUV9FWFBPUlRFRF9RTUVNQVJBWVBPSU5UX1RFTVBMQVRFUwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRTWVtQXJyYXk8UVBvaW50PjsKI2VuZGlmCgojaWYgZGVmaW5lZChRX0RFRklORURfUVBUUkxJU1QpICAmJiAhZGVmaW5lZChRX0VYUE9SVEVEX1FQVFJMSVNUX0JBU0lDX1RFTVBMQVRFUykKI2RlZmluZSBRX0VYUE9SVEVEX1FQVFJMSVNUX0JBU0lDX1RFTVBMQVRFUwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRUHRyTGlzdEl0ZXJhdG9yPGNoYXI+OwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRUHRyTGlzdDxjaGFyPjsKI2VuZGlmCgojaWYgZGVmaW5lZChRX0RFRklORURfUVBUUkxJU1QpICYmIGRlZmluZWQoUV9ERUZJTkVEX1FXSURHRVQpICAmJiAhZGVmaW5lZChRX0VYUE9SVEVEX1FQVFJMSVNUV0lER0VUX1RFTVBMQVRFUykKI2RlZmluZSBRX0VYUE9SVEVEX1FQVFJMSVNUV0lER0VUX1RFTVBMQVRFUwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRUHRyTGlzdEl0ZXJhdG9yPFFXaWRnZXQ+OwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRUHRyTGlzdDxRV2lkZ2V0PjsKI2VuZGlmCgojaWYgZGVmaW5lZChRX0RFRklORURfUVBUUkxJU1QpICYmIGRlZmluZWQoUV9ERUZJTkVEX1FDT05ORUNUSU9OKSAgJiYgIWRlZmluZWQoUV9FWFBPUlRFRF9RUFRSTElTVENPTk5FQ1RJT05fVEVNUExBVEVTKQojZGVmaW5lIFFfRVhQT1JURURfUVBUUkxJU1RDT05ORUNUSU9OX1RFTVBMQVRFUwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRUHRyTGlzdEl0ZXJhdG9yPFFDb25uZWN0aW9uPjsKUV9URU1QTEFURV9FWFRFUk4gdGVtcGxhdGUgY2xhc3MgUV9FWFBPUlQgUVB0ckxpc3Q8UUNvbm5lY3Rpb24+OwojZW5kaWYKCiNpZiBkZWZpbmVkKFFfREVGSU5FRF9RUFRSTElTVCkgJiYgZGVmaW5lZChRX0RFRklORURfUU9CSkVDVCkgICYmICFkZWZpbmVkKFFfRVhQT1JURURfUVBUUkxJU1RPQkpFQ1RfVEVNUExBVEVTKQojZGVmaW5lIFFfRVhQT1JURURfUVBUUkxJU1RPQkpFQ1RfVEVNUExBVEVTClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFQdHJMaXN0SXRlcmF0b3I8UU9iamVjdD47ClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFQdHJMaXN0PFFPYmplY3Q+OwojZW5kaWYKCiNpZiBkZWZpbmVkKFFfREVGSU5FRF9RUFRSTElTVCkgJiYgZGVmaW5lZChRX0RFRklORURfUURPQ0tXSU5ET1cpICAmJiAhZGVmaW5lZChRX0VYUE9SVEVEX1FQVFJMSVNURE9DV0lORE9XX1RFTVBMQVRFUykKI2RlZmluZSBRX0VYUE9SVEVEX1FQVFJMSVNURE9DV0lORE9XX1RFTVBMQVRFUwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRUHRyTGlzdEl0ZXJhdG9yPFFEb2NrV2luZG93PjsKUV9URU1QTEFURV9FWFRFUk4gdGVtcGxhdGUgY2xhc3MgUV9FWFBPUlQgUVB0ckxpc3Q8UURvY2tXaW5kb3c+OwojZW5kaWYKCiNpZiBkZWZpbmVkKFFfREVGSU5FRF9RUFRSVkVDVE9SKSAgJiYgIWRlZmluZWQoUV9FWFBPUlRFRF9RUFRSVkVDVE9SX0JBU0lDX1RFTVBMQVRFUykKI2RlZmluZSBRX0VYUE9SVEVEX1FQVFJWRUNUT1JfQkFTSUNfVEVNUExBVEVTClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFQdHJWZWN0b3I8aW50PjsKI2VuZGlmCgojaWYgZGVmaW5lZChRX0RFRklORURfUVBUUlZFQ1RPUikgJiYgZGVmaW5lZChRX0RFRklORURfUVNUWUxFU0hFRVQpICAmJiAhZGVmaW5lZChRX0VYUE9SVEVEX1FQVFJWRUNUT1JTVFlMRVNIRUVUSVRFTV9URU1QTEFURVMpCiNkZWZpbmUgUV9FWFBPUlRFRF9RUFRSVkVDVE9SU1RZTEVTSEVFVElURU1fVEVNUExBVEVTClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFQdHJWZWN0b3I8UVN0eWxlU2hlZXRJdGVtPjsKI2VuZGlmCgojaWYgZGVmaW5lZChRX0RFRklORURfUVBUUlZFQ1RPUikgJiYgZGVmaW5lZChRX0RFRklORURfUVdJREdFVCkgICYmICFkZWZpbmVkKFFfRVhQT1JURURfUVBUUlZFQ1RPUldJREdFVF9URU1QTEFURVMpCiNkZWZpbmUgUV9FWFBPUlRFRF9RUFRSVkVDVE9SV0lER0VUX1RFTVBMQVRFUwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRUHRyVmVjdG9yPFFXaWRnZXQ+OwojZW5kaWYKCiNpZiBkZWZpbmVkKFFfREVGSU5FRF9RUFRSVkVDVE9SKSAmJiBkZWZpbmVkKFFfREVGSU5FRF9RQ09OTkVDVElPTl9MSVNUKSAgJiYgIWRlZmluZWQoUV9FWFBPUlRFRF9RUFRSVkVDVE9SQ09OTkVDVFRJT05MSVNUX1RFTVBMQVRFUykKI2RlZmluZSBRX0VYUE9SVEVEX1FQVFJWRUNUT1JDT05ORUNUVElPTkxJU1RfVEVNUExBVEVTClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFQdHJWZWN0b3I8UUNvbm5lY3Rpb25MaXN0PjsKI2VuZGlmCgojaWYgZGVmaW5lZChRX0RFRklORURfUVZBTFVFTElTVCkgICYmICFkZWZpbmVkKFFfRVhQT1JURURfUVZBTFVFTElTVF9CQVNJQ19URU1QTEFURVMpCiNkZWZpbmUgUV9FWFBPUlRFRF9RVkFMVUVMSVNUX0JBU0lDX1RFTVBMQVRFUwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRVmFsdWVMaXN0SXRlcmF0b3I8Ym9vbD47ClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFWYWx1ZUxpc3Q8Ym9vbD47ClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFWYWx1ZUxpc3RJdGVyYXRvcjxpbnQ+OwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRVmFsdWVMaXN0PGludD47CiNlbmRpZgoKI2lmIGRlZmluZWQoUV9ERUZJTkVEX1FWQUxVRUxJU1QpICYmIGRlZmluZWQoUV9ERUZJTkVEX1FSRUNUKSAgJiYgIWRlZmluZWQoUV9FWFBPUlRFRF9RVkFMVUVMSVNUUkVDVF9URU1QTEFURVMpCiNkZWZpbmUgUV9FWFBPUlRFRF9RVkFMVUVMSVNUUkVDVF9URU1QTEFURVMKUV9URU1QTEFURV9FWFRFUk4gdGVtcGxhdGUgY2xhc3MgUV9FWFBPUlQgUVZhbHVlTGlzdEl0ZXJhdG9yPFFSZWN0PjsKUV9URU1QTEFURV9FWFRFUk4gdGVtcGxhdGUgY2xhc3MgUV9FWFBPUlQgUVZhbHVlTGlzdDxRUmVjdD47CiNlbmRpZgoKI2lmIGRlZmluZWQoUV9ERUZJTkVEX1FWQUxVRUxJU1QpICYmIGRlZmluZWQoUV9ERUZJTkVEX1FTVFJJTkcpICAmJiAhZGVmaW5lZChRX0VYUE9SVEVEX1FWQUxVRUxJU1RTVFJJTkdfVEVNUExBVEVTKQojZGVmaW5lIFFfRVhQT1JURURfUVZBTFVFTElTVFNUUklOR19URU1QTEFURVMKUV9URU1QTEFURV9FWFRFUk4gdGVtcGxhdGUgY2xhc3MgUV9FWFBPUlQgUVZhbHVlTGlzdEl0ZXJhdG9yPFFTdHJpbmc+OwpRX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRVmFsdWVMaXN0PFFTdHJpbmc+OwojZW5kaWYKCi8vIFFTdHlsZXNoZWV0IHRlbXBsYXRlIGV4cG9ydHMKI2lmIGRlZmluZWQoUV9ERUZJTkVEX1FWQUxVRUxJU1QpICYmIGRlZmluZWQoUV9ERUZJTkVEX1FQVFJWRUNUT1IpICYmIGRlZmluZWQoUV9ERUZJTkVEX1FTVFlMRVNIRUVUKSAgJiYgIWRlZmluZWQoUV9FWFBPUlRFRF9RU1RZTEVTSEVFVElURU0xX1RFTVBMQVRFUykKI2RlZmluZSBRX0VYUE9SVEVEX1FTVFlMRVNIRUVUSVRFTTFfVEVNUExBVEVTClFfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFWYWx1ZUxpc3Q8IFFQdHJWZWN0b3I8IFFTdHlsZVNoZWV0SXRlbT4gPjsKI2VuZGlmCgojaWYgZGVmaW5lZChRX0RFRklORURfUVZBTFVFTElTVCkgJiYgZGVmaW5lZChRX0RFRklORURfUVNUWUxFU0hFRVQpICAmJiAhZGVmaW5lZChRX0VYUE9SVEVEX1FTVFlMRVNIRUVUSVRFTTJfVEVNUExBVEVTKQojZGVmaW5lIFFfRVhQT1JURURfUVNUWUxFU0hFRVRJVEVNMl9URU1QTEFURVMKUV9URU1QTEFURV9FWFRFUk4gdGVtcGxhdGUgY2xhc3MgUV9FWFBPUlQgUVZhbHVlTGlzdDxRU3R5bGVTaGVldEl0ZW06Okxpc3RTdHlsZT47CiNlbmRpZgoKLy8gcWNhbnZhcyB0ZW1wbGF0ZSBleHBvcnRzCiNpZiBkZWZpbmVkKFFfREVGSU5FRF9RUFRSTElTVCkgICYmIGRlZmluZWQoUV9ERUZJTkVEX1FDQU5WQVMpICYmICFkZWZpbmVkKFFfRVhQT1JURURfUUNBTlZBUzFfVEVNUExBVEVTKQojZGVmaW5lIFFfRVhQT1JURURfUUNBTlZBUzFfVEVNUExBVEVTClFNX1RFTVBMQVRFX0VYVEVSTl9DQU5WQVMgdGVtcGxhdGUgY2xhc3MgUU1fRVhQT1JUX0NBTlZBUyBRUHRyTGlzdEl0ZXJhdG9yPCBRQ2FudmFzSXRlbSA+OwpRTV9URU1QTEFURV9FWFRFUk5fQ0FOVkFTIHRlbXBsYXRlIGNsYXNzIFFNX0VYUE9SVF9DQU5WQVMgUVB0ckxpc3Q8IFFDYW52YXNJdGVtID47ClFNX1RFTVBMQVRFX0VYVEVSTl9DQU5WQVMgdGVtcGxhdGUgY2xhc3MgUU1fRVhQT1JUX0NBTlZBUyBRUHRyTGlzdEl0ZXJhdG9yPCBRQ2FudmFzVmlldyA+OwpRTV9URU1QTEFURV9FWFRFUk5fQ0FOVkFTIHRlbXBsYXRlIGNsYXNzIFFNX0VYUE9SVF9DQU5WQVMgUVB0ckxpc3Q8IFFDYW52YXNWaWV3ID47CiNlbmRpZgoKLy8gcXRhYmxlIHRlbXBsYXRlIGV4cG9ydHMKI2lmIGRlZmluZWQoUV9ERUZJTkVEX1FQVFJMSVNUKSAmJiBkZWZpbmVkKFFfREVGSU5FRF9RVEFCTEVfU0VMRUNUSU9OKSAmJiAhZGVmaW5lZChRX0VYUE9SVEVEX1FUQUJMRVNFTEVDVElPTl9URU1QTEFURVMpCiNkZWZpbmUgUV9FWFBPUlRFRF9RVEFCTEVTRUxFQ1RJT05fVEVNUExBVEVTClFNX1RFTVBMQVRFX0VYVEVSTl9UQUJMRSB0ZW1wbGF0ZSBjbGFzcyBRTV9FWFBPUlRfVEFCTEUgUVB0ckxpc3Q8UVRhYmxlU2VsZWN0aW9uPjsKI2VuZGlmCgojaWYgZGVmaW5lZChRX0RFRklORURfUVRBQkxFX0lURU0pICYmIGRlZmluZWQoUV9ERUZJTkVEX1FQVFJWRUNUT1IpICYmICFkZWZpbmVkKFFfRVhQT1JURURfUVRBQkxFSVRFTV9URU1QTEFURVMpCiNkZWZpbmUgUV9FWFBPUlRFRF9RVEFCTEVJVEVNX1RFTVBMQVRFUwpRTV9URU1QTEFURV9FWFRFUk5fVEFCTEUgdGVtcGxhdGUgY2xhc3MgUU1fRVhQT1JUX1RBQkxFIFFQdHJWZWN0b3I8UVRhYmxlSXRlbT47CiNlbmRpZgoKI2lmIGRlZmluZWQoUV9ERUZJTkVEX1FUQUJMRSkgJiYgZGVmaW5lZChRX0RFRklORURfUVBUUlZFQ1RPUikKLy9RX1RFTVBMQVRFX0VYVEVSTiB0ZW1wbGF0ZSBjbGFzcyBRX0VYUE9SVCBRUHRyVmVjdG9yPFFUYWJsZT47CiNlbmRpZgoKLy8gcXNxbGV4dGVuc2lvbiB0ZW1wbGF0ZSBleHBvcnRzCiNpZiBkZWZpbmVkKFFfREVGSU5FRF9RU1FMRVhURU5TSU9OKSAmJiBkZWZpbmVkKFFfREVGSU5FRF9RTUFQKSAmJiBkZWZpbmVkKFFfREVGSU5FRF9RVkFMVUVWRUNUT1IpICYmIGRlZmluZWQoUV9ERUZJTkVEX1FTVFJJTkcpICYmICFkZWZpbmVkKFFfRVhQT1JURURfUVNRTEVYVEVOU0lPTl9URU1QTEFURVMpCiNkZWZpbmUgUV9FWFBPUlRFRF9RU1FMRVhURU5TSU9OX1RFTVBMQVRFUwpRTV9URU1QTEFURV9FWFRFUk5fU1FMIHRlbXBsYXRlIGNsYXNzIFFNX0VYUE9SVF9TUUwgUU1hcDxRU3RyaW5nLFBhcmFtPjsKUU1fVEVNUExBVEVfRVhURVJOX1NRTCB0ZW1wbGF0ZSBjbGFzcyBRTV9FWFBPUlRfU1FMIFFWYWx1ZVZlY3RvcjxIb2xkZXI+OwojZW5kaWYKCgovLyBNT0NfU0tJUF9FTkQKI2VuZGlmIC8vIHRlbXBsYXRlIGRlZmluZWQKAAAAIABxAHcAcwBjAG8AbQBtAGEAbgBkAF8AcQB3AHMALgBoAAAyLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFXU0NPTU1BTkRfUVdTX0gKI2RlZmluZSBRV1NDT01NQU5EX1FXU19ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInF3c3V0aWxzX3F3cy5oIgojZW5kaWYgLy8gUVRfSAoKI2RlZmluZSBRVEVfUElQRSAiUXRFbWJlZGRlZC0lMSIKCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojaWZuZGVmIFFUX05PX1FXU19NVUxUSVBST0NFU1MKdm9pZCBxd3Nfd3JpdGVfY29tbWFuZCggUVdTU29ja2V0ICpzb2NrZXQsIGludCB0eXBlLCBjaGFyICpzaW1wbGVEYXRhLCBpbnQgc2ltcGxlTGVuLCBjaGFyICpyYXdEYXRhLCBpbnQgcmF3TGVuICk7CmJvb2wgcXdzX3JlYWRfY29tbWFuZCggUVdTU29ja2V0ICpzb2NrZXQsIGNoYXIgKiZzaW1wbGVEYXRhLCBpbnQgJnNpbXBsZUxlbiwgY2hhciAqJnJhd0RhdGEsIGludCAmcmF3TGVuLCBpbnQgJmJ5dGVzUmVhZCApOwojZW5kaWYKLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoKc3RydWN0IFFXU1Byb3RvY29sSXRlbQp7CiAgICAvLyBjdG9yIC0gZHRvcgogICAgUVdTUHJvdG9jb2xJdGVtKCBpbnQgdCwgaW50IGxlbiwgY2hhciAqcHRyICkgOiB0eXBlKCB0ICksCglzaW1wbGVMZW4oIGxlbiApLCByYXdMZW4oIC0xICksIGRlbGV0ZVJhdyhGQUxTRSksIHNpbXBsZURhdGFQdHIoIHB0ciApLAoJcmF3RGF0YVB0ciggMCApLCBieXRlc1JlYWQoIDAgKSB7IH0KICAgIHZpcnR1YWwgflFXU1Byb3RvY29sSXRlbSgpOwoKCiAgICAvLyBkYXRhCiAgICBpbnQgdHlwZTsKICAgIGludCBzaW1wbGVMZW47CiAgICBpbnQgcmF3TGVuOwogICAgYm9vbCBkZWxldGVSYXc7CgogICAgLy8gZnVuY3Rpb25zCiNpZm5kZWYgUVRfTk9fUVdTX01VTFRJUFJPQ0VTUwogICAgdm9pZCB3cml0ZSggUVdTU29ja2V0ICpzICk7CiAgICBib29sIHJlYWQoIFFXU1NvY2tldCAqcyApOwojZW5kaWYKICAgIHZvaWQgY29weUZyb20oIGNvbnN0IFFXU1Byb3RvY29sSXRlbSAqaXRlbSApOwoKICAgIHZpcnR1YWwgdm9pZCBzZXREYXRhKCBjaGFyICpkYXRhLCBpbnQgbGVuLCBib29sIGFsbG9jYXRlTWVtID0gVFJVRSApOwoKICAgIGNoYXIgKnNpbXBsZURhdGFQdHI7CiAgICBjaGFyICpyYXdEYXRhUHRyOwogICAgLy8gdGVtcCB2YXJpYWJsZXMKICAgIGludCBieXRlc1JlYWQ7Cn07CgoKc3RydWN0IFFXU0NvbW1hbmQgOiBRV1NQcm90b2NvbEl0ZW0KewogICAgUVdTQ29tbWFuZCggaW50IHQsIGludCBsZW4sIGNoYXIgKnB0ciApIDogUVdTUHJvdG9jb2xJdGVtKHQsbGVuLHB0cikge30KCiAgICBlbnVtIFR5cGUgewoJVW5rbm93biA9IDAsCglDcmVhdGUsCglEZXN0cm95LAoJUmVnaW9uLAoJUmVnaW9uTW92ZSwKCVJlZ2lvbkRlc3Ryb3ksCglTZXRQcm9wZXJ0eSwKCUFkZFByb3BlcnR5LAoJUmVtb3ZlUHJvcGVydHksCglHZXRQcm9wZXJ0eSwKCVNldFNlbGVjdGlvbk93bmVyLAoJQ29udmVydFNlbGVjdGlvbiwKCVJlcXVlc3RGb2N1cywKCUNoYW5nZUFsdGl0dWRlLAoJRGVmaW5lQ3Vyc29yLAoJU2VsZWN0Q3Vyc29yLAoJR3JhYk1vdXNlLAoJUGxheVNvdW5kLAoJUUNvcFJlZ2lzdGVyQ2hhbm5lbCwKCVFDb3BTZW5kLAoJUmVnaW9uTmFtZSwKCUlkZW50aWZ5LAoJR3JhYktleWJvYXJkLAoJUmVwYWludFJlZ2lvbiwKCVNldE1pY3JvRm9jdXMsCglSZXNldElNCiAgICB9OwogICAgc3RhdGljIFFXU0NvbW1hbmQgKmZhY3RvcnkoIGludCB0eXBlICk7Cn07CgovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdHJ1Y3QgUVdTSWRlbnRpZnlDb21tYW5kIDogcHVibGljIFFXU0NvbW1hbmQKewogICAgUVdTSWRlbnRpZnlDb21tYW5kKCkgOgoJUVdTQ29tbWFuZCggUVdTQ29tbWFuZDo6SWRlbnRpZnksCgkJICAgIHNpemVvZiggc2ltcGxlRGF0YSApLCAoY2hhciAqKSZzaW1wbGVEYXRhICkge30KCiAgICB2b2lkIHNldERhdGEoIGNoYXIgKmQsIGludCBsZW4sIGJvb2wgYWxsb2NhdGVNZW0gKSB7CglRV1NDb21tYW5kOjpzZXREYXRhKCBkLCBsZW4sIGFsbG9jYXRlTWVtICk7CglpZCA9IFFTdHJpbmcoKFFDaGFyKilkLCBzaW1wbGVEYXRhLmlkTGVuLzIpOwogICAgfQoKICAgIHZvaWQgc2V0SWQoIGNvbnN0IFFTdHJpbmcmIGkgKQogICAgewoJaWQgPSBpOwoJaW50IGwgPSBzaW1wbGVEYXRhLmlkTGVuID0gaWQubGVuZ3RoKCkqMjsKCVFCeXRlQXJyYXkgYmEobCk7CgljaGFyICpkID0gYmEuZGF0YSgpOwoJbWVtY3B5KCBkLCBpZC51bmljb2RlKCksIHNpbXBsZURhdGEuaWRMZW4gKTsKCXNldERhdGEoIGQsIGwsIFRSVUUgKTsKICAgIH0KCiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7CglpbnQgaWRMZW47CiAgICB9IHNpbXBsZURhdGE7CiAgICBRU3RyaW5nIGlkOwp9OwoKc3RydWN0IFFXU0NyZWF0ZUNvbW1hbmQgOiBwdWJsaWMgUVdTQ29tbWFuZAp7CiAgICBRV1NDcmVhdGVDb21tYW5kKCkgOgoJUVdTQ29tbWFuZCggUVdTQ29tbWFuZDo6Q3JlYXRlLCAwLCAwICkge30KfTsKCnN0cnVjdCBRV1NSZWdpb25OYW1lQ29tbWFuZCA6IHB1YmxpYyBRV1NDb21tYW5kCnsKICAgIFFXU1JlZ2lvbk5hbWVDb21tYW5kKCkgOgoJUVdTQ29tbWFuZCggUVdTQ29tbWFuZDo6UmVnaW9uTmFtZSwKCQkgICAgc2l6ZW9mKCBzaW1wbGVEYXRhICksIChjaGFyICopJnNpbXBsZURhdGEgKSB7fQoKICAgIHZvaWQgc2V0RGF0YSggY2hhciAqZCwgaW50IGxlbiwgYm9vbCBhbGxvY2F0ZU1lbSApIHsKCVFXU0NvbW1hbmQ6OnNldERhdGEoIGQsIGxlbiwgYWxsb2NhdGVNZW0gKTsKCW5hbWUgPSBRU3RyaW5nKChRQ2hhciopZCwgc2ltcGxlRGF0YS5uYW1lTGVuLzIpOwoJZCArPSBzaW1wbGVEYXRhLm5hbWVMZW47CgljYXB0aW9uID0gUVN0cmluZygoUUNoYXIqKWQsIHNpbXBsZURhdGEuY2FwdGlvbkxlbi8yKTsKICAgIH0KCiAgICB2b2lkIHNldE5hbWUoIGNvbnN0IFFTdHJpbmcmIG4sIGNvbnN0IFFTdHJpbmcgJmMgKQogICAgewoJbmFtZSA9IG47CgljYXB0aW9uID0gYzsKCWludCBsID0gc2ltcGxlRGF0YS5uYW1lTGVuID0gbmFtZS5sZW5ndGgoKSoyOwoJbCArPSBzaW1wbGVEYXRhLmNhcHRpb25MZW4gPSBjYXB0aW9uLmxlbmd0aCgpKjI7CglRQnl0ZUFycmF5IGJhKGwpOwoJY2hhciAqZCA9IGJhLmRhdGEoKTsKCW1lbWNweSggZCwgbmFtZS51bmljb2RlKCksIHNpbXBsZURhdGEubmFtZUxlbiApOwoJbWVtY3B5KCBkK3NpbXBsZURhdGEubmFtZUxlbiwgY2FwdGlvbi51bmljb2RlKCksIHNpbXBsZURhdGEuY2FwdGlvbkxlbiApOwoJc2V0RGF0YSggZCwgbCwgVFJVRSApOwogICAgfQoKICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCB3aW5kb3dpZDsKCWludCBuYW1lTGVuOwoJaW50IGNhcHRpb25MZW47CiAgICB9IHNpbXBsZURhdGE7CiAgICBRU3RyaW5nIG5hbWU7CiAgICBRU3RyaW5nIGNhcHRpb247Cn07CgpzdHJ1Y3QgUVdTUmVnaW9uQ29tbWFuZCA6IHB1YmxpYyBRV1NDb21tYW5kCnsKICAgIFFXU1JlZ2lvbkNvbW1hbmQoKSA6CglRV1NDb21tYW5kKCBRV1NDb21tYW5kOjpSZWdpb24sIHNpemVvZiggc2ltcGxlRGF0YSApLAoJCSAgICAoY2hhciopJnNpbXBsZURhdGEgKSB7fQoKICAgIHZvaWQgc2V0RGF0YSggY2hhciAqZCwgaW50IGxlbiwgYm9vbCBhbGxvY2F0ZU1lbSA9IFRSVUUgKSB7CglRV1NDb21tYW5kOjpzZXREYXRhKCBkLCBsZW4sIGFsbG9jYXRlTWVtICk7CglyZWN0YW5nbGVzID0gKFFSZWN0KilyYXdEYXRhUHRyOwogICAgfQoKICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCB3aW5kb3dpZDsKCWludCBucmVjdGFuZ2xlczsKICAgIH0gc2ltcGxlRGF0YTsKCiAgICBRUmVjdCAqcmVjdGFuZ2xlczsKCn07CgpzdHJ1Y3QgUVdTUmVnaW9uTW92ZUNvbW1hbmQgOiBwdWJsaWMgUVdTQ29tbWFuZAp7CiAgICBRV1NSZWdpb25Nb3ZlQ29tbWFuZCgpIDoKCVFXU0NvbW1hbmQoIFFXU0NvbW1hbmQ6OlJlZ2lvbk1vdmUsIHNpemVvZiggc2ltcGxlRGF0YSApLAoJCSAgICAoY2hhciopJnNpbXBsZURhdGEgKSB7fQoKICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCB3aW5kb3dpZDsKCWludCBkeDsKCWludCBkeTsKICAgIH0gc2ltcGxlRGF0YTsKCn07CgpzdHJ1Y3QgUVdTUmVnaW9uRGVzdHJveUNvbW1hbmQgOiBwdWJsaWMgUVdTQ29tbWFuZAp7CiAgICBRV1NSZWdpb25EZXN0cm95Q29tbWFuZCgpIDoKCVFXU0NvbW1hbmQoIFFXU0NvbW1hbmQ6OlJlZ2lvbkRlc3Ryb3ksIHNpemVvZiggc2ltcGxlRGF0YSApLAoJCSAgICAoY2hhciopJnNpbXBsZURhdGEgKSB7fQoKICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCB3aW5kb3dpZDsKICAgIH0gc2ltcGxlRGF0YTsKCn07CgpzdHJ1Y3QgUVdTUmVxdWVzdEZvY3VzQ29tbWFuZCA6IHB1YmxpYyBRV1NDb21tYW5kCnsKICAgIFFXU1JlcXVlc3RGb2N1c0NvbW1hbmQoKSA6CglRV1NDb21tYW5kKCBRV1NDb21tYW5kOjpSZXF1ZXN0Rm9jdXMsIHNpemVvZiggc2ltcGxlRGF0YSApLCAoY2hhciopJnNpbXBsZURhdGEgKSB7fQoKICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCB3aW5kb3dpZDsKCWludCBmbGFnOwogICAgfSBzaW1wbGVEYXRhOwp9OwoKc3RydWN0IFFXU0NoYW5nZUFsdGl0dWRlQ29tbWFuZCA6IHB1YmxpYyBRV1NDb21tYW5kCnsKICAgIFFXU0NoYW5nZUFsdGl0dWRlQ29tbWFuZCgpIDoKCVFXU0NvbW1hbmQoIFFXU0NvbW1hbmQ6OkNoYW5nZUFsdGl0dWRlLCBzaXplb2YoIHNpbXBsZURhdGEgKSwgKGNoYXIqKSZzaW1wbGVEYXRhICkge30KCiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7CglpbnQgd2luZG93aWQ7CglpbnQgYWx0aXR1ZGU7Cglib29sIGZpeGVkOwogICAgfSBzaW1wbGVEYXRhOwoKfTsKCgpzdHJ1Y3QgUVdTQWRkUHJvcGVydHlDb21tYW5kIDogcHVibGljIFFXU0NvbW1hbmQKewogICAgUVdTQWRkUHJvcGVydHlDb21tYW5kKCkgOgoJUVdTQ29tbWFuZCggUVdTQ29tbWFuZDo6QWRkUHJvcGVydHksIHNpemVvZiggc2ltcGxlRGF0YSApLCAoY2hhciopJnNpbXBsZURhdGEgKSB7fQoKICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCB3aW5kb3dpZCwgcHJvcGVydHk7CiAgICB9IHNpbXBsZURhdGE7Cgp9OwoKc3RydWN0IFFXU1NldFByb3BlcnR5Q29tbWFuZCA6IHB1YmxpYyBRV1NDb21tYW5kCnsKICAgIFFXU1NldFByb3BlcnR5Q29tbWFuZCgpIDoKCVFXU0NvbW1hbmQoIFFXU0NvbW1hbmQ6OlNldFByb3BlcnR5LCBzaXplb2YoIHNpbXBsZURhdGEgKSwKCQkgICAgKGNoYXIqKSZzaW1wbGVEYXRhICkgeyBkYXRhID0gMDsgfQoKICAgIHZvaWQgc2V0RGF0YSggY2hhciAqZCwgaW50IGxlbiwgYm9vbCBhbGxvY2F0ZU1lbSA9IFRSVUUgKSB7CglRV1NDb21tYW5kOjpzZXREYXRhKCBkLCBsZW4sIGFsbG9jYXRlTWVtICk7CglkYXRhID0gcmF3RGF0YVB0cjsKICAgIH0KCiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7CglpbnQgd2luZG93aWQsIHByb3BlcnR5LCBtb2RlOwogICAgfSBzaW1wbGVEYXRhOwoKICAgIGNoYXIgKmRhdGE7Cn07CgpzdHJ1Y3QgUVdTUmVwYWludFJlZ2lvbkNvbW1hbmQgOiBwdWJsaWMgUVdTQ29tbWFuZAp7CiAgICBRV1NSZXBhaW50UmVnaW9uQ29tbWFuZCgpIDoKCVFXU0NvbW1hbmQoIFFXU0NvbW1hbmQ6OlJlcGFpbnRSZWdpb24sIHNpemVvZiggc2ltcGxlRGF0YSApLAoJCSAgICAoY2hhciopJnNpbXBsZURhdGEgKSB7fQoKICAgIHZvaWQgc2V0RGF0YSggY2hhciAqZCwgaW50IGxlbiwgYm9vbCBhbGxvY2F0ZU1lbSA9IFRSVUUgKSB7CglRV1NDb21tYW5kOjpzZXREYXRhKCBkLCBsZW4sIGFsbG9jYXRlTWVtICk7CglyZWN0YW5nbGVzID0gKFFSZWN0ICopcmF3RGF0YVB0cjsKICAgIH0KCiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7CglpbnQgbnVtcmVjdHM7CiAgICB9IHNpbXBsZURhdGE7CgogICAgUVJlY3QgKiByZWN0YW5nbGVzOwoKfTsKCnN0cnVjdCBRV1NSZW1vdmVQcm9wZXJ0eUNvbW1hbmQgOiBwdWJsaWMgUVdTQ29tbWFuZAp7CiAgICBRV1NSZW1vdmVQcm9wZXJ0eUNvbW1hbmQoKSA6CglRV1NDb21tYW5kKCBRV1NDb21tYW5kOjpSZW1vdmVQcm9wZXJ0eSwgc2l6ZW9mKCBzaW1wbGVEYXRhICksIChjaGFyKikmc2ltcGxlRGF0YSApIHt9CgogICAgc3RydWN0IFNpbXBsZURhdGEgewoJaW50IHdpbmRvd2lkLCBwcm9wZXJ0eTsKICAgIH0gc2ltcGxlRGF0YTsKCn07CgpzdHJ1Y3QgUVdTR2V0UHJvcGVydHlDb21tYW5kIDogcHVibGljIFFXU0NvbW1hbmQKewogICAgUVdTR2V0UHJvcGVydHlDb21tYW5kKCkgOgoJUVdTQ29tbWFuZCggUVdTQ29tbWFuZDo6R2V0UHJvcGVydHksIHNpemVvZiggc2ltcGxlRGF0YSApLCAoY2hhciopJnNpbXBsZURhdGEgKSB7fQoKICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCB3aW5kb3dpZCwgcHJvcGVydHk7CiAgICB9IHNpbXBsZURhdGE7Cgp9OwoKc3RydWN0IFFXU1NldFNlbGVjdGlvbk93bmVyQ29tbWFuZCA6IHB1YmxpYyBRV1NDb21tYW5kCnsKICAgIFFXU1NldFNlbGVjdGlvbk93bmVyQ29tbWFuZCgpIDoKCVFXU0NvbW1hbmQoIFFXU0NvbW1hbmQ6OlNldFNlbGVjdGlvbk93bmVyLAoJCSAgICBzaXplb2YoIHNpbXBsZURhdGEgKSwgKGNoYXIqKSZzaW1wbGVEYXRhICkge30KCiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7CglpbnQgd2luZG93aWQ7CglpbnQgaG91ciwgbWludXRlLCBzZWMsIG1zOyAvLyB0aW1lCiAgICB9IHNpbXBsZURhdGE7Cgp9OwoKc3RydWN0IFFXU0NvbnZlcnRTZWxlY3Rpb25Db21tYW5kIDogcHVibGljIFFXU0NvbW1hbmQKewogICAgUVdTQ29udmVydFNlbGVjdGlvbkNvbW1hbmQoKSA6CglRV1NDb21tYW5kKCBRV1NDb21tYW5kOjpDb252ZXJ0U2VsZWN0aW9uLAoJCSAgICBzaXplb2YoIHNpbXBsZURhdGEgKSwgKGNoYXIqKSZzaW1wbGVEYXRhICkge30KCiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7CglpbnQgcmVxdWVzdG9yOyAvLyByZXF1ZXN0b3Igd2luZG93IG9mIHRoZSBzZWxlY3Rpb24KCWludCBzZWxlY3Rpb247IC8vIHByb3BlcnR5IG9uIHJlcXVlc3RvciBpbnRvIHdoaWNoIHRoZSBzZWxlY3Rpb24gc2hvdWxkIGJlIHN0b3JlZAoJaW50IG1pbWVUeXBlczsgLy8gcHJvcGVydHkgaW9uIHJlcXVlc3RvciBpbiB3aGljaCB0aGUgbWltZXR5cGVzLCBpbiB3aGljaCB0aGUgc2VsZWN0aW9uIG1heSBiZSwgYXJlIHN0b3JlZAogICAgfSBzaW1wbGVEYXRhOwoKfTsKCnN0cnVjdCBRV1NEZWZpbmVDdXJzb3JDb21tYW5kIDogcHVibGljIFFXU0NvbW1hbmQKewogICAgUVdTRGVmaW5lQ3Vyc29yQ29tbWFuZCgpIDoKCVFXU0NvbW1hbmQoIFFXU0NvbW1hbmQ6OkRlZmluZUN1cnNvciwKCQkgICAgc2l6ZW9mKCBzaW1wbGVEYXRhICksIChjaGFyICopJnNpbXBsZURhdGEgKSB7fQoKICAgIHZvaWQgc2V0RGF0YSggY2hhciAqZCwgaW50IGxlbiwgYm9vbCBhbGxvY2F0ZU1lbSA9IFRSVUUgKSB7CglRV1NDb21tYW5kOjpzZXREYXRhKCBkLCBsZW4sIGFsbG9jYXRlTWVtICk7CglkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilyYXdEYXRhUHRyOwogICAgfQoKICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCB3aWR0aDsKCWludCBoZWlnaHQ7CglpbnQgaG90WDsKCWludCBob3RZOwoJaW50IGlkOwogICAgfSBzaW1wbGVEYXRhOwoKICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Cn07CgpzdHJ1Y3QgUVdTU2VsZWN0Q3Vyc29yQ29tbWFuZCA6IHB1YmxpYyBRV1NDb21tYW5kCnsKICAgIFFXU1NlbGVjdEN1cnNvckNvbW1hbmQoKSA6CglRV1NDb21tYW5kKCBRV1NDb21tYW5kOjpTZWxlY3RDdXJzb3IsCgkJICAgIHNpemVvZiggc2ltcGxlRGF0YSApLCAoY2hhciAqKSZzaW1wbGVEYXRhICkge30KCiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7CglpbnQgd2luZG93aWQ7CglpbnQgaWQ7CiAgICB9IHNpbXBsZURhdGE7Cn07CgpzdHJ1Y3QgUVdTR3JhYk1vdXNlQ29tbWFuZCA6IHB1YmxpYyBRV1NDb21tYW5kCnsKICAgIFFXU0dyYWJNb3VzZUNvbW1hbmQoKSA6CglRV1NDb21tYW5kKCBRV1NDb21tYW5kOjpHcmFiTW91c2UsCgkJICAgIHNpemVvZiggc2ltcGxlRGF0YSApLCAoY2hhciAqKSZzaW1wbGVEYXRhICkge30KCiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7CglpbnQgd2luZG93aWQ7Cglib29sIGdyYWI7ICAvLyBncmFiIG9yIHVuZ3JhYj8KICAgIH0gc2ltcGxlRGF0YTsKfTsKCnN0cnVjdCBRV1NHcmFiS2V5Ym9hcmRDb21tYW5kIDogcHVibGljIFFXU0NvbW1hbmQKewogICAgUVdTR3JhYktleWJvYXJkQ29tbWFuZCgpIDoKCVFXU0NvbW1hbmQoIFFXU0NvbW1hbmQ6OkdyYWJLZXlib2FyZCwKCQkgICAgc2l6ZW9mKCBzaW1wbGVEYXRhICksIChjaGFyICopJnNpbXBsZURhdGEgKSB7fQoKICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCB3aW5kb3dpZDsKCWJvb2wgZ3JhYjsgIC8vIGdyYWIgb3IgdW5ncmFiPwogICAgfSBzaW1wbGVEYXRhOwp9OwoKI2lmbmRlZiBRVF9OT19TT1VORApzdHJ1Y3QgUVdTUGxheVNvdW5kQ29tbWFuZCA6IHB1YmxpYyBRV1NDb21tYW5kCnsKICAgIFFXU1BsYXlTb3VuZENvbW1hbmQoKSA6CglRV1NDb21tYW5kKCBRV1NDb21tYW5kOjpQbGF5U291bmQsCgkJICAgIHNpemVvZiggc2ltcGxlRGF0YSApLCAoY2hhciAqKSZzaW1wbGVEYXRhICkge30KCiAgICB2b2lkIHNldERhdGEoIGNoYXIgKmQsIGludCBsZW4sIGJvb2wgYWxsb2NhdGVNZW0gKSB7CglRV1NDb21tYW5kOjpzZXREYXRhKCBkLCBsZW4sIGFsbG9jYXRlTWVtICk7CglmaWxlbmFtZSA9IFFTdHJpbmcoKFFDaGFyKilyYXdEYXRhUHRyLGxlbi8yKTsKICAgIH0KICAgIHZvaWQgc2V0RmlsZU5hbWUoIGNvbnN0IFFTdHJpbmcmIG4gKQogICAgewoJc2V0RGF0YSggKGNoYXIqKW4udW5pY29kZSgpLCBuLmxlbmd0aCgpKjIsIFRSVUUgKTsKICAgIH0KCiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7CglpbnQgd2luZG93aWQ7CiAgICB9IHNpbXBsZURhdGE7CiAgICBRU3RyaW5nIGZpbGVuYW1lOwp9OwojZW5kaWYKCgojaWZuZGVmIFFUX05PX0NPUApzdHJ1Y3QgUVdTUUNvcFJlZ2lzdGVyQ2hhbm5lbENvbW1hbmQgOiBwdWJsaWMgUVdTQ29tbWFuZAp7CiAgICBRV1NRQ29wUmVnaXN0ZXJDaGFubmVsQ29tbWFuZCgpIDoKCVFXU0NvbW1hbmQoIFFXU0NvbW1hbmQ6OlFDb3BSZWdpc3RlckNoYW5uZWwsCgkJICAgIHNpemVvZiggc2ltcGxlRGF0YSApLCAoY2hhciAqKSZzaW1wbGVEYXRhICkge30KCiAgICB2b2lkIHNldERhdGEoIGNoYXIgKmQsIGludCBsZW4sIGJvb2wgYWxsb2NhdGVNZW0gKSB7CglRV1NDb21tYW5kOjpzZXREYXRhKCBkLCBsZW4sIGFsbG9jYXRlTWVtICk7CgljaGFubmVsID0gUUNTdHJpbmcoIGQsIGxlbiApOwogICAgfQoKICAgIHZvaWQgc2V0Q2hhbm5lbCggY29uc3QgUUNTdHJpbmcmIG4gKQogICAgewoJc2V0RGF0YSggKGNoYXIqKW4uZGF0YSgpLCBuLmxlbmd0aCgpKzEsIFRSVUUgKTsKICAgIH0KCiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7Cglib29sIHVudXNlZDsgLy8gd2UgbWF5IG5lZWQgaXQKICAgIH0gc2ltcGxlRGF0YTsKICAgIFFTdHJpbmcgY2hhbm5lbDsKfTsKCnN0cnVjdCBRV1NRQ29wU2VuZENvbW1hbmQgOiBwdWJsaWMgUVdTQ29tbWFuZAp7CiAgICBRV1NRQ29wU2VuZENvbW1hbmQoKSA6CglRV1NDb21tYW5kKCBRV1NDb21tYW5kOjpRQ29wU2VuZCwKCQkgICAgc2l6ZW9mKCBzaW1wbGVEYXRhICksIChjaGFyICopJnNpbXBsZURhdGEgKSB7fQoKICAgIHZvaWQgc2V0RGF0YSggY2hhciAqZCwgaW50IGxlbiwgYm9vbCBhbGxvY2F0ZU1lbSApIHsKCVFXU0NvbW1hbmQ6OnNldERhdGEoIGQsIGxlbiwgYWxsb2NhdGVNZW0gKTsKCWNoYW5uZWwgPSBRQ1N0cmluZyggZCwgc2ltcGxlRGF0YS5jbGVuICsgMSApOwoJZCArPSBzaW1wbGVEYXRhLmNsZW47CgltZXNzYWdlID0gUUNTdHJpbmcoIGQsIHNpbXBsZURhdGEubWxlbiArIDEgKTsKCWQgKz0gc2ltcGxlRGF0YS5tbGVuOwoJZGF0YS5kdXBsaWNhdGUoIGQsIHNpbXBsZURhdGEuZGxlbiApOwogICAgfQoKICAgIHZvaWQgc2V0TWVzc2FnZSggY29uc3QgUUNTdHJpbmcgJmMsIGNvbnN0IFFDU3RyaW5nICZtLAoJCSAgICAgY29uc3QgUUJ5dGVBcnJheSAmZGF0YSApCiAgICB7CglpbnQgbCA9IHNpbXBsZURhdGEuY2xlbiA9IGMubGVuZ3RoKCk7CglsICs9IHNpbXBsZURhdGEubWxlbiA9IG0ubGVuZ3RoKCk7CglsICs9IHNpbXBsZURhdGEuZGxlbiA9IGRhdGEuc2l6ZSgpOwoJUUJ5dGVBcnJheSB0bXAoIGwgKTsKCWNoYXIgKmQgPSB0bXAuZGF0YSgpOwoJbWVtY3B5KCBkLCBjLmRhdGEoKSwgc2ltcGxlRGF0YS5jbGVuICk7CglkICs9IHNpbXBsZURhdGEuY2xlbjsKCW1lbWNweSggZCwgbS5kYXRhKCksIHNpbXBsZURhdGEubWxlbiApOwoJZCArPSBzaW1wbGVEYXRhLm1sZW47CgltZW1jcHkoIGQsIGRhdGEuZGF0YSgpLCBzaW1wbGVEYXRhLmRsZW4gKTsKCXNldERhdGEoIChjaGFyKil0bXAuZGF0YSgpLCBsLCBUUlVFICk7CiAgICB9CgogICAgc3RydWN0IFNpbXBsZURhdGEgewoJaW50IGNsZW47CglpbnQgbWxlbjsKCWludCBkbGVuOwogICAgfSBzaW1wbGVEYXRhOwogICAgUUNTdHJpbmcgY2hhbm5lbDsKICAgIFFDU3RyaW5nIG1lc3NhZ2U7CiAgICBRQnl0ZUFycmF5IGRhdGE7Cn07CgojZW5kaWYKCgojaWZuZGVmIFFUX05PX1FXU19JTQpzdHJ1Y3QgUVdTU2V0TWljcm9Gb2N1c0NvbW1hbmQgOiBwdWJsaWMgUVdTQ29tbWFuZAp7CiAgICBRV1NTZXRNaWNyb0ZvY3VzQ29tbWFuZCgpIDoKCVFXU0NvbW1hbmQoIFFXU0NvbW1hbmQ6OlNldE1pY3JvRm9jdXMsCgkJICAgIHNpemVvZiggc2ltcGxlRGF0YSApLCAoY2hhciAqKSZzaW1wbGVEYXRhICkge30KCiAgICBzdHJ1Y3QgU2ltcGxlRGF0YSB7CglpbnQgd2luZG93aWQ7CglpbnQgeDsKCWludCB5OwoJLy9ib29sIHRleHRJbnB1dDsKICAgIH0gc2ltcGxlRGF0YTsKICAgIC8vWFhYIEZvbnQ/Pz8KfTsKCnN0cnVjdCBRV1NSZXNldElNQ29tbWFuZCA6IHB1YmxpYyBRV1NDb21tYW5kCnsKICAgIFFXU1Jlc2V0SU1Db21tYW5kKCkgOgoJUVdTQ29tbWFuZCggUVdTQ29tbWFuZDo6UmVzZXRJTSwKCQkgICAgc2l6ZW9mKCBzaW1wbGVEYXRhICksIChjaGFyICopJnNpbXBsZURhdGEgKSB7fQoKICAgIHN0cnVjdCBTaW1wbGVEYXRhIHsKCWludCB3aW5kb3dpZDsKICAgIH0gc2ltcGxlRGF0YTsKfTsKCiNlbmRpZgoKI2VuZGlmIC8vIFFXU0NPTU1BTkRfUVdTX0gKAAAAHABxAHcAcwB1AHQAaQBsAHMAXwBxAHcAcwAuAGgAAAfALyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdTVVRJTFNfUVdTX0gKI2RlZmluZSBRV1NVVElMU19RV1NfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxd3Nzb2NrZXRfcXdzLmgiCiNlbmRpZiAvLyBRVF9ICgovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2lmbmRlZiBRVF9OT19RV1NfTVVMVElQUk9DRVNTCmlubGluZSBpbnQgcXdzX3JlYWRfdWludCggUVdTU29ja2V0ICpzb2NrZXQgKQp7CiAgICBpZiAoICFzb2NrZXQgfHwgc29ja2V0LT5zaXplKCkgPCBzaXplb2YoIGludCApICkKCXJldHVybiAtMTsKCiAgICBpbnQgaTsKICAgIHNvY2tldC0+cmVhZEJsb2NrKCAoY2hhciopJmksIHNpemVvZiggaSApICk7CgogICAgcmV0dXJuIGk7Cn0KCmlubGluZSB2b2lkIHF3c193cml0ZV91aW50KCBRV1NTb2NrZXQgKnNvY2tldCwgaW50IGkgKQp7CiAgICBpZiAoICFzb2NrZXQgKQoJcmV0dXJuOwoKICAgIHNvY2tldC0+d3JpdGVCbG9jayggKGNoYXIqKSZpLCBzaXplb2YoIGkgKSApOwp9CgojZW5kaWYgLy8gUVRfTk9fUVdTX01VTFRJUFJPQ0VTUwoKI2VuZGlmIC8vIFFXU1VUSUxTX1FXU19ICgAAAAwAcQB4AG0AbAAuAGgAAD/oLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVhNTF9ICiNkZWZpbmUgUVhNTF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInF0ZXh0c3RyZWFtLmgiCiNpbmNsdWRlICJxZmlsZS5oIgojaW5jbHVkZSAicXN0cmluZy5oIgojaW5jbHVkZSAicXN0cmluZ2xpc3QuaCIKI2luY2x1ZGUgInF2YWx1ZXZlY3Rvci5oIgojZW5kaWYgLy8gUVRfSAoKI2lmICFkZWZpbmVkKFFUX01PRFVMRV9YTUwpIHx8IGRlZmluZWQoIFFUX0xJQ0VOU0VfUFJPRkVTU0lPTkFMICkgfHwgZGVmaW5lZCggUVRfSU5URVJOQUxfWE1MICkKI2RlZmluZSBRTV9FWFBPUlRfWE1MCiNlbHNlCiNkZWZpbmUgUU1fRVhQT1JUX1hNTCBRX0VYUE9SVAojZW5kaWYKCiNpZm5kZWYgUVRfTk9fWE1MCgpjbGFzcyBRWG1sTmFtZXNwYWNlU3VwcG9ydDsKY2xhc3MgUVhtbEF0dHJpYnV0ZXM7CmNsYXNzIFFYbWxDb250ZW50SGFuZGxlcjsKY2xhc3MgUVhtbERlZmF1bHRIYW5kbGVyOwpjbGFzcyBRWG1sRFRESGFuZGxlcjsKY2xhc3MgUVhtbEVudGl0eVJlc29sdmVyOwpjbGFzcyBRWG1sRXJyb3JIYW5kbGVyOwpjbGFzcyBRWG1sTGV4aWNhbEhhbmRsZXI7CmNsYXNzIFFYbWxEZWNsSGFuZGxlcjsKY2xhc3MgUVhtbElucHV0U291cmNlOwpjbGFzcyBRWG1sTG9jYXRvcjsKY2xhc3MgUVhtbE5hbWVzcGFjZVN1cHBvcnQ7CmNsYXNzIFFYbWxQYXJzZUV4Y2VwdGlvbjsKCmNsYXNzIFFYbWxSZWFkZXI7CmNsYXNzIFFYbWxTaW1wbGVSZWFkZXI7CgpjbGFzcyBRWG1sU2ltcGxlUmVhZGVyUHJpdmF0ZTsKY2xhc3MgUVhtbE5hbWVzcGFjZVN1cHBvcnRQcml2YXRlOwpjbGFzcyBRWG1sQXR0cmlidXRlc1ByaXZhdGU7CmNsYXNzIFFYbWxJbnB1dFNvdXJjZVByaXZhdGU7CmNsYXNzIFFYbWxQYXJzZUV4Y2VwdGlvblByaXZhdGU7CmNsYXNzIFFYbWxMb2NhdG9yUHJpdmF0ZTsKY2xhc3MgUVhtbERlZmF1bHRIYW5kbGVyUHJpdmF0ZTsKCgovLwovLyBTQVggTmFtZXNwYWNlIFN1cHBvcnQKLy8KCmNsYXNzIFFNX0VYUE9SVF9YTUwgUVhtbE5hbWVzcGFjZVN1cHBvcnQKewpwdWJsaWM6CiAgICBRWG1sTmFtZXNwYWNlU3VwcG9ydCgpOwogICAgflFYbWxOYW1lc3BhY2VTdXBwb3J0KCk7CgogICAgdm9pZCBzZXRQcmVmaXgoIGNvbnN0IFFTdHJpbmcmLCBjb25zdCBRU3RyaW5nJiApOwoKICAgIFFTdHJpbmcgcHJlZml4KCBjb25zdCBRU3RyaW5nJiApIGNvbnN0OwogICAgUVN0cmluZyB1cmkoIGNvbnN0IFFTdHJpbmcmICkgY29uc3Q7CiAgICB2b2lkIHNwbGl0TmFtZSggY29uc3QgUVN0cmluZyYsIFFTdHJpbmcmLCBRU3RyaW5nJiApIGNvbnN0OwogICAgdm9pZCBwcm9jZXNzTmFtZSggY29uc3QgUVN0cmluZyYsIGJvb2wsIFFTdHJpbmcmLCBRU3RyaW5nJiApIGNvbnN0OwogICAgUVN0cmluZ0xpc3QgcHJlZml4ZXMoKSBjb25zdDsKICAgIFFTdHJpbmdMaXN0IHByZWZpeGVzKCBjb25zdCBRU3RyaW5nJiApIGNvbnN0OwoKICAgIHZvaWQgcHVzaENvbnRleHQoKTsKICAgIHZvaWQgcG9wQ29udGV4dCgpOwogICAgdm9pZCByZXNldCgpOwoKcHJpdmF0ZToKICAgIFFYbWxOYW1lc3BhY2VTdXBwb3J0UHJpdmF0ZSAqZDsKCiAgICBmcmllbmQgY2xhc3MgUVhtbFNpbXBsZVJlYWRlcjsKfTsKCgovLwovLyBTQVggQXR0cmlidXRlcwovLwoKY2xhc3MgUU1fRVhQT1JUX1hNTCBRWG1sQXR0cmlidXRlcwp7CnB1YmxpYzoKICAgIFFYbWxBdHRyaWJ1dGVzKCkge30KICAgIHZpcnR1YWwgflFYbWxBdHRyaWJ1dGVzKCkge30KCiAgICBpbnQgaW5kZXgoIGNvbnN0IFFTdHJpbmcmIHFOYW1lICkgY29uc3Q7CiAgICBpbnQgaW5kZXgoIGNvbnN0IFFTdHJpbmcmIHVyaSwgY29uc3QgUVN0cmluZyYgbG9jYWxQYXJ0ICkgY29uc3Q7CiAgICBpbnQgbGVuZ3RoKCkgY29uc3Q7CiAgICBpbnQgY291bnQoKSBjb25zdDsKICAgIFFTdHJpbmcgbG9jYWxOYW1lKCBpbnQgaW5kZXggKSBjb25zdDsKICAgIFFTdHJpbmcgcU5hbWUoIGludCBpbmRleCApIGNvbnN0OwogICAgUVN0cmluZyB1cmkoIGludCBpbmRleCApIGNvbnN0OwogICAgUVN0cmluZyB0eXBlKCBpbnQgaW5kZXggKSBjb25zdDsKICAgIFFTdHJpbmcgdHlwZSggY29uc3QgUVN0cmluZyYgcU5hbWUgKSBjb25zdDsKICAgIFFTdHJpbmcgdHlwZSggY29uc3QgUVN0cmluZyYgdXJpLCBjb25zdCBRU3RyaW5nJiBsb2NhbE5hbWUgKSBjb25zdDsKICAgIFFTdHJpbmcgdmFsdWUoIGludCBpbmRleCApIGNvbnN0OwogICAgUVN0cmluZyB2YWx1ZSggY29uc3QgUVN0cmluZyYgcU5hbWUgKSBjb25zdDsKICAgIFFTdHJpbmcgdmFsdWUoIGNvbnN0IFFTdHJpbmcmIHVyaSwgY29uc3QgUVN0cmluZyYgbG9jYWxOYW1lICkgY29uc3Q7CgogICAgdm9pZCBjbGVhcigpOwogICAgdm9pZCBhcHBlbmQoIGNvbnN0IFFTdHJpbmcgJnFOYW1lLCBjb25zdCBRU3RyaW5nICZ1cmksIGNvbnN0IFFTdHJpbmcgJmxvY2FsUGFydCwgY29uc3QgUVN0cmluZyAmdmFsdWUgKTsKCnByaXZhdGU6CiAgICBRU3RyaW5nTGlzdCBxbmFtZUxpc3Q7CiAgICBRU3RyaW5nTGlzdCB1cmlMaXN0OwogICAgUVN0cmluZ0xpc3QgbG9jYWxuYW1lTGlzdDsKICAgIFFTdHJpbmdMaXN0IHZhbHVlTGlzdDsKCiAgICBRWG1sQXR0cmlidXRlc1ByaXZhdGUgKmQ7Cn07CgovLwovLyBTQVggSW5wdXQgU291cmNlCi8vCgpjbGFzcyBRTV9FWFBPUlRfWE1MIFFYbWxJbnB1dFNvdXJjZQp7CnB1YmxpYzoKICAgIFFYbWxJbnB1dFNvdXJjZSgpOwogICAgUVhtbElucHV0U291cmNlKCBRSU9EZXZpY2UgKmRldiApOwogICAgUVhtbElucHV0U291cmNlKCBRRmlsZSYgZmlsZSApOyAvLyBvYnNvbGV0ZQogICAgUVhtbElucHV0U291cmNlKCBRVGV4dFN0cmVhbSYgc3RyZWFtICk7IC8vIG9ic29sZXRlCiAgICB2aXJ0dWFsIH5RWG1sSW5wdXRTb3VyY2UoKTsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0RGF0YSggY29uc3QgUVN0cmluZyYgZGF0ICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0RGF0YSggY29uc3QgUUJ5dGVBcnJheSYgZGF0ICk7CiAgICB2aXJ0dWFsIHZvaWQgZmV0Y2hEYXRhKCk7CiAgICB2aXJ0dWFsIFFTdHJpbmcgZGF0YSgpOwogICAgdmlydHVhbCBRQ2hhciBuZXh0KCk7CiAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKCiAgICBzdGF0aWMgY29uc3QgUUNoYXIgRW5kT2ZEYXRhOwogICAgc3RhdGljIGNvbnN0IFFDaGFyIEVuZE9mRG9jdW1lbnQ7Cgpwcm90ZWN0ZWQ6CiAgICB2aXJ0dWFsIFFTdHJpbmcgZnJvbVJhd0RhdGEoIGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEsIGJvb2wgYmVnaW5uaW5nID0gRkFMU0UgKTsKCnByaXZhdGU6CiAgICB2b2lkIGluaXQoKTsKCiAgICBRSU9EZXZpY2UgKmlucHV0RGV2aWNlOwogICAgUVRleHRTdHJlYW0gKmlucHV0U3RyZWFtOwoKICAgIFFTdHJpbmcgc3RyOwogICAgY29uc3QgUUNoYXIgKnVuaWNvZGU7CiAgICBpbnQgcG9zOwogICAgaW50IGxlbmd0aDsKICAgIGJvb2wgbmV4dFJldHVybmVkRW5kT2ZEYXRhOwogICAgUVRleHREZWNvZGVyICplbmNNYXBwZXI7CgogICAgUVhtbElucHV0U291cmNlUHJpdmF0ZSAqZDsKfTsKCi8vCi8vIFNBWCBFeGNlcHRpb24gQ2xhc3NlcwovLwoKY2xhc3MgUU1fRVhQT1JUX1hNTCBRWG1sUGFyc2VFeGNlcHRpb24KewpwdWJsaWM6CiAgICBRWG1sUGFyc2VFeGNlcHRpb24oIGNvbnN0IFFTdHJpbmcmIG5hbWU9IiIsIGludCBjPS0xLCBpbnQgbD0tMSwgY29uc3QgUVN0cmluZyYgcD0iIiwgY29uc3QgUVN0cmluZyYgcz0iIiApCgk6IG1zZyggbmFtZSApLCBjb2x1bW4oIGMgKSwgbGluZSggbCApLCBwdWIoIHAgKSwgc3lzKCBzICkKICAgIHsgfQoKICAgIGludCBjb2x1bW5OdW1iZXIoKSBjb25zdDsKICAgIGludCBsaW5lTnVtYmVyKCkgY29uc3Q7CiAgICBRU3RyaW5nIHB1YmxpY0lkKCkgY29uc3Q7CiAgICBRU3RyaW5nIHN5c3RlbUlkKCkgY29uc3Q7CiAgICBRU3RyaW5nIG1lc3NhZ2UoKSBjb25zdDsKCnByaXZhdGU6CiAgICBRU3RyaW5nIG1zZzsKICAgIGludCBjb2x1bW47CiAgICBpbnQgbGluZTsKICAgIFFTdHJpbmcgcHViOwogICAgUVN0cmluZyBzeXM7CgogICAgUVhtbFBhcnNlRXhjZXB0aW9uUHJpdmF0ZSAqZDsKfTsKCgovLwovLyBYTUwgUmVhZGVyCi8vCgpjbGFzcyBRTV9FWFBPUlRfWE1MIFFYbWxSZWFkZXIKewpwdWJsaWM6CiAgICB2aXJ0dWFsIGJvb2wgZmVhdHVyZSggY29uc3QgUVN0cmluZyYgbmFtZSwgYm9vbCAqb2sgPSAwICkgY29uc3QgPSAwOwogICAgdmlydHVhbCB2b2lkIHNldEZlYXR1cmUoIGNvbnN0IFFTdHJpbmcmIG5hbWUsIGJvb2wgdmFsdWUgKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgaGFzRmVhdHVyZSggY29uc3QgUVN0cmluZyYgbmFtZSApIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgdm9pZCogcHJvcGVydHkoIGNvbnN0IFFTdHJpbmcmIG5hbWUsIGJvb2wgKm9rID0gMCApIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgdm9pZCBzZXRQcm9wZXJ0eSggY29uc3QgUVN0cmluZyYgbmFtZSwgdm9pZCogdmFsdWUgKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgaGFzUHJvcGVydHkoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoIFFYbWxFbnRpdHlSZXNvbHZlciogaGFuZGxlciApID0gMDsKICAgIHZpcnR1YWwgUVhtbEVudGl0eVJlc29sdmVyKiBlbnRpdHlSZXNvbHZlcigpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgdm9pZCBzZXREVERIYW5kbGVyKCBRWG1sRFRESGFuZGxlciogaGFuZGxlciApID0gMDsKICAgIHZpcnR1YWwgUVhtbERUREhhbmRsZXIqIERUREhhbmRsZXIoKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudEhhbmRsZXIoIFFYbWxDb250ZW50SGFuZGxlciogaGFuZGxlciApID0gMDsKICAgIHZpcnR1YWwgUVhtbENvbnRlbnRIYW5kbGVyKiBjb250ZW50SGFuZGxlcigpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgdm9pZCBzZXRFcnJvckhhbmRsZXIoIFFYbWxFcnJvckhhbmRsZXIqIGhhbmRsZXIgKSA9IDA7CiAgICB2aXJ0dWFsIFFYbWxFcnJvckhhbmRsZXIqIGVycm9ySGFuZGxlcigpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgdm9pZCBzZXRMZXhpY2FsSGFuZGxlciggUVhtbExleGljYWxIYW5kbGVyKiBoYW5kbGVyICkgPSAwOwogICAgdmlydHVhbCBRWG1sTGV4aWNhbEhhbmRsZXIqIGxleGljYWxIYW5kbGVyKCkgY29uc3QgPSAwOwogICAgdmlydHVhbCB2b2lkIHNldERlY2xIYW5kbGVyKCBRWG1sRGVjbEhhbmRsZXIqIGhhbmRsZXIgKSA9IDA7CiAgICB2aXJ0dWFsIFFYbWxEZWNsSGFuZGxlciogZGVjbEhhbmRsZXIoKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgcGFyc2UoIGNvbnN0IFFYbWxJbnB1dFNvdXJjZSYgaW5wdXQgKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgcGFyc2UoIGNvbnN0IFFYbWxJbnB1dFNvdXJjZSogaW5wdXQgKSA9IDA7Cn07CgpjbGFzcyBRTV9FWFBPUlRfWE1MIFFYbWxTaW1wbGVSZWFkZXIgOiBwdWJsaWMgUVhtbFJlYWRlcgp7CnB1YmxpYzoKICAgIFFYbWxTaW1wbGVSZWFkZXIoKTsKICAgIHZpcnR1YWwgflFYbWxTaW1wbGVSZWFkZXIoKTsKCiAgICBib29sIGZlYXR1cmUoIGNvbnN0IFFTdHJpbmcmIG5hbWUsIGJvb2wgKm9rID0gMCApIGNvbnN0OwogICAgdm9pZCBzZXRGZWF0dXJlKCBjb25zdCBRU3RyaW5nJiBuYW1lLCBib29sIHZhbHVlICk7CiAgICBib29sIGhhc0ZlYXR1cmUoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKSBjb25zdDsKCiAgICB2b2lkKiBwcm9wZXJ0eSggY29uc3QgUVN0cmluZyYgbmFtZSwgYm9vbCAqb2sgPSAwICkgY29uc3Q7CiAgICB2b2lkIHNldFByb3BlcnR5KCBjb25zdCBRU3RyaW5nJiBuYW1lLCB2b2lkKiB2YWx1ZSApOwogICAgYm9vbCBoYXNQcm9wZXJ0eSggY29uc3QgUVN0cmluZyYgbmFtZSApIGNvbnN0OwoKICAgIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoIFFYbWxFbnRpdHlSZXNvbHZlciogaGFuZGxlciApOwogICAgUVhtbEVudGl0eVJlc29sdmVyKiBlbnRpdHlSZXNvbHZlcigpIGNvbnN0OwogICAgdm9pZCBzZXREVERIYW5kbGVyKCBRWG1sRFRESGFuZGxlciogaGFuZGxlciApOwogICAgUVhtbERUREhhbmRsZXIqIERUREhhbmRsZXIoKSBjb25zdDsKICAgIHZvaWQgc2V0Q29udGVudEhhbmRsZXIoIFFYbWxDb250ZW50SGFuZGxlciogaGFuZGxlciApOwogICAgUVhtbENvbnRlbnRIYW5kbGVyKiBjb250ZW50SGFuZGxlcigpIGNvbnN0OwogICAgdm9pZCBzZXRFcnJvckhhbmRsZXIoIFFYbWxFcnJvckhhbmRsZXIqIGhhbmRsZXIgKTsKICAgIFFYbWxFcnJvckhhbmRsZXIqIGVycm9ySGFuZGxlcigpIGNvbnN0OwogICAgdm9pZCBzZXRMZXhpY2FsSGFuZGxlciggUVhtbExleGljYWxIYW5kbGVyKiBoYW5kbGVyICk7CiAgICBRWG1sTGV4aWNhbEhhbmRsZXIqIGxleGljYWxIYW5kbGVyKCkgY29uc3Q7CiAgICB2b2lkIHNldERlY2xIYW5kbGVyKCBRWG1sRGVjbEhhbmRsZXIqIGhhbmRsZXIgKTsKICAgIFFYbWxEZWNsSGFuZGxlciogZGVjbEhhbmRsZXIoKSBjb25zdDsKCiAgICBib29sIHBhcnNlKCBjb25zdCBRWG1sSW5wdXRTb3VyY2UmIGlucHV0ICk7CiAgICBib29sIHBhcnNlKCBjb25zdCBRWG1sSW5wdXRTb3VyY2UqIGlucHV0ICk7CiAgICB2aXJ0dWFsIGJvb2wgcGFyc2UoIGNvbnN0IFFYbWxJbnB1dFNvdXJjZSogaW5wdXQsIGJvb2wgaW5jcmVtZW50YWwgKTsKICAgIHZpcnR1YWwgYm9vbCBwYXJzZUNvbnRpbnVlKCk7Cgpwcml2YXRlOgogICAgLy8gdmFyaWFibGVzCiAgICBRWG1sQ29udGVudEhhbmRsZXIgKmNvbnRlbnRIbmQ7CiAgICBRWG1sRXJyb3JIYW5kbGVyICAgKmVycm9ySG5kOwogICAgUVhtbERUREhhbmRsZXIgICAgICpkdGRIbmQ7CiAgICBRWG1sRW50aXR5UmVzb2x2ZXIgKmVudGl0eVJlczsKICAgIFFYbWxMZXhpY2FsSGFuZGxlciAqbGV4aWNhbEhuZDsKICAgIFFYbWxEZWNsSGFuZGxlciAgICAqZGVjbEhuZDsKCiAgICBRWG1sSW5wdXRTb3VyY2UgKmlucHV0U291cmNlOwoKICAgIFFDaGFyIGM7IC8vIHRoZSBjaGFyYWN0ZXIgYXQgcmVhZGluZyBwb3NpdGlvbgogICAgaW50ICAgbGluZU5yOyAvLyBudW1iZXIgb2YgbGluZQogICAgaW50ICAgY29sdW1uTnI7IC8vIHBvc2l0aW9uIGluIGxpbmUKCiAgICBpbnQgICAgIG5hbWVBcnJheVBvczsKICAgIFFDaGFyICAgbmFtZUFycmF5WzI1Nl07IC8vIG9ubHkgdXNlZCBmb3IgbmFtZXMKICAgIFFTdHJpbmcgbmFtZVZhbHVlOyAvLyBvbmx5IHVzZWQgZm9yIG5hbWVzCiAgICBpbnQgICAgIHJlZkFycmF5UG9zOwogICAgUUNoYXIgICByZWZBcnJheVsyNTZdOyAvLyBvbmx5IHVzZWQgZm9yIHJlZmVyZW5jZXMKICAgIFFTdHJpbmcgcmVmVmFsdWU7IC8vIG9ubHkgdXNlZCBmb3IgcmVmZXJlbmNlcwogICAgaW50ICAgICBzdHJpbmdBcnJheVBvczsKICAgIFFDaGFyICAgc3RyaW5nQXJyYXlbMjU2XTsgLy8gdXNlZCBmb3IgYW55IG90aGVyIHN0cmluZ3MgdGhhdCBhcmUgcGFyc2VkCiAgICBRU3RyaW5nIHN0cmluZ1ZhbHVlOyAvLyB1c2VkIGZvciBhbnkgb3RoZXIgc3RyaW5ncyB0aGF0IGFyZSBwYXJzZWQKCiAgICBRWG1sU2ltcGxlUmVhZGVyUHJpdmF0ZSogZDsKCiAgICBjb25zdCBRU3RyaW5nICZzdHJpbmcoKTsKICAgIHZvaWQgc3RyaW5nQ2xlYXIoKTsKICAgIGlubGluZSB2b2lkIHN0cmluZ0FkZEMoKSB7IHN0cmluZ0FkZEMoYyk7IH0KICAgIHZvaWQgc3RyaW5nQWRkQyhjb25zdCBRQ2hhciYpOwogICAgY29uc3QgUVN0cmluZyYgbmFtZSgpOwogICAgdm9pZCBuYW1lQ2xlYXIoKTsKICAgIGlubGluZSB2b2lkIG5hbWVBZGRDKCkgeyBuYW1lQWRkQyhjKTsgfQogICAgdm9pZCBuYW1lQWRkQyhjb25zdCBRQ2hhciYpOwogICAgY29uc3QgUVN0cmluZyYgcmVmKCk7CiAgICB2b2lkIHJlZkNsZWFyKCk7CiAgICBpbmxpbmUgdm9pZCByZWZBZGRDKCkgeyByZWZBZGRDKGMpOyB9CiAgICB2b2lkIHJlZkFkZEMoY29uc3QgUUNoYXImKTsKCiAgICAvLyB1c2VkIGJ5IHBhcnNlUmVmZXJlbmNlKCkgYW5kIHBhcnNlUEVSZWZlcmVuY2UoKQogICAgZW51bSBFbnRpdHlSZWNvZ25pdGlvbkNvbnRleHQgeyBJbkNvbnRlbnQsIEluQXR0cmlidXRlVmFsdWUsIEluRW50aXR5VmFsdWUsIEluRFREIH07CgogICAgLy8gcHJpdmF0ZSBmdW5jdGlvbnMKICAgIGJvb2wgZWF0X3dzKCk7CiAgICBib29sIG5leHRfZWF0X3dzKCk7CgogICAgdm9pZCBuZXh0KCk7CiAgICBib29sIGF0RW5kKCk7CgogICAgdm9pZCBpbml0KCBjb25zdCBRWG1sSW5wdXRTb3VyY2UqIGkgKTsKICAgIHZvaWQgaW5pdERhdGEoKTsKCiAgICBib29sIGVudGl0eUV4aXN0KCBjb25zdCBRU3RyaW5nJiApIGNvbnN0OwoKICAgIGJvb2wgcGFyc2VCZWdpbk9yQ29udGludWUoIGludCBzdGF0ZSwgYm9vbCBpbmNyZW1lbnRhbCApOwoKICAgIGJvb2wgcGFyc2VQcm9sb2coKTsKICAgIGJvb2wgcGFyc2VFbGVtZW50KCk7CiAgICBib29sIHByb2Nlc3NFbGVtZW50RW1wdHlUYWcoKTsKICAgIGJvb2wgcHJvY2Vzc0VsZW1lbnRFVGFnQmVnaW4yKCk7CiAgICBib29sIHByb2Nlc3NFbGVtZW50QXR0cmlidXRlKCk7CiAgICBib29sIHBhcnNlTWlzYygpOwogICAgYm9vbCBwYXJzZUNvbnRlbnQoKTsKCiAgICBib29sIHBhcnNlUEkoKTsKICAgIGJvb2wgcGFyc2VEb2N0eXBlKCk7CiAgICBib29sIHBhcnNlQ29tbWVudCgpOwoKICAgIGJvb2wgcGFyc2VOYW1lKCk7CiAgICBib29sIHBhcnNlTm10b2tlbigpOwogICAgYm9vbCBwYXJzZUF0dHJpYnV0ZSgpOwogICAgYm9vbCBwYXJzZVJlZmVyZW5jZSgpOwogICAgYm9vbCBwcm9jZXNzUmVmZXJlbmNlKCk7CgogICAgYm9vbCBwYXJzZUV4dGVybmFsSUQoKTsKICAgIGJvb2wgcGFyc2VQRVJlZmVyZW5jZSgpOwogICAgYm9vbCBwYXJzZU1hcmt1cGRlY2woKTsKICAgIGJvb2wgcGFyc2VBdHRsaXN0RGVjbCgpOwogICAgYm9vbCBwYXJzZUF0dFR5cGUoKTsKICAgIGJvb2wgcGFyc2VBdHRWYWx1ZSgpOwogICAgYm9vbCBwYXJzZUVsZW1lbnREZWNsKCk7CiAgICBib29sIHBhcnNlTm90YXRpb25EZWNsKCk7CiAgICBib29sIHBhcnNlQ2hvaWNlU2VxKCk7CiAgICBib29sIHBhcnNlRW50aXR5RGVjbCgpOwogICAgYm9vbCBwYXJzZUVudGl0eVZhbHVlKCk7CgogICAgYm9vbCBwYXJzZVN0cmluZygpOwoKICAgIGJvb2wgaW5zZXJ0WG1sUmVmKCBjb25zdCBRU3RyaW5nJiwgY29uc3QgUVN0cmluZyYsIGJvb2wgKTsKCiAgICBib29sIHJlcG9ydEVuZEVudGl0aWVzKCk7CiAgICB2b2lkIHJlcG9ydFBhcnNlRXJyb3IoIGNvbnN0IFFTdHJpbmcmIGVycm9yICk7CgogICAgdHlwZWRlZiBib29sIChRWG1sU2ltcGxlUmVhZGVyOjoqUGFyc2VGdW5jdGlvbikgKCk7CiAgICB2b2lkIHVuZXhwZWN0ZWRFb2YoIFBhcnNlRnVuY3Rpb24gd2hlcmUsIGludCBzdGF0ZSApOwogICAgdm9pZCBwYXJzZUZhaWxlZCggUGFyc2VGdW5jdGlvbiB3aGVyZSwgaW50IHN0YXRlICk7CiAgICB2b2lkIHB1c2hQYXJzZVN0YXRlKCBQYXJzZUZ1bmN0aW9uIGZ1bmN0aW9uLCBpbnQgc3RhdGUgKTsKCiAgICB2b2lkIHNldFVuZGVmRW50aXR5SW5BdHRySGFjayhib29sIGIpOwoKICAgIGZyaWVuZCBjbGFzcyBRWG1sU2ltcGxlUmVhZGVyUHJpdmF0ZTsKICAgIGZyaWVuZCBjbGFzcyBRWG1sU2ltcGxlUmVhZGVyTG9jYXRvcjsKICAgIGZyaWVuZCBjbGFzcyBRRG9tRG9jdW1lbnRQcml2YXRlOwp9OwoKLy8KLy8gU0FYIExvY2F0b3IKLy8KCmNsYXNzIFFNX0VYUE9SVF9YTUwgUVhtbExvY2F0b3IKewpwdWJsaWM6CiAgICBRWG1sTG9jYXRvcigpOwogICAgdmlydHVhbCB+UVhtbExvY2F0b3IoKTsKCiAgICB2aXJ0dWFsIGludCBjb2x1bW5OdW1iZXIoKSA9IDA7CiAgICB2aXJ0dWFsIGludCBsaW5lTnVtYmVyKCkgPSAwOwovLyAgICBRU3RyaW5nIGdldFB1YmxpY0lkKCkKLy8gICAgUVN0cmluZyBnZXRTeXN0ZW1JZCgpCn07CgovLwovLyBTQVggaGFuZGxlciBjbGFzc2VzCi8vCgpjbGFzcyBRTV9FWFBPUlRfWE1MIFFYbWxDb250ZW50SGFuZGxlcgp7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoIFFYbWxMb2NhdG9yKiBsb2NhdG9yICkgPSAwOwogICAgdmlydHVhbCBib29sIHN0YXJ0RG9jdW1lbnQoKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgZW5kRG9jdW1lbnQoKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgc3RhcnRQcmVmaXhNYXBwaW5nKCBjb25zdCBRU3RyaW5nJiBwcmVmaXgsIGNvbnN0IFFTdHJpbmcmIHVyaSApID0gMDsKICAgIHZpcnR1YWwgYm9vbCBlbmRQcmVmaXhNYXBwaW5nKCBjb25zdCBRU3RyaW5nJiBwcmVmaXggKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgc3RhcnRFbGVtZW50KCBjb25zdCBRU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFFTdHJpbmcmIGxvY2FsTmFtZSwgY29uc3QgUVN0cmluZyYgcU5hbWUsIGNvbnN0IFFYbWxBdHRyaWJ1dGVzJiBhdHRzICkgPSAwOwogICAgdmlydHVhbCBib29sIGVuZEVsZW1lbnQoIGNvbnN0IFFTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgUVN0cmluZyYgbG9jYWxOYW1lLCBjb25zdCBRU3RyaW5nJiBxTmFtZSApID0gMDsKICAgIHZpcnR1YWwgYm9vbCBjaGFyYWN0ZXJzKCBjb25zdCBRU3RyaW5nJiBjaCApID0gMDsKICAgIHZpcnR1YWwgYm9vbCBpZ25vcmFibGVXaGl0ZXNwYWNlKCBjb25zdCBRU3RyaW5nJiBjaCApID0gMDsKICAgIHZpcnR1YWwgYm9vbCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oIGNvbnN0IFFTdHJpbmcmIHRhcmdldCwgY29uc3QgUVN0cmluZyYgZGF0YSApID0gMDsKICAgIHZpcnR1YWwgYm9vbCBza2lwcGVkRW50aXR5KCBjb25zdCBRU3RyaW5nJiBuYW1lICkgPSAwOwogICAgdmlydHVhbCBRU3RyaW5nIGVycm9yU3RyaW5nKCkgPSAwOwp9OwoKY2xhc3MgUU1fRVhQT1JUX1hNTCBRWG1sRXJyb3JIYW5kbGVyCnsKcHVibGljOgogICAgdmlydHVhbCBib29sIHdhcm5pbmcoIGNvbnN0IFFYbWxQYXJzZUV4Y2VwdGlvbiYgZXhjZXB0aW9uICkgPSAwOwogICAgdmlydHVhbCBib29sIGVycm9yKCBjb25zdCBRWG1sUGFyc2VFeGNlcHRpb24mIGV4Y2VwdGlvbiApID0gMDsKICAgIHZpcnR1YWwgYm9vbCBmYXRhbEVycm9yKCBjb25zdCBRWG1sUGFyc2VFeGNlcHRpb24mIGV4Y2VwdGlvbiApID0gMDsKICAgIHZpcnR1YWwgUVN0cmluZyBlcnJvclN0cmluZygpID0gMDsKfTsKCmNsYXNzIFFNX0VYUE9SVF9YTUwgUVhtbERUREhhbmRsZXIKewpwdWJsaWM6CiAgICB2aXJ0dWFsIGJvb2wgbm90YXRpb25EZWNsKCBjb25zdCBRU3RyaW5nJiBuYW1lLCBjb25zdCBRU3RyaW5nJiBwdWJsaWNJZCwgY29uc3QgUVN0cmluZyYgc3lzdGVtSWQgKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgdW5wYXJzZWRFbnRpdHlEZWNsKCBjb25zdCBRU3RyaW5nJiBuYW1lLCBjb25zdCBRU3RyaW5nJiBwdWJsaWNJZCwgY29uc3QgUVN0cmluZyYgc3lzdGVtSWQsIGNvbnN0IFFTdHJpbmcmIG5vdGF0aW9uTmFtZSApID0gMDsKICAgIHZpcnR1YWwgUVN0cmluZyBlcnJvclN0cmluZygpID0gMDsKfTsKCmNsYXNzIFFNX0VYUE9SVF9YTUwgUVhtbEVudGl0eVJlc29sdmVyCnsKcHVibGljOgogICAgdmlydHVhbCBib29sIHJlc29sdmVFbnRpdHkoIGNvbnN0IFFTdHJpbmcmIHB1YmxpY0lkLCBjb25zdCBRU3RyaW5nJiBzeXN0ZW1JZCwgUVhtbElucHV0U291cmNlKiYgcmV0ICkgPSAwOwogICAgdmlydHVhbCBRU3RyaW5nIGVycm9yU3RyaW5nKCkgPSAwOwp9OwoKY2xhc3MgUU1fRVhQT1JUX1hNTCBRWG1sTGV4aWNhbEhhbmRsZXIKewpwdWJsaWM6CiAgICB2aXJ0dWFsIGJvb2wgc3RhcnREVEQoIGNvbnN0IFFTdHJpbmcmIG5hbWUsIGNvbnN0IFFTdHJpbmcmIHB1YmxpY0lkLCBjb25zdCBRU3RyaW5nJiBzeXN0ZW1JZCApID0gMDsKICAgIHZpcnR1YWwgYm9vbCBlbmREVEQoKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgc3RhcnRFbnRpdHkoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgZW5kRW50aXR5KCBjb25zdCBRU3RyaW5nJiBuYW1lICkgPSAwOwogICAgdmlydHVhbCBib29sIHN0YXJ0Q0RBVEEoKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgZW5kQ0RBVEEoKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgY29tbWVudCggY29uc3QgUVN0cmluZyYgY2ggKSA9IDA7CiAgICB2aXJ0dWFsIFFTdHJpbmcgZXJyb3JTdHJpbmcoKSA9IDA7Cn07CgpjbGFzcyBRTV9FWFBPUlRfWE1MIFFYbWxEZWNsSGFuZGxlcgp7CnB1YmxpYzoKICAgIHZpcnR1YWwgYm9vbCBhdHRyaWJ1dGVEZWNsKCBjb25zdCBRU3RyaW5nJiBlTmFtZSwgY29uc3QgUVN0cmluZyYgYU5hbWUsIGNvbnN0IFFTdHJpbmcmIHR5cGUsIGNvbnN0IFFTdHJpbmcmIHZhbHVlRGVmYXVsdCwgY29uc3QgUVN0cmluZyYgdmFsdWUgKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgaW50ZXJuYWxFbnRpdHlEZWNsKCBjb25zdCBRU3RyaW5nJiBuYW1lLCBjb25zdCBRU3RyaW5nJiB2YWx1ZSApID0gMDsKICAgIHZpcnR1YWwgYm9vbCBleHRlcm5hbEVudGl0eURlY2woIGNvbnN0IFFTdHJpbmcmIG5hbWUsIGNvbnN0IFFTdHJpbmcmIHB1YmxpY0lkLCBjb25zdCBRU3RyaW5nJiBzeXN0ZW1JZCApID0gMDsKICAgIHZpcnR1YWwgUVN0cmluZyBlcnJvclN0cmluZygpID0gMDsKfTsKCgpjbGFzcyBRTV9FWFBPUlRfWE1MIFFYbWxEZWZhdWx0SGFuZGxlciA6IHB1YmxpYyBRWG1sQ29udGVudEhhbmRsZXIsIHB1YmxpYyBRWG1sRXJyb3JIYW5kbGVyLCBwdWJsaWMgUVhtbERUREhhbmRsZXIsIHB1YmxpYyBRWG1sRW50aXR5UmVzb2x2ZXIsIHB1YmxpYyBRWG1sTGV4aWNhbEhhbmRsZXIsIHB1YmxpYyBRWG1sRGVjbEhhbmRsZXIKewpwdWJsaWM6CiAgICBRWG1sRGVmYXVsdEhhbmRsZXIoKSB7IH0KICAgIHZpcnR1YWwgflFYbWxEZWZhdWx0SGFuZGxlcigpIHsgfQoKICAgIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKCBRWG1sTG9jYXRvciogbG9jYXRvciApOwogICAgYm9vbCBzdGFydERvY3VtZW50KCk7CiAgICBib29sIGVuZERvY3VtZW50KCk7CiAgICBib29sIHN0YXJ0UHJlZml4TWFwcGluZyggY29uc3QgUVN0cmluZyYgcHJlZml4LCBjb25zdCBRU3RyaW5nJiB1cmkgKTsKICAgIGJvb2wgZW5kUHJlZml4TWFwcGluZyggY29uc3QgUVN0cmluZyYgcHJlZml4ICk7CiAgICBib29sIHN0YXJ0RWxlbWVudCggY29uc3QgUVN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBRU3RyaW5nJiBsb2NhbE5hbWUsIGNvbnN0IFFTdHJpbmcmIHFOYW1lLCBjb25zdCBRWG1sQXR0cmlidXRlcyYgYXR0cyApOwogICAgYm9vbCBlbmRFbGVtZW50KCBjb25zdCBRU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFFTdHJpbmcmIGxvY2FsTmFtZSwgY29uc3QgUVN0cmluZyYgcU5hbWUgKTsKICAgIGJvb2wgY2hhcmFjdGVycyggY29uc3QgUVN0cmluZyYgY2ggKTsKICAgIGJvb2wgaWdub3JhYmxlV2hpdGVzcGFjZSggY29uc3QgUVN0cmluZyYgY2ggKTsKICAgIGJvb2wgcHJvY2Vzc2luZ0luc3RydWN0aW9uKCBjb25zdCBRU3RyaW5nJiB0YXJnZXQsIGNvbnN0IFFTdHJpbmcmIGRhdGEgKTsKICAgIGJvb2wgc2tpcHBlZEVudGl0eSggY29uc3QgUVN0cmluZyYgbmFtZSApOwoKICAgIGJvb2wgd2FybmluZyggY29uc3QgUVhtbFBhcnNlRXhjZXB0aW9uJiBleGNlcHRpb24gKTsKICAgIGJvb2wgZXJyb3IoIGNvbnN0IFFYbWxQYXJzZUV4Y2VwdGlvbiYgZXhjZXB0aW9uICk7CiAgICBib29sIGZhdGFsRXJyb3IoIGNvbnN0IFFYbWxQYXJzZUV4Y2VwdGlvbiYgZXhjZXB0aW9uICk7CgogICAgYm9vbCBub3RhdGlvbkRlY2woIGNvbnN0IFFTdHJpbmcmIG5hbWUsIGNvbnN0IFFTdHJpbmcmIHB1YmxpY0lkLCBjb25zdCBRU3RyaW5nJiBzeXN0ZW1JZCApOwogICAgYm9vbCB1bnBhcnNlZEVudGl0eURlY2woIGNvbnN0IFFTdHJpbmcmIG5hbWUsIGNvbnN0IFFTdHJpbmcmIHB1YmxpY0lkLCBjb25zdCBRU3RyaW5nJiBzeXN0ZW1JZCwgY29uc3QgUVN0cmluZyYgbm90YXRpb25OYW1lICk7CgogICAgYm9vbCByZXNvbHZlRW50aXR5KCBjb25zdCBRU3RyaW5nJiBwdWJsaWNJZCwgY29uc3QgUVN0cmluZyYgc3lzdGVtSWQsIFFYbWxJbnB1dFNvdXJjZSomIHJldCApOwoKICAgIGJvb2wgc3RhcnREVEQoIGNvbnN0IFFTdHJpbmcmIG5hbWUsIGNvbnN0IFFTdHJpbmcmIHB1YmxpY0lkLCBjb25zdCBRU3RyaW5nJiBzeXN0ZW1JZCApOwogICAgYm9vbCBlbmREVEQoKTsKICAgIGJvb2wgc3RhcnRFbnRpdHkoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKTsKICAgIGJvb2wgZW5kRW50aXR5KCBjb25zdCBRU3RyaW5nJiBuYW1lICk7CiAgICBib29sIHN0YXJ0Q0RBVEEoKTsKICAgIGJvb2wgZW5kQ0RBVEEoKTsKICAgIGJvb2wgY29tbWVudCggY29uc3QgUVN0cmluZyYgY2ggKTsKCiAgICBib29sIGF0dHJpYnV0ZURlY2woIGNvbnN0IFFTdHJpbmcmIGVOYW1lLCBjb25zdCBRU3RyaW5nJiBhTmFtZSwgY29uc3QgUVN0cmluZyYgdHlwZSwgY29uc3QgUVN0cmluZyYgdmFsdWVEZWZhdWx0LCBjb25zdCBRU3RyaW5nJiB2YWx1ZSApOwogICAgYm9vbCBpbnRlcm5hbEVudGl0eURlY2woIGNvbnN0IFFTdHJpbmcmIG5hbWUsIGNvbnN0IFFTdHJpbmcmIHZhbHVlICk7CiAgICBib29sIGV4dGVybmFsRW50aXR5RGVjbCggY29uc3QgUVN0cmluZyYgbmFtZSwgY29uc3QgUVN0cmluZyYgcHVibGljSWQsIGNvbnN0IFFTdHJpbmcmIHN5c3RlbUlkICk7CgogICAgUVN0cmluZyBlcnJvclN0cmluZygpOwoKcHJpdmF0ZToKICAgIFFYbWxEZWZhdWx0SGFuZGxlclByaXZhdGUgKmQ7Cn07CgoKLy8KLy8gaW5saW5lcwovLwoKaW5saW5lIGJvb2wgUVhtbFNpbXBsZVJlYWRlcjo6YXRFbmQoKQp7IHJldHVybiAoYy51bmljb2RlKCl8MHgwMDAxKSA9PSAweGZmZmY7IH0KaW5saW5lIGludCBRWG1sQXR0cmlidXRlczo6Y291bnQoKSBjb25zdAp7IHJldHVybiBsZW5ndGgoKTsgfQoKCiNlbmRpZiAvL1FUX05PX1hNTAoKI2VuZGlmCgAAAA4AcQB2AGIAbwB4AC4AaAAAB6MvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVZCT1hfSAojZGVmaW5lIFFWQk9YX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicWhib3guaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fVkJPWAoKY2xhc3MgUV9FWFBPUlQgUVZCb3ggOiBwdWJsaWMgUUhCb3gKewogICAgUV9PQkpFQ1QKcHVibGljOgogICAgUVZCb3goIFFXaWRnZXQqIHBhcmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAsIFdGbGFncyBmPTAgKTsKCnByaXZhdGU6CS8vIERpc2FibGVkIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPQojaWYgZGVmaW5lZChRX0RJU0FCTEVfQ09QWSkKICAgIFFWQm94KCBjb25zdCBRVkJveCAmICk7CiAgICBRVkJveCYgb3BlcmF0b3I9KCBjb25zdCBRVkJveCAmICk7CiNlbmRpZgp9OwoKI2VuZGlmIC8vIFFUX05PX1ZCT1gKCiNlbmRpZiAvLyBRVkJPWF9ICgAAABYAcQB1AHQAZgBjAG8AZABlAGMALgBoAAAJTC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRVVRGQ09ERUNfSAojZGVmaW5lIFFVVEZDT0RFQ19ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInF0ZXh0Y29kZWMuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fVEVYVENPREVDCgpjbGFzcyBRX0VYUE9SVCBRVXRmOENvZGVjIDogcHVibGljIFFUZXh0Q29kZWMgewpwdWJsaWM6CiAgICB2aXJ0dWFsIGludCBtaWJFbnVtKCkgY29uc3Q7CiAgICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7CgogICAgUVRleHREZWNvZGVyKiBtYWtlRGVjb2RlcigpIGNvbnN0OwoKI2lmICFkZWZpbmVkKFFfTk9fVVNJTkdfS0VZV09SRCkKICAgIHVzaW5nIFFUZXh0Q29kZWM6OmZyb21Vbmljb2RlOwojZW5kaWYKICAgIFFDU3RyaW5nIGZyb21Vbmljb2RlKGNvbnN0IFFTdHJpbmcmIHVjLCBpbnQmIGxlbkluT3V0KSBjb25zdDsKICAgIFFTdHJpbmcgdG9Vbmljb2RlKGNvbnN0IGNoYXIqIGNoYXJzLCBpbnQgbGVuKSBjb25zdDsKCiAgICBpbnQgaGV1cmlzdGljQ29udGVudE1hdGNoKGNvbnN0IGNoYXIqIGNoYXJzLCBpbnQgbGVuKSBjb25zdDsKfTsKCmNsYXNzIFFfRVhQT1JUIFFVdGYxNkNvZGVjIDogcHVibGljIFFUZXh0Q29kZWMgewpwdWJsaWM6CiAgICB2aXJ0dWFsIGludCBtaWJFbnVtKCkgY29uc3Q7CiAgICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7CgogICAgUVRleHREZWNvZGVyKiBtYWtlRGVjb2RlcigpIGNvbnN0OwogICAgUVRleHRFbmNvZGVyKiBtYWtlRW5jb2RlcigpIGNvbnN0OwoKICAgIGludCBoZXVyaXN0aWNDb250ZW50TWF0Y2goY29uc3QgY2hhciogY2hhcnMsIGludCBsZW4pIGNvbnN0Owp9OwoKI2VuZGlmIC8vUVRfTk9fVEVYVENPREVDCiNlbmRpZiAvLyBRVVRGQ09ERUNfSAoAAAAWAHEAcwBxAGwAZQByAHIAbwByAC4AaAAACmkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFTUUxFUlJPUl9ICiNkZWZpbmUgUVNRTEVSUk9SX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXN0cmluZy5oIgojZW5kaWYgLy8gUVRfSAoKI2lmICFkZWZpbmVkKCBRVF9NT0RVTEVfU1FMICkgfHwgZGVmaW5lZCggUVRfTElDRU5TRV9QUk9GRVNTSU9OQUwgKQojZGVmaW5lIFFNX0VYUE9SVF9TUUwKI2Vsc2UKI2RlZmluZSBRTV9FWFBPUlRfU1FMIFFfRVhQT1JUCiNlbmRpZgoKI2lmbmRlZiBRVF9OT19TUUwKCmNsYXNzIFFNX0VYUE9SVF9TUUwgUVNxbEVycm9yCnsKcHVibGljOgogICAgZW51bSBUeXBlIHsKCU5vbmUsCglDb25uZWN0aW9uLAoJU3RhdGVtZW50LAoJVHJhbnNhY3Rpb24sCglVbmtub3duCiAgICB9OwogICAgUVNxbEVycm9yKCAgY29uc3QgUVN0cmluZyYgZHJpdmVyVGV4dCA9IFFTdHJpbmc6Om51bGwsCgkJY29uc3QgUVN0cmluZyYgZGF0YWJhc2VUZXh0ID0gUVN0cmluZzo6bnVsbCwKCQlpbnQgdHlwZSA9IFFTcWxFcnJvcjo6Tm9uZSwKCQlpbnQgbnVtYmVyID0gLTEgKTsKICAgIFFTcWxFcnJvciggY29uc3QgUVNxbEVycm9yJiBvdGhlciApOwogICAgUVNxbEVycm9yJiBvcGVyYXRvcj0oIGNvbnN0IFFTcWxFcnJvciYgb3RoZXIgKTsKICAgIHZpcnR1YWwgflFTcWxFcnJvcigpOwoKICAgIFFTdHJpbmcJZHJpdmVyVGV4dCgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldERyaXZlclRleHQoIGNvbnN0IFFTdHJpbmcmIGRyaXZlclRleHQgKTsKICAgIFFTdHJpbmcJZGF0YWJhc2VUZXh0KCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0RGF0YWJhc2VUZXh0KCBjb25zdCBRU3RyaW5nJiBkYXRhYmFzZVRleHQgKTsKICAgIGludAkJdHlwZSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFR5cGUoIGludCB0eXBlICk7CiAgICBpbnQJCW51bWJlcigpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldE51bWJlciggaW50IG51bWJlciApOwogICAgUVN0cmluZyAJdGV4dCgpIGNvbnN0OwogICAgdm9pZCAJc2hvd01lc3NhZ2UoIGNvbnN0IFFTdHJpbmcmIG1zZyA9IFFTdHJpbmc6Om51bGwgKSBjb25zdDsKICAgIApwcml2YXRlOgogICAgUVN0cmluZwlkcml2ZXJFcnJvcjsKICAgIFFTdHJpbmcJZGF0YWJhc2VFcnJvcjsKICAgIGludAkJZXJyb3JUeXBlOwogICAgaW50CWVycm9yTnVtYmVyOwp9OwoKI2VuZGlmIC8vIFFUX05PX1NRTAojZW5kaWYKAAAAGABxAHMAcQBsAHIAZQBzAHUAbAB0AC4AaAAADVovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRU1FMUkVTVUxUX0gKI2RlZmluZSBRU1FMUkVTVUxUX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXN0cmluZy5oIgojaW5jbHVkZSAicXZhcmlhbnQuaCIKI2luY2x1ZGUgInFzcWxlcnJvci5oIgojaW5jbHVkZSAicXNxbGZpZWxkLmgiCiNpbmNsdWRlICJxc3FsLmgiCiNlbmRpZiAvLyBRVF9ICgojaWYgIWRlZmluZWQoIFFUX01PRFVMRV9TUUwgKSB8fCBkZWZpbmVkKCBRVF9MSUNFTlNFX1BST0ZFU1NJT05BTCApCiNkZWZpbmUgUU1fRVhQT1JUX1NRTAojZWxzZQojZGVmaW5lIFFNX0VYUE9SVF9TUUwgUV9FWFBPUlQKI2VuZGlmCgojaWZuZGVmIFFUX05PX1NRTAoKY2xhc3MgUVNxbERyaXZlcjsKY2xhc3MgUVNxbDsKY2xhc3MgUVNxbFJlc3VsdFByaXZhdGU7CmNsYXNzIFFTcWxFeHRlbnNpb247CgpjbGFzcyBRTV9FWFBPUlRfU1FMIFFTcWxSZXN1bHQKewpmcmllbmQgY2xhc3MgUVNxbFF1ZXJ5OwpmcmllbmQgY2xhc3MgUVNxbFJlc3VsdFNoYXJlZDsKcHVibGljOgogICAgdmlydHVhbCB+UVNxbFJlc3VsdCgpOwogICAgCiAgICAvLyBCQ0kgSEFDSyAtIHJlbW92ZSBpbiA0LjAKICAgIHZvaWQgCSAgICBzZXRFeHRlbnNpb24oIFFTcWxFeHRlbnNpb24gKiBleHQgKTsKICAgIFFTcWxFeHRlbnNpb24gKiBleHRlbnNpb24oKTsKCnByb3RlY3RlZDoKICAgIFFTcWxSZXN1bHQoY29uc3QgUVNxbERyaXZlciAqIGRiICk7CiAgICBpbnQJCSAgICBhdCgpIGNvbnN0OwogICAgUVN0cmluZyAgICAgICAgIGxhc3RRdWVyeSgpIGNvbnN0OwogICAgUVNxbEVycm9yICAgICAgIGxhc3RFcnJvcigpIGNvbnN0OwogICAgYm9vbCAgICAgICAgICAgIGlzVmFsaWQoKSBjb25zdDsKICAgIGJvb2wgICAgICAgICAgICBpc0FjdGl2ZSgpIGNvbnN0OwogICAgYm9vbCAgICAgICAgICAgIGlzU2VsZWN0KCkgY29uc3Q7CiAgICBib29sICAgICAgICAgICAgaXNGb3J3YXJkT25seSgpIGNvbnN0OwogICAgY29uc3QgUVNxbERyaXZlciogZHJpdmVyKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgICAgc2V0QXQoIGludCBhdCApOwogICAgdmlydHVhbCB2b2lkICAgIHNldEFjdGl2ZSggYm9vbCBhICk7CiAgICB2aXJ0dWFsIHZvaWQgICAgc2V0TGFzdEVycm9yKCBjb25zdCBRU3FsRXJyb3ImIGUgKTsKICAgIHZpcnR1YWwgdm9pZCAgICBzZXRRdWVyeSggY29uc3QgUVN0cmluZyYgcXVlcnkgKTsKICAgIHZpcnR1YWwgdm9pZCAgICBzZXRTZWxlY3QoIGJvb2wgcyApOwogICAgdmlydHVhbCB2b2lkICAgIHNldEZvcndhcmRPbmx5KCBib29sIGZvcndhcmQgKTsKCiAgICB2aXJ0dWFsIFFWYXJpYW50IGRhdGEoIGludCBpICkgPSAwOwogICAgdmlydHVhbCBib29sICAgIGlzTnVsbCggaW50IGkgKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgICAgcmVzZXQgKCBjb25zdCBRU3RyaW5nJiBzcWxxdWVyeSApID0gMDsKICAgIHZpcnR1YWwgYm9vbCAgICBmZXRjaCggaW50IGkgKSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgICAgZmV0Y2hOZXh0KCk7CiAgICB2aXJ0dWFsIGJvb2wgICAgZmV0Y2hQcmV2KCk7CiAgICB2aXJ0dWFsIGJvb2wgICAgZmV0Y2hGaXJzdCgpID0gMDsKICAgIHZpcnR1YWwgYm9vbCAgICBmZXRjaExhc3QoKSA9IDA7CiAgICB2aXJ0dWFsIGludCAgICAgc2l6ZSgpID0gMDsKICAgIHZpcnR1YWwgaW50ICAgICBudW1Sb3dzQWZmZWN0ZWQoKSA9IDA7CnByaXZhdGU6CiAgICBRU3FsUmVzdWx0UHJpdmF0ZSogZDsKICAgIGJvb2wgZm9yd2FyZE9ubHk7Cgpwcml2YXRlOgkvLyBEaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRU3FsUmVzdWx0KCBjb25zdCBRU3FsUmVzdWx0ICYgKTsKICAgIFFTcWxSZXN1bHQgJm9wZXJhdG9yPSggY29uc3QgUVNxbFJlc3VsdCAmICk7CiNlbmRpZgp9OwoKI2VuZGlmCS8vIFFUX05PX1NRTAojZW5kaWYKAAAAIABxAHcAcwBtAGEAbgBhAGcAZQByAF8AcQB3AHMALgBoAAANii8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRV1NNQU5BR0VSX1FXU19ICiNkZWZpbmUgUVdTTUFOQUdFUl9RV1NfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxcGl4bWFwLmgiCiNpbmNsdWRlICJxb2JqZWN0LmgiCiNpbmNsdWRlICJxd3NkZWNvcmF0aW9uX3F3cy5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19RV1NfTUFOQUdFUgoKY2xhc3MgUVBpeG1hcDsKY2xhc3MgUVdpZGdldDsKY2xhc3MgUVBvcHVwTWVudTsKY2xhc3MgUVJlZ2lvbjsKY2xhc3MgUU1vdXNlRXZlbnQ7CmNsYXNzIFFXU0J1dHRvbjsKY2xhc3MgUVdTTWFuYWdlcjsKCmNsYXNzIFFXU01hbmFnZXIgOiBwdWJsaWMgUU9iamVjdAp7CiAgICBRX09CSkVDVAoKcHVibGljOgogICAgUVdTTWFuYWdlcihRV2lkZ2V0ICopOwogICAgflFXU01hbmFnZXIoKTsKCiAgICBzdGF0aWMgUVdTRGVjb3JhdGlvbiAqbmV3RGVmYXVsdERlY29yYXRpb24oKTsKCiAgICBRUmVnaW9uIHJlZ2lvbigpOwogICAgUVdpZGdldCAqd2lkZ2V0KCkgeyByZXR1cm4gbWFuYWdlZDsgfQogICAgdm9pZCBtYXhpbWl6ZSgpOwoKICAgIHN0YXRpYyBRV2lkZ2V0ICpncmFiYmVkTW91c2UoKSB7IHJldHVybiBhY3RpdmU7IH0KCnByb3RlY3RlZCBzbG90czoKICAgIHZvaWQgbWVudUFjdGl2YXRlZChpbnQpOwogICAgdm9pZCBzdHlsZU1lbnVBY3RpdmF0ZWQoaW50KTsKCnByb3RlY3RlZDoKICAgIHZvaWQgaGFuZGxlTW92ZSgpOwogICAgdmlydHVhbCBRV1NEZWNvcmF0aW9uOjpSZWdpb24gcG9pbnRJblJlZ2lvbihjb25zdCBRUG9pbnQgJik7CgogICAgdmlydHVhbCBib29sIGV2ZW50KFFFdmVudCAqZSk7CiAgICB2aXJ0dWFsIHZvaWQgbW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQgKik7CiAgICB2aXJ0dWFsIHZvaWQgbW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50ICopOwogICAgdmlydHVhbCB2b2lkIG1vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50ICopOwogICAgdmlydHVhbCB2b2lkIG1vdXNlRG91YmxlQ2xpY2tFdmVudChRTW91c2VFdmVudCAqKSB7fQogICAgdmlydHVhbCB2b2lkIHBhaW50RXZlbnQoUVBhaW50RXZlbnQgKik7CgogICAgdm9pZCBtZW51KGNvbnN0IFFQb2ludCAmKTsKICAgIHZvaWQgY2xvc2UoKTsKICAgIHZvaWQgbWluaW1pemUoKTsKICAgIHZvaWQgdG9nZ2xlTWF4aW1pemUoKTsKCiAgICBRV1NEZWNvcmF0aW9uOjpSZWdpb24gYWN0aXZlUmVnaW9uOwogICAgUVdpZGdldCAqbWFuYWdlZDsKICAgIFFQb3B1cE1lbnUgKnBvcHVwOwogICAgUVJlY3QgICBub3JtYWxTaXplOwogICAgUVdTQnV0dG9uICptZW51QnRuOwogICAgUVdTQnV0dG9uICpjbG9zZUJ0bjsKICAgIFFXU0J1dHRvbiAqbWluaW1pemVCdG47CiAgICBRV1NCdXR0b24gKm1heGltaXplQnRuOwoKICAgIGludCBkeDsKICAgIGludCBkeTsKICAgIGludCBza2lwQ291bnQ7CgogICAgc3RhdGljIFFXaWRnZXQgKmFjdGl2ZTsKICAgIHN0YXRpYyBRUG9pbnQgbW91c2VQb3M7CnByaXZhdGU6CiAgICBmcmllbmQgY2xhc3MgUVdpZGdldDsKICAgIGlubGluZSB2b2lkIHJlbGVhc2VHcmFiKCkgeyBhY3RpdmUgPSAwOyBhY3RpdmVSZWdpb24gPSBRV1NEZWNvcmF0aW9uOjpOb25lOyB9Cn07CgpjbGFzcyBRV1NCdXR0b24KewpwdWJsaWM6CiAgICBRV1NCdXR0b24oUVdTTWFuYWdlciAqbSwgUVdTRGVjb3JhdGlvbjo6UmVnaW9uIHQsIGJvb2wgdGIgPSBmYWxzZSk7CgogICAgZW51bSBTdGF0ZSB7IE1vdXNlT3ZlciA9IDB4MDEsIENsaWNrZWQgPSAweDAyLCBPbiA9IDB4MDQgfTsKICAgIGludCBzdGF0ZSgpIHsgcmV0dXJuIGZsYWdzOyB9CiAgICB2b2lkIHNldE1vdXNlT3Zlcihib29sKTsKICAgIHZvaWQgc2V0Q2xpY2tlZChib29sKTsKICAgIHZvaWQgc2V0T24oYm9vbCk7Cgpwcm90ZWN0ZWQ6CiAgICB2b2lkIHBhaW50KCk7Cgpwcml2YXRlOgogICAgaW50ICBmbGFnczsKICAgIGJvb2wgdG9nZ2xlOwogICAgUVdTRGVjb3JhdGlvbjo6UmVnaW9uIHR5cGU7CiAgICBRV1NNYW5hZ2VyICptYW5hZ2VyOwp9OwoKLy8gY2xhc3MgUVdTRGVmYXVsdERlY29yYXRpb24gOiBwdWJsaWMgUVdTRGVjb3JhdGlvbjsKI2luY2x1ZGUgInF3c2RlZmF1bHRkZWNvcmF0aW9uX3F3cy5oIgoKI2VuZGlmIC8vIFFUX05PX1FXU19NQU5BR0VSCgojZW5kaWYgLy8gUVdTTUFOQUdFUl9RV1NfSAoAAAAWAHEAdABlAHgAdAB2AGkAZQB3AC4AaAAACZcvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRVEVYVFZJRVdfSAojZGVmaW5lIFFURVhUVklFV19ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInF0ZXh0ZWRpdC5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19URVhUVklFVwoKY2xhc3MgUV9FWFBPUlQgUVRleHRWaWV3IDogcHVibGljIFFUZXh0RWRpdAp7CiAgICBRX09CSkVDVAogICAgUV9PVkVSUklERSggaW50IHVuZG9EZXB0aCBERVNJR05BQkxFIGZhbHNlIFNDUklQVEFCTEUgZmFsc2UgKQogICAgUV9PVkVSUklERSggYm9vbCBvdmVyd3JpdGVNb2RlIERFU0lHTkFCTEUgZmFsc2UgU0NSSVBUQUJMRSBmYWxzZSApCiAgICBRX09WRVJSSURFKCBib29sIG1vZGlmaWVkIFNDUklQVEFCTEUgZmFsc2UpCiAgICBRX09WRVJSSURFKCBib29sIHJlYWRPbmx5IERFU0lHTkFCTEUgZmFsc2UgU0NSSVBUQUJMRSBmYWxzZSApCiAgICBRX09WRVJSSURFKCBib29sIHVuZG9SZWRvRW5hYmxlZCBERVNJR05BQkxFIGZhbHNlIFNDUklQVEFCTEUgZmFsc2UgKQoKcHVibGljOgogICAgUVRleHRWaWV3KCBjb25zdCBRU3RyaW5nJiB0ZXh0LCBjb25zdCBRU3RyaW5nJiBjb250ZXh0ID0gUVN0cmluZzo6bnVsbCwKCSAgICAgICBRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wKTsKICAgIFFUZXh0VmlldyggUVdpZGdldCogcGFyZW50PTAsIGNvbnN0IGNoYXIqIG5hbWU9MCApOwoKICAgIHZpcnR1YWwgflFUZXh0VmlldygpOwoKcHJpdmF0ZToKI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpIC8vIERpc2FibGVkIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPQogICAgUVRleHRWaWV3KCBjb25zdCBRVGV4dFZpZXcgJiApOwogICAgUVRleHRWaWV3ICZvcGVyYXRvcj0oIGNvbnN0IFFUZXh0VmlldyAmICk7CiNlbmRpZgp9OwoKI2VuZGlmIC8vUVRfTk9fVEVYVFZJRVcKI2VuZGlmIC8vUVRFWFRWSUVXX0gKAAAAHgBxAHcAcwBtAG8AdQBzAGUAXwBxAG4AeAA0AC4AaAAACGQvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdTTU9VU0VfUU5YNF9ICiNkZWZpbmUgUVdTTU9VU0VfUU5YNF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInF3aW5kb3dzeXN0ZW1fcXdzLmgiCiNlbmRpZiAvLyBRVF9ICgojaWZkZWYgUV9PU19RTlg0CgojaW5jbHVkZSAicXdzZXZlbnRfcXdzLmgiCiNpbmNsdWRlICJxd3Njb21tYW5kX3F3cy5oIgojaW5jbHVkZSAicXdzdXRpbHNfcXdzLmgiCiNpbmNsdWRlICJxd3Ntb3VzZV9xd3MuaCIKCiNpbmNsdWRlIDxxYXBwbGljYXRpb24uaD4KI2luY2x1ZGUgPHFwb2ludGFycmF5Lmg+CiNpbmNsdWRlIDxxZ2Z4X3F3cy5oPgoKCiNpZm5kZWYgUVFOWDRNT1VTRUhBTkRMRVJQUklWQVRFSU1QTAojZGVmaW5lIFFRTlg0TU9VU0VIQU5ETEVSUFJJVkFURUlNUEwKCnN0cnVjdCBtb3VzZV9ldmVudDsKY2xhc3MgUVFueDRNb3VzZUhhbmRsZXJQcml2YXRlIDogcHVibGljIFFXU01vdXNlSGFuZGxlciB7CiAgICBRX09CSkVDVAoKICAgIHB1YmxpYzoKICAgICAgICBRUW54NE1vdXNlSGFuZGxlclByaXZhdGUoTW91c2VQcm90b2NvbCAmLCBRU3RyaW5nKTsKICAgICAgICB+UVFueDRNb3VzZUhhbmRsZXJQcml2YXRlKCk7CgoJdm9pZCBjbGVhckNhbGlicmF0aW9uKCk7Cgl2b2lkIGNhbGlicmF0ZSgpOwoJdm9pZCBnZXRDYWxpYnJhdGlvbiggUVdTUG9pbnRlckNhbGlicmF0aW9uRGF0YSAqICk7CgogICAgcHJpdmF0ZToKCVFTb2NrZXROb3RpZmllciAqbW91c2VOb3RpZmllcjsKCWludCBtb3VzZUZELCByZWFkX2luOwogICAgICAgIG1vdXNlX2V2ZW50ICptcGFjazsKCiAgICBwcml2YXRlIHNsb3RzOgogICAgICAgIHZvaWQgcmVhZE1vdXNlRGF0YShpbnQpOwp9OwoKI2VuZGlmCiNlbmRpZgoKI2VuZGlmIC8vIFFXU01PVVNFX1FOWDRfSAoAAAAUAHEAdABvAG8AbAB0AGkAcAAuAGgAABBPLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFUT09MVElQX0gKI2RlZmluZSBRVE9PTFRJUF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInF3aWRnZXQuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fVE9PTFRJUAoKCmNsYXNzIFFUaXBNYW5hZ2VyOwpjbGFzcyBRSWNvblZpZXdUb29sVGlwOwpjbGFzcyBRTGlzdFZpZXdUb29sVGlwOwoKY2xhc3MgUV9FWFBPUlQgUVRvb2xUaXBHcm91cDogcHVibGljIFFPYmplY3QKewogICAgUV9PQkpFQ1QKICAgIFFfUFJPUEVSVFkoIGJvb2wgZGVsYXkgUkVBRCBkZWxheSBXUklURSBzZXREZWxheSApCiAgICBRX1BST1BFUlRZKCBib29sIGVuYWJsZWQgUkVBRCBlbmFibGVkIFdSSVRFIHNldEVuYWJsZWQgKQoKcHVibGljOgogICAgUVRvb2xUaXBHcm91cCggUU9iamVjdCAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lID0gMCApOwogICB+UVRvb2xUaXBHcm91cCgpOwoKICAgIGJvb2wgZGVsYXkoKSBjb25zdDsKICAgIGJvb2wgZW5hYmxlZCgpIGNvbnN0OwoKcHVibGljIHNsb3RzOgogICAgdm9pZCBzZXREZWxheSggYm9vbCApOwogICAgdm9pZCBzZXRFbmFibGVkKCBib29sICk7CgpzaWduYWxzOgogICAgdm9pZCBzaG93VGlwKCBjb25zdCBRU3RyaW5nICYpOwogICAgdm9pZCByZW1vdmVUaXAoKTsKCnByaXZhdGU6CiAgICB1aW50IGRlbDoxOwogICAgdWludCBlbmE6MTsKCiAgICBmcmllbmQgY2xhc3MgUVRpcE1hbmFnZXI7Cgpwcml2YXRlOgkvLyBEaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRVG9vbFRpcEdyb3VwKCBjb25zdCBRVG9vbFRpcEdyb3VwICYgKTsKICAgIFFUb29sVGlwR3JvdXAmIG9wZXJhdG9yPSggY29uc3QgUVRvb2xUaXBHcm91cCAmICk7CiNlbmRpZgp9OwoKCmNsYXNzIFFfRVhQT1JUIFFUb29sVGlwOiBwdWJsaWMgUXQKewpwdWJsaWM6CiAgICBRVG9vbFRpcCggUVdpZGdldCAqLCBRVG9vbFRpcEdyb3VwICogPSAwICk7CiAgICAvLyMjIyBhZGQgdmlydHVhbCBkJ3RvciBmb3IgNC4wCgogICAgc3RhdGljIHZvaWQgYWRkKCBRV2lkZ2V0ICosIGNvbnN0IFFTdHJpbmcgJik7CiAgICBzdGF0aWMgdm9pZCBhZGQoIFFXaWRnZXQgKiwgY29uc3QgUVN0cmluZyAmLAoJCSAgICAgUVRvb2xUaXBHcm91cCAqLCBjb25zdCBRU3RyaW5nJiApOwogICAgc3RhdGljIHZvaWQgcmVtb3ZlKCBRV2lkZ2V0ICogKTsKCiAgICBzdGF0aWMgdm9pZCBhZGQoIFFXaWRnZXQgKiwgY29uc3QgUVJlY3QgJiwgY29uc3QgUVN0cmluZyAmKTsKICAgIHN0YXRpYyB2b2lkIGFkZCggUVdpZGdldCAqLCBjb25zdCBRUmVjdCAmLCBjb25zdCBRU3RyaW5nICYsCgkJICAgICBRVG9vbFRpcEdyb3VwICosIGNvbnN0IFFTdHJpbmcmICk7CiAgICBzdGF0aWMgdm9pZCByZW1vdmUoIFFXaWRnZXQgKiwgY29uc3QgUVJlY3QgJiApOwoKICAgIHN0YXRpYyBRU3RyaW5nIHRleHRGb3IoIFFXaWRnZXQgKiwgY29uc3QgUVBvaW50ICYgcG9zID0gUVBvaW50KCkgKTsKCiAgICBzdGF0aWMgdm9pZCBoaWRlKCk7CgogICAgc3RhdGljIFFGb250ICAgIGZvbnQoKTsKICAgIHN0YXRpYyB2b2lkCSAgICBzZXRGb250KCBjb25zdCBRRm9udCAmICk7CiAgICBzdGF0aWMgUVBhbGV0dGUgcGFsZXR0ZSgpOwogICAgc3RhdGljIHZvaWQJICAgIHNldFBhbGV0dGUoIGNvbnN0IFFQYWxldHRlICYgKTsKCiNpZm5kZWYgUVRfTk9fQ09NUEFUCiAgICBzdGF0aWMgdm9pZAkgICAgc2V0RW5hYmxlZCggYm9vbCBlbmFibGUgKSB7IHNldEdsb2JhbGx5RW5hYmxlZCggZW5hYmxlICk7IH0KICAgIHN0YXRpYyBib29sCSAgICBlbmFibGVkKCkgeyByZXR1cm4gaXNHbG9iYWxseUVuYWJsZWQoKTsgfQojZW5kaWYKICAgIHN0YXRpYyB2b2lkCSAgICBzZXRHbG9iYWxseUVuYWJsZWQoIGJvb2wgKTsKICAgIHN0YXRpYyBib29sCSAgICBpc0dsb2JhbGx5RW5hYmxlZCgpOwogICAgc3RhdGljIHZvaWQJICAgIHNldFdha2VVcERlbGF5KGludCk7Cgpwcm90ZWN0ZWQ6CiAgICB2aXJ0dWFsIHZvaWQgbWF5YmVUaXAoIGNvbnN0IFFQb2ludCAmICkgPSAwOwogICAgdm9pZCAgICB0aXAoIGNvbnN0IFFSZWN0ICYsIGNvbnN0IFFTdHJpbmcgJik7CiAgICB2b2lkICAgIHRpcCggY29uc3QgUVJlY3QgJiwgY29uc3QgUVN0cmluZyYgLCBjb25zdCBRU3RyaW5nICYpOwogICAgdm9pZCAgICB0aXAoIGNvbnN0IFFSZWN0ICYsIGNvbnN0IFFTdHJpbmcgJiwgY29uc3QgUVJlY3QgJiApOwogICAgdm9pZCAgICB0aXAoIGNvbnN0IFFSZWN0ICYsIGNvbnN0IFFTdHJpbmcmLCBjb25zdCBRU3RyaW5nICYsIGNvbnN0IFFSZWN0ICYpOwoKICAgIHZvaWQgICAgY2xlYXIoKTsKCnB1YmxpYzoKICAgIFFXaWRnZXQJICAqcGFyZW50V2lkZ2V0KCkgY29uc3QgeyByZXR1cm4gcDsgfQogICAgUVRvb2xUaXBHcm91cCAqZ3JvdXAoKQkgIGNvbnN0IHsgcmV0dXJuIGc7IH0KCnByaXZhdGU6CiAgICBRV2lkZ2V0CSAgICAqcDsKICAgIFFUb29sVGlwR3JvdXAgICAqZzsKICAgIHN0YXRpYyBRRm9udCAgICAqdHRGb250OwogICAgc3RhdGljIFFQYWxldHRlICp0dFBhbGV0dGU7CgogICAgZnJpZW5kIGNsYXNzIFFUaXBNYW5hZ2VyOwp9OwoKCiNlbmRpZiAvLyBRVF9OT19UT09MVElQCgojZW5kaWYgLy8gUVRPT0xUSVBfSAoAAAAaAHEAdgBhAGwAdQBlAHMAdABhAGMAawAuAGgAAAfPLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVZBTFVFU1RBQ0tfSAojZGVmaW5lIFFWQUxVRVNUQUNLX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXZhbHVlbGlzdC5oIgojZW5kaWYgLy8gUVRfSAoKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIFFWYWx1ZVN0YWNrIDogcHVibGljIFFWYWx1ZUxpc3Q8VD4KewpwdWJsaWM6CiAgICBRVmFsdWVTdGFjaygpIHt9CiAgIH5RVmFsdWVTdGFjaygpIHt9CiAgICB2b2lkICBwdXNoKCBjb25zdCBUJiBkICkgeyB0aGlzLT5hcHBlbmQoZCk7IH0KICAgIFQgcG9wKCkKICAgIHsKCVQgZWxlbSggdGhpcy0+bGFzdCgpICk7CglpZiAoICF0aGlzLT5pc0VtcHR5KCkgKQoJICAgIHRoaXMtPnJlbW92ZSggdGhpcy0+ZnJvbUxhc3QoKSApOwoJcmV0dXJuIGVsZW07CiAgICB9CiAgICBUJiB0b3AoKSB7IHJldHVybiB0aGlzLT5sYXN0KCk7IH0KICAgIGNvbnN0IFQmIHRvcCgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmxhc3QoKTsgfQp9OwoKI2VuZGlmCgAAABgAcQBzAHEAbABkAHIAaQB2AGUAcgAuAGgAAA+oLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVNRTERSSVZFUl9ICiNkZWZpbmUgUVNRTERSSVZFUl9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFvYmplY3QuaCIKI2luY2x1ZGUgInFwdHJkaWN0LmgiCiNpbmNsdWRlICJxc3RyaW5nLmgiCiNpbmNsdWRlICJxc3FsZXJyb3IuaCIKI2luY2x1ZGUgInFzcWxxdWVyeS5oIgojaW5jbHVkZSAicXNxbGZpZWxkLmgiCiNpbmNsdWRlICJxc3FsaW5kZXguaCIKI2luY2x1ZGUgInFzdHJpbmdsaXN0LmgiCiNpbmNsdWRlICJxbWFwLmgiCiNlbmRpZiAvLyBRVF9ICgojaWYgIWRlZmluZWQoIFFUX01PRFVMRV9TUUwgKSB8fCBkZWZpbmVkKCBRVF9MSUNFTlNFX1BST0ZFU1NJT05BTCApCiNkZWZpbmUgUU1fRVhQT1JUX1NRTAojZWxzZQojZGVmaW5lIFFNX0VYUE9SVF9TUUwgUV9FWFBPUlQKI2VuZGlmCgojaWZuZGVmIFFUX05PX1NRTAoKY2xhc3MgUVNxbERyaXZlckV4dGVuc2lvbjsKCmNsYXNzIFFTcWxEYXRhYmFzZTsKCmNsYXNzIFFNX0VYUE9SVF9TUUwgUVNxbERyaXZlciA6IHB1YmxpYyBRT2JqZWN0CnsKICAgIGZyaWVuZCBjbGFzcyBRU3FsRGF0YWJhc2U7CiAgICBRX09CSkVDVApwdWJsaWM6CiAgICBlbnVtIERyaXZlckZlYXR1cmUgeyBUcmFuc2FjdGlvbnMsIFF1ZXJ5U2l6ZSwgQkxPQiwgVW5pY29kZSwgUHJlcGFyZWRRdWVyaWVzLAoJCQkgTmFtZWRQbGFjZWhvbGRlcnMsIFBvc2l0aW9uYWxQbGFjZWhvbGRlcnMgfTsKCiAgICBRU3FsRHJpdmVyKCBRT2JqZWN0ICogcGFyZW50PTAsIGNvbnN0IGNoYXIgKiBuYW1lPTAgKTsKICAgIH5RU3FsRHJpdmVyKCk7CiAgICBib29sCQkJaXNPcGVuKCkgY29uc3Q7CiAgICBib29sCQkJaXNPcGVuRXJyb3IoKSBjb25zdDsKCiAgICB2aXJ0dWFsIGJvb2wJCWJlZ2luVHJhbnNhY3Rpb24oKTsKICAgIHZpcnR1YWwgYm9vbAkJY29tbWl0VHJhbnNhY3Rpb24oKTsKICAgIHZpcnR1YWwgYm9vbAkJcm9sbGJhY2tUcmFuc2FjdGlvbigpOwogICAgdmlydHVhbCBRU3RyaW5nTGlzdAkJdGFibGVzKCBjb25zdCBRU3RyaW5nJiB0YWJsZVR5cGUgKSBjb25zdDsKICAgIHZpcnR1YWwgUVNxbEluZGV4CQlwcmltYXJ5SW5kZXgoIGNvbnN0IFFTdHJpbmcmIHRhYmxlTmFtZSApIGNvbnN0OwogICAgdmlydHVhbCBRU3FsUmVjb3JkCQlyZWNvcmQoIGNvbnN0IFFTdHJpbmcmIHRhYmxlTmFtZSApIGNvbnN0OwogICAgdmlydHVhbCBRU3FsUmVjb3JkCQlyZWNvcmQoIGNvbnN0IFFTcWxRdWVyeSYgcXVlcnkgKSBjb25zdDsKICAgIHZpcnR1YWwgUVNxbFJlY29yZEluZm8JcmVjb3JkSW5mbyggY29uc3QgUVN0cmluZyYgdGFibGVuYW1lICkgY29uc3Q7CiAgICB2aXJ0dWFsIFFTcWxSZWNvcmRJbmZvCXJlY29yZEluZm8oIGNvbnN0IFFTcWxRdWVyeSYgcXVlcnkgKSBjb25zdDsKICAgIHZpcnR1YWwgUVN0cmluZwkJbnVsbFRleHQoKSBjb25zdDsKICAgIHZpcnR1YWwgUVN0cmluZwkJZm9ybWF0VmFsdWUoIGNvbnN0IFFTcWxGaWVsZCogZmllbGQsIGJvb2wgdHJpbVN0cmluZ3MgPSBGQUxTRSApIGNvbnN0OwogICAgUVNxbEVycm9yCQkJbGFzdEVycm9yKCkgY29uc3Q7CgogICAgdmlydHVhbCBib29sCQloYXNGZWF0dXJlKCBEcml2ZXJGZWF0dXJlIGYgKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIGJvb2wJCW9wZW4oIGNvbnN0IFFTdHJpbmcgJiBkYiwKCQkJCSAgICAgIGNvbnN0IFFTdHJpbmcgJiB1c2VyID0gUVN0cmluZzo6bnVsbCwKCQkJCSAgICAgIGNvbnN0IFFTdHJpbmcgJiBwYXNzd29yZCA9IFFTdHJpbmc6Om51bGwsCgkJCQkgICAgICBjb25zdCBRU3RyaW5nICYgaG9zdCA9IFFTdHJpbmc6Om51bGwsCgkJCQkgICAgICBpbnQgcG9ydCA9IC0xICkgPSAwOwogICAgdmlydHVhbCB2b2lkCQljbG9zZSgpID0gMDsKICAgIHZpcnR1YWwgUVNxbFF1ZXJ5CQljcmVhdGVRdWVyeSgpIGNvbnN0ID0gMDsKCiAgICAvLyAjIyMgcmVtb3ZlIGZvciA0LjAKICAgIGJvb2wJCQlvcGVuKCBjb25zdCBRU3RyaW5nJiBkYiwKCQkJCSAgICAgIGNvbnN0IFFTdHJpbmcmIHVzZXIsCgkJCQkgICAgICBjb25zdCBRU3RyaW5nJiBwYXNzd29yZCwKCQkJCSAgICAgIGNvbnN0IFFTdHJpbmcmIGhvc3QsCgkJCQkgICAgICBpbnQgcG9ydCwKCQkJCSAgICAgIGNvbnN0IFFTdHJpbmcmIGNvbm5PcHRzICk7CnByb3RlY3RlZDoKICAgIHZpcnR1YWwgdm9pZAkJc2V0T3BlbiggYm9vbCBvICk7CiAgICB2aXJ0dWFsIHZvaWQJCXNldE9wZW5FcnJvciggYm9vbCBlICk7CiAgICB2aXJ0dWFsIHZvaWQJCXNldExhc3RFcnJvciggY29uc3QgUVNxbEVycm9yJiBlICk7CnByaXZhdGU6CiAgICAvLyAjIyMgVGhpcyBjbGFzcyBuZWVkcyBhIGQtcG9pbnRlciBpbiA0LjAuCiAgICBpbnQJCSAgICAgICAgICBkYlN0YXRlOwogICAgUVNxbEVycm9yCSAgICAgICAgICBlcnJvcjsKI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRU3FsRHJpdmVyKCBjb25zdCBRU3FsRHJpdmVyICYgKTsKICAgIFFTcWxEcml2ZXIgJm9wZXJhdG9yPSggY29uc3QgUVNxbERyaXZlciAmICk7CiNlbmRpZgp9OwoKI2VuZGlmCS8vIFFUX05PX1NRTAojZW5kaWYKAAAACgBxAHQAbAAuAGgAAB37LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFUTF9ICiNkZWZpbmUgUVRMX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicWdsb2JhbC5oIgojaW5jbHVkZSAicXRleHRzdHJlYW0uaCIKI2luY2x1ZGUgInFzdHJpbmcuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fVEVYVFNUUkVBTQp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgUVRleHRPU3RyZWFtSXRlcmF0b3IKewpwcm90ZWN0ZWQ6CiAgICBRVGV4dE9TdHJlYW0mIHN0cmVhbTsKICAgIFFTdHJpbmcgc2VwYXJhdG9yOwoKcHVibGljOgogICAgUVRleHRPU3RyZWFtSXRlcmF0b3IoIFFUZXh0T1N0cmVhbSYgcykgOiBzdHJlYW0oIHMgKSB7fQogICAgUVRleHRPU3RyZWFtSXRlcmF0b3IoIFFUZXh0T1N0cmVhbSYgcywgY29uc3QgUVN0cmluZyYgc2VwICkKCTogc3RyZWFtKCBzICksIHNlcGFyYXRvciggc2VwICkgIHt9CiAgICBRVGV4dE9TdHJlYW1JdGVyYXRvcjxUPiYgb3BlcmF0b3I9ICggY29uc3QgVCYgeCApIHsKCXN0cmVhbSA8PCB4OwoJaWYgKCAhc2VwYXJhdG9yLmlzRW1wdHkoKSApCgkgICAgc3RyZWFtIDw8IHNlcGFyYXRvcjsKCXJldHVybiAqdGhpczsKICAgIH0KICAgIFFUZXh0T1N0cmVhbUl0ZXJhdG9yPFQ+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQogICAgUVRleHRPU3RyZWFtSXRlcmF0b3I8VD4mIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQogICAgUVRleHRPU3RyZWFtSXRlcmF0b3I8VD4mIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQp9OwojZW5kaWYgLy9RVF9OT19URVhUU1RSRUFNCgp0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgT3V0cHV0SXRlcmF0b3I+CmlubGluZSBPdXRwdXRJdGVyYXRvciBxQ29weSggSW5wdXRJdGVyYXRvciBfYmVnaW4sIElucHV0SXRlcmF0b3IgX2VuZCwKCQkJICAgICBPdXRwdXRJdGVyYXRvciBfZGVzdCApCnsKICAgIHdoaWxlKCBfYmVnaW4gIT0gX2VuZCApCgkqX2Rlc3QrKyA9ICpfYmVnaW4rKzsKICAgIHJldHVybiBfZGVzdDsKfQoKdGVtcGxhdGUgPGNsYXNzIEJpSXRlcmF0b3IsIGNsYXNzIEJpT3V0cHV0SXRlcmF0b3I+CmlubGluZSBCaU91dHB1dEl0ZXJhdG9yIHFDb3B5QmFja3dhcmQoIEJpSXRlcmF0b3IgX2JlZ2luLCBCaUl0ZXJhdG9yIF9lbmQsCgkJCQkgICAgICAgQmlPdXRwdXRJdGVyYXRvciBfZGVzdCApCnsKICAgIHdoaWxlICggX2JlZ2luICE9IF9lbmQgKQoJKi0tX2Rlc3QgPSAqLS1fZW5kOwogICAgcmV0dXJuIF9kZXN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNsYXNzIElucHV0SXRlcmF0b3IyPgppbmxpbmUgYm9vbCBxRXF1YWwoIElucHV0SXRlcmF0b3IxIGZpcnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsIElucHV0SXRlcmF0b3IyIGZpcnN0MiApCnsKICAgIC8vICMjIyBjb21wYXJlIHVzaW5nICEoKmZpcnN0MSA9PSAqZmlyc3QyKSBpbiBRdCA0LjAKICAgIGZvciAoIDsgZmlyc3QxICE9IGxhc3QxOyArK2ZpcnN0MSwgKytmaXJzdDIgKQoJaWYgKCAqZmlyc3QxICE9ICpmaXJzdDIgKQoJICAgIHJldHVybiBGQUxTRTsKICAgIHJldHVybiBUUlVFOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBUPgppbmxpbmUgdm9pZCBxRmlsbCggRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCwgY29uc3QgVCYgdmFsICkKewogICAgZm9yICggOyBmaXJzdCAhPSBsYXN0OyArK2ZpcnN0ICkKCSpmaXJzdCA9IHZhbDsKfQoKI2lmIDAKdGVtcGxhdGUgPGNsYXNzIEJpSXRlcmF0b3IsIGNsYXNzIE91dHB1dEl0ZXJhdG9yPgppbmxpbmUgT3V0cHV0SXRlcmF0b3IgcVJldmVyc2VDb3B5KCBCaUl0ZXJhdG9yIF9iZWdpbiwgQmlJdGVyYXRvciBfZW5kLAoJCQkJICAgIE91dHB1dEl0ZXJhdG9yIF9kZXN0ICkKewogICAgd2hpbGUgKCBfYmVnaW4gIT0gX2VuZCApIHsKCS0tX2VuZDsKCSpfZGVzdCA9ICpfZW5kOwoJKytfZGVzdDsKICAgIH0KICAgIHJldHVybiBfZGVzdDsKfQojZW5kaWYKCgp0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgVD4KaW5saW5lIElucHV0SXRlcmF0b3IgcUZpbmQoIElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwKCQkJICAgIGNvbnN0IFQmIHZhbCApCnsKICAgIHdoaWxlICggZmlyc3QgIT0gbGFzdCAmJiAqZmlyc3QgIT0gdmFsICkKCSsrZmlyc3Q7CiAgICByZXR1cm4gZmlyc3Q7Cn0KCnRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBULCBjbGFzcyBTaXplPgppbmxpbmUgdm9pZCBxQ291bnQoIElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgY29uc3QgVCYgdmFsdWUsCgkJICAgIFNpemUmIG4gKQp7CiAgICBmb3IgKCA7IGZpcnN0ICE9IGxhc3Q7ICsrZmlyc3QgKQoJaWYgKCAqZmlyc3QgPT0gdmFsdWUgKQoJICAgICsrbjsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZSB2b2lkIHFTd2FwKCBUJiBfdmFsdWUxLCBUJiBfdmFsdWUyICkKewogICAgVCB0bXAgPSBfdmFsdWUxOwogICAgX3ZhbHVlMSA9IF92YWx1ZTI7CiAgICBfdmFsdWUyID0gdG1wOwp9CgoKdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+ClFfSU5MSU5FX1RFTVBMQVRFUyB2b2lkIHFCdWJibGVTb3J0KCBJbnB1dEl0ZXJhdG9yIGIsIElucHV0SXRlcmF0b3IgZSApCnsKICAgIC8vIEdvdG8gbGFzdCBlbGVtZW50OwogICAgSW5wdXRJdGVyYXRvciBsYXN0ID0gZTsKICAgIC0tbGFzdDsKICAgIC8vIG9ubHkgb25lIGVsZW1lbnQgb3Igbm8gZWxlbWVudHMgPwogICAgaWYgKCBsYXN0ID09IGIgKQoJcmV0dXJuOwoKICAgIC8vIFNvIHdlIGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzIGluIGhlcmUKICAgIHdoaWxlKCBiICE9IGxhc3QgKSB7Cglib29sIHN3YXBwZWQgPSBGQUxTRTsKCUlucHV0SXRlcmF0b3Igc3dhcF9wb3MgPSBiOwoJSW5wdXRJdGVyYXRvciB4ID0gZTsKCUlucHV0SXRlcmF0b3IgeSA9IHg7Cgl5LS07CglkbyB7CgkgICAgLS14OwoJICAgIC0teTsKCSAgICBpZiAoICp4IDwgKnkgKSB7CgkJc3dhcHBlZCA9IFRSVUU7CgkJcVN3YXAoICp4LCAqeSApOwoJCXN3YXBfcG9zID0geTsKCSAgICB9Cgl9IHdoaWxlKCB5ICE9IGIgKTsKCWlmICggIXN3YXBwZWQgKQoJICAgIHJldHVybjsKCWIgPSBzd2FwX3BvczsKCWIrKzsKICAgIH0KfQoKCnRlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+CmlubGluZSB2b2lkIHFCdWJibGVTb3J0KCBDb250YWluZXIgJmMgKQp7CiAgcUJ1YmJsZVNvcnQoIGMuYmVnaW4oKSwgYy5lbmQoKSApOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFZhbHVlPgpRX0lOTElORV9URU1QTEFURVMgdm9pZCBxSGVhcFNvcnRQdXNoRG93biggVmFsdWUqIGhlYXAsIGludCBmaXJzdCwgaW50IGxhc3QgKQp7CiAgICBpbnQgciA9IGZpcnN0OwogICAgd2hpbGUgKCByIDw9IGxhc3QgLyAyICkgewoJaWYgKCBsYXN0ID09IDIgKiByICkgewoJICAgIC8vIG5vZGUgciBoYXMgb25seSBvbmUgY2hpbGQKCSAgICBpZiAoIGhlYXBbMiAqIHJdIDwgaGVhcFtyXSApCgkJcVN3YXAoIGhlYXBbcl0sIGhlYXBbMiAqIHJdICk7CgkgICAgciA9IGxhc3Q7Cgl9IGVsc2UgewoJICAgIC8vIG5vZGUgciBoYXMgdHdvIGNoaWxkcmVuCgkgICAgaWYgKCBoZWFwWzIgKiByXSA8IGhlYXBbcl0gJiYgIShoZWFwWzIgKiByICsgMV0gPCBoZWFwWzIgKiByXSkgKSB7CgkJLy8gc3dhcCB3aXRoIGxlZnQgY2hpbGQKCQlxU3dhcCggaGVhcFtyXSwgaGVhcFsyICogcl0gKTsKCQlyICo9IDI7CgkgICAgfSBlbHNlIGlmICggaGVhcFsyICogciArIDFdIDwgaGVhcFtyXQoJCQkmJiBoZWFwWzIgKiByICsgMV0gPCBoZWFwWzIgKiByXSApIHsKCQkvLyBzd2FwIHdpdGggcmlnaHQgY2hpbGQKCQlxU3dhcCggaGVhcFtyXSwgaGVhcFsyICogciArIDFdICk7CgkJciA9IDIgKiByICsgMTsKCSAgICB9IGVsc2UgewoJCXIgPSBsYXN0OwoJICAgIH0KCX0KICAgIH0KfQoKCnRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBWYWx1ZT4KUV9JTkxJTkVfVEVNUExBVEVTIHZvaWQgcUhlYXBTb3J0SGVscGVyKCBJbnB1dEl0ZXJhdG9yIGIsIElucHV0SXRlcmF0b3IgZSwgVmFsdWUsIHVpbnQgbiApCnsKICAgIC8vIENyZWF0ZSB0aGUgaGVhcAogICAgSW5wdXRJdGVyYXRvciBpbnNlcnQgPSBiOwogICAgVmFsdWUqIHJlYWxoZWFwID0gbmV3IFZhbHVlW25dOwogICAgLy8gV293LCB3aGF0IGEgZmFrZS4gQnV0IEkgd2FudCB0aGUgaGVhcCB0byBiZSBpbmRleGVkIGFzIDEuLi5uCiAgICBWYWx1ZSogaGVhcCA9IHJlYWxoZWFwIC0gMTsKICAgIGludCBzaXplID0gMDsKICAgIGZvciggOyBpbnNlcnQgIT0gZTsgKytpbnNlcnQgKSB7CgloZWFwWysrc2l6ZV0gPSAqaW5zZXJ0OwoJaW50IGkgPSBzaXplOwoJd2hpbGUoIGkgPiAxICYmIGhlYXBbaV0gPCBoZWFwW2kgLyAyXSApIHsKCSAgICBxU3dhcCggaGVhcFtpXSwgaGVhcFtpIC8gMl0gKTsKCSAgICBpIC89IDI7Cgl9CiAgICB9CgogICAgLy8gTm93IGRvIHRoZSBzb3J0aW5nCiAgICBmb3IoIHVpbnQgaSA9IG47IGkgPiAwOyBpLS0gKSB7CgkqYisrID0gaGVhcFsxXTsKCWlmICggaSA+IDEgKSB7CgkgICAgaGVhcFsxXSA9IGhlYXBbaV07CgkgICAgcUhlYXBTb3J0UHVzaERvd24oIGhlYXAsIDEsIChpbnQpaSAtIDEgKTsKCX0KICAgIH0KCiAgICBkZWxldGVbXSByZWFsaGVhcDsKfQoKCnRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgpRX0lOTElORV9URU1QTEFURVMgdm9pZCBxSGVhcFNvcnQoIElucHV0SXRlcmF0b3IgYiwgSW5wdXRJdGVyYXRvciBlICkKewogICAgLy8gRW1wdHkgPwogICAgaWYgKCBiID09IGUgKQoJcmV0dXJuOwoKICAgIC8vIEhvdyBtYW55IGVudHJpZXMgaGF2ZSB0byBiZSBzb3J0ZWQgPwogICAgSW5wdXRJdGVyYXRvciBpdCA9IGI7CiAgICB1aW50IG4gPSAwOwogICAgd2hpbGUgKCBpdCAhPSBlICkgewoJKytuOwoJKytpdDsKICAgIH0KCiAgICAvLyBUaGUgc2Vjb25kIGxhc3QgcGFyYW1ldGVyIGlzIGEgaGFjayB0byByZXRyaWV2ZSB0aGUgdmFsdWUgdHlwZQogICAgLy8gRG8gdGhlIHJlYWwgc29ydGluZyBoZXJlCiAgICBxSGVhcFNvcnRIZWxwZXIoIGIsIGUsICpiLCBuICk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgpRX0lOTElORV9URU1QTEFURVMgdm9pZCBxSGVhcFNvcnQoIENvbnRhaW5lciAmYyApCnsKICAgIGlmICggYy5iZWdpbigpID09IGMuZW5kKCkgKQoJcmV0dXJuOwoKICAgIC8vIFRoZSBzZWNvbmQgbGFzdCBwYXJhbWV0ZXIgaXMgYSBoYWNrIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSB0eXBlCiAgICAvLyBEbyB0aGUgcmVhbCBzb3J0aW5nIGhlcmUKICAgIHFIZWFwU29ydEhlbHBlciggYy5iZWdpbigpLCBjLmVuZCgpLCAqKGMuYmVnaW4oKSksICh1aW50KWMuY291bnQoKSApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgpjbGFzcyBRQmFja0luc2VydEl0ZXJhdG9yCnsKcHVibGljOgogICAgUV9FWFBMSUNJVCBRQmFja0luc2VydEl0ZXJhdG9yKCBDb250YWluZXIgJmMgKQoJOiBjb250YWluZXIoICZjICkKICAgIHsKICAgIH0KCiAgICBRQmFja0luc2VydEl0ZXJhdG9yPENvbnRhaW5lcj4mCiAgICBvcGVyYXRvcj0oIGNvbnN0IFFfVFlQRU5BTUUgQ29udGFpbmVyOjp2YWx1ZV90eXBlICZ2YWx1ZSApCiAgICB7Cgljb250YWluZXItPnB1c2hfYmFjayggdmFsdWUgKTsKCXJldHVybiAqdGhpczsKICAgIH0KCiAgICBRQmFja0luc2VydEl0ZXJhdG9yPENvbnRhaW5lcj4mIG9wZXJhdG9yKigpCiAgICB7CglyZXR1cm4gKnRoaXM7CiAgICB9CgogICAgUUJhY2tJbnNlcnRJdGVyYXRvcjxDb250YWluZXI+JiBvcGVyYXRvcisrKCkKICAgIHsKCXJldHVybiAqdGhpczsKICAgIH0KCiAgICBRQmFja0luc2VydEl0ZXJhdG9yPENvbnRhaW5lcj4mIG9wZXJhdG9yKysoaW50KQogICAgewoJcmV0dXJuICp0aGlzOwogICAgfQoKcHJvdGVjdGVkOgogICAgQ29udGFpbmVyICpjb250YWluZXI7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgppbmxpbmUgUUJhY2tJbnNlcnRJdGVyYXRvcjxDb250YWluZXI+IHFCYWNrSW5zZXJ0ZXIoIENvbnRhaW5lciAmYyApCnsKICAgIHJldHVybiBRQmFja0luc2VydEl0ZXJhdG9yPENvbnRhaW5lcj4oIGMgKTsKfQoKI2VuZGlmCgAAABoAcQB0AHIAYQBuAHMAbABhAHQAbwByAC4AaAAAFE8vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgojaWZuZGVmIFFUUkFOU0xBVE9SX0gKI2RlZmluZSBRVFJBTlNMQVRPUl9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFvYmplY3QuaCIKI2luY2x1ZGUgInF2YWx1ZWxpc3QuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fVFJBTlNMQVRJT04KCmNsYXNzIFFUcmFuc2xhdG9yUHJpdmF0ZTsKCmNsYXNzIFFfRVhQT1JUIFFUcmFuc2xhdG9yTWVzc2FnZQp7CnB1YmxpYzoKICAgIFFUcmFuc2xhdG9yTWVzc2FnZSgpOwogICAgUVRyYW5zbGF0b3JNZXNzYWdlKCBjb25zdCBjaGFyICogY29udGV4dCwKCQkJY29uc3QgY2hhciAqIHNvdXJjZVRleHQsCgkJCWNvbnN0IGNoYXIgKiBjb21tZW50LAoJCQljb25zdCBRU3RyaW5nJiB0cmFuc2xhdGlvbiA9IFFTdHJpbmc6Om51bGwgKTsKICAgIFFUcmFuc2xhdG9yTWVzc2FnZSggUURhdGFTdHJlYW0gJiApOwogICAgUVRyYW5zbGF0b3JNZXNzYWdlKCBjb25zdCBRVHJhbnNsYXRvck1lc3NhZ2UgJiBtICk7CgogICAgUVRyYW5zbGF0b3JNZXNzYWdlICYgb3BlcmF0b3I9KCBjb25zdCBRVHJhbnNsYXRvck1lc3NhZ2UgJiBtICk7CgogICAgdWludCBoYXNoKCkgY29uc3QgeyByZXR1cm4gaDsgfQogICAgY29uc3QgY2hhciAqY29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGN4OyB9CiAgICBjb25zdCBjaGFyICpzb3VyY2VUZXh0KCkgY29uc3QgeyByZXR1cm4gc3Q7IH0KICAgIGNvbnN0IGNoYXIgKmNvbW1lbnQoKSBjb25zdCB7IHJldHVybiBjbTsgfQoKICAgIHZvaWQgc2V0VHJhbnNsYXRpb24oIGNvbnN0IFFTdHJpbmcgJiB0cmFuc2xhdGlvbiApIHsgdG4gPSB0cmFuc2xhdGlvbjsgfQogICAgUVN0cmluZyB0cmFuc2xhdGlvbigpIGNvbnN0IHsgcmV0dXJuIHRuOyB9CgogICAgZW51bSBQcmVmaXggeyBOb1ByZWZpeCwgSGFzaCwgSGFzaENvbnRleHQsIEhhc2hDb250ZXh0U291cmNlVGV4dCwKCQkgIEhhc2hDb250ZXh0U291cmNlVGV4dENvbW1lbnQgfTsKICAgIHZvaWQgd3JpdGUoIFFEYXRhU3RyZWFtICYgcywgYm9vbCBzdHJpcCA9IEZBTFNFLAoJCVByZWZpeCBwcmVmaXggPSBIYXNoQ29udGV4dFNvdXJjZVRleHRDb21tZW50ICkgY29uc3Q7CiAgICBQcmVmaXggY29tbW9uUHJlZml4KCBjb25zdCBRVHJhbnNsYXRvck1lc3NhZ2UmICkgY29uc3Q7CgogICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBRVHJhbnNsYXRvck1lc3NhZ2UmIG0gKSBjb25zdDsKICAgIGJvb2wgb3BlcmF0b3IhPSggY29uc3QgUVRyYW5zbGF0b3JNZXNzYWdlJiBtICkgY29uc3QKICAgIHsgcmV0dXJuICFvcGVyYXRvcj09KCBtICk7IH0KICAgIGJvb2wgb3BlcmF0b3I8KCBjb25zdCBRVHJhbnNsYXRvck1lc3NhZ2UmIG0gKSBjb25zdDsKICAgIGJvb2wgb3BlcmF0b3I8PSggY29uc3QgUVRyYW5zbGF0b3JNZXNzYWdlJiBtICkgY29uc3QKICAgIHsgcmV0dXJuICFtLm9wZXJhdG9yPCggKnRoaXMgKTsgfQogICAgYm9vbCBvcGVyYXRvcj4oIGNvbnN0IFFUcmFuc2xhdG9yTWVzc2FnZSYgbSApIGNvbnN0CiAgICB7IHJldHVybiBtLm9wZXJhdG9yPCggKnRoaXMgKTsgfQogICAgYm9vbCBvcGVyYXRvcj49KCBjb25zdCBRVHJhbnNsYXRvck1lc3NhZ2UmIG0gKSBjb25zdAogICAgeyByZXR1cm4gIW9wZXJhdG9yPCggbSApOyB9Cgpwcml2YXRlOgogICAgdWludCBoOwogICAgUUNTdHJpbmcgY3g7CiAgICBRQ1N0cmluZyBzdDsKICAgIFFDU3RyaW5nIGNtOwogICAgUVN0cmluZyB0bjsKCiAgICBlbnVtIFRhZyB7IFRhZ19FbmQgPSAxLCBUYWdfU291cmNlVGV4dDE2LCBUYWdfVHJhbnNsYXRpb24sIFRhZ19Db250ZXh0MTYsCgkgICAgICAgVGFnX0hhc2gsIFRhZ19Tb3VyY2VUZXh0LCBUYWdfQ29udGV4dCwgVGFnX0NvbW1lbnQsCgkgICAgICAgVGFnX09ic29sZXRlMSB9Owp9OwoKCmNsYXNzIFFfRVhQT1JUIFFUcmFuc2xhdG9yOiBwdWJsaWMgUU9iamVjdAp7CiAgICBRX09CSkVDVApwdWJsaWM6CiAgICBRVHJhbnNsYXRvciggUU9iamVjdCAqIHBhcmVudCA9IDAsIGNvbnN0IGNoYXIgKiBuYW1lID0gMCApOwogICAgflFUcmFuc2xhdG9yKCk7CgojaWZuZGVmIFFUX05PX0NPTVBBVAogICAgUVN0cmluZyBmaW5kKCBjb25zdCBjaGFyICpjb250ZXh0LCBjb25zdCBjaGFyICpzb3VyY2VUZXh0LCBjb25zdCBjaGFyICogY29tbWVudCA9IDAgKSBjb25zdCB7CglyZXR1cm4gZmluZE1lc3NhZ2UoIGNvbnRleHQsIHNvdXJjZVRleHQsIGNvbW1lbnQgKS50cmFuc2xhdGlvbigpOwogICAgfQojZW5kaWYKICAgIHZpcnR1YWwgUVRyYW5zbGF0b3JNZXNzYWdlIGZpbmRNZXNzYWdlKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKCQkJCQkgICAgY29uc3QgY2hhciAqID0gMCApIGNvbnN0OwoKICAgIGJvb2wgbG9hZCggY29uc3QgUVN0cmluZyAmIGZpbGVuYW1lLAoJICAgICAgIGNvbnN0IFFTdHJpbmcgJiBkaXJlY3RvcnkgPSBRU3RyaW5nOjpudWxsLAoJICAgICAgIGNvbnN0IFFTdHJpbmcgJiBzZWFyY2hfZGVsaW1pdGVycyA9IFFTdHJpbmc6Om51bGwsCgkgICAgICAgY29uc3QgUVN0cmluZyAmIHN1ZmZpeCA9IFFTdHJpbmc6Om51bGwgKTsKICAgIGJvb2wgbG9hZCggY29uc3QgdWNoYXIgKmRhdGEsIGludCBsZW4gKSB7CgljbGVhcigpOwoJcmV0dXJuIGRvX2xvYWQoIGRhdGEsIGxlbiApOwogICAgfQoKICAgIHZvaWQgY2xlYXIoKTsKCiNpZm5kZWYgUVRfTk9fVFJBTlNMQVRJT05fQlVJTERFUgogICAgZW51bSBTYXZlTW9kZSB7IEV2ZXJ5dGhpbmcsIFN0cmlwcGVkIH07CgogICAgYm9vbCBzYXZlKCBjb25zdCBRU3RyaW5nICYgZmlsZW5hbWUsIFNhdmVNb2RlIG1vZGUgPSBFdmVyeXRoaW5nICk7CgogICAgdm9pZCBpbnNlcnQoIGNvbnN0IFFUcmFuc2xhdG9yTWVzc2FnZSYgKTsKICAgIHZvaWQgaW5zZXJ0KCBjb25zdCBjaGFyICpjb250ZXh0LCBjb25zdCBjaGFyICpzb3VyY2VUZXh0LCBjb25zdCBRU3RyaW5nICZ0cmFuc2xhdGlvbiApIHsKCWluc2VydCggUVRyYW5zbGF0b3JNZXNzYWdlKGNvbnRleHQsIHNvdXJjZVRleHQsICIiLCB0cmFuc2xhdGlvbikgKTsKICAgIH0KICAgIHZvaWQgcmVtb3ZlKCBjb25zdCBRVHJhbnNsYXRvck1lc3NhZ2UmICk7CiAgICB2b2lkIHJlbW92ZSggY29uc3QgY2hhciAqY29udGV4dCwgY29uc3QgY2hhciAqc291cmNlVGV4dCApIHsKCXJlbW92ZSggUVRyYW5zbGF0b3JNZXNzYWdlKGNvbnRleHQsIHNvdXJjZVRleHQsICIiKSApOwogICAgfQogICAgYm9vbCBjb250YWlucyggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiBjb21tZW50ID0gMCApIGNvbnN0OwoKICAgIHZvaWQgc3F1ZWV6ZSggU2F2ZU1vZGUgPSBFdmVyeXRoaW5nICk7CiAgICB2b2lkIHVuc3F1ZWV6ZSgpOwoKICAgIFFWYWx1ZUxpc3Q8UVRyYW5zbGF0b3JNZXNzYWdlPiBtZXNzYWdlcygpIGNvbnN0OwojZW5kaWYKCiAgICBib29sIGlzRW1wdHkoKSBjb25zdDsKCnByaXZhdGU6CiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUVRyYW5zbGF0b3IoIGNvbnN0IFFUcmFuc2xhdG9yICYgKTsKICAgIFFUcmFuc2xhdG9yICZvcGVyYXRvcj0oIGNvbnN0IFFUcmFuc2xhdG9yICYgKTsKI2VuZGlmCgogICAgYm9vbCBkb19sb2FkKCBjb25zdCB1Y2hhciAqZGF0YSwgaW50IGxlbiApOwoKICAgIFFUcmFuc2xhdG9yUHJpdmF0ZSAqIGQ7Cn07CgojZW5kaWYgLy8gUVRfTk9fVFJBTlNMQVRJT04KCiNlbmRpZgoAAAAaAHEAdwBpAGQAZwBlAHQAbABpAHMAdAAuAGgAAAjPLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdJREdFVExJU1RfSAojZGVmaW5lIFFXSURHRVRMSVNUX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXdpZGdldC5oIgojaW5jbHVkZSAicXB0cmxpc3QuaCIKI2VuZGlmIC8vIFFUX0gKCmNsYXNzIFFfRVhQT1JUIFFXaWRnZXRMaXN0IDogcHVibGljIFFQdHJMaXN0PFFXaWRnZXQ+CnsKcHVibGljOgogICAgUVdpZGdldExpc3QoKSA6IFFQdHJMaXN0PFFXaWRnZXQ+KCkge30KICAgIFFXaWRnZXRMaXN0KCBjb25zdCBRV2lkZ2V0TGlzdCAmbGlzdCApIDogUVB0ckxpc3Q8UVdpZGdldD4obGlzdCkge30KICAgflFXaWRnZXRMaXN0KCkgeyBjbGVhcigpOyB9CiAgICBRV2lkZ2V0TGlzdCAmb3BlcmF0b3I9KGNvbnN0IFFXaWRnZXRMaXN0ICZsaXN0KQoJeyByZXR1cm4gKFFXaWRnZXRMaXN0JilRUHRyTGlzdDxRV2lkZ2V0Pjo6b3BlcmF0b3I9KGxpc3QpOyB9Cn07CgpjbGFzcyBRX0VYUE9SVCBRV2lkZ2V0TGlzdEl0IDogcHVibGljIFFQdHJMaXN0SXRlcmF0b3I8UVdpZGdldD4KewpwdWJsaWM6CiAgICBRV2lkZ2V0TGlzdEl0KCBjb25zdCBRV2lkZ2V0TGlzdCAmbCApIDogUVB0ckxpc3RJdGVyYXRvcjxRV2lkZ2V0PihsKSB7fQogICAgUVdpZGdldExpc3RJdCAmb3BlcmF0b3I9KGNvbnN0IFFXaWRnZXRMaXN0SXQgJmkpCgl7IHJldHVybiAoUVdpZGdldExpc3RJdCYpUVB0ckxpc3RJdGVyYXRvcjxRV2lkZ2V0Pjo6b3BlcmF0b3I9KGkpOyB9Cn07CgojZW5kaWYgLy8gUVdJREdFVExJU1RfSAoAAAAeAHEAdwBzAGMAdQByAHMAbwByAF8AcQB3AHMALgBoAAAIDS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFXU0NVUlNPUl9RV1NfSAojZGVmaW5lIFFXU0NVUlNPUl9RV1NfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxaW1hZ2UuaCIKI2VuZGlmIC8vIFFUX0gKCmNsYXNzIFFXU0N1cnNvciA6IHB1YmxpYyBRdAp7CnB1YmxpYzoKICAgIFFXU0N1cnNvcigpIHt9CiAgICBRV1NDdXJzb3IoY29uc3QgdWNoYXIgKmRhdGEsIGNvbnN0IHVjaGFyICptYXNrLAogICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgaG90WCwgaW50IGhvdFkpCgl7IHNldChkYXRhLCBtYXNrLCB3aWR0aCwgaGVpZ2h0LCBob3RYLCBob3RZKTsgfQoKICAgIHZvaWQgc2V0KGNvbnN0IHVjaGFyICpkYXRhLCBjb25zdCB1Y2hhciAqbWFzaywKCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBob3RYLCBpbnQgaG90WSk7CgogICAgUVBvaW50IGhvdFNwb3QoKSBjb25zdCB7IHJldHVybiBob3Q7IH0KICAgIFFJbWFnZSAmaW1hZ2UoKSB7IHJldHVybiBjdXJzb3I7IH0KICAgIGNvbnN0IFFSZWdpb24gcmVnaW9uKCkgY29uc3QgeyByZXR1cm4gcmduOyB9CgogICAgc3RhdGljIFFXU0N1cnNvciAqc3lzdGVtQ3Vyc29yKGludCBpZCk7Cgpwcml2YXRlOgogICAgc3RhdGljIHZvaWQgY3JlYXRlU3lzdGVtQ3Vyc29yKCBpbnQgaWQgKTsJCiAgICB2b2lkIGNyZWF0ZURyb3BTaGFkb3coaW50IGRyb3B4LCBpbnQgZHJvcHkpOwoKcHJpdmF0ZToKICAgIFFQb2ludCBob3Q7CiAgICBRSW1hZ2UgY3Vyc29yOwogICAgUVJlZ2lvbiByZ247Cn07CgojZW5kaWYgLy8gUVdTQ1VSU09SX1FXU19ICgAAABAAcQB0AF8AbQBhAGMALgBoAAAtay8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVRfTUFDX0gKI2RlZmluZSBRVF9NQUNfSAoKI3VuZGVmIE9MRF9ERUJVRwojaWZkZWYgREVCVUcKI2RlZmluZSBPTERfREVCVUcgREVCVUcKI3VuZGVmIERFQlVHCiNlbmRpZgojZGVmaW5lIERFQlVHIDAKCiNpZm5kZWYgX19JTUFHRUNBUFRVUkVfXwojZGVmaW5lIF9fSU1BR0VDQVBUVVJFX18KI2VuZGlmCiNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+CiNpbmNsdWRlIDxRdWlja1RpbWUvTW92aWVzLmg+CiN1bmRlZiBRVF9CVUlMRF9LRVkKI2luY2x1ZGUgPHFjb25maWcuaD4gLy9XZSBuZWVkIHRoaXMgdG8gZ2V0IFFUX01BQ09TWF9WRVJTSU9OCiNpbmNsdWRlICJxZ2xvYmFsLmgiCgojaWZkZWYgUV9PU19NQUM5CiMgZGVmaW5lIFFNQUNfREVGQVVMVF9TVFlMRSAiUVBsYXRpbnVtU3R5bGUiIC8vRGVmYXVsdCBzdHlsZQojIGluY2x1ZGUgInF0X21hYzkuaCIKI2VsaWYgZGVmaW5lZChRX09TX01BQ1gpCiMgZGVmaW5lIFFNQUNfREVGQVVMVF9TVFlMRSAiUU1hY1N0eWxlIiAvL0RlZmF1bHRTdHlsZQojZW5kaWYKCiNpZiAhZGVmaW5lZChRX1dTX01BQ1gpIHx8IFFUX01BQ09TWF9WRVJTSU9OIDwgMHgxMDIwIHx8IFFUX01BQ09TWF9WRVJTSU9OID49IDB4MTAzMAojIGRlZmluZSBRTUFDX05PX0ZBS0VDVVJTT1IKI2VuZGlmCgovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLy8jZGVmaW5lIFFNQUNfVVNFX0FQUExJQ0FUSU9OX0VWRU5UX0xPT1AKCiN1bmRlZiBERUJVRwojaWZkZWYgT0xEX0RFQlVHCiNkZWZpbmUgREVCVUcgT0xEX0RFQlVHCiNlbmRpZgojdW5kZWYgT0xEX0RFQlVHCgojaWZkZWYgUV9XU19NQUMKI2luY2x1ZGUgInFwYWludGVyLmgiCiNpbmNsdWRlICJxd2lkZ2V0LmgiCmV4dGVybiBpbnQgbWFjX3dpbmRvd19jb3VudDsgLy9xd2lkZ2V0X21hYy5jcHAKI2lmZGVmIFFUX1RIUkVBRF9TVVBQT1JUCiNpbmNsdWRlICJxdGhyZWFkLmgiCmV4dGVybiBRTXV0ZXggKnF0X21hY19wb3J0X211dGV4OyAvL3FhcHBsaWNhdGlvbl9tYWMuY3BwCiNlbmRpZgoKY2xhc3MgUU1hY0Jsb2NraW5nRnVuY3Rpb24gOiBwdWJsaWMgUU9iamVjdCAvL2RvbmUgaW4gcWFwcGxpY2F0aW9uX21hYy5jcHAKewpwcml2YXRlOgogICAgc3RhdGljIGludCBibG9jazsKcHVibGljOgogICAgUU1hY0Jsb2NraW5nRnVuY3Rpb24oKTsKICAgIH5RTWFjQmxvY2tpbmdGdW5jdGlvbigpIHsgYmxvY2stLTsgfQogICAgc3RhdGljIGJvb2wgYmxvY2tpbmcoKSB7IHJldHVybiBibG9jayAhPSAwOyB9Cgpwcm90ZWN0ZWQ6CiAgICB2b2lkIHRpbWVyRXZlbnQoUVRpbWVyRXZlbnQgKik7Cn07CgpjbGFzcyBRTWFjU2F2ZWRGb250SW5mbyAKewpwcml2YXRlOgogICAgdm9pZCBpbml0KENHcmFmUHRyKTsKcHJvdGVjdGVkOgogICAgc2hvcnQgdGZvbnQsIHRmYWNlOwogICAgaW50IHRzaXplOwpwdWJsaWM6CiAgICBpbmxpbmUgUU1hY1NhdmVkRm9udEluZm8oKSB7IEdXb3JsZFB0ciB3OyBHREhhbmRsZSBoOyBHZXRHV29ybGQoJncsICZoKTsgaW5pdCh3KTsgfQogICAgaW5saW5lIFFNYWNTYXZlZEZvbnRJbmZvKENHcmFmUHRyIHcpIHsgaW5pdCh3KTsgfQogICAgflFNYWNTYXZlZEZvbnRJbmZvKCk7Cn07CgppbmxpbmUgUU1hY1NhdmVkRm9udEluZm86On5RTWFjU2F2ZWRGb250SW5mbygpIAp7CiAgICBpZihtYWNfd2luZG93X2NvdW50KSB7CglUZXh0Rm9udCh0Zm9udCk7CglUZXh0RmFjZSh0ZmFjZSk7CglUZXh0U2l6ZSh0c2l6ZSk7CiAgICB9Cn0KCmlubGluZSB2b2lkIFFNYWNTYXZlZEZvbnRJbmZvOjppbml0KENHcmFmUHRyIHcpIAp7CiAgICBpZihtYWNfd2luZG93X2NvdW50KSB7Cgl0Zm9udCA9IEdldFBvcnRUZXh0Rm9udCh3KTsKCXRmYWNlID0gR2V0UG9ydFRleHRGYWNlKHcpOwoJdHNpemUgPSBHZXRQb3J0VGV4dFNpemUodyk7CiAgICB9Cn0KCmNsYXNzIFFNYWNGb250SW5mbwp7CnB1YmxpYzoKICAgIGlubGluZSBRTWFjRm9udEluZm8oKSA6IGZpX2ZudW0oMCksIGZpX2ZhY2UoMCksIGZpX3NpemUoMCksIGZpX2VuYygwKSwgZmlfYXN0eWxlKDApCgl7IH0KICAgIGlubGluZSB+UU1hY0ZvbnRJbmZvKCkgCgl7IGlmKGZpX2FzdHlsZSAmJiBmaV9hc3R5bGUtPmRlcmVmKCkpIHsKCSAgICBBVFNVRGlzcG9zZVN0eWxlKGZpX2FzdHlsZS0+c3R5bGUpOwoJICAgIGRlbGV0ZSBmaV9hc3R5bGU7Cgl9IH0KICAgIGlubGluZSBRTWFjRm9udEluZm8gJm9wZXJhdG9yPShjb25zdCBRTWFjRm9udEluZm8gJnJocykgewoJc2V0RW5jb2RpbmcocmhzLmVuY29kaW5nKCkpOwoJc2V0Rm9udChyaHMuZm9udCgpKTsKCXNldFN0eWxlKHJocy5zdHlsZSgpKTsKCXNldFNpemUocmhzLnNpemUoKSk7CglpZihyaHMuYXRzdVN0eWxlKCkpIHsKCSAgICByaHMuYXRzdVN0eWxlKCktPnJlZigpOwoJICAgIHNldEFUU1VTdHlsZShyaHMuYXRzdVN0eWxlKCkpOwoJfSBlbHNlIHsKCSAgICBpZihmaV9hc3R5bGUgJiYgZmlfYXN0eWxlLT5kZXJlZigpKSB7CgkJQVRTVURpc3Bvc2VTdHlsZShmaV9hc3R5bGUtPnN0eWxlKTsKCQlkZWxldGUgZmlfYXN0eWxlOwoJICAgIH0KCSAgICBzZXRTdHlsZSgwKTsKCX0KCXJldHVybiAqdGhpczsKICAgIH0KCiAgICBpbmxpbmUgVGV4dEVuY29kaW5nIGVuY29kaW5nKCkgY29uc3QgeyByZXR1cm4gZmlfZW5jOyB9CiAgICBpbmxpbmUgdm9pZCBzZXRFbmNvZGluZyhUZXh0RW5jb2RpbmcgZikgeyBmaV9lbmMgPSBmOyB9CgogICAgaW5saW5lIHNob3J0IGZvbnQoKSBjb25zdCB7IHJldHVybiBmaV9mbnVtOyB9CiAgICBpbmxpbmUgdm9pZCBzZXRGb250KHNob3J0IGYpIHsgZmlfZm51bSA9IGY7IH0KCiAgICBpbmxpbmUgc2hvcnQgc3R5bGUoKSBjb25zdCB7IHJldHVybiBmaV9mYWNlOyB9CiAgICBpbmxpbmUgdm9pZCBzZXRTdHlsZShzaG9ydCBmKSB7IGZpX2ZhY2UgPSBmOyB9CgogICAgaW5saW5lIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gZmlfc2l6ZTsgfQogICAgaW5saW5lIHZvaWQgc2V0U2l6ZShpbnQgZikgeyBmaV9zaXplID0gZjsgfQoKICAgIHN0cnVjdCBRQVRTVVN0eWxlIDogcHVibGljIFFTaGFyZWQgewoJQVRTVVN0eWxlIHN0eWxlOwoJUkdCQ29sb3IgcmdiOwogICAgfTsKICAgIGlubGluZSBRQVRTVVN0eWxlICphdHN1U3R5bGUoKSBjb25zdCB7IHJldHVybiBmaV9hc3R5bGU7IH0KICAgIGlubGluZSB2b2lkIHNldEFUU1VTdHlsZShRQVRTVVN0eWxlICpzKSB7IGZpX2FzdHlsZSA9IHM7IH0KCnByaXZhdGU6CiAgICBzaG9ydCBmaV9mbnVtLCBmaV9mYWNlOwogICAgaW50IGZpX3NpemU7CiAgICBUZXh0RW5jb2RpbmcgZmlfZW5jOwogICAgUUFUU1VTdHlsZSAqZmlfYXN0eWxlOwp9OwoKY2xhc3MgUUZvbnRFbmdpbmU7CmNsYXNzIFFGb250RGVmOwpjbGFzcyBRRm9udFByaXZhdGU7CmNsYXNzIFFNYWNTZXRGb250SW5mbyA6IHB1YmxpYyBRTWFjU2F2ZWRGb250SW5mbywgcHVibGljIFFNYWNGb250SW5mbyAKewpwcml2YXRlOgogICAgc3RhdGljIFFNYWNGb250SW5mbyAqY3JlYXRlRm9udEluZm8oY29uc3QgUUZvbnRFbmdpbmUgKmZlLCBjb25zdCBRRm9udERlZiAqZGVmLCBRUGFpbnREZXZpY2UgKnBkZXYpOwoKcHVibGljOgogICAgLy9jcmVhdGUgdGhpcyBmb3IgdGVtcG9yYXJ5IGZvbnQgc2V0dHRpbmcKICAgIGlubGluZSBRTWFjU2V0Rm9udEluZm8oY29uc3QgUUZvbnRQcml2YXRlICpkLCBRUGFpbnREZXZpY2UgKnBkZXYpIDogUU1hY1NhdmVkRm9udEluZm8oKSwgCgkJCQkJCQkJCVFNYWNGb250SW5mbygpIHsgc2V0TWFjRm9udChkLCB0aGlzLCBwZGV2KTsgfQogICAgaW5saW5lIFFNYWNTZXRGb250SW5mbyhjb25zdCBRRm9udEVuZ2luZSAqZmUsIFFQYWludERldmljZSAqcGRldikgOiBRTWFjU2F2ZWRGb250SW5mbygpLCAKCQkJCQkJCQkJUU1hY0ZvbnRJbmZvKCkgeyBzZXRNYWNGb250KGZlLCB0aGlzLCBwZGV2KTsgfQoKICAgIC8veW91IGNhbiB1c2UgdGhlc2UgdG8gY2F1c2UgZm9udCBzZXR0aW5nLCB3aXRob3V0IHJlc3RvcmluZyBvbGQKICAgIHN0YXRpYyBib29sIHNldE1hY0ZvbnQoY29uc3QgUU1hY0ZvbnRJbmZvICpmLCBRTWFjU2V0Rm9udEluZm8gKnNmaT1OVUxMKTsKICAgIHN0YXRpYyBib29sIHNldE1hY0ZvbnQoY29uc3QgUUZvbnRQcml2YXRlICpkLCBRTWFjU2V0Rm9udEluZm8gKnNmaT1OVUxMLCBRUGFpbnREZXZpY2UgKnBkZXY9TlVMTCk7CiAgICBzdGF0aWMgYm9vbCBzZXRNYWNGb250KGNvbnN0IFFGb250RW5naW5lICpmZSwgUU1hY1NldEZvbnRJbmZvICpzZmk9TlVMTCwgUVBhaW50RGV2aWNlICpwZGV2PU5VTEwpOwp9OwoKCiNpbmNsdWRlICJxcHRybGlzdC5oIgojaW5jbHVkZSAicXBhaW50ZGV2aWNlLmgiCmV4dGVybiBRUGFpbnREZXZpY2UgKnF0X21hY19zYWZlX3BkZXY7IC8vcWFwcGxpY2F0aW9uX21hYy5jcHAKZXh0ZXJuIFFQYWludGVyICpxdF9tYWNfY3VycmVudF9wYWludGVyOyAvL3FwYWludGVyX21hYy5jcHAKY2xhc3MgUU1hY1NhdmVkUG9ydEluZm8KewogICAgUmduSGFuZGxlIGNsaXA7CiAgICBHV29ybGRQdHIgd29ybGQ7CiAgICBHREhhbmRsZSBoYW5kbGU7CiAgICBQZW5TdGF0ZSBwZW47IC8vZ28gcGVubnN0YXRlCiAgICBSR0JDb2xvciBiYWNrLCBmb3JlOwogICAgUU1hY1NhdmVkRm9udEluZm8gKmZpOwogICAgUVBhaW50ZXIgKnBhaW50ZXI7CiAgICBib29sIHZhbGlkX2d3b3JsZDsKICAgIHZvaWQgaW5pdCgpOwogICAgCnB1YmxpYzoKICAgIGlubGluZSBRTWFjU2F2ZWRQb3J0SW5mbygpIHsgaW5pdCgpOyB9CiAgICBpbmxpbmUgUU1hY1NhdmVkUG9ydEluZm8oUVBhaW50RGV2aWNlICpwZCkgeyBpbml0KCk7IHNldFBhaW50RGV2aWNlKHBkKTsgfQogICAgaW5saW5lIFFNYWNTYXZlZFBvcnRJbmZvKFFXaWRnZXQgKncsIGJvb2wgc2V0X2NsaXA9RkFMU0UpIHsgaW5pdCgpOyBzZXRQYWludERldmljZSh3LCBzZXRfY2xpcCk7IH0KICAgIGlubGluZSBRTWFjU2F2ZWRQb3J0SW5mbyhRUGFpbnREZXZpY2UgKnBkLCBjb25zdCBRUmVjdCAmcikgCgl7IGluaXQoKTsgc2V0UGFpbnREZXZpY2UocGQpOyBzZXRDbGlwUmVnaW9uKHIpOyB9CiAgICBpbmxpbmUgUU1hY1NhdmVkUG9ydEluZm8oUVBhaW50RGV2aWNlICpwZCwgY29uc3QgUVJlZ2lvbiAmcikgCgl7IGluaXQoKTsgc2V0UGFpbnREZXZpY2UocGQpOyBzZXRDbGlwUmVnaW9uKHIpOyB9CiAgICB+UU1hY1NhdmVkUG9ydEluZm8oKTsKICAgIHN0YXRpYyBib29sIHNldENsaXBSZWdpb24oY29uc3QgUVJlY3QgJnIpOwogICAgc3RhdGljIGJvb2wgc2V0Q2xpcFJlZ2lvbihjb25zdCBRUmVnaW9uICZyKTsKICAgIHN0YXRpYyBib29sIHNldFBhaW50RGV2aWNlKFFQYWludERldmljZSAqKTsKICAgIHN0YXRpYyBib29sIHNldFBhaW50RGV2aWNlKFFXaWRnZXQgKiwgYm9vbCBzZXRfY2xpcD1GQUxTRSwgYm9vbCB3aXRoX2NoaWxkPVRSVUUpOwogICAgc3RhdGljIGJvb2wgZmx1c2goUVBhaW50RGV2aWNlICopOwogICAgc3RhdGljIGJvb2wgZmx1c2goUVBhaW50RGV2aWNlICosIFFSZWdpb24gciwgYm9vbCBmb3JjZT1GQUxTRSk7CiAgICBzdGF0aWMgdm9pZCBzZXRXaW5kb3dBbHBoYShRV2lkZ2V0ICosIGZsb2F0KTsKfTsKCmlubGluZSBib29sIApRTWFjU2F2ZWRQb3J0SW5mbzo6Zmx1c2goUVBhaW50RGV2aWNlICpwZGV2KSAKewojaWZkZWYgUV9XU19NQUNYCiAgICBpZihwZGV2LT5kZXZUeXBlKCkgPT0gUUludGVybmFsOjpXaWRnZXQpIHsKCVFXaWRnZXQgKncgPSAoUVdpZGdldCAqKXBkZXY7CglpZighdy0+aXNIaWRkZW4oKSAmJiBRRElzUG9ydEJ1ZmZlcmVkKEdldFdpbmRvd1BvcnQoKFdpbmRvd1B0cil3LT5oYW5kbGUoKSkpKSB7CgkgICAgUURGbHVzaFBvcnRCdWZmZXIoR2V0V2luZG93UG9ydCgoV2luZG93UHRyKXctPmhhbmRsZSgpKSwgTlVMTCk7CgkgICAgcmV0dXJuIFRSVUU7Cgl9CiAgICB9IAojZWxzZQogICAgUV9VTlVTRUQocGRldik7CiNlbmRpZgogICAgcmV0dXJuIEZBTFNFOwp9CgppbmxpbmUgYm9vbCAKUU1hY1NhdmVkUG9ydEluZm86OmZsdXNoKFFQYWludERldmljZSAqcGRldiwgUVJlZ2lvbiByLCBib29sIGZvcmNlKSAKewojaWZkZWYgUV9XU19NQUNYCiAgICBpZihwZGV2LT5kZXZUeXBlKCkgPT0gUUludGVybmFsOjpXaWRnZXQpIHsKCVFXaWRnZXQgKncgPSAoUVdpZGdldCAqKXBkZXY7CglyLnRyYW5zbGF0ZSh3LT50b3BMZXZlbFdpZGdldCgpLT5nZW9tZXRyeSgpLngoKSwgdy0+dG9wTGV2ZWxXaWRnZXQoKS0+Z2VvbWV0cnkoKS55KCkpOwoJaWYoIXctPmlzSGlkZGVuKCkgfHwgUURJc1BvcnRCdWZmZXJlZChHZXRXaW5kb3dQb3J0KChXaW5kb3dQdHIpdy0+aGFuZGxlKCkpKSkgewoJICAgIFFERmx1c2hQb3J0QnVmZmVyKEdldFdpbmRvd1BvcnQoKFdpbmRvd1B0cil3LT5oYW5kbGUoKSksIHIuaGFuZGxlKGZvcmNlKSk7CgkgICAgcmV0dXJuIFRSVUU7Cgl9CiAgICB9IAojZWxzZQogICAgUV9VTlVTRUQocGRldik7CiAgICBRX1VOVVNFRChyKTsKICAgIFFfVU5VU0VEKGZvcmNlKTsKI2VuZGlmCiAgICByZXR1cm4gRkFMU0U7Cn0KCiNpZmRlZiBRX1dTX01BQ1gKZXh0ZXJuICJDIiB7CiAgICB0eXBlZGVmIHN0cnVjdCBDR1NDb25uZWN0aW9uICpDR1NDb25uZWN0aW9uUmVmOwogICAgdHlwZWRlZiBzdHJ1Y3QgQ0dTV2luZG93ICpDR1NXaW5kb3dSZWY7CiAgICBleHRlcm4gT1NTdGF0dXMgQ0dTU2V0V2luZG93QWxwaGEoQ0dTQ29ubmVjdGlvblJlZiwgQ0dTV2luZG93UmVmLCBmbG9hdCk7CiAgICBleHRlcm4gQ0dTV2luZG93UmVmIEdldE5hdGl2ZVdpbmRvd0Zyb21XaW5kb3dSZWYoV2luZG93UmVmKTsKICAgIGV4dGVybiBDR1NDb25uZWN0aW9uUmVmIF9DR1NEZWZhdWx0Q29ubmVjdGlvbigpOwp9CiNlbmRpZgppbmxpbmUgdm9pZCAKUU1hY1NhdmVkUG9ydEluZm86OnNldFdpbmRvd0FscGhhKFFXaWRnZXQgKncsIGZsb2F0IGwpCnsKI2lmZGVmIFFfV1NfTUFDWAogICAgQ0dTU2V0V2luZG93QWxwaGEoX0NHU0RlZmF1bHRDb25uZWN0aW9uKCksIAoJCSAgICAgIEdldE5hdGl2ZVdpbmRvd0Zyb21XaW5kb3dSZWYoKFdpbmRvd1JlZil3LT5oYW5kbGUoKSksIGwpOwojZWxzZQogICAgUV9VTlVTRUQodyk7CiAgICBRX1VOVVNFRChsKTsKI2VuZGlmCn0KCmlubGluZSBib29sIApRTWFjU2F2ZWRQb3J0SW5mbzo6c2V0Q2xpcFJlZ2lvbihjb25zdCBRUmVjdCAmcmVjdCkKewogICAgUmVjdCByOwogICAgU2V0UmVjdCgmciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LnJpZ2h0KCkrMSwgcmVjdC5ib3R0b20oKSsxKTsKI2lmIGRlZmluZWQoUVRfVEhSRUFEX1NVUFBPUlQpCiAgICBpZihxdF9tYWNfcG9ydF9tdXRleCkKCXF0X21hY19wb3J0X211dGV4LT5sb2NrKCk7CiNlbmRpZgogICAgcXRfbWFjX2N1cnJlbnRfcGFpbnRlciA9IE5VTEw7CiAgICBDbGlwUmVjdCgmcik7CiNpZiBkZWZpbmVkKFFUX1RIUkVBRF9TVVBQT1JUKQogICAgaWYocXRfbWFjX3BvcnRfbXV0ZXgpCglxdF9tYWNfcG9ydF9tdXRleC0+dW5sb2NrKCk7CiNlbmRpZgogICAgcmV0dXJuIFRSVUU7Cn0KCmlubGluZSBib29sIApRTWFjU2F2ZWRQb3J0SW5mbzo6c2V0Q2xpcFJlZ2lvbihjb25zdCBRUmVnaW9uICZyKQp7CiAgICBpZihyLmlzTnVsbCgpKQoJcmV0dXJuIHNldENsaXBSZWdpb24oUVJlY3QoKSk7CiAgICBlbHNlIGlmKCFyLmhhbmRsZSgpKQoJcmV0dXJuIHNldENsaXBSZWdpb24oci5ib3VuZGluZ1JlY3QoKSk7CiNpZiBkZWZpbmVkKFFUX1RIUkVBRF9TVVBQT1JUKQogICAgaWYocXRfbWFjX3BvcnRfbXV0ZXgpCglxdF9tYWNfcG9ydF9tdXRleC0+bG9jaygpOwojZW5kaWYKICAgIHF0X21hY19jdXJyZW50X3BhaW50ZXIgPSBOVUxMOwogICAgU2V0Q2xpcChyLmhhbmRsZSgpKTsKI2lmIGRlZmluZWQoUVRfVEhSRUFEX1NVUFBPUlQpCiAgICBpZihxdF9tYWNfcG9ydF9tdXRleCkKCXF0X21hY19wb3J0X211dGV4LT51bmxvY2soKTsKI2VuZGlmCiAgICByZXR1cm4gVFJVRTsKfQoKaW5saW5lIGJvb2wKUU1hY1NhdmVkUG9ydEluZm86OnNldFBhaW50RGV2aWNlKFFXaWRnZXQgKncsIGJvb2wgc2V0X2NsaXAsIGJvb2wgd2l0aF9jaGlsZCkgCnsKICAgIGlmKCF3KQoJcmV0dXJuIEZBTFNFOwogICAgaWYoIXNldFBhaW50RGV2aWNlKChRUGFpbnREZXZpY2UgKil3KSkKCXJldHVybiBGQUxTRTsKICAgIGlmKHNldF9jbGlwKSAKCXJldHVybiBzZXRDbGlwUmVnaW9uKHctPmNsaXBwZWRSZWdpb24od2l0aF9jaGlsZCkpOwogICAgcmV0dXJuIFRSVUU7Cn0KCmlubGluZSBib29sClFNYWNTYXZlZFBvcnRJbmZvOjpzZXRQYWludERldmljZShRUGFpbnREZXZpY2UgKnBkKQp7CiAgICBpZighcGQpCglyZXR1cm4gRkFMU0U7CiNpZiAwCiAgICBpZihxdF9tYWNfY3VycmVudF9wYWludGVyICYmIHF0X21hY19jdXJyZW50X3BhaW50ZXItPmhhbmRsZSgpID09IHBkLT5oYW5kbGUoKSkKCXJldHVybiBUUlVFOwojZW5kaWYKICAgIGJvb2wgcmV0ID0gVFJVRTsKI2lmIGRlZmluZWQoUVRfVEhSRUFEX1NVUFBPUlQpCiAgICBpZihxdF9tYWNfcG9ydF9tdXRleCkKCXF0X21hY19wb3J0X211dGV4LT5sb2NrKCk7CiNlbmRpZgovLyAgICBpZihxdF9tYWNfY3VycmVudF9wYWludGVyICYmIHF0X21hY19jdXJyZW50X3BhaW50ZXItPmhhbmRsZSgpICE9IHBkLT5oYW5kbGUoKSkKCXF0X21hY19jdXJyZW50X3BhaW50ZXIgPSBOVUxMOwogICAgaWYocGQtPmRldlR5cGUoKSA9PSBRSW50ZXJuYWw6OldpZGdldCkKCVNldFBvcnRXaW5kb3dQb3J0KChXaW5kb3dQdHIpcGQtPmhhbmRsZSgpKTsKICAgIGVsc2UgaWYocGQtPmRldlR5cGUoKSA9PSBRSW50ZXJuYWw6OlBpeG1hcCB8fCBwZC0+ZGV2VHlwZSgpID09IFFJbnRlcm5hbDo6UHJpbnRlcikKCVNldEdXb3JsZCgoR3JhZlB0cilwZC0+aGFuZGxlKCksIDApOyAvL3NldCB0aGUgZ3dvcmxkCiAgICBlbHNlCglyZXQgPSBGQUxTRTsKI2lmIGRlZmluZWQoUVRfVEhSRUFEX1NVUFBPUlQpCiAgICBpZihxdF9tYWNfcG9ydF9tdXRleCkKCXF0X21hY19wb3J0X211dGV4LT51bmxvY2soKTsKI2VuZGlmCiAgICByZXR1cm4gcmV0Owp9CiAgICAKCmlubGluZSB2b2lkIApRTWFjU2F2ZWRQb3J0SW5mbzo6aW5pdCgpCnsKI2lmIGRlZmluZWQoUVRfVEhSRUFEX1NVUFBPUlQpCiAgICBpZihxdF9tYWNfcG9ydF9tdXRleCkKCXF0X21hY19wb3J0X211dGV4LT5sb2NrKCk7CiNlbmRpZgogICAgZmkgPSBOVUxMOwogICAgcGFpbnRlciA9IHF0X21hY19jdXJyZW50X3BhaW50ZXI7CiAgICBpZihtYWNfd2luZG93X2NvdW50KSB7CiAgIAlHZXRCYWNrQ29sb3IoJmJhY2spOwoJR2V0Rm9yZUNvbG9yKCZmb3JlKTsKCUdldEdXb3JsZCgmd29ybGQsICZoYW5kbGUpOwoJdmFsaWRfZ3dvcmxkID0gVFJVRTsKCWZpID0gbmV3IFFNYWNTYXZlZEZvbnRJbmZvKHdvcmxkKTsKCWNsaXAgPSBOZXdSZ24oKTsKCUdldENsaXAoY2xpcCk7CglHZXRQZW5TdGF0ZSgmcGVuKTsKICAgIH0KfQoKaW5saW5lIFFNYWNTYXZlZFBvcnRJbmZvOjp+UU1hY1NhdmVkUG9ydEluZm8oKQp7CiAgICBpZihtYWNfd2luZG93X2NvdW50KSB7CiAgICAgICAgYm9vbCBzZXRfc3RhdGUgPSBmYWxzZTsKICAgICAgICBpZih2YWxpZF9nd29ybGQpIHsKICAgICAgICAgICAgc2V0X3N0YXRlID0gSXNWYWxpZFBvcnQod29ybGQpOwogICAgICAgICAgICBpZihzZXRfc3RhdGUpCiAgICAgICAgICAgICAgICBTZXRHV29ybGQod29ybGQsaGFuZGxlKTsgLy9hbHdheXMgZG8gdGhpcyBvbmUgZmlyc3QKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXRQYWludERldmljZShxdF9tYWNfc2FmZV9wZGV2KTsKICAgICAgICB9CiAgICAgICAgaWYoc2V0X3N0YXRlKSB7CiAgICAgICAgICAgIFNldENsaXAoY2xpcCk7CiAgICAgICAgICAgIFNldFBlblN0YXRlKCZwZW4pOwogICAgICAgICAgICBSR0JGb3JlQ29sb3IoJmZvcmUpOwogICAgICAgICAgICBSR0JCYWNrQ29sb3IoJmJhY2spOwogICAgICAgIH0KICAgICAgICBEaXNwb3NlUmduKGNsaXApOwogICAgfQogICAgaWYoZmkpCglkZWxldGUgZmk7CiAgICBxdF9tYWNfY3VycmVudF9wYWludGVyID0gcGFpbnRlcjsKI2lmIGRlZmluZWQoUVRfVEhSRUFEX1NVUFBPUlQpCiAgICBpZihxdF9tYWNfcG9ydF9tdXRleCkKICAgICAgICBxdF9tYWNfcG9ydF9tdXRleC0+dW5sb2NrKCk7CiNlbmRpZgp9CgojZW5kaWYgLy9RX1dTX01BQwojZW5kaWYgLy8gUVRfTUFDX0gKAAAAEgBxAHMAdAByAHYAZQBjAC4AaAAACnEvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFTVFJWRUNfSAojZGVmaW5lIFFTVFJWRUNfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxc3RyaW5nLmgiCiNpbmNsdWRlICJxcHRydmVjdG9yLmgiCiNpbmNsdWRlICJxZGF0YXN0cmVhbS5oIgojZW5kaWYgLy8gUVRfSAoKY2xhc3MgUV9FWFBPUlQgUVN0clZlYyA6IHB1YmxpYyBRUHRyVmVjdG9yPGNoYXI+CnsKcHVibGljOgogICAgUVN0clZlYygpICB7IGRjID0gVFJVRTsgfQogICAgUVN0clZlYyggdWludCBzaXplLCBib29sIGRlZXBjID0gVFJVRSApIDogUVB0clZlY3RvcjxjaGFyPihzaXplKSB7ZGM9ZGVlcGM7fQogICB+UVN0clZlYygpICB7IGNsZWFyKCk7IH0KcHJpdmF0ZToKICAgIEl0ZW0JIG5ld0l0ZW0oIEl0ZW0gZCApCXsgcmV0dXJuIGRjID8gcXN0cmR1cCggKGNvbnN0IGNoYXIqKWQgKSA6IGQ7IH0KICAgIHZvaWQgZGVsZXRlSXRlbSggSXRlbSBkICkJeyBpZiAoIGRjICkgZGVsZXRlW10gKGNoYXIqKWQ7IH0KICAgIGludAkgY29tcGFyZUl0ZW1zKCBJdGVtIHMxLCBJdGVtIHMyICkKCQkJCXsgcmV0dXJuIHFzdHJjbXAoKGNvbnN0IGNoYXIqKXMxLAoJCQkJCQkoY29uc3QgY2hhciopczIpOyB9CiNpZm5kZWYgUVRfTk9fREFUQVNUUkVBTQogICAgUURhdGFTdHJlYW0gJnJlYWQoIFFEYXRhU3RyZWFtICZzLCBJdGVtICZkICkKCQkJCXsgcyA+PiAoY2hhciAqJilkOyByZXR1cm4gczsgfQogICAgUURhdGFTdHJlYW0gJndyaXRlKCBRRGF0YVN0cmVhbSAmcywgSXRlbSBkICkgY29uc3QKCQkJCXsgcmV0dXJuIHMgPDwgKGNvbnN0IGNoYXIqKWQ7IH0KI2VuZGlmCiAgICBib29sIGRjOwp9OwoKCmNsYXNzIFFfRVhQT1JUIFFTdHJJVmVjIDogcHVibGljIFFTdHJWZWMJLy8gY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcgdmVjCnsKcHVibGljOgogICAgUVN0cklWZWMoKSB7fQogICAgUVN0cklWZWMoIHVpbnQgc2l6ZSwgYm9vbCBkYyA9IFRSVUUgKSA6IFFTdHJWZWMoIHNpemUsIGRjICkge30KICAgflFTdHJJVmVjKCkgeyBjbGVhcigpOyB9CnByaXZhdGU6CiAgICBpbnQJIGNvbXBhcmVJdGVtcyggSXRlbSBzMSwgSXRlbSBzMiApCgkJCQl7IHJldHVybiBxc3RyaWNtcCgoY29uc3QgY2hhciopczEsCgkJCQkJCSAoY29uc3QgY2hhciopczIpOyB9Cn07CgoKI2VuZGlmIC8vIFFTVFJWRUNfSAoAAAASAHEAdwBpAG4AZABvAHcALgBoAAAGQS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdJTkRPV19ICiNkZWZpbmUgUVdJTkRPV19ICgojZXJyb3IgIlFXaW5kb3cgaGFzIGdvbmUgYXdheSIKCiNlbmRpZiAvLyBRV0lORE9XX0gKAAAADgBxAHUAdQBpAGQALgBoAAAR4i8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFVVUlEX0gKI2RlZmluZSBRVVVJRF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFzdHJpbmcuaCIKI2VuZGlmIC8vIFFUX0gKCiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNpZiBkZWZpbmVkKFFfT1NfV0lOMzIpCiNpZm5kZWYgR1VJRF9ERUZJTkVECiNkZWZpbmUgR1VJRF9ERUZJTkVECnR5cGVkZWYgc3RydWN0IF9HVUlECnsKICAgIHVsb25nICAgRGF0YTE7CiAgICB1c2hvcnQgIERhdGEyOwogICAgdXNob3J0ICBEYXRhMzsKICAgIHVjaGFyICAgRGF0YTRbIDggXTsKfSBHVUlELCAqUkVGR1VJRCwgKkxQR1VJRDsKI2VuZGlmCiNlbmRpZgoKCnN0cnVjdCBRX0VYUE9SVCBRVXVpZAp7CiAgICBlbnVtIFZhcmlhbnQgewoJVmFyVW5rbm93bgk9LTEsCglOQ1MJCT0gMCwgLy8gMCAtIC0KCURDRQkJPSAyLCAvLyAxIDAgLQoJTWljcm9zb2Z0CT0gNiwgLy8gMSAxIDAKCVJlc2VydmVkCT0gNyAgLy8gMSAxIDEKICAgIH07CgogICAgZW51bSBWZXJzaW9uIHsKCVZlclVua25vd24JPS0xLAoJVGltZQkJPSAxLCAvLyAwIDAgMCAxCglFbWJlZGRlZFBPU0lYCT0gMiwgLy8gMCAwIDEgMAoJTmFtZQkJPSAzLCAvLyAwIDAgMSAxCglSYW5kb20JCT0gNCAgLy8gMCAxIDAgMAogICAgfTsKCiAgICBRVXVpZCgpCiAgICB7CgltZW1zZXQoIHRoaXMsIDAsIHNpemVvZihRVXVpZCkgKTsKICAgIH0KICAgIFFVdWlkKCB1aW50IGwsIHVzaG9ydCB3MSwgdXNob3J0IHcyLCB1Y2hhciBiMSwgdWNoYXIgYjIsIHVjaGFyIGIzLCB1Y2hhciBiNCwgdWNoYXIgYjUsIHVjaGFyIGI2LCB1Y2hhciBiNywgdWNoYXIgYjggKQogICAgewoJZGF0YTEgPSBsOwoJZGF0YTIgPSB3MTsKCWRhdGEzID0gdzI7CglkYXRhNFswXSA9IGIxOwoJZGF0YTRbMV0gPSBiMjsKCWRhdGE0WzJdID0gYjM7CglkYXRhNFszXSA9IGI0OwoJZGF0YTRbNF0gPSBiNTsKCWRhdGE0WzVdID0gYjY7CglkYXRhNFs2XSA9IGI3OwoJZGF0YTRbN10gPSBiODsKICAgIH0KICAgIFFVdWlkKCBjb25zdCBRVXVpZCAmdXVpZCApCiAgICB7CgltZW1jcHkoIHRoaXMsICZ1dWlkLCBzaXplb2YoUVV1aWQpICk7CiAgICB9CiNpZm5kZWYgUVRfTk9fUVVVSURfU1RSSU5HCiAgICBRVXVpZCggY29uc3QgUVN0cmluZyAmICk7CiAgICBRVXVpZCggY29uc3QgY2hhciAqICk7CiAgICBRU3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CiAgICBvcGVyYXRvciBRU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gdG9TdHJpbmcoKTsgfQojZW5kaWYKICAgIGJvb2wgaXNOdWxsKCkgY29uc3Q7CgogICAgUVV1aWQgJm9wZXJhdG9yPShjb25zdCBRVXVpZCAmb3JpZyApCiAgICB7CgltZW1jcHkoIHRoaXMsICZvcmlnLCBzaXplb2YoUVV1aWQpICk7CglyZXR1cm4gKnRoaXM7CiAgICB9CgogICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFFVdWlkICZvcmlnICkgY29uc3QKICAgIHsKCXVpbnQgaTsKCWlmICggZGF0YTEgIT0gb3JpZy5kYXRhMSB8fCBkYXRhMiAhPSBvcmlnLmRhdGEyIHx8IAoJICAgICBkYXRhMyAhPSBvcmlnLmRhdGEzICkKCSAgICByZXR1cm4gRkFMU0U7CgoJZm9yKCBpID0gMDsgaSA8IDg7IGkrKyApCgkgICAgaWYgKCBkYXRhNFtpXSAhPSBvcmlnLmRhdGE0W2ldICkKCQlyZXR1cm4gRkFMU0U7CgkKCXJldHVybiBUUlVFOwogICAgfQoKICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBRVXVpZCAmb3JpZyApIGNvbnN0CiAgICB7CglyZXR1cm4gISggKnRoaXMgPT0gb3JpZyApOwogICAgfQoKICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFFVdWlkICZvdGhlciApIGNvbnN0OwogICAgYm9vbCBvcGVyYXRvcj4oY29uc3QgUVV1aWQgJm90aGVyICkgY29uc3Q7CgojaWYgZGVmaW5lZChRX09TX1dJTjMyKQogICAgLy8gT24gV2luZG93cyB3ZSBoYXZlIGEgdHlwZSBHVUlEIHRoYXQgaXMgdXNlZCBieSB0aGUgcGxhdGZvcm0gQVBJLCBzbyB3ZQogICAgLy8gcHJvdmlkZSBjb252ZW5pZW5jZSBvcGVyYXRvcnMgdG8gY2FzdCBmcm9tIGFuZCB0byB0aGlzIHR5cGUuCiAgICBRVXVpZCggY29uc3QgR1VJRCAmZ3VpZCApCiAgICB7CgltZW1jcHkoIHRoaXMsICZndWlkLCBzaXplb2YoR1VJRCkgKTsKICAgIH0KCiAgICBRVXVpZCAmb3BlcmF0b3I9KGNvbnN0IEdVSUQgJm9yaWcgKQogICAgewoJbWVtY3B5KCB0aGlzLCAmb3JpZywgc2l6ZW9mKFFVdWlkKSApOwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIG9wZXJhdG9yIEdVSUQoKSBjb25zdAogICAgewoJR1VJRCBndWlkID0geyBkYXRhMSwgZGF0YTIsIGRhdGEzLCB7IGRhdGE0WzBdLCBkYXRhNFsxXSwgZGF0YTRbMl0sIGRhdGE0WzNdLCBkYXRhNFs0XSwgZGF0YTRbNV0sIGRhdGE0WzZdLCBkYXRhNFs3XSB9IH07CglyZXR1cm4gZ3VpZDsKICAgIH0KCiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IEdVSUQgJmd1aWQgKSBjb25zdAogICAgewoJdWludCBpOwoJaWYgKCBkYXRhMSAhPSBndWlkLkRhdGExIHx8IGRhdGEyICE9IGd1aWQuRGF0YTIgfHwgCgkgICAgIGRhdGEzICE9IGd1aWQuRGF0YTMgKQoJICAgIHJldHVybiBGQUxTRTsKCglmb3IoIGkgPSAwOyBpIDwgODsgaSsrICkKCSAgICBpZiAoIGRhdGE0W2ldICE9IGd1aWQuRGF0YTRbaV0gKQoJCXJldHVybiBGQUxTRTsKCQoJcmV0dXJuIFRSVUU7CiAgICB9CgogICAgYm9vbCBvcGVyYXRvciE9KCBjb25zdCBHVUlEICZndWlkICkgY29uc3QKICAgIHsKCXJldHVybiAhKCAqdGhpcyA9PSBndWlkICk7CiAgICB9CiNlbmRpZgogICAgc3RhdGljIFFVdWlkIGNyZWF0ZVV1aWQoKTsKICAgIFFVdWlkOjpWYXJpYW50IHZhcmlhbnQoKSBjb25zdDsKICAgIFFVdWlkOjpWZXJzaW9uIHZlcnNpb24oKSBjb25zdDsKCiAgICB1aW50ICAgIGRhdGExOwogICAgdXNob3J0ICBkYXRhMjsKICAgIHVzaG9ydCAgZGF0YTM7CiAgICB1Y2hhciAgIGRhdGE0WyA4IF07Cn07CgojaWZuZGVmIFFUX05PX0RBVEFTVFJFQU0KUV9FWFBPUlQgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFVdWlkICYgKTsKUV9FWFBPUlQgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFVdWlkICYgKTsKI2VuZGlmCgojZW5kaWYgLy9RVVVJRF9ICgAAABQAcQB1AHIAbABpAG4AZgBvAC4AaAAAE70vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVVSTElORk9fSAojZGVmaW5lIFFVUkxJTkZPX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicWRhdGV0aW1lLmgiCiNpbmNsdWRlICJxc3RyaW5nLmgiCiNpZiBkZWZpbmVkKFFUX0FCSV9RVDQpCiNpbmNsdWRlICJxaW9kZXZpY2UuaCIKI2VuZGlmCiNlbmRpZiAvLyBRVF9ICgpjbGFzcyBRVXJsT3BlcmF0b3I7CmNsYXNzIFFVcmw7CmNsYXNzIFFVcmxJbmZvUHJpdmF0ZTsKCmNsYXNzIFFfRVhQT1JUIFFVcmxJbmZvCnsKcHVibGljOgogICAgZW51bSBQZXJtaXNzaW9uU3BlYyB7CglSZWFkT3duZXIgPSAwMDQwMCwgV3JpdGVPd25lciA9IDAwMjAwLCBFeGVPd25lciA9IDAwMTAwLAoJUmVhZEdyb3VwID0gMDAwNDAsIFdyaXRlR3JvdXAgPSAwMDAyMCwgRXhlR3JvdXAgPSAwMDAxMCwKCVJlYWRPdGhlciA9IDAwMDA0LCBXcml0ZU90aGVyID0gMDAwMDIsIEV4ZU90aGVyID0gMDAwMDEgfTsKCiAgICBRVXJsSW5mbygpOwogICAgUVVybEluZm8oIGNvbnN0IFFVcmxPcGVyYXRvciAmcGF0aCwgY29uc3QgUVN0cmluZyAmZmlsZSApOwogICAgUVVybEluZm8oIGNvbnN0IFFVcmxJbmZvICZ1aSApOwojaWYgKFFUX1ZFUlNJT04tMCA+PSAweDA0MDAwMCkKI2Vycm9yICJRVXJsSW5mbzo6UVVybEluZm8oKSBzaG91bGQgYWNjZXB0IFFJT0RldmljZTo6T2Zmc2V0IGluc3RlYWQgb2YgdWludCIKI2VsaWYgZGVmaW5lZChRVF9BQklfUVQ0KQogICAgUVVybEluZm8oIGNvbnN0IFFTdHJpbmcgJm5hbWUsIGludCBwZXJtaXNzaW9ucywgY29uc3QgUVN0cmluZyAmb3duZXIsCgkgICAgICBjb25zdCBRU3RyaW5nICZncm91cCwgUUlPRGV2aWNlOjpPZmZzZXQgc2l6ZSwgY29uc3QgUURhdGVUaW1lICZsYXN0TW9kaWZpZWQsCgkgICAgICBjb25zdCBRRGF0ZVRpbWUgJmxhc3RSZWFkLCBib29sIGlzRGlyLCBib29sIGlzRmlsZSwgYm9vbCBpc1N5bUxpbmssCgkgICAgICBib29sIGlzV3JpdGFibGUsIGJvb2wgaXNSZWFkYWJsZSwgYm9vbCBpc0V4ZWN1dGFibGUgKTsKICAgIFFVcmxJbmZvKCBjb25zdCBRVXJsICZ1cmwsIGludCBwZXJtaXNzaW9ucywgY29uc3QgUVN0cmluZyAmb3duZXIsCgkgICAgICBjb25zdCBRU3RyaW5nICZncm91cCwgUUlPRGV2aWNlOjpPZmZzZXQgc2l6ZSwgY29uc3QgUURhdGVUaW1lICZsYXN0TW9kaWZpZWQsCgkgICAgICBjb25zdCBRRGF0ZVRpbWUgJmxhc3RSZWFkLCBib29sIGlzRGlyLCBib29sIGlzRmlsZSwgYm9vbCBpc1N5bUxpbmssCgkgICAgICBib29sIGlzV3JpdGFibGUsIGJvb2wgaXNSZWFkYWJsZSwgYm9vbCBpc0V4ZWN1dGFibGUgKTsKI2Vsc2UKICAgIFFVcmxJbmZvKCBjb25zdCBRU3RyaW5nICZuYW1lLCBpbnQgcGVybWlzc2lvbnMsIGNvbnN0IFFTdHJpbmcgJm93bmVyLAoJICAgICAgY29uc3QgUVN0cmluZyAmZ3JvdXAsIHVpbnQgc2l6ZSwgY29uc3QgUURhdGVUaW1lICZsYXN0TW9kaWZpZWQsCgkgICAgICBjb25zdCBRRGF0ZVRpbWUgJmxhc3RSZWFkLCBib29sIGlzRGlyLCBib29sIGlzRmlsZSwgYm9vbCBpc1N5bUxpbmssCgkgICAgICBib29sIGlzV3JpdGFibGUsIGJvb2wgaXNSZWFkYWJsZSwgYm9vbCBpc0V4ZWN1dGFibGUgKTsKICAgIFFVcmxJbmZvKCBjb25zdCBRVXJsICZ1cmwsIGludCBwZXJtaXNzaW9ucywgY29uc3QgUVN0cmluZyAmb3duZXIsCgkgICAgICBjb25zdCBRU3RyaW5nICZncm91cCwgdWludCBzaXplLCBjb25zdCBRRGF0ZVRpbWUgJmxhc3RNb2RpZmllZCwKCSAgICAgIGNvbnN0IFFEYXRlVGltZSAmbGFzdFJlYWQsIGJvb2wgaXNEaXIsIGJvb2wgaXNGaWxlLCBib29sIGlzU3ltTGluaywKCSAgICAgIGJvb2wgaXNXcml0YWJsZSwgYm9vbCBpc1JlYWRhYmxlLCBib29sIGlzRXhlY3V0YWJsZSApOwojZW5kaWYKICAgIFFVcmxJbmZvICZvcGVyYXRvcj0oIGNvbnN0IFFVcmxJbmZvICZ1aSApOwogICAgdmlydHVhbCB+UVVybEluZm8oKTsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0TmFtZSggY29uc3QgUVN0cmluZyAmbmFtZSApOwogICAgdmlydHVhbCB2b2lkIHNldERpciggYm9vbCBiICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0RmlsZSggYm9vbCBiICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0U3ltTGluayggYm9vbCBiICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0T3duZXIoIGNvbnN0IFFTdHJpbmcgJnMgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRHcm91cCggY29uc3QgUVN0cmluZyAmcyApOwojaWYgKFFUX1ZFUlNJT04tMCA+PSAweDA0MDAwMCkKI2Vycm9yICJRVXJsSW5mbzo6c2V0U2l6ZSgpIHNob3VsZCBhY2NlcHQgUUlPRGV2aWNlOjpPZmZzZXQgaW5zdGVhZCBvZiB1aW50IgojZWxpZiBkZWZpbmVkKFFUX0FCSV9RVDQpCiAgICB2aXJ0dWFsIHZvaWQgc2V0U2l6ZSggUUlPRGV2aWNlOjpPZmZzZXQgc2l6ZSApOwojZWxzZQogICAgdmlydHVhbCB2b2lkIHNldFNpemUoIHVpbnQgc2l6ZSApOwojZW5kaWYKICAgIHZpcnR1YWwgdm9pZCBzZXRXcml0YWJsZSggYm9vbCBiICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0UmVhZGFibGUoIGJvb2wgYiApOwogICAgdmlydHVhbCB2b2lkIHNldFBlcm1pc3Npb25zKCBpbnQgcCApOwogICAgdmlydHVhbCB2b2lkIHNldExhc3RNb2RpZmllZCggY29uc3QgUURhdGVUaW1lICZkdCApOwoKICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwoKICAgIFFTdHJpbmcgbmFtZSgpIGNvbnN0OwogICAgaW50IHBlcm1pc3Npb25zKCkgY29uc3Q7CiAgICBRU3RyaW5nIG93bmVyKCkgY29uc3Q7CiAgICBRU3RyaW5nIGdyb3VwKCkgY29uc3Q7CiNpZiAoUVRfVkVSU0lPTi0wID49IDB4MDQwMDAwKQojZXJyb3IgIlFVcmxJbmZvOjpzaXplKCkgc2hvdWxkIHJldHVybiBRSU9EZXZpY2U6Ok9mZnNldCBpbnN0ZWFkIG9mIHVpbnQiCiNlbGlmIGRlZmluZWQoUVRfQUJJX1FUNCkKICAgIFFJT0RldmljZTo6T2Zmc2V0IHNpemUoKSBjb25zdDsKI2Vsc2UKICAgIHVpbnQgc2l6ZSgpIGNvbnN0OwojZW5kaWYKICAgIFFEYXRlVGltZSBsYXN0TW9kaWZpZWQoKSBjb25zdDsKICAgIFFEYXRlVGltZSBsYXN0UmVhZCgpIGNvbnN0OwogICAgYm9vbCBpc0RpcigpIGNvbnN0OwogICAgYm9vbCBpc0ZpbGUoKSBjb25zdDsKICAgIGJvb2wgaXNTeW1MaW5rKCkgY29uc3Q7CiAgICBib29sIGlzV3JpdGFibGUoKSBjb25zdDsKICAgIGJvb2wgaXNSZWFkYWJsZSgpIGNvbnN0OwogICAgYm9vbCBpc0V4ZWN1dGFibGUoKSBjb25zdDsKCiAgICBzdGF0aWMgYm9vbCBncmVhdGVyVGhhbiggY29uc3QgUVVybEluZm8gJmkxLCBjb25zdCBRVXJsSW5mbyAmaTIsCgkJCSAgICAgaW50IHNvcnRCeSApOwogICAgc3RhdGljIGJvb2wgbGVzc1RoYW4oIGNvbnN0IFFVcmxJbmZvICZpMSwgY29uc3QgUVVybEluZm8gJmkyLAoJCQkgIGludCBzb3J0QnkgKTsKICAgIHN0YXRpYyBib29sIGVxdWFsKCBjb25zdCBRVXJsSW5mbyAmaTEsIGNvbnN0IFFVcmxJbmZvICZpMiwKCQkgICAgICAgaW50IHNvcnRCeSApOwoKICAgIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUVVybEluZm8gJmkgKSBjb25zdDsKcHJpdmF0ZToKICAgIFFVcmxJbmZvUHJpdmF0ZSAqZDsKCn07CgojZW5kaWYKAAAAEgBxAHQAYQBiAGIAYQByAC4AaAAAE/AvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRVEFCQkFSX0gKI2RlZmluZSBRVEFCQkFSX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXdpZGdldC5oIgojaW5jbHVkZSAicXB0cmxpc3QuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fVEFCQkFSCgpjbGFzcyBRVGFiQmFyOwpjbGFzcyBRSWNvblNldDsKCmNsYXNzIFFfRVhQT1JUIFFUYWIgOiBwdWJsaWMgUXQKewogICAgZnJpZW5kIGNsYXNzIFFUYWJCYXI7CiAgICBmcmllbmQgY2xhc3MgUVRhYldpZGdldDsKCnB1YmxpYzoKICAgIFFUYWIoKTsKICAgIHZpcnR1YWwgflFUYWIoKTsKICAgIFFUYWIoIGNvbnN0IFFTdHJpbmcmIHRleHQgKTsKICAgIFFUYWIoIGNvbnN0IFFJY29uU2V0JiBpY29uLCBjb25zdCBRU3RyaW5nJiB0ZXh0ID0gUVN0cmluZzo6bnVsbCApOwoKICAgIHZvaWQgc2V0VGV4dCggY29uc3QgUVN0cmluZyYgdGV4dCk7CiAgICBRU3RyaW5nIHRleHQoKSBjb25zdCB7IHJldHVybiBsYWJlbDsgfQogICAgdm9pZCBzZXRJY29uU2V0KCBjb25zdCBRSWNvblNldCYgaWNvbiApOwogICAgUUljb25TZXQqIGljb25TZXQoKSBjb25zdCB7IHJldHVybiBpY29uc2V0OyB9CiAgICB2b2lkIHNldFJlY3QoIGNvbnN0IFFSZWN0JiByZWN0ICkgeyByID0gcmVjdDsgfQogICAgUVJlY3QgcmVjdCgpIGNvbnN0IHsgcmV0dXJuIHI7IH0KICAgIHZvaWQgc2V0RW5hYmxlZCggYm9vbCBlbmFibGUgKSB7IGVuYWJsZWQgPSBlbmFibGU7IH0KICAgIGJvb2wgaXNFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gZW5hYmxlZDsgfQogICAgdm9pZCBzZXRJZGVudGlmaWVyKCBpbnQgaSApIHsgaWQgPSBpOyB9CiAgICBpbnQgaWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIGlkOyB9Cgpwcml2YXRlOgogICAgdm9pZCBzZXRUYWJCYXIoIFFUYWJCYXIgKnRiICk7CiAgICBRU3RyaW5nIGxhYmVsOwogICAgUVJlY3QgcjsgLy8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGlzIChtYXkgb3ZlcmxhcCB3aXRoIG90aGVycykKICAgIGJvb2wgZW5hYmxlZDsKICAgIGludCBpZDsKICAgIFFJY29uU2V0KiBpY29uc2V0OyAvLyBvcHRpb25hbCBpY29uc2V0CiAgICBRVGFiQmFyICp0YjsKfTsKCgpzdHJ1Y3QgUVRhYlByaXZhdGU7Ci8vY2xhc3MgKlFBY2NlbDsKCmNsYXNzIFFfRVhQT1JUIFFUYWJCYXI6IHB1YmxpYyBRV2lkZ2V0CnsKICAgIFFfT0JKRUNUCiAgICBRX0VOVU1TKCBTaGFwZSApCiAgICBRX1BST1BFUlRZKCBTaGFwZSBzaGFwZSBSRUFEIHNoYXBlIFdSSVRFIHNldFNoYXBlICkKICAgIFFfUFJPUEVSVFkoIGludCBjdXJyZW50VGFiIFJFQUQgY3VycmVudFRhYiBXUklURSBzZXRDdXJyZW50VGFiICkKICAgIFFfUFJPUEVSVFkoIGludCBjb3VudCBSRUFEIGNvdW50ICkKICAgIFFfUFJPUEVSVFkoIGludCBrZXlib2FyZEZvY3VzVGFiIFJFQUQga2V5Ym9hcmRGb2N1c1RhYiApCgpwdWJsaWM6CiAgICBRVGFiQmFyKCBRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wICk7CiAgICB+UVRhYkJhcigpOwoKICAgIGVudW0gU2hhcGUgeyBSb3VuZGVkQWJvdmUsIFJvdW5kZWRCZWxvdywKCQkgVHJpYW5ndWxhckFib3ZlLCBUcmlhbmd1bGFyQmVsb3cgfTsKCiAgICBTaGFwZSBzaGFwZSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFNoYXBlKCBTaGFwZSApOwoKICAgIHZvaWQgc2hvdygpOwoKICAgIHZpcnR1YWwgaW50IGFkZFRhYiggUVRhYiAqICk7CiAgICB2aXJ0dWFsIGludCBpbnNlcnRUYWIoIFFUYWIgKiwgaW50IGluZGV4ID0gLTEgKTsKICAgIHZpcnR1YWwgdm9pZCByZW1vdmVUYWIoIFFUYWIgKiApOwoKICAgIHZpcnR1YWwgdm9pZCBzZXRUYWJFbmFibGVkKCBpbnQsIGJvb2wgKTsKICAgIGJvb2wgaXNUYWJFbmFibGVkKCBpbnQgKSBjb25zdDsKCgogICAgUVNpemUgc2l6ZUhpbnQoKSBjb25zdDsKICAgIFFTaXplIG1pbmltdW1TaXplSGludCgpIGNvbnN0OwoKICAgIGludCBjdXJyZW50VGFiKCkgY29uc3Q7CiAgICBpbnQga2V5Ym9hcmRGb2N1c1RhYigpIGNvbnN0OwoKICAgIFFUYWIgKiB0YWIoIGludCApIGNvbnN0OwogICAgUVRhYiAqIHRhYkF0KCBpbnQgKSBjb25zdDsKICAgIGludCBpbmRleE9mKCBpbnQgKSBjb25zdDsKICAgIGludCBjb3VudCgpIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCBsYXlvdXRUYWJzKCk7CiAgICB2aXJ0dWFsIFFUYWIgKiBzZWxlY3RUYWIoIGNvbnN0IFFQb2ludCAmIHAgKSBjb25zdDsKCiAgICB2b2lkIAlyZW1vdmVUb29sVGlwKCBpbnQgaW5kZXggKTsKICAgIHZvaWQgICAgIAlzZXRUb29sVGlwKCBpbnQgaW5kZXgsIGNvbnN0IFFTdHJpbmcgJiB0aXAgKTsKICAgIFFTdHJpbmcgCXRvb2xUaXAoIGludCBpbmRleCApIGNvbnN0OwoKcHVibGljIHNsb3RzOgogICAgdmlydHVhbCB2b2lkIHNldEN1cnJlbnRUYWIoIGludCApOwogICAgdmlydHVhbCB2b2lkIHNldEN1cnJlbnRUYWIoIFFUYWIgKiApOwoKc2lnbmFsczoKICAgIHZvaWQgc2VsZWN0ZWQoIGludCApOwogICAgdm9pZCBsYXlvdXRDaGFuZ2VkKCk7Cgpwcm90ZWN0ZWQ6CiAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoIFFQYWludGVyICosIFFUYWIgKiwgYm9vbCApIGNvbnN0OyAvLyAjIyMgbm90IGNvbnN0CiAgICB2aXJ0dWFsIHZvaWQgcGFpbnRMYWJlbCggUVBhaW50ZXIqLCBjb25zdCBRUmVjdCYsIFFUYWIqLCBib29sICkgY29uc3Q7CgogICAgdm9pZCBmb2N1c0luRXZlbnQoIFFGb2N1c0V2ZW50ICplICk7CiAgICB2b2lkIGZvY3VzT3V0RXZlbnQoIFFGb2N1c0V2ZW50ICplICk7CgogICAgdm9pZCByZXNpemVFdmVudCggUVJlc2l6ZUV2ZW50ICogKTsKICAgIHZvaWQgcGFpbnRFdmVudCggUVBhaW50RXZlbnQgKiApOwogICAgdm9pZCBtb3VzZVByZXNzRXZlbnQgKCBRTW91c2VFdmVudCAqICk7CiAgICB2b2lkIG1vdXNlTW92ZUV2ZW50ICggUU1vdXNlRXZlbnQgKiApOwogICAgdm9pZCBtb3VzZVJlbGVhc2VFdmVudCAoIFFNb3VzZUV2ZW50ICogKTsKICAgIHZvaWQga2V5UHJlc3NFdmVudCggUUtleUV2ZW50ICogKTsKICAgIHZvaWQgc3R5bGVDaGFuZ2UoIFFTdHlsZSYgKTsKICAgIHZvaWQgZm9udENoYW5nZSAoIGNvbnN0IFFGb250ICYgKTsKCiAgICBib29sIGV2ZW50KCBRRXZlbnQgKmUgKTsKICAgIAogICAgUVB0ckxpc3Q8UVRhYj4gKiB0YWJMaXN0KCk7Cgpwcml2YXRlIHNsb3RzOgogICAgdm9pZCBzY3JvbGxUYWJzKCk7Cgpwcml2YXRlOgogICAgUVB0ckxpc3Q8UVRhYj4gKiBsOwogICAgUVB0ckxpc3Q8UVRhYj4gKiBsc3RhdGljOwogICAgdm9pZCBtYWtlVmlzaWJsZSggUVRhYiogdCA9IDAgKTsKICAgIHZvaWQgdXBkYXRlQXJyb3dCdXR0b25zKCk7CiAgICBRVGFiUHJpdmF0ZSAqIGQ7CgogICAgZnJpZW5kIGNsYXNzIFFUYWJCYXJUb29sVGlwOwogICAgZnJpZW5kIGNsYXNzIFFUYWI7Cgpwcml2YXRlOgkvLyBEaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRVGFiQmFyKCBjb25zdCBRVGFiQmFyICYgKTsKICAgIFFUYWJCYXImIG9wZXJhdG9yPSggY29uc3QgUVRhYkJhciAmICk7CiNlbmRpZgp9OwoKCiNlbmRpZiAvLyBRVF9OT19UQUJCQVIKCiNlbmRpZiAvLyBRVEFCQkFSX0gKAAAAHgBxAHMAdAB5AGwAZQBmAGEAYwB0AG8AcgB5AC4AaAAABxgvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFTVFlMRUZBQ1RPUllfSAojZGVmaW5lIFFTVFlMRUZBQ1RPUllfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxc3RyaW5nbGlzdC5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19TVFlMRQoKY2xhc3MgUVN0cmluZzsKY2xhc3MgUVN0eWxlOwoKY2xhc3MgUV9FWFBPUlQgUVN0eWxlRmFjdG9yeQp7CnB1YmxpYzoKI2lmbmRlZiBRVF9OT19TVFJJTkdMSVNUCiAgICBzdGF0aWMgUVN0cmluZ0xpc3Qga2V5cygpOwojZW5kaWYKICAgIHN0YXRpYyBRU3R5bGUgKmNyZWF0ZSggY29uc3QgUVN0cmluZyYgKTsKfTsKCiNlbmRpZiAvL1FUX05PX1NUWUxFCgojZW5kaWYgLy9RU1RZTEVGQUNUT1JZX0gKAAAAFgBxAHMAcQBsAGkAbgBkAGUAeAAuAGgAAAyXLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRU1FMSU5ERVhfSAojZGVmaW5lIFFTUUxJTkRFWF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFzdHJpbmcuaCIKI2luY2x1ZGUgInFzdHJpbmdsaXN0LmgiCiNpbmNsdWRlICJxc3FsZmllbGQuaCIKI2luY2x1ZGUgInFzcWxyZWNvcmQuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZiAhZGVmaW5lZCggUVRfTU9EVUxFX1NRTCApIHx8IGRlZmluZWQoIFFUX0xJQ0VOU0VfUFJPRkVTU0lPTkFMICkKI2RlZmluZSBRTV9FWFBPUlRfU1FMCiNkZWZpbmUgUU1fVEVNUExBVEVfRVhURVJOX1NRTAojZWxzZQojZGVmaW5lIFFNX0VYUE9SVF9TUUwgUV9FWFBPUlQKI2RlZmluZSBRTV9URU1QTEFURV9FWFRFUk5fU1FMIFFfVEVNUExBVEVfRVhURVJOCiNlbmRpZgoKI2lmbmRlZiBRVF9OT19TUUwKCmNsYXNzIFFTcWxDdXJzb3I7CgpjbGFzcyBRTV9FWFBPUlRfU1FMIFFTcWxJbmRleCA6IHB1YmxpYyBRU3FsUmVjb3JkCnsKcHVibGljOgogICAgUVNxbEluZGV4KCBjb25zdCBRU3RyaW5nJiBjdXJzb3JOYW1lID0gUVN0cmluZzo6bnVsbCwgY29uc3QgUVN0cmluZyYgbmFtZSA9IFFTdHJpbmc6Om51bGwgKTsKICAgIFFTcWxJbmRleCggY29uc3QgUVNxbEluZGV4JiBvdGhlciApOwogICAgflFTcWxJbmRleCgpOwogICAgUVNxbEluZGV4JiAgICAgICBvcGVyYXRvcj0oIGNvbnN0IFFTcWxJbmRleCYgb3RoZXIgKTsKICAgIHZpcnR1YWwgdm9pZCAgICAgc2V0Q3Vyc29yTmFtZSggY29uc3QgUVN0cmluZyYgY3Vyc29yTmFtZSApOwogICAgUVN0cmluZyAgICAgICAgICBjdXJzb3JOYW1lKCkgY29uc3QgeyByZXR1cm4gY3Vyc29yOyB9CiAgICB2aXJ0dWFsIHZvaWQgICAgIHNldE5hbWUoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKTsKICAgIFFTdHJpbmcgICAgICAgICAgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5tOyB9CgogICAgdm9pZCAgICAgICAgICAgICBhcHBlbmQoIGNvbnN0IFFTcWxGaWVsZCYgZmllbGQgKTsKICAgIHZpcnR1YWwgdm9pZCAgICAgYXBwZW5kKCBjb25zdCBRU3FsRmllbGQmIGZpZWxkLCBib29sIGRlc2MgKTsKCiAgICBib29sICAgICAgICAgICAgIGlzRGVzY2VuZGluZyggaW50IGkgKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCAgICAgc2V0RGVzY2VuZGluZyggaW50IGksIGJvb2wgZGVzYyApOwoKICAgIFFTdHJpbmcgICAgICAgICAgdG9TdHJpbmcoIGNvbnN0IFFTdHJpbmcmIHByZWZpeCA9IFFTdHJpbmc6Om51bGwsCgkJCSAgICAgICBjb25zdCBRU3RyaW5nJiBzZXAgPSAiLCIsCgkJCSAgICAgICBib29sIHZlcmJvc2UgPSBUUlVFICkgY29uc3Q7CiAgICBRU3RyaW5nTGlzdCAgICAgIHRvU3RyaW5nTGlzdCggY29uc3QgUVN0cmluZyYgcHJlZml4ID0gUVN0cmluZzo6bnVsbCwKCQkJCSAgIGJvb2wgdmVyYm9zZSA9IFRSVUUgKSBjb25zdDsKCiAgICBzdGF0aWMgUVNxbEluZGV4IGZyb21TdHJpbmdMaXN0KCBjb25zdCBRU3RyaW5nTGlzdCYgbCwgY29uc3QgUVNxbEN1cnNvciogY3Vyc29yICk7Cgpwcml2YXRlOgogICAgUVN0cmluZyAgICAgICAgICBjcmVhdGVGaWVsZCggaW50IGksIGNvbnN0IFFTdHJpbmcmIHByZWZpeCwgYm9vbCB2ZXJib3NlICkgY29uc3Q7CiAgICBRU3RyaW5nICAgICAgICAgIGN1cnNvcjsKICAgIFFTdHJpbmcgICAgICAgICAgbm07CiAgICBRVmFsdWVMaXN0PGJvb2w+IHNvcnRzOwp9OwoKI2RlZmluZSBRX0RFRklORURfUVNRTElOREVYCiNpbmNsdWRlICJxd2luZXhwb3J0LmgiCiNlbmRpZgkvLyBRVF9OT19TUUwKI2VuZGlmCgAAADQAcQB3AHMAdwBpAG4AZABvAHcAcwBkAGUAYwBvAHIAYQB0AGkAbwBuAF8AcQB3AHMALgBoAAAIoC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdTV0lORE9XU0RFQ09SQVRJT05fUVdTX0gKI2RlZmluZSBRV1NXSU5ET1dTREVDT1JBVElPTl9RV1NfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxd3NkZWZhdWx0ZGVjb3JhdGlvbl9xd3MuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fUVdTX1dJTkRPV1NfV01fU1RZTEUKCgpjbGFzcyBRV1NXaW5kb3dzRGVjb3JhdGlvbiA6IHB1YmxpYyBRV1NEZWZhdWx0RGVjb3JhdGlvbgp7CnB1YmxpYzoKICAgIFFXU1dpbmRvd3NEZWNvcmF0aW9uKCk7CiAgICB2aXJ0dWFsIH5RV1NXaW5kb3dzRGVjb3JhdGlvbigpOwoKICAgIHZpcnR1YWwgUVJlZ2lvbiByZWdpb24oY29uc3QgUVdpZGdldCAqLCBjb25zdCBRUmVjdCAmcmVjdCwgUmVnaW9uKTsKICAgIHZpcnR1YWwgdm9pZCBwYWludChRUGFpbnRlciAqLCBjb25zdCBRV2lkZ2V0ICopOwogICAgdmlydHVhbCB2b2lkIHBhaW50QnV0dG9uKFFQYWludGVyICosIGNvbnN0IFFXaWRnZXQgKiwgUmVnaW9uLCBpbnQgc3RhdGUpOwpwcm90ZWN0ZWQ6CiAgICB2aXJ0dWFsIGludCBnZXRUaXRsZVdpZHRoKGNvbnN0IFFXaWRnZXQgKik7Ci8vICAgIHZpcnR1YWwgaW50IGdldFRpdGxlSGVpZ2h0KGNvbnN0IFFXaWRnZXQgKik7CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiptZW51UGl4bWFwKCk7CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKipjbG9zZVBpeG1hcCgpOwogICAgdmlydHVhbCBjb25zdCBjaGFyICoqbWluaW1pemVQaXhtYXAoKTsKICAgIHZpcnR1YWwgY29uc3QgY2hhciAqKm1heGltaXplUGl4bWFwKCk7CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKipub3JtYWxpemVQaXhtYXAoKTsKfTsKCiNlbmRpZiAvLyBRVF9OT19RV1NfV0lORE9XU19XTV9TVFlMRQoKI2VuZGlmIC8vIFFXU1dJTkRPV1NERUNPUkFUSU9OX1FXU19ICgAAABIAcQB2AGUAYwB0AG8AcgAuAGgAAARELyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNpZm5kZWYgUVZFQ1RPUl9ICiNkZWZpbmUgUVZFQ1RPUl9ICiNpZm5kZWYgUVRfTk9fQ09NUEFUCiNpbmNsdWRlICJxcHRydmVjdG9yLmgiCiNlbmRpZgojZW5kaWYKAAAAIABxAHcAcwBkAGkAcwBwAGwAYQB5AF8AcQB3AHMALgBoAAARui8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdTRElTUExBWV9RV1NfSAojZGVmaW5lIFFXU0RJU1BMQVlfUVdTX0gKCiNpbmNsdWRlICJxb2JqZWN0LmgiCiNpbmNsdWRlICJxcmVnaW9uLmgiCiNpbmNsdWRlICJwcml2YXRlL3Fsb2NrX3AuaCIKI2luY2x1ZGUgInF3aW5kb3dkZWZzLmgiCgojaW5jbHVkZSAicXB0cmxpc3QuaCIKCi8vIENsYXNzIGZvcndhcmQgZGVmaW5pdGlvbnMKY2xhc3MgUVdTUmVnaW9uTWFuYWdlcjsKY2xhc3MgUVdTRXZlbnQ7CmNsYXNzIFFXU01vdXNlRXZlbnQ7CmNsYXNzIFFXU1FDb3BNZXNzYWdlRXZlbnQ7CmNsYXNzIFFHZng7CgpjbGFzcyBRV1NXaW5kb3dJbmZvCnsKCnB1YmxpYzoKCiAgICBpbnQgd2luaWQ7CiAgICB1bnNpZ25lZCBpbnQgY2xpZW50aWQ7CiAgICBRU3RyaW5nIG5hbWU7Cgp9OwoKI2RlZmluZSBRVF9RV1NfUFJPUEVSVFlfQ09OVkVSVFNFTEVDVElPTiA5OTkKI2RlZmluZSBRVF9RV1NfUFJPUEVSVFlfV0lORE9XTkFNRSA5OTgKCmNsYXNzIFFXU0Rpc3BsYXkKewpwdWJsaWM6CiAgICBRV1NEaXNwbGF5KCk7CiAgICB+UVdTRGlzcGxheSgpOwoKICAgIGJvb2wgZXZlbnRQZW5kaW5nKCkgY29uc3Q7CiAgICBRV1NFdmVudCAqZ2V0RXZlbnQoKTsKICAgIFFHZnggKiBzY3JlZW5HZngoKTsKICAgIFFXU1JlZ2lvbk1hbmFnZXIgKnJlZ2lvbk1hbmFnZXIoKSBjb25zdDsKCiAgICB1Y2hhciogZnJhbWVCdWZmZXIoKSBjb25zdDsKICAgIGludCB3aWR0aCgpIGNvbnN0OwogICAgaW50IGhlaWdodCgpIGNvbnN0OwogICAgaW50IGRlcHRoKCkgY29uc3Q7CiAgICBpbnQgcGl4bWFwRGVwdGgoKSBjb25zdDsKICAgIGJvb2wgc3VwcG9ydHNEZXB0aChpbnQpIGNvbnN0OwoKICAgIHVjaGFyICpzaGFyZWRSYW0oKSBjb25zdDsKICAgIGludCBzaGFyZWRSYW1TaXplKCkgY29uc3Q7CgogICAgdm9pZCBhZGRQcm9wZXJ0eSggaW50IHdpbklkLCBpbnQgcHJvcGVydHkgKTsKICAgIHZvaWQgc2V0UHJvcGVydHkoIGludCB3aW5JZCwgaW50IHByb3BlcnR5LCBpbnQgbW9kZSwgY29uc3QgUUJ5dGVBcnJheSAmZGF0YSApOwogICAgdm9pZCBzZXRQcm9wZXJ0eSggaW50IHdpbklkLCBpbnQgcHJvcGVydHksIGludCBtb2RlLCBjb25zdCBjaGFyICogZGF0YSApOwogICAgdm9pZCByZW1vdmVQcm9wZXJ0eSggaW50IHdpbklkLCBpbnQgcHJvcGVydHkgKTsKICAgIGJvb2wgZ2V0UHJvcGVydHkoIGludCB3aW5JZCwgaW50IHByb3BlcnR5LCBjaGFyIComZGF0YSwgaW50ICZsZW4gKTsKCiAgICBRUHRyTGlzdDxRV1NXaW5kb3dJbmZvPiAqIHdpbmRvd0xpc3QoKTsKCiAgICB2b2lkIHNldElkZW50aXR5KGNvbnN0IFFTdHJpbmcgJmFwcE5hbWUpOwogICAgdm9pZCBuYW1lUmVnaW9uKCBpbnQgd2luSWQsIGNvbnN0IFFTdHJpbmcmIG4sIGNvbnN0IFFTdHJpbmcgJmMgKTsKICAgIHZvaWQgcmVxdWVzdFJlZ2lvbiggaW50IHdpbklkLCBRUmVnaW9uICk7CiAgICB2b2lkIG1vdmVSZWdpb24oIGludCB3aW5JZCwgaW50IGR4LCBpbnQgZHkgKTsKICAgIHZvaWQgZGVzdHJveVJlZ2lvbiggaW50IHdpbklkICk7CiAgICB2b2lkIHJlcXVlc3RGb2N1cyhpbnQgd2luSWQsIGJvb2wgZ2V0KTsKICAgIHZvaWQgc2V0QWx0aXR1ZGUoIGludCB3aW5JZCwgaW50IGFsdGl0dWRlLCBib29sIGZpeGVkID0gRkFMU0UgKTsKICAgIGludCB0YWtlSWQoKTsKICAgIHZvaWQgc2V0U2VsZWN0aW9uT3duZXIoIGludCB3aW5JZCwgY29uc3QgUVRpbWUgJnRpbWUgKTsKICAgIHZvaWQgY29udmVydFNlbGVjdGlvbiggaW50IHdpbklkLCBpbnQgc2VsZWN0aW9uUHJvcGVydHksIGNvbnN0IFFTdHJpbmcgJm1pbWVUeXBlcyApOwogICAgdm9pZCBkZWZpbmVDdXJzb3IoaW50IGlkLCBjb25zdCBRQml0bWFwICZjdXJzLCBjb25zdCBRQml0bWFwICZtYXNrLAoJCQlpbnQgaG90WCwgaW50IGhvdFkpOwogICAgdm9pZCBzZWxlY3RDdXJzb3IoIFFXaWRnZXQgKncsIHVuc2lnbmVkIGludCBpZCApOwogICAgdm9pZCBncmFiTW91c2UoIFFXaWRnZXQgKncsIGJvb2wgZ3JhYiApOwogICAgdm9pZCBncmFiS2V5Ym9hcmQoIFFXaWRnZXQgKncsIGJvb2wgZ3JhYiApOwogICAgdm9pZCBwbGF5U291bmRGaWxlKCBjb25zdCBRU3RyaW5nJiApOwogICAgdm9pZCByZWdpc3RlckNoYW5uZWwoIGNvbnN0IFFDU3RyaW5nJiBjaGFubmVsICk7CiAgICB2b2lkIHNlbmRNZXNzYWdlKGNvbnN0IFFDU3RyaW5nICZjaGFubmVsLCBjb25zdCBRQ1N0cmluZyAmbXNnLAoJCSAgICAgICBjb25zdCBRQnl0ZUFycmF5ICZkYXRhICk7CiNpZm5kZWYgUVRfTk9fUVdTX1JFUEVBVEVSCiAgICB2b2lkIHJlcGFpbnRSZWdpb24oUVJlZ2lvbiAmKTsKI2VuZGlmCiNpZm5kZWYgUVRfTk9fUVdTX0lNCiAgICB2b2lkIHNldE1pY3JvRm9jdXMoIGludCB4LCBpbnQgeSApOwogICAgdm9pZCByZXNldElNKCk7CiNlbmRpZgogICAgUVdTUUNvcE1lc3NhZ2VFdmVudCogd2FpdEZvclFDb3BSZXNwb25zZSgpOwoKICAgIHZvaWQgc2V0Q2FwdGlvbiggUVdpZGdldCAqdywgY29uc3QgUVN0cmluZyAmICk7CgogICAgLy8gTG9jayBkaXNwbGF5IGZvciBhY2Nlc3Mgb25seSBieSB0aGlzIHByb2Nlc3MKICAgIHN0YXRpYyBib29sIGluaXRMb2NrKCBjb25zdCBRU3RyaW5nICZmaWxlbmFtZSwgYm9vbCBjcmVhdGUgPSBGQUxTRSApOwogICAgc3RhdGljIGJvb2wgZ3JhYmJlZCgpIHsgcmV0dXJuIGxvY2stPmxvY2tlZCgpOyB9CiAgICBzdGF0aWMgdm9pZCBncmFiKCkgeyBsb2NrLT5sb2NrKCBRTG9jazo6UmVhZCApOyB9CiAgICBzdGF0aWMgdm9pZCBncmFiKCBib29sIHdyaXRlICkKCXsgbG9jay0+bG9jayggd3JpdGUgPyBRTG9jazo6V3JpdGUgOiBRTG9jazo6UmVhZCApOyB9CiAgICBzdGF0aWMgdm9pZCB1bmdyYWIoKSB7IGxvY2stPnVubG9jaygpOyB9CgojaWZkZWYgUVRfUVdTX0RZTkFNSUNfVFJBTlNGT1JNQVRJT04KICAgIHN0YXRpYyB2b2lkIHNldFRyYW5zZm9ybWF0aW9uKCBpbnQgdCApOwojZW5kaWYKICAgIHN0YXRpYyB2b2lkIHNldFJhd01vdXNlRXZlbnRGaWx0ZXIoIHZvaWQgKCpmaWx0ZXIpKFFXU01vdXNlRXZlbnQgKikgKTsKCnByaXZhdGU6CiAgICBmcmllbmQgY2xhc3MgUUFwcGxpY2F0aW9uOwogICAgZnJpZW5kIGNsYXNzIFFDb3BDaGFubmVsOwogICAgY2xhc3MgRGF0YTsKICAgIERhdGEgKmQ7CgogICAgaW50IGdldFByb3BlcnR5TGVuOwogICAgY2hhciAqZ2V0UHJvcGVydHlEYXRhOwogICAgc3RhdGljIFFMb2NrICpsb2NrOwp9OwoKZXh0ZXJuIFFXU0Rpc3BsYXkgKnF0X2ZiZHB5OwoKI2VuZGlmIC8vIFFXU0RJU1BMQVlfUVdTX0gKAAAAHgBxAHcAcwBzAG8AYwBrAGUAdABfAHEAdwBzAC4AaAAACPQvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRV1NTT0NLRVRfUVdTX0gKI2RlZmluZSBRV1NTT0NLRVRfUVdTX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXNvY2tldC5oIgojaW5jbHVkZSAicXNlcnZlcnNvY2tldC5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19RV1NfTVVMVElQUk9DRVNTCgpjbGFzcyBRV1NTb2NrZXQgOiBwdWJsaWMgUVNvY2tldAp7CiAgICBRX09CSkVDVApwdWJsaWM6CiAgICBRV1NTb2NrZXQoIFFPYmplY3QgKnBhcmVudD0wLCBjb25zdCBjaGFyICpuYW1lPTAgKTsKICAgflFXU1NvY2tldCgpOwoJICAgICAgICAKICAgIHZpcnR1YWwgdm9pZCBjb25uZWN0VG9Mb2NhbEZpbGUoIGNvbnN0IFFTdHJpbmcgJmZpbGUgKTsKCnByaXZhdGU6ICAgICAgICAvLyBEaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRV1NTb2NrZXQoIGNvbnN0IFFXU1NvY2tldCAmICk7CiAgICBRV1NTb2NrZXQgJm9wZXJhdG9yPSggY29uc3QgUVdTU29ja2V0ICYgKTsKI2VuZGlmCn07CgoKY2xhc3MgUVdTU2VydmVyU29ja2V0IDogcHVibGljIFFTZXJ2ZXJTb2NrZXQKewogICAgUV9PQkpFQ1QKcHVibGljOgogICAgUVdTU2VydmVyU29ja2V0KCBjb25zdCBRU3RyaW5nJiBmaWxlLCBpbnQgYmFja2xvZyA9IDAsCgkJICAgICBRT2JqZWN0ICpwYXJlbnQ9MCwgY29uc3QgY2hhciAqbmFtZT0wICk7CiAgIH5RV1NTZXJ2ZXJTb2NrZXQoKTsKCnByaXZhdGU6ICAgICAgICAvLyBEaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRV1NTZXJ2ZXJTb2NrZXQoIGNvbnN0IFFXU1NlcnZlclNvY2tldCAmICk7CiAgICBRV1NTZXJ2ZXJTb2NrZXQgJm9wZXJhdG9yPSggY29uc3QgUVdTU2VydmVyU29ja2V0ICYgKTsKI2VuZGlmCn07CgojZW5kaWYgLy8gUVRfTk9fUVdTX01VTFRJUFJPQ0VTUwoKI2VuZGlmIC8vIFFXU1NPQ0tFVF9RV1NfSAoAAAAUAHEAcwB0AHIAbABpAHMAdAAuAGgAAA0QLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFTVFJMSVNUX0gKI2RlZmluZSBRU1RSTElTVF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFzdHJpbmcuaCIKI2luY2x1ZGUgInFwdHJsaXN0LmgiCiNpbmNsdWRlICJxZGF0YXN0cmVhbS5oIgojZW5kaWYgLy8gUVRfSAoKI2lmIGRlZmluZWQoUV9RRE9DKQpjbGFzcyBRU3RyTGlzdEl0ZXJhdG9yIDogcHVibGljIFFQdHJMaXN0SXRlcmF0b3I8Y2hhcj4Kewp9OwojZWxzZQp0eXBlZGVmIFFQdHJMaXN0SXRlcmF0b3I8Y2hhcj4gUVN0ckxpc3RJdGVyYXRvcjsKI2VuZGlmCgpjbGFzcyBRX0VYUE9SVCBRU3RyTGlzdCA6IHB1YmxpYyBRUHRyTGlzdDxjaGFyPgp7CnB1YmxpYzoKICAgIFFTdHJMaXN0KCBib29sIGRlZXBDb3BpZXM9VFJVRSApIHsgZGMgPSBkZWVwQ29waWVzOyBkZWxfaXRlbSA9IGRlZXBDb3BpZXM7IH0KICAgIFFTdHJMaXN0KCBjb25zdCBRU3RyTGlzdCAmICk7CiAgICB+UVN0ckxpc3QoKQkJCXsgY2xlYXIoKTsgfQogICAgUVN0ckxpc3QmIG9wZXJhdG9yPSggY29uc3QgUVN0ckxpc3QgJiApOwoKcHJpdmF0ZToKICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVtIG5ld0l0ZW0oIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGQgKSB7IHJldHVybiBkYyA/IHFzdHJkdXAoIChjb25zdCBjaGFyKilkICkgOiBkOyB9CiAgICB2b2lkIGRlbGV0ZUl0ZW0oIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGQgKSB7IGlmICggZGVsX2l0ZW0gKSBkZWxldGVbXSAoY2hhciopZDsgfQogICAgaW50IGNvbXBhcmVJdGVtcyggUVB0ckNvbGxlY3Rpb246Okl0ZW0gczEsIFFQdHJDb2xsZWN0aW9uOjpJdGVtIHMyICkgeyByZXR1cm4gcXN0cmNtcCgoY29uc3QgY2hhciopczEsCgkJCQkJCQkgKGNvbnN0IGNoYXIqKXMyKTsgfQojaWZuZGVmIFFUX05PX0RBVEFTVFJFQU0KICAgIFFEYXRhU3RyZWFtICZyZWFkKCBRRGF0YVN0cmVhbSAmcywgUVB0ckNvbGxlY3Rpb246Okl0ZW0gJmQgKQoJCQkJeyBzID4+IChjaGFyIComKWQ7IHJldHVybiBzOyB9CiAgICBRRGF0YVN0cmVhbSAmd3JpdGUoIFFEYXRhU3RyZWFtICZzLCBRUHRyQ29sbGVjdGlvbjo6SXRlbSBkICkgY29uc3QKCQkJCXsgcmV0dXJuIHMgPDwgKGNvbnN0IGNoYXIgKilkOyB9CiNlbmRpZgogICAgYm9vbCAgZGM7Cn07CgoKY2xhc3MgUV9FWFBPUlQgUVN0cklMaXN0IDogcHVibGljIFFTdHJMaXN0CS8vIGNhc2UgaW5zZW5zaXRpdmUgc3RyaW5nIGxpc3QKewpwdWJsaWM6CiAgICBRU3RySUxpc3QoIGJvb2wgZGVlcENvcGllcz1UUlVFICkgOiBRU3RyTGlzdCggZGVlcENvcGllcyApIHt9CiAgICB+UVN0cklMaXN0KCkJCQl7IGNsZWFyKCk7IH0KcHJpdmF0ZToKICAgIGludAkgIGNvbXBhcmVJdGVtcyggUVB0ckNvbGxlY3Rpb246Okl0ZW0gczEsIFFQdHJDb2xsZWN0aW9uOjpJdGVtIHMyICkKCQkJCXsgcmV0dXJuIHFzdHJpY21wKChjb25zdCBjaGFyKilzMSwKCQkJCQkJICAgIChjb25zdCBjaGFyKilzMik7IH0KfTsKCgppbmxpbmUgUVN0ckxpc3QgJiBRU3RyTGlzdDo6b3BlcmF0b3I9KCBjb25zdCBRU3RyTGlzdCAmc3RyTGlzdCApCnsKICAgIGNsZWFyKCk7CiAgICBkYyA9IHN0ckxpc3QuZGM7CiAgICBkZWxfaXRlbSA9IGRjOwogICAgUVB0ckxpc3Q8Y2hhcj46Om9wZXJhdG9yPSggc3RyTGlzdCApOwogICAgcmV0dXJuICp0aGlzOwp9CgppbmxpbmUgUVN0ckxpc3Q6OlFTdHJMaXN0KCBjb25zdCBRU3RyTGlzdCAmc3RyTGlzdCApCiAgICA6IFFQdHJMaXN0PGNoYXI+KCBzdHJMaXN0ICkKewogICAgZGMgPSBGQUxTRTsKICAgIG9wZXJhdG9yPSggc3RyTGlzdCApOwp9CgojZW5kaWYgLy8gUVNUUkxJU1RfSAoAAAAcAHEAdgBhAGwAdQBlAHYAZQBjAHQAbwByAC4AaAAAMCUvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFWQUxVRVZFQ1RPUl9ICiNkZWZpbmUgUVZBTFVFVkVDVE9SX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXRsLmgiCiNpbmNsdWRlICJxc2hhcmVkLmgiCiNpbmNsdWRlICJxZGF0YXN0cmVhbS5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19TVEwKI2luY2x1ZGUgPHZlY3Rvcj4KI2VuZGlmCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgUVZhbHVlVmVjdG9yUHJpdmF0ZSA6IHB1YmxpYyBRU2hhcmVkCnsKcHVibGljOgogICAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CiAgICB0eXBlZGVmIFQqIHBvaW50ZXI7CgogICAgUVZhbHVlVmVjdG9yUHJpdmF0ZSgpCgk6IHN0YXJ0KCAwICksIGZpbmlzaCggMCApLCBlbmQoIDAgKQogICAgewogICAgfQoKICAgIFFWYWx1ZVZlY3RvclByaXZhdGUoIGNvbnN0IFFWYWx1ZVZlY3RvclByaXZhdGU8VD4mIHggKTsKICAgIFFWYWx1ZVZlY3RvclByaXZhdGUoIHNpemVfdCBzaXplICk7CgogICAgdm9pZCBkZXJlZkFuZERlbGV0ZSgpIC8vIHdvcmstYXJvdW5kIGZvciBocC1jYwogICAgewoJaWYgKCBkZXJlZigpICkKCSAgICBkZWxldGUgdGhpczsKICAgIH0KCiNpZiBkZWZpbmVkKFFfVEVNUExBVEVETEwpCiAgICAvLyBXb3JrYXJvdW5kIE1TIGJ1ZyBpbiBtZW1vcnkgZGUvYWxsb2NhdGlvbiBpbiBETEwgdnMuIEVYRQogICAgdmlydHVhbAojZW5kaWYKICAgIH5RVmFsdWVWZWN0b3JQcml2YXRlKCkKICAgIHsKCWRlbGV0ZVtdIHN0YXJ0OwogICAgfQoKICAgIHNpemVfdCBzaXplKCkgY29uc3QKICAgIHsKCXJldHVybiBmaW5pc2ggLSBzdGFydDsKICAgIH0KCiAgICBib29sIGVtcHR5KCkgY29uc3QKICAgIHsKCXJldHVybiBzdGFydCA9PSBmaW5pc2g7CiAgICB9CgogICAgc2l6ZV90IGNhcGFjaXR5KCkgY29uc3QKICAgIHsKCXJldHVybiBlbmQgLSBzdGFydDsKICAgIH0KCiAgICB2b2lkIGluc2VydCggcG9pbnRlciBwb3MsIGNvbnN0IFQmIHggKTsKICAgIHZvaWQgaW5zZXJ0KCBwb2ludGVyIHBvcywgc2l6ZV90IG4sIGNvbnN0IFQmIHggKTsKICAgIHZvaWQgcmVzZXJ2ZSggc2l6ZV90IG4gKTsKCiAgICB2b2lkIGNsZWFyKCkKICAgIHsKCWRlbGV0ZVtdIHN0YXJ0OwoJc3RhcnQgPSAwOwoJZmluaXNoID0gMDsKCWVuZCA9IDA7CiAgICB9CgoKICAgIHBvaW50ZXIgc3RhcnQ7CiAgICBwb2ludGVyIGZpbmlzaDsKICAgIHBvaW50ZXIgZW5kOwoKcHJpdmF0ZToKICAgIHBvaW50ZXIgZ3Jvd0FuZENvcHkoIHNpemVfdCBuLCBwb2ludGVyIHMsIHBvaW50ZXIgZiApOwoKICAgIFFWYWx1ZVZlY3RvclByaXZhdGU8VD4mIG9wZXJhdG9yPSggY29uc3QgUVZhbHVlVmVjdG9yUHJpdmF0ZTxUPiYgeCApOwoKfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpRX0lOTElORV9URU1QTEFURVMgUVZhbHVlVmVjdG9yUHJpdmF0ZTxUPjo6UVZhbHVlVmVjdG9yUHJpdmF0ZSggY29uc3QgUVZhbHVlVmVjdG9yUHJpdmF0ZTxUPiYgeCApCiAgICA6IFFTaGFyZWQoKQp7CiAgICBpbnQgaSA9IHguc2l6ZSgpOwogICAgaWYgKCBpID4gMCApIHsKCXN0YXJ0ID0gbmV3IFRbIGkgXTsKCWZpbmlzaCA9IHN0YXJ0ICsgaTsKCWVuZCA9IHN0YXJ0ICsgaTsKI2lmIGRlZmluZWQoX194bENfXykgJiYgX194bENfXyA8IDB4NDAwIC8vIHhsQyAzLjYgY29uZnVzZWQgYnkgY29uc3QKCXFDb3B5KCAocG9pbnRlcil4LnN0YXJ0LCAocG9pbnRlcil4LmZpbmlzaCwgc3RhcnQgKTsKI2Vsc2UKCXFDb3B5KCB4LnN0YXJ0LCB4LmZpbmlzaCwgc3RhcnQgKTsKI2VuZGlmCiAgICB9IGVsc2UgewoJc3RhcnQgPSAwOwoJZmluaXNoID0gMDsKCWVuZCA9IDA7CiAgICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgpRX0lOTElORV9URU1QTEFURVMgUVZhbHVlVmVjdG9yUHJpdmF0ZTxUPjo6UVZhbHVlVmVjdG9yUHJpdmF0ZSggc2l6ZV90IHNpemUgKQp7CiAgICBpZiAoIHNpemUgPiAwICkgewoJc3RhcnQgPSBuZXcgVFtzaXplXTsKCWZpbmlzaCA9IHN0YXJ0ICsgc2l6ZTsKCWVuZCA9IHN0YXJ0ICsgc2l6ZTsKICAgIH0gZWxzZSB7CglzdGFydCA9IDA7CglmaW5pc2ggPSAwOwoJZW5kID0gMDsKICAgIH0KfQoKdGVtcGxhdGUgPGNsYXNzIFQ+ClFfSU5MSU5FX1RFTVBMQVRFUyB2b2lkIFFWYWx1ZVZlY3RvclByaXZhdGU8VD46Omluc2VydCggcG9pbnRlciBwb3MsIGNvbnN0IFQmIHggKQp7CiAgICBjb25zdCBzaXplX3QgbGFzdFNpemUgPSBzaXplKCk7CiAgICBjb25zdCBzaXplX3QgbiA9IGxhc3RTaXplICE9MCA/IDIqbGFzdFNpemUgOiAxOwogICAgY29uc3Qgc2l6ZV90IG9mZnNldCA9IHBvcyAtIHN0YXJ0OwogICAgcG9pbnRlciBuZXdTdGFydCA9IG5ldyBUW25dOwogICAgcG9pbnRlciBuZXdGaW5pc2ggPSBuZXdTdGFydCArIG9mZnNldDsKICAgIHFDb3B5KCBzdGFydCwgcG9zLCBuZXdTdGFydCApOwogICAgKm5ld0ZpbmlzaCA9IHg7CiAgICBxQ29weSggcG9zLCBmaW5pc2gsICsrbmV3RmluaXNoICk7CiAgICBkZWxldGVbXSBzdGFydDsKICAgIHN0YXJ0ID0gbmV3U3RhcnQ7CiAgICBmaW5pc2ggPSBuZXdTdGFydCArIGxhc3RTaXplICsgMTsKICAgIGVuZCA9IG5ld1N0YXJ0ICsgbjsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+ClFfSU5MSU5FX1RFTVBMQVRFUyB2b2lkIFFWYWx1ZVZlY3RvclByaXZhdGU8VD46Omluc2VydCggcG9pbnRlciBwb3MsIHNpemVfdCBuLCBjb25zdCBUJiB4ICkKewogICAgaWYgKCBzaXplX3QoIGVuZCAtIGZpbmlzaCApID49IG4gKSB7CgkvLyBlbm91Z2ggcm9vbQoJY29uc3Qgc2l6ZV90IGVsZW1zX2FmdGVyID0gZmluaXNoIC0gcG9zOwoJcG9pbnRlciBvbGRfZmluaXNoID0gZmluaXNoOwoJaWYgKCBlbGVtc19hZnRlciA+IG4gKSB7CgkgICAgcUNvcHkoIGZpbmlzaCAtIG4sIGZpbmlzaCwgZmluaXNoICk7CgkgICAgZmluaXNoICs9IG47CgkgICAgcUNvcHlCYWNrd2FyZCggcG9zLCBvbGRfZmluaXNoIC0gbiwgb2xkX2ZpbmlzaCApOwoJICAgIHFGaWxsKCBwb3MsIHBvcyArIG4sIHggKTsKCX0gZWxzZSB7CgkgICAgcG9pbnRlciBmaWxsZXIgPSBmaW5pc2g7CgkgICAgc2l6ZV90IGkgPSBuIC0gZWxlbXNfYWZ0ZXI7CgkgICAgZm9yICggOyBpID4gMDsgLS1pLCArK2ZpbGxlciApCgkJKmZpbGxlciA9IHg7CgkgICAgZmluaXNoICs9IG4gLSBlbGVtc19hZnRlcjsKCSAgICBxQ29weSggcG9zLCBvbGRfZmluaXNoLCBmaW5pc2ggKTsKCSAgICBmaW5pc2ggKz0gZWxlbXNfYWZ0ZXI7CgkgICAgcUZpbGwoIHBvcywgb2xkX2ZpbmlzaCwgeCApOwoJfQogICAgfSBlbHNlIHsKCS8vIG5vdCBlbm91Z2ggcm9vbQoJY29uc3Qgc2l6ZV90IGxhc3RTaXplID0gc2l6ZSgpOwoJY29uc3Qgc2l6ZV90IGxlbiA9IGxhc3RTaXplICsgUU1BWCggbGFzdFNpemUsIG4gKTsKCXBvaW50ZXIgbmV3U3RhcnQgPSBuZXcgVFtsZW5dOwoJcG9pbnRlciBuZXdGaW5pc2ggPSBxQ29weSggc3RhcnQsIHBvcywgbmV3U3RhcnQgKTsKCS8vIGZpbGwgdXAgaW5zZXJ0ZWQgc3BhY2UKCXNpemVfdCBpID0gbjsKCWZvciAoIDsgaSA+IDA7IC0taSwgKytuZXdGaW5pc2ggKQoJICAgICpuZXdGaW5pc2ggPSB4OwoJbmV3RmluaXNoID0gcUNvcHkoIHBvcywgZmluaXNoLCBuZXdGaW5pc2ggKTsKCWRlbGV0ZVtdIHN0YXJ0OwoJc3RhcnQgPSBuZXdTdGFydDsKCWZpbmlzaCA9IG5ld0ZpbmlzaDsKCWVuZCA9IG5ld1N0YXJ0ICsgbGVuOwogICAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KUV9JTkxJTkVfVEVNUExBVEVTIHZvaWQgUVZhbHVlVmVjdG9yUHJpdmF0ZTxUPjo6cmVzZXJ2ZSggc2l6ZV90IG4gKQp7CiAgICBjb25zdCBzaXplX3QgbGFzdFNpemUgPSBzaXplKCk7CiAgICBwb2ludGVyIHRtcCA9IGdyb3dBbmRDb3B5KCBuLCBzdGFydCwgZmluaXNoICk7CiAgICBzdGFydCA9IHRtcDsKICAgIGZpbmlzaCA9IHRtcCArIGxhc3RTaXplOwogICAgZW5kID0gc3RhcnQgKyBuOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KUV9JTkxJTkVfVEVNUExBVEVTIFFfVFlQRU5BTUUgUVZhbHVlVmVjdG9yUHJpdmF0ZTxUPjo6cG9pbnRlciBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+Ojpncm93QW5kQ29weSggc2l6ZV90IG4sIHBvaW50ZXIgcywgcG9pbnRlciBmICkKewogICAgcG9pbnRlciBuZXdTdGFydCA9IG5ldyBUW25dOwogICAgcUNvcHkoIHMsIGYsIG5ld1N0YXJ0ICk7CiAgICBkZWxldGVbXSBzdGFydDsKICAgIHJldHVybiBuZXdTdGFydDsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIFFEZWVwQ29weTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBRVmFsdWVWZWN0b3IKewpwdWJsaWM6CiAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKICAgIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRlcjsKICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKICAgIHR5cGVkZWYgdmFsdWVfdHlwZSogaXRlcmF0b3I7CiAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X2l0ZXJhdG9yOwogICAgdHlwZWRlZiB2YWx1ZV90eXBlJiByZWZlcmVuY2U7CiAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKICAgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKI2lmbmRlZiBRVF9OT19TVEwKICAgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKI2Vsc2UKICAgIHR5cGVkZWYgaW50IGRpZmZlcmVuY2VfdHlwZTsKI2VuZGlmCgogICAgUVZhbHVlVmVjdG9yKCkKICAgIHsKCXNoID0gbmV3IFFWYWx1ZVZlY3RvclByaXZhdGU8VD47CiAgICB9CgogICAgUVZhbHVlVmVjdG9yKCBjb25zdCBRVmFsdWVWZWN0b3I8VD4mIHYgKQogICAgewoJc2ggPSB2LnNoOwoJc2gtPnJlZigpOwogICAgfQoKICAgIFFWYWx1ZVZlY3Rvciggc2l6ZV90eXBlIG4sIGNvbnN0IFQmIHZhbCA9IFQoKSApOwoKI2lmbmRlZiBRVF9OT19TVEwKICAgIFFWYWx1ZVZlY3Rvciggc3RkOjp2ZWN0b3I8VD4mIHYgKSAvLyAjIyMgcmVtb3ZlIGluIDQuMAogICAgewoJc2ggPSBuZXcgUVZhbHVlVmVjdG9yUHJpdmF0ZTxUPiggdi5zaXplKCkgKTsKCXFDb3B5KCB2LmJlZ2luKCksIHYuZW5kKCksIGJlZ2luKCkgKTsKICAgIH0KCiAgICBRVmFsdWVWZWN0b3IoIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2ICkKICAgIHsKCXNoID0gbmV3IFFWYWx1ZVZlY3RvclByaXZhdGU8VD4oIHYuc2l6ZSgpICk7CglxQ29weSggdi5iZWdpbigpLCB2LmVuZCgpLCBiZWdpbigpICk7CiAgICB9CiNlbmRpZgoKICAgIH5RVmFsdWVWZWN0b3IoKQogICAgewoJc2gtPmRlcmVmQW5kRGVsZXRlKCk7CiAgICB9CgogICAgUVZhbHVlVmVjdG9yPFQ+JiBvcGVyYXRvcj0gKCBjb25zdCBRVmFsdWVWZWN0b3I8VD4mIHYgKQogICAgewoJdi5zaC0+cmVmKCk7CglzaC0+ZGVyZWZBbmREZWxldGUoKTsKCXNoID0gdi5zaDsKCXJldHVybiAqdGhpczsKICAgIH0KCiNpZm5kZWYgUVRfTk9fU1RMCiAgICBRVmFsdWVWZWN0b3I8VD4mIG9wZXJhdG9yPSAoIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2ICkKICAgIHsKCWNsZWFyKCk7CglyZXNpemUoIHYuc2l6ZSgpICk7CglxQ29weSggdi5iZWdpbigpLCB2LmVuZCgpLCBiZWdpbigpICk7CglyZXR1cm4gKnRoaXM7CiAgICB9CiNlbmRpZgoKICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gc2gtPnNpemUoKTsgfQoKICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBzaC0+ZW1wdHkoKTsgfQoKICAgIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0CiAgICB7CglyZXR1cm4gc2l6ZV90eXBlKCBzaC0+Y2FwYWNpdHkoKSApOwogICAgfQoKICAgIGl0ZXJhdG9yIGJlZ2luKCkKICAgIHsKCWRldGFjaCgpOwoJcmV0dXJuIHNoLT5zdGFydDsKICAgIH0KCiAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0CiAgICB7CglyZXR1cm4gc2gtPnN0YXJ0OwogICAgfQoKICAgIGNvbnN0X2l0ZXJhdG9yIGNvbnN0QmVnaW4oKSBjb25zdAogICAgewoJcmV0dXJuIHNoLT5zdGFydDsKICAgIH0KCiAgICBpdGVyYXRvciBlbmQoKQogICAgewoJZGV0YWNoKCk7CglyZXR1cm4gc2gtPmZpbmlzaDsKICAgIH0KCiAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdAogICAgewoJcmV0dXJuIHNoLT5maW5pc2g7CiAgICB9CgogICAgY29uc3RfaXRlcmF0b3IgY29uc3RFbmQoKSBjb25zdAogICAgewoJcmV0dXJuIHNoLT5maW5pc2g7CiAgICB9CgogICAgcmVmZXJlbmNlIGF0KCBzaXplX3R5cGUgaSwgYm9vbCogb2sgPSAwICkKICAgIHsKCWRldGFjaCgpOwoJaWYgKCBvayApCgkgICAgKm9rID0gKCBpIDwgc2l6ZSgpICk7CglyZXR1cm4gKiggYmVnaW4oKSArIGkgKTsKICAgIH0KCiAgICBjb25zdF9yZWZlcmVuY2UgYXQoIHNpemVfdHlwZSBpLCBib29sKiBvayA9IDAgKSBjb25zdAogICAgewoJaWYgKCBvayApCgkgICAgKm9rID0gKCBpIDwgc2l6ZSgpICk7CglyZXR1cm4gKiggYmVnaW4oKSArIGkgKTsKICAgIH0KCiAgICByZWZlcmVuY2Ugb3BlcmF0b3JbXSggc2l6ZV90eXBlIGkgKQogICAgewoJZGV0YWNoKCk7CglyZXR1cm4gKiggYmVnaW4oKSArIGkgKTsKICAgIH0KCiAgICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXSggc2l6ZV90eXBlIGkgKSBjb25zdAogICAgewoJcmV0dXJuICooIGJlZ2luKCkgKyBpICk7CiAgICB9CgogICAgcmVmZXJlbmNlIGZyb250KCkKICAgIHsKCVFfQVNTRVJUKCAhZW1wdHkoKSApOwoJZGV0YWNoKCk7CglyZXR1cm4gKmJlZ2luKCk7CiAgICB9CgogICAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QKICAgIHsKCVFfQVNTRVJUKCAhZW1wdHkoKSApOwoJcmV0dXJuICpiZWdpbigpOwogICAgfQoKICAgIHJlZmVyZW5jZSBiYWNrKCkKICAgIHsKCVFfQVNTRVJUKCAhZW1wdHkoKSApOwoJZGV0YWNoKCk7CglyZXR1cm4gKiggZW5kKCkgLSAxICk7CiAgICB9CgogICAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdAogICAgewoJUV9BU1NFUlQoICFlbXB0eSgpICk7CglyZXR1cm4gKiggZW5kKCkgLSAxICk7CiAgICB9CgogICAgdm9pZCBwdXNoX2JhY2soIGNvbnN0IFQmIHggKQogICAgewoJZGV0YWNoKCk7CglpZiAoIHNoLT5maW5pc2ggPT0gc2gtPmVuZCApIHsKCSAgICBzaC0+cmVzZXJ2ZSggc2l6ZSgpK3NpemUoKS8yKzEgKTsKCX0KCSpzaC0+ZmluaXNoID0geDsKCSsrc2gtPmZpbmlzaDsKICAgIH0KCiAgICB2b2lkIHBvcF9iYWNrKCkKICAgIHsKCWRldGFjaCgpOwoJaWYgKCBlbXB0eSgpICkKCSAgICByZXR1cm47CgktLXNoLT5maW5pc2g7CiAgICB9CgogICAgaXRlcmF0b3IgaW5zZXJ0KCBpdGVyYXRvciBwb3MsIGNvbnN0IFQmIHggKTsKICAgIGl0ZXJhdG9yIGluc2VydCggaXRlcmF0b3IgcG9zLCBzaXplX3R5cGUgbiwgY29uc3QgVCYgeCApOwoKICAgIHZvaWQgcmVzZXJ2ZSggc2l6ZV90eXBlIG4gKQogICAgewoJaWYgKCBjYXBhY2l0eSgpIDwgbiApIHsKCSAgICBkZXRhY2goKTsKCSAgICBzaC0+cmVzZXJ2ZSggbiApOwoJfQogICAgfQoKICAgIHZvaWQgcmVzaXplKCBzaXplX3R5cGUgbiwgY29uc3QgVCYgdmFsID0gVCgpICkKICAgIHsKCWlmICggbiA8IHNpemUoKSApCgkgICAgZXJhc2UoIGJlZ2luKCkgKyBuLCBlbmQoKSApOwoJZWxzZQoJICAgIGluc2VydCggZW5kKCksIG4gLSBzaXplKCksIHZhbCApOwogICAgfQoKICAgIHZvaWQgY2xlYXIoKQogICAgewoJZGV0YWNoKCk7CglzaC0+Y2xlYXIoKTsKICAgIH0KCiAgICBpdGVyYXRvciBlcmFzZSggaXRlcmF0b3IgcG9zICkKICAgIHsKCWRldGFjaCgpOwoJaWYgKCBwb3MgKyAxICE9IGVuZCgpICkKCSAgICBxQ29weSggcG9zICsgMSwgc2gtPmZpbmlzaCwgcG9zICk7CgktLXNoLT5maW5pc2g7CglyZXR1cm4gcG9zOwogICAgfQoKICAgIGl0ZXJhdG9yIGVyYXNlKCBpdGVyYXRvciBmaXJzdCwgaXRlcmF0b3IgbGFzdCApCiAgICB7CglkZXRhY2goKTsKCXFDb3B5KCBsYXN0LCBzaC0+ZmluaXNoLCBmaXJzdCApOwoJc2gtPmZpbmlzaCA9IHNoLT5maW5pc2ggLSAoIGxhc3QgLSBmaXJzdCApOwoJcmV0dXJuIGZpcnN0OwogICAgfQoKICAgIC8vICMjIyByZW1vdmUgaW4gUXQgNC4wCiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFWYWx1ZVZlY3RvcjxUPiYgeCApCiAgICB7CglyZXR1cm4gc2l6ZSgpPT14LnNpemUoKSA/IHFFcXVhbCggY29uc3RCZWdpbigpLCBjb25zdEVuZCgpLCB4LmJlZ2luKCkpIDogRkFMU0U7CiAgICB9CgogICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBRVmFsdWVWZWN0b3I8VD4mIHggKSBjb25zdAogICAgewoJcmV0dXJuIHNpemUoKT09eC5zaXplKCkgPyBxRXF1YWwoIGJlZ2luKCksIGVuZCgpLCB4LmJlZ2luKCkgKSA6IEZBTFNFOwogICAgfQoKICAgIHR5cGVkZWYgVCBWYWx1ZVR5cGU7CiAgICB0eXBlZGVmIFZhbHVlVHlwZSAqSXRlcmF0b3I7CiAgICB0eXBlZGVmIGNvbnN0IFZhbHVlVHlwZSAqQ29uc3RJdGVyYXRvcjsKCiAgICBzaXplX3R5cGUgY291bnQoKSBjb25zdCB7IHJldHVybiBzaXplKCk7IH0KICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGVtcHR5KCk7IH0KCiAgICByZWZlcmVuY2UgZmlyc3QoKSB7IHJldHVybiBmcm9udCgpOyB9CiAgICBjb25zdF9yZWZlcmVuY2UgZmlyc3QoKSBjb25zdCB7IHJldHVybiBmcm9udCgpOyB9CiAgICByZWZlcmVuY2UgbGFzdCgpIHsgcmV0dXJuIGJhY2soKTsgfQogICAgY29uc3RfcmVmZXJlbmNlIGxhc3QoKSBjb25zdCB7IHJldHVybiBiYWNrKCk7IH0KICAgIHZvaWQgYXBwZW5kKCBjb25zdCBUJiB4ICkgeyBwdXNoX2JhY2soIHggKTsgfQoKcHJvdGVjdGVkOgogICAgdm9pZCBkZXRhY2goKQogICAgewoJaWYgKCBzaC0+Y291bnQgPiAxICkgeyBkZXRhY2hJbnRlcm5hbCgpOyB9CiAgICB9CiAgICB2b2lkIGRldGFjaEludGVybmFsKCk7CiAgICBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+KiBzaDsKCnByaXZhdGU6CiAgICBmcmllbmQgY2xhc3MgUURlZXBDb3B5PCBRVmFsdWVWZWN0b3I8VD4gPjsKfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpRX0lOTElORV9URU1QTEFURVMgUVZhbHVlVmVjdG9yPFQ+OjpRVmFsdWVWZWN0b3IoIHNpemVfdHlwZSBuLCBjb25zdCBUJiB2YWwgKQp7CiAgICBzaCA9IG5ldyBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+KCBuICk7CiAgICBxRmlsbCggYmVnaW4oKSwgZW5kKCksIHZhbCApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KUV9JTkxJTkVfVEVNUExBVEVTIHZvaWQgUVZhbHVlVmVjdG9yPFQ+OjpkZXRhY2hJbnRlcm5hbCgpCnsKICAgIHNoLT5kZXJlZigpOwogICAgc2ggPSBuZXcgUVZhbHVlVmVjdG9yUHJpdmF0ZTxUPiggKnNoICk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgpRX0lOTElORV9URU1QTEFURVMgUV9UWVBFTkFNRSBRVmFsdWVWZWN0b3I8VD46Oml0ZXJhdG9yIFFWYWx1ZVZlY3RvcjxUPjo6aW5zZXJ0KCBpdGVyYXRvciBwb3MsIGNvbnN0IFQmIHggKQp7CiAgICBzaXplX3R5cGUgb2Zmc2V0ID0gcG9zIC0gc2gtPnN0YXJ0OwogICAgZGV0YWNoKCk7CiAgICBpZiAoIHBvcyA9PSBlbmQoKSApIHsKCWlmICggc2gtPmZpbmlzaCA9PSBzaC0+ZW5kICkKCSAgICBwdXNoX2JhY2soIHggKTsKCWVsc2UgewoJICAgICpzaC0+ZmluaXNoID0geDsKCSAgICArK3NoLT5maW5pc2g7Cgl9CiAgICB9IGVsc2UgewoJaWYgKCBzaC0+ZmluaXNoID09IHNoLT5lbmQgKSB7CgkgICAgc2gtPmluc2VydCggcG9zLCB4ICk7Cgl9IGVsc2UgewoJICAgICpzaC0+ZmluaXNoID0gKihzaC0+ZmluaXNoIC0gMSk7CgkgICAgKytzaC0+ZmluaXNoOwoJICAgIHFDb3B5QmFja3dhcmQoIHBvcywgc2gtPmZpbmlzaCAtIDIsIHNoLT5maW5pc2ggLSAxICk7CgkgICAgKnBvcyA9IHg7Cgl9CiAgICB9CiAgICByZXR1cm4gYmVnaW4oKSArIG9mZnNldDsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+ClFfSU5MSU5FX1RFTVBMQVRFUyBRX1RZUEVOQU1FIFFWYWx1ZVZlY3RvcjxUPjo6aXRlcmF0b3IgUVZhbHVlVmVjdG9yPFQ+OjppbnNlcnQoIGl0ZXJhdG9yIHBvcywgc2l6ZV90eXBlIG4sIGNvbnN0IFQmIHggKQp7CiAgICBpZiAoIG4gIT0gMCApIHsKCXNpemVfdHlwZSBvZmZzZXQgPSBwb3MgLSBzaC0+c3RhcnQ7CglkZXRhY2goKTsKCXBvcyA9IGJlZ2luKCkgKyBvZmZzZXQ7CglzaC0+aW5zZXJ0KCBwb3MsIG4sIHggKTsKICAgIH0KICAgIHJldHVybiBwb3M7Cn0KCgojaWZuZGVmIFFUX05PX0RBVEFTVFJFQU0KdGVtcGxhdGU8Y2xhc3MgVD4KUV9JTkxJTkVfVEVNUExBVEVTIFFEYXRhU3RyZWFtJiBvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSYgcywgUVZhbHVlVmVjdG9yPFQ+JiB2ICkKewogICAgdi5jbGVhcigpOwogICAgUV9VSU5UMzIgYzsKICAgIHMgPj4gYzsKICAgIHYucmVzaXplKCBjICk7CiAgICBmb3IoIFFfVUlOVDMyIGkgPSAwOyBpIDwgYzsgKytpICkKICAgIHsKCVQgdDsKCXMgPj4gdDsKCXZbaV0gPSB0OwogICAgfQogICAgcmV0dXJuIHM7Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+ClFfSU5MSU5FX1RFTVBMQVRFUyBRRGF0YVN0cmVhbSYgb3BlcmF0b3I8PCggUURhdGFTdHJlYW0mIHMsIGNvbnN0IFFWYWx1ZVZlY3RvcjxUPiYgdiApCnsKICAgIHMgPDwgKFFfVUlOVDMyKXYuc2l6ZSgpOwogICAgLy8gIyMjIHVzZSB0eXBlbmFtZSBRVmFsdWVWZWN0b3I8VD46OmNvbnN0X2l0ZXJhdG9yIG9uY2UgYWxsIHN1cHBvcnRlZAogICAgLy8gIyMjIGNvbXBpbGVycyBrbm93IGFib3V0IHRoZSAndHlwZW5hbWUnIGtleXdvcmQuCiAgICBjb25zdCBUKiBpdCA9IHYuYmVnaW4oKTsKICAgIGZvciggOyBpdCAhPSB2LmVuZCgpOyArK2l0ICkKCXMgPDwgKml0OwogICAgcmV0dXJuIHM7Cn0KI2VuZGlmIC8vIFFUX05PX0RBVEFTVFJFQU0KCiNkZWZpbmUgUV9ERUZJTkVEX1FWQUxVRVZFQ1RPUgojaW5jbHVkZSAicXdpbmV4cG9ydC5oIgojZW5kaWYgLy8gUVZBTFVFVkVDVE9SX0gKAAAAEgBxAHYAZgBiAGgAZAByAC4AaAAABvIvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFWRkJIRFJfSAojZGVmaW5lIFFWRkJIRFJfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxY29sb3IuaCIKI2luY2x1ZGUgInFyZWN0LmgiCiNlbmRpZiAvLyBRVF9ICgojZGVmaW5lIFFUX1ZGQl9NT1VTRV9QSVBFCSIvdG1wLy5xdHZmYl9tb3VzZS0lMSIKI2RlZmluZSBRVF9WRkJfS0VZQk9BUkRfUElQRQkiL3RtcC8ucXR2ZmJfa2V5Ym9hcmQtJTEiCgpzdHJ1Y3QgUVZGYkhlYWRlcgp7CiAgICBpbnQgd2lkdGg7CiAgICBpbnQgaGVpZ2h0OwogICAgaW50IGRlcHRoOwogICAgaW50IGxpbmVzdGVwOwogICAgaW50IGRhdGFvZmZzZXQ7CiAgICBRUmVjdCB1cGRhdGU7CiAgICBib29sIGRpcnR5OwogICAgaW50ICBudW1jb2xzOwogICAgUVJnYiBjbHV0WzI1Nl07Cn07CgpzdHJ1Y3QgUVZGYktleURhdGEKewogICAgdW5zaWduZWQgaW50IHVuaWNvZGU7CiAgICB1bnNpZ25lZCBpbnQgbW9kaWZpZXJzOwogICAgYm9vbCBwcmVzczsKICAgIGJvb2wgcmVwZWF0Owp9OwoKI2VuZGlmCgAAAC4AcQB3AHMAawBkAGUAMgBkAGUAYwBvAHIAYQB0AGkAbwBuAF8AcQB3AHMALgBoAAAIgS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdTS0RFMkRFQ09SQVRJT05fUVdTX0gKI2RlZmluZSBRV1NLREUyREVDT1JBVElPTl9RV1NfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxd3NkZWZhdWx0ZGVjb3JhdGlvbl9xd3MuaCIKI2VuZGlmIC8vIFFUX0gKCgojaWZuZGVmIFFUX05PX1FXU19LREUyX1dNX1NUWUxFCgoKY2xhc3MgUVdTS0RFMkRlY29yYXRpb24gOiBwdWJsaWMgUVdTRGVmYXVsdERlY29yYXRpb24KewpwdWJsaWM6CiAgICBRV1NLREUyRGVjb3JhdGlvbigpOwogICAgdmlydHVhbCB+UVdTS0RFMkRlY29yYXRpb24oKTsKCiAgICB2aXJ0dWFsIFFSZWdpb24gcmVnaW9uKGNvbnN0IFFXaWRnZXQgKiwgY29uc3QgUVJlY3QgJnJlY3QsIFJlZ2lvbik7CiAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUVBhaW50ZXIgKiwgY29uc3QgUVdpZGdldCAqKTsKICAgIHZpcnR1YWwgdm9pZCBwYWludEJ1dHRvbihRUGFpbnRlciAqLCBjb25zdCBRV2lkZ2V0ICosIFJlZ2lvbiwgaW50IHN0YXRlKTsKcHJvdGVjdGVkOgovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwp9OwoKI2VuZGlmIC8vIFFUX05PX1FXU19LREUyX1dNX1NUWUxFCgojZW5kaWYgLy8gUVdTS0RFMkRFQ09SQVRJT05fUVdTX0gKAAAANABxAHcAcwBkAGUAZgBhAHUAbAB0AGQAZQBjAG8AcgBhAHQAaQBvAG4AXwBxAHcAcwAuAGgAAAp8LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdTREVGQVVMVERFQ09SQVRJT05fUVdTX0gKI2RlZmluZSBRV1NERUZBVUxUREVDT1JBVElPTl9RV1NfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxd3NtYW5hZ2VyX3F3cy5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19RV1NfTUFOQUdFUgoKI2RlZmluZSBDT1JORVJfR1JBQgkxNgojZGVmaW5lIEJPUkRFUl9XSURUSAk0CiNkZWZpbmUgQk9UVE9NX0JPUkRFUl9XSURUSAkyKkJPUkRFUl9XSURUSAoKCmNsYXNzIFFXU0RlZmF1bHREZWNvcmF0aW9uIDogcHVibGljIFFXU0RlY29yYXRpb24KewpwdWJsaWM6CiAgICBRV1NEZWZhdWx0RGVjb3JhdGlvbigpOwogICAgdmlydHVhbCB+UVdTRGVmYXVsdERlY29yYXRpb24oKTsKCiAgICB2aXJ0dWFsIFFSZWdpb24gcmVnaW9uKGNvbnN0IFFXaWRnZXQgKiwgY29uc3QgUVJlY3QgJnJlY3QsIFJlZ2lvbik7CiAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUVBhaW50ZXIgKiwgY29uc3QgUVdpZGdldCAqKTsKICAgIHZpcnR1YWwgdm9pZCBwYWludEJ1dHRvbihRUGFpbnRlciAqLCBjb25zdCBRV2lkZ2V0ICosIFJlZ2lvbiwgaW50IHN0YXRlKTsKCnByb3RlY3RlZDoKICAgIHZpcnR1YWwgY29uc3QgUVBpeG1hcCogcGl4bWFwRm9yKGNvbnN0IFFXaWRnZXQgKiwgUmVnaW9uLCBib29sLCBpbnQmLCBpbnQmKTsKCiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB2aXJ0dWFsIGludCBnZXRUaXRsZVdpZHRoKGNvbnN0IFFXaWRnZXQgKik7CiAgICB2aXJ0dWFsIGludCBnZXRUaXRsZUhlaWdodChjb25zdCBRV2lkZ2V0ICopOwoKI2lmbmRlZiBRVF9OT19JTUFHRUlPX1hQTQogICAgdmlydHVhbCBjb25zdCBjaGFyICoqbWVudVBpeG1hcCgpOwogICAgdmlydHVhbCBjb25zdCBjaGFyICoqY2xvc2VQaXhtYXAoKTsKICAgIHZpcnR1YWwgY29uc3QgY2hhciAqKm1pbmltaXplUGl4bWFwKCk7CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiptYXhpbWl6ZVBpeG1hcCgpOwogICAgdmlydHVhbCBjb25zdCBjaGFyICoqbm9ybWFsaXplUGl4bWFwKCk7CiNlbmRpZgoKcHJpdmF0ZToKCiAgICBzdGF0aWMgUVBpeG1hcCAqIHN0YXRpY01lbnVQaXhtYXA7CiAgICBzdGF0aWMgUVBpeG1hcCAqIHN0YXRpY0Nsb3NlUGl4bWFwOwogICAgc3RhdGljIFFQaXhtYXAgKiBzdGF0aWNNaW5pbWl6ZVBpeG1hcDsKICAgIHN0YXRpYyBRUGl4bWFwICogc3RhdGljTWF4aW1pemVQaXhtYXA7CiAgICBzdGF0aWMgUVBpeG1hcCAqIHN0YXRpY05vcm1hbGl6ZVBpeG1hcDsKCn07CgojZW5kaWYgLy8gUVRfTk9fUVdTX01BTkFHRVIKCiNlbmRpZiAvLyBRV1NERUZBVUxUREVDT1JBVElPTl9RV1NfSAoAAAAsAHEAdwBzAHIAZQBnAGkAbwBuAG0AYQBuAGEAZwBlAHIAXwBxAHcAcwAuAGgAAAh5LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFXU1JFR0lPTk1BTkFHRVJfUVdTX0gKI2RlZmluZSBRV1NSRUdJT05NQU5BR0VSX1FXU19ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFwdHJ2ZWN0b3IuaCIKI2luY2x1ZGUgInFyZWdpb24uaCIKI2VuZGlmIC8vIFFUX0gKCmNsYXNzIFFXU1JlZ2lvbkhlYWRlcjsKY2xhc3MgUVdTUmVnaW9uSW5kZXg7CgpjbGFzcyBRV1NSZWdpb25NYW5hZ2VyCnsKcHVibGljOgogICAgUVdTUmVnaW9uTWFuYWdlciggY29uc3QgUVN0cmluZyAmZmlsZW5hbWUsIGJvb2wgYyA9IFRSVUUgKTsKICAgIH5RV1NSZWdpb25NYW5hZ2VyKCk7CgogICAgLy8gZm9yIGNsaWVudHMKICAgIGNvbnN0IGludCAqcmV2aXNpb24oIGludCBpZHggKSBjb25zdDsKICAgIFFSZWdpb24gcmVnaW9uKCBpbnQgaWR4ICk7CgogICAgaW50IGZpbmQoIGludCBpZCApOwoKICAgIC8vIGZvciBzZXJ2ZXIKICAgIGludCBhZGQoIGludCBpZCwgUVJlZ2lvbiByZWdpb24gKTsKICAgIHZvaWQgc2V0KCBpbnQgaWR4LCBRUmVnaW9uIHJlZ2lvbiApOwogICAgdm9pZCByZW1vdmUoIGludCBpZHggKTsKICAgIHZvaWQgbWFya1VwZGF0ZWQoIGludCBpZHggKTsKICAgIHZvaWQgY29tbWl0KCk7Cgpwcml2YXRlOgogICAgUVJlY3QgKnJlY3RzKCBpbnQgb2Zmc2V0ICk7CiAgICBib29sIGF0dGFjaCggY29uc3QgUVN0cmluZyAmZmlsZW5hbWUgKTsKICAgIHZvaWQgZGV0YWNoKCk7Cgpwcml2YXRlOgogICAgYm9vbCBjbGllbnQ7CiAgICBRUHRyVmVjdG9yPFFSZWdpb24+IHJlZ2lvbnM7CiAgICBRV1NSZWdpb25IZWFkZXIgKnJlZ0hkcjsKICAgIFFXU1JlZ2lvbkluZGV4ICpyZWdJZHg7CiAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwogICAgaW50IHNobUlkOwp9OwoKI2VuZGlmIC8vIFFXU1JFR0lPTk1BTkFHRVJfUVdTX0gKAAAAGgBxAHQAZQB4AHQAcwB0AHIAZQBhAG0ALgBoAAAoOC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVRFWFRTVFJFQU1fSAojZGVmaW5lIFFURVhUU1RSRUFNX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicWlvZGV2aWNlLmgiCiNpbmNsdWRlICJxc3RyaW5nLmgiCiNpbmNsdWRlIDxzdGRpby5oPgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19URVhUU1RSRUFNCmNsYXNzIFFUZXh0Q29kZWM7CmNsYXNzIFFUZXh0RGVjb2RlcjsKCmNsYXNzIFFUZXh0U3RyZWFtUHJpdmF0ZTsKCmNsYXNzIFFfRVhQT1JUIFFUZXh0U3RyZWFtCQkJCS8vIHRleHQgc3RyZWFtIGNsYXNzCnsKcHVibGljOgogICAgZW51bSBFbmNvZGluZyB7IExvY2FsZSwgTGF0aW4xLCBVbmljb2RlLCBVbmljb2RlTmV0d29ya09yZGVyLAoJCSAgICBVbmljb2RlUmV2ZXJzZSwgUmF3VW5pY29kZSwgVW5pY29kZVVURjggfTsKCiAgICB2b2lkCXNldEVuY29kaW5nKCBFbmNvZGluZyApOwojaWZuZGVmIFFUX05PX1RFWFRDT0RFQwogICAgdm9pZAlzZXRDb2RlYyggUVRleHRDb2RlYyogKTsKICAgIFFUZXh0Q29kZWMgKmNvZGVjKCk7CiNlbmRpZgoKICAgIFFUZXh0U3RyZWFtKCk7CiAgICBRVGV4dFN0cmVhbSggUUlPRGV2aWNlICogKTsKICAgIFFUZXh0U3RyZWFtKCBRU3RyaW5nKiwgaW50IG1vZGUgKTsKICAgIFFUZXh0U3RyZWFtKCBRU3RyaW5nJiwgaW50IG1vZGUgKTsJCS8vIG9ic29sZXRlCiAgICBRVGV4dFN0cmVhbSggUUJ5dGVBcnJheSwgaW50IG1vZGUgKTsKICAgIFFUZXh0U3RyZWFtKCBGSUxFICosIGludCBtb2RlICk7CiAgICB2aXJ0dWFsIH5RVGV4dFN0cmVhbSgpOwoKICAgIFFJT0RldmljZQkqZGV2aWNlKCkgY29uc3Q7CiAgICB2b2lkCSBzZXREZXZpY2UoIFFJT0RldmljZSAqICk7CiAgICB2b2lkCSB1bnNldERldmljZSgpOwoKICAgIGJvb2wJIGF0RW5kKCkgY29uc3Q7CiAgICBib29sCSBlb2YoKSBjb25zdDsKCiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+PiggUUNoYXIgJiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPj4oIGNoYXIgJiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPj4oIHNpZ25lZCBzaG9ydCAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+PiggdW5zaWduZWQgc2hvcnQgJiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPj4oIHNpZ25lZCBpbnQgJiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPj4oIHVuc2lnbmVkIGludCAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+Piggc2lnbmVkIGxvbmcgJiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPj4oIHVuc2lnbmVkIGxvbmcgJiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPj4oIGZsb2F0ICYgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcj4+KCBkb3VibGUgJiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPj4oIGNoYXIgKiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPj4oIFFTdHJpbmcgJiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPj4oIFFDU3RyaW5nICYgKTsKCiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggUUNoYXIgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCBjaGFyICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggc2lnbmVkIHNob3J0ICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggdW5zaWduZWQgc2hvcnQgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCBzaWduZWQgaW50ICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggdW5zaWduZWQgaW50ICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggc2lnbmVkIGxvbmcgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCB1bnNpZ25lZCBsb25nICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggZmxvYXQgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCBkb3VibGUgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCBjb25zdCBjaGFyKiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPDwoIGNvbnN0IFFTdHJpbmcgJiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPDwoIGNvbnN0IFFDU3RyaW5nICYgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCB2b2lkICogKTsJCS8vIGFueSBwb2ludGVyCgogICAgUVRleHRTdHJlYW0gJnJlYWRSYXdCeXRlcyggY2hhciAqLCB1aW50IGxlbiApOwogICAgUVRleHRTdHJlYW0gJndyaXRlUmF3Qnl0ZXMoIGNvbnN0IGNoYXIqICwgdWludCBsZW4gKTsKCiAgICBRU3RyaW5nCXJlYWRMaW5lKCk7CiAgICBRU3RyaW5nCXJlYWQoKTsKICAgIHZvaWQJc2tpcFdoaXRlU3BhY2UoKTsKCiAgICBlbnVtIHsKCXNraXB3cwkgID0gMHgwMDAxLAkJCS8vIHNraXAgd2hpdGVzcGFjZSBvbiBpbnB1dAoJbGVmdAkgID0gMHgwMDAyLAkJCS8vIGxlZnQtYWRqdXN0IG91dHB1dAoJcmlnaHQJICA9IDB4MDAwNCwJCQkvLyByaWdodC1hZGp1c3Qgb3V0cHV0CglpbnRlcm5hbCAgPSAweDAwMDgsCQkJLy8gcGFkIGFmdGVyIHNpZ24KCWJpbgkgID0gMHgwMDEwLAkJCS8vIGJpbmFyeSBmb3JtYXQgaW50ZWdlcgoJb2N0CSAgPSAweDAwMjAsCQkJLy8gb2N0YWwgZm9ybWF0IGludGVnZXIKCWRlYwkgID0gMHgwMDQwLAkJCS8vIGRlY2ltYWwgZm9ybWF0IGludGVnZXIKCWhleAkgID0gMHgwMDgwLAkJCS8vIGhleCBmb3JtYXQgaW50ZWdlcgoJc2hvd2Jhc2UgID0gMHgwMTAwLAkJCS8vIHNob3cgYmFzZSBpbmRpY2F0b3IKCXNob3dwb2ludCA9IDB4MDIwMCwJCQkvLyBmb3JjZSBkZWNpbWFsIHBvaW50IChmbG9hdCkKCXVwcGVyY2FzZSA9IDB4MDQwMCwJCQkvLyB1cHBlci1jYXNlIGhleCBvdXRwdXQKCXNob3dwb3MJICA9IDB4MDgwMCwJCQkvLyBhZGQgJysnIHRvIHBvc2l0aXZlIGludGVnZXJzCglzY2llbnRpZmljPSAweDEwMDAsCQkJLy8gc2NpZW50aWZpYyBmbG9hdCBvdXRwdXQKCWZpeGVkCSAgPSAweDIwMDAJCQkvLyBmaXhlZCBmbG9hdCBvdXRwdXQKICAgIH07CgogICAgc3RhdGljIGNvbnN0IGludCBiYXNlZmllbGQ7CQkJLy8gYmluIHwgb2N0IHwgZGVjIHwgaGV4CiAgICBzdGF0aWMgY29uc3QgaW50IGFkanVzdGZpZWxkOwkJLy8gbGVmdCB8IHJpZ2h0IHwgaW50ZXJuYWwKICAgIHN0YXRpYyBjb25zdCBpbnQgZmxvYXRmaWVsZDsJCS8vIHNjaWVudGlmaWMgfCBmaXhlZAoKICAgIGludAkgIGZsYWdzKCkgY29uc3Q7CiAgICBpbnQJICBmbGFncyggaW50IGYgKTsKICAgIGludAkgIHNldGYoIGludCBiaXRzICk7CiAgICBpbnQJICBzZXRmKCBpbnQgYml0cywgaW50IG1hc2sgKTsKICAgIGludAkgIHVuc2V0ZiggaW50IGJpdHMgKTsKCiAgICB2b2lkICByZXNldCgpOwoKICAgIGludAkgIHdpZHRoKCkJY29uc3Q7CiAgICBpbnQJICB3aWR0aCggaW50ICk7CiAgICBpbnQJICBmaWxsKCkJY29uc3Q7CiAgICBpbnQJICBmaWxsKCBpbnQgKTsKICAgIGludAkgIHByZWNpc2lvbigpCWNvbnN0OwogICAgaW50CSAgcHJlY2lzaW9uKCBpbnQgKTsKCnByaXZhdGU6CiAgICBsb25nCWlucHV0X2ludCgpOwogICAgdm9pZAlpbml0KCk7CiAgICBRVGV4dFN0cmVhbSAmb3V0cHV0X2ludCggaW50LCB1bG9uZywgYm9vbCApOwogICAgUUlPRGV2aWNlCSpkZXY7CgogICAgaW50CQlmZmxhZ3M7CiAgICBpbnQJCWZ3aWR0aDsKICAgIGludAkJZmlsbGNoYXI7CiAgICBpbnQJCWZwcmVjOwogICAgYm9vbAlkb1VuaWNvZGVIZWFkZXI7CiAgICBib29sCW93bmRldjsKICAgIFFUZXh0Q29kZWMgCSptYXBwZXI7CiAgICBRVGV4dFN0cmVhbVByaXZhdGUgKiBkOwogICAgUUNoYXIJdW51c2VkMTsgLy8gIyMjIHJlbW92ZSBpbiBRdCA0LjAKICAgIGJvb2wJbGF0aW4xOwogICAgYm9vbCAJaW50ZXJuYWxPcmRlcjsKICAgIGJvb2wJbmV0d29ya09yZGVyOwogICAgdm9pZAkqdW51c2VkMjsgLy8gIyMjIHJlbW92ZSBpbiBRdCA0LjAKCiAgICBRQ2hhcgllYXRfd3MoKTsKICAgIHVpbnQgCXRzX2dldGxpbmUoIFFDaGFyKiApOwogICAgdm9pZAl0c191bmdldGMoIFFDaGFyICk7CiAgICBRQ2hhcgl0c19nZXRjKCk7CiAgICB1aW50CXRzX2dldGJ1ZiggUUNoYXIqLCB1aW50ICk7CiAgICB2b2lkCXRzX3B1dGMoaW50KTsKICAgIHZvaWQJdHNfcHV0YyhRQ2hhcik7CiAgICBib29sCXRzX2lzc3BhY2UoUUNoYXIpOwogICAgYm9vbAl0c19pc2RpZ2l0KFFDaGFyKTsKICAgIHVsb25nCWlucHV0X2JpbigpOwogICAgdWxvbmcJaW5wdXRfb2N0KCk7CiAgICB1bG9uZwlpbnB1dF9kZWMoKTsKICAgIHVsb25nCWlucHV0X2hleCgpOwogICAgZG91YmxlCWlucHV0X2RvdWJsZSgpOwogICAgUVRleHRTdHJlYW0gJndyaXRlQmxvY2soIGNvbnN0IGNoYXIqIHAsIHVpbnQgbGVuICk7CiAgICBRVGV4dFN0cmVhbSAmd3JpdGVCbG9jayggY29uc3QgUUNoYXIqIHAsIHVpbnQgbGVuICk7Cgpwcml2YXRlOgkvLyBEaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRVGV4dFN0cmVhbSggY29uc3QgUVRleHRTdHJlYW0gJiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPSggY29uc3QgUVRleHRTdHJlYW0gJiApOwojZW5kaWYKfTsKCnR5cGVkZWYgUVRleHRTdHJlYW0gUVRTOwoKY2xhc3MgUV9FWFBPUlQgUVRleHRJU3RyZWFtIDogcHVibGljIFFUZXh0U3RyZWFtIHsKcHVibGljOgogICAgUVRleHRJU3RyZWFtKCBjb25zdCBRU3RyaW5nKiBzICkgOgoJUVRleHRTdHJlYW0oKFFTdHJpbmcqKXMsSU9fUmVhZE9ubHkpIHsgfQogICAgUVRleHRJU3RyZWFtKCBRQnl0ZUFycmF5IGJhICkgOgoJUVRleHRTdHJlYW0oYmEsSU9fUmVhZE9ubHkpIHsgfQogICAgUVRleHRJU3RyZWFtKCBGSUxFICpmICkgOgoJUVRleHRTdHJlYW0oZixJT19SZWFkT25seSkgeyB9Cgpwcml2YXRlOgkvLyBEaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRVGV4dElTdHJlYW0oIGNvbnN0IFFUZXh0SVN0cmVhbSAmICk7CiAgICBRVGV4dElTdHJlYW0gJm9wZXJhdG9yPSggY29uc3QgUVRleHRJU3RyZWFtICYgKTsKI2VuZGlmCn07CgpjbGFzcyBRX0VYUE9SVCBRVGV4dE9TdHJlYW0gOiBwdWJsaWMgUVRleHRTdHJlYW0gewpwdWJsaWM6CiAgICBRVGV4dE9TdHJlYW0oIFFTdHJpbmcqIHMgKSA6CglRVGV4dFN0cmVhbShzLElPX1dyaXRlT25seSkgeyB9CiAgICBRVGV4dE9TdHJlYW0oIFFCeXRlQXJyYXkgYmEgKSA6CglRVGV4dFN0cmVhbShiYSxJT19Xcml0ZU9ubHkpIHsgfQogICAgUVRleHRPU3RyZWFtKCBGSUxFICpmICkgOgoJUVRleHRTdHJlYW0oZixJT19Xcml0ZU9ubHkpIHsgfQoKcHJpdmF0ZToJLy8gRGlzYWJsZWQgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9CiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUVRleHRPU3RyZWFtKCBjb25zdCBRVGV4dE9TdHJlYW0gJiApOwogICAgUVRleHRPU3RyZWFtICZvcGVyYXRvcj0oIGNvbnN0IFFUZXh0T1N0cmVhbSAmICk7CiNlbmRpZgp9OwoKLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgppbmxpbmUgUUlPRGV2aWNlICpRVGV4dFN0cmVhbTo6ZGV2aWNlKCkgY29uc3QKeyByZXR1cm4gZGV2OyB9CgppbmxpbmUgYm9vbCBRVGV4dFN0cmVhbTo6YXRFbmQoKSBjb25zdAp7IHJldHVybiBkZXYgPyBkZXYtPmF0RW5kKCkgOiBGQUxTRTsgfQoKaW5saW5lIGJvb2wgUVRleHRTdHJlYW06OmVvZigpIGNvbnN0CnsgcmV0dXJuIGF0RW5kKCk7IH0KCmlubGluZSBpbnQgUVRleHRTdHJlYW06OmZsYWdzKCkgY29uc3QKeyByZXR1cm4gZmZsYWdzOyB9CgppbmxpbmUgaW50IFFUZXh0U3RyZWFtOjpmbGFncyggaW50IGYgKQp7IGludCBvbGRmID0gZmZsYWdzOyAgZmZsYWdzID0gZjsgIHJldHVybiBvbGRmOyB9CgppbmxpbmUgaW50IFFUZXh0U3RyZWFtOjpzZXRmKCBpbnQgYml0cyApCnsgaW50IG9sZGYgPSBmZmxhZ3M7ICBmZmxhZ3MgfD0gYml0czsgIHJldHVybiBvbGRmOyB9CgppbmxpbmUgaW50IFFUZXh0U3RyZWFtOjpzZXRmKCBpbnQgYml0cywgaW50IG1hc2sgKQp7IGludCBvbGRmID0gZmZsYWdzOyAgZmZsYWdzID0gKGZmbGFncyAmIH5tYXNrKSB8IChiaXRzICYgbWFzayk7IHJldHVybiBvbGRmOyB9CgppbmxpbmUgaW50IFFUZXh0U3RyZWFtOjp1bnNldGYoIGludCBiaXRzICkKeyBpbnQgb2xkZiA9IGZmbGFnczsgIGZmbGFncyAmPSB+Yml0czsJcmV0dXJuIG9sZGY7IH0KCmlubGluZSBpbnQgUVRleHRTdHJlYW06OndpZHRoKCkgY29uc3QKeyByZXR1cm4gZndpZHRoOyB9CgppbmxpbmUgaW50IFFUZXh0U3RyZWFtOjp3aWR0aCggaW50IHcgKQp7IGludCBvbGR3ID0gZndpZHRoOyAgZndpZHRoID0gdzsgIHJldHVybiBvbGR3OwkgfQoKaW5saW5lIGludCBRVGV4dFN0cmVhbTo6ZmlsbCgpIGNvbnN0CnsgcmV0dXJuIGZpbGxjaGFyOyB9CgppbmxpbmUgaW50IFFUZXh0U3RyZWFtOjpmaWxsKCBpbnQgZiApCnsgaW50IG9sZGMgPSBmaWxsY2hhcjsJZmlsbGNoYXIgPSBmOyAgcmV0dXJuIG9sZGM7ICB9CgppbmxpbmUgaW50IFFUZXh0U3RyZWFtOjpwcmVjaXNpb24oKSBjb25zdAp7IHJldHVybiBmcHJlYzsgfQoKaW5saW5lIGludCBRVGV4dFN0cmVhbTo6cHJlY2lzaW9uKCBpbnQgcCApCnsgaW50IG9sZHAgPSBmcHJlYzsgIGZwcmVjID0gcDsJIHJldHVybiBvbGRwOyAgfQoKLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwppbmxpbmUgUUNoYXIgUVRleHRTdHJlYW06OnRzX2dldGMoKQp7IFFDaGFyIHI7IHJldHVybiAoIHRzX2dldGJ1ZiggJnIsMSApID09IDEgPyByIDogUUNoYXIoKHVzaG9ydCkweGZmZmYpICk7IH0KCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgp0eXBlZGVmIFFUZXh0U3RyZWFtICYgKCpRVFNGVU5DKShRVGV4dFN0cmVhbSAmKTsvLyBtYW5pcHVsYXRvciBmdW5jdGlvbgp0eXBlZGVmIGludCAoUVRleHRTdHJlYW06OipRVFNNRkkpKGludCk7CS8vIG1hbmlwdWxhdG9yIHcvaW50IGFyZ3VtZW50CgpjbGFzcyBRX0VYUE9SVCBRVFNNYW5pcCB7CQkJLy8gdGV4dCBzdHJlYW0gbWFuaXB1bGF0b3IKcHVibGljOgogICAgUVRTTWFuaXAoIFFUU01GSSBtLCBpbnQgYSApIHsgbWY9bTsgYXJnPWE7IH0KICAgIHZvaWQgZXhlYyggUVRleHRTdHJlYW0gJnMgKSB7IChzLiptZikoYXJnKTsgfQpwcml2YXRlOgogICAgUVRTTUZJIG1mOwkJCQkJLy8gUVRleHRTdHJlYW0gbWVtYmVyIGZ1bmN0aW9uCiAgICBpbnQJICAgYXJnOwkJCQkJLy8gbWVtYmVyIGZ1bmN0aW9uIGFyZ3VtZW50Cn07CgpRX0VYUE9SVCBpbmxpbmUgUVRleHRTdHJlYW0gJm9wZXJhdG9yPj4oIFFUZXh0U3RyZWFtICZzLCBRVFNGVU5DIGYgKQp7IHJldHVybiAoKmYpKCBzICk7IH0KClFfRVhQT1JUIGlubGluZSBRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggUVRleHRTdHJlYW0gJnMsIFFUU0ZVTkMgZiApCnsgcmV0dXJuICgqZikoIHMgKTsgfQoKUV9FWFBPUlQgaW5saW5lIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCBRVGV4dFN0cmVhbSAmcywgUVRTTWFuaXAgbSApCnsgbS5leGVjKHMpOyByZXR1cm4gczsgfQoKUV9FWFBPUlQgUVRleHRTdHJlYW0gJmJpbiggUVRleHRTdHJlYW0gJnMgKTsJLy8gc2V0IGJpbiBub3RhdGlvbgpRX0VYUE9SVCBRVGV4dFN0cmVhbSAmb2N0KCBRVGV4dFN0cmVhbSAmcyApOwkvLyBzZXQgb2N0IG5vdGF0aW9uClFfRVhQT1JUIFFUZXh0U3RyZWFtICZkZWMoIFFUZXh0U3RyZWFtICZzICk7CS8vIHNldCBkZWMgbm90YXRpb24KUV9FWFBPUlQgUVRleHRTdHJlYW0gJmhleCggUVRleHRTdHJlYW0gJnMgKTsJLy8gc2V0IGhleCBub3RhdGlvbgpRX0VYUE9SVCBRVGV4dFN0cmVhbSAmZW5kbCggUVRleHRTdHJlYW0gJnMgKTsJLy8gaW5zZXJ0IEVPTCAoJ1xuJykKUV9FWFBPUlQgUVRleHRTdHJlYW0gJmZsdXNoKCBRVGV4dFN0cmVhbSAmcyApOwkvLyBmbHVzaCBvdXRwdXQKUV9FWFBPUlQgUVRleHRTdHJlYW0gJndzKCBRVGV4dFN0cmVhbSAmcyApOwkvLyBlYXQgd2hpdGVzcGFjZSBvbiBpbnB1dApRX0VYUE9SVCBRVGV4dFN0cmVhbSAmcmVzZXQoIFFUZXh0U3RyZWFtICZzICk7CS8vIHNldCBkZWZhdWx0IGZsYWdzCgpRX0VYUE9SVCBpbmxpbmUgUVRTTWFuaXAgcVNldFcoIGludCB3ICkKewogICAgUVRTTUZJIGZ1bmMgPSAmUVRleHRTdHJlYW06OndpZHRoOwogICAgcmV0dXJuIFFUU01hbmlwKGZ1bmMsdyk7Cn0KClFfRVhQT1JUIGlubGluZSBRVFNNYW5pcCBxU2V0RmlsbCggaW50IGYgKQp7CiAgICBRVFNNRkkgZnVuYyA9ICZRVGV4dFN0cmVhbTo6ZmlsbDsKICAgIHJldHVybiBRVFNNYW5pcChmdW5jLGYpOwp9CgpRX0VYUE9SVCBpbmxpbmUgUVRTTWFuaXAgcVNldFByZWNpc2lvbiggaW50IHAgKQp7CiAgICBRVFNNRkkgZnVuYyA9ICZRVGV4dFN0cmVhbTo6cHJlY2lzaW9uOwogICAgcmV0dXJuIFFUU01hbmlwKGZ1bmMscCk7Cn0KCiNlbmRpZiAvLyBRVF9OT19URVhUU1RSRUFNCiNlbmRpZiAvLyBRVEVYVFNUUkVBTV9ICgAAABgAcQB3AGgAYQB0AHMAdABoAGkAcwAuAGgAAAoTLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFXSEFUU1RISVNfSAojZGVmaW5lIFFXSEFUU1RISVNfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxb2JqZWN0LmgiCiNlbmRpZiAvLyBRVF9ICgojaWZuZGVmIFFUX05PX1dIQVRTVEhJUwoKI2luY2x1ZGUgInFjdXJzb3IuaCIKCmNsYXNzIFFUb29sQnV0dG9uOwpjbGFzcyBRUG9wdXBNZW51OwpjbGFzcyBRU3R5bGVTaGVldDsKCmNsYXNzIFFfRVhQT1JUIFFXaGF0c1RoaXM6IHB1YmxpYyBRdAp7CnB1YmxpYzoKICAgIFFXaGF0c1RoaXMoIFFXaWRnZXQgKik7CiAgICB2aXJ0dWFsIH5RV2hhdHNUaGlzKCk7CgogICAgdmlydHVhbCBRU3RyaW5nIHRleHQoIGNvbnN0IFFQb2ludCAmICk7CiAgICB2aXJ0dWFsIGJvb2wgY2xpY2tlZCggY29uc3QgUVN0cmluZyYgaHJlZiApOwoKICAgIC8vIHRoZSBjb21tb24gc3RhdGljIGZ1bmN0aW9ucwogICAgc3RhdGljIHZvaWQgc2V0Rm9udCggY29uc3QgUUZvbnQgJmZvbnQgKTsgICAgCiAgICAKICAgIHN0YXRpYyB2b2lkIGFkZCggUVdpZGdldCAqLCBjb25zdCBRU3RyaW5nICYpOwogICAgc3RhdGljIHZvaWQgcmVtb3ZlKCBRV2lkZ2V0ICogKTsKICAgIHN0YXRpYyBRU3RyaW5nIHRleHRGb3IoIFFXaWRnZXQgKiwgY29uc3QgUVBvaW50ICYgcG9zID0gUVBvaW50KCksIGJvb2wgaW5jbHVkZVBhcmVudHMgPSBGQUxTRSApOwoKICAgIHN0YXRpYyBRVG9vbEJ1dHRvbiAqIHdoYXRzVGhpc0J1dHRvbiggUVdpZGdldCAqIHBhcmVudCApOwoKICAgIHN0YXRpYyB2b2lkIGVudGVyV2hhdHNUaGlzTW9kZSgpOwogICAgc3RhdGljIGJvb2wgaW5XaGF0c1RoaXNNb2RlKCk7CiAgICBzdGF0aWMgdm9pZCBsZWF2ZVdoYXRzVGhpc01vZGUoIGNvbnN0IFFTdHJpbmcmID0gUVN0cmluZzo6bnVsbCwgY29uc3QgUVBvaW50JiBwb3MgPSBRQ3Vyc29yOjpwb3MoKSwgUVdpZGdldCogdyA9IDAgKTsKCiAgICBzdGF0aWMgdm9pZCBkaXNwbGF5KCBjb25zdCBRU3RyaW5nJiB0ZXh0LCBjb25zdCBRUG9pbnQmIHBvcyA9IFFDdXJzb3I6OnBvcygpLCBRV2lkZ2V0KiB3ID0gMCApOwp9OwoKI2VuZGlmIC8vIFFUX05PX1dIQVRTVEhJUwoKI2VuZGlmIC8vIFFXSEFUU1RISVNfSAoAAAAkAHEAdwBzAGsAZQB5AGIAbwBhAHIAZABfAHEAbgB4ADQALgBoAAAJRwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdTS0VZQk9BUkRfUU5YNF9ICiNkZWZpbmUgUVdTS0VZQk9BUkRfUU5YNF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInF3aW5kb3dzeXN0ZW1fcXdzLmgiCiNpbmNsdWRlICJxd3N1dGlsc19xd3MuaCIKI2luY2x1ZGUgInFnZnhfcXdzLmgiCiNlbmRpZiAvLyBRVF9ICiAKI2luY2x1ZGUgPHFhcHBsaWNhdGlvbi5oPgojaW5jbHVkZSA8cXNvY2tldG5vdGlmaWVyLmg+CiNpbmNsdWRlIDxxbmFtZXNwYWNlLmg+CiNpbmNsdWRlIDxxdGltZXIuaD4KIAojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgogCiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KIAojaWYgZGVmaW5lZChRX09TX1FOWDQpCiNpZm5kZWYgUVdTUU5YNEtCX0gKI2RlZmluZSBRV1NRTlg0S0JfSAoKI2luY2x1ZGUgPHFrZXlib2FyZF9xd3MuaD4KCgpjbGFzcyBRV1NRbng0S2V5Ym9hcmRIYW5kbGVyIDogcHVibGljIFFXU0tleWJvYXJkSGFuZGxlcgp7CiAgICBRX09CSkVDVApwdWJsaWM6CiAgICBRV1NRbng0S2V5Ym9hcmRIYW5kbGVyKCk7CiAgICB+UVdTUW54NEtleWJvYXJkSGFuZGxlcigpOwoKICAgIHZvaWQgZG9LZXkodWNoYXIpOwoKICAgIHB1YmxpYyBzbG90czoKICAgICAgICB2b2lkIHJlYWRLYmREYXRhKGludCk7Cgpwcml2YXRlOgogICAgZW51bSBHdWlkYW50U3RhdGUgewoJR3VpZGFudE5vbmUsIEd1aWRhbnRQcmVzc2VkLCBHdWlkYW50UmVsZWFzZWQsIEd1aWRhbnREcm9wcGVkCiAgICB9IGdTdGF0ZTsKICAgIGludCBzaGlmdDsKICAgIGludCBhbHQ7CiAgICBpbnQgY3RybDsKICAgIGJvb2wgZXh0ZW5kZWQ7CiAgICBib29sIGNhcHM7CiAgICBpbnQgbW9kaWZpZXJzOwogICAgaW50IHByZXZ1bmk7CiAgICBpbnQgcHJldmtleTsKCiAgICBpbnQga2JkRkQ7CiAgICBRTGlzdDxRU29ja2V0Tm90aWZpZXI+IG5vdGlmaWVyczsKfTsKCiNlbmRpZgojZW5kaWYKCiNlbmRpZiAvLyBRV1NLRVlCT0FSRF9RTlg0X0gKAAAAEgBxAHQAYQBiAGQAbABnAC4AaAAABCgvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2lmbmRlZiBRVEFCRExHX0gKI2RlZmluZSBRVEFCRExHX0gKI2luY2x1ZGUgInF0YWJkaWFsb2cuaCIKI2VuZGlmCgAAABQAcQBzAHEAbABmAG8AcgBtAC4AaAAADAovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVNRTEZPUk1fSAojZGVmaW5lIFFTUUxGT1JNX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicW9iamVjdC5oIgojaW5jbHVkZSAicW1hcC5oIgojZW5kaWYgLy8gUVRfSAoKI2lmICFkZWZpbmVkKCBRVF9NT0RVTEVfU1FMICkgfHwgZGVmaW5lZCggUVRfTElDRU5TRV9QUk9GRVNTSU9OQUwgKQojZGVmaW5lIFFNX0VYUE9SVF9TUUwKI2Vsc2UKI2RlZmluZSBRTV9FWFBPUlRfU1FMIFFfRVhQT1JUCiNlbmRpZgoKI2lmbmRlZiBRVF9OT19TUUxfRk9STQoKY2xhc3MgUVNxbEZpZWxkOwpjbGFzcyBRU3FsUmVjb3JkOwpjbGFzcyBRU3FsRWRpdG9yRmFjdG9yeTsKY2xhc3MgUVNxbFByb3BlcnR5TWFwOwpjbGFzcyBRV2lkZ2V0OwpjbGFzcyBRU3FsRm9ybVByaXZhdGU7CgpjbGFzcyBRTV9FWFBPUlRfU1FMIFFTcWxGb3JtIDogcHVibGljIFFPYmplY3QKewogICAgUV9PQkpFQ1QKcHVibGljOgogICAgUVNxbEZvcm0oIFFPYmplY3QgKiBwYXJlbnQgPSAwLCBjb25zdCBjaGFyICogbmFtZSA9IDAgKTsKICAgIH5RU3FsRm9ybSgpOwoKICAgIHZpcnR1YWwgdm9pZCBpbnNlcnQoIFFXaWRnZXQgKiB3aWRnZXQsIGNvbnN0IFFTdHJpbmcmIGZpZWxkICk7CiAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKCBjb25zdCBRU3RyaW5nJiBmaWVsZCApOwogICAgdWludCAgICAgICAgIGNvdW50KCkgY29uc3Q7CgogICAgUVdpZGdldCAqICAgd2lkZ2V0KCB1aW50IGkgKSBjb25zdDsKICAgIFFTcWxGaWVsZCAqIHdpZGdldFRvRmllbGQoIFFXaWRnZXQgKiB3aWRnZXQgKSBjb25zdDsKICAgIFFXaWRnZXQgKiAgIGZpZWxkVG9XaWRnZXQoIFFTcWxGaWVsZCAqIGZpZWxkICkgY29uc3Q7CgogICAgdm9pZCAgICAgICAgaW5zdGFsbFByb3BlcnR5TWFwKCBRU3FsUHJvcGVydHlNYXAgKiBtYXAgKTsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0UmVjb3JkKCBRU3FsUmVjb3JkKiBidWYgKTsKCnB1YmxpYyBzbG90czoKICAgIHZpcnR1YWwgdm9pZCByZWFkRmllbGQoIFFXaWRnZXQgKiB3aWRnZXQgKTsKICAgIHZpcnR1YWwgdm9pZCB3cml0ZUZpZWxkKCBRV2lkZ2V0ICogd2lkZ2V0ICk7CiAgICB2aXJ0dWFsIHZvaWQgcmVhZEZpZWxkcygpOwogICAgdmlydHVhbCB2b2lkIHdyaXRlRmllbGRzKCk7CgogICAgdmlydHVhbCB2b2lkIGNsZWFyKCk7CiAgICB2aXJ0dWFsIHZvaWQgY2xlYXJWYWx1ZXMoIGJvb2wgbnVsbGlmeSA9IEZBTFNFICk7Cgpwcm90ZWN0ZWQ6CiAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0KCBRV2lkZ2V0ICogd2lkZ2V0LCBRU3FsRmllbGQgKiBmaWVsZCApOwogICAgdmlydHVhbCB2b2lkIHJlbW92ZSggUVdpZGdldCAqIHdpZGdldCApOwogICAgdm9pZCBjbGVhck1hcCgpOwoKcHJpdmF0ZToKICAgIHZpcnR1YWwgdm9pZCBzeW5jKCk7CiAgICBRU3FsRm9ybVByaXZhdGUqIGQ7CgojaWYgZGVmaW5lZChRX0RJU0FCTEVfQ09QWSkgLy8gRGlzYWJsZWQgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9CiAgICBRU3FsRm9ybSggY29uc3QgUVNxbEZvcm0gJiApOwogICAgUVNxbEZvcm0gJm9wZXJhdG9yPSggY29uc3QgUVNxbEZvcm0gJiApOwojZW5kaWYKfTsKCiNlbmRpZiAvLyBRVF9OT19TUUwKI2VuZGlmIC8vIFFTUUxGT1JNX0gKAAAAGABxAHYAYQBsAHUAZQBsAGkAcwB0AC4AaAAAR9kvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVZBTFVFTElTVF9ICiNkZWZpbmUgUVZBTFVFTElTVF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInF0bC5oIgojaW5jbHVkZSAicXNoYXJlZC5oIgojaW5jbHVkZSAicWRhdGFzdHJlYW0uaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fU1RMCiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPGxpc3Q+CiNlbmRpZgoKLy8jZGVmaW5lIFFUX0NIRUNLX1ZBTFVFTElTVF9SQU5HRQoKI2lmIGRlZmluZWQoUV9DQ19NU1ZDKQojcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0Mjg0KSAvLyAicmV0dXJuIHR5cGUgZm9yIG9wZXJhdG9yIC0+IGlzIG5vdCBhIFVEVCIKI2VuZGlmCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgUVZhbHVlTGlzdE5vZGUKewpwdWJsaWM6CiAgICBRVmFsdWVMaXN0Tm9kZSggY29uc3QgVCYgdCApIDogZGF0YSggdCApIHsgfQogICAgUVZhbHVlTGlzdE5vZGUoKSB7IH0KI2lmIGRlZmluZWQoUV9URU1QTEFURURMTCkKICAgIC8vIFdvcmthcm91bmQgTVMgYnVnIGluIG1lbW9yeSBkZS9hbGxvY2F0aW9uIGluIERMTCB2cy4gRVhFCiAgICB2aXJ0dWFsIH5RVmFsdWVMaXN0Tm9kZSgpIHsgfQojZW5kaWYKCiAgICBRVmFsdWVMaXN0Tm9kZTxUPiogbmV4dDsKICAgIFFWYWx1ZUxpc3ROb2RlPFQ+KiBwcmV2OwogICAgVCBkYXRhOwp9OwoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgUVZhbHVlTGlzdEl0ZXJhdG9yCnsKIHB1YmxpYzoKICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgdHlwZWRlZiBRVmFsdWVMaXN0Tm9kZTxUPiogTm9kZVB0cjsKI2lmbmRlZiBRVF9OT19TVEwKICAgIHR5cGVkZWYgc3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAgaXRlcmF0b3JfY2F0ZWdvcnk7CiNlbmRpZgogICAgdHlwZWRlZiBUICAgICAgICB2YWx1ZV90eXBlOwogICAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwojaWZuZGVmIFFUX05PX1NUTAogICAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKI2Vsc2UKICAgIHR5cGVkZWYgaW50IGRpZmZlcmVuY2VfdHlwZTsKI2VuZGlmCiAgICB0eXBlZGVmIFQqICAgcG9pbnRlcjsKICAgIHR5cGVkZWYgVCYgcmVmZXJlbmNlOwoKICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIE5vZGVQdHIgbm9kZTsKCiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBRVmFsdWVMaXN0SXRlcmF0b3IoKSA6IG5vZGUoIDAgKSB7fQogICAgUVZhbHVlTGlzdEl0ZXJhdG9yKCBOb2RlUHRyIHAgKSA6IG5vZGUoIHAgKSB7fQogICAgUVZhbHVlTGlzdEl0ZXJhdG9yKCBjb25zdCBRVmFsdWVMaXN0SXRlcmF0b3I8VD4mIGl0ICkgOiBub2RlKCBpdC5ub2RlICkge30KCiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiYgaXQgKSBjb25zdCB7IHJldHVybiBub2RlID09IGl0Lm5vZGU7IH0KICAgIGJvb2wgb3BlcmF0b3IhPSggY29uc3QgUVZhbHVlTGlzdEl0ZXJhdG9yPFQ+JiBpdCApIGNvbnN0IHsgcmV0dXJuIG5vZGUgIT0gaXQubm9kZTsgfQogICAgY29uc3QgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gbm9kZS0+ZGF0YTsgfQogICAgVCYgb3BlcmF0b3IqKCkgeyByZXR1cm4gbm9kZS0+ZGF0YTsgfQogICAgLy8gVURUIGZvciBUID0geCoKICAgIC8vIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmbm9kZS0+ZGF0YTsgfQoKICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKygpIHsKCW5vZGUgPSBub2RlLT5uZXh0OwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiBvcGVyYXRvcisrKGludCkgewoJUVZhbHVlTGlzdEl0ZXJhdG9yPFQ+IHRtcCA9ICp0aGlzOwoJbm9kZSA9IG5vZGUtPm5leHQ7CglyZXR1cm4gdG1wOwogICAgfQoKICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiYgb3BlcmF0b3ItLSgpIHsKCW5vZGUgPSBub2RlLT5wcmV2OwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiBvcGVyYXRvci0tKGludCkgewoJUVZhbHVlTGlzdEl0ZXJhdG9yPFQ+IHRtcCA9ICp0aGlzOwoJbm9kZSA9IG5vZGUtPnByZXY7CglyZXR1cm4gdG1wOwogICAgfQoKICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiYgb3BlcmF0b3IrPSggaW50IGogKSB7Cgl3aGlsZSAoIGotLSApCgkgICAgbm9kZSA9IG5vZGUtPm5leHQ7CglyZXR1cm4gKnRoaXM7CiAgICB9CgogICAgUVZhbHVlTGlzdEl0ZXJhdG9yPFQ+JiBvcGVyYXRvci09KCBpbnQgaiApIHsKCXdoaWxlICggai0tICkKCSAgICBub2RlID0gbm9kZS0+cHJldjsKCXJldHVybiAqdGhpczsKICAgIH0KCn07Cgp0ZW1wbGF0ZTxjbGFzcyBUPgpjbGFzcyBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcgp7CiBwdWJsaWM6CiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHR5cGVkZWYgUVZhbHVlTGlzdE5vZGU8VD4qIE5vZGVQdHI7CiNpZm5kZWYgUVRfTk9fU1RMCiAgICB0eXBlZGVmIHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgIGl0ZXJhdG9yX2NhdGVnb3J5OwojZW5kaWYKICAgIHR5cGVkZWYgVCAgICAgICAgdmFsdWVfdHlwZTsKICAgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKI2lmbmRlZiBRVF9OT19TVEwKICAgIHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJlbmNlX3R5cGU7CiNlbHNlCiAgICB0eXBlZGVmIGludCBkaWZmZXJlbmNlX3R5cGU7CiNlbmRpZgogICAgdHlwZWRlZiBjb25zdCBUKiAgIHBvaW50ZXI7CiAgICB0eXBlZGVmIGNvbnN0IFQmIHJlZmVyZW5jZTsKCiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBOb2RlUHRyIG5vZGU7CgogICAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3IoKSA6IG5vZGUoIDAgKSB7fQogICAgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3IoIE5vZGVQdHIgcCApIDogbm9kZSggcCApIHt9CiAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvciggY29uc3QgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8VD4mIGl0ICkgOiBub2RlKCBpdC5ub2RlICkge30KICAgIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yKCBjb25zdCBRVmFsdWVMaXN0SXRlcmF0b3I8VD4mIGl0ICkgOiBub2RlKCBpdC5ub2RlICkge30KCiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPFQ+JiBpdCApIGNvbnN0IHsgcmV0dXJuIG5vZGUgPT0gaXQubm9kZTsgfQogICAgYm9vbCBvcGVyYXRvciE9KCBjb25zdCBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxUPiYgaXQgKSBjb25zdCB7IHJldHVybiBub2RlICE9IGl0Lm5vZGU7IH0KICAgIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIG5vZGUtPmRhdGE7IH0KICAgIC8vIFVEVCBmb3IgVCA9IHgqCiAgICAvLyBjb25zdCBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJm5vZGUtPmRhdGE7IH0KCiAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKygpIHsKCW5vZGUgPSBub2RlLT5uZXh0OwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPFQ+IG9wZXJhdG9yKysoaW50KSB7CglRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxUPiB0bXAgPSAqdGhpczsKCW5vZGUgPSBub2RlLT5uZXh0OwoJcmV0dXJuIHRtcDsKICAgIH0KCiAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxUPiYgb3BlcmF0b3ItLSgpIHsKCW5vZGUgPSBub2RlLT5wcmV2OwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPFQ+IG9wZXJhdG9yLS0oaW50KSB7CglRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxUPiB0bXAgPSAqdGhpczsKCW5vZGUgPSBub2RlLT5wcmV2OwoJcmV0dXJuIHRtcDsKICAgIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBRVmFsdWVMaXN0UHJpdmF0ZSA6IHB1YmxpYyBRU2hhcmVkCnsKcHVibGljOgogICAgLyogICAgICAgICAgICAgICAgICAgICAgICovCiAgICB0eXBlZGVmIFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiBJdGVyYXRvcjsKICAgIHR5cGVkZWYgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8VD4gQ29uc3RJdGVyYXRvcjsKICAgIHR5cGVkZWYgUVZhbHVlTGlzdE5vZGU8VD4gTm9kZTsKICAgIHR5cGVkZWYgUVZhbHVlTGlzdE5vZGU8VD4qIE5vZGVQdHI7CiAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CgogICAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgUVZhbHVlTGlzdFByaXZhdGUoKTsKICAgIFFWYWx1ZUxpc3RQcml2YXRlKCBjb25zdCBRVmFsdWVMaXN0UHJpdmF0ZTxUPiYgX3AgKTsKCiAgICB2b2lkIGRlcmVmQW5kRGVsZXRlKCkgLy8gIyMjIGhhY2sgdG8gZ2V0IGFyb3VuZCBocC1jYyBicmFpbiBkYW1hZ2UKICAgIHsKCWlmICggZGVyZWYoKSApCgkgICAgZGVsZXRlIHRoaXM7CiAgICB9CgojaWYgZGVmaW5lZChRX1RFTVBMQVRFRExMKQogICAgLy8gV29ya2Fyb3VuZCBNUyBidWcgaW4gbWVtb3J5IGRlL2FsbG9jYXRpb24gaW4gRExMIHZzLiBFWEUKICAgIHZpcnR1YWwKI2VuZGlmCiAgICB+UVZhbHVlTGlzdFByaXZhdGUoKTsKCiAgICBJdGVyYXRvciBpbnNlcnQoIEl0ZXJhdG9yIGl0LCBjb25zdCBUJiB4ICk7CiAgICBJdGVyYXRvciByZW1vdmUoIEl0ZXJhdG9yIGl0ICk7CiAgICBOb2RlUHRyIGZpbmQoIE5vZGVQdHIgc3RhcnQsIGNvbnN0IFQmIHggKSBjb25zdDsKICAgIGludCBmaW5kSW5kZXgoIE5vZGVQdHIgc3RhcnQsIGNvbnN0IFQmIHggKSBjb25zdDsKICAgIHVpbnQgY29udGFpbnMoIGNvbnN0IFQmIHggKSBjb25zdDsKICAgIHVpbnQgcmVtb3ZlKCBjb25zdCBUJiB4ICk7CiAgICBOb2RlUHRyIGF0KCBzaXplX3R5cGUgaSApIGNvbnN0OwogICAgdm9pZCBjbGVhcigpOwoKICAgIE5vZGVQdHIgbm9kZTsKICAgIHNpemVfdHlwZSBub2RlczsKfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpRX0lOTElORV9URU1QTEFURVMgUVZhbHVlTGlzdFByaXZhdGU8VD46OlFWYWx1ZUxpc3RQcml2YXRlKCkKewogICAgbm9kZSA9IG5ldyBOb2RlOyBub2RlLT5uZXh0ID0gbm9kZS0+cHJldiA9IG5vZGU7IG5vZGVzID0gMDsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+ClFfSU5MSU5FX1RFTVBMQVRFUyBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6UVZhbHVlTGlzdFByaXZhdGUoIGNvbnN0IFFWYWx1ZUxpc3RQcml2YXRlPFQ+JiBfcCApCiAgICA6IFFTaGFyZWQoKQp7CiAgICBub2RlID0gbmV3IE5vZGU7IG5vZGUtPm5leHQgPSBub2RlLT5wcmV2ID0gbm9kZTsgbm9kZXMgPSAwOwogICAgSXRlcmF0b3IgYiggX3Aubm9kZS0+bmV4dCApOwogICAgSXRlcmF0b3IgZSggX3Aubm9kZSApOwogICAgSXRlcmF0b3IgaSggbm9kZSApOwogICAgd2hpbGUoIGIgIT0gZSApCglpbnNlcnQoIGksICpiKysgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+ClFfSU5MSU5FX1RFTVBMQVRFUyBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6flFWYWx1ZUxpc3RQcml2YXRlKCkgewogICAgTm9kZVB0ciBwID0gbm9kZS0+bmV4dDsKICAgIHdoaWxlKCBwICE9IG5vZGUgKSB7CglOb2RlUHRyIHggPSBwLT5uZXh0OwoJZGVsZXRlIHA7CglwID0geDsKICAgIH0KICAgIGRlbGV0ZSBub2RlOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KUV9JTkxJTkVfVEVNUExBVEVTIFFfVFlQRU5BTUUgUVZhbHVlTGlzdFByaXZhdGU8VD46Okl0ZXJhdG9yIFFWYWx1ZUxpc3RQcml2YXRlPFQ+OjppbnNlcnQoIFFfVFlQRU5BTUUgUVZhbHVlTGlzdFByaXZhdGU8VD46Okl0ZXJhdG9yIGl0LCBjb25zdCBUJiB4ICkKewogICAgTm9kZVB0ciBwID0gbmV3IE5vZGUoIHggKTsKICAgIHAtPm5leHQgPSBpdC5ub2RlOwogICAgcC0+cHJldiA9IGl0Lm5vZGUtPnByZXY7CiAgICBpdC5ub2RlLT5wcmV2LT5uZXh0ID0gcDsKICAgIGl0Lm5vZGUtPnByZXYgPSBwOwogICAgbm9kZXMrKzsKICAgIHJldHVybiBwOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KUV9JTkxJTkVfVEVNUExBVEVTIFFfVFlQRU5BTUUgUVZhbHVlTGlzdFByaXZhdGU8VD46Okl0ZXJhdG9yIFFWYWx1ZUxpc3RQcml2YXRlPFQ+OjpyZW1vdmUoIFFfVFlQRU5BTUUgUVZhbHVlTGlzdFByaXZhdGU8VD46Okl0ZXJhdG9yIGl0ICkKewogICAgUV9BU1NFUlQgKCBpdC5ub2RlICE9IG5vZGUgKTsKICAgIE5vZGVQdHIgbmV4dCA9IGl0Lm5vZGUtPm5leHQ7CiAgICBOb2RlUHRyIHByZXYgPSBpdC5ub2RlLT5wcmV2OwogICAgcHJldi0+bmV4dCA9IG5leHQ7CiAgICBuZXh0LT5wcmV2ID0gcHJldjsKICAgIGRlbGV0ZSBpdC5ub2RlOwogICAgbm9kZXMtLTsKICAgIHJldHVybiBJdGVyYXRvciggbmV4dCApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KUV9JTkxJTkVfVEVNUExBVEVTIFFfVFlQRU5BTUUgUVZhbHVlTGlzdFByaXZhdGU8VD46Ok5vZGVQdHIgUVZhbHVlTGlzdFByaXZhdGU8VD46OmZpbmQoIFFfVFlQRU5BTUUgUVZhbHVlTGlzdFByaXZhdGU8VD46Ok5vZGVQdHIgc3RhcnQsIGNvbnN0IFQmIHggKSBjb25zdAp7CiAgICBDb25zdEl0ZXJhdG9yIGZpcnN0KCBzdGFydCApOwogICAgQ29uc3RJdGVyYXRvciBsYXN0KCBub2RlICk7CiAgICB3aGlsZSggZmlyc3QgIT0gbGFzdCkgewoJaWYgKCAqZmlyc3QgPT0geCApCgkgICAgcmV0dXJuIGZpcnN0Lm5vZGU7CgkrK2ZpcnN0OwogICAgfQogICAgcmV0dXJuIGxhc3Qubm9kZTsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+ClFfSU5MSU5FX1RFTVBMQVRFUyBpbnQgUVZhbHVlTGlzdFByaXZhdGU8VD46OmZpbmRJbmRleCggUV9UWVBFTkFNRSBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6Tm9kZVB0ciBzdGFydCwgY29uc3QgVCYgeCApIGNvbnN0CnsKICAgIENvbnN0SXRlcmF0b3IgZmlyc3QoIHN0YXJ0ICk7CiAgICBDb25zdEl0ZXJhdG9yIGxhc3QoIG5vZGUgKTsKICAgIGludCBwb3MgPSAwOwogICAgd2hpbGUoIGZpcnN0ICE9IGxhc3QpIHsKCWlmICggKmZpcnN0ID09IHggKQoJICAgIHJldHVybiBwb3M7CgkrK2ZpcnN0OwoJKytwb3M7CiAgICB9CiAgICByZXR1cm4gLTE7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgpRX0lOTElORV9URU1QTEFURVMgdWludCBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6Y29udGFpbnMoIGNvbnN0IFQmIHggKSBjb25zdAp7CiAgICB1aW50IHJlc3VsdCA9IDA7CiAgICBJdGVyYXRvciBmaXJzdCA9IEl0ZXJhdG9yKCBub2RlLT5uZXh0ICk7CiAgICBJdGVyYXRvciBsYXN0ID0gSXRlcmF0b3IoIG5vZGUgKTsKICAgIHdoaWxlKCBmaXJzdCAhPSBsYXN0KSB7CglpZiAoICpmaXJzdCA9PSB4ICkKCSAgICArK3Jlc3VsdDsKCSsrZmlyc3Q7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KUV9JTkxJTkVfVEVNUExBVEVTIHVpbnQgUVZhbHVlTGlzdFByaXZhdGU8VD46OnJlbW92ZSggY29uc3QgVCYgX3ggKQp7CiAgICBjb25zdCBUIHggPSBfeDsKICAgIHVpbnQgcmVzdWx0ID0gMDsKICAgIEl0ZXJhdG9yIGZpcnN0ID0gSXRlcmF0b3IoIG5vZGUtPm5leHQgKTsKICAgIEl0ZXJhdG9yIGxhc3QgPSBJdGVyYXRvciggbm9kZSApOwogICAgd2hpbGUoIGZpcnN0ICE9IGxhc3QpIHsKCWlmICggKmZpcnN0ID09IHggKSB7CgkgICAgZmlyc3QgPSByZW1vdmUoIGZpcnN0ICk7CgkgICAgKytyZXN1bHQ7Cgl9IGVsc2UKCSAgICArK2ZpcnN0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+ClFfSU5MSU5FX1RFTVBMQVRFUyBRX1RZUEVOQU1FIFFWYWx1ZUxpc3RQcml2YXRlPFQ+OjpOb2RlUHRyIFFWYWx1ZUxpc3RQcml2YXRlPFQ+OjphdCggc2l6ZV90eXBlIGkgKSBjb25zdAp7CiAgICBRX0FTU0VSVCggaSA8PSBub2RlcyApOwogICAgTm9kZVB0ciBwID0gbm9kZS0+bmV4dDsKICAgIGZvciggc2l6ZV90eXBlIHggPSAwOyB4IDwgaTsgKyt4ICkKCXAgPSBwLT5uZXh0OwogICAgcmV0dXJuIHA7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgpRX0lOTElORV9URU1QTEFURVMgdm9pZCBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6Y2xlYXIoKQp7CiAgICBub2RlcyA9IDA7CiAgICBOb2RlUHRyIHAgPSBub2RlLT5uZXh0OwogICAgd2hpbGUoIHAgIT0gbm9kZSApIHsKCU5vZGVQdHIgbmV4dCA9IHAtPm5leHQ7CglkZWxldGUgcDsKCXAgPSBuZXh0OwogICAgfQogICAgbm9kZS0+bmV4dCA9IG5vZGUtPnByZXYgPSBub2RlOwp9CgojaWZkZWYgUVRfQ0hFQ0tfUkFOR0UKIyBpZiAhZGVmaW5lZCggUVRfTk9fREVCVUcgKSAmJiBkZWZpbmVkKCBRVF9DSEVDS19WQUxVRUxJU1RfUkFOR0UgKQojICBkZWZpbmUgUVRfQ0hFQ0tfSU5WQUxJRF9MSVNUX0VMRU1FTlQgaWYgKCBlbXB0eSgpICkgcVdhcm5pbmcoICJRVmFsdWVMaXN0OiBXYXJuaW5nIGludmFsaWQgZWxlbWVudCIgKQojICBkZWZpbmUgUVRfQ0hFQ0tfSU5WQUxJRF9MSVNUX0VMRU1FTlRfRkFUQUwgUV9BU1NFUlQoICFlbXB0eSgpICk7CiMgZWxzZQojICBkZWZpbmUgUVRfQ0hFQ0tfSU5WQUxJRF9MSVNUX0VMRU1FTlQKIyAgZGVmaW5lIFFUX0NIRUNLX0lOVkFMSURfTElTVF9FTEVNRU5UX0ZBVEFMCiMgZW5kaWYKI2Vsc2UKIyBkZWZpbmUgUVRfQ0hFQ0tfSU5WQUxJRF9MSVNUX0VMRU1FTlQKIyBkZWZpbmUgUVRfQ0hFQ0tfSU5WQUxJRF9MSVNUX0VMRU1FTlRfRkFUQUwKI2VuZGlmCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgUURlZXBDb3B5OwoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIFFWYWx1ZUxpc3QKewpwdWJsaWM6CiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHR5cGVkZWYgUVZhbHVlTGlzdEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOwogICAgdHlwZWRlZiBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxUPiBjb25zdF9pdGVyYXRvcjsKICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOwogICAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwogICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOwogICAgdHlwZWRlZiB2YWx1ZV90eXBlJiByZWZlcmVuY2U7CiAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKICAgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKI2lmbmRlZiBRVF9OT19TVEwKICAgIHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJlbmNlX3R5cGU7CiNlbHNlCiAgICB0eXBlZGVmIGludCBkaWZmZXJlbmNlX3R5cGU7CiNlbmRpZgoKICAgIC8qICAgICAgICAgICAgICAgICAgKi8KICAgIFFWYWx1ZUxpc3QoKSB7IHNoID0gbmV3IFFWYWx1ZUxpc3RQcml2YXRlPFQ+OyB9CiAgICBRVmFsdWVMaXN0KCBjb25zdCBRVmFsdWVMaXN0PFQ+JiBsICkgeyBzaCA9IGwuc2g7IHNoLT5yZWYoKTsgfQojaWZuZGVmIFFUX05PX1NUTAogICAgUVZhbHVlTGlzdCggY29uc3Qgc3RkOjpsaXN0PFQ+JiBsICkKICAgIHsKCXNoID0gbmV3IFFWYWx1ZUxpc3RQcml2YXRlPFQ+OwoJcUNvcHkoIGwuYmVnaW4oKSwgbC5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKCAqdGhpcyApICk7CiAgICB9CiNlbmRpZgogICAgflFWYWx1ZUxpc3QoKSB7IHNoLT5kZXJlZkFuZERlbGV0ZSgpOyB9CgogICAgUVZhbHVlTGlzdDxUPiYgb3BlcmF0b3I9ICggY29uc3QgUVZhbHVlTGlzdDxUPiYgbCApCiAgICB7CglsLnNoLT5yZWYoKTsKCXNoLT5kZXJlZkFuZERlbGV0ZSgpOwoJc2ggPSBsLnNoOwoJcmV0dXJuICp0aGlzOwogICAgfQojaWZuZGVmIFFUX05PX1NUTAogICAgUVZhbHVlTGlzdDxUPiYgb3BlcmF0b3I9ICggY29uc3Qgc3RkOjpsaXN0PFQ+JiBsICkKICAgIHsKCWRldGFjaCgpOwoJcUNvcHkoIGwuYmVnaW4oKSwgbC5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKCAqdGhpcyApICk7CglyZXR1cm4gKnRoaXM7CiAgICB9CiAgICBib29sIG9wZXJhdG9yPT0gKCBjb25zdCBzdGQ6Omxpc3Q8VD4mIGwgKSBjb25zdAogICAgewoJaWYgKCBzaXplKCkgIT0gbC5zaXplKCkgKQoJICAgIHJldHVybiBGQUxTRTsKCWNvbnN0X2l0ZXJhdG9yIGl0MiA9IGJlZ2luKCk7CiNpZiAhZGVmaW5lZChRX0NDX01JUFMpCgl0eXBlbmFtZQojZW5kaWYKCXN0ZDo6bGlzdDxUPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBsLmJlZ2luKCk7Cglmb3IgKCA7IGl0MiAhPSBlbmQoKTsgKytpdDIsICsraXQgKQoJaWYgKCAhKCgqaXQyKSA9PSAoKml0KSkgKQoJICAgIHJldHVybiBGQUxTRTsKCXJldHVybiBUUlVFOwogICAgfQojZW5kaWYKICAgIGJvb2wgb3BlcmF0b3I9PSAoIGNvbnN0IFFWYWx1ZUxpc3Q8VD4mIGwgKSBjb25zdDsKICAgIGJvb2wgb3BlcmF0b3IhPSAoIGNvbnN0IFFWYWx1ZUxpc3Q8VD4mIGwgKSBjb25zdCB7IHJldHVybiAhKCAqdGhpcyA9PSBsICk7IH0KICAgIGl0ZXJhdG9yIGJlZ2luKCkgeyBkZXRhY2goKTsgcmV0dXJuIGl0ZXJhdG9yKCBzaC0+bm9kZS0+bmV4dCApOyB9CiAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCBzaC0+bm9kZS0+bmV4dCApOyB9CiAgICBjb25zdF9pdGVyYXRvciBjb25zdEJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoIHNoLT5ub2RlLT5uZXh0ICk7IH0KICAgIGl0ZXJhdG9yIGVuZCgpIHsgZGV0YWNoKCk7IHJldHVybiBpdGVyYXRvciggc2gtPm5vZGUgKTsgfQogICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoIHNoLT5ub2RlICk7IH0KICAgIGNvbnN0X2l0ZXJhdG9yIGNvbnN0RW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoIHNoLT5ub2RlICk7IH0KICAgIGl0ZXJhdG9yIGluc2VydCggaXRlcmF0b3IgaXQsIGNvbnN0IFQmIHggKSB7IGRldGFjaCgpOyByZXR1cm4gc2gtPmluc2VydCggaXQsIHggKTsgfQogICAgdWludCByZW1vdmUoIGNvbnN0IFQmIHggKSB7IGRldGFjaCgpOyByZXR1cm4gc2gtPnJlbW92ZSggeCApOyB9CiAgICB2b2lkIGNsZWFyKCk7CgogICAgLy8gIyMjIDQuMDogbW92ZSBvdXQgb2YgY2xhc3MKICAgIFFWYWx1ZUxpc3Q8VD4mIG9wZXJhdG9yPDwgKCBjb25zdCBUJiB4ICkKICAgIHsKCWFwcGVuZCggeCApOwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gc2gtPm5vZGVzOyB9CiAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2gtPm5vZGVzID09IDA7IH0KICAgIHZvaWQgcHVzaF9mcm9udCggY29uc3QgVCYgeCApIHsgZGV0YWNoKCk7IHNoLT5pbnNlcnQoIGJlZ2luKCksIHggKTsgfQogICAgdm9pZCBwdXNoX2JhY2soIGNvbnN0IFQmIHggKSB7IGRldGFjaCgpOyBzaC0+aW5zZXJ0KCBlbmQoKSwgeCApOyB9CiAgICBpdGVyYXRvciBlcmFzZSggaXRlcmF0b3IgcG9zICkgeyBkZXRhY2goKTsgcmV0dXJuIHNoLT5yZW1vdmUoIHBvcyApOyB9CiAgICBpdGVyYXRvciBlcmFzZSggaXRlcmF0b3IgZmlyc3QsIGl0ZXJhdG9yIGxhc3QgKTsKICAgIHJlZmVyZW5jZSBmcm9udCgpIHsgUVRfQ0hFQ0tfSU5WQUxJRF9MSVNUX0VMRU1FTlRfRkFUQUw7IHJldHVybiAqYmVnaW4oKTsgfQogICAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyBRVF9DSEVDS19JTlZBTElEX0xJU1RfRUxFTUVOVF9GQVRBTDsgcmV0dXJuICpiZWdpbigpOyB9CiAgICByZWZlcmVuY2UgYmFjaygpIHsgUVRfQ0hFQ0tfSU5WQUxJRF9MSVNUX0VMRU1FTlRfRkFUQUw7IHJldHVybiAqKC0tZW5kKCkpOyB9CiAgICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsgUVRfQ0hFQ0tfSU5WQUxJRF9MSVNUX0VMRU1FTlRfRkFUQUw7IHJldHVybiAqKC0tZW5kKCkpOyB9CiAgICB2b2lkIHBvcF9mcm9udCgpIHsgUVRfQ0hFQ0tfSU5WQUxJRF9MSVNUX0VMRU1FTlQ7IGVyYXNlKCBiZWdpbigpICk7IH0KICAgIHZvaWQgcG9wX2JhY2soKSB7CglRVF9DSEVDS19JTlZBTElEX0xJU1RfRUxFTUVOVDsKCWl0ZXJhdG9yIHRtcCA9IGVuZCgpOwoJZXJhc2UoIC0tdG1wICk7CiAgICB9CiAgICB2b2lkIGluc2VydCggaXRlcmF0b3IgcG9zLCBzaXplX3R5cGUgbiwgY29uc3QgVCYgeCApOwogICAgLy8gU29tZSBjb21waWxlcnMgKGluY2wuIHZjKyspIHdvdWxkIGluc3RhbnRpYXRlIHRoaXMgZnVuY3Rpb24gZXZlbiBpZgogICAgLy8gaXQgaXMgbm90IHVzZWQ7IHRoaXMgd291bGQgY29uc3RyYWluIFFWYWx1ZUxpc3QgdG8gY2xhc3NlcyB0aGF0IHByb3ZpZGUKICAgIC8vIGFuIG9wZXJhdG9yPAogICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgIFFWYWx1ZUxpc3Q8VD4gb3BlcmF0b3IrICggY29uc3QgUVZhbHVlTGlzdDxUPiYgbCApIGNvbnN0OwogICAgUVZhbHVlTGlzdDxUPiYgb3BlcmF0b3IrPSAoIGNvbnN0IFFWYWx1ZUxpc3Q8VD4mIGwgKTsKCiAgICBpdGVyYXRvciBmcm9tTGFzdCgpIHsgZGV0YWNoKCk7IHJldHVybiBpdGVyYXRvciggc2gtPm5vZGUtPnByZXYgKTsgfQogICAgY29uc3RfaXRlcmF0b3IgZnJvbUxhc3QoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvciggc2gtPm5vZGUtPnByZXYgKTsgfQoKICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICggc2gtPm5vZGVzID09IDAgKTsgfQoKICAgIGl0ZXJhdG9yIGFwcGVuZCggY29uc3QgVCYgeCApIHsgZGV0YWNoKCk7IHJldHVybiBzaC0+aW5zZXJ0KCBlbmQoKSwgeCApOyB9CiAgICBpdGVyYXRvciBwcmVwZW5kKCBjb25zdCBUJiB4ICkgeyBkZXRhY2goKTsgcmV0dXJuIHNoLT5pbnNlcnQoIGJlZ2luKCksIHggKTsgfQoKICAgIGl0ZXJhdG9yIHJlbW92ZSggaXRlcmF0b3IgaXQgKSB7IGRldGFjaCgpOyByZXR1cm4gc2gtPnJlbW92ZSggaXQgKTsgfQoKICAgIFQmIGZpcnN0KCkgeyBRVF9DSEVDS19JTlZBTElEX0xJU1RfRUxFTUVOVDsgZGV0YWNoKCk7IHJldHVybiBzaC0+bm9kZS0+bmV4dC0+ZGF0YTsgfQogICAgY29uc3QgVCYgZmlyc3QoKSBjb25zdCB7IFFUX0NIRUNLX0lOVkFMSURfTElTVF9FTEVNRU5UOyByZXR1cm4gc2gtPm5vZGUtPm5leHQtPmRhdGE7IH0KICAgIFQmIGxhc3QoKSB7IFFUX0NIRUNLX0lOVkFMSURfTElTVF9FTEVNRU5UOyBkZXRhY2goKTsgcmV0dXJuIHNoLT5ub2RlLT5wcmV2LT5kYXRhOyB9CiAgICBjb25zdCBUJiBsYXN0KCkgY29uc3QgeyBRVF9DSEVDS19JTlZBTElEX0xJU1RfRUxFTUVOVDsgcmV0dXJuIHNoLT5ub2RlLT5wcmV2LT5kYXRhOyB9CgogICAgVCYgb3BlcmF0b3JbXSAoIHNpemVfdHlwZSBpICkgeyBRVF9DSEVDS19JTlZBTElEX0xJU1RfRUxFTUVOVDsgZGV0YWNoKCk7IHJldHVybiBzaC0+YXQoaSktPmRhdGE7IH0KICAgIGNvbnN0IFQmIG9wZXJhdG9yW10gKCBzaXplX3R5cGUgaSApIGNvbnN0IHsgUVRfQ0hFQ0tfSU5WQUxJRF9MSVNUX0VMRU1FTlQ7IHJldHVybiBzaC0+YXQoaSktPmRhdGE7IH0KICAgIGl0ZXJhdG9yIGF0KCBzaXplX3R5cGUgaSApIHsgUVRfQ0hFQ0tfSU5WQUxJRF9MSVNUX0VMRU1FTlQ7IGRldGFjaCgpOyByZXR1cm4gaXRlcmF0b3IoIHNoLT5hdChpKSApOyB9CiAgICBjb25zdF9pdGVyYXRvciBhdCggc2l6ZV90eXBlIGkgKSBjb25zdCB7IFFUX0NIRUNLX0lOVkFMSURfTElTVF9FTEVNRU5UOyByZXR1cm4gY29uc3RfaXRlcmF0b3IoIHNoLT5hdChpKSApOyB9CiAgICBpdGVyYXRvciBmaW5kICggY29uc3QgVCYgeCApIHsgZGV0YWNoKCk7IHJldHVybiBpdGVyYXRvciggc2gtPmZpbmQoIHNoLT5ub2RlLT5uZXh0LCB4KSApOyB9CiAgICBjb25zdF9pdGVyYXRvciBmaW5kICggY29uc3QgVCYgeCApIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCBzaC0+ZmluZCggc2gtPm5vZGUtPm5leHQsIHgpICk7IH0KICAgIGl0ZXJhdG9yIGZpbmQgKCBpdGVyYXRvciBpdCwgY29uc3QgVCYgeCApIHsgZGV0YWNoKCk7IHJldHVybiBpdGVyYXRvciggc2gtPmZpbmQoIGl0Lm5vZGUsIHggKSApOyB9CiAgICBjb25zdF9pdGVyYXRvciBmaW5kICggY29uc3RfaXRlcmF0b3IgaXQsIGNvbnN0IFQmIHggKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvciggc2gtPmZpbmQoIGl0Lm5vZGUsIHggKSApOyB9CiAgICBpbnQgZmluZEluZGV4KCBjb25zdCBUJiB4ICkgY29uc3QgeyByZXR1cm4gc2gtPmZpbmRJbmRleCggc2gtPm5vZGUtPm5leHQsIHgpIDsgfQogICAgc2l6ZV90eXBlIGNvbnRhaW5zKCBjb25zdCBUJiB4ICkgY29uc3QgeyByZXR1cm4gc2gtPmNvbnRhaW5zKCB4ICk7IH0KCiAgICBzaXplX3R5cGUgY291bnQoKSBjb25zdCB7IHJldHVybiBzaC0+bm9kZXM7IH0KCiAgICBRVmFsdWVMaXN0PFQ+JiBvcGVyYXRvcis9ICggY29uc3QgVCYgeCApCiAgICB7CglhcHBlbmQoIHggKTsKCXJldHVybiAqdGhpczsKICAgIH0KICAgIHR5cGVkZWYgUVZhbHVlTGlzdEl0ZXJhdG9yPFQ+IEl0ZXJhdG9yOwogICAgdHlwZWRlZiBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxUPiBDb25zdEl0ZXJhdG9yOwogICAgdHlwZWRlZiBUIFZhbHVlVHlwZTsKCnByb3RlY3RlZDoKICAgIC8qICAgICAgICAgICAgICAgICAgICAgICovCiAgICB2b2lkIGRldGFjaCgpIHsgaWYgKCBzaC0+Y291bnQgPiAxICkgZGV0YWNoSW50ZXJuYWwoKTsgfQoKICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIFFWYWx1ZUxpc3RQcml2YXRlPFQ+KiBzaDsKCnByaXZhdGU6CiAgICB2b2lkIGRldGFjaEludGVybmFsKCk7CgogICAgZnJpZW5kIGNsYXNzIFFEZWVwQ29weTwgUVZhbHVlTGlzdDxUPiA+Owp9OwoKdGVtcGxhdGUgPGNsYXNzIFQ+ClFfSU5MSU5FX1RFTVBMQVRFUyBib29sIFFWYWx1ZUxpc3Q8VD46Om9wZXJhdG9yPT0gKCBjb25zdCBRVmFsdWVMaXN0PFQ+JiBsICkgY29uc3QKewogICAgaWYgKCBzaXplKCkgIT0gbC5zaXplKCkgKQoJcmV0dXJuIEZBTFNFOwogICAgY29uc3RfaXRlcmF0b3IgaXQyID0gYmVnaW4oKTsKICAgIGNvbnN0X2l0ZXJhdG9yIGl0ID0gbC5iZWdpbigpOwogICAgZm9yKCA7IGl0ICE9IGwuZW5kKCk7ICsraXQsICsraXQyICkKCWlmICggISggKml0ID09ICppdDIgKSApCgkgICAgcmV0dXJuIEZBTFNFOwogICAgcmV0dXJuIFRSVUU7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgpRX0lOTElORV9URU1QTEFURVMgdm9pZCBRVmFsdWVMaXN0PFQ+OjpjbGVhcigpCnsKICAgIGlmICggc2gtPmNvdW50ID09IDEgKSBzaC0+Y2xlYXIoKTsgZWxzZSB7IHNoLT5kZXJlZigpOyBzaCA9IG5ldyBRVmFsdWVMaXN0UHJpdmF0ZTxUPjsgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KUV9JTkxJTkVfVEVNUExBVEVTIFFfVFlQRU5BTUUgUVZhbHVlTGlzdDxUPjo6aXRlcmF0b3IgUVZhbHVlTGlzdDxUPjo6ZXJhc2UoIFFfVFlQRU5BTUUgUVZhbHVlTGlzdDxUPjo6aXRlcmF0b3IgZmlyc3QsIFFfVFlQRU5BTUUgUVZhbHVlTGlzdDxUPjo6aXRlcmF0b3IgbGFzdCApCnsKICAgIHdoaWxlICggZmlyc3QgIT0gbGFzdCApCgllcmFzZSggZmlyc3QrKyApOwogICAgcmV0dXJuIGxhc3Q7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KUV9JTkxJTkVfVEVNUExBVEVTIHZvaWQgUVZhbHVlTGlzdDxUPjo6aW5zZXJ0KCBRX1RZUEVOQU1FIFFWYWx1ZUxpc3Q8VD46Oml0ZXJhdG9yIHBvcywgc2l6ZV90eXBlIG4sIGNvbnN0IFQmIHggKQp7CiAgICBmb3IgKCA7IG4gPiAwOyAtLW4gKQoJaW5zZXJ0KCBwb3MsIHggKTsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+ClFfSU5MSU5FX1RFTVBMQVRFUyBRVmFsdWVMaXN0PFQ+IFFWYWx1ZUxpc3Q8VD46Om9wZXJhdG9yKyAoIGNvbnN0IFFWYWx1ZUxpc3Q8VD4mIGwgKSBjb25zdAp7CiAgICBRVmFsdWVMaXN0PFQ+IGwyKCAqdGhpcyApOwogICAgZm9yKCBjb25zdF9pdGVyYXRvciBpdCA9IGwuYmVnaW4oKTsgaXQgIT0gbC5lbmQoKTsgKytpdCApCglsMi5hcHBlbmQoICppdCApOwogICAgcmV0dXJuIGwyOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KUV9JTkxJTkVfVEVNUExBVEVTIFFWYWx1ZUxpc3Q8VD4mIFFWYWx1ZUxpc3Q8VD46Om9wZXJhdG9yKz0gKCBjb25zdCBRVmFsdWVMaXN0PFQ+JiBsICkKewogICAgUVZhbHVlTGlzdDxUPiBjb3B5ID0gbDsKICAgIGZvciggY29uc3RfaXRlcmF0b3IgaXQgPSBjb3B5LmJlZ2luKCk7IGl0ICE9IGNvcHkuZW5kKCk7ICsraXQgKQoJYXBwZW5kKCAqaXQgKTsKICAgIHJldHVybiAqdGhpczsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+ClFfSU5MSU5FX1RFTVBMQVRFUyB2b2lkIFFWYWx1ZUxpc3Q8VD46OmRldGFjaEludGVybmFsKCkKewogICAgc2gtPmRlcmVmKCk7IHNoID0gbmV3IFFWYWx1ZUxpc3RQcml2YXRlPFQ+KCAqc2ggKTsKfQoKI2lmbmRlZiBRVF9OT19EQVRBU1RSRUFNCnRlbXBsYXRlIDxjbGFzcyBUPgpRX0lOTElORV9URU1QTEFURVMgUURhdGFTdHJlYW0mIG9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtJiBzLCBRVmFsdWVMaXN0PFQ+JiBsICkKewogICAgbC5jbGVhcigpOwogICAgUV9VSU5UMzIgYzsKICAgIHMgPj4gYzsKICAgIGZvciggUV9VSU5UMzIgaSA9IDA7IGkgPCBjOyArK2kgKQogICAgewoJVCB0OwoJcyA+PiB0OwoJbC5hcHBlbmQoIHQgKTsKCWlmICggcy5hdEVuZCgpICkKCSAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBzOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KUV9JTkxJTkVfVEVNUExBVEVTIFFEYXRhU3RyZWFtJiBvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSYgcywgY29uc3QgUVZhbHVlTGlzdDxUPiYgbCApCnsKICAgIHMgPDwgKFFfVUlOVDMyKWwuc2l6ZSgpOwogICAgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8VD4gaXQgPSBsLmJlZ2luKCk7CiAgICBmb3IoIDsgaXQgIT0gbC5lbmQoKTsgKytpdCApCglzIDw8ICppdDsKICAgIHJldHVybiBzOwp9CiNlbmRpZiAvLyBRVF9OT19EQVRBU1RSRUFNCgojZGVmaW5lIFFfREVGSU5FRF9RVkFMVUVMSVNUCiNkZWZpbmUgUV9ERUZJTkVEX1FWQUxVRUxJU1QKI2luY2x1ZGUgInF3aW5leHBvcnQuaCIKI2VuZGlmIC8vIFFWQUxVRUxJU1RfSAoAAAAiAHEAdwBzAHAAcgBvAHAAZQByAHQAeQBfAHEAdwBzAC4AaAAACOovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRV1NQUk9QRVJUWV9RV1NfSAojZGVmaW5lIFFXU1BST1BFUlRZX1FXU19ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInF3c2NvbW1hbmRfcXdzLmgiCiNlbmRpZiAvLyBRVF9ICgovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVRfTk9fUVdTX1BST1BFUlRJRVMKCmNsYXNzIFFXU1Byb3BlcnR5TWFuYWdlcgp7CnB1YmxpYzoKICAgIGVudW0gTW9kZSB7CglQcm9wUmVwbGFjZSA9IDAsCglQcm9wUHJlcGVuZCwKCVByb3BBcHBlbmQKICAgIH07CgogICAgLy8gcHJlLWRlZmluZWQgcHJvcGVydGllcwogICAgZW51bSBBdG9tIHsKCVByb3BTZWxlY3Rpb24gPSAwCiAgICB9OwoKICAgIFFXU1Byb3BlcnR5TWFuYWdlcigpOwogICAgflFXU1Byb3BlcnR5TWFuYWdlcigpOwoKICAgIGJvb2wgc2V0UHJvcGVydHkoIGludCB3aW5JZCwgaW50IHByb3BlcnR5LCBpbnQgbW9kZSwgY29uc3QgY2hhciAqZGF0YSwgaW50IGxlbiApOwogICAgYm9vbCBoYXNQcm9wZXJ0eSggaW50IHdpbklkLCBpbnQgcHJvcGVydHkgKTsKICAgIGJvb2wgcmVtb3ZlUHJvcGVydHkoIGludCB3aW5JZCwgaW50IHByb3BlcnR5ICk7CiAgICBib29sIGFkZFByb3BlcnR5KCBpbnQgd2luSWQsIGludCBwcm9wZXJ0eSApOwogICAgYm9vbCBnZXRQcm9wZXJ0eSggaW50IHdpbklkLCBpbnQgcHJvcGVydHksIGNoYXIgKiZkYXRhLCBpbnQgJmxlbiApOwogICAgYm9vbCByZW1vdmVQcm9wZXJ0aWVzKCBpbnQgd2luSWQgKTsKCnByaXZhdGU6CiAgICBjbGFzcyBEYXRhOwogICAgRGF0YSogZDsKfTsKCiNlbmRpZiAvLyBRVF9OT19RV1NfUFJPUEVSVElFUwoKI2VuZGlmIC8vIFFXU1BST1BFUlRZX1FXU19ICgAAABgAcQB0AGEAYgBkAGkAYQBsAG8AZwAuAGgAABCALyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVRBQkRJQUxPR19ICiNkZWZpbmUgUVRBQkRJQUxPR19ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFkaWFsb2cuaCIKI2luY2x1ZGUgInFpY29uc2V0LmgiCiNlbmRpZiAvLyBRVF9ICgojaWZuZGVmIFFUX05PX1RBQkRJQUxPRwoKY2xhc3MgIFFUYWJCYXI7CmNsYXNzICBRVGFiOwpjbGFzcyAgUVRhYkRpYWxvZ1ByaXZhdGU7CgpjbGFzcyBRX0VYUE9SVCBRVGFiRGlhbG9nIDogcHVibGljIFFEaWFsb2cKewogICAgUV9PQkpFQ1QKcHVibGljOgogICAgUVRhYkRpYWxvZyggUVdpZGdldCogcGFyZW50PTAsIGNvbnN0IGNoYXIqIG5hbWU9MCwgYm9vbCBtb2RhbD1GQUxTRSwKCQlXRmxhZ3MgZj0wICk7CiAgICB+UVRhYkRpYWxvZygpOwoKICAgIHZvaWQgc2hvdygpOwogICAgdm9pZCBzZXRGb250KCBjb25zdCBRRm9udCAmIGZvbnQgKTsKCiAgICB2b2lkIGFkZFRhYiggUVdpZGdldCAqLCBjb25zdCBRU3RyaW5nICYpOwogICAgdm9pZCBhZGRUYWIoIFFXaWRnZXQgKmNoaWxkLCBjb25zdCBRSWNvblNldCYgaWNvbnNldCwgY29uc3QgUVN0cmluZyAmbGFiZWwpOwogICAgdm9pZCBhZGRUYWIoIFFXaWRnZXQgKiwgUVRhYiogKTsKCiAgICB2b2lkIGluc2VydFRhYiggUVdpZGdldCAqLCBjb25zdCBRU3RyaW5nICYsIGludCBpbmRleCA9IC0xKTsKICAgIHZvaWQgaW5zZXJ0VGFiKCBRV2lkZ2V0ICpjaGlsZCwgY29uc3QgUUljb25TZXQmIGljb25zZXQsIGNvbnN0IFFTdHJpbmcgJmxhYmVsLCBpbnQgaW5kZXggPSAtMSk7CiAgICB2b2lkIGluc2VydFRhYiggUVdpZGdldCAqLCBRVGFiKiwgaW50IGluZGV4ID0gLTEgKTsKCiAgICB2b2lkIGNoYW5nZVRhYiggUVdpZGdldCAqLCBjb25zdCBRU3RyaW5nICYpOwogICAgdm9pZCBjaGFuZ2VUYWIoIFFXaWRnZXQgKmNoaWxkLCBjb25zdCBRSWNvblNldCYgaWNvbnNldCwgY29uc3QgUVN0cmluZyAmbGFiZWwpOwoKICAgIGJvb2wgaXNUYWJFbmFibGVkKCAgUVdpZGdldCAqICkgY29uc3Q7CiAgICB2b2lkIHNldFRhYkVuYWJsZWQoIFFXaWRnZXQgKiwgYm9vbCApOwogICAgYm9vbCBpc1RhYkVuYWJsZWQoIGNvbnN0IGNoYXIqICkgY29uc3Q7IC8vIGNvbXBhdGliaWxpdHkKICAgIHZvaWQgc2V0VGFiRW5hYmxlZCggY29uc3QgY2hhciosIGJvb2wgKTsgLy8gY29tcGF0aWJpbGl0eQoKICAgIHZvaWQgc2hvd1BhZ2UoIFFXaWRnZXQgKiApOwogICAgdm9pZCByZW1vdmVQYWdlKCBRV2lkZ2V0ICogKTsKICAgIFFTdHJpbmcgdGFiTGFiZWwoIFFXaWRnZXQgKiApOwoKICAgIFFXaWRnZXQgKiBjdXJyZW50UGFnZSgpIGNvbnN0OwoKICAgIHZvaWQgc2V0RGVmYXVsdEJ1dHRvbiggY29uc3QgUVN0cmluZyAmdGV4dCApOwogICAgdm9pZCBzZXREZWZhdWx0QnV0dG9uKCk7CiAgICBib29sIGhhc0RlZmF1bHRCdXR0b24oKSBjb25zdDsKCiAgICB2b2lkIHNldEhlbHBCdXR0b24oIGNvbnN0IFFTdHJpbmcgJnRleHQgKTsKICAgIHZvaWQgc2V0SGVscEJ1dHRvbigpOwogICAgYm9vbCBoYXNIZWxwQnV0dG9uKCkgY29uc3Q7CgogICAgdm9pZCBzZXRDYW5jZWxCdXR0b24oIGNvbnN0IFFTdHJpbmcgJnRleHQgKTsKICAgIHZvaWQgc2V0Q2FuY2VsQnV0dG9uKCk7CiAgICBib29sIGhhc0NhbmNlbEJ1dHRvbigpIGNvbnN0OwoKICAgIHZvaWQgc2V0QXBwbHlCdXR0b24oIGNvbnN0IFFTdHJpbmcgJnRleHQgKTsKICAgIHZvaWQgc2V0QXBwbHlCdXR0b24oKTsKICAgIGJvb2wgaGFzQXBwbHlCdXR0b24oKSBjb25zdDsKCiNpZm5kZWYgUV9RRE9DCiAgICB2b2lkIHNldE9LQnV0dG9uKCBjb25zdCBRU3RyaW5nICZ0ZXh0ID0gUVN0cmluZzo6bnVsbCApOwojZW5kaWYKICAgIHZvaWQgc2V0T2tCdXR0b24oIGNvbnN0IFFTdHJpbmcgJnRleHQgKTsKICAgIHZvaWQgc2V0T2tCdXR0b24oKTsKICAgIGJvb2wgaGFzT2tCdXR0b24oKSBjb25zdDsKCnByb3RlY3RlZDoKICAgIHZvaWQgcGFpbnRFdmVudCggUVBhaW50RXZlbnQgKiApOwogICAgdm9pZCByZXNpemVFdmVudCggUVJlc2l6ZUV2ZW50ICogKTsKICAgIHZvaWQgc3R5bGVDaGFuZ2UoIFFTdHlsZSYgKTsKICAgIHZvaWQgc2V0VGFiQmFyKCBRVGFiQmFyKiApOwogICAgUVRhYkJhciogdGFiQmFyKCkgY29uc3Q7CgpzaWduYWxzOgogICAgdm9pZCBhYm91dFRvU2hvdygpOwoKICAgIHZvaWQgYXBwbHlCdXR0b25QcmVzc2VkKCk7CiAgICB2b2lkIGNhbmNlbEJ1dHRvblByZXNzZWQoKTsKICAgIHZvaWQgZGVmYXVsdEJ1dHRvblByZXNzZWQoKTsKICAgIHZvaWQgaGVscEJ1dHRvblByZXNzZWQoKTsKCiAgICB2b2lkIGN1cnJlbnRDaGFuZ2VkKCBRV2lkZ2V0ICogKTsKICAgIHZvaWQgc2VsZWN0ZWQoIGNvbnN0IFFTdHJpbmcmICk7IC8vIG9ic29sZXRlCgpwcml2YXRlIHNsb3RzOgogICAgdm9pZCBzaG93VGFiKCBpbnQgaSApOwoKcHJpdmF0ZToKICAgIHZvaWQgc2V0U2l6ZXMoKTsKICAgIHZvaWQgc2V0VXBMYXlvdXQoKTsKCiAgICBRVGFiRGlhbG9nUHJpdmF0ZSAqZDsKcHJpdmF0ZToJLy8gRGlzYWJsZWQgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9CiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUVRhYkRpYWxvZyggY29uc3QgUVRhYkRpYWxvZyAmICk7CiAgICBRVGFiRGlhbG9nJiBvcGVyYXRvcj0oIGNvbnN0IFFUYWJEaWFsb2cgJiApOwojZW5kaWYKfTsKCiNlbmRpZiAvLyBRVF9OT19UQUJESUFMT0cKCiNlbmRpZiAvLyBRVEFCRElBTE9HX0gKAAAAHABxAHMAcQBsAGQAYQB0AGEAYgBhAHMAZQAuAGgAABUZLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRU1FMREFUQUJBU0VfSAojZGVmaW5lIFFTUUxEQVRBQkFTRV9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFvYmplY3QuaCIKI2luY2x1ZGUgInFzdHJpbmcuaCIKI2luY2x1ZGUgInFzcWxxdWVyeS5oIgojaW5jbHVkZSAicXN0cmluZ2xpc3QuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZiAhZGVmaW5lZCggUVRfTU9EVUxFX1NRTCApIHx8IGRlZmluZWQoIFFUX0xJQ0VOU0VfUFJPRkVTU0lPTkFMICkKI2RlZmluZSBRTV9FWFBPUlRfU1FMCiNlbHNlCiNkZWZpbmUgUU1fRVhQT1JUX1NRTCBRX0VYUE9SVAojZW5kaWYKCiNpZm5kZWYgUVRfTk9fU1FMCgpjbGFzcyBRU3FsRXJyb3I7CmNsYXNzIFFTcWxEcml2ZXI7CmNsYXNzIFFTcWxJbmRleDsKY2xhc3MgUVNxbFJlY29yZDsKY2xhc3MgUVNxbFJlY29yZEluZm87CmNsYXNzIFFTcWxEYXRhYmFzZVByaXZhdGU7CgpjbGFzcyBRTV9FWFBPUlRfU1FMIFFTcWxEcml2ZXJDcmVhdG9yQmFzZQp7CnB1YmxpYzoKICAgIHZpcnR1YWwgUVNxbERyaXZlciogY3JlYXRlT2JqZWN0KCkgPSAwOwp9OwoKdGVtcGxhdGUgPGNsYXNzIHR5cGU+CmNsYXNzIFFNX0VYUE9SVF9TUUwgUVNxbERyaXZlckNyZWF0b3I6IHB1YmxpYyBRU3FsRHJpdmVyQ3JlYXRvckJhc2UKewpwdWJsaWM6CiAgICBRU3FsRHJpdmVyKiBjcmVhdGVPYmplY3QoKSB7IHJldHVybiBuZXcgdHlwZTsgfQp9OwoKY2xhc3MgUU1fRVhQT1JUX1NRTCBRU3FsRGF0YWJhc2UgOiBwdWJsaWMgUU9iamVjdAp7CiAgICBRX09CSkVDVAogICAgUV9QUk9QRVJUWSggUVN0cmluZyBkYXRhYmFzZU5hbWUgIFJFQUQgZGF0YWJhc2VOYW1lIFdSSVRFIHNldERhdGFiYXNlTmFtZSApCiAgICBRX1BST1BFUlRZKCBRU3RyaW5nIHVzZXJOYW1lICBSRUFEIHVzZXJOYW1lIFdSSVRFIHNldFVzZXJOYW1lICkKICAgIFFfUFJPUEVSVFkoIFFTdHJpbmcgcGFzc3dvcmQgIFJFQUQgcGFzc3dvcmQgV1JJVEUgc2V0UGFzc3dvcmQgKQogICAgUV9QUk9QRVJUWSggUVN0cmluZyBob3N0TmFtZSAgUkVBRCBob3N0TmFtZSBXUklURSBzZXRIb3N0TmFtZSApCiAgICBRX1BST1BFUlRZKCBpbnQgcG9ydCBSRUFEIHBvcnQgV1JJVEUgc2V0UG9ydCApCiAgICBRX1BST1BFUlRZKCBRU3RyaW5nIGNvbm5lY3RPcHRpb25zIFJFQUQgY29ubmVjdE9wdGlvbnMgV1JJVEUgc2V0Q29ubmVjdE9wdGlvbnMgKQoKcHVibGljOgogICAgflFTcWxEYXRhYmFzZSgpOwoKICAgIGJvb2wJCW9wZW4oKTsKICAgIGJvb2wJCW9wZW4oIGNvbnN0IFFTdHJpbmcmIHVzZXIsIGNvbnN0IFFTdHJpbmcmIHBhc3N3b3JkICk7CiAgICB2b2lkCQljbG9zZSgpOwogICAgYm9vbAkJaXNPcGVuKCkgY29uc3Q7CiAgICBib29sCQlpc09wZW5FcnJvcigpIGNvbnN0OwogICAgUVN0cmluZ0xpc3QJCXRhYmxlcygpIGNvbnN0OwogICAgUVN0cmluZ0xpc3QJCXRhYmxlcyggUVNxbDo6VGFibGVUeXBlIHR5cGUgKSBjb25zdDsKICAgIFFTcWxJbmRleAkJcHJpbWFyeUluZGV4KCBjb25zdCBRU3RyaW5nJiB0YWJsZW5hbWUgKSBjb25zdDsKICAgIFFTcWxSZWNvcmQJCXJlY29yZCggY29uc3QgUVN0cmluZyYgdGFibGVuYW1lICkgY29uc3Q7CiAgICBRU3FsUmVjb3JkCQlyZWNvcmQoIGNvbnN0IFFTcWxRdWVyeSYgcXVlcnkgKSBjb25zdDsKICAgIFFTcWxSZWNvcmRJbmZvCXJlY29yZEluZm8oIGNvbnN0IFFTdHJpbmcmIHRhYmxlbmFtZSApIGNvbnN0OwogICAgUVNxbFJlY29yZEluZm8JcmVjb3JkSW5mbyggY29uc3QgUVNxbFF1ZXJ5JiBxdWVyeSApIGNvbnN0OwogICAgUVNxbFF1ZXJ5CQlleGVjKCBjb25zdCBRU3RyaW5nJiBxdWVyeSA9IFFTdHJpbmc6Om51bGwgKSBjb25zdDsKICAgIFFTcWxFcnJvcgkJbGFzdEVycm9yKCkgY29uc3Q7CgogICAgYm9vbAkJdHJhbnNhY3Rpb24oKTsKICAgIGJvb2wJCWNvbW1pdCgpOwogICAgYm9vbAkJcm9sbGJhY2soKTsKCiAgICB2aXJ0dWFsIHZvaWQJc2V0RGF0YWJhc2VOYW1lKCBjb25zdCBRU3RyaW5nJiBuYW1lICk7CiAgICB2aXJ0dWFsIHZvaWQJc2V0VXNlck5hbWUoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKTsKICAgIHZpcnR1YWwgdm9pZAlzZXRQYXNzd29yZCggY29uc3QgUVN0cmluZyYgcGFzc3dvcmQgKTsKICAgIHZpcnR1YWwgdm9pZAlzZXRIb3N0TmFtZSggY29uc3QgUVN0cmluZyYgaG9zdCApOwogICAgdmlydHVhbCB2b2lkCXNldFBvcnQoIGludCBwICk7CiAgICB2b2lkIAkJc2V0Q29ubmVjdE9wdGlvbnMoIGNvbnN0IFFTdHJpbmcmIG9wdGlvbnMgPSBRU3RyaW5nOjpudWxsICk7CiAgICBRU3RyaW5nCQlkYXRhYmFzZU5hbWUoKSBjb25zdDsKICAgIFFTdHJpbmcJCXVzZXJOYW1lKCkgY29uc3Q7CiAgICBRU3RyaW5nCQlwYXNzd29yZCgpIGNvbnN0OwogICAgUVN0cmluZwkJaG9zdE5hbWUoKSBjb25zdDsKICAgIFFTdHJpbmcJCWRyaXZlck5hbWUoKSBjb25zdDsKICAgIGludCAgICAgICAgIAlwb3J0KCkgY29uc3Q7CiAgICBRU3RyaW5nIAkJY29ubmVjdE9wdGlvbnMoKSBjb25zdDsKCiAgICBRU3FsRHJpdmVyKgkJZHJpdmVyKCkgY29uc3Q7CiAgICAKICAgIC8vIE1PQ19TS0lQX0JFR0lOCiAgICBRVF9TVEFUSUNfQ09OU1QgY2hhciAqIGNvbnN0IGRlZmF1bHRDb25uZWN0aW9uOwogICAgLy8gTU9DX1NLSVBfRU5ECgogICAgc3RhdGljIFFTcWxEYXRhYmFzZSogYWRkRGF0YWJhc2UoIGNvbnN0IFFTdHJpbmcmIHR5cGUsIGNvbnN0IFFTdHJpbmcmIGNvbm5lY3Rpb25OYW1lID0gZGVmYXVsdENvbm5lY3Rpb24gKTsKICAgIHN0YXRpYyBRU3FsRGF0YWJhc2UqIGFkZERhdGFiYXNlKCBRU3FsRHJpdmVyKiBkcml2ZXIsIGNvbnN0IFFTdHJpbmcmIGNvbm5lY3Rpb25OYW1lID0gZGVmYXVsdENvbm5lY3Rpb24gKTsKICAgIHN0YXRpYyBRU3FsRGF0YWJhc2UqIGRhdGFiYXNlKCBjb25zdCBRU3RyaW5nJiBjb25uZWN0aW9uTmFtZSA9IGRlZmF1bHRDb25uZWN0aW9uLCBib29sIG9wZW4gPSBUUlVFICk7CiAgICBzdGF0aWMgdm9pZCAgICAgICAgICByZW1vdmVEYXRhYmFzZSggY29uc3QgUVN0cmluZyYgY29ubmVjdGlvbk5hbWUgKTsKICAgIHN0YXRpYyB2b2lkICAgICAgICAgIHJlbW92ZURhdGFiYXNlKCBRU3FsRGF0YWJhc2UqIGRiICk7CiAgICBzdGF0aWMgYm9vbCAgICAgICAgICBjb250YWlucyggY29uc3QgUVN0cmluZyYgY29ubmVjdGlvbk5hbWUgPSBkZWZhdWx0Q29ubmVjdGlvbiApOwogICAgc3RhdGljIFFTdHJpbmdMaXN0ICAgZHJpdmVycygpOwogICAgc3RhdGljIHZvaWQgICAgICAgICAgcmVnaXN0ZXJTcWxEcml2ZXIoIGNvbnN0IFFTdHJpbmcmIG5hbWUsIGNvbnN0IFFTcWxEcml2ZXJDcmVhdG9yQmFzZSogY3JlYXRvciApOyAvLyAjIyMgNC4wOiBjcmVhdG9yIHNob3VsZCBub3QgYmUgY29uc3QKICAgIHN0YXRpYyBib29sIAkgaXNEcml2ZXJBdmFpbGFibGUoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKTsKICAgIApwcm90ZWN0ZWQ6CiAgICBRU3FsRGF0YWJhc2UoIGNvbnN0IFFTdHJpbmcmIHR5cGUsIGNvbnN0IFFTdHJpbmcmIG5hbWUsIFFPYmplY3QgKiBwYXJlbnQ9MCwgY29uc3QgY2hhciAqIG9iam5hbWU9MCApOwogICAgUVNxbERhdGFiYXNlKCBRU3FsRHJpdmVyKiBkcml2ZXIsIFFPYmplY3QgKiBwYXJlbnQ9MCwgY29uc3QgY2hhciAqIG9iam5hbWU9MCApOwpwcml2YXRlOgogICAgdm9pZCAJaW5pdCggY29uc3QgUVN0cmluZyYgdHlwZSwgY29uc3QgUVN0cmluZyYgbmFtZSApOwogICAgUVNxbERhdGFiYXNlUHJpdmF0ZSogZDsKI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpIC8vIERpc2FibGVkIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPQogICAgUVNxbERhdGFiYXNlKCBjb25zdCBRU3FsRGF0YWJhc2UgJiApOwogICAgUVNxbERhdGFiYXNlICZvcGVyYXRvcj0oIGNvbnN0IFFTcWxEYXRhYmFzZSAmICk7CiNlbmRpZgoKfTsKCiNlbmRpZiAvLyBRVF9OT19TUUwKI2VuZGlmCgAAACQAcQB0AGUAeAB0AGMAbwBkAGUAYwBwAGwAdQBnAGkAbgAuAGgAAAh6LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVRFWFRDT0RFQ1BMVUdJTl9ICiNkZWZpbmUgUVRFWFRDT0RFQ1BMVUdJTl9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFncGx1Z2luLmgiCiNpbmNsdWRlICJxc3RyaW5nbGlzdC5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19URVhUQ09ERUNQTFVHSU4KY2xhc3MgUVRleHRDb2RlYzsKY2xhc3MgUVRleHRDb2RlY1BsdWdpblByaXZhdGU7CgpjbGFzcyBRX0VYUE9SVCBRVGV4dENvZGVjUGx1Z2luIDogcHVibGljIFFHUGx1Z2luCnsKICAgIFFfT0JKRUNUCnB1YmxpYzoKICAgIFFUZXh0Q29kZWNQbHVnaW4oKTsKICAgIH5RVGV4dENvZGVjUGx1Z2luKCk7CgogICAgdmlydHVhbCBRU3RyaW5nTGlzdCBuYW1lcygpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgUVRleHRDb2RlYyAqY3JlYXRlRm9yTmFtZSggY29uc3QgUVN0cmluZyAmbmFtZSApID0gMDsKICAgIAogICAgdmlydHVhbCBRVmFsdWVMaXN0PGludD4gbWliRW51bXMoKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIFFUZXh0Q29kZWMgKmNyZWF0ZUZvck1pYiggaW50IG1pYiApID0gMDsKCnByaXZhdGU6CiAgICBRVGV4dENvZGVjUGx1Z2luUHJpdmF0ZSAqZDsKfTsKI2VuZGlmIC8vIFFUX05PX1RFWFRDT0RFQ1BMVUdJTgojZW5kaWYgLy8gUVRFWFRDT0RFQ1BMVUdJTl9ICgAAABoAcQBzAHQAcgBpAG4AZwBsAGkAcwB0AC4AaAAADUovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFTVFJJTkdMSVNUX0gKI2RlZmluZSBRU1RSSU5HTElTVF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInF2YWx1ZWxpc3QuaCIKI2luY2x1ZGUgInFzdHJpbmcuaCIKI2luY2x1ZGUgInFzdHJsaXN0LmgiCiNlbmRpZiAvLyBRVF9ICgojaWZuZGVmIFFUX05PX1NUUklOR0xJU1QKCmNsYXNzIFFSZWdFeHA7CnRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBRRGVlcENvcHk7CgojaWYgZGVmaW5lZChRX1RFTVBMQVRFRExMKQovLyBNT0NfU0tJUF9CRUdJTgovL1FfVEVNUExBVEVfRVhURVJOIHRlbXBsYXRlIGNsYXNzIFFfRVhQT1JUIFFWYWx1ZUxpc3Q8UVN0cmluZz47IAovLyBNT0NfU0tJUF9FTkQKI2VuZGlmCgpjbGFzcyBRX0VYUE9SVCBRU3RyaW5nTGlzdCA6IHB1YmxpYyBRVmFsdWVMaXN0PFFTdHJpbmc+CnsKcHVibGljOgogICAgUVN0cmluZ0xpc3QoKSB7IH0KICAgIFFTdHJpbmdMaXN0KCBjb25zdCBRU3RyaW5nTGlzdCYgbCApIDogUVZhbHVlTGlzdDxRU3RyaW5nPihsKSB7IH0KICAgIFFTdHJpbmdMaXN0KCBjb25zdCBRVmFsdWVMaXN0PFFTdHJpbmc+JiBsICkgOiBRVmFsdWVMaXN0PFFTdHJpbmc+KGwpIHsgfQogICAgUVN0cmluZ0xpc3QoIGNvbnN0IFFTdHJpbmcmIGkgKSB7IGFwcGVuZChpKTsgfQojaWZuZGVmIFFUX05PX0NBU1RfQVNDSUkKICAgIFFTdHJpbmdMaXN0KCBjb25zdCBjaGFyKiBpICkgeyBhcHBlbmQoaSk7IH0KI2VuZGlmCgogICAgc3RhdGljIFFTdHJpbmdMaXN0IGZyb21TdHJMaXN0KGNvbnN0IFFTdHJMaXN0Jik7CgogICAgdm9pZCBzb3J0KCk7CgogICAgc3RhdGljIFFTdHJpbmdMaXN0IHNwbGl0KCBjb25zdCBRU3RyaW5nICZzZXAsIGNvbnN0IFFTdHJpbmcgJnN0ciwgYm9vbCBhbGxvd0VtcHR5RW50cmllcyA9IEZBTFNFICk7CiAgICBzdGF0aWMgUVN0cmluZ0xpc3Qgc3BsaXQoIGNvbnN0IFFDaGFyICZzZXAsIGNvbnN0IFFTdHJpbmcgJnN0ciwgYm9vbCBhbGxvd0VtcHR5RW50cmllcyA9IEZBTFNFICk7CiNpZm5kZWYgUVRfTk9fUkVHRVhQCiAgICBzdGF0aWMgUVN0cmluZ0xpc3Qgc3BsaXQoIGNvbnN0IFFSZWdFeHAgJnNlcCwgY29uc3QgUVN0cmluZyAmc3RyLCBib29sIGFsbG93RW1wdHlFbnRyaWVzID0gRkFMU0UgKTsKI2VuZGlmCiAgICBRU3RyaW5nIGpvaW4oIGNvbnN0IFFTdHJpbmcgJnNlcCApIGNvbnN0OwoKICAgIFFTdHJpbmdMaXN0IGdyZXAoIGNvbnN0IFFTdHJpbmcgJnN0ciwgYm9vbCBjcyA9IFRSVUUgKSBjb25zdDsKI2lmbmRlZiBRVF9OT19SRUdFWFAKICAgIFFTdHJpbmdMaXN0IGdyZXAoIGNvbnN0IFFSZWdFeHAgJmV4cHIgKSBjb25zdDsKI2VuZGlmCgogICAgUVN0cmluZ0xpc3QmIGdyZXMoIGNvbnN0IFFTdHJpbmcgJmJlZm9yZSwgY29uc3QgUVN0cmluZyAmYWZ0ZXIsCgkJICAgICAgIGJvb2wgY3MgPSBUUlVFICk7CiNpZm5kZWYgUVRfTk9fUkVHRVhQX0NBUFRVUkUKICAgIFFTdHJpbmdMaXN0JiBncmVzKCBjb25zdCBRUmVnRXhwICZleHByLCBjb25zdCBRU3RyaW5nICZhZnRlciApOwojZW5kaWYKCnByb3RlY3RlZDoKICAgIHZvaWQgZGV0YWNoKCkgeyBRVmFsdWVMaXN0PFFTdHJpbmc+OjpkZXRhY2goKTsgfQogICAgZnJpZW5kIGNsYXNzIFFEZWVwQ29weTwgUVN0cmluZ0xpc3QgPjsKfTsKCiNpZm5kZWYgUVRfTk9fREFUQVNUUkVBTQpjbGFzcyBRRGF0YVN0cmVhbTsKZXh0ZXJuIFFfRVhQT1JUIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRU3RyaW5nTGlzdCYgKTsKZXh0ZXJuIFFfRVhQT1JUIFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSAmLCBjb25zdCBRU3RyaW5nTGlzdCYgKTsKI2VuZGlmCgojZW5kaWYgLy8gUVRfTk9fU1RSSU5HTElTVAojZW5kaWYgLy8gUVNUUklOR0xJU1RfSAoAAAAiAHEAcwBxAGwAcAByAG8AcABlAHIAdAB5AG0AYQBwAC4AaAAACWEvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFTUUxQUk9QRVJUWU1BUF9ICiNkZWZpbmUgUVNRTFBST1BFUlRZTUFQX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXZhcmlhbnQuaCIKI2luY2x1ZGUgInFzdHJpbmcuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fU1FMX0ZPUk0KCmNsYXNzIFFXaWRnZXQ7CmNsYXNzIFFTcWxQcm9wZXJ0eU1hcFByaXZhdGU7CgpjbGFzcyBRX0VYUE9SVCBRU3FsUHJvcGVydHlNYXAgewpwdWJsaWM6CiAgICBRU3FsUHJvcGVydHlNYXAoKTsKICAgIHZpcnR1YWwgflFTcWxQcm9wZXJ0eU1hcCgpOwoKICAgIFFWYXJpYW50ICAgICAgcHJvcGVydHkoIFFXaWRnZXQgKiB3aWRnZXQgKTsKICAgIHZpcnR1YWwgdm9pZCAgc2V0UHJvcGVydHkoIFFXaWRnZXQgKiB3aWRnZXQsIGNvbnN0IFFWYXJpYW50ICYgdmFsdWUgKTsKCiAgICB2b2lkIGluc2VydCggY29uc3QgUVN0cmluZyAmIGNsYXNzbmFtZSwgY29uc3QgUVN0cmluZyAmIHByb3BlcnR5ICk7CiAgICB2b2lkIHJlbW92ZSggY29uc3QgUVN0cmluZyAmIGNsYXNzbmFtZSApOwoKICAgIHN0YXRpYyBRU3FsUHJvcGVydHlNYXAgKiBkZWZhdWx0TWFwKCk7CiAgICBzdGF0aWMgdm9pZCBpbnN0YWxsRGVmYXVsdE1hcCggUVNxbFByb3BlcnR5TWFwICogbWFwICk7Cgpwcml2YXRlOgkvLyBEaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRU3FsUHJvcGVydHlNYXAoIGNvbnN0IFFTcWxQcm9wZXJ0eU1hcCAmICk7CiAgICBRU3FsUHJvcGVydHlNYXAgJm9wZXJhdG9yPSggY29uc3QgUVNxbFByb3BlcnR5TWFwICYgKTsKI2VuZGlmCiAgICBRU3FsUHJvcGVydHlNYXBQcml2YXRlKiBkOwoKfTsKCiNlbmRpZiAvLyBRVF9OT19TUUxfRk9STQojZW5kaWYgLy8gUVNRTFBST1BFUlRZTUFQX0gKAAAAGABxAHYAYQBsAGkAZABhAHQAbwByAC4AaAAAEj0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFWQUxJREFUT1JfSAojZGVmaW5lIFFWQUxJREFUT1JfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxb2JqZWN0LmgiCiNpbmNsdWRlICJxc3RyaW5nLmgiIC8vIGNoYXIqLT5RU3RyaW5nIGNvbnZlcnNpb24KI2luY2x1ZGUgInFyZWdleHAuaCIgLy8gUVN0cmluZy0+UVJlZ0V4cCBjb252ZXJzaW9uCiNlbmRpZiAvLyBRVF9ICgojaWZuZGVmIFFUX05PX1ZBTElEQVRPUgoKCmNsYXNzIFFfRVhQT1JUIFFWYWxpZGF0b3IgOiBwdWJsaWMgUU9iamVjdAp7CiAgICBRX09CSkVDVApwdWJsaWM6CiAgICBRVmFsaWRhdG9yKCBRT2JqZWN0ICogcGFyZW50LCBjb25zdCBjaGFyICpuYW1lID0gMCApOwogICAgflFWYWxpZGF0b3IoKTsKCiAgICBlbnVtIFN0YXRlIHsgSW52YWxpZCwgSW50ZXJtZWRpYXRlLCBWYWxpZD1JbnRlcm1lZGlhdGUsIEFjY2VwdGFibGUgfTsKCiAgICB2aXJ0dWFsIFN0YXRlIHZhbGlkYXRlKCBRU3RyaW5nICYsIGludCAmICkgY29uc3QgPSAwOwogICAgdmlydHVhbCB2b2lkIGZpeHVwKCBRU3RyaW5nICYgKSBjb25zdDsKCnByaXZhdGU6CiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUVZhbGlkYXRvciggY29uc3QgUVZhbGlkYXRvciAmICk7CiAgICBRVmFsaWRhdG9yJiBvcGVyYXRvcj0oIGNvbnN0IFFWYWxpZGF0b3IgJiApOwojZW5kaWYKfTsKCgpjbGFzcyBRX0VYUE9SVCBRSW50VmFsaWRhdG9yIDogcHVibGljIFFWYWxpZGF0b3IKewogICAgUV9PQkpFQ1QKICAgIFFfUFJPUEVSVFkoIGludCBib3R0b20gUkVBRCBib3R0b20gV1JJVEUgc2V0Qm90dG9tICkKICAgIFFfUFJPUEVSVFkoIGludCB0b3AgUkVBRCB0b3AgV1JJVEUgc2V0VG9wICkKCnB1YmxpYzoKICAgIFFJbnRWYWxpZGF0b3IoIFFPYmplY3QgKiBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUgPSAwICk7CiAgICBRSW50VmFsaWRhdG9yKCBpbnQgYm90dG9tLCBpbnQgdG9wLAoJCSAgIFFPYmplY3QgKiBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUgPSAwICk7CiAgICB+UUludFZhbGlkYXRvcigpOwoKICAgIFFWYWxpZGF0b3I6OlN0YXRlIHZhbGlkYXRlKCBRU3RyaW5nICYsIGludCAmICkgY29uc3Q7CgogICAgdm9pZCBzZXRCb3R0b20oIGludCApOwogICAgdm9pZCBzZXRUb3AoIGludCApOwogICAgdmlydHVhbCB2b2lkIHNldFJhbmdlKCBpbnQgYm90dG9tLCBpbnQgdG9wICk7CgogICAgaW50IGJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIGI7IH0KICAgIGludCB0b3AoKSBjb25zdCB7IHJldHVybiB0OyB9Cgpwcml2YXRlOgojaWYgZGVmaW5lZChRX0RJU0FCTEVfQ09QWSkKICAgIFFJbnRWYWxpZGF0b3IoIGNvbnN0IFFJbnRWYWxpZGF0b3IgJiApOwogICAgUUludFZhbGlkYXRvciYgb3BlcmF0b3I9KCBjb25zdCBRSW50VmFsaWRhdG9yICYgKTsKI2VuZGlmCgogICAgaW50IGIsIHQ7Cn07CgojaWZuZGVmIFFUX05PX1JFR0VYUAoKY2xhc3MgUV9FWFBPUlQgUURvdWJsZVZhbGlkYXRvciA6IHB1YmxpYyBRVmFsaWRhdG9yCnsKICAgIFFfT0JKRUNUCiAgICBRX1BST1BFUlRZKCBkb3VibGUgYm90dG9tIFJFQUQgYm90dG9tIFdSSVRFIHNldEJvdHRvbSApCiAgICBRX1BST1BFUlRZKCBkb3VibGUgdG9wIFJFQUQgdG9wIFdSSVRFIHNldFRvcCApCiAgICBRX1BST1BFUlRZKCBpbnQgZGVjaW1hbHMgUkVBRCBkZWNpbWFscyBXUklURSBzZXREZWNpbWFscyApCgpwdWJsaWM6CiAgICBRRG91YmxlVmFsaWRhdG9yKCBRT2JqZWN0ICogcGFyZW50LCBjb25zdCBjaGFyICpuYW1lID0gMCApOwogICAgUURvdWJsZVZhbGlkYXRvciggZG91YmxlIGJvdHRvbSwgZG91YmxlIHRvcCwgaW50IGRlY2ltYWxzLAoJCSAgICAgIFFPYmplY3QgKiBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUgPSAwICk7CiAgICB+UURvdWJsZVZhbGlkYXRvcigpOwoKICAgIFFWYWxpZGF0b3I6OlN0YXRlIHZhbGlkYXRlKCBRU3RyaW5nICYsIGludCAmICkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldFJhbmdlKCBkb3VibGUgYm90dG9tLCBkb3VibGUgdG9wLCBpbnQgZGVjaW1hbHMgPSAwICk7CiAgICB2b2lkIHNldEJvdHRvbSggZG91YmxlICk7CiAgICB2b2lkIHNldFRvcCggZG91YmxlICk7CiAgICB2b2lkIHNldERlY2ltYWxzKCBpbnQgKTsKCiAgICBkb3VibGUgYm90dG9tKCkgY29uc3QgeyByZXR1cm4gYjsgfQogICAgZG91YmxlIHRvcCgpIGNvbnN0IHsgcmV0dXJuIHQ7IH0KICAgIGludCBkZWNpbWFscygpIGNvbnN0IHsgcmV0dXJuIGQ7IH0KCnByaXZhdGU6CiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUURvdWJsZVZhbGlkYXRvciggY29uc3QgUURvdWJsZVZhbGlkYXRvciAmICk7CiAgICBRRG91YmxlVmFsaWRhdG9yJiBvcGVyYXRvcj0oIGNvbnN0IFFEb3VibGVWYWxpZGF0b3IgJiApOwojZW5kaWYKCiAgICBkb3VibGUgYiwgdDsKICAgIGludCBkOwp9OwoKCmNsYXNzIFFfRVhQT1JUIFFSZWdFeHBWYWxpZGF0b3IgOiBwdWJsaWMgUVZhbGlkYXRvcgp7CiAgICBRX09CSkVDVAogICAgLy8gUV9QUk9QRVJUWSggUVJlZ0V4cCByZWdFeHAgUkVBRCByZWdFeHAgV1JJVEUgc2V0UmVnRXhwICkKCnB1YmxpYzoKICAgIFFSZWdFeHBWYWxpZGF0b3IoIFFPYmplY3QgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSA9IDAgKTsKICAgIFFSZWdFeHBWYWxpZGF0b3IoIGNvbnN0IFFSZWdFeHAmIHJ4LCBRT2JqZWN0ICpwYXJlbnQsCgkJICAgICAgY29uc3QgY2hhciAqbmFtZSA9IDAgKTsKICAgIH5RUmVnRXhwVmFsaWRhdG9yKCk7CgogICAgdmlydHVhbCBRVmFsaWRhdG9yOjpTdGF0ZSB2YWxpZGF0ZSggUVN0cmluZyYgaW5wdXQsIGludCYgcG9zICkgY29uc3Q7CgogICAgdm9pZCBzZXRSZWdFeHAoIGNvbnN0IFFSZWdFeHAmIHJ4ICk7CiAgICBjb25zdCBRUmVnRXhwJiByZWdFeHAoKSBjb25zdCB7IHJldHVybiByOyB9Cgpwcml2YXRlOgojaWYgZGVmaW5lZChRX0RJU0FCTEVfQ09QWSkKICAgIFFSZWdFeHBWYWxpZGF0b3IoIGNvbnN0IFFSZWdFeHBWYWxpZGF0b3ImICk7CiAgICBRUmVnRXhwVmFsaWRhdG9yJiBvcGVyYXRvcj0oIGNvbnN0IFFSZWdFeHBWYWxpZGF0b3ImICk7CiNlbmRpZgoKICAgIFFSZWdFeHAgcjsKfTsKI2VuZGlmIC8vIFFUX05PX1JFR0VYUAoKCiNlbmRpZiAvLyBRVF9OT19WQUxJREFUT1IKCiNlbmRpZiAvLyBRVkFMSURBVE9SX0gKAAAAFABxAHYAYQByAGkAYQBuAHQALgBoAAAngS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFWQVJJQU5UX0gKI2RlZmluZSBRVkFSSUFOVF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFzdHJpbmcuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fVkFSSUFOVApjbGFzcyBRU3RyaW5nOwpjbGFzcyBRQ1N0cmluZzsKY2xhc3MgUUZvbnQ7CmNsYXNzIFFQaXhtYXA7CmNsYXNzIFFCcnVzaDsKY2xhc3MgUVJlY3Q7CmNsYXNzIFFQb2ludDsKY2xhc3MgUUltYWdlOwpjbGFzcyBRU2l6ZTsKY2xhc3MgUUNvbG9yOwpjbGFzcyBRUGFsZXR0ZTsKY2xhc3MgUUNvbG9yR3JvdXA7CmNsYXNzIFFJY29uU2V0OwpjbGFzcyBRRGF0YVN0cmVhbTsKY2xhc3MgUVBvaW50QXJyYXk7CmNsYXNzIFFSZWdpb247CmNsYXNzIFFCaXRtYXA7CmNsYXNzIFFDdXJzb3I7CmNsYXNzIFFTdHJpbmdMaXN0OwpjbGFzcyBRU2l6ZVBvbGljeTsKY2xhc3MgUURhdGU7CmNsYXNzIFFUaW1lOwpjbGFzcyBRRGF0ZVRpbWU7CmNsYXNzIFFCaXRBcnJheTsKY2xhc3MgUUtleVNlcXVlbmNlOwpjbGFzcyBRUGVuOwovLyBTb21lIGhlYWRlcnMgcmVqZWN0ZWQgYWZ0ZXIgUVZhcmlhbnQgZGVjbGFyYXRpb24gZm9yIEdDQyAyLjcuKiBjb21wYXRpYmlsaXR5CmNsYXNzIFFWYXJpYW50OwojaWZuZGVmIFFUX05PX1RFTVBMQVRFX1ZBUklBTlQKdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIFFWYWx1ZUxpc3Q7CnRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjsKdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIFFWYWx1ZUxpc3ROb2RlOwp0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPiBjbGFzcyBRTWFwOwp0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPiBjbGFzcyBRTWFwQ29uc3RJdGVyYXRvcjsKI2VuZGlmCgpjbGFzcyBRX0VYUE9SVCBRVmFyaWFudAp7CnB1YmxpYzoKICAgIGVudW0gVHlwZSB7CglJbnZhbGlkLAoJTWFwLAoJTGlzdCwKCVN0cmluZywKCVN0cmluZ0xpc3QsCglGb250LAoJUGl4bWFwLAoJQnJ1c2gsCglSZWN0LAoJU2l6ZSwKCUNvbG9yLAoJUGFsZXR0ZSwKCUNvbG9yR3JvdXAsCglJY29uU2V0LAoJUG9pbnQsCglJbWFnZSwKCUludCwKCVVJbnQsCglCb29sLAoJRG91YmxlLAoJQ1N0cmluZywKCVBvaW50QXJyYXksCglSZWdpb24sCglCaXRtYXAsCglDdXJzb3IsCglTaXplUG9saWN5LAoJRGF0ZSwKCVRpbWUsCglEYXRlVGltZSwKCUJ5dGVBcnJheSwKCUJpdEFycmF5LAoJS2V5U2VxdWVuY2UsCglQZW4sCglMb25nTG9uZywKCVVMb25nTG9uZwogICAgfTsKCiAgICBRVmFyaWFudCgpOwogICAgflFWYXJpYW50KCk7CiAgICBRVmFyaWFudCggY29uc3QgUVZhcmlhbnQmICk7CiNpZm5kZWYgUVRfTk9fREFUQVNUUkVBTQogICAgUVZhcmlhbnQoIFFEYXRhU3RyZWFtJiBzICk7CiNlbmRpZgogICAgUVZhcmlhbnQoIGNvbnN0IFFTdHJpbmcmICk7CiAgICBRVmFyaWFudCggY29uc3QgUUNTdHJpbmcmICk7CiAgICBRVmFyaWFudCggY29uc3QgY2hhciogKTsKI2lmbmRlZiBRVF9OT19TVFJJTkdMSVNUCiAgICBRVmFyaWFudCggY29uc3QgUVN0cmluZ0xpc3QmICk7CiNlbmRpZgogICAgUVZhcmlhbnQoIGNvbnN0IFFGb250JiApOwogICAgUVZhcmlhbnQoIGNvbnN0IFFQaXhtYXAmICk7CiAgICBRVmFyaWFudCggY29uc3QgUUltYWdlJiApOwogICAgUVZhcmlhbnQoIGNvbnN0IFFCcnVzaCYgKTsKICAgIFFWYXJpYW50KCBjb25zdCBRUG9pbnQmICk7CiAgICBRVmFyaWFudCggY29uc3QgUVJlY3QmICk7CiAgICBRVmFyaWFudCggY29uc3QgUVNpemUmICk7CiAgICBRVmFyaWFudCggY29uc3QgUUNvbG9yJiApOwogICAgUVZhcmlhbnQoIGNvbnN0IFFQYWxldHRlJiApOwogICAgUVZhcmlhbnQoIGNvbnN0IFFDb2xvckdyb3VwJiApOwogICAgUVZhcmlhbnQoIGNvbnN0IFFJY29uU2V0JiApOwogICAgUVZhcmlhbnQoIGNvbnN0IFFQb2ludEFycmF5JiApOwogICAgUVZhcmlhbnQoIGNvbnN0IFFSZWdpb24mICk7CiAgICBRVmFyaWFudCggY29uc3QgUUJpdG1hcCYgKTsKICAgIFFWYXJpYW50KCBjb25zdCBRQ3Vyc29yJiApOwogICAgUVZhcmlhbnQoIGNvbnN0IFFEYXRlJiApOwogICAgUVZhcmlhbnQoIGNvbnN0IFFUaW1lJiApOwogICAgUVZhcmlhbnQoIGNvbnN0IFFEYXRlVGltZSYgKTsKICAgIFFWYXJpYW50KCBjb25zdCBRQnl0ZUFycmF5JiApOwogICAgUVZhcmlhbnQoIGNvbnN0IFFCaXRBcnJheSYgKTsKI2lmbmRlZiBRVF9OT19BQ0NFTAogICAgUVZhcmlhbnQoIGNvbnN0IFFLZXlTZXF1ZW5jZSYgKTsKI2VuZGlmCiAgICBRVmFyaWFudCggY29uc3QgUVBlbiYgKTsKI2lmbmRlZiBRVF9OT19URU1QTEFURV9WQVJJQU5UCiAgICBRVmFyaWFudCggY29uc3QgUVZhbHVlTGlzdDxRVmFyaWFudD4mICk7CiAgICBRVmFyaWFudCggY29uc3QgUU1hcDxRU3RyaW5nLFFWYXJpYW50PiYgKTsKI2VuZGlmCiAgICBRVmFyaWFudCggaW50ICk7CiAgICBRVmFyaWFudCggdWludCApOwogICAgUVZhcmlhbnQoIFFfTExPTkcgKTsKICAgIFFWYXJpYW50KCBRX1VMTE9ORyApOwogICAgLy8gIyMjIFByb2JsZW1zIG9uIHNvbWUgY29tcGlsZXJzID8KICAgIFFWYXJpYW50KCBib29sLCBpbnQgKTsKICAgIFFWYXJpYW50KCBkb3VibGUgKTsKICAgIFFWYXJpYW50KCBRU2l6ZVBvbGljeSApOwoKICAgIFFWYXJpYW50JiBvcGVyYXRvcj0gKCBjb25zdCBRVmFyaWFudCYgKTsKICAgIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUVZhcmlhbnQmICkgY29uc3Q7CiAgICBib29sIG9wZXJhdG9yIT0oIGNvbnN0IFFWYXJpYW50JiApIGNvbnN0OwoKICAgIFR5cGUgdHlwZSgpIGNvbnN0OwogICAgY29uc3QgY2hhciogdHlwZU5hbWUoKSBjb25zdDsKCiAgICBib29sIGNhbkNhc3QoIFR5cGUgKSBjb25zdDsKICAgIGJvb2wgY2FzdCggVHlwZSApOwoKICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwogICAgYm9vbCBpc051bGwoKSBjb25zdDsKCiAgICB2b2lkIGNsZWFyKCk7CgogICAgY29uc3QgUVN0cmluZyB0b1N0cmluZygpIGNvbnN0OwogICAgY29uc3QgUUNTdHJpbmcgdG9DU3RyaW5nKCkgY29uc3Q7CiNpZm5kZWYgUVRfTk9fU1RSSU5HTElTVAogICAgY29uc3QgUVN0cmluZ0xpc3QgdG9TdHJpbmdMaXN0KCkgY29uc3Q7CiNlbmRpZgogICAgY29uc3QgUUZvbnQgdG9Gb250KCkgY29uc3Q7CiAgICBjb25zdCBRUGl4bWFwIHRvUGl4bWFwKCkgY29uc3Q7CiAgICBjb25zdCBRSW1hZ2UgdG9JbWFnZSgpIGNvbnN0OwogICAgY29uc3QgUUJydXNoIHRvQnJ1c2goKSBjb25zdDsKICAgIGNvbnN0IFFQb2ludCB0b1BvaW50KCkgY29uc3Q7CiAgICBjb25zdCBRUmVjdCB0b1JlY3QoKSBjb25zdDsKICAgIGNvbnN0IFFTaXplIHRvU2l6ZSgpIGNvbnN0OwogICAgY29uc3QgUUNvbG9yIHRvQ29sb3IoKSBjb25zdDsKICAgIGNvbnN0IFFQYWxldHRlIHRvUGFsZXR0ZSgpIGNvbnN0OwogICAgY29uc3QgUUNvbG9yR3JvdXAgdG9Db2xvckdyb3VwKCkgY29uc3Q7CiAgICBjb25zdCBRSWNvblNldCB0b0ljb25TZXQoKSBjb25zdDsKICAgIGNvbnN0IFFQb2ludEFycmF5IHRvUG9pbnRBcnJheSgpIGNvbnN0OwogICAgY29uc3QgUUJpdG1hcCB0b0JpdG1hcCgpIGNvbnN0OwogICAgY29uc3QgUVJlZ2lvbiB0b1JlZ2lvbigpIGNvbnN0OwogICAgY29uc3QgUUN1cnNvciB0b0N1cnNvcigpIGNvbnN0OwogICAgY29uc3QgUURhdGUgdG9EYXRlKCkgY29uc3Q7CiAgICBjb25zdCBRVGltZSB0b1RpbWUoKSBjb25zdDsKICAgIGNvbnN0IFFEYXRlVGltZSB0b0RhdGVUaW1lKCkgY29uc3Q7CiAgICBjb25zdCBRQnl0ZUFycmF5IHRvQnl0ZUFycmF5KCkgY29uc3Q7CiAgICBjb25zdCBRQml0QXJyYXkgdG9CaXRBcnJheSgpIGNvbnN0OwojaWZuZGVmIFFUX05PX0FDQ0VMCiAgICBjb25zdCBRS2V5U2VxdWVuY2UgdG9LZXlTZXF1ZW5jZSgpIGNvbnN0OwojZW5kaWYKICAgIGNvbnN0IFFQZW4gdG9QZW4oKSBjb25zdDsKICAgIGludCB0b0ludCggYm9vbCAqIG9rPTAgKSBjb25zdDsKICAgIHVpbnQgdG9VSW50KCBib29sICogb2s9MCApIGNvbnN0OwogICAgUV9MTE9ORyB0b0xvbmdMb25nKCBib29sICogb2s9MCApIGNvbnN0OwogICAgUV9VTExPTkcgdG9VTG9uZ0xvbmcoIGJvb2wgKiBvaz0wICkgY29uc3Q7CiAgICBib29sIHRvQm9vbCgpIGNvbnN0OwogICAgZG91YmxlIHRvRG91YmxlKCBib29sICogb2s9MCApIGNvbnN0OwojaWZuZGVmIFFUX05PX1RFTVBMQVRFX1ZBUklBTlQKICAgIGNvbnN0IFFWYWx1ZUxpc3Q8UVZhcmlhbnQ+IHRvTGlzdCgpIGNvbnN0OwogICAgY29uc3QgUU1hcDxRU3RyaW5nLFFWYXJpYW50PiB0b01hcCgpIGNvbnN0OwojZW5kaWYKICAgIFFTaXplUG9saWN5IHRvU2l6ZVBvbGljeSgpIGNvbnN0OwoKI2lmbmRlZiBRVF9OT19URU1QTEFURV9WQVJJQU5UCiAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxRU3RyaW5nPiBzdHJpbmdMaXN0QmVnaW4oKSBjb25zdDsKICAgIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPFFTdHJpbmc+IHN0cmluZ0xpc3RFbmQoKSBjb25zdDsKICAgIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPFFWYXJpYW50PiBsaXN0QmVnaW4oKSBjb25zdDsKICAgIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPFFWYXJpYW50PiBsaXN0RW5kKCkgY29uc3Q7CiAgICBRTWFwQ29uc3RJdGVyYXRvcjxRU3RyaW5nLFFWYXJpYW50PiBtYXBCZWdpbigpIGNvbnN0OwogICAgUU1hcENvbnN0SXRlcmF0b3I8UVN0cmluZyxRVmFyaWFudD4gbWFwRW5kKCkgY29uc3Q7CiAgICBRTWFwQ29uc3RJdGVyYXRvcjxRU3RyaW5nLFFWYXJpYW50PiBtYXBGaW5kKCBjb25zdCBRU3RyaW5nJiApIGNvbnN0OwojZW5kaWYKICAgIFFTdHJpbmcmIGFzU3RyaW5nKCk7CiAgICBRQ1N0cmluZyYgYXNDU3RyaW5nKCk7CiNpZm5kZWYgUVRfTk9fU1RSSU5HTElTVAogICAgUVN0cmluZ0xpc3QmIGFzU3RyaW5nTGlzdCgpOwojZW5kaWYKICAgIFFGb250JiBhc0ZvbnQoKTsKICAgIFFQaXhtYXAmIGFzUGl4bWFwKCk7CiAgICBRSW1hZ2UmIGFzSW1hZ2UoKTsKICAgIFFCcnVzaCYgYXNCcnVzaCgpOwogICAgUVBvaW50JiBhc1BvaW50KCk7CiAgICBRUmVjdCYgYXNSZWN0KCk7CiAgICBRU2l6ZSYgYXNTaXplKCk7CiAgICBRQ29sb3ImIGFzQ29sb3IoKTsKICAgIFFQYWxldHRlJiBhc1BhbGV0dGUoKTsKICAgIFFDb2xvckdyb3VwJiBhc0NvbG9yR3JvdXAoKTsKICAgIFFJY29uU2V0JiBhc0ljb25TZXQoKTsKICAgIFFQb2ludEFycmF5JiBhc1BvaW50QXJyYXkoKTsKICAgIFFCaXRtYXAmIGFzQml0bWFwKCk7CiAgICBRUmVnaW9uJiBhc1JlZ2lvbigpOwogICAgUUN1cnNvciYgYXNDdXJzb3IoKTsKICAgIFFEYXRlJiBhc0RhdGUoKTsKICAgIFFUaW1lJiBhc1RpbWUoKTsKICAgIFFEYXRlVGltZSYgYXNEYXRlVGltZSgpOwogICAgUUJ5dGVBcnJheSYgYXNCeXRlQXJyYXkoKTsKICAgIFFCaXRBcnJheSYgYXNCaXRBcnJheSgpOwojaWZuZGVmIFFUX05PX0FDQ0VMCiAgICBRS2V5U2VxdWVuY2UmIGFzS2V5U2VxdWVuY2UoKTsKI2VuZGlmCiAgICBRUGVuJiBhc1BlbigpOwogICAgaW50JiBhc0ludCgpOwogICAgdWludCYgYXNVSW50KCk7CiAgICBRX0xMT05HJiBhc0xvbmdMb25nKCk7CiAgICBRX1VMTE9ORyYgYXNVTG9uZ0xvbmcoKTsKICAgIGJvb2wmIGFzQm9vbCgpOwogICAgZG91YmxlJiBhc0RvdWJsZSgpOwojaWZuZGVmIFFUX05PX1RFTVBMQVRFX1ZBUklBTlQKICAgIFFWYWx1ZUxpc3Q8UVZhcmlhbnQ+JiBhc0xpc3QoKTsKICAgIFFNYXA8UVN0cmluZyxRVmFyaWFudD4mIGFzTWFwKCk7CiNlbmRpZgogICAgUVNpemVQb2xpY3kmIGFzU2l6ZVBvbGljeSgpOwoKI2lmbmRlZiBRVF9OT19EQVRBU1RSRUFNCiAgICB2b2lkIGxvYWQoIFFEYXRhU3RyZWFtJiApOwogICAgdm9pZCBzYXZlKCBRRGF0YVN0cmVhbSYgKSBjb25zdDsKI2VuZGlmCiAgICBzdGF0aWMgY29uc3QgY2hhciogdHlwZVRvTmFtZSggVHlwZSB0eXAgKTsKICAgIHN0YXRpYyBUeXBlIG5hbWVUb1R5cGUoIGNvbnN0IGNoYXIqIG5hbWUgKTsKCnByaXZhdGU6CiAgICB2b2lkIGRldGFjaCgpOwoKICAgIGNsYXNzIFByaXZhdGUgOiBwdWJsaWMgUVNoYXJlZAogICAgewogICAgcHVibGljOgoJUHJpdmF0ZSgpOwoJUHJpdmF0ZSggUHJpdmF0ZSogKTsKCX5Qcml2YXRlKCk7CgoJdm9pZCBjbGVhcigpOwoKCVR5cGUgdHlwOwoJdW5pb24KCXsKCSAgICB1aW50IHU7CgkgICAgaW50IGk7CgkgICAgUV9MTE9ORyBsbDsKCSAgICBRX1VMTE9ORyB1bGw7CgkgICAgYm9vbCBiOwoJICAgIGRvdWJsZSBkOwoJICAgIHZvaWQgKnB0cjsKCX0gdmFsdWU7Cgl1aW50IGlzX251bGwgOiAxOyAvLyAjIyA0LjAgbWVyZ2Ugd2l0aCB0eXAKICAgIH07CgogICAgUHJpdmF0ZSogZDsKCnB1YmxpYzoKICAgIHZvaWQqIHJhd0FjY2Vzcyggdm9pZCogcHRyID0gMCwgVHlwZSB0eXAgPSBJbnZhbGlkLCBib29sIGRlZXBDb3B5ID0gRkFMU0UgKTsKfTsKCi8vIGRvd24gaGVyZSBmb3IgR0NDIDIuNy4qIGNvbXBhdGliaWxpdHkKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxdmFsdWVsaXN0LmgiCiNpbmNsdWRlICJxc3RyaW5nbGlzdC5oIgojaW5jbHVkZSAicW1hcC5oIgojZW5kaWYgLy8gUVRfSAoKaW5saW5lIFFWYXJpYW50OjpUeXBlIFFWYXJpYW50Ojp0eXBlKCkgY29uc3QKewogICAgcmV0dXJuIGQtPnR5cDsKfQoKaW5saW5lIGJvb2wgUVZhcmlhbnQ6OmlzVmFsaWQoKSBjb25zdAp7CiAgICByZXR1cm4gKGQtPnR5cCAhPSBJbnZhbGlkKTsKfQoKI2lmbmRlZiBRVF9OT19URU1QTEFURV9WQVJJQU5UCmlubGluZSBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxRU3RyaW5nPiBRVmFyaWFudDo6c3RyaW5nTGlzdEJlZ2luKCkgY29uc3QKewogICAgaWYgKCBkLT50eXAgIT0gU3RyaW5nTGlzdCApCglyZXR1cm4gUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8UVN0cmluZz4oKTsKICAgIHJldHVybiAoKGNvbnN0IFFTdHJpbmdMaXN0KilkLT52YWx1ZS5wdHIpLT5iZWdpbigpOwp9CgppbmxpbmUgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8UVN0cmluZz4gUVZhcmlhbnQ6OnN0cmluZ0xpc3RFbmQoKSBjb25zdAp7CiAgICBpZiAoIGQtPnR5cCAhPSBTdHJpbmdMaXN0ICkKCXJldHVybiBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxRU3RyaW5nPigpOwogICAgcmV0dXJuICgoY29uc3QgUVN0cmluZ0xpc3QqKWQtPnZhbHVlLnB0ciktPmVuZCgpOwp9CgppbmxpbmUgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8UVZhcmlhbnQ+IFFWYXJpYW50OjpsaXN0QmVnaW4oKSBjb25zdAp7CiAgICBpZiAoIGQtPnR5cCAhPSBMaXN0ICkKCXJldHVybiBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxRVmFyaWFudD4oKTsKICAgIHJldHVybiAoKGNvbnN0IFFWYWx1ZUxpc3Q8UVZhcmlhbnQ+KilkLT52YWx1ZS5wdHIpLT5iZWdpbigpOwp9CgppbmxpbmUgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8UVZhcmlhbnQ+IFFWYXJpYW50OjpsaXN0RW5kKCkgY29uc3QKewogICAgaWYgKCBkLT50eXAgIT0gTGlzdCApCglyZXR1cm4gUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8UVZhcmlhbnQ+KCk7CiAgICByZXR1cm4gKChjb25zdCBRVmFsdWVMaXN0PFFWYXJpYW50PiopZC0+dmFsdWUucHRyKS0+ZW5kKCk7Cn0KCmlubGluZSBRTWFwQ29uc3RJdGVyYXRvcjxRU3RyaW5nLFFWYXJpYW50PiBRVmFyaWFudDo6bWFwQmVnaW4oKSBjb25zdAp7CiAgICBpZiAoIGQtPnR5cCAhPSBNYXAgKQoJcmV0dXJuIFFNYXBDb25zdEl0ZXJhdG9yPFFTdHJpbmcsUVZhcmlhbnQ+KCk7CiAgICByZXR1cm4gKChjb25zdCBRTWFwPFFTdHJpbmcsUVZhcmlhbnQ+KilkLT52YWx1ZS5wdHIpLT5iZWdpbigpOwp9CgppbmxpbmUgUU1hcENvbnN0SXRlcmF0b3I8UVN0cmluZyxRVmFyaWFudD4gUVZhcmlhbnQ6Om1hcEVuZCgpIGNvbnN0CnsKICAgIGlmICggZC0+dHlwICE9IE1hcCApCglyZXR1cm4gUU1hcENvbnN0SXRlcmF0b3I8UVN0cmluZyxRVmFyaWFudD4oKTsKICAgIHJldHVybiAoKGNvbnN0IFFNYXA8UVN0cmluZyxRVmFyaWFudD4qKWQtPnZhbHVlLnB0ciktPmVuZCgpOwp9CgppbmxpbmUgUU1hcENvbnN0SXRlcmF0b3I8UVN0cmluZyxRVmFyaWFudD4gUVZhcmlhbnQ6Om1hcEZpbmQoIGNvbnN0IFFTdHJpbmcmIGtleSApIGNvbnN0CnsKICAgIGlmICggZC0+dHlwICE9IE1hcCApCglyZXR1cm4gUU1hcENvbnN0SXRlcmF0b3I8UVN0cmluZyxRVmFyaWFudD4oKTsKICAgIHJldHVybiAoKGNvbnN0IFFNYXA8UVN0cmluZyxRVmFyaWFudD4qKWQtPnZhbHVlLnB0ciktPmZpbmQoIGtleSApOwp9CiNlbmRpZgoKI2lmbmRlZiBRVF9OT19EQVRBU1RSRUFNClFfRVhQT1JUIFFEYXRhU3RyZWFtJiBvcGVyYXRvcj4+ICggUURhdGFTdHJlYW0mIHMsIFFWYXJpYW50JiBwICk7ClFfRVhQT1JUIFFEYXRhU3RyZWFtJiBvcGVyYXRvcjw8ICggUURhdGFTdHJlYW0mIHMsIGNvbnN0IFFWYXJpYW50JiBwICk7ClFfRVhQT1JUIFFEYXRhU3RyZWFtJiBvcGVyYXRvcj4+ICggUURhdGFTdHJlYW0mIHMsIFFWYXJpYW50OjpUeXBlJiBwICk7ClFfRVhQT1JUIFFEYXRhU3RyZWFtJiBvcGVyYXRvcjw8ICggUURhdGFTdHJlYW0mIHMsIGNvbnN0IFFWYXJpYW50OjpUeXBlIHAgKTsKI2VuZGlmCgojZW5kaWYgLy9RVF9OT19WQVJJQU5UCiNlbmRpZiAvLyBRVkFSSUFOVF9ICgAAABQAcQB3AGkAbgBkAGUAZgBzAC4AaAAABCsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2lmbmRlZiBRV0lOREVGU19ICiNkZWZpbmUgUVdJTkRFRlNfSAojaW5jbHVkZSAicXdpbmRvd2RlZnMuaCIKI2VuZGlmCgAAACYAcQB3AHMAZABlAGMAbwByAGEAdABpAG8AbgBfAHEAdwBzAC4AaAAACKAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdTREVDT1JBVElPTl9RV1NfSAojZGVmaW5lIFFXU0RFQ09SQVRJT05fUVdTX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXJlZ2lvbi5oIgojZW5kaWYgLy8gUVRfSAoKY2xhc3MgUVBvcHVwTWVudTsKCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmNsYXNzIFFXU0RlY29yYXRpb24KewpwdWJsaWM6CiAgICBRV1NEZWNvcmF0aW9uKCkge30KICAgIHZpcnR1YWwgflFXU0RlY29yYXRpb24oKSB7fQoKICAgIGVudW0gUmVnaW9uIHsgTm9uZT0wLCBBbGw9MSwgVGl0bGU9MiwgVG9wPTMsIEJvdHRvbT00LCBMZWZ0PTUsIFJpZ2h0PTYsCgkJVG9wTGVmdD03LCBUb3BSaWdodD04LCBCb3R0b21MZWZ0PTksIEJvdHRvbVJpZ2h0PTEwLAoJCUNsb3NlPTExLCBNaW5pbWl6ZT0xMiwgTWF4aW1pemU9MTMsIE5vcm1hbGl6ZT0xNCwKCQlNZW51PTE1LCBMYXN0UmVnaW9uPU1lbnUgfTsKCiAgICB2aXJ0dWFsIFFSZWdpb24gcmVnaW9uKGNvbnN0IFFXaWRnZXQgKiwgY29uc3QgUVJlY3QgJnJlY3QsIFJlZ2lvbiByPUFsbCkgPSAwOwogICAgdmlydHVhbCB2b2lkIGNsb3NlKCBRV2lkZ2V0ICogKTsKICAgIHZpcnR1YWwgdm9pZCBtaW5pbWl6ZSggUVdpZGdldCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgbWF4aW1pemUoIFFXaWRnZXQgKiApOwojaWZuZGVmIFFUX05PX1BPUFVQTUVOVQogICAgdmlydHVhbCBRUG9wdXBNZW51ICptZW51KGNvbnN0IFFXaWRnZXQgKiwgY29uc3QgUVBvaW50ICYpOwojZW5kaWYKICAgIHZpcnR1YWwgdm9pZCBwYWludChRUGFpbnRlciAqLCBjb25zdCBRV2lkZ2V0ICopID0gMDsKICAgIHZpcnR1YWwgdm9pZCBwYWludEJ1dHRvbihRUGFpbnRlciAqLCBjb25zdCBRV2lkZ2V0ICosIFJlZ2lvbiwgaW50IHN0YXRlKSA9IDA7Cn07CgojZW5kaWYgLy8gUVdTREVDT1JBVElPTl9RV1NfSAoAAAAcAHEAcwB0AHkAbABlAHAAbAB1AGcAaQBuAC4AaAAAB/4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRU1RZTEVQTFVHSU5fSAojZGVmaW5lIFFTVFlMRVBMVUdJTl9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFncGx1Z2luLmgiCiNpbmNsdWRlICJxc3RyaW5nbGlzdC5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19TVFlMRQojaWZuZGVmIFFUX05PX0NPTVBPTkVOVAoKY2xhc3MgUVN0eWxlOwpjbGFzcyBRU3R5bGVQbHVnaW5Qcml2YXRlOwoKY2xhc3MgUV9FWFBPUlQgUVN0eWxlUGx1Z2luIDogcHVibGljIFFHUGx1Z2luCnsKICAgIFFfT0JKRUNUCnB1YmxpYzoKICAgIFFTdHlsZVBsdWdpbigpOwogICAgflFTdHlsZVBsdWdpbigpOwoKICAgIHZpcnR1YWwgUVN0cmluZ0xpc3Qga2V5cygpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgUVN0eWxlICpjcmVhdGUoIGNvbnN0IFFTdHJpbmcgJmtleSApID0gMDsKCnByaXZhdGU6CiAgICBRU3R5bGVQbHVnaW5Qcml2YXRlICpkOwp9OwoKI2VuZGlmIC8vIFFUX05PX0NPTVBPTkVOVAojZW5kaWYgLy8gUVRfTk9fU1RZTEUKCiNlbmRpZiAvLyBRU1RZTEVQTFVHSU5fSAoAAAAcAHEAdABlAHgAdABiAHIAbwB3AHMAZQByAC4AaAAADVgvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRVEVYVEJST1dTRVJfSAojZGVmaW5lIFFURVhUQlJPV1NFUl9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFwdHJsaXN0LmgiCiNpbmNsdWRlICJxcGl4bWFwLmgiCiNpbmNsdWRlICJxY29sb3IuaCIKI2luY2x1ZGUgInF0ZXh0ZWRpdC5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19URVhUQlJPV1NFUgoKY2xhc3MgUVRleHRCcm93c2VyRGF0YTsKCmNsYXNzIFFfRVhQT1JUIFFUZXh0QnJvd3NlciA6IHB1YmxpYyBRVGV4dEVkaXQKewogICAgUV9PQkpFQ1QKICAgIFFfUFJPUEVSVFkoIFFTdHJpbmcgc291cmNlIFJFQUQgc291cmNlIFdSSVRFIHNldFNvdXJjZSApCiAgICBRX09WRVJSSURFKCBpbnQgdW5kb0RlcHRoIERFU0lHTkFCTEUgZmFsc2UgU0NSSVBUQUJMRSBmYWxzZSApCiAgICBRX09WRVJSSURFKCBib29sIG92ZXJ3cml0ZU1vZGUgREVTSUdOQUJMRSBmYWxzZSBTQ1JJUFRBQkxFIGZhbHNlICkKICAgIFFfT1ZFUlJJREUoIGJvb2wgbW9kaWZpZWQgU0NSSVBUQUJMRSBmYWxzZSkKICAgIFFfT1ZFUlJJREUoIGJvb2wgcmVhZE9ubHkgREVTSUdOQUJMRSBmYWxzZSBTQ1JJUFRBQkxFIGZhbHNlICkKICAgIFFfT1ZFUlJJREUoIGJvb2wgdW5kb1JlZG9FbmFibGVkIERFU0lHTkFCTEUgZmFsc2UgU0NSSVBUQUJMRSBmYWxzZSApCgpwdWJsaWM6CiAgICBRVGV4dEJyb3dzZXIoIFFXaWRnZXQqIHBhcmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAgKTsKICAgIH5RVGV4dEJyb3dzZXIoKTsKCiAgICBRU3RyaW5nIHNvdXJjZSgpIGNvbnN0OwoKcHVibGljIHNsb3RzOgogICAgdmlydHVhbCB2b2lkIHNldFNvdXJjZShjb25zdCBRU3RyaW5nJiBuYW1lKTsKICAgIHZpcnR1YWwgdm9pZCBiYWNrd2FyZCgpOwogICAgdmlydHVhbCB2b2lkIGZvcndhcmQoKTsKICAgIHZpcnR1YWwgdm9pZCBob21lKCk7CiAgICB2aXJ0dWFsIHZvaWQgcmVsb2FkKCk7CiAgICB2b2lkIHNldFRleHQoIGNvbnN0IFFTdHJpbmcgJnR4dCApIHsgc2V0VGV4dCggdHh0LCBRU3RyaW5nOjpudWxsICk7IH0KICAgIHZpcnR1YWwgdm9pZCBzZXRUZXh0KCBjb25zdCBRU3RyaW5nICZ0eHQsIGNvbnN0IFFTdHJpbmcgJmNvbnRleHQgKTsKCnNpZ25hbHM6CiAgICB2b2lkIGJhY2t3YXJkQXZhaWxhYmxlKCBib29sICk7CiAgICB2b2lkIGZvcndhcmRBdmFpbGFibGUoIGJvb2wgKTsKICAgIHZvaWQgc291cmNlQ2hhbmdlZCggY29uc3QgUVN0cmluZyYgKTsKICAgIHZvaWQgaGlnaGxpZ2h0ZWQoIGNvbnN0IFFTdHJpbmcmICk7CiAgICB2b2lkIGxpbmtDbGlja2VkKCBjb25zdCBRU3RyaW5nJiApOwogICAgdm9pZCBhbmNob3JDbGlja2VkKCBjb25zdCBRU3RyaW5nJiwgY29uc3QgUVN0cmluZyYgKTsKCnByb3RlY3RlZDoKICAgIHZvaWQga2V5UHJlc3NFdmVudCggUUtleUV2ZW50ICogZSk7Cgpwcml2YXRlOgogICAgdm9pZCBwb3B1cERldGFpbCggY29uc3QgUVN0cmluZyYgY29udGVudHMsIGNvbnN0IFFQb2ludCYgcG9zICk7CiAgICBib29sIGxpbmtzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIFRSVUU7IH0KICAgIHZvaWQgZW1pdEhpZ2hsaWdodGVkKCBjb25zdCBRU3RyaW5nICZzICk7CiAgICB2b2lkIGVtaXRMaW5rQ2xpY2tlZCggY29uc3QgUVN0cmluZyAmcyApOwogICAgUVRleHRCcm93c2VyRGF0YSAqZDsKCnByaXZhdGU6CS8vIERpc2FibGVkIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPQojaWYgZGVmaW5lZChRX0RJU0FCTEVfQ09QWSkKICAgIFFUZXh0QnJvd3NlciggY29uc3QgUVRleHRCcm93c2VyICYgKTsKICAgIFFUZXh0QnJvd3NlciYgb3BlcmF0b3I9KCBjb25zdCBRVGV4dEJyb3dzZXIgJiApOwojZW5kaWYKfTsKCiNlbmRpZiAvLyBRVF9OT19URVhUQlJPV1NFUgoKI2VuZGlmIC8vIFFURVhUQlJPV1NFUl9ICgAAAC4AcQB3AHMAYgBlAG8AcwBkAGUAYwBvAHIAYQB0AGkAbwBuAF8AcQB3AHMALgBoAAAIAi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdTQkVPU0RFQ09SQVRJT05fUVdTX0gKI2RlZmluZSBRV1NCRU9TREVDT1JBVElPTl9RV1NfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxd3NkZWZhdWx0ZGVjb3JhdGlvbl9xd3MuaCIKI2VuZGlmIC8vIFFUX0gKCgojaWZuZGVmIFFUX05PX1FXU19CRU9TX1dNX1NUWUxFCgoKY2xhc3MgUVdTQmVPU0RlY29yYXRpb24gOiBwdWJsaWMgUVdTRGVmYXVsdERlY29yYXRpb24KewpwdWJsaWM6CiAgICBRV1NCZU9TRGVjb3JhdGlvbigpOwogICAgdmlydHVhbCB+UVdTQmVPU0RlY29yYXRpb24oKTsKCiAgICB2aXJ0dWFsIFFSZWdpb24gcmVnaW9uKGNvbnN0IFFXaWRnZXQgKiwgY29uc3QgUVJlY3QgJnJlY3QsIFJlZ2lvbik7CiAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUVBhaW50ZXIgKiwgY29uc3QgUVdpZGdldCAqKTsKICAgIHZpcnR1YWwgdm9pZCBwYWludEJ1dHRvbihRUGFpbnRlciAqLCBjb25zdCBRV2lkZ2V0ICosIFJlZ2lvbiwgaW50IHN0YXRlKTsKcHJvdGVjdGVkOgogICAgdmlydHVhbCBpbnQgZ2V0VGl0bGVXaWR0aChjb25zdCBRV2lkZ2V0ICopOwogICAgdmlydHVhbCBpbnQgZ2V0VGl0bGVIZWlnaHQoY29uc3QgUVdpZGdldCAqKTsKICAgIHZpcnR1YWwgY29uc3QgY2hhciAqKm1lbnVQaXhtYXAoKTsKLy8gICAgdmlydHVhbCBjb25zdCBjaGFyICoqbm9ybWFsaXplUGl4bWFwKCk7Cn07CgojZW5kaWYgLy8gUVRfTk9fUVdTX0JFT1NfV01fU1RZTEUKCiNlbmRpZiAvLyBRV1NCRU9TREVDT1JBVElPTl9RV1NfSAoAAAAiAHEAdwBpAG4AZABvAHcAZABlAGYAcwBfAHcAaQBuAC4AaAAACvsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdJTkRPV0RFRlNfV0lOX0gKI2lmbmRlZiBRVF9ICiNlbmRpZiAvLyBRVF9ICiNkZWZpbmUgUVdJTkRPV0RFRlNfV0lOX0gKCiNpZm5kZWYgUVRfSAojZW5kaWYgLy8gUVRfSAoKI2lmIGRlZmluZWQoUV9DQ19CT1IpICYmICFkZWZpbmVkKF9fQ09OU09MRV9fKQojZGVmaW5lIE5FRURTX1FNQUlOCiNlbGlmIGRlZmluZWQoUV9DQ19XQVQpCiNkZWZpbmUgTkVFRFNfUU1BSU4KI2VuZGlmCgojaWYgIWRlZmluZWQoUV9OT1dJTlNUUklDVCkKI2RlZmluZSBRX1dJTlNUUklDVAojZW5kaWYKCiNpZiBkZWZpbmVkKFFfV0lOU1RSSUNUKQoKI2lmICFkZWZpbmVkKFNUUklDVCkKI2RlZmluZSBTVFJJQ1QKI2VuZGlmCiN1bmRlZiBOT19TVFJJQ1QKI2RlZmluZSBRX0RFQ0xBUkVfSEFORExFKG5hbWUpIHN0cnVjdCBuYW1lIyNfXzsgdHlwZWRlZiBzdHJ1Y3QgbmFtZSMjX18gKm5hbWUKCiNlbHNlCgojaWYgIWRlZmluZWQoTk9fU1RSSUNUKQojZGVmaW5lIE5PX1NUUklDVAojZW5kaWYKI3VuZGVmICBTVFJJQ1QKI2RlZmluZSBRX0RFQ0xBUkVfSEFORExFKG5hbWUpIHR5cGVkZWYgSEFORExFIG5hbWUKCiNlbmRpZgoKI2lmbmRlZiBISU5TVEFOQ0UKUV9ERUNMQVJFX0hBTkRMRShISU5TVEFOQ0UpOwojZW5kaWYKI2lmbmRlZiBIREMKUV9ERUNMQVJFX0hBTkRMRShIREMpOwojZW5kaWYKI2lmbmRlZiBIV05EClFfREVDTEFSRV9IQU5ETEUoSFdORCk7CiNlbmRpZgojaWZuZGVmIEhGT05UClFfREVDTEFSRV9IQU5ETEUoSEZPTlQpOwojZW5kaWYKI2lmbmRlZiBIUEVOClFfREVDTEFSRV9IQU5ETEUoSFBFTik7CiNlbmRpZgojaWZuZGVmIEhCUlVTSApRX0RFQ0xBUkVfSEFORExFKEhCUlVTSCk7CiNlbmRpZgojaWZuZGVmIEhCSVRNQVAKUV9ERUNMQVJFX0hBTkRMRShIQklUTUFQKTsKI2VuZGlmCiNpZm5kZWYgSElDT04KUV9ERUNMQVJFX0hBTkRMRShISUNPTik7CiNlbmRpZgojaWZuZGVmIEhDVVJTT1IKdHlwZWRlZiBISUNPTiBIQ1VSU09SOwojZW5kaWYKI2lmbmRlZiBIUEFMRVRURQpRX0RFQ0xBUkVfSEFORExFKEhQQUxFVFRFKTsKI2VuZGlmCiNpZm5kZWYgSFJHTgpRX0RFQ0xBUkVfSEFORExFKEhSR04pOwojZW5kaWYKI2lmbmRlZiBITU9OSVRPUgpRX0RFQ0xBUkVfSEFORExFKEhNT05JVE9SKTsKI2VuZGlmCiNpZm5kZWYgSFJFU1VMVAp0eXBlZGVmIGxvbmcgSFJFU1VMVDsKI2VuZGlmCgp0eXBlZGVmIHN0cnVjdCB0YWdNU0cgTVNHOwp0eXBlZGVmIEhXTkQgV0lkOwoKUV9FWFBPUlQgSElOU1RBTkNFIHFXaW5BcHBJbnN0KCk7ClFfRVhQT1JUIEhJTlNUQU5DRSBxV2luQXBwUHJldkluc3QoKTsKUV9FWFBPUlQgaW50CSAgIHFXaW5BcHBDbWRTaG93KCk7ClFfRVhQT1JUIEhEQwkgICBxdF9kaXNwbGF5X2RjKCk7CgojZGVmaW5lIFFUX1dJTl9QQUlOVEVSX01FTUJFUlMgXAogICAgSERDCQloZGM7CQlcCiAgICBIUEVOCWhwZW47CQlcCiAgICBIRk9OVAloZm9udDsJCVwKICAgIEhCUlVTSAloYnJ1c2g7CQlcCiAgICBIQklUTUFQCWhicnVzaGJtOwlcCiAgICBIUEFMRVRURQlob2xkcGFsOwlcCiAgICB1aW50CW5vY29sQnJ1c2ggIDogMTtcCiAgICB1aW50CXBpeG1hcEJydXNoIDogMTtcCiAgICB1aW50IHVzaW5nTmF0aXZlWEZvcm0gOiAxOyAgXAogICAgdWludCBoYXNVc2VkTmF0aXZlWEZvcm0gOiAxO1wKICAgIGJvb2wJbmF0aXZlWEZvcm0oIGJvb2wgKTsKCiNlbmRpZgoAAAAWAHEAdABlAHgAdABlAGQAaQB0AC4AaAAASvQvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRVEVYVEVESVRfSAojZGVmaW5lIFFURVhURURJVF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFzY3JvbGx2aWV3LmgiCiNpbmNsdWRlICJxc3R5bGVzaGVldC5oIgojaW5jbHVkZSAicXB0cnZlY3Rvci5oIgojaW5jbHVkZSAicXZhbHVlbGlzdC5oIgojaW5jbHVkZSAicXB0cmxpc3QuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fVEVYVEVESVQKLy8gdW5jb21tZW50IGJlbG93IHRvIGVuYWJsZSBvcHRpbWl6YXRpb24gbW9kZSAtIGFsc28gdW5jb21tZW50IHRoZQovLyBvcHRpbURvQXV0b1Njcm9sbCgpIHByaXZhdGUgc2xvdCBzaW5jZSBtb2MgaWdub3JlcyAjaWZkZWZzLi4KI2RlZmluZSBRVF9URVhURURJVF9PUFRJTUlaQVRJT04KCmNsYXNzIFFQYWludGVyOwpjbGFzcyBRVGV4dERvY3VtZW50OwpjbGFzcyBRVGV4dEN1cnNvcjsKY2xhc3MgUUtleUV2ZW50OwpjbGFzcyBRUmVzaXplRXZlbnQ7CmNsYXNzIFFNb3VzZUV2ZW50OwpjbGFzcyBRVGltZXI7CmNsYXNzIFFUZXh0U3RyaW5nOwpjbGFzcyBRVGV4dENvbW1hbmQ7CmNsYXNzIFFUZXh0UGFyYWdyYXBoOwpjbGFzcyBRVGV4dEZvcm1hdDsKY2xhc3MgUUZvbnQ7CmNsYXNzIFFDb2xvcjsKY2xhc3MgUVRleHRFZGl0OwpjbGFzcyBRVGV4dEJyb3dzZXI7CmNsYXNzIFFUZXh0U3RyaW5nOwpzdHJ1Y3QgUVVuZG9SZWRvSW5mb1ByaXZhdGU7CmNsYXNzIFFQb3B1cE1lbnU7CmNsYXNzIFFUZXh0RWRpdFByaXZhdGU7CmNsYXNzIFFTeW50YXhIaWdobGlnaHRlcjsKCiNpZmRlZiBRVF9URVhURURJVF9PUFRJTUlaQVRJT04KY2xhc3MgUVRleHRFZGl0T3B0aW1Qcml2YXRlCnsKcHVibGljOgogICAgLy8gTm90ZTogbm8gbGVmdC10YWcgaGFzIGFueSB2YWx1ZSBmb3IgbGVmdFRhZyBvciBwYXJlbnQsIGFuZAogICAgLy8gbm8gcmlnaHQtdGFnIGhhcyBhbnkgZm9ybWF0dGluZyBmbGFncyBzZXQuCiAgICBlbnVtIFRhZ1R5cGUgeyBDb2xvciA9IDAsIEZvcm1hdCA9IDEgfTsKICAgIHN0cnVjdCBUYWcgewoJVGFnVHlwZSB0eXBlOjI7Cglib29sIGJvbGQ6MTsKCWJvb2wgaXRhbGljOjE7Cglib29sIHVuZGVybGluZToxOwoJaW50IGxpbmU7CglpbnQgaW5kZXg7CglUYWcgKiBsZWZ0VGFnOyAvLyBwdHIgdG8gbGVmdC10YWcgaW4gYSBsZWZ0LXJpZ2h0IHRhZyBwYWlyCglUYWcgKiBwYXJlbnQ7ICAvLyBwdHIgdG8gcGFyZW50IGxlZnQtdGFnIGluIGEgbmVzdGVkIHRhZwoJVGFnICogcHJldjsKCVRhZyAqIG5leHQ7CglRU3RyaW5nIHRhZzsKICAgIH07CiAgICBRVGV4dEVkaXRPcHRpbVByaXZhdGUoKQogICAgewoJbGVuID0gbnVtTGluZXMgPSBtYXhMaW5lV2lkdGggPSAwOwoJc2VsU3RhcnQubGluZSA9IHNlbFN0YXJ0LmluZGV4ID0gLTE7CglzZWxFbmQubGluZSA9IHNlbEVuZC5pbmRleCA9IC0xOwoJc2VhcmNoLmxpbmUgPSBzZWFyY2guaW5kZXggPSAwOwoJdGFncyA9IGxhc3RUYWcgPSAwOwogICAgfQogICAgdm9pZCBjbGVhclRhZ3MoKQogICAgewoJVGFnICogaXRyID0gdGFnczsKCXdoaWxlICggdGFncyApIHsKCSAgICBpdHIgID0gdGFnczsKCSAgICB0YWdzID0gdGFncy0+bmV4dDsKCSAgICBkZWxldGUgaXRyOwoJfQoJdGFncyA9IGxhc3RUYWcgPSAwOwoJdGFnSW5kZXguY2xlYXIoKTsKICAgIH0KICAgIH5RVGV4dEVkaXRPcHRpbVByaXZhdGUoKQogICAgewoJY2xlYXJUYWdzKCk7CiAgICB9CiAgICBpbnQgbGVuOwogICAgaW50IG51bUxpbmVzOwogICAgaW50IG1heExpbmVXaWR0aDsKICAgIHN0cnVjdCBTZWxlY3Rpb24gewoJaW50IGxpbmU7CglpbnQgaW5kZXg7CiAgICB9OwogICAgU2VsZWN0aW9uIHNlbFN0YXJ0LCBzZWxFbmQsIHNlYXJjaDsKICAgIFRhZyAqIHRhZ3MsICogbGFzdFRhZzsKICAgIFFNYXA8aW50LCBRU3RyaW5nPiBsaW5lczsKICAgIFFNYXA8aW50LCBUYWcgKj4gdGFnSW5kZXg7Cn07CiNlbmRpZgoKY2xhc3MgUV9FWFBPUlQgUVRleHRFZGl0IDogcHVibGljIFFTY3JvbGxWaWV3CnsKICAgIGZyaWVuZCBjbGFzcyBRVGV4dEJyb3dzZXI7CiAgICBmcmllbmQgY2xhc3MgUVN5bnRheEhpZ2hsaWdodGVyOwoKICAgIFFfT0JKRUNUCiAgICBRX0VOVU1TKCBXb3JkV3JhcCBXcmFwUG9saWN5ICkKICAgIFFfU0VUUyggQXV0b0Zvcm1hdHRpbmcgKQogICAgUV9QUk9QRVJUWSggVGV4dEZvcm1hdCB0ZXh0Rm9ybWF0IFJFQUQgdGV4dEZvcm1hdCBXUklURSBzZXRUZXh0Rm9ybWF0ICkKICAgIFFfUFJPUEVSVFkoIFFTdHJpbmcgdGV4dCBSRUFEIHRleHQgV1JJVEUgc2V0VGV4dCApCiAgICBRX1BST1BFUlRZKCBRQnJ1c2ggcGFwZXIgUkVBRCBwYXBlciBXUklURSBzZXRQYXBlciApCiAgICBRX1BST1BFUlRZKCBib29sIGxpbmtVbmRlcmxpbmUgUkVBRCBsaW5rVW5kZXJsaW5lIFdSSVRFIHNldExpbmtVbmRlcmxpbmUgKQogICAgUV9QUk9QRVJUWSggUVN0cmluZyBkb2N1bWVudFRpdGxlIFJFQUQgZG9jdW1lbnRUaXRsZSApCiAgICBRX1BST1BFUlRZKCBpbnQgbGVuZ3RoIFJFQUQgbGVuZ3RoICkKICAgIFFfUFJPUEVSVFkoIFdvcmRXcmFwIHdvcmRXcmFwIFJFQUQgd29yZFdyYXAgV1JJVEUgc2V0V29yZFdyYXAgKQogICAgUV9QUk9QRVJUWSggaW50IHdyYXBDb2x1bW5PcldpZHRoIFJFQUQgd3JhcENvbHVtbk9yV2lkdGggV1JJVEUgc2V0V3JhcENvbHVtbk9yV2lkdGggKQogICAgUV9QUk9QRVJUWSggV3JhcFBvbGljeSB3cmFwUG9saWN5IFJFQUQgd3JhcFBvbGljeSBXUklURSBzZXRXcmFwUG9saWN5ICkKICAgIFFfUFJPUEVSVFkoIGJvb2wgaGFzU2VsZWN0ZWRUZXh0IFJFQUQgaGFzU2VsZWN0ZWRUZXh0ICkKICAgIFFfUFJPUEVSVFkoIFFTdHJpbmcgc2VsZWN0ZWRUZXh0IFJFQUQgc2VsZWN0ZWRUZXh0ICkKICAgIFFfUFJPUEVSVFkoIGludCB1bmRvRGVwdGggUkVBRCB1bmRvRGVwdGggV1JJVEUgc2V0VW5kb0RlcHRoICkKICAgIFFfUFJPUEVSVFkoIGJvb2wgb3ZlcndyaXRlTW9kZSBSRUFEIGlzT3ZlcndyaXRlTW9kZSBXUklURSBzZXRPdmVyd3JpdGVNb2RlICkKICAgIFFfUFJPUEVSVFkoIGJvb2wgbW9kaWZpZWQgUkVBRCBpc01vZGlmaWVkIFdSSVRFIHNldE1vZGlmaWVkIERFU0lHTkFCTEUgZmFsc2UgKQogICAgUV9QUk9QRVJUWSggYm9vbCByZWFkT25seSBSRUFEIGlzUmVhZE9ubHkgV1JJVEUgc2V0UmVhZE9ubHkgKQogICAgUV9QUk9QRVJUWSggYm9vbCB1bmRvUmVkb0VuYWJsZWQgUkVBRCBpc1VuZG9SZWRvRW5hYmxlZCBXUklURSBzZXRVbmRvUmVkb0VuYWJsZWQgKQogICAgUV9QUk9QRVJUWSggaW50IHRhYlN0b3BXaWR0aCBSRUFEIHRhYlN0b3BXaWR0aCBXUklURSBzZXRUYWJTdG9wV2lkdGggKQogICAgUV9QUk9QRVJUWSggYm9vbCB0YWJDaGFuZ2VzRm9jdXMgUkVBRCB0YWJDaGFuZ2VzRm9jdXMgV1JJVEUgc2V0VGFiQ2hhbmdlc0ZvY3VzICkKICAgIFFfUFJPUEVSVFkoIEF1dG9Gb3JtYXR0aW5nIGF1dG9Gb3JtYXR0aW5nIFJFQUQgYXV0b0Zvcm1hdHRpbmcgV1JJVEUgc2V0QXV0b0Zvcm1hdHRpbmcgKQoKcHVibGljOgogICAgZW51bSBXb3JkV3JhcCB7CglOb1dyYXAsCglXaWRnZXRXaWR0aCwKCUZpeGVkUGl4ZWxXaWR0aCwKCUZpeGVkQ29sdW1uV2lkdGgKICAgIH07CgogICAgZW51bSBXcmFwUG9saWN5IHsKCUF0V29yZEJvdW5kYXJ5LAoJQXRXaGl0ZVNwYWNlID0gQXRXb3JkQm91bmRhcnksIC8vIEF0V2hpdGVTcGFjZSBpcyBkZXByZWNhdGVkCglBbnl3aGVyZSwKCUF0V29yZE9yRG9jdW1lbnRCb3VuZGFyeQogICAgfTsKCiAgICBlbnVtIEF1dG9Gb3JtYXR0aW5nIHsKCUF1dG9Ob25lID0gMCwKCUF1dG9CdWxsZXRMaXN0ID0gMHgwMDAwMDAwMSwKCUF1dG9BbGwgPSAweGZmZmZmZmZmCiAgICB9OwoKICAgIGVudW0gS2V5Ym9hcmRBY3Rpb24gewoJQWN0aW9uQmFja3NwYWNlLAoJQWN0aW9uRGVsZXRlLAoJQWN0aW9uUmV0dXJuLAoJQWN0aW9uS2lsbCwKCUFjdGlvbldvcmRCYWNrc3BhY2UsCglBY3Rpb25Xb3JkRGVsZXRlCiAgICB9OwoKICAgIGVudW0gQ3Vyc29yQWN0aW9uIHsKCU1vdmVCYWNrd2FyZCwKCU1vdmVGb3J3YXJkLAoJTW92ZVdvcmRCYWNrd2FyZCwKCU1vdmVXb3JkRm9yd2FyZCwKCU1vdmVVcCwKCU1vdmVEb3duLAoJTW92ZUxpbmVTdGFydCwKCU1vdmVMaW5lRW5kLAoJTW92ZUhvbWUsCglNb3ZlRW5kLAoJTW92ZVBnVXAsCglNb3ZlUGdEb3duCiAgICB9OwoKICAgIGVudW0gVmVydGljYWxBbGlnbm1lbnQgewoJQWxpZ25Ob3JtYWwsCglBbGlnblN1cGVyU2NyaXB0LAoJQWxpZ25TdWJTY3JpcHQKICAgIH07CgogICAgZW51bSBUZXh0SW5zZXJ0aW9uRmxhZ3MgewoJUmVkb0luZGVudGF0aW9uID0gMHgwMDAxLAoJQ2hlY2tOZXdMaW5lcyA9IDB4MDAwMiwKCVJlbW92ZVNlbGVjdGVkID0gMHgwMDA0CiAgICB9OwoKICAgIFFUZXh0RWRpdCggY29uc3QgUVN0cmluZyYgdGV4dCwgY29uc3QgUVN0cmluZyYgY29udGV4dCA9IFFTdHJpbmc6Om51bGwsCgkgICAgICAgUVdpZGdldCogcGFyZW50PTAsIGNvbnN0IGNoYXIqIG5hbWU9MCk7CiAgICBRVGV4dEVkaXQoIFFXaWRnZXQqIHBhcmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAgKTsKICAgIHZpcnR1YWwgflFUZXh0RWRpdCgpOwogICAgdm9pZCBzZXRQYWxldHRlKCBjb25zdCBRUGFsZXR0ZSAmICk7CgogICAgUVN0cmluZyB0ZXh0KCkgY29uc3Q7CiAgICBRU3RyaW5nIHRleHQoIGludCBwYXJhICkgY29uc3Q7CiAgICBUZXh0Rm9ybWF0IHRleHRGb3JtYXQoKSBjb25zdDsKICAgIFFTdHJpbmcgY29udGV4dCgpIGNvbnN0OwogICAgUVN0cmluZyBkb2N1bWVudFRpdGxlKCkgY29uc3Q7CgogICAgdm9pZCBnZXRTZWxlY3Rpb24oIGludCAqcGFyYUZyb20sIGludCAqaW5kZXhGcm9tLAoJCSAgICBpbnQgKnBhcmFUbywgaW50ICppbmRleFRvLCBpbnQgc2VsTnVtID0gMCApIGNvbnN0OwogICAgdmlydHVhbCBib29sIGZpbmQoIGNvbnN0IFFTdHJpbmcgJmV4cHIsIGJvb2wgY3MsIGJvb2wgd28sIGJvb2wgZm9yd2FyZCA9IFRSVUUsCgkJICAgICAgIGludCAqcGFyYSA9IDAsIGludCAqaW5kZXggPSAwICk7CgogICAgaW50IHBhcmFncmFwaHMoKSBjb25zdDsKICAgIGludCBsaW5lcygpIGNvbnN0OwogICAgaW50IGxpbmVzT2ZQYXJhZ3JhcGgoIGludCBwYXJhICkgY29uc3Q7CiAgICBpbnQgbGluZU9mQ2hhciggaW50IHBhcmEsIGludCBjaHIgKTsKICAgIGludCBsZW5ndGgoKSBjb25zdDsKICAgIFFSZWN0IHBhcmFncmFwaFJlY3QoIGludCBwYXJhICkgY29uc3Q7CiAgICBpbnQgcGFyYWdyYXBoQXQoIGNvbnN0IFFQb2ludCAmcG9zICkgY29uc3Q7CiAgICBpbnQgY2hhckF0KCBjb25zdCBRUG9pbnQgJnBvcywgaW50ICpwYXJhICkgY29uc3Q7CiAgICBpbnQgcGFyYWdyYXBoTGVuZ3RoKCBpbnQgcGFyYSApIGNvbnN0OwoKICAgIFFTdHlsZVNoZWV0KiBzdHlsZVNoZWV0KCkgY29uc3Q7CiNpZm5kZWYgUVRfTk9fTUlNRQogICAgUU1pbWVTb3VyY2VGYWN0b3J5KiBtaW1lU291cmNlRmFjdG9yeSgpIGNvbnN0OwojZW5kaWYKICAgIFFCcnVzaCBwYXBlcigpIGNvbnN0OwogICAgYm9vbCBsaW5rVW5kZXJsaW5lKCkgY29uc3Q7CgogICAgaW50IGhlaWdodEZvcldpZHRoKCBpbnQgdyApIGNvbnN0OwoKICAgIGJvb2wgaGFzU2VsZWN0ZWRUZXh0KCkgY29uc3Q7CiAgICBRU3RyaW5nIHNlbGVjdGVkVGV4dCgpIGNvbnN0OwogICAgYm9vbCBpc1VuZG9BdmFpbGFibGUoKSBjb25zdDsKICAgIGJvb2wgaXNSZWRvQXZhaWxhYmxlKCkgY29uc3Q7CgogICAgV29yZFdyYXAgd29yZFdyYXAoKSBjb25zdDsKICAgIGludCB3cmFwQ29sdW1uT3JXaWR0aCgpIGNvbnN0OwogICAgV3JhcFBvbGljeSB3cmFwUG9saWN5KCkgY29uc3Q7CgogICAgaW50IHRhYlN0b3BXaWR0aCgpIGNvbnN0OwoKICAgIFFTdHJpbmcgYW5jaG9yQXQoIGNvbnN0IFFQb2ludCYgcG9zICk7CiAgICBRU3RyaW5nIGFuY2hvckF0KCBjb25zdCBRUG9pbnQmIHBvcywgQW5jaG9yQXR0cmlidXRlIGEgKTsKCiAgICBRU2l6ZSBzaXplSGludCgpIGNvbnN0OwoKICAgIGJvb2wgaXNSZWFkT25seSgpIGNvbnN0IHsgcmV0dXJuIHJlYWRvbmx5OyB9CgogICAgdm9pZCBnZXRDdXJzb3JQb3NpdGlvbiggaW50ICpwYXJhZywgaW50ICppbmRleCApIGNvbnN0OwoKICAgIGJvb2wgaXNNb2RpZmllZCgpIGNvbnN0OwogICAgYm9vbCBpdGFsaWMoKSBjb25zdDsKICAgIGJvb2wgYm9sZCgpIGNvbnN0OwogICAgYm9vbCB1bmRlcmxpbmUoKSBjb25zdDsKICAgIFFTdHJpbmcgZmFtaWx5KCkgY29uc3Q7CiAgICBpbnQgcG9pbnRTaXplKCkgY29uc3Q7CiAgICBRQ29sb3IgY29sb3IoKSBjb25zdDsKICAgIFFGb250IGZvbnQoKSBjb25zdDsKICAgIFFGb250IGN1cnJlbnRGb250KCkgY29uc3Q7CiAgICBpbnQgYWxpZ25tZW50KCkgY29uc3Q7CiAgICBpbnQgdW5kb0RlcHRoKCkgY29uc3Q7CgogICAgLy8gZG8gbm90IHVzZSwgd2lsbCBnbyBhd2F5CiAgICB2aXJ0dWFsIGJvb2wgZ2V0Rm9ybWF0KCBpbnQgcGFyYSwgaW50IGluZGV4LCBRRm9udCAqZm9udCwgUUNvbG9yICpjb2xvciwgVmVydGljYWxBbGlnbm1lbnQgKnZlcnRpY2FsQWxpZ25tZW50ICk7CiAgICAvLyBkbyBub3QgdXNlLCB3aWxsIGdvIGF3YXkKICAgIHZpcnR1YWwgYm9vbCBnZXRQYXJhZ3JhcGhGb3JtYXQoIGludCBwYXJhLCBRRm9udCAqZm9udCwgUUNvbG9yICpjb2xvciwKCQkJCSAgICAgVmVydGljYWxBbGlnbm1lbnQgKnZlcnRpY2FsQWxpZ25tZW50LCBpbnQgKmFsaWdubWVudCwKCQkJCSAgICAgUVN0eWxlU2hlZXRJdGVtOjpEaXNwbGF5TW9kZSAqZGlzcGxheU1vZGUsCgkJCQkgICAgIFFTdHlsZVNoZWV0SXRlbTo6TGlzdFN0eWxlICpsaXN0U3R5bGUsCgkJCQkgICAgIGludCAqbGlzdERlcHRoICk7CgoKICAgIGJvb2wgaXNPdmVyd3JpdGVNb2RlKCkgY29uc3QgeyByZXR1cm4gb3ZlcldyaXRlOyB9CiAgICBRQ29sb3IgcGFyYWdyYXBoQmFja2dyb3VuZENvbG9yKCBpbnQgcGFyYSApIGNvbnN0OwoKICAgIGJvb2wgaXNVbmRvUmVkb0VuYWJsZWQoKSBjb25zdDsKICAgIGJvb2wgZXZlbnRGaWx0ZXIoIFFPYmplY3QgKm8sIFFFdmVudCAqZSApOwogICAgYm9vbCB0YWJDaGFuZ2VzRm9jdXMoKSBjb25zdDsKCiAgICB2b2lkIHNldEF1dG9Gb3JtYXR0aW5nKCB1aW50IGZlYXR1cmVzICk7CiAgICB1aW50IGF1dG9Gb3JtYXR0aW5nKCkgY29uc3Q7CiAgICBRU3ludGF4SGlnaGxpZ2h0ZXIgKnN5bnRheEhpZ2hsaWdodGVyKCkgY29uc3Q7CgpwdWJsaWMgc2xvdHM6CiAgICB2b2lkIHNldEVuYWJsZWQoIGJvb2wgKTsKI2lmbmRlZiBRVF9OT19NSU1FCiAgICB2aXJ0dWFsIHZvaWQgc2V0TWltZVNvdXJjZUZhY3RvcnkoIFFNaW1lU291cmNlRmFjdG9yeSogZmFjdG9yeSApOwojZW5kaWYKICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZVNoZWV0KCBRU3R5bGVTaGVldCogc3R5bGVTaGVldCApOwogICAgdmlydHVhbCB2b2lkIHNjcm9sbFRvQW5jaG9yKCBjb25zdCBRU3RyaW5nJiBuYW1lICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0UGFwZXIoIGNvbnN0IFFCcnVzaCYgcGFwICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0TGlua1VuZGVybGluZSggYm9vbCApOwoKICAgIHZpcnR1YWwgdm9pZCBzZXRXb3JkV3JhcCggV29yZFdyYXAgbW9kZSApOwogICAgdmlydHVhbCB2b2lkIHNldFdyYXBDb2x1bW5PcldpZHRoKCBpbnQgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRXcmFwUG9saWN5KCBXcmFwUG9saWN5IHBvbGljeSApOwoKICAgIHZpcnR1YWwgdm9pZCBjb3B5KCk7CiAgICB2aXJ0dWFsIHZvaWQgYXBwZW5kKCBjb25zdCBRU3RyaW5nJiB0ZXh0ICk7CgogICAgdm9pZCBzZXRUZXh0KCBjb25zdCBRU3RyaW5nICZ0eHQgKSB7IHNldFRleHQoIHR4dCwgUVN0cmluZzo6bnVsbCApOyB9CiAgICB2aXJ0dWFsIHZvaWQgc2V0VGV4dCggY29uc3QgUVN0cmluZyAmdHh0LCBjb25zdCBRU3RyaW5nICZjb250ZXh0ICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0VGV4dEZvcm1hdCggVGV4dEZvcm1hdCBmICk7CgogICAgdmlydHVhbCB2b2lkIHNlbGVjdEFsbCggYm9vbCBzZWxlY3QgPSBUUlVFICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0VGFiU3RvcFdpZHRoKCBpbnQgdHMgKTsKICAgIHZpcnR1YWwgdm9pZCB6b29tSW4oIGludCByYW5nZSApOwogICAgdmlydHVhbCB2b2lkIHpvb21JbigpIHsgem9vbUluKCAxICk7IH0KICAgIHZpcnR1YWwgdm9pZCB6b29tT3V0KCBpbnQgcmFuZ2UgKTsKICAgIHZpcnR1YWwgdm9pZCB6b29tT3V0KCkgeyB6b29tT3V0KCAxICk7IH0KICAgIHZpcnR1YWwgdm9pZCB6b29tVG8oIGludCBzaXplICk7CgogICAgdmlydHVhbCB2b2lkIHN5bmMoKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRSZWFkT25seSggYm9vbCBiICk7CgogICAgdmlydHVhbCB2b2lkIHVuZG8oKTsKICAgIHZpcnR1YWwgdm9pZCByZWRvKCk7CiAgICB2aXJ0dWFsIHZvaWQgY3V0KCk7CiAgICB2aXJ0dWFsIHZvaWQgcGFzdGUoKTsKI2lmbmRlZiBRVF9OT19DTElQQk9BUkQKICAgIHZpcnR1YWwgdm9pZCBwYXN0ZVN1YlR5cGUoIGNvbnN0IFFDU3RyaW5nICZzdWJ0eXBlICk7CiNlbmRpZgogICAgdmlydHVhbCB2b2lkIGNsZWFyKCk7CiAgICB2aXJ0dWFsIHZvaWQgZGVsKCk7CiAgICB2aXJ0dWFsIHZvaWQgaW5kZW50KCk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0SXRhbGljKCBib29sIGIgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRCb2xkKCBib29sIGIgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRVbmRlcmxpbmUoIGJvb2wgYiApOwogICAgdmlydHVhbCB2b2lkIHNldEZhbWlseSggY29uc3QgUVN0cmluZyAmZiApOwogICAgdmlydHVhbCB2b2lkIHNldFBvaW50U2l6ZSggaW50IHMgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRDb2xvciggY29uc3QgUUNvbG9yICZjICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9udCggY29uc3QgUUZvbnQgJmYgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRWZXJ0aWNhbEFsaWdubWVudCggVmVydGljYWxBbGlnbm1lbnQgYSApOwogICAgdmlydHVhbCB2b2lkIHNldEFsaWdubWVudCggaW50IGEgKTsKCiAgICAvLyBkbyBub3QgdXNlLCB3aWxsIGdvIGF3YXkKICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhZ1R5cGUoIFFTdHlsZVNoZWV0SXRlbTo6RGlzcGxheU1vZGUgZG0sIFFTdHlsZVNoZWV0SXRlbTo6TGlzdFN0eWxlIGxpc3RTdHlsZSApOwoKICAgIHZpcnR1YWwgdm9pZCBzZXRDdXJzb3JQb3NpdGlvbiggaW50IHBhcmFnLCBpbnQgaW5kZXggKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRTZWxlY3Rpb24oIGludCBwYXJhZ19mcm9tLCBpbnQgaW5kZXhfZnJvbSwgaW50IHBhcmFnX3RvLCBpbnQgaW5kZXhfdG8sIGludCBzZWxOdW0gPSAwICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0U2VsZWN0aW9uQXR0cmlidXRlcyggaW50IHNlbE51bSwgY29uc3QgUUNvbG9yICZiYWNrLCBib29sIGludmVydFRleHQgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRNb2RpZmllZCggYm9vbCBtICk7CiAgICB2aXJ0dWFsIHZvaWQgcmVzZXRGb3JtYXQoKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRVbmRvRGVwdGgoIGludCBkICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9ybWF0KCBRVGV4dEZvcm1hdCAqZiwgaW50IGZsYWdzICk7CiAgICB2aXJ0dWFsIHZvaWQgZW5zdXJlQ3Vyc29yVmlzaWJsZSgpOwogICAgdmlydHVhbCB2b2lkIHBsYWNlQ3Vyc29yKCBjb25zdCBRUG9pbnQgJnBvcywgUVRleHRDdXJzb3IgKmMgPSAwICk7CiAgICB2aXJ0dWFsIHZvaWQgbW92ZUN1cnNvciggQ3Vyc29yQWN0aW9uIGFjdGlvbiwgYm9vbCBzZWxlY3QgKTsKICAgIHZpcnR1YWwgdm9pZCBkb0tleWJvYXJkQWN0aW9uKCBLZXlib2FyZEFjdGlvbiBhY3Rpb24gKTsKICAgIHZpcnR1YWwgdm9pZCByZW1vdmVTZWxlY3RlZFRleHQoIGludCBzZWxOdW0gPSAwICk7CiAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlU2VsZWN0aW9uKCBpbnQgc2VsTnVtID0gMCApOwogICAgdmlydHVhbCB2b2lkIHNldEN1cnJlbnRGb250KCBjb25zdCBRRm9udCAmZiApOwogICAgdmlydHVhbCB2b2lkIHNldE92ZXJ3cml0ZU1vZGUoIGJvb2wgYiApIHsgb3ZlcldyaXRlID0gYjsgfQoKICAgIHZpcnR1YWwgdm9pZCBzY3JvbGxUb0JvdHRvbSgpOwoKICAgIHZvaWQgaW5zZXJ0KCBjb25zdCBRU3RyaW5nICZ0ZXh0LCB1aW50IGluc2VydGlvbkZsYWdzID0gQ2hlY2tOZXdMaW5lcyB8IFJlbW92ZVNlbGVjdGVkICk7IC8vICMjIHZpcnR1YWwgaW4gNC4wCgogICAgLy8gb2Jzb2xldGUKICAgIHZpcnR1YWwgdm9pZCBpbnNlcnQoIGNvbnN0IFFTdHJpbmcgJnRleHQsIGJvb2wsIGJvb2wgPSBUUlVFLCBib29sID0gVFJVRSApOwoKICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRBdCggY29uc3QgUVN0cmluZyAmdGV4dCwgaW50IHBhcmEsIGludCBpbmRleCApOwogICAgdmlydHVhbCB2b2lkIHJlbW92ZVBhcmFncmFwaCggaW50IHBhcmEgKTsKICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRQYXJhZ3JhcGgoIGNvbnN0IFFTdHJpbmcgJnRleHQsIGludCBwYXJhICk7CgogICAgdmlydHVhbCB2b2lkIHNldFBhcmFncmFwaEJhY2tncm91bmRDb2xvciggaW50IHBhcmEsIGNvbnN0IFFDb2xvciAmYmcgKTsKICAgIHZpcnR1YWwgdm9pZCBjbGVhclBhcmFncmFwaEJhY2tncm91bmQoIGludCBwYXJhICk7CgogICAgdmlydHVhbCB2b2lkIHNldFVuZG9SZWRvRW5hYmxlZCggYm9vbCBiICk7CiAgICB2b2lkIHNldFRhYkNoYW5nZXNGb2N1cyggYm9vbCBiICk7IC8vICMjIyBtYWtlIHZpcnR1YWwgaW4gNC4wCgojaWZkZWYgUVRfVEVYVEVESVRfT1BUSU1JWkFUSU9OCiAgICB2b2lkIHBvbGlzaCgpOwogICAgdm9pZCBzZXRNYXhMb2dMaW5lcyggaW50IG51bUxpbmVzICk7CiAgICBpbnQgbWF4TG9nTGluZXMoKTsKI2VuZGlmCgpzaWduYWxzOgogICAgdm9pZCB0ZXh0Q2hhbmdlZCgpOwogICAgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKCk7CiAgICB2b2lkIGNvcHlBdmFpbGFibGUoIGJvb2wgKTsKICAgIHZvaWQgdW5kb0F2YWlsYWJsZSggYm9vbCB5ZXMgKTsKICAgIHZvaWQgcmVkb0F2YWlsYWJsZSggYm9vbCB5ZXMgKTsKICAgIHZvaWQgY3VycmVudEZvbnRDaGFuZ2VkKCBjb25zdCBRRm9udCAmZiApOwogICAgdm9pZCBjdXJyZW50Q29sb3JDaGFuZ2VkKCBjb25zdCBRQ29sb3IgJmMgKTsKICAgIHZvaWQgY3VycmVudEFsaWdubWVudENoYW5nZWQoIGludCBhICk7CiAgICB2b2lkIGN1cnJlbnRWZXJ0aWNhbEFsaWdubWVudENoYW5nZWQoIFZlcnRpY2FsQWxpZ25tZW50IGEgKTsKICAgIHZvaWQgY3Vyc29yUG9zaXRpb25DaGFuZ2VkKCBRVGV4dEN1cnNvciAqYyApOwogICAgdm9pZCBjdXJzb3JQb3NpdGlvbkNoYW5nZWQoIGludCBwYXJhLCBpbnQgcG9zICk7CiAgICB2b2lkIHJldHVyblByZXNzZWQoKTsKICAgIHZvaWQgbW9kaWZpY2F0aW9uQ2hhbmdlZCggYm9vbCBtICk7CiAgICB2b2lkIGNsaWNrZWQoIGludCBwYXJhZywgaW50IGluZGV4ICk7CiAgICB2b2lkIGRvdWJsZUNsaWNrZWQoIGludCBwYXJhZywgaW50IGluZGV4ICk7Cgpwcm90ZWN0ZWQ6CiAgICB2b2lkIHJlcGFpbnRDaGFuZ2VkKCk7CiAgICB2b2lkIHVwZGF0ZVN0eWxlcygpOwogICAgdm9pZCBkcmF3Q29udGVudHMoIFFQYWludGVyICpwLCBpbnQgY3gsIGludCBjeSwgaW50IGN3LCBpbnQgY2ggKTsKICAgIGJvb2wgZXZlbnQoIFFFdmVudCAqZSApOwogICAgdm9pZCBrZXlQcmVzc0V2ZW50KCBRS2V5RXZlbnQgKmUgKTsKICAgIHZvaWQgcmVzaXplRXZlbnQoIFFSZXNpemVFdmVudCAqZSApOwogICAgdm9pZCB2aWV3cG9ydFJlc2l6ZUV2ZW50KCBRUmVzaXplRXZlbnQqICk7CiAgICB2b2lkIGNvbnRlbnRzTW91c2VQcmVzc0V2ZW50KCBRTW91c2VFdmVudCAqZSApOwogICAgdm9pZCBjb250ZW50c01vdXNlTW92ZUV2ZW50KCBRTW91c2VFdmVudCAqZSApOwogICAgdm9pZCBjb250ZW50c01vdXNlUmVsZWFzZUV2ZW50KCBRTW91c2VFdmVudCAqZSApOwogICAgdm9pZCBjb250ZW50c01vdXNlRG91YmxlQ2xpY2tFdmVudCggUU1vdXNlRXZlbnQgKmUgKTsKI2lmbmRlZiBRVF9OT19XSEVFTEVWRU5UCiAgICB2b2lkIGNvbnRlbnRzV2hlZWxFdmVudCggUVdoZWVsRXZlbnQgKmUgKTsKI2VuZGlmCiAgICB2b2lkIGltU3RhcnRFdmVudCggUUlNRXZlbnQgKiApOwogICAgdm9pZCBpbUNvbXBvc2VFdmVudCggUUlNRXZlbnQgKiApOwogICAgdm9pZCBpbUVuZEV2ZW50KCBRSU1FdmVudCAqICk7CiNpZm5kZWYgUVRfTk9fRFJBR0FORERST1AKICAgIHZvaWQgY29udGVudHNEcmFnRW50ZXJFdmVudCggUURyYWdFbnRlckV2ZW50ICplICk7CiAgICB2b2lkIGNvbnRlbnRzRHJhZ01vdmVFdmVudCggUURyYWdNb3ZlRXZlbnQgKmUgKTsKICAgIHZvaWQgY29udGVudHNEcmFnTGVhdmVFdmVudCggUURyYWdMZWF2ZUV2ZW50ICplICk7CiAgICB2b2lkIGNvbnRlbnRzRHJvcEV2ZW50KCBRRHJvcEV2ZW50ICplICk7CiNlbmRpZgogICAgdm9pZCBjb250ZW50c0NvbnRleHRNZW51RXZlbnQoIFFDb250ZXh0TWVudUV2ZW50ICplICk7CiAgICBib29sIGZvY3VzTmV4dFByZXZDaGlsZCggYm9vbCBuZXh0ICk7CiAgICBRVGV4dERvY3VtZW50ICpkb2N1bWVudCgpIGNvbnN0OwogICAgUVRleHRDdXJzb3IgKnRleHRDdXJzb3IoKSBjb25zdDsKICAgIHZvaWQgc2V0RG9jdW1lbnQoIFFUZXh0RG9jdW1lbnQgKmRvYyApOwogICAgdmlydHVhbCBRUG9wdXBNZW51ICpjcmVhdGVQb3B1cE1lbnUoIGNvbnN0IFFQb2ludCYgcG9zICk7CiAgICB2aXJ0dWFsIFFQb3B1cE1lbnUgKmNyZWF0ZVBvcHVwTWVudSgpOwogICAgdm9pZCBkcmF3Q3Vyc29yKCBib29sIHZpc2libGUgKTsKCiAgICB2b2lkIHdpbmRvd0FjdGl2YXRpb25DaGFuZ2UoIGJvb2wgKTsKCnByb3RlY3RlZCBzbG90czoKICAgIHZpcnR1YWwgdm9pZCBkb0NoYW5nZUludGVydmFsKCk7CiAgICB2b2lkIHNsaWRlclJlbGVhc2VkKCk7IC8vICMjIyBtYWtlIHZpcnR1YWwgaW4gNC4wCiNpZiAoUVRfVkVSU0lPTiA+PSAweDA0MDAwMCkKI2Vycm9yICJTb21lIGZ1bmN0aW9ucyBuZWVkIHRvIGJlIGNoYW5nZWQgdG8gdmlydHVhbCBmb3IgUXQgNC4wIgojZW5kaWYKCnByaXZhdGUgc2xvdHM6CiAgICB2b2lkIGZvcm1hdE1vcmUoKTsKICAgIHZvaWQgZG9SZXNpemUoKTsKICAgIHZvaWQgYXV0b1Njcm9sbFRpbWVyRG9uZSgpOwogICAgdm9pZCBibGlua0N1cnNvcigpOwogICAgdm9pZCBzZXRNb2RpZmllZCgpOwogICAgdm9pZCBzdGFydERyYWcoKTsKICAgIHZvaWQgZG9jdW1lbnRXaWR0aENoYW5nZWQoIGludCB3ICk7CiAgICB2b2lkIGNsaXBib2FyZENoYW5nZWQoKTsKCnByaXZhdGU6CiAgICBzdHJ1Y3QgUV9FWFBPUlQgVW5kb1JlZG9JbmZvIHsKCWVudW0gVHlwZSB7IEludmFsaWQsIEluc2VydCwgRGVsZXRlLCBCYWNrc3BhY2UsIFJldHVybiwgUmVtb3ZlU2VsZWN0ZWQsIEZvcm1hdCwgU3R5bGUgfTsKCglVbmRvUmVkb0luZm8oIFFUZXh0RG9jdW1lbnQgKmRjICk7Cgl+VW5kb1JlZG9JbmZvKCk7Cgl2b2lkIGNsZWFyKCk7Cglib29sIHZhbGlkKCkgY29uc3Q7CgoJUVVuZG9SZWRvSW5mb1ByaXZhdGUgKmQ7CglpbnQgaWQ7CglpbnQgaW5kZXg7CglpbnQgZWlkOwoJaW50IGVpbmRleDsKCVFUZXh0Rm9ybWF0ICpmb3JtYXQ7CglpbnQgZmxhZ3M7CglUeXBlIHR5cGU7CglRVGV4dERvY3VtZW50ICpkb2M7CglRQnl0ZUFycmF5IHN0eWxlSW5mb3JtYXRpb247CiAgICB9OwoKcHJpdmF0ZToKICAgIHZvaWQgdXBkYXRlQ3Vyc29yKCBjb25zdCBRUG9pbnQgJiBwb3MgKTsKICAgIHZvaWQgaGFuZGxlTW91c2VNb3ZlKCBjb25zdCBRUG9pbnQmIHBvcyApOwogICAgdm9pZCBkcmF3Q29udGVudHMoIFFQYWludGVyICogKTsKICAgIHZpcnR1YWwgYm9vbCBsaW5rc0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBGQUxTRTsgfQogICAgdm9pZCBpbml0KCk7CiAgICB2b2lkIGNoZWNrVW5kb1JlZG9JbmZvKCBVbmRvUmVkb0luZm86OlR5cGUgdCApOwogICAgdm9pZCB1cGRhdGVDdXJyZW50Rm9ybWF0KCk7CiAgICBib29sIGhhbmRsZVJlYWRPbmx5S2V5RXZlbnQoIFFLZXlFdmVudCAqZSApOwogICAgdm9pZCBtYWtlUGFyYWdWaXNpYmxlKCBRVGV4dFBhcmFncmFwaCAqcCApOwogICAgdm9pZCBub3JtYWxDb3B5KCk7CiAgICB2b2lkIGNvcHlUb0NsaXBib2FyZCgpOwojaWZuZGVmIFFUX05PX01JTUUKICAgIFFDU3RyaW5nIHBpY2tTcGVjaWFsKFFNaW1lU291cmNlKiBtcywgYm9vbCBhbHdheXNfYXNrLCBjb25zdCBRUG9pbnQmKTsKICAgIFFUZXh0RHJhZyAqZHJhZ09iamVjdCggUVdpZGdldCAqcGFyZW50ID0gMCApIGNvbnN0OwojZW5kaWYKI2lmbmRlZiBRVF9OT19NSU1FQ0xJUEJPQVJECiAgICB2b2lkIHBhc3RlU3BlY2lhbChjb25zdCBRUG9pbnQmKTsKI2VuZGlmCiAgICB2b2lkIHNldEZvbnRJbnRlcm5hbCggY29uc3QgUUZvbnQgJmYgKTsKCiAgICB2aXJ0dWFsIHZvaWQgZW1pdEhpZ2hsaWdodGVkKCBjb25zdCBRU3RyaW5nICYgKSB7fQogICAgdmlydHVhbCB2b2lkIGVtaXRMaW5rQ2xpY2tlZCggY29uc3QgUVN0cmluZyAmICkge30KCiAgICB2b2lkIHJlYWRGb3JtYXRzKCBRVGV4dEN1cnNvciAmYzEsIFFUZXh0Q3Vyc29yICZjMiwgUVRleHRTdHJpbmcgJnRleHQsIGJvb2wgZmlsbFN0eWxlcyA9IEZBTFNFICk7CiAgICB2b2lkIGNsZWFyVW5kb1JlZG8oKTsKICAgIHZvaWQgcGFpbnREb2N1bWVudCggYm9vbCBkcmF3QWxsLCBRUGFpbnRlciAqcCwgaW50IGN4ID0gLTEsIGludCBjeSA9IC0xLCBpbnQgY3cgPSAtMSwgaW50IGNoID0gLTEgKTsKICAgIHZvaWQgbW92ZUN1cnNvciggQ3Vyc29yQWN0aW9uIGFjdGlvbiApOwogICAgdm9pZCBlbnN1cmVGb3JtYXR0ZWQoIFFUZXh0UGFyYWdyYXBoICpwICk7CiAgICB2b2lkIHBsYWNlQ3Vyc29yKCBjb25zdCBRUG9pbnQgJnBvcywgUVRleHRDdXJzb3IgKmMsIGJvb2wgbGluayApOwogICAgdm9pZCB1cGRhdGVNaWNyb0ZvY3VzSGludCgpOwoKI2lmZGVmIFFUX1RFWFRFRElUX09QVElNSVpBVElPTgogICAgYm9vbCBjaGVja09wdGltTW9kZSgpOwogICAgUVN0cmluZyBvcHRpbVRleHQoKSBjb25zdDsKICAgIHZvaWQgb3B0aW1TZXRUZXh0KCBjb25zdCBRU3RyaW5nICZzdHIgKTsKICAgIHZvaWQgb3B0aW1BcHBlbmQoIGNvbnN0IFFTdHJpbmcgJnN0ciApOwogICAgdm9pZCBvcHRpbUluc2VydCggY29uc3QgUVN0cmluZyAmc3RyLCBpbnQgbGluZSwgaW50IGluZGV4ICk7CiAgICB2b2lkIG9wdGltRHJhd0NvbnRlbnRzKCBRUGFpbnRlciAqIHAsIGludCBjeCwgaW50IGN5LCBpbnQgY3csIGludCBjaCApOwogICAgdm9pZCBvcHRpbU1vdXNlUHJlc3NFdmVudCggUU1vdXNlRXZlbnQgKiBlICk7CiAgICB2b2lkIG9wdGltTW91c2VSZWxlYXNlRXZlbnQoIFFNb3VzZUV2ZW50ICogZSApOwogICAgdm9pZCBvcHRpbU1vdXNlTW92ZUV2ZW50KCBRTW91c2VFdmVudCAqIGUgKTsKICAgIGludCAgb3B0aW1DaGFySW5kZXgoIGNvbnN0IFFTdHJpbmcgJnN0ciwgaW50IG14ICkgY29uc3Q7CiAgICB2b2lkIG9wdGltU2VsZWN0QWxsKCk7CiAgICB2b2lkIG9wdGltUmVtb3ZlU2VsZWN0aW9uKCk7CiAgICB2b2lkIG9wdGltU2V0U2VsZWN0aW9uKCBpbnQgc3RhcnRMaW5lLCBpbnQgc3RhcnRJZHgsIGludCBlbmRMaW5lLAoJCQkgICAgaW50IGVuZElkeCApOwogICAgYm9vbCBvcHRpbUhhc1NlbGVjdGlvbigpIGNvbnN0OwogICAgUVN0cmluZyBvcHRpbVNlbGVjdGVkVGV4dCgpIGNvbnN0OwogICAgYm9vbCBvcHRpbUZpbmQoIGNvbnN0IFFTdHJpbmcgJiBzdHIsIGJvb2wsIGJvb2wsIGJvb2wsIGludCAqLCBpbnQgKiApOwogICAgdm9pZCBvcHRpbVBhcnNlVGFncyggUVN0cmluZyAqIHN0ciwgaW50IGxpbmVObyA9IC0xLCBpbnQgaW5kZXhPZmZzZXQgPSAwICk7CiAgICBRVGV4dEVkaXRPcHRpbVByaXZhdGU6OlRhZyAqIG9wdGltUHJldmlvdXNMZWZ0VGFnKCBpbnQgbGluZSApOwogICAgdm9pZCBvcHRpbVNldFRleHRGb3JtYXQoIFFUZXh0RG9jdW1lbnQgKiwgUVRleHRDdXJzb3IgKiwgUVRleHRGb3JtYXQgKiBmLAoJCQkgICAgIGludCwgaW50LCBRVGV4dEVkaXRPcHRpbVByaXZhdGU6OlRhZyAqIHQgKTsKICAgIFFUZXh0RWRpdE9wdGltUHJpdmF0ZTo6VGFnICogb3B0aW1BcHBlbmRUYWcoIGludCBpbmRleCwgY29uc3QgUVN0cmluZyAmIHRhZyApOwogICAgUVRleHRFZGl0T3B0aW1Qcml2YXRlOjpUYWcgKiBvcHRpbUluc2VydFRhZyggaW50IGxpbmUsIGludCBpbmRleCwgY29uc3QgUVN0cmluZyAmIHRhZyApOwogICAgdm9pZCBvcHRpbUNoZWNrTGltaXQoIGNvbnN0IFFTdHJpbmcmIHN0ciApOwogICAgYm9vbCBvcHRpbUhhc0JvbGRNZXRyaWNzKCBpbnQgbGluZSApOwoKcHJpdmF0ZSBzbG90czoKICAgIHZvaWQgb3B0aW1Eb0F1dG9TY3JvbGwoKTsKI2VuZGlmIC8vIFFUX1RFWFRFRElUX09QVElNSVpBVElPTgoKcHJpdmF0ZToKI2lmbmRlZiBRVF9OT19DTElQQk9BUkQKICAgIHZvaWQgcGFzdGVTdWJUeXBlKCBjb25zdCBRQ1N0cmluZyAmc3VidHlwZSwgUU1pbWVTb3VyY2UgKm0gKTsKI2VuZGlmCgpwcml2YXRlOgogICAgUVRleHREb2N1bWVudCAqZG9jOwogICAgUVRleHRDdXJzb3IgKmN1cnNvcjsKICAgIFFUaW1lciAqZm9ybWF0VGltZXIsICpzY3JvbGxUaW1lciwgKmNoYW5nZUludGVydmFsVGltZXIsICpibGlua1RpbWVyLCAqZHJhZ1N0YXJ0VGltZXI7CiAgICBRVGV4dFBhcmFncmFwaCAqbGFzdEZvcm1hdHRlZDsKICAgIGludCBpbnRlcnZhbDsKICAgIFVuZG9SZWRvSW5mbyB1bmRvUmVkb0luZm87CiAgICBRVGV4dEZvcm1hdCAqY3VycmVudEZvcm1hdDsKICAgIGludCBjdXJyZW50QWxpZ25tZW50OwogICAgUVBvaW50IG9sZE1vdXNlUG9zLCBtb3VzZVBvczsKICAgIFFQb2ludCBkcmFnU3RhcnRQb3M7CiAgICBRU3RyaW5nIG9uTGluazsKICAgIFdvcmRXcmFwIHdyYXBNb2RlOwogICAgV3JhcFBvbGljeSB3UG9saWN5OwogICAgaW50IHdyYXBXaWR0aDsKICAgIFFTdHJpbmcgcHJlc3NlZExpbms7CiAgICBRVGV4dEVkaXRQcml2YXRlICpkOwogICAgYm9vbCBpbkRvdWJsZUNsaWNrIDogMTsKICAgIGJvb2wgbW91c2VQcmVzc2VkIDogMTsKICAgIGJvb2wgY3Vyc29yVmlzaWJsZSA6IDE7CiAgICBib29sIGJsaW5rQ3Vyc29yVmlzaWJsZSA6IDE7CiAgICBib29sIHJlYWRPbmx5IDogMTsKICAgIGJvb2wgbW9kaWZpZWQgOiAxOwogICAgYm9vbCBtaWdodFN0YXJ0RHJhZyA6IDE7CiAgICBib29sIGluRG5EIDogMTsKICAgIGJvb2wgcmVhZG9ubHkgOiAxOwogICAgYm9vbCB1bmRvRW5hYmxlZCA6IDE7CiAgICBib29sIG92ZXJXcml0ZSA6IDE7Cgpwcml2YXRlOgkvLyBEaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KI2lmIGRlZmluZWQoUV9ESVNBQkxFX0NPUFkpCiAgICBRVGV4dEVkaXQoIGNvbnN0IFFUZXh0RWRpdCAmICk7CiAgICBRVGV4dEVkaXQgJm9wZXJhdG9yPSggY29uc3QgUVRleHRFZGl0ICYgKTsKI2VuZGlmCn07CgppbmxpbmUgUVRleHREb2N1bWVudCAqUVRleHRFZGl0Ojpkb2N1bWVudCgpIGNvbnN0CnsKICAgIHJldHVybiBkb2M7Cn0KCmlubGluZSBRVGV4dEN1cnNvciAqUVRleHRFZGl0Ojp0ZXh0Q3Vyc29yKCkgY29uc3QKewogICAgcmV0dXJuIGN1cnNvcjsKfQoKaW5saW5lIHZvaWQgUVRleHRFZGl0OjpzZXRDdXJyZW50Rm9udCggY29uc3QgUUZvbnQgJmYgKQp7CiAgICBRVGV4dEVkaXQ6OnNldEZvbnRJbnRlcm5hbCggZiApOwp9CgojZW5kaWYgLy9RVF9OT19URVhURURJVAojZW5kaWYgLy9RVEVYVFZJRVdfSAoAAAAiAHEAdwBpAG4AZABvAHcAcwB4AHAAcwB0AHkAbABlAC4AaAAADlQvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVdJTkRPV1NYUFNUWUxFX0gKI2RlZmluZSBRV0lORE9XU1hQU1RZTEVfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxd2luZG93c3N0eWxlLmgiCiNlbmRpZiAvLyBRVF9ICgojaWYgIWRlZmluZWQoUVRfTk9fU1RZTEVfV0lORE9XU1hQKSB8fCBkZWZpbmVkKFFUX1BMVUdJTikKCiNpZiBkZWZpbmVkKFFUX1BMVUdJTikKI2RlZmluZSBRX0VYUE9SVF9TVFlMRV9XSU5ET1dTWFAKI2Vsc2UKI2RlZmluZSBRX0VYUE9SVF9TVFlMRV9XSU5ET1dTWFAgUV9FWFBPUlQKI2VuZGlmCgpjbGFzcyBRV2luZG93c1hQU3R5bGVQcml2YXRlOwoKY2xhc3MgUV9FWFBPUlRfU1RZTEVfV0lORE9XU1hQIFFXaW5kb3dzWFBTdHlsZSA6IHB1YmxpYyBRV2luZG93c1N0eWxlCnsKICAgIFFfT0JKRUNUCnB1YmxpYzoKICAgIFFXaW5kb3dzWFBTdHlsZSgpOwogICAgflFXaW5kb3dzWFBTdHlsZSgpOwoKICAgIHZvaWQgdW5Qb2xpc2goIFFBcHBsaWNhdGlvbiogKTsKICAgIHZvaWQgcG9saXNoKCBRQXBwbGljYXRpb24qICk7CiAgICB2b2lkIHBvbGlzaCggUVdpZGdldCogKTsKICAgIHZvaWQgdW5Qb2xpc2goIFFXaWRnZXQqICk7CgogICAgdm9pZCBkcmF3UHJpbWl0aXZlKCBQcmltaXRpdmVFbGVtZW50IG9wLAoJCQlRUGFpbnRlciAqcCwKCQkJY29uc3QgUVJlY3QgJnIsCgkJCWNvbnN0IFFDb2xvckdyb3VwICZjZywKCQkJU0ZsYWdzIGZsYWdzID0gU3R5bGVfRGVmYXVsdCwKCQkJY29uc3QgUVN0eWxlT3B0aW9uJiA9IFFTdHlsZU9wdGlvbjo6RGVmYXVsdCApIGNvbnN0OwoKICAgIHZvaWQgZHJhd0NvbnRyb2woIENvbnRyb2xFbGVtZW50IGVsZW1lbnQsCgkJICAgICAgUVBhaW50ZXIgKnAsCgkJICAgICAgY29uc3QgUVdpZGdldCAqd2lkZ2V0LAoJCSAgICAgIGNvbnN0IFFSZWN0ICZyLAoJCSAgICAgIGNvbnN0IFFDb2xvckdyb3VwICZjZywKCQkgICAgICBTRmxhZ3MgaG93ID0gU3R5bGVfRGVmYXVsdCwKCQkgICAgICBjb25zdCBRU3R5bGVPcHRpb24mID0gUVN0eWxlT3B0aW9uOjpEZWZhdWx0ICkgY29uc3Q7CgogICAgdm9pZCBkcmF3Q29udHJvbE1hc2soIENvbnRyb2xFbGVtZW50IGVsZW1lbnQsCgkJCSAgUVBhaW50ZXIgKnAsCgkJCSAgY29uc3QgUVdpZGdldCAqd2lkZ2V0LAoJCQkgIGNvbnN0IFFSZWN0ICZyLAoJCQkgIGNvbnN0IFFTdHlsZU9wdGlvbiYgPSBRU3R5bGVPcHRpb246OkRlZmF1bHQgKSBjb25zdDsKCiAgICB2b2lkIGRyYXdDb21wbGV4Q29udHJvbCggQ29tcGxleENvbnRyb2wgY29udHJvbCwKCQkJICAgICBRUGFpbnRlciogcCwKCQkJICAgICBjb25zdCBRV2lkZ2V0KiB3LAoJCQkgICAgIGNvbnN0IFFSZWN0JiByLAoJCQkgICAgIGNvbnN0IFFDb2xvckdyb3VwJiBjZywKCQkJICAgICBTRmxhZ3MgZmxhZ3MgPSBTdHlsZV9EZWZhdWx0LAoJCQkgICAgIFNDRmxhZ3Mgc3ViID0gU0NfQWxsLAoJCQkgICAgIFNDRmxhZ3Mgc3ViQWN0aXZlID0gU0NfTm9uZSwKCQkJICAgICBjb25zdCBRU3R5bGVPcHRpb24mID0gUVN0eWxlT3B0aW9uOjpEZWZhdWx0ICkgY29uc3Q7CgoKICAgIGludCBwaXhlbE1ldHJpYyggUGl4ZWxNZXRyaWMgbWV0aWMsCgkJICAgICBjb25zdCBRV2lkZ2V0ICp3aWRnZXQgPSAwICkgY29uc3Q7CgogICAgUVJlY3QgcXVlcnlTdWJDb250cm9sTWV0cmljcyggQ29tcGxleENvbnRyb2wgY29udHJvbCwKCQkJCSAgY29uc3QgUVdpZGdldCAqd2lkZ2V0LAoJCQkJICBTdWJDb250cm9sIHNjLAoJCQkJICBjb25zdCBRU3R5bGVPcHRpb24mID0gUVN0eWxlT3B0aW9uOjpEZWZhdWx0ICkgY29uc3Q7CgogICAgUVNpemUgc2l6ZUZyb21Db250ZW50cyggQ29udGVudHNUeXBlIGNvbnRlbnRzLAoJCQkJICAgIGNvbnN0IFFXaWRnZXQgKndpZGdldCwKCQkJCSAgICBjb25zdCBRU2l6ZSAmY29udGVudHNTaXplLAoJCQkJICAgIGNvbnN0IFFTdHlsZU9wdGlvbiYgPSBRU3R5bGVPcHRpb246OkRlZmF1bHQgKSBjb25zdDsKCiAgICBpbnQgc3R5bGVIaW50KCBTdHlsZUhpbnQgc3R5bGVoaW50LAoJCQkgICBjb25zdCBRV2lkZ2V0ICp3aWRnZXQgPSAwLAoJCQkgICBjb25zdCBRU3R5bGVPcHRpb24mID0gUVN0eWxlT3B0aW9uOjpEZWZhdWx0LAoJCQkgICBRU3R5bGVIaW50UmV0dXJuKiByZXR1cm5EYXRhID0gMAoJCQkgICApIGNvbnN0OwoKcHJvdGVjdGVkOgogICAgYm9vbCBldmVudEZpbHRlciggUU9iamVjdCAqbywgUUV2ZW50ICplICk7CgogICAgdm9pZCB1cGRhdGVSZWdpb24oIFFXaWRnZXQgKndpZGdldCApOwoKcHJvdGVjdGVkIHNsb3RzOgogICAgdm9pZCBhY3RpdmVUYWJDaGFuZ2VkKCk7Cgpwcml2YXRlOgogICAgUVdpbmRvd3NYUFN0eWxlUHJpdmF0ZSAqZDsKCiAgICBmcmllbmQgY2xhc3MgUVN0eWxlRmFjdG9yeTsKICAgIGZyaWVuZCBjbGFzcyBRV2luZG93c1hQU3R5bGVQcml2YXRlOwogICAgc3RhdGljIGJvb2wgcmVzb2x2ZVN5bWJvbHMoKTsKCiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUVdpbmRvd3NYUFN0eWxlKCBjb25zdCBRV2luZG93c1hQU3R5bGUgJiApOwogICAgUVdpbmRvd3NYUFN0eWxlJiBvcGVyYXRvcj0oIGNvbnN0IFFXaW5kb3dzWFBTdHlsZSAmICk7CiNlbmRpZgp9OwoKI2VuZGlmIC8vIFFUX05PX1NUWUxFX1dJTkRPV1NYUAoKI2VuZGlmIC8vIFFXSU5ET1dTWFBTVFlMRV9ICgAAABAAcQBzAHQAeQBsAGUALgBoAABKby8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2lmbmRlZiBRU1RZTEVfSAojZGVmaW5lIFFTVFlMRV9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFvYmplY3QuaCIKI2VuZGlmIC8vIFFUX0gKCgojaWZuZGVmIFFUX05PX1NUWUxFCgpjbGFzcyBRUG9wdXBNZW51OwpjbGFzcyBRU3R5bGVQcml2YXRlOwpjbGFzcyBRTWVudUl0ZW07CmNsYXNzIFFUYWI7CmNsYXNzIFFMaXN0Vmlld0l0ZW07CmNsYXNzIFFDaGVja0xpc3RJdGVtOwoKY2xhc3MgUVN0eWxlT3B0aW9uIHsKcHVibGljOgogICAgZW51bSBTdHlsZU9wdGlvbkRlZmF1bHQgeyBEZWZhdWx0IH07CgogICAgUVN0eWxlT3B0aW9uKFN0eWxlT3B0aW9uRGVmYXVsdD1EZWZhdWx0KSA6IGRlZihUUlVFKSB7fQoKICAgIC8vIE5vdGU6IHdlIGRvbid0IHVzZSBkZWZhdWx0IGFyZ3VtZW50cyBzaW5jZSB0aGF0IGlzIHVubmVjZXNzYXJ5CiAgICAvLyBpbml0aWFsaXphdGlvbi4KICAgIFFTdHlsZU9wdGlvbihpbnQgaW4xKSA6CglkZWYoRkFMU0UpLCBpMShpbjEpIHt9CiAgICBRU3R5bGVPcHRpb24oaW50IGluMSwgaW50IGluMikgOgoJZGVmKEZBTFNFKSwgaTEoaW4xKSwgaTIoaW4yKSB7fQogICAgUVN0eWxlT3B0aW9uKGludCBpbjEsIGludCBpbjIsIGludCBpbjMsIGludCBpbjQpIDoKCWRlZihGQUxTRSksIGkxKGluMSksIGkyKGluMiksIGkzKGluMyksIGk0KGluNCkge30KICAgIFFTdHlsZU9wdGlvbihRTWVudUl0ZW0qIG0pIDogZGVmKEZBTFNFKSwgbWkobSkge30KICAgIFFTdHlsZU9wdGlvbihRTWVudUl0ZW0qIG0sIGludCBpbjEpIDogZGVmKEZBTFNFKSwgbWkobSksIGkxKGluMSkge30KICAgIFFTdHlsZU9wdGlvbihRTWVudUl0ZW0qIG0sIGludCBpbjEsIGludCBpbjIpIDogZGVmKEZBTFNFKSwgbWkobSksIGkxKGluMSksIGkyKGluMikge30KICAgIFFTdHlsZU9wdGlvbihjb25zdCBRQ29sb3ImIGMpIDogZGVmKEZBTFNFKSwgY2woJmMpIHt9CiAgICBRU3R5bGVPcHRpb24oUVRhYiogdCkgOiBkZWYoRkFMU0UpLCB0Yih0KSB7fQogICAgUVN0eWxlT3B0aW9uKFFMaXN0Vmlld0l0ZW0qIGkpIDogZGVmKEZBTFNFKSwgbGkoaSkge30KICAgIFFTdHlsZU9wdGlvbihRQ2hlY2tMaXN0SXRlbSogaSkgOiBkZWYoRkFMU0UpLCBjbGkoaSkge30KICAgIFFTdHlsZU9wdGlvbihRdDo6QXJyb3dUeXBlIGEpIDogZGVmKEZBTFNFKSwgaTEoKGludClhKSB7fQogICAgUVN0eWxlT3B0aW9uKGNvbnN0IFFSZWN0JiByKSA6IGRlZihGQUxTRSksIGkxKHIueCgpKSwgaTIoci55KCkpLCBpMyhyLndpZHRoKCkpLGk0KHIuaGVpZ2h0KCkpe30KICAgIFFTdHlsZU9wdGlvbihRV2lkZ2V0ICp3KSA6IGRlZihGQUxTRSksIHAxKCh2b2lkKil3KSB7fQoKICAgIGJvb2wgaXNEZWZhdWx0KCkgY29uc3QgeyByZXR1cm4gZGVmOyB9CgogICAgaW50IGRheSgpIGNvbnN0IHsgcmV0dXJuIGkxOyB9CgogICAgaW50IGxpbmVXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIGkxOyB9CiAgICBpbnQgbWlkTGluZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gaTI7IH0KICAgIGludCBmcmFtZVNoYXBlKCkgY29uc3QgeyByZXR1cm4gaTM7IH0KICAgIGludCBmcmFtZVNoYWRvdygpIGNvbnN0IHsgcmV0dXJuIGk0OyB9CgogICAgaW50IGhlYWRlclNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBpMTsgfQogICAgUU1lbnVJdGVtKiBtZW51SXRlbSgpIGNvbnN0IHsgcmV0dXJuIG1pOyB9CiAgICBpbnQgbWF4SWNvbldpZHRoKCkgY29uc3QgeyByZXR1cm4gaTE7IH0KICAgIGludCB0YWJXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIGkyOyB9CgogICAgY29uc3QgUUNvbG9yJiBjb2xvcigpIGNvbnN0IHsgcmV0dXJuICpjbDsgfQoKICAgIFFUYWIqIHRhYigpIGNvbnN0IHsgcmV0dXJuIHRiOyB9CgogICAgUUNoZWNrTGlzdEl0ZW0qIGNoZWNrTGlzdEl0ZW0oKSBjb25zdCB7IHJldHVybiBjbGk7IH0KICAgIFFMaXN0Vmlld0l0ZW0qIGxpc3RWaWV3SXRlbSgpIGNvbnN0IHsgcmV0dXJuIGxpOyB9CgogICAgUXQ6OkFycm93VHlwZSBhcnJvd1R5cGUoKSBjb25zdCB7IHJldHVybiAoUXQ6OkFycm93VHlwZSlpMTsgfQogICAgUVJlY3QgcmVjdCgpIGNvbnN0IHsgcmV0dXJuIFFSZWN0KCBpMSwgaTIsIGkzLCBpNCApOyB9CiAgICBRV2lkZ2V0KiB3aWRnZXQoKSBjb25zdCB7IHJldHVybiAoUVdpZGdldCopcDE7IH0KCnByaXZhdGU6CiAgICAvLyBOT1RFOiBub25lIG9mIHRoZXNlIGNvbXBvbmVudHMgaGF2ZSBjb25zdHJ1Y3RvcnMuCiAgICBib29sIGRlZjsKICAgIGJvb2wgYjEsYjIsYjM7IC8vIHJlc2VydmVkCiAgICBRTWVudUl0ZW0qIG1pOwogICAgUVRhYiogdGI7CiAgICBRTGlzdFZpZXdJdGVtKiBsaTsKICAgIGNvbnN0IFFDb2xvciogY2w7CiAgICBpbnQgaTEsIGkyLCBpMywgaTQ7CiAgICBpbnQgaTUsIGk2OyAvLyByZXNlcnZlZAogICAgUUNoZWNrTGlzdEl0ZW0qIGNsaTsKICAgIHZvaWQgKnAxLCAqcDIsICpwMywgKnA0OyAvLyByZXNlcnZlZAogICAgLy8gKHBhZGRlZCB0byA2NCBieXRlcyBvbiBzb21lIGFyY2hpdGVjdHVyZXMpCn07CgpjbGFzcyBRU3R5bGVIaW50UmV0dXJuOyAvLyBub3QgZGVmaW5lZCB5ZXQKCmNsYXNzIFFfRVhQT1JUIFFTdHlsZTogcHVibGljIFFPYmplY3QKewogICAgUV9PQkpFQ1QKCnB1YmxpYzoKICAgIFFTdHlsZSgpOwogICAgdmlydHVhbCB+UVN0eWxlKCk7CgogICAgLy8gTmV3IFFTdHlsZSBBUEkgLSBtb3N0IG9mIHRoZXNlIHNob3VsZCBwcm9iYWJseSBiZSBwdXJlIHZpcnR1YWwKCiAgICB2aXJ0dWFsIHZvaWQgcG9saXNoKCBRV2lkZ2V0ICogKTsKICAgIHZpcnR1YWwgdm9pZCB1blBvbGlzaCggUVdpZGdldCAqICk7CgogICAgdmlydHVhbCB2b2lkIHBvbGlzaCggUUFwcGxpY2F0aW9uICogKTsKICAgIHZpcnR1YWwgdm9pZCB1blBvbGlzaCggUUFwcGxpY2F0aW9uICogKTsKCiAgICB2aXJ0dWFsIHZvaWQgcG9saXNoKCBRUGFsZXR0ZSAmICk7CgogICAgdmlydHVhbCB2b2lkIHBvbGlzaFBvcHVwTWVudSggUVBvcHVwTWVudSogKSA9IDA7CgogICAgdmlydHVhbCBRUmVjdCBpdGVtUmVjdCggUVBhaW50ZXIgKnAsIGNvbnN0IFFSZWN0ICZyLAoJCQkgICAgaW50IGZsYWdzLCBib29sIGVuYWJsZWQsCgkJCSAgICBjb25zdCBRUGl4bWFwICpwaXhtYXAsCgkJCSAgICBjb25zdCBRU3RyaW5nICZ0ZXh0LCBpbnQgbGVuID0gLTEgKSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQgZHJhd0l0ZW0oIFFQYWludGVyICpwLCBjb25zdCBRUmVjdCAmciwKCQkJICAgaW50IGZsYWdzLCBjb25zdCBRQ29sb3JHcm91cCAmZywgYm9vbCBlbmFibGVkLAoJCQkgICBjb25zdCBRUGl4bWFwICpwaXhtYXAsIGNvbnN0IFFTdHJpbmcgJnRleHQsCgkJCSAgIGludCBsZW4gPSAtMSwgY29uc3QgUUNvbG9yICpwZW5Db2xvciA9IDAgKSBjb25zdDsKCgogICAgZW51bSBQcmltaXRpdmVFbGVtZW50IHsKCVBFX0J1dHRvbkNvbW1hbmQsCglQRV9CdXR0b25EZWZhdWx0LAoJUEVfQnV0dG9uQmV2ZWwsCglQRV9CdXR0b25Ub29sLAoJUEVfQnV0dG9uRHJvcERvd24sCgoJUEVfRm9jdXNSZWN0LAoKCVBFX0Fycm93VXAsCglQRV9BcnJvd0Rvd24sCglQRV9BcnJvd1JpZ2h0LAoJUEVfQXJyb3dMZWZ0LAoKCVBFX1NwaW5XaWRnZXRVcCwKCVBFX1NwaW5XaWRnZXREb3duLAoJUEVfU3BpbldpZGdldFBsdXMsCglQRV9TcGluV2lkZ2V0TWludXMsCgoJUEVfSW5kaWNhdG9yLAoJUEVfSW5kaWNhdG9yTWFzaywKCVBFX0V4Y2x1c2l2ZUluZGljYXRvciwKCVBFX0V4Y2x1c2l2ZUluZGljYXRvck1hc2ssCgoJUEVfRG9ja1dpbmRvd0hhbmRsZSwKCVBFX0RvY2tXaW5kb3dTZXBhcmF0b3IsCglQRV9Eb2NrV2luZG93UmVzaXplSGFuZGxlLAoKCVBFX1NwbGl0dGVyLAoKCVBFX1BhbmVsLAoJUEVfUGFuZWxQb3B1cCwKCVBFX1BhbmVsTWVudUJhciwKCVBFX1BhbmVsRG9ja1dpbmRvdywKCglQRV9UYWJCYXJCYXNlLAoKCVBFX0hlYWRlclNlY3Rpb24sCglQRV9IZWFkZXJBcnJvdywKCVBFX1N0YXR1c0JhclNlY3Rpb24sCgoJUEVfR3JvdXBCb3hGcmFtZSwKCglQRV9TZXBhcmF0b3IsCgoJUEVfU2l6ZUdyaXAsCgoJUEVfQ2hlY2tNYXJrLAoKCVBFX1Njcm9sbEJhckFkZExpbmUsCglQRV9TY3JvbGxCYXJTdWJMaW5lLAoJUEVfU2Nyb2xsQmFyQWRkUGFnZSwKCVBFX1Njcm9sbEJhclN1YlBhZ2UsCglQRV9TY3JvbGxCYXJTbGlkZXIsCglQRV9TY3JvbGxCYXJGaXJzdCwKCVBFX1Njcm9sbEJhckxhc3QsCgoJUEVfUHJvZ3Jlc3NCYXJDaHVuaywKCglQRV9QYW5lbExpbmVFZGl0LAoJUEVfUGFuZWxUYWJXaWRnZXQsCgoJUEVfV2luZG93RnJhbWUsCgoJUEVfQ2hlY2tMaXN0Q29udHJvbGxlciwKCVBFX0NoZWNrTGlzdEluZGljYXRvciwKCVBFX0NoZWNrTGlzdEV4Y2x1c2l2ZUluZGljYXRvciwKCglQRV9QYW5lbEdyb3VwQm94LAoJUEVfUnViYmVyQmFuZCwKCgkvLyBkbyBub3QgYWRkIGFueSB2YWx1ZXMgYmVsb3cvZ3JlYXRlciB0aGlzCglQRV9DdXN0b21CYXNlID0JCQkweGYwMDAwMDAKICAgIH07CgogICAgZW51bSBTdHlsZUZsYWdzIHsKCVN0eWxlX0RlZmF1bHQgPSAJCTB4MDAwMDAwMDAsCglTdHlsZV9FbmFibGVkID0gCQkweDAwMDAwMDAxLAoJU3R5bGVfUmFpc2VkID0JCQkweDAwMDAwMDAyLAoJU3R5bGVfU3Vua2VuID0JIAkJMHgwMDAwMDAwNCwKCVN0eWxlX09mZiA9CQkJMHgwMDAwMDAwOCwKCVN0eWxlX05vQ2hhbmdlID0JCTB4MDAwMDAwMTAsCglTdHlsZV9PbiA9CQkJMHgwMDAwMDAyMCwKCVN0eWxlX0Rvd24gPQkJCTB4MDAwMDAwNDAsCglTdHlsZV9Ib3Jpem9udGFsID0JCTB4MDAwMDAwODAsCglTdHlsZV9IYXNGb2N1cyA9CQkweDAwMDAwMTAwLAoJU3R5bGVfVG9wID0JCQkweDAwMDAwMjAwLAoJU3R5bGVfQm90dG9tID0JCQkweDAwMDAwNDAwLAoJU3R5bGVfRm9jdXNBdEJvcmRlciA9CQkweDAwMDAwODAwLAoJU3R5bGVfQXV0b1JhaXNlID0JCTB4MDAwMDEwMDAsCglTdHlsZV9Nb3VzZU92ZXIgPQkJMHgwMDAwMjAwMCwKCVN0eWxlX1VwID0JCQkweDAwMDA0MDAwLAoJU3R5bGVfU2VsZWN0ZWQgPQkgCTB4MDAwMDgwMDAsCglTdHlsZV9BY3RpdmUgPQkJCTB4MDAwMTAwMDAsCglTdHlsZV9CdXR0b25EZWZhdWx0ID0JCTB4MDAwMjAwMDAKICAgIH07CiAgICB0eXBlZGVmIHVpbnQgU0ZsYWdzOwoKICAgIHZpcnR1YWwgdm9pZCBkcmF3UHJpbWl0aXZlKCBQcmltaXRpdmVFbGVtZW50IHBlLAoJCQkJUVBhaW50ZXIgKnAsCgkJCQljb25zdCBRUmVjdCAmciwKCQkJCWNvbnN0IFFDb2xvckdyb3VwICZjZywKCQkJCVNGbGFncyBmbGFncyA9IFN0eWxlX0RlZmF1bHQsCgkJCQljb25zdCBRU3R5bGVPcHRpb24mID0gUVN0eWxlT3B0aW9uOjpEZWZhdWx0ICkgY29uc3QgPSAwOwoKCiAgICBlbnVtIENvbnRyb2xFbGVtZW50IHsKCUNFX1B1c2hCdXR0b24sCglDRV9QdXNoQnV0dG9uTGFiZWwsCgoJQ0VfQ2hlY2tCb3gsCglDRV9DaGVja0JveExhYmVsLAoKCUNFX1JhZGlvQnV0dG9uLAoJQ0VfUmFkaW9CdXR0b25MYWJlbCwKCglDRV9UYWJCYXJUYWIsCglDRV9UYWJCYXJMYWJlbCwKCglDRV9Qcm9ncmVzc0Jhckdyb292ZSwKCUNFX1Byb2dyZXNzQmFyQ29udGVudHMsCglDRV9Qcm9ncmVzc0JhckxhYmVsLAoKCUNFX1BvcHVwTWVudUl0ZW0sCglDRV9NZW51QmFySXRlbSwKCglDRV9Ub29sQnV0dG9uTGFiZWwsCglDRV9NZW51QmFyRW1wdHlBcmVhLAoJQ0VfUG9wdXBNZW51U2Nyb2xsZXIsCglDRV9Eb2NrV2luZG93RW1wdHlBcmVhLAoJQ0VfUG9wdXBNZW51VmVydGljYWxFeHRyYSwKCUNFX1BvcHVwTWVudUhvcml6b250YWxFeHRyYSwKCglDRV9Ub29sQm94VGFiLAoJQ0VfSGVhZGVyTGFiZWwsCgoJLy8gZG8gbm90IGFkZCBhbnkgdmFsdWVzIGJlbG93L2dyZWF0ZXIgdGhhbiB0aGlzCglDRV9DdXN0b21CYXNlID0JCTB4ZjAwMDAwMDAKICAgIH07CgogICAgdmlydHVhbCB2b2lkIGRyYXdDb250cm9sKCBDb250cm9sRWxlbWVudCBlbGVtZW50LAoJCQkgICAgICBRUGFpbnRlciAqcCwKCQkJICAgICAgY29uc3QgUVdpZGdldCAqd2lkZ2V0LAoJCQkgICAgICBjb25zdCBRUmVjdCAmciwKCQkJICAgICAgY29uc3QgUUNvbG9yR3JvdXAgJmNnLAoJCQkgICAgICBTRmxhZ3MgaG93ID0gU3R5bGVfRGVmYXVsdCwKCQkJICAgICAgY29uc3QgUVN0eWxlT3B0aW9uJiA9IFFTdHlsZU9wdGlvbjo6RGVmYXVsdCApIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgdm9pZCBkcmF3Q29udHJvbE1hc2soIENvbnRyb2xFbGVtZW50IGVsZW1lbnQsCgkJCQkgIFFQYWludGVyICpwLAoJCQkJICBjb25zdCBRV2lkZ2V0ICp3aWRnZXQsCgkJCQkgIGNvbnN0IFFSZWN0ICZyLAoJCQkJICBjb25zdCBRU3R5bGVPcHRpb24mID0gUVN0eWxlT3B0aW9uOjpEZWZhdWx0ICkgY29uc3QgPSAwOwoKICAgIGVudW0gU3ViUmVjdCB7CglTUl9QdXNoQnV0dG9uQ29udGVudHMsCglTUl9QdXNoQnV0dG9uRm9jdXNSZWN0LAoKCVNSX0NoZWNrQm94SW5kaWNhdG9yLAoJU1JfQ2hlY2tCb3hDb250ZW50cywKCVNSX0NoZWNrQm94Rm9jdXNSZWN0LAoKCVNSX1JhZGlvQnV0dG9uSW5kaWNhdG9yLAoJU1JfUmFkaW9CdXR0b25Db250ZW50cywKCVNSX1JhZGlvQnV0dG9uRm9jdXNSZWN0LAoKCVNSX0NvbWJvQm94Rm9jdXNSZWN0LAoKCVNSX1NsaWRlckZvY3VzUmVjdCwKCglTUl9Eb2NrV2luZG93SGFuZGxlUmVjdCwKCglTUl9Qcm9ncmVzc0Jhckdyb292ZSwKCVNSX1Byb2dyZXNzQmFyQ29udGVudHMsCglTUl9Qcm9ncmVzc0JhckxhYmVsLAoKCVNSX1Rvb2xCdXR0b25Db250ZW50cywKCglTUl9EaWFsb2dCdXR0b25BY2NlcHQsCglTUl9EaWFsb2dCdXR0b25SZWplY3QsCglTUl9EaWFsb2dCdXR0b25BcHBseSwKCVNSX0RpYWxvZ0J1dHRvbkhlbHAsCglTUl9EaWFsb2dCdXR0b25BbGwsCglTUl9EaWFsb2dCdXR0b25BYm9ydCwKCVNSX0RpYWxvZ0J1dHRvbklnbm9yZSwKCVNSX0RpYWxvZ0J1dHRvblJldHJ5LAoJU1JfRGlhbG9nQnV0dG9uQ3VzdG9tLAoKCVNSX1Rvb2xCb3hUYWJDb250ZW50cywKCgkvLyBkbyBub3QgYWRkIGFueSB2YWx1ZXMgYmVsb3cvZ3JlYXRlciB0aGFuIHRoaXMKCVNSX0N1c3RvbUJhc2UgPQkJMHhmMDAwMDAwMAogICAgfTsKCiAgICB2aXJ0dWFsIFFSZWN0IHN1YlJlY3QoIFN1YlJlY3QgciwgY29uc3QgUVdpZGdldCAqd2lkZ2V0ICkgY29uc3QgPSAwOwoKCiAgICBlbnVtIENvbXBsZXhDb250cm9sewoJQ0NfU3BpbldpZGdldCwKCUNDX0NvbWJvQm94LAoJQ0NfU2Nyb2xsQmFyLAoJQ0NfU2xpZGVyLAoJQ0NfVG9vbEJ1dHRvbiwKCUNDX1RpdGxlQmFyLAoJQ0NfTGlzdFZpZXcsCgoJLy8gZG8gbm90IGFkZCBhbnkgdmFsdWVzIGJlbG93L2dyZWF0ZXIgdGhhbiB0aGlzCglDQ19DdXN0b21CYXNlID0JCTB4ZjAwMDAwMDAKICAgIH07CgogICAgZW51bSBTdWJDb250cm9sIHsKCVNDX05vbmUgPQkJCTB4MDAwMDAwMDAsCgoJU0NfU2Nyb2xsQmFyQWRkTGluZSA9CQkweDAwMDAwMDAxLAoJU0NfU2Nyb2xsQmFyU3ViTGluZSA9CQkweDAwMDAwMDAyLAoJU0NfU2Nyb2xsQmFyQWRkUGFnZSA9CQkweDAwMDAwMDA0LAoJU0NfU2Nyb2xsQmFyU3ViUGFnZSA9CQkweDAwMDAwMDA4LAoJU0NfU2Nyb2xsQmFyRmlyc3QgPQkJMHgwMDAwMDAxMCwKCVNDX1Njcm9sbEJhckxhc3QgPQkJMHgwMDAwMDAyMCwKCVNDX1Njcm9sbEJhclNsaWRlciA9CQkweDAwMDAwMDQwLAoJU0NfU2Nyb2xsQmFyR3Jvb3ZlID0JCTB4MDAwMDAwODAsCgoJU0NfU3BpbldpZGdldFVwID0JCTB4MDAwMDAwMDEsCglTQ19TcGluV2lkZ2V0RG93biA9CQkweDAwMDAwMDAyLAoJU0NfU3BpbldpZGdldEZyYW1lID0JCTB4MDAwMDAwMDQsCglTQ19TcGluV2lkZ2V0RWRpdEZpZWxkID0JMHgwMDAwMDAwOCwKCVNDX1NwaW5XaWRnZXRCdXR0b25GaWVsZCA9CTB4MDAwMDAwMTAsCgoJU0NfQ29tYm9Cb3hGcmFtZSA9CQkweDAwMDAwMDAxLAoJU0NfQ29tYm9Cb3hFZGl0RmllbGQgPQkJMHgwMDAwMDAwMiwKCVNDX0NvbWJvQm94QXJyb3cgPQkJMHgwMDAwMDAwNCwKCVNDX0NvbWJvQm94TGlzdEJveFBvcHVwID0JMHgwMDAwMDAwOCwKCglTQ19TbGlkZXJHcm9vdmUgPQkJMHgwMDAwMDAwMSwKCVNDX1NsaWRlckhhbmRsZSA9IAkJMHgwMDAwMDAwMiwKCVNDX1NsaWRlclRpY2ttYXJrcyA9IAkJMHgwMDAwMDAwNCwKCglTQ19Ub29sQnV0dG9uID0JCQkweDAwMDAwMDAxLAoJU0NfVG9vbEJ1dHRvbk1lbnUgPQkJMHgwMDAwMDAwMiwKCglTQ19UaXRsZUJhckxhYmVsID0JCTB4MDAwMDAwMDEsCglTQ19UaXRsZUJhclN5c01lbnUgPQkJMHgwMDAwMDAwMiwKCVNDX1RpdGxlQmFyTWluQnV0dG9uID0JCTB4MDAwMDAwMDQsCglTQ19UaXRsZUJhck1heEJ1dHRvbiA9CQkweDAwMDAwMDA4LAoJU0NfVGl0bGVCYXJDbG9zZUJ1dHRvbiA9CTB4MDAwMDAwMTAsCglTQ19UaXRsZUJhck5vcm1hbEJ1dHRvbiA9CTB4MDAwMDAwMjAsCglTQ19UaXRsZUJhclNoYWRlQnV0dG9uID0JMHgwMDAwMDA0MCwKCVNDX1RpdGxlQmFyVW5zaGFkZUJ1dHRvbiA9CTB4MDAwMDAwODAsCgoJU0NfTGlzdFZpZXcgPQkJCTB4MDAwMDAwMDEsCglTQ19MaXN0Vmlld0JyYW5jaCA9CQkweDAwMDAwMDAyLAoJU0NfTGlzdFZpZXdFeHBhbmQgPQkJMHgwMDAwMDAwNCwKCglTQ19BbGwgPQkJCTB4ZmZmZmZmZmYKICAgIH07CiAgICB0eXBlZGVmIHVpbnQgU0NGbGFnczsKCgogICAgdmlydHVhbCB2b2lkIGRyYXdDb21wbGV4Q29udHJvbCggQ29tcGxleENvbnRyb2wgY29udHJvbCwKCQkJCSAgICAgUVBhaW50ZXIgKnAsCgkJCQkgICAgIGNvbnN0IFFXaWRnZXQgKndpZGdldCwKCQkJCSAgICAgY29uc3QgUVJlY3QgJnIsCgkJCQkgICAgIGNvbnN0IFFDb2xvckdyb3VwICZjZywKCQkJCSAgICAgU0ZsYWdzIGhvdyA9IFN0eWxlX0RlZmF1bHQsCiNpZmRlZiBRX1FET0MKCQkJCSAgICAgU0NGbGFncyBzdWIgPSBTQ19BbGwsCiNlbHNlCgkJCQkgICAgIFNDRmxhZ3Mgc3ViID0gKHVpbnQpU0NfQWxsLAojZW5kaWYKCQkJCSAgICAgU0NGbGFncyBzdWJBY3RpdmUgPSBTQ19Ob25lLAoJCQkJICAgICBjb25zdCBRU3R5bGVPcHRpb24mID0gUVN0eWxlT3B0aW9uOjpEZWZhdWx0ICkgY29uc3QgPSAwOwogICAgdmlydHVhbCB2b2lkIGRyYXdDb21wbGV4Q29udHJvbE1hc2soIENvbXBsZXhDb250cm9sIGNvbnRyb2wsCgkJCQkJIFFQYWludGVyICpwLAoJCQkJCSBjb25zdCBRV2lkZ2V0ICp3aWRnZXQsCgkJCQkJIGNvbnN0IFFSZWN0ICZyLAoJCQkJCSBjb25zdCBRU3R5bGVPcHRpb24mID0gUVN0eWxlT3B0aW9uOjpEZWZhdWx0ICkgY29uc3QgPSAwOwoKICAgIHZpcnR1YWwgUVJlY3QgcXVlcnlTdWJDb250cm9sTWV0cmljcyggQ29tcGxleENvbnRyb2wgY29udHJvbCwKCQkJCQkgIGNvbnN0IFFXaWRnZXQgKndpZGdldCwKCQkJCQkgIFN1YkNvbnRyb2wgc2MsCgkJCQkJICBjb25zdCBRU3R5bGVPcHRpb24mID0gUVN0eWxlT3B0aW9uOjpEZWZhdWx0ICkgY29uc3QgPSAwOwogICAgdmlydHVhbCBTdWJDb250cm9sIHF1ZXJ5U3ViQ29udHJvbCggQ29tcGxleENvbnRyb2wgY29udHJvbCwKCQkJCQljb25zdCBRV2lkZ2V0ICp3aWRnZXQsCgkJCQkJY29uc3QgUVBvaW50ICZwb3MsCgkJCQkJY29uc3QgUVN0eWxlT3B0aW9uJiA9IFFTdHlsZU9wdGlvbjo6RGVmYXVsdCApIGNvbnN0ID0gMDsKCgogICAgZW51bSBQaXhlbE1ldHJpYyB7CglQTV9CdXR0b25NYXJnaW4sCglQTV9CdXR0b25EZWZhdWx0SW5kaWNhdG9yLAoJUE1fTWVudUJ1dHRvbkluZGljYXRvciwKCVBNX0J1dHRvblNoaWZ0SG9yaXpvbnRhbCwKCVBNX0J1dHRvblNoaWZ0VmVydGljYWwsCgoJUE1fRGVmYXVsdEZyYW1lV2lkdGgsCglQTV9TcGluQm94RnJhbWVXaWR0aCwKCglQTV9NYXhpbXVtRHJhZ0Rpc3RhbmNlLAoKCVBNX1Njcm9sbEJhckV4dGVudCwKCVBNX1Njcm9sbEJhclNsaWRlck1pbiwKCglQTV9TbGlkZXJUaGlja25lc3MsCSAgICAgICAJLy8gdG90YWwgc2xpZGVyIHRoaWNrbmVzcwoJUE1fU2xpZGVyQ29udHJvbFRoaWNrbmVzcywgICAgCS8vIHRoaWNrbmVzcyBvZiB0aGUgYnVzaW5lc3MgcGFydAoJUE1fU2xpZGVyTGVuZ3RoLAkJLy8gdG90YWwgbGVuZ3RoIG9mIHNsaWRlcgoJUE1fU2xpZGVyVGlja21hcmtPZmZzZXQsCS8vCglQTV9TbGlkZXJTcGFjZUF2YWlsYWJsZSwJLy8gYXZhaWxhYmxlIHNwYWNlIGZvciBzbGlkZXIgdG8gbW92ZQoKCVBNX0RvY2tXaW5kb3dTZXBhcmF0b3JFeHRlbnQsCglQTV9Eb2NrV2luZG93SGFuZGxlRXh0ZW50LAoJUE1fRG9ja1dpbmRvd0ZyYW1lV2lkdGgsCgoJUE1fTWVudUJhckZyYW1lV2lkdGgsCgoJUE1fVGFiQmFyVGFiT3ZlcmxhcCwKCVBNX1RhYkJhclRhYkhTcGFjZSwKCVBNX1RhYkJhclRhYlZTcGFjZSwKCVBNX1RhYkJhckJhc2VIZWlnaHQsCglQTV9UYWJCYXJCYXNlT3ZlcmxhcCwKCglQTV9Qcm9ncmVzc0JhckNodW5rV2lkdGgsCgoJUE1fU3BsaXR0ZXJXaWR0aCwKCVBNX1RpdGxlQmFySGVpZ2h0LAoKCVBNX0luZGljYXRvcldpZHRoLAoJUE1fSW5kaWNhdG9ySGVpZ2h0LAoJUE1fRXhjbHVzaXZlSW5kaWNhdG9yV2lkdGgsCglQTV9FeGNsdXNpdmVJbmRpY2F0b3JIZWlnaHQsCglQTV9Qb3B1cE1lbnVTY3JvbGxlckhlaWdodCwKCVBNX0NoZWNrTGlzdEJ1dHRvblNpemUsCglQTV9DaGVja0xpc3RDb250cm9sbGVyU2l6ZSwKCVBNX1BvcHVwTWVudUZyYW1lSG9yaXpvbnRhbEV4dHJhLAoJUE1fUG9wdXBNZW51RnJhbWVWZXJ0aWNhbEV4dHJhLAoKCVBNX0RpYWxvZ0J1dHRvbnNTZXBhcmF0b3IsCglQTV9EaWFsb2dCdXR0b25zQnV0dG9uV2lkdGgsCglQTV9EaWFsb2dCdXR0b25zQnV0dG9uSGVpZ2h0LAoKCVBNX01ESUZyYW1lV2lkdGgsCglQTV9NRElNaW5pbWl6ZWRXaWR0aCwKCVBNX0hlYWRlck1hcmdpbiwKCVBNX0hlYWRlck1hcmtTaXplLAoJUE1fSGVhZGVyR3JpcE1hcmdpbiwKCVBNX1RhYkJhclRhYlNoaWZ0SG9yaXpvbnRhbCwKCVBNX1RhYkJhclRhYlNoaWZ0VmVydGljYWwsCglQTV9UYWJCYXJTY3JvbGxCdXR0b25XaWR0aCwKCglQTV9NZW51QmFySXRlbVNwYWNpbmcsCglQTV9Ub29sQmFySXRlbVNwYWNpbmcsCgoJLy8gZG8gbm90IGFkZCBhbnkgdmFsdWVzIGJlbG93L2dyZWF0ZXIgdGhhbiB0aGlzCglQTV9DdXN0b21CYXNlID0JCTB4ZjAwMDAwMDAKICAgIH07CgogICAgdmlydHVhbCBpbnQgcGl4ZWxNZXRyaWMoIFBpeGVsTWV0cmljIG1ldHJpYywKCQkJICAgICBjb25zdCBRV2lkZ2V0ICp3aWRnZXQgPSAwICkgY29uc3QgPSAwOwoKCiAgICBlbnVtIENvbnRlbnRzVHlwZSB7CglDVF9QdXNoQnV0dG9uLAoJQ1RfQ2hlY2tCb3gsCglDVF9SYWRpb0J1dHRvbiwKCUNUX1Rvb2xCdXR0b24sCglDVF9Db21ib0JveCwKCUNUX1NwbGl0dGVyLAoJQ1RfRG9ja1dpbmRvdywKCUNUX1Byb2dyZXNzQmFyLAoJQ1RfUG9wdXBNZW51SXRlbSwKCUNUX1RhYkJhclRhYiwKCUNUX1NsaWRlciwKCUNUX0hlYWRlciwKCUNUX0xpbmVFZGl0LAoJQ1RfTWVudUJhciwKCUNUX1NwaW5Cb3gsCglDVF9TaXplR3JpcCwKCUNUX1RhYldpZGdldCwKCUNUX0RpYWxvZ0J1dHRvbnMsCgoJLy8gZG8gbm90IGFkZCBhbnkgdmFsdWVzIGJlbG93L2dyZWF0ZXIgdGhhbiB0aGlzCglDVF9DdXN0b21CYXNlID0JCTB4ZjAwMDAwMDAKICAgIH07CgogICAgdmlydHVhbCBRU2l6ZSBzaXplRnJvbUNvbnRlbnRzKCBDb250ZW50c1R5cGUgY29udGVudHMsCgkJCQkgICAgY29uc3QgUVdpZGdldCAqd2lkZ2V0LAoJCQkJICAgIGNvbnN0IFFTaXplICZjb250ZW50c1NpemUsCgkJCQkgICAgY29uc3QgUVN0eWxlT3B0aW9uJiA9IFFTdHlsZU9wdGlvbjo6RGVmYXVsdCApIGNvbnN0ID0gMDsKCiAgICBlbnVtIFN0eWxlSGludCAgewoJLy8gLi4uCgkvLyB0aGUgZ2VuZXJhbCBoaW50cwoJLy8gLi4uCiAgICAgICAJLy8gZGlzYWJsZWQgdGV4dCBzaG91bGQgYmUgZXRjaGVkLCBhbGEgV2luZG93cwoJU0hfRXRjaERpc2FibGVkVGV4dCwKCgkvLyB0aGUgR1VJIHN0eWxlIGVudW0sIGFyZ2ghCglTSF9HVUlTdHlsZSwKCgkvLyAuLi4KCS8vIHdpZGdldCBzcGVjaWZpYyBoaW50cwoJLy8gLi4uCglTSF9TY3JvbGxCYXJfQmFja2dyb3VuZE1vZGUsCglTSF9TY3JvbGxCYXJfTWlkZGxlQ2xpY2tBYnNvbHV0ZVBvc2l0aW9uLAoJU0hfU2Nyb2xsQmFyX1Njcm9sbFdoZW5Qb2ludGVyTGVhdmVzQ29udHJvbCwKCgkvLyBRRXZlbnQ6OlR5cGUgLSB3aGljaCBtb3VzZSBldmVudCB0byBzZWxlY3QgYSB0YWIKCVNIX1RhYkJhcl9TZWxlY3RNb3VzZVR5cGUsCgoJU0hfVGFiQmFyX0FsaWdubWVudCwKCglTSF9IZWFkZXJfQXJyb3dBbGlnbm1lbnQsCgoJLy8gYm9vbCAtIHNsaWRlcnMgc25hcCB0byB2YWx1ZXMgd2hpbGUgbW92aW5nLCBhbGEgV2luZG93cwoJU0hfU2xpZGVyX1NuYXBUb1ZhbHVlLAoKCS8vIGJvb2wgLSBrZXkgcHJlc3NlcyBoYW5kbGVkIGluIGEgc2xvcHB5IG1hbm5lciAtIGllLiBsZWZ0IG9uIGEgdmVydGljYWwKCS8vIHNsaWRlciBzdWJ0cmFjdHMgYSBsaW5lCglTSF9TbGlkZXJfU2xvcHB5S2V5RXZlbnRzLAoKCS8vIGJvb2wgLSBjZW50ZXIgYnV0dG9uIG9uIHByb2dyZXNzIGRpYWxvZ3MsIGFsYSBNb3RpZiwgZWxzZSByaWdodCBhbGlnbmVkCgkvLyBwZXJoYXBzIHRoaXMgc2hvdWxkIGJlIGEgUXQ6OkFsaWdubWVudCB2YWx1ZQoJU0hfUHJvZ3Jlc3NEaWFsb2dfQ2VudGVyQ2FuY2VsQnV0dG9uLAoKCS8vIFF0OjpBbGlnbm1lbnRGbGFncyAtIHRleHQgbGFiZWwgYWxpZ25tZW50IGluIHByb2dyZXNzIGRpYWxvZ3MKCS8vIENlbnRlciBvbiB3aW5kb3dzLCBBdXRvfFZDZW50ZXIgb3RoZXJ3aXplCglTSF9Qcm9ncmVzc0RpYWxvZ19UZXh0TGFiZWxBbGlnbm1lbnQsCgoJLy8gYm9vbCAtIHJpZ2h0IGFsaWduIGJ1dHRvbnMgb24gcHJpbnQgZGlhbG9nLCBhbGEgV2luZG93cwoJU0hfUHJpbnREaWFsb2dfUmlnaHRBbGlnbkJ1dHRvbnMsCgoJLy8gYm9vbCAtIDEgb3IgMiBwaXhlbCBzcGFjZSBiZXR3ZWVuIHRoZSBtZW51YmFyIGFuZCB0aGUgZG9ja2FyZWEsIGFsYSBXaW5kb3dzCgkvLyB0aGlzICpSRUFMTFkqIG5lZWRzIGEgYmV0dGVyIG5hbWUKCVNIX01haW5XaW5kb3dfU3BhY2VCZWxvd01lbnVCYXIsCgoJLy8gYm9vbCAtIHNlbGVjdCB0aGUgdGV4dCBpbiB0aGUgbGluZSBlZGl0IGFib3V0IHRoZSBsaXN0Ym94IHdoZW4gc2VsZWN0aW5nCgkvLyBhbiBpdGVtIGZyb20gdGhlIGxpc3Rib3gsIG9yIHdoZW4gdGhlIGxpbmUgZWRpdCByZWNlaXZlcyBmb2N1cywgYWxhIFdpbmRvd3MKCVNIX0ZvbnREaWFsb2dfU2VsZWN0QXNzb2NpYXRlZFRleHQsCgoJLy8gYm9vbCAtIGFsbG93cyBkaXNhYmxlZCBtZW51IGl0ZW1zIHRvIGJlIGFjdGl2ZQoJU0hfUG9wdXBNZW51X0FsbG93QWN0aXZlQW5kRGlzYWJsZWQsCgoJLy8gYm9vbCAtIHByZXNzaW5nIHNwYWNlIGFjdGl2YXRlcyBpdGVtLCBhbGEgTW90aWYKCVNIX1BvcHVwTWVudV9TcGFjZUFjdGl2YXRlc0l0ZW0sCgoJLy8gaW50IC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBvcGVuaW5nIGEgc3VibWVudQoJLy8gMjU2IG9uIHdpbmRvd3MsIDk2IG9uIG1vdGlmCglTSF9Qb3B1cE1lbnVfU3ViTWVudVBvcHVwRGVsYXksCgoJLy8gYm9vbCAtIHNob3VsZCBzY3JvbGx2aWV3cyBkcmF3IHRoZWlyIGZyYW1lIG9ubHkgYXJvdW5kIGNvbnRlbnRzIChhbGEgTW90aWYpLAoJLy8gb3IgYXJvdW5kIGNvbnRlbnRzLCBzY3JvbGxiYXJzIGFuZCBjb3JuZXIgd2lkZ2V0cyAoYWxhIFdpbmRvd3MpID8KCVNIX1Njcm9sbFZpZXdfRnJhbWVPbmx5QXJvdW5kQ29udGVudHMsCgoJLy8gYm9vbCAtIG1lbnViYXJzIGl0ZW1zIGFyZSBuYXZpZ2F0YWJsZSBieSBwcmVzc2luZyBhbHQsIGZvbGxvd2VkIGJ5IHVzaW5nCgkvLyB0aGUgYXJyb3cga2V5cyB0byBzZWxlY3QgdGhlIGRlc2lyZWQgaXRlbQoJU0hfTWVudUJhcl9BbHRLZXlOYXZpZ2F0aW9uLAoKCS8vIGJvb2wgLSBtb3VzZSB0cmFja2luZyBpbiBjb21ib2JveCBkcm9wZG93biBsaXN0cwoJU0hfQ29tYm9Cb3hfTGlzdE1vdXNlVHJhY2tpbmcsCgoJLy8gYm9vbCAtIG1vdXNlIHRyYWNraW5nIGluIHBvcHVwbWVudXMKCVNIX1BvcHVwTWVudV9Nb3VzZVRyYWNraW5nLAoKCS8vIGJvb2wgLSBtb3VzZSB0cmFja2luZyBpbiBtZW51YmFycwoJU0hfTWVudUJhcl9Nb3VzZVRyYWNraW5nLAoKCS8vIGJvb2wgLSBncmF5IG91dCBzZWxlY3RlZCBpdGVtcyB3aGVuIGxvb3NpbmcgZm9jdXMKCVNIX0l0ZW1WaWV3X0NoYW5nZUhpZ2hsaWdodE9uRm9jdXMsCgoJLy8gYm9vbCAtIHN1cHBvcnRzIHNoYXJlZCBhY3RpdmF0aW9uIGFtb25nIG1vZGVsZXNzIHdpZGdldHMKCVNIX1dpZGdldF9TaGFyZUFjdGl2YXRpb24sCgoJLy8gYm9vbCAtIHdvcmtzcGFjZSBzaG91bGQganVzdCBtYXhpbWl6ZSB0aGUgY2xpZW50IGFyZWEKCVNIX1dvcmtzcGFjZV9GaWxsU3BhY2VPbk1heGltaXplLAoKCS8vIGJvb2wgLSBzdXBwb3J0cyBwb3B1cCBtZW51IGNvbWJvYm94ZXMKCVNIX0NvbWJvQm94X1BvcHVwLAoKCS8vIGJvb2wgLSB0aXRsZWJhciBoYXMgbm8gYm9yZGVyCglTSF9UaXRsZUJhcl9Ob0JvcmRlciwKCgkvLyBib29sIC0gc3RvcCBzY3JvbGxiYXIgYXQgbW91c2UKCVNIX1Njcm9sbEJhcl9TdG9wTW91c2VPdmVyU2xpZGVyLAoKCS8vYm9vbCAtIGJsaW5rIGN1cnNvcnQgd2l0aCBzZWxlY3RlZCB0ZXh0CglTSF9CbGlua0N1cnNvcldoZW5UZXh0U2VsZWN0ZWQsCgoJLy9ib29sIC0gcmljaHRleHQgc2VsZWN0aW9ucyBleHRlbmQgdGhlIGZ1bGwgd2lkdGggb2YgdGhlIGRvY3VlbW50CglTSF9SaWNoVGV4dF9GdWxsV2lkdGhTZWxlY3Rpb24sCgoJLy9ib29sIC0gcG9wdXBtZW51IHN1cHBvcnRzIHNjcm9sbGluZyBpbnN0ZWFkIG9mIG11bHRpY29sdW1uIG1vZGUKCVNIX1BvcHVwTWVudV9TY3JvbGxhYmxlLAoKCS8vIFF0OjpBbGlnbm1lbnRGbGFncyAtIHRleHQgbGFiZWwgdmVydGljYWwgYWxpZ25tZW50IGluIGdyb3VwYm94ZXMKCS8vIENlbnRlciBvbiB3aW5kb3dzLCBBdXRvfFZDZW50ZXIgb3RoZXJ3aXplCglTSF9Hcm91cEJveF9UZXh0TGFiZWxWZXJ0aWNhbEFsaWdubWVudCwKCgkvLyBRdDo6UVJnYiAtIHRleHQgbGFiZWwgY29sb3IgaW4gZ3JvdXBib3hlcwoJU0hfR3JvdXBCb3hfVGV4dExhYmVsQ29sb3IsCgoJLy8gYm9vbCAtIHBvcHVwbWVudSBzdXBwb3J0cyBzbG9wcHkgc3VibWVudXMKCVNIX1BvcHVwTWVudV9TbG9wcHlTdWJNZW51cywKCgkvLyBRdDo6UVJnYiAtIHRhYmxlIGdyaWQgY29sb3IKCVNIX1RhYmxlX0dyaWRMaW5lQ29sb3IsCgoJLy8gUUNoYXIgLSBVbmljb2RlIGNoYXJhY3RlciBmb3IgcGFzc3dvcmQgY2hhcgoJU0hfTGluZUVkaXRfUGFzc3dvcmRDaGFyYWN0ZXIsCgoJLy8gUURpYWxvZ0J1dHRvbnM6OkJ1dHRvbiAtIGRlZmF1bHQgYnV0dG9uCglTSF9EaWFsb2dCdXR0b25zX0RlZmF1bHRCdXR0b24sCgoJLy8gUVRvb2xCb3ggLSBCb2xkbmVzcyBvZiB0aGUgc2VsZWN0ZWQgcGFnZSB0aXRsZQoJU0hfVG9vbEJveF9TZWxlY3RlZFBhZ2VUaXRsZUJvbGQsCgoJLy9ib29sIC0gaWYgYSB0YWJiYXIgcHJlZmVycyBub3QgdG8gaGF2ZSBzY3JvbGxlciBhcnJvd3MKCVNIX1RhYkJhcl9QcmVmZXJOb0Fycm93cywKCgkvL2Jvb2wgLSBpZiBsZWZ0IGJ1dHRvbiBzaG91bGQgY2F1c2UgYW4gYWJzb2x1dGUgcG9zaXRpb24KCVNIX1Njcm9sbEJhcl9MZWZ0Q2xpY2tBYnNvbHV0ZVBvc2l0aW9uLAoKCS8vIFFFdmVudDo6VHlwZSAtIHdoaWNoIG1vdXNlIGV2ZW50IHRvIHNlbGVjdCBhIGxpc3QgdmlldyBleHBhbnNpb24KCVNIX0xpc3RWaWV3RXhwYW5kX1NlbGVjdE1vdXNlVHlwZSwKCgkvL2Jvb2wgLSBpZiB1bmRlcmxpbmUgZm9yIGFjY2VsZXJhdG9ycwoJU0hfVW5kZXJsaW5lQWNjZWxlcmF0b3IsCgoJLy8gYm9vbCAtIFFUb29sQnV0dG9uIC0gaWYgdG9vbCBidXR0b25zIHNob3VsZCB1c2UgYSAzRCBmcmFtZQoJLy8gd2hlbiB0aGUgbW91c2UgaXMgb3ZlciB0aGUgYnV0dG9uCglTSF9Ub29sQnV0dG9uX1VzZXMzRCwKCgkvLyBkbyBub3QgYWRkIGFueSB2YWx1ZXMgYmVsb3cvZ3JlYXRlciB0aGFuIHRoaXMKCVNIX0N1c3RvbUJhc2UgPQkJMHhmMDAwMDAwMAogICAgfTsKCiAgICB2aXJ0dWFsIGludCBzdHlsZUhpbnQoIFN0eWxlSGludCBzdHlsZWhpbnQsCgkJCSAgIGNvbnN0IFFXaWRnZXQgKndpZGdldCA9IDAsCgkJCSAgIGNvbnN0IFFTdHlsZU9wdGlvbiYgPSBRU3R5bGVPcHRpb246OkRlZmF1bHQsCgkJCSAgIFFTdHlsZUhpbnRSZXR1cm4qIHJldHVybkRhdGEgPSAwCgkJCSAgICkgY29uc3QgPSAwOwoKCiAgICBlbnVtIFN0eWxlUGl4bWFwIHsKCVNQX1RpdGxlQmFyTWluQnV0dG9uLAoJU1BfVGl0bGVCYXJNYXhCdXR0b24sCglTUF9UaXRsZUJhckNsb3NlQnV0dG9uLAoJU1BfVGl0bGVCYXJOb3JtYWxCdXR0b24sCglTUF9UaXRsZUJhclNoYWRlQnV0dG9uLAoJU1BfVGl0bGVCYXJVbnNoYWRlQnV0dG9uLAoJU1BfRG9ja1dpbmRvd0Nsb3NlQnV0dG9uLAoJU1BfTWVzc2FnZUJveEluZm9ybWF0aW9uLAoJU1BfTWVzc2FnZUJveFdhcm5pbmcsCglTUF9NZXNzYWdlQm94Q3JpdGljYWwsCglTUF9NZXNzYWdlQm94UXVlc3Rpb24sCgoJLy8gZG8gbm90IGFkZCBhbnkgdmFsdWVzIGJlbG93L2dyZWF0ZXIgdGhhbiB0aGlzCglTUF9DdXN0b21CYXNlID0JCTB4ZjAwMDAwMDAKICAgIH07CgogICAgdmlydHVhbCBRUGl4bWFwIHN0eWxlUGl4bWFwKCBTdHlsZVBpeG1hcCBzdHlsZXBpeG1hcCwKCQkJCSBjb25zdCBRV2lkZ2V0ICp3aWRnZXQgPSAwLAoJCQkJIGNvbnN0IFFTdHlsZU9wdGlvbiYgPSBRU3R5bGVPcHRpb246OkRlZmF1bHQgKSBjb25zdCA9IDA7CgoKICAgIHN0YXRpYyBRUmVjdCB2aXN1YWxSZWN0KCBjb25zdCBRUmVjdCAmbG9naWNhbCwgY29uc3QgUVdpZGdldCAqdyApOwoKICAgIHN0YXRpYyBRUmVjdCB2aXN1YWxSZWN0KCBjb25zdCBRUmVjdCAmbG9naWNhbCwgY29uc3QgUVJlY3QgJmJvdW5kaW5nICk7CgoKCgogICAgLy8gT2xkIDIueCBRU3R5bGUgQVBJCgojaWZuZGVmIFFUX05PX0NPTVBBVAogICAgaW50IGRlZmF1bHRGcmFtZVdpZHRoKCkgY29uc3QKICAgIHsKCXJldHVybiBwaXhlbE1ldHJpYyggUE1fRGVmYXVsdEZyYW1lV2lkdGggKTsKICAgIH0KICAgIHZvaWQgdGFiYmFyTWV0cmljcyggY29uc3QgUVdpZGdldCogdCwKCQkJaW50JiBoZiwgaW50JiB2ZiwgaW50JiBvdiApIGNvbnN0CiAgICB7CgloZiA9IHBpeGVsTWV0cmljKCBQTV9UYWJCYXJUYWJIU3BhY2UsIHQgKTsKCXZmID0gcGl4ZWxNZXRyaWMoIFBNX1RhYkJhclRhYlZTcGFjZSwgdCApOwoJb3YgPSBwaXhlbE1ldHJpYyggUE1fVGFiQmFyQmFzZU92ZXJsYXAsIHQgKTsKICAgIH0KICAgIFFTaXplIHNjcm9sbEJhckV4dGVudCgpIGNvbnN0CiAgICB7CglyZXR1cm4gUVNpemUocGl4ZWxNZXRyaWMoUE1fU2Nyb2xsQmFyRXh0ZW50KSwKCQkgICAgIHBpeGVsTWV0cmljKFBNX1Njcm9sbEJhckV4dGVudCkpOwogICAgfQojZW5kaWYKCgpwcml2YXRlOgogICAgUVN0eWxlUHJpdmF0ZSAqIGQ7CgojaWYgZGVmaW5lZChRX0RJU0FCTEVfQ09QWSkKICAgIFFTdHlsZSggY29uc3QgUVN0eWxlICYgKTsKICAgIFFTdHlsZSYgb3BlcmF0b3I9KCBjb25zdCBRU3R5bGUgJiApOwojZW5kaWYKfTsKCiNlbmRpZiAvLyBRVF9OT19TVFlMRQojZW5kaWYgLy8gUVNUWUxFX0gKAAAAHgBxAHYAYgB1AHQAdABvAG4AZwByAG8AdQBwAC4AaAAACFovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRVkJVVFRPTkdST1VQX0gKI2RlZmluZSBRVkJVVFRPTkdST1VQX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicWJ1dHRvbmdyb3VwLmgiCiNlbmRpZiAvLyBRVF9ICgojaWZuZGVmIFFUX05PX1ZCVVRUT05HUk9VUAoKY2xhc3MgUV9FWFBPUlQgUVZCdXR0b25Hcm91cCA6IHB1YmxpYyBRQnV0dG9uR3JvdXAKewogICAgUV9PQkpFQ1QKcHVibGljOgogICAgUVZCdXR0b25Hcm91cCggUVdpZGdldCogcGFyZW50PTAsIGNvbnN0IGNoYXIqIG5hbWU9MCApOwogICAgUVZCdXR0b25Hcm91cCggY29uc3QgUVN0cmluZyAmdGl0bGUsIFFXaWRnZXQqIHBhcmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAgKTsKCiAgICB+UVZCdXR0b25Hcm91cCgpOwoKcHJpdmF0ZToJLy8gRGlzYWJsZWQgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9CiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUVZCdXR0b25Hcm91cCggY29uc3QgUVZCdXR0b25Hcm91cCAmICk7CiAgICBRVkJ1dHRvbkdyb3VwICZvcGVyYXRvcj0oIGNvbnN0IFFWQnV0dG9uR3JvdXAgJiApOwojZW5kaWYKfTsKCgojZW5kaWYgLy8gUVRfTk9fVkJVVFRPTkdST1VQCgojZW5kaWYgLy8gUVZCVVRUT05HUk9VUF9ICgAAABQAcQB0AG8AbwBsAGIAbwB4AC4AaAAADucvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFUT09MQk9YX0gKI2RlZmluZSBRVE9PTEJPWF9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgPHFmcmFtZS5oPgojaW5jbHVkZSA8cWljb25zZXQuaD4KI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fVE9PTEJPWAoKY2xhc3MgUVRvb2xCb3hQcml2YXRlOwpjbGFzcyBRV2lkZ2V0TGlzdDsKCmNsYXNzIFFfRVhQT1JUIFFUb29sQm94IDogcHVibGljIFFGcmFtZQp7CiAgICBRX09CSkVDVAogICAgUV9QUk9QRVJUWSggaW50IGN1cnJlbnRJbmRleCBSRUFEIGN1cnJlbnRJbmRleCBXUklURSBzZXRDdXJyZW50SW5kZXggKQogICAgUV9QUk9QRVJUWSggaW50IGNvdW50IFJFQUQgY291bnQgKQoKcHVibGljOgogICAgUVRvb2xCb3goIFFXaWRnZXQgKnBhcmVudCA9IDAsIGNvbnN0IGNoYXIgKm5hbWUgPSAwLCBXRmxhZ3MgZiA9IDAgKTsKICAgIH5RVG9vbEJveCgpOwoKICAgIGludCBhZGRJdGVtKCBRV2lkZ2V0ICppdGVtLCBjb25zdCBRU3RyaW5nICZsYWJlbCApOwogICAgaW50IGFkZEl0ZW0oIFFXaWRnZXQgKml0ZW0sIGNvbnN0IFFJY29uU2V0ICZpY29uU2V0LCBjb25zdCBRU3RyaW5nICZsYWJlbCApOwogICAgaW50IGluc2VydEl0ZW0oIGludCBpbmRleCwgUVdpZGdldCAqaXRlbSwgY29uc3QgUVN0cmluZyAmbGFiZWwgKTsKICAgIGludCBpbnNlcnRJdGVtKCBpbnQgaW5kZXgsIFFXaWRnZXQgKml0ZW0sIGNvbnN0IFFJY29uU2V0ICZpY29uU2V0LCBjb25zdCBRU3RyaW5nICZsYWJlbCApOwoKICAgIGludCByZW1vdmVJdGVtKCBRV2lkZ2V0ICppdGVtICk7CgogICAgdm9pZCBzZXRJdGVtRW5hYmxlZCggaW50IGluZGV4LCBib29sIGVuYWJsZWQgKTsKICAgIGJvb2wgaXNJdGVtRW5hYmxlZCggaW50IGluZGV4ICkgY29uc3Q7CgogICAgdm9pZCBzZXRJdGVtTGFiZWwoIGludCBpbmRleCwgY29uc3QgUVN0cmluZyAmbGFiZWwgKTsKICAgIFFTdHJpbmcgaXRlbUxhYmVsKCBpbnQgaW5kZXggKSBjb25zdDsKCiAgICB2b2lkIHNldEl0ZW1JY29uU2V0KCBpbnQgaW5kZXgsIGNvbnN0IFFJY29uU2V0ICZpY29uU2V0ICk7CiAgICBRSWNvblNldCBpdGVtSWNvblNldCggaW50IGluZGV4ICkgY29uc3Q7CgogICAgdm9pZCBzZXRJdGVtVG9vbFRpcCggaW50IGluZGV4LCBjb25zdCBRU3RyaW5nICZ0b29sVGlwICk7CiAgICBRU3RyaW5nIGl0ZW1Ub29sVGlwKCBpbnQgaW5kZXggKSBjb25zdDsKCiAgICBRV2lkZ2V0ICpjdXJyZW50SXRlbSgpIGNvbnN0OwogICAgdm9pZCBzZXRDdXJyZW50SXRlbSggUVdpZGdldCAqaXRlbSApOwoKICAgIGludCBjdXJyZW50SW5kZXgoKSBjb25zdDsKICAgIFFXaWRnZXQgKml0ZW0oIGludCBpbmRleCApIGNvbnN0OwogICAgaW50IGluZGV4T2YoIFFXaWRnZXQgKml0ZW0gKSBjb25zdDsKICAgIGludCBjb3VudCgpIGNvbnN0OwoKcHVibGljIHNsb3RzOgogICAgdm9pZCBzZXRDdXJyZW50SW5kZXgoIGludCBpbmRleCApOwoKc2lnbmFsczoKICAgIHZvaWQgY3VycmVudENoYW5nZWQoIGludCBpbmRleCApOwoKcHJpdmF0ZSBzbG90czoKICAgIHZvaWQgYnV0dG9uQ2xpY2tlZCgpOwogICAgdm9pZCBpdGVtRGVzdHJveWVkKFFPYmplY3QqKTsKCnByb3RlY3RlZDoKICAgIHZpcnR1YWwgdm9pZCBpdGVtSW5zZXJ0ZWQoIGludCBpbmRleCApOwogICAgdmlydHVhbCB2b2lkIGl0ZW1SZW1vdmVkKCBpbnQgaW5kZXggKTsKICAgIHZvaWQgc2hvd0V2ZW50KCBRU2hvd0V2ZW50ICplICk7CiAgICB2b2lkIGZyYW1lQ2hhbmdlZCgpOwogICAgdm9pZCBzdHlsZUNoYW5nZShRU3R5bGUmKTsKCnByaXZhdGU6CiAgICB2b2lkIHJlbGF5b3V0KCk7Cgpwcml2YXRlOgogICAgUVRvb2xCb3hQcml2YXRlICpkOwoKfTsKCgppbmxpbmUgaW50IFFUb29sQm94OjphZGRJdGVtKCBRV2lkZ2V0ICppdGVtLCBjb25zdCBRU3RyaW5nICZsYWJlbCApCnsgcmV0dXJuIGluc2VydEl0ZW0oIC0xLCBpdGVtLCBRSWNvblNldCgpLCBsYWJlbCApOyB9CmlubGluZSBpbnQgUVRvb2xCb3g6OmFkZEl0ZW0oIFFXaWRnZXQgKml0ZW0sIGNvbnN0IFFJY29uU2V0ICZpY29uU2V0LAoJCQkgICAgICBjb25zdCBRU3RyaW5nICZsYWJlbCApCnsgcmV0dXJuIGluc2VydEl0ZW0oIC0xLCBpdGVtLCBpY29uU2V0LCBsYWJlbCApOyB9CmlubGluZSBpbnQgUVRvb2xCb3g6Omluc2VydEl0ZW0oIGludCBpbmRleCwgUVdpZGdldCAqaXRlbSwgY29uc3QgUVN0cmluZyAmbGFiZWwgKQp7IHJldHVybiBpbnNlcnRJdGVtKCBpbmRleCwgaXRlbSwgUUljb25TZXQoKSwgbGFiZWwgKTsgfQoKI2VuZGlmIC8vIFFUX05PX1RPT0xCT1gKI2VuZGlmCgAAABgAcQB0AGUAeAB0AGMAbwBkAGUAYwAuAGgAABFYLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFURVhUQ09ERUNfSAojZGVmaW5lIFFURVhUQ09ERUNfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxc3RyaW5nLmgiCiNlbmRpZiAvLyBRVF9ICgojaWZuZGVmIFFUX05PX1RFWFRDT0RFQwoKY2xhc3MgUVRleHRDb2RlYzsKY2xhc3MgUUlPRGV2aWNlOwpjbGFzcyBRRm9udDsKCmNsYXNzIFFfRVhQT1JUIFFUZXh0RW5jb2RlciB7CnB1YmxpYzoKICAgIHZpcnR1YWwgflFUZXh0RW5jb2RlcigpOwogICAgdmlydHVhbCBRQ1N0cmluZyBmcm9tVW5pY29kZShjb25zdCBRU3RyaW5nJiB1YywgaW50JiBsZW5Jbk91dCkgPSAwOwp9OwoKY2xhc3MgUV9FWFBPUlQgUVRleHREZWNvZGVyIHsKcHVibGljOgogICAgdmlydHVhbCB+UVRleHREZWNvZGVyKCk7CiAgICB2aXJ0dWFsIFFTdHJpbmcgdG9Vbmljb2RlKGNvbnN0IGNoYXIqIGNoYXJzLCBpbnQgbGVuKSA9IDA7Cn07CgpjbGFzcyBRX0VYUE9SVCBRVGV4dENvZGVjIHsKcHVibGljOgogICAgdmlydHVhbCB+UVRleHRDb2RlYygpOwoKI2lmbmRlZiBRVF9OT19DT0RFQ1MKICAgIHN0YXRpYyBRVGV4dENvZGVjKiBsb2FkQ2hhcm1hcChRSU9EZXZpY2UqKTsKICAgIHN0YXRpYyBRVGV4dENvZGVjKiBsb2FkQ2hhcm1hcEZpbGUoUVN0cmluZyBmaWxlbmFtZSk7CiNlbmRpZiAvL1FUX05PX0NPREVDUwogICAgc3RhdGljIFFUZXh0Q29kZWMqIGNvZGVjRm9yTWliKGludCBtaWIpOwogICAgc3RhdGljIFFUZXh0Q29kZWMqIGNvZGVjRm9yTmFtZShjb25zdCBjaGFyKiBoaW50LCBpbnQgYWNjdXJhY3k9MCk7CiAgICBzdGF0aWMgUVRleHRDb2RlYyogY29kZWNGb3JDb250ZW50KGNvbnN0IGNoYXIqIGNoYXJzLCBpbnQgbGVuKTsKICAgIHN0YXRpYyBRVGV4dENvZGVjKiBjb2RlY0ZvckluZGV4KGludCBpKTsKICAgIHN0YXRpYyBRVGV4dENvZGVjKiBjb2RlY0ZvckxvY2FsZSgpOwogICAgc3RhdGljIHZvaWQgc2V0Q29kZWNGb3JMb2NhbGUoUVRleHRDb2RlYyAqYyk7CgogICAgc3RhdGljIFFUZXh0Q29kZWMqIGNvZGVjRm9yVHIoKTsKICAgIHN0YXRpYyB2b2lkIHNldENvZGVjRm9yVHIoUVRleHRDb2RlYyAqYyk7CiAgICBzdGF0aWMgUVRleHRDb2RlYyogY29kZWNGb3JDU3RyaW5ncygpOwogICAgc3RhdGljIHZvaWQgc2V0Q29kZWNGb3JDU3RyaW5ncyhRVGV4dENvZGVjICpjKTsKCiAgICBzdGF0aWMgdm9pZCBkZWxldGVBbGxDb2RlY3MoKTsKCiAgICBzdGF0aWMgY29uc3QgY2hhciogbG9jYWxlKCk7CgogICAgdmlydHVhbCBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgPSAwOwogICAgdmlydHVhbCBjb25zdCBjaGFyKiBtaW1lTmFtZSgpIGNvbnN0OwogICAgdmlydHVhbCBpbnQgbWliRW51bSgpIGNvbnN0ID0gMDsKCiAgICB2aXJ0dWFsIFFUZXh0RGVjb2RlciogbWFrZURlY29kZXIoKSBjb25zdDsKICAgIHZpcnR1YWwgUVRleHRFbmNvZGVyKiBtYWtlRW5jb2RlcigpIGNvbnN0OwoKICAgIHZpcnR1YWwgUVN0cmluZyB0b1VuaWNvZGUoY29uc3QgY2hhciogY2hhcnMsIGludCBsZW4pIGNvbnN0OwogICAgdmlydHVhbCBRQ1N0cmluZyBmcm9tVW5pY29kZShjb25zdCBRU3RyaW5nJiB1YywgaW50JiBsZW5Jbk91dCkgY29uc3Q7CgogICAgUUNTdHJpbmcgZnJvbVVuaWNvZGUoY29uc3QgUVN0cmluZyYgdWMpIGNvbnN0OwogICAgUVN0cmluZyB0b1VuaWNvZGUoY29uc3QgUUJ5dGVBcnJheSYsIGludCBsZW4pIGNvbnN0OwogICAgUVN0cmluZyB0b1VuaWNvZGUoY29uc3QgUUJ5dGVBcnJheSYpIGNvbnN0OwogICAgUVN0cmluZyB0b1VuaWNvZGUoY29uc3QgUUNTdHJpbmcmLCBpbnQgbGVuKSBjb25zdDsKICAgIFFTdHJpbmcgdG9Vbmljb2RlKGNvbnN0IFFDU3RyaW5nJikgY29uc3Q7CiAgICBRU3RyaW5nIHRvVW5pY29kZShjb25zdCBjaGFyKiBjaGFycykgY29uc3Q7CiAgICB2aXJ0dWFsIGJvb2wgY2FuRW5jb2RlKCBRQ2hhciApIGNvbnN0OwogICAgdmlydHVhbCBib29sIGNhbkVuY29kZSggY29uc3QgUVN0cmluZyYgKSBjb25zdDsKCiAgICB2aXJ0dWFsIGludCBoZXVyaXN0aWNDb250ZW50TWF0Y2goY29uc3QgY2hhciogY2hhcnMsIGludCBsZW4pIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgaW50IGhldXJpc3RpY05hbWVNYXRjaChjb25zdCBjaGFyKiBoaW50KSBjb25zdDsKCiAgICB2aXJ0dWFsIFFCeXRlQXJyYXkgZnJvbVVuaWNvZGUoY29uc3QgUVN0cmluZyYgdWMsIGludCBmcm9tLCBpbnQgbGVuKSBjb25zdDsKICAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgY2hhcmFjdGVyRnJvbVVuaWNvZGUoY29uc3QgUVN0cmluZyAmc3RyLCBpbnQgcG9zKSBjb25zdDsKCnByb3RlY3RlZDoKICAgIFFUZXh0Q29kZWMoKTsKICAgIHN0YXRpYyBpbnQgc2ltcGxlSGV1cmlzdGljTmFtZU1hdGNoKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGhpbnQpOwoKcHJpdmF0ZToKICAgIGZyaWVuZCBjbGFzcyBRRm9udDsKICAgIGZyaWVuZCBjbGFzcyBRRm9udEVuZ2luZVhMRkQ7CiAgICB2b2lkIGZyb21Vbmljb2RlSW50ZXJuYWwoIGNvbnN0IFFDaGFyICppbiwgdW5zaWduZWQgc2hvcnQgKm91dCwgIGludCBsZW5ndGggKTsKCiAgICBzdGF0aWMgUVRleHRDb2RlYyAqY2Z0cjsKICAgIHN0YXRpYyBRVGV4dENvZGVjICpjZmNzOwp9OwoKaW5saW5lIFFUZXh0Q29kZWMqIFFUZXh0Q29kZWM6OmNvZGVjRm9yVHIoKSB7IHJldHVybiBjZnRyOyB9CmlubGluZSB2b2lkIFFUZXh0Q29kZWM6OnNldENvZGVjRm9yVHIoUVRleHRDb2RlYyAqYykgeyBjZnRyID0gYzsgfQppbmxpbmUgUVRleHRDb2RlYyogUVRleHRDb2RlYzo6Y29kZWNGb3JDU3RyaW5ncygpIHsgcmV0dXJuIGNmY3M7IH0KaW5saW5lIHZvaWQgUVRleHRDb2RlYzo6c2V0Q29kZWNGb3JDU3RyaW5ncyhRVGV4dENvZGVjICpjKSB7IGNmY3MgPSBjOyB9CgojZW5kaWYgLy8gUVRfTk9fVEVYVENPREVDCiNlbmRpZiAvLyBRVEVYVENPREVDX0gKAAAAJgBxAHcAaQBuAGQAbwB3AHMAeQBzAHQAZQBtAF8AcQB3AHMALgBoAABADi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRV0lORE9XU1lTVEVNX1FXU19ICiNkZWZpbmUgUVdJTkRPV1NZU1RFTV9RV1NfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxd3Nzb2NrZXRfcXdzLmgiCiNpbmNsdWRlICJxbWFwLmgiCiNpbmNsdWRlICJxZGF0ZXRpbWUuaCIKI2luY2x1ZGUgInFwdHJsaXN0LmgiCiNpbmNsdWRlICJxaW1hZ2UuaCIKCiNpbmNsdWRlICJxd3Nwcm9wZXJ0eV9xd3MuaCIKI2luY2x1ZGUgInF3c2NvbW1hbmRfcXdzLmgiCiNpbmNsdWRlICJxd3NldmVudF9xd3MuaCIKI2VuZGlmIC8vIFFUX0gKCiNpbmNsdWRlICJxa2JkX3F3cy5oIgoKc3RydWN0IFNXQ3Vyc29yRGF0YTsKY2xhc3MgUVdTQ3Vyc29yOwpjbGFzcyBRV1NDbGllbnQ7CmNsYXNzIFFXU1JlZ2lvbk1hbmFnZXI7CmNsYXNzIFFHZng7CmNsYXNzIFFXU1NlcnZlckRhdGE7CgpjbGFzcyBRV1NJbnRlcm5hbFdpbmRvd0luZm8KewoKcHVibGljOgoKICAgIGludCB3aW5pZDsKICAgIHVuc2lnbmVkIGludCBjbGllbnRpZDsKICAgIFFTdHJpbmcgbmFtZTsgICAvLyBDb3JyZXNwb25kcyB0byBRT2JqZWN0IG5hbWUgb2YgdG9wLWxldmVsIHdpZGdldAoKfTsKCnN0cnVjdCBRV1NXaW5kb3dEYXRhOwoKY2xhc3MgUVdTU2NyZWVuU2F2ZXIKewpwdWJsaWM6CiAgICB2aXJ0dWFsIH5RV1NTY3JlZW5TYXZlcigpOwogICAgdmlydHVhbCB2b2lkIHJlc3RvcmUoKT0wOwogICAgdmlydHVhbCBib29sIHNhdmUoaW50IGxldmVsKT0wOwp9OwoKY2xhc3MgUVdTV2luZG93CnsKICAgIGZyaWVuZCBjbGFzcyBRV1NTZXJ2ZXI7CnB1YmxpYzoKICAgIFFXU1dpbmRvdyhpbnQgaSwgUVdTQ2xpZW50KiBjbGllbnQpOwogICAgflFXU1dpbmRvdygpOwoKICAgIGludCB3aW5JZCgpIGNvbnN0IHsgcmV0dXJuIGlkOyB9CiAgICBjb25zdCBRU3RyaW5nICZuYW1lKCkgY29uc3QgeyByZXR1cm4gcmduTmFtZTsgfQogICAgY29uc3QgUVN0cmluZyAmY2FwdGlvbigpIGNvbnN0IHsgcmV0dXJuIHJnbkNhcHRpb247IH0KICAgIFFXU0NsaWVudCogY2xpZW50KCkgY29uc3QgeyByZXR1cm4gYzsgfQogICAgUVJlZ2lvbiByZXF1ZXN0ZWQoKSBjb25zdCB7IHJldHVybiByZXF1ZXN0ZWRfcmVnaW9uOyB9CiAgICBRUmVnaW9uIGFsbG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBhbGxvY2F0ZWRfcmVnaW9uOyB9CiAgICBib29sIGlzVmlzaWJsZSgpIGNvbnN0IHsgcmV0dXJuICFyZXF1ZXN0ZWRfcmVnaW9uLmlzRW1wdHkoKTsgfQogICAgYm9vbCBpc1BhcnRpYWxseU9ic2N1cmVkKCkgY29uc3QgeyByZXR1cm4gcmVxdWVzdGVkX3JlZ2lvbiE9YWxsb2NhdGVkX3JlZ2lvbjsgfQogICAgYm9vbCBpc0Z1bGx5T2JzY3VyZWQoKSBjb25zdCB7IHJldHVybiBhbGxvY2F0ZWRfcmVnaW9uLmlzRW1wdHkoKTsgfQoKICAgIHZvaWQgcmFpc2UoKTsKICAgIHZvaWQgbG93ZXIoKTsKICAgIHZvaWQgc2hvdygpOwogICAgdm9pZCBoaWRlKCk7CiAgICB2b2lkIHNldEFjdGl2ZVdpbmRvdygpOwoKcHJpdmF0ZToKICAgIGJvb2wgaGlkZGVuKCkgY29uc3QgeyByZXR1cm4gcmVxdWVzdGVkX3JlZ2lvbi5pc0VtcHR5KCk7IH0KICAgIGJvb2wgZm9yQ2xpZW50KGNvbnN0IFFXU0NsaWVudCogY2wpIGNvbnN0IHsgcmV0dXJuIGNsPT1jOyB9CgogICAgdm9pZCBzZXROYW1lKCBjb25zdCBRU3RyaW5nICZuICk7CiAgICB2b2lkIHNldENhcHRpb24oIGNvbnN0IFFTdHJpbmcgJmMgKTsKCiAgICB2b2lkIGFkZEFsbG9jYXRpb24oIFFXU1JlZ2lvbk1hbmFnZXIgKiwgY29uc3QgUVJlZ2lvbiAmICk7CiAgICB2b2lkIHJlbW92ZUFsbG9jYXRpb24oIFFXU1JlZ2lvbk1hbmFnZXIgKiwgY29uc3QgUVJlZ2lvbiAmICk7CgogICAgaW50ICBhbGxvY2F0aW9uSW5kZXgoKSBjb25zdCB7IHJldHVybiBhbGxvY19yZWdpb25faWR4OyB9CiAgICB2b2lkIHNldEFsbG9jYXRpb25JbmRleCggaW50IGkgKSB7IGFsbG9jX3JlZ2lvbl9pZHggPSBpOyBtb2RpZmllZCA9IFRSVUU7IH0KICAgIHZvaWQgdXBkYXRlQWxsb2NhdGlvbigpOwoKICAgIHZvaWQgc2V0TmVlZEFjayggYm9vbCBuICkgeyBuZWVkQWNrID0gbjsgfQoKICAgIHZvaWQgZm9jdXMoYm9vbCBnZXQpOwogICAgaW50IGZvY3VzUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiBsYXN0X2ZvY3VzX3RpbWU7IH0KICAgIHZvaWQgb3BlcmF0aW9uKCBRV1NXaW5kb3dPcGVyYXRpb25FdmVudDo6T3BlcmF0aW9uIG8gKTsKICAgIHZvaWQgc2h1dHRpbmdEb3duKCkgeyBsYXN0X2ZvY3VzX3RpbWU9MDsgfQoKcHJpdmF0ZToKICAgIGludCBpZDsKICAgIFFTdHJpbmcgcmduTmFtZTsKICAgIFFTdHJpbmcgcmduQ2FwdGlvbjsKICAgIGludCBhbGxvY19yZWdpb25faWR4OwogICAgYm9vbCBtb2RpZmllZDsKICAgIGJvb2wgbmVlZEFjazsKICAgIGJvb2wgb25Ub3A7CiAgICBRV1NDbGllbnQqIGM7CiAgICBRUmVnaW9uIHJlcXVlc3RlZF9yZWdpb247CiAgICBRUmVnaW9uIGFsbG9jYXRlZF9yZWdpb247CiAgICBRUmVnaW9uIGV4cG9zZWQ7CiAgICBpbnQgbGFzdF9mb2N1c190aW1lOwogICAgUVdTV2luZG93RGF0YSAqZDsKfTsKCiNpZm5kZWYgUVRfTk9fU09VTkQKY2xhc3MgUVdTU291bmRTZXJ2ZXI7CiNpZmRlZiBRVF9VU0VfT0xEX1FXU19TT1VORApjbGFzcyBRV1NTb3VuZFNlcnZlckRhdGE7CgpjbGFzcyBRV1NTb3VuZFNlcnZlciA6IHB1YmxpYyBRT2JqZWN0IHsKICAgIFFfT0JKRUNUCnB1YmxpYzoKICAgIFFXU1NvdW5kU2VydmVyKFFPYmplY3QqIHBhcmVudCk7CiAgICB+UVdTU291bmRTZXJ2ZXIoKTsKICAgIHZvaWQgcGxheUZpbGUoY29uc3QgUVN0cmluZyYgZmlsZW5hbWUpOwpwcml2YXRlIHNsb3RzOgogICAgdm9pZCBmZWVkRGV2aWNlKGludCBmZCk7CnByaXZhdGU6CiAgICBRV1NTb3VuZFNlcnZlckRhdGEqIGQ7Cn07CiNlbmRpZgojZW5kaWYKCgoKCgoKCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKY2xhc3MgUVdTTW91c2VIYW5kbGVyOwpzdHJ1Y3QgUVdTQ29tbWFuZFN0cnVjdDsKCiNpZm5kZWYgUVRfTk9fUVdTX01VTFRJUFJPQ0VTUwpjbGFzcyBRV1NTZXJ2ZXIgOiBwdWJsaWMgUVdTU2VydmVyU29ja2V0CiNlbHNlCmNsYXNzIFFXU1NlcnZlciA6IHB1YmxpYyBRT2JqZWN0CiNlbmRpZgp7CiAgICBmcmllbmQgY2xhc3MgUUNvcENoYW5uZWw7CiAgICBmcmllbmQgY2xhc3MgUVdTTW91c2VIYW5kbGVyOwogICAgZnJpZW5kIGNsYXNzIFFXU1dpbmRvdzsKICAgIGZyaWVuZCBjbGFzcyBRV1NEaXNwbGF5OwogICAgZnJpZW5kIGNsYXNzIFFXU0lucHV0TWV0aG9kOwogICAgUV9PQkpFQ1QKCnB1YmxpYzoKICAgIFFXU1NlcnZlciggaW50IGZsYWdzID0gMCwgUU9iamVjdCAqcGFyZW50PTAsIGNvbnN0IGNoYXIgKm5hbWU9MCApOwogICAgflFXU1NlcnZlcigpOwogICAgZW51bSBTZXJ2ZXJGbGFncyB7IERpc2FibGVLZXlib2FyZCA9IDB4MDEsCgkJICAgICAgIERpc2FibGVNb3VzZSA9IDB4MDIgfTsKCgogICAgZW51bSBHVUlNb2RlIHsgTm9HdWkgPSBGQUxTRSwgTm9ybWFsR1VJID0gVFJVRSwgU2VydmVyIH07CgogICAgc3RhdGljIHZvaWQgc2VuZEtleUV2ZW50KGludCB1bmljb2RlLCBpbnQga2V5Y29kZSwgaW50IG1vZGlmaWVycywgYm9vbCBpc1ByZXNzLAoJCQkgICAgIGJvb2wgYXV0b1JlcGVhdCk7CiAgICBzdGF0aWMgdm9pZCBwcm9jZXNzS2V5RXZlbnQoaW50IHVuaWNvZGUsIGludCBrZXljb2RlLCBpbnQgbW9kaWZpZXJzLCBib29sIGlzUHJlc3MsCgkJCQlib29sIGF1dG9SZXBlYXQpOwoKI2lmbmRlZiBRVF9OT19RV1NfSU0KICAgIGVudW0gSU1TdGF0ZSB7IElNU3RhcnQsIElNQ29tcG9zZSwgSU1FbmQgfTsKCiAgICB2b2lkIHNlbmRJTUV2ZW50KCBJTVN0YXRlIHN0YXRlLCBjb25zdCBRU3RyaW5nJiB0eHQsIGludCBjcG9zLCBpbnQgc2VsTGVuICk7CiNlbmRpZgoKI2lmbmRlZiBRVF9OT19RV1NfS0VZQk9BUkQgICAgCiAgICB0eXBlZGVmIHN0cnVjdCBLZXlNYXAgewoJaW50ICBrZXlfY29kZTsKCXVzaG9ydCB1bmljb2RlOwoJdXNob3J0IHNoaWZ0X3VuaWNvZGU7Cgl1c2hvcnQgY3RybF91bmljb2RlOwogICAgfTsKCiAgICB0eXBlZGVmIHN0cnVjdCBLZXlPdmVycmlkZSB7Cgl1c2hvcnQgc2Nhbl9jb2RlOwoJS2V5TWFwIG1hcDsKICAgIH07CgogICAgc3RhdGljIGNvbnN0IEtleU1hcCAqa2V5TWFwKCk7CgogICAgc3RhdGljIHZvaWQgc2V0T3ZlcnJpZGVLZXlzKCBjb25zdCBLZXlPdmVycmlkZSogKTsKCiAgICBjbGFzcyBLZXlib2FyZEZpbHRlcgogICAgewogICAgcHVibGljOgoJdmlydHVhbCBib29sIGZpbHRlcihpbnQgdW5pY29kZSwgaW50IGtleWNvZGUsIGludCBtb2RpZmllcnMsIAoJCQkgICAgYm9vbCBpc1ByZXNzLCBib29sIGF1dG9SZXBlYXQpPTA7CiAgICB9OwoKICAgIHN0YXRpYyB2b2lkIHNldEtleWJvYXJkRmlsdGVyKCBLZXlib2FyZEZpbHRlciAqZiApOwojZW5kaWYgICAgCiNpZm5kZWYgUVRfTk9fUVdTX0lNCiAgICBzdGF0aWMgdm9pZCBzZXRDdXJyZW50SW5wdXRNZXRob2QoIFFXU0lucHV0TWV0aG9kICppbSApOwogICAgc3RhdGljIHZvaWQgcmVzZXRJbnB1dE1ldGhvZCgpOwogICAgc3RhdGljIHZvaWQgc2V0TWljcm9Gb2N1cyggaW50IHgsIGludCB5ICk7CiNlbmRpZgoKICAgIHN0YXRpYyB2b2lkIHNldERlZmF1bHRNb3VzZSggY29uc3QgY2hhciAqICk7CiAgICBzdGF0aWMgdm9pZCBzZXREZWZhdWx0S2V5Ym9hcmQoIGNvbnN0IGNoYXIgKiApOwogICAgc3RhdGljIHZvaWQgc2V0TWF4V2luZG93UmVjdChjb25zdCBRUmVjdCYpOwogICAgc3RhdGljIHZvaWQgc2VuZE1vdXNlRXZlbnQoY29uc3QgUVBvaW50JiBwb3MsIGludCBzdGF0ZSk7CgogICAgc3RhdGljIHZvaWQgc2V0RGVza3RvcEJhY2tncm91bmQoIGNvbnN0IFFJbWFnZSAmaW1nICk7CiAgICBzdGF0aWMgdm9pZCBzZXREZXNrdG9wQmFja2dyb3VuZCggY29uc3QgUUNvbG9yICYgKTsKICAgIHN0YXRpYyBRV1NNb3VzZUhhbmRsZXIgKm1vdXNlSGFuZGxlcigpOwogICAgc3RhdGljIHZvaWQgc2V0TW91c2VIYW5kbGVyKFFXU01vdXNlSGFuZGxlciopOwojaWZuZGVmIFFUX05PX1FXU19LRVlCT0FSRAogICAgc3RhdGljIFFXU0tleWJvYXJkSGFuZGxlcioga2V5Ym9hcmRIYW5kbGVyKCk7CiAgICBzdGF0aWMgdm9pZCBzZXRLZXlib2FyZEhhbmRsZXIoUVdTS2V5Ym9hcmRIYW5kbGVyKiBraCk7CiNlbmRpZgogICAgUVdTV2luZG93ICp3aW5kb3dBdCggY29uc3QgUVBvaW50JiBwb3MgKTsKCiAgICAvLyBGb3IgZGVidWdnaW5nIG9ubHkgYXQgdGhpcyB0aW1lCiAgICBjb25zdCBRUHRyTGlzdDxRV1NXaW5kb3c+ICZjbGllbnRXaW5kb3dzKCkgeyByZXR1cm4gd2luZG93czsgfQoKICAgIHZvaWQgb3Blbk1vdXNlKCk7CiAgICB2b2lkIGNsb3NlTW91c2UoKTsKI2lmbmRlZiBRVF9OT19RV1NfS0VZQk9BUkQKICAgIHZvaWQgb3BlbktleWJvYXJkKCk7CiAgICB2b2lkIGNsb3NlS2V5Ym9hcmQoKTsKI2VuZGlmCgogICAgc3RhdGljIHZvaWQgc2V0U2NyZWVuU2F2ZXIoUVdTU2NyZWVuU2F2ZXIqKTsKICAgIHN0YXRpYyB2b2lkIHNldFNjcmVlblNhdmVySW50ZXJ2YWxzKGludCogbXMpOwogICAgc3RhdGljIHZvaWQgc2V0U2NyZWVuU2F2ZXJJbnRlcnZhbChpbnQpOwogICAgc3RhdGljIGJvb2wgc2NyZWVuU2F2ZXJBY3RpdmUoKTsKICAgIHN0YXRpYyB2b2lkIHNjcmVlblNhdmVyQWN0aXZhdGUoYm9vbCk7CgogICAgLy8gdGhlIGZvbGxvd2luZyBhcmUgaW50ZXJuYWwuCiAgICB2b2lkIHJlZnJlc2goKTsKICAgIHZvaWQgcmVmcmVzaChRUmVnaW9uICYpOwoKICAgIHZvaWQgZW5hYmxlUGFpbnRpbmcoYm9vbCk7CiAgICBzdGF0aWMgdm9pZCBwcm9jZXNzRXZlbnRRdWV1ZSgpOwogICAgc3RhdGljIFFQdHJMaXN0PFFXU0ludGVybmFsV2luZG93SW5mbz4gKiB3aW5kb3dMaXN0KCk7CgogICAgdm9pZCBzZW5kUHJvcGVydHlOb3RpZnlFdmVudCggaW50IHByb3BlcnR5LCBpbnQgc3RhdGUgKTsKI2lmbmRlZiBRVF9OT19RV1NfUFJPUEVSVElFUwogICAgUVdTUHJvcGVydHlNYW5hZ2VyICptYW5hZ2VyKCkgewoJcmV0dXJuICZwcm9wZXJ0eU1hbmFnZXI7CiAgICB9CiNlbmRpZgogICAgCiAgICBzdGF0aWMgUVBvaW50IG1vdXNlUG9zaXRpb247CgogICAgc3RhdGljIHZvaWQgc3RhcnR1cCggaW50IGZsYWdzICk7CiAgICBzdGF0aWMgdm9pZCBjbG9zZWRvd24oKTsKCiAgICBzdGF0aWMgdm9pZCBiZWdpbkRpc3BsYXlSZWNvbmZpZ3VyZSgpOwogICAgc3RhdGljIHZvaWQgZW5kRGlzcGxheVJlY29uZmlndXJlKCk7CgojaWZuZGVmIFFUX05PX1FXU19DVVJTT1IKICAgIHN0YXRpYyB2b2lkIHNldEN1cnNvclZpc2libGUoIGJvb2wgKTsKICAgIHN0YXRpYyBib29sIGlzQ3Vyc29yVmlzaWJsZSgpOwojZW5kaWYKCiAgICBlbnVtIFdpbmRvd0V2ZW50IHsgQ3JlYXRlPTB4MDAwMSwgRGVzdHJveT0weDAwMDIsIEhpZGU9MHgwMDA0LCBTaG93PTB4MDAwOCwKCQkgICAgICAgUmFpc2U9MHgwMDEwLCBMb3dlcj0weDAwMjAsIEdlb21ldHJ5PTB4MDA0MCwgQWN0aXZlID0gMHgwMDgwLAoJCSAgICAgICBOYW1lPTB4MDEwMCB9OwoKc2lnbmFsczoKICAgIHZvaWQgd2luZG93RXZlbnQoIFFXU1dpbmRvdyAqdywgUVdTU2VydmVyOjpXaW5kb3dFdmVudCBlICk7CgojaWZuZGVmIFFUX05PX0NPUAogICAgdm9pZCBuZXdDaGFubmVsKCBjb25zdCBRU3RyaW5nJiBjaGFubmVsKTsKICAgIHZvaWQgcmVtb3ZlZENoYW5uZWwoY29uc3QgUVN0cmluZyYgY2hhbm5lbCk7CgojZW5kaWYgICAgCnByaXZhdGU6CiNpZm5kZWYgUVRfTk9fQ09QCiAgICBzdGF0aWMgdm9pZCBzZW5kUUNvcEV2ZW50KCBRV1NDbGllbnQgKmMsIGNvbnN0IFFDU3RyaW5nICZjaCwKCQkJICAgICAgIGNvbnN0IFFDU3RyaW5nICZtc2csIGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEsCgkJCSAgICAgICBib29sIHJlc3BvbnNlID0gRkFMU0UgKTsKI2VuZGlmCiAgICB2b2lkIG1vdmVfcmVnaW9uKCBjb25zdCBRV1NSZWdpb25Nb3ZlQ29tbWFuZCAqICk7CiAgICB2b2lkIHNldF9hbHRpdHVkZSggY29uc3QgUVdTQ2hhbmdlQWx0aXR1ZGVDb21tYW5kICogKTsKICAgIHZvaWQgcmVxdWVzdF9mb2N1cyggY29uc3QgUVdTUmVxdWVzdEZvY3VzQ29tbWFuZCAqICk7CiAgICB2b2lkIHJlcXVlc3RfcmVnaW9uKCBpbnQsIFFSZWdpb24gKTsKICAgIHZvaWQgZGVzdHJveV9yZWdpb24oIGNvbnN0IFFXU1JlZ2lvbkRlc3Ryb3lDb21tYW5kICogKTsKICAgIHZvaWQgbmFtZV9yZWdpb24oIGNvbnN0IFFXU1JlZ2lvbk5hbWVDb21tYW5kICogKTsKICAgIHZvaWQgc2V0X2lkZW50aXR5KCBjb25zdCBRV1NJZGVudGlmeUNvbW1hbmQgKiApOwojaWZuZGVmIFFUX05PX1FXU19JTQogICAgdm9pZCBzZXRfbWljcm9fZm9jdXMoIGNvbnN0IFFXU1NldE1pY3JvRm9jdXNDb21tYW5kICogKTsKICAgIHZvaWQgcmVzZXRfaW0oIGNvbnN0IFFXU1Jlc2V0SU1Db21tYW5kICogKTsKICAgIHN0YXRpYyB2b2lkIHNlbmRLZXlFdmVudFVuZmlsdGVyZWQoaW50IHVuaWNvZGUsIGludCBrZXljb2RlLCAKCQkJCSAgICAgICBpbnQgbW9kaWZpZXJzLCBib29sIGlzUHJlc3MsCgkJCQkgICAgICAgYm9vbCBhdXRvUmVwZWF0KTsKCiNlbmRpZgogICAgc3RhdGljIHZvaWQgZW1lcmdlbmN5X2NsZWFudXAoKTsKCiAgICBzdGF0aWMgUUNvbG9yICpiZ0NvbG9yOwogICAgc3RhdGljIFFJbWFnZSAqYmdJbWFnZTsKCiAgICB2b2lkIHNlbmRNYXhXaW5kb3dSZWN0RXZlbnRzKCk7CiNpZm5kZWYgUVRfTk9fUVdTX01VTFRJUFJPQ0VTUwogICAgdm9pZCBuZXdDb25uZWN0aW9uKCBpbnQgc29ja2V0ICk7CiNlbmRpZgogICAgdm9pZCBpbnZva2VJZGVudGlmeSggY29uc3QgUVdTSWRlbnRpZnlDb21tYW5kICpjbWQsIFFXU0NsaWVudCAqY2xpZW50ICk7CiAgICB2b2lkIGludm9rZUNyZWF0ZSggUVdTQ3JlYXRlQ29tbWFuZCAqY21kLCBRV1NDbGllbnQgKmNsaWVudCApOwogICAgdm9pZCBpbnZva2VSZWdpb25OYW1lKCBjb25zdCBRV1NSZWdpb25OYW1lQ29tbWFuZCAqY21kLCBRV1NDbGllbnQgKmNsaWVudCApOwogICAgdm9pZCBpbnZva2VSZWdpb24oIFFXU1JlZ2lvbkNvbW1hbmQgKmNtZCwgUVdTQ2xpZW50ICpjbGllbnQgKTsKICAgIHZvaWQgaW52b2tlUmVnaW9uTW92ZSggY29uc3QgUVdTUmVnaW9uTW92ZUNvbW1hbmQgKmNtZCwgUVdTQ2xpZW50ICpjbGllbnQgKTsKICAgIHZvaWQgaW52b2tlUmVnaW9uRGVzdHJveSggY29uc3QgUVdTUmVnaW9uRGVzdHJveUNvbW1hbmQgKmNtZCwgUVdTQ2xpZW50ICpjbGllbnQgKTsKICAgIHZvaWQgaW52b2tlU2V0QWx0aXR1ZGUoIGNvbnN0IFFXU0NoYW5nZUFsdGl0dWRlQ29tbWFuZCAqY21kLCBRV1NDbGllbnQgKmNsaWVudCApOwojaWZuZGVmIFFUX05PX1FXU19QUk9QRVJUSUVTCiAgICB2b2lkIGludm9rZUFkZFByb3BlcnR5KCBRV1NBZGRQcm9wZXJ0eUNvbW1hbmQgKmNtZCApOwogICAgdm9pZCBpbnZva2VTZXRQcm9wZXJ0eSggUVdTU2V0UHJvcGVydHlDb21tYW5kICpjbWQgKTsKICAgIHZvaWQgaW52b2tlUmVtb3ZlUHJvcGVydHkoIFFXU1JlbW92ZVByb3BlcnR5Q29tbWFuZCAqY21kICk7CiAgICB2b2lkIGludm9rZUdldFByb3BlcnR5KCBRV1NHZXRQcm9wZXJ0eUNvbW1hbmQgKmNtZCwgUVdTQ2xpZW50ICpjbGllbnQgKTsKI2VuZGlmIC8vUVRfTk9fUVdTX1BST1BFUlRJRVMKICAgIHZvaWQgaW52b2tlU2V0U2VsZWN0aW9uT3duZXIoIFFXU1NldFNlbGVjdGlvbk93bmVyQ29tbWFuZCAqY21kICk7CiAgICB2b2lkIGludm9rZUNvbnZlcnRTZWxlY3Rpb24oIFFXU0NvbnZlcnRTZWxlY3Rpb25Db21tYW5kICpjbWQgKTsKICAgIHZvaWQgaW52b2tlU2V0Rm9jdXMoIGNvbnN0IFFXU1JlcXVlc3RGb2N1c0NvbW1hbmQgKmNtZCwgUVdTQ2xpZW50ICpjbGllbnQgKTsKCiAgICB2b2lkIGluaXRJTygpOwogICAgdm9pZCBzZXRGb2N1cyggUVdTV2luZG93KiwgYm9vbCBnYWluICk7CiNpZm5kZWYgUVRfTk9fUVdTX0NVUlNPUgogICAgdm9pZCBpbnZva2VEZWZpbmVDdXJzb3IoIFFXU0RlZmluZUN1cnNvckNvbW1hbmQgKmNtZCwgUVdTQ2xpZW50ICpjbGllbnQgKTsKICAgIHZvaWQgaW52b2tlU2VsZWN0Q3Vyc29yKCBRV1NTZWxlY3RDdXJzb3JDb21tYW5kICpjbWQsIFFXU0NsaWVudCAqY2xpZW50ICk7CiNlbmRpZgogICAgdm9pZCBpbnZva2VHcmFiTW91c2UoIFFXU0dyYWJNb3VzZUNvbW1hbmQgKmNtZCwgUVdTQ2xpZW50ICpjbGllbnQgKTsKICAgIHZvaWQgaW52b2tlR3JhYktleWJvYXJkKCBRV1NHcmFiS2V5Ym9hcmRDb21tYW5kICpjbWQsIFFXU0NsaWVudCAqY2xpZW50ICk7CiNpZm5kZWYgUVRfTk9fU09VTkQKICAgIHZvaWQgaW52b2tlUGxheVNvdW5kKCBRV1NQbGF5U291bmRDb21tYW5kICpjbWQsIFFXU0NsaWVudCAqY2xpZW50ICk7CiNlbmRpZgojaWZuZGVmIFFUX05PX0NPUAogICAgdm9pZCBpbnZva2VSZWdpc3RlckNoYW5uZWwoIFFXU1FDb3BSZWdpc3RlckNoYW5uZWxDb21tYW5kICpjbWQsCgkJCQlRV1NDbGllbnQgKmNsaWVudCApOwogICAgdm9pZCBpbnZva2VRQ29wU2VuZCggUVdTUUNvcFNlbmRDb21tYW5kICpjbWQsIFFXU0NsaWVudCAqY2xpZW50ICk7CiNlbmRpZgogICAgdm9pZCBpbnZva2VSZXBhaW50UmVnaW9uKCBRV1NSZXBhaW50UmVnaW9uQ29tbWFuZCAqY21kLCAKCQkJICAgICAgUVdTQ2xpZW50ICpjbGllbnQgKTsKI2lmbmRlZiBRVF9OT19RV1NfSU0KICAgICAgICB2b2lkIGludm9rZVNldE1pY3JvRm9jdXMoIGNvbnN0IFFXU1NldE1pY3JvRm9jdXNDb21tYW5kICpjbWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVdTQ2xpZW50ICpjbGllbnQgKTsKICAgICAgICB2b2lkIGludm9rZVJlc2V0SU0oIGNvbnN0IFFXU1Jlc2V0SU1Db21tYW5kICpjbWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVdTQ2xpZW50ICpjbGllbnQgKTsKI2VuZGlmCgogICAgUVdTTW91c2VIYW5kbGVyKiBuZXdNb3VzZUhhbmRsZXIoY29uc3QgUVN0cmluZyYgc3BlYyk7CiAgICB2b2lkIG9wZW5EaXNwbGF5KCk7CiAgICB2b2lkIGNsb3NlRGlzcGxheSgpOwoKICAgIHZvaWQgc2hvd0N1cnNvcigpOwogICAgdm9pZCBoaWRlQ3Vyc29yKCk7CiAgICB2b2lkIGluaXRpYWxpemVDdXJzb3IoKTsKICAgIHZvaWQgcGFpbnRTZXJ2ZXJSZWdpb24oKTsKICAgIHZvaWQgcGFpbnRCYWNrZ3JvdW5kKCBjb25zdCBRUmVnaW9uICYgKTsKICAgIHZvaWQgY2xlYXJSZWdpb24oIGNvbnN0IFFSZWdpb24gJnIsIGNvbnN0IFFDb2xvciAmYyApOwogICAgdm9pZCByZWZyZXNoQmFja2dyb3VuZCgpOwogICAgdm9pZCByZXNldEdmeCgpOwoKcHJpdmF0ZSBzbG90czoKI2lmbmRlZiBRVF9OT19RV1NfTVVMVElQUk9DRVNTCiAgICB2b2lkIGNsaWVudENsb3NlZCgpOwogICAgdm9pZCBkb0NsaWVudCgpOwogICAgdm9pZCBkZWxldGVXaW5kb3dzTGF0ZXIoKTsKI2VuZGlmCgogICAgdm9pZCBzY3JlZW5TYXZlcldha2UoKTsKICAgIHZvaWQgc2NyZWVuU2F2ZXJTbGVlcCgpOwogICAgdm9pZCBzY3JlZW5TYXZlclRpbWVvdXQoKTsKCnByaXZhdGU6CiAgICB2b2lkIGRpc2Nvbm5lY3RDbGllbnQoIFFXU0NsaWVudCAqICk7CiAgICB2b2lkIHNjcmVlblNhdmUoaW50IGxldmVsKTsKICAgIHZvaWQgZG9DbGllbnQoIFFXU0NsaWVudCAqICk7CiAgICB0eXBlZGVmIFFNYXBJdGVyYXRvcjxpbnQsUVdTQ2xpZW50Kj4gQ2xpZW50SXRlcmF0b3I7CiAgICB0eXBlZGVmIFFNYXA8aW50LFFXU0NsaWVudCo+IENsaWVudE1hcDsKICAgIHZvaWQgcmVsZWFzZU1vdXNlKFFXU1dpbmRvdyogdyk7CiAgICB2b2lkIHJlbGVhc2VLZXlib2FyZChRV1NXaW5kb3cqIHcpOwogICAgdm9pZCB1cGRhdGVDbGllbnRDdXJzb3JQb3MoKTsKCiAgICB1Y2hhciogc2hhcmVkcmFtOwogICAgaW50IHJhbWxlbjsKCiAgICBRR2Z4ICpnZng7CgogICAgQ2xpZW50TWFwIGNsaWVudDsKI2lmbmRlZiBRVF9OT19RV1NfUFJPUEVSVElFUwogICAgUVdTUHJvcGVydHlNYW5hZ2VyIHByb3BlcnR5TWFuYWdlcjsKI2VuZGlmCiAgICBzdHJ1Y3QgU2VsZWN0aW9uT3duZXIgewoJaW50IHdpbmRvd2lkOwoJc3RydWN0IFRpbWUgewoJICAgIHZvaWQgc2V0KCBpbnQgaCwgaW50IG0sIGludCBzLCBpbnQgczIgKSB7CgkJaG91ciA9IGg7IG1pbnV0ZSA9IG07IHNlYyA9IHM7IG1zID0gczI7CgkgICAgfQoJICAgIGludCBob3VyLCBtaW51dGUsIHNlYywgbXM7Cgl9IHRpbWU7CiAgICB9IHNlbGVjdGlvbk93bmVyOwogICAgUVRpbWUgdGltZXI7CiAgICBRV1NTZXJ2ZXJEYXRhKiBkOwogICAgaW50KiBzY3JlZW5zYXZlcmludGVydmFsOwoKICAgIFFXU1dpbmRvdyAqZm9jdXN3OwogICAgUVdTV2luZG93ICptb3VzZUdyYWJiZXI7CiAgICBib29sIG1vdXNlR3JhYmJpbmc7CiAgICBpbnQgc3dpZHRoLCBzaGVpZ2h0LCBzZGVwdGg7CiNpZm5kZWYgUVRfTk9fUVdTX0NVUlNPUgogICAgYm9vbCBoYXZldmlzY3VyczsKICAgIFFXU0N1cnNvciAqY3Vyc29yOwkgICAgLy8gY3Vyc29yIGN1cnJlbnRseSBzaG93bgogICAgUVdTQ3Vyc29yICpuZXh0Q3Vyc29yOyAgLy8gY3Vyc29yIHRvIHNob3cgb25jZSBncmFiYmluZyBpcyBvZmYKI2VuZGlmCiAgICBRUmVnaW9uIHNjcmVlblJlZ2lvbjsgICAvLyB0aGUgZW50aXJlIGRpc3BsYXkgcmVnaW9uCiAgICBRUmVnaW9uIHNlcnZlclJlZ2lvbjsKICAgIFFSZWdpb24gZGlydHlCYWNrZ3JvdW5kOwogICAgYm9vbCBkaXNhYmxlUGFpbnRpbmc7CiAgICBRUHRyTGlzdDxRV1NNb3VzZUhhbmRsZXI+IG1vdXNlaGFuZGxlcnM7CiNpZm5kZWYgUVRfTk9fUVdTX0tFWUJPQVJECiAgICBRUHRyTGlzdDxRV1NLZXlib2FyZEhhbmRsZXI+IGtleWJvYXJkaGFuZGxlcnM7CiNlbmRpZgoKICAgIFFQdHJMaXN0PFFXU0NvbW1hbmRTdHJ1Y3Q+IGNvbW1hbmRRdWV1ZTsKICAgIFFXU1JlZ2lvbk1hbmFnZXIgKnJnbk1hbjsKCiAgICAvLyBXaW5kb3cgbWFuYWdlbWVudAogICAgUVB0ckxpc3Q8UVdTV2luZG93PiB3aW5kb3dzOyAvLyBmaXJzdD10b3Btb3N0CiAgICBRV1NXaW5kb3cqIG5ld1dpbmRvdyhpbnQgaWQsIFFXU0NsaWVudCogY2xpZW50KTsKICAgIFFXU1dpbmRvdyogZmluZFdpbmRvdyhpbnQgd2luZG93aWQsIFFXU0NsaWVudCogY2xpZW50KTsKICAgIHZvaWQgbW92ZVdpbmRvd1JlZ2lvbihRV1NXaW5kb3cqLCBpbnQgZHgsIGludCBkeSApOwogICAgUVJlZ2lvbiBzZXRXaW5kb3dSZWdpb24oUVdTV2luZG93KiwgUVJlZ2lvbiByICk7CiAgICB2b2lkIHJhaXNlV2luZG93KCBRV1NXaW5kb3cgKiwgaW50ID0gMCk7CiAgICB2b2lkIGxvd2VyV2luZG93KCBRV1NXaW5kb3cgKiwgaW50ID0gLTEpOwogICAgdm9pZCBleHBvc2VSZWdpb24oIFFSZWdpb24gLCBpbnQgaW5kZXggPSAwICk7CiAgICB2b2lkIG5vdGlmeU1vZGlmaWVkKCBRV1NXaW5kb3cgKmFjdGl2ZSA9IDAgKTsKICAgIHZvaWQgc3luY1JlZ2lvbnMoIFFXU1dpbmRvdyAqYWN0aXZlID0gMCApOwoKICAgIHZvaWQgc2V0Q3Vyc29yKFFXU0N1cnNvciAqY3Vycyk7CgogICAgLy8gbXVsdGltZWRpYQojaWZuZGVmIFFUX05PX1NPVU5ECiAgICBRV1NTb3VuZFNlcnZlciAqc291bmRzZXJ2ZXI7CiNlbmRpZgojaWZuZGVmIFFUX05PX0NPUAogICAgUU1hcDxRU3RyaW5nLCBRUHRyTGlzdDxRV1NDbGllbnQ+ID4gY2hhbm5lbHM7CiNlbmRpZgojaWZuZGVmIFFUX05PX1FXU19JTQogICAgYm9vbCBtaWNyb0Y7CiAgICBpbnQgbWljcm9YOwogICAgaW50IG1pY3JvWTsKI2VuZGlmCn07CgpleHRlcm4gUVdTU2VydmVyICpxd3NTZXJ2ZXI7IC8vdGhlcmUgY2FuIGJlIG9ubHkgb25lCgoKI2lmbmRlZiBRVF9OT19RV1NfSU0KICAgIGNsYXNzIFFXU0lucHV0TWV0aG9kCiAgICB7CiAgICBwdWJsaWM6CglRV1NJbnB1dE1ldGhvZCgpOwoJdmlydHVhbCB+UVdTSW5wdXRNZXRob2QoKTsKCXZpcnR1YWwgYm9vbCBmaWx0ZXIoaW50IHVuaWNvZGUsIGludCBrZXljb2RlLCBpbnQgbW9kaWZpZXJzLCAKCQkJICAgIGJvb2wgaXNQcmVzcywgYm9vbCBhdXRvUmVwZWF0KT0wOwoJdmlydHVhbCB2b2lkIHJlc2V0KCk7Cgl2aXJ0dWFsIHZvaWQgc2V0TWljcm9Gb2N1cyggaW50IHgsIGludCB5ICk7Cgl2aXJ0dWFsIHZvaWQgc2V0Rm9udCggY29uc3QgUUZvbnQmICk7CiAgICBwcm90ZWN0ZWQ6Cgl2b2lkIHNlbmRJTUV2ZW50KCBRV1NTZXJ2ZXI6OklNU3RhdGUsIGNvbnN0IFFTdHJpbmcmIHR4dCwgaW50IGNwb3MsIGludCBzZWxMZW4gPSAwICk7CgkvL3ZvaWQgc2VuZEtleUV2ZW50KCBpbnQgdW5pY29kZSwgaW50IGtleWNvZGUsIGludCBtb2RpZmllcnMsIAoJLy8JCSAgICBib29sIGlzUHJlc3MsIGJvb2wgYXV0b1JlcGVhdCk7CiAgICB9OwoKaW5saW5lIHZvaWQgUVdTSW5wdXRNZXRob2Q6OnNlbmRJTUV2ZW50KCBRV1NTZXJ2ZXI6OklNU3RhdGUgc3RhdGUsIGNvbnN0IFFTdHJpbmcgJnR4dCwgaW50IGNwb3MsIGludCBzZWxMZW4gKQp7CiAgICBxd3NTZXJ2ZXItPnNlbmRJTUV2ZW50KCBzdGF0ZSwgdHh0LCBjcG9zLCBzZWxMZW4gKTsKCn0KCgojZW5kaWYKCgoKCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKc3RydWN0IFFXU01vdXNlRXZlbnQ7Cgp0eXBlZGVmIFFNYXA8aW50LCBRV1NDdXJzb3IqPiBRV1NDdXJzb3JNYXA7CgpjbGFzcyBRV1NDbGllbnQgOiBwdWJsaWMgUU9iamVjdAp7CiAgICBRX09CSkVDVApwdWJsaWM6CiAgICBRV1NDbGllbnQoIFFPYmplY3QqIHBhcmVudCwgaW50IHNvY2tldCwgaW50IGlkICk7CiAgICB+UVdTQ2xpZW50KCk7CgogICAgaW50IHNvY2tldCgpIGNvbnN0OwoKICAgIHZvaWQgc2V0SWRlbnRpdHkoY29uc3QgUVN0cmluZyYpOwogICAgUVN0cmluZyBpZGVudGl0eSgpIGNvbnN0IHsgcmV0dXJuIGlkOyB9CgogICAgdm9pZCBzZW5kRXZlbnQoIFFXU0V2ZW50KiBldmVudCApOwogICAgdm9pZCBzZW5kQ29ubmVjdGVkRXZlbnQoIGNvbnN0IGNoYXIgKmRpc3BsYXlfc3BlYyApOwogICAgdm9pZCBzZW5kTWF4V2luZG93UmVjdEV2ZW50KCk7CiAgICB2b2lkIHNlbmRSZWdpb25Nb2RpZnlFdmVudCggaW50IHdpbmlkLCBRUmVnaW9uIGV4cG9zZWQsIGJvb2wgYWNrICk7CiAgICB2b2lkIHNlbmRGb2N1c0V2ZW50KCBpbnQgd2luaWQsIGJvb2wgZ2V0ICk7CiAgICB2b2lkIHNlbmRQcm9wZXJ0eU5vdGlmeUV2ZW50KCBpbnQgcHJvcGVydHksIGludCBzdGF0ZSApOwogICAgdm9pZCBzZW5kUHJvcGVydHlSZXBseUV2ZW50KCBpbnQgcHJvcGVydHksIGludCBsZW4sIGNoYXIgKmRhdGEgKTsKICAgIHZvaWQgc2VuZFNlbGVjdGlvbkNsZWFyRXZlbnQoIGludCB3aW5kb3dpZCApOwogICAgdm9pZCBzZW5kU2VsZWN0aW9uUmVxdWVzdEV2ZW50KCBRV1NDb252ZXJ0U2VsZWN0aW9uQ29tbWFuZCAqY21kLCBpbnQgd2luZG93aWQgKTsKICAgIFFXU0NvbW1hbmQqIHJlYWRNb3JlQ29tbWFuZCgpOwoKICAgIGludCBjbGllbnRJZCgpIGNvbnN0IHsgcmV0dXJuIGNpZDsgfQoKICAgIFFXU0N1cnNvck1hcCBjdXJzb3JzOwkvLyBjdXJzb3JzIGRlZmluZWQgYnkgdGhpcyBjbGllbnQKc2lnbmFsczoKICAgIHZvaWQgY29ubmVjdGlvbkNsb3NlZCgpOwogICAgdm9pZCByZWFkeVJlYWQoKTsKcHJpdmF0ZSBzbG90czoKICAgIHZvaWQgY2xvc2VIYW5kbGVyKCk7CiAgICB2b2lkIGVycm9ySGFuZGxlciggaW50ICk7CnByaXZhdGU6CiAgICBpbnQgczsgLy8gWFhYIGNzb2NrZXQtPmQtPnNvY2tldC0+c29ja2V0KCkgaXMgdGhpcyB2YWx1ZQojaWZuZGVmIFFUX05PX1FXU19NVUxUSVBST0NFU1MKICAgIFFXU1NvY2tldCAqY3NvY2tldDsKI2VuZGlmCiAgICBRV1NDb21tYW5kKiBjb21tYW5kOwogICAgdWludCBpc0Nsb3NlZCA6IDE7CiAgICBRU3RyaW5nIGlkOwogICAgaW50IGNpZDsKfTsKCiNlbmRpZiAvLyBRV0lORE9XU1lTVEVNX1FXU19ICgAAACQAcQBzAHEAbABzAGUAbABlAGMAdABjAHUAcgBzAG8AcgAuAGgAAA4NLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVNRTFNFTEVDVENVUlNPUl9ICiNkZWZpbmUgUVNRTFNFTEVDVENVUlNPUl9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFzcWxjdXJzb3IuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZiAhZGVmaW5lZCggUVRfTU9EVUxFX1NRTCApIHx8IGRlZmluZWQoIFFUX0xJQ0VOU0VfUFJPRkVTU0lPTkFMICkKI2RlZmluZSBRTV9FWFBPUlRfU1FMCiNlbHNlCiNkZWZpbmUgUU1fRVhQT1JUX1NRTCBRX0VYUE9SVAojZW5kaWYKCiNpZm5kZWYgUVRfTk9fU1FMCgpjbGFzcyBRU3FsU2VsZWN0Q3Vyc29yUHJpdmF0ZTsKCmNsYXNzIFFNX0VYUE9SVF9TUUwgUVNxbFNlbGVjdEN1cnNvciA6IHB1YmxpYyBRU3FsQ3Vyc29yCnsKcHVibGljOgogICAgUVNxbFNlbGVjdEN1cnNvciggY29uc3QgUVN0cmluZyYgcXVlcnkgPSBRU3RyaW5nOjpudWxsLCBRU3FsRGF0YWJhc2UqIGRiID0gMCApOwogICAgUVNxbFNlbGVjdEN1cnNvciggY29uc3QgUVNxbFNlbGVjdEN1cnNvciYgb3RoZXIgKTsKICAgIH5RU3FsU2VsZWN0Q3Vyc29yKCk7CiAgICBib29sIGV4ZWMoIGNvbnN0IFFTdHJpbmcmIHF1ZXJ5ICk7CiAgICBib29sIHNlbGVjdCgpIHsgcmV0dXJuIFFTcWxDdXJzb3I6OnNlbGVjdCgpOyB9CiAgICAKcHJvdGVjdGVkOgogICAgUVNxbEluZGV4IHByaW1hcnlJbmRleCggYm9vbCA9IFRSVUUgKSBjb25zdCB7IHJldHVybiBRU3FsSW5kZXgoKTsgfQogICAgUVNxbEluZGV4IGluZGV4KCBjb25zdCBRU3RyaW5nTGlzdCYgKSBjb25zdCB7IHJldHVybiBRU3FsSW5kZXgoKTsgfQogICAgUVNxbEluZGV4IGluZGV4KCBjb25zdCBRU3RyaW5nJiApIGNvbnN0IHsgcmV0dXJuIFFTcWxJbmRleCgpOyB9CiAgICBRU3FsSW5kZXggaW5kZXgoIGNvbnN0IGNoYXIqICkgY29uc3QgeyByZXR1cm4gUVNxbEluZGV4KCk7IH0KICAgIHZvaWQgc2V0UHJpbWFyeUluZGV4KCBjb25zdCBRU3FsSW5kZXgmICkge30KICAgIHZvaWQgYXBwZW5kKCBjb25zdCBRU3FsRmllbGRJbmZvJiApIHt9CiAgICB2b2lkIGluc2VydCggaW50LCBjb25zdCBRU3FsRmllbGRJbmZvJiApIHt9CiAgICB2b2lkIHJlbW92ZSggaW50ICkge30KICAgIHZvaWQgY2xlYXIoKSB7fQogICAgdm9pZCBzZXRHZW5lcmF0ZWQoIGNvbnN0IFFTdHJpbmcmLCBib29sICkge30KICAgIHZvaWQgc2V0R2VuZXJhdGVkKCBpbnQsIGJvb2wgKSB7fQogICAgUVNxbFJlY29yZCoJZWRpdEJ1ZmZlciggYm9vbCA9IEZBTFNFICkgeyByZXR1cm4gMDsgfQogICAgUVNxbFJlY29yZCoJcHJpbWVJbnNlcnQoKSB7IHJldHVybiAwOyB9CiAgICBRU3FsUmVjb3JkKglwcmltZVVwZGF0ZSgpIHsgcmV0dXJuIDA7IH0KICAgIFFTcWxSZWNvcmQqCXByaW1lRGVsZXRlKCkgeyByZXR1cm4gMDsgfQogICAgaW50CWluc2VydCggYm9vbCA9IFRSVUUgKSB7IHJldHVybiAwOyB9CiAgICBpbnQJdXBkYXRlKCBib29sID0gVFJVRSApIHsgcmV0dXJuIDA7IH0KICAgIGludAlkZWwoIGJvb2wgPSBUUlVFICkgeyByZXR1cm4gMDsgfQogICAgdm9pZCBzZXRNb2RlKCBpbnQgKSB7fQoKICAgIHZvaWQgc2V0U29ydCggY29uc3QgUVNxbEluZGV4JiApIHt9CiAgICBRU3FsSW5kZXggc29ydCgpIGNvbnN0IHsgcmV0dXJuIFFTcWxJbmRleCgpOyB9CiAgICB2b2lkIHNldEZpbHRlciggY29uc3QgUVN0cmluZyYgKSB7fQogICAgUVN0cmluZyBmaWx0ZXIoKSBjb25zdCB7IHJldHVybiBRU3RyaW5nOjpudWxsOyB9CiAgICB2b2lkIHNldE5hbWUoIGNvbnN0IFFTdHJpbmcmLCBib29sID0gVFJVRSApIHt9CiAgICBRU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBRU3RyaW5nOjpudWxsOyB9CiAgICBRU3RyaW5nIHRvU3RyaW5nKCBjb25zdCBRU3RyaW5nJiA9IFFTdHJpbmc6Om51bGwsIGNvbnN0IFFTdHJpbmcmID0gIiwiICkgY29uc3QgeyByZXR1cm4gUVN0cmluZzo6bnVsbDsgfQogICAgYm9vbCBzZWxlY3QoIGNvbnN0IFFTdHJpbmcgJiwgY29uc3QgUVNxbEluZGV4JiA9IFFTcWxJbmRleCgpICk7Cgpwcml2YXRlOgogICAgdm9pZCBwb3B1bGF0ZUN1cnNvcigpOwogICAgCiAgICBRU3FsU2VsZWN0Q3Vyc29yUHJpdmF0ZSAqIGQ7Cn07CgojZW5kaWYgLy8gUVRfTk9fU1FMCiNlbmRpZiAvLyBRU1FMU0VMRUNUQ1VSU09SX0gKAAAAGgBxAHcAcwBnAGYAeABfAHEAbgB4ADYALgBoAAAL2y8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFXU0dGWF9RTlg2X0gKI2RlZmluZSBRV1NHRlhfUU5YNl9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgPGRpc3BsYXkuaD4KI2luY2x1ZGUgPGRpc3B1dGlsLmg+CiNpbmNsdWRlIDxxZ2Z4cmFzdGVyX3F3cy5oPgojaW5jbHVkZSA8cWdmeF9xd3MuaD4KI2luY2x1ZGUgPHFwb2x5Z29uc2Nhbm5lci5oPgojaW5jbHVkZSA8cXBlbi5oPgojaW5jbHVkZSA8cXN0cmluZy5oPgojZW5kaWYgLy8gUVRfSAoKLy8gUW54RmIgR2Z4IGNsYXNzCnRlbXBsYXRlIDxjb25zdCBpbnQgZGVwdGgsIGNvbnN0IGludCB0eXBlPgpjbGFzcyBRUW54RmJHZnggOiBwdWJsaWMgUUdmeFJhc3RlcjxkZXB0aCwgdHlwZT4gewogICAgcHVibGljOgoJUVFueEZiR2Z4KCk7Cgl+UVFueEZiR2Z4KCk7CgoJaW50IGJpdERlcHRoKCl7IHJldHVybiBESVNQX0JJVFNfUEVSX1BJWEVMICggY3R4LmRzdXJmLT5waXhlbF9mb3JtYXQgKTt9OwoKCXZvaWQgc3luYyAoKTsKLy8Jdm9pZCBmaWxsUmVjdCAoaW50LGludCxpbnQsaW50KTsKLy8Jdm9pZCBibHQgKGludCxpbnQsaW50LGludCxpbnQsaW50KTsKLy8Jdm9pZCBobGluZVVuY2xpcHBlZCAoIGludCwgaW50LCBpbnQpOwoKICAgIHByaXZhdGU6CglkaXNwX2RyYXdfY29udGV4dF90IGN0eDsKfTsKCi8vIFNjcmVlbiBjbGFzcwpjbGFzcyBRUW54U2NyZWVuIDogcHVibGljIFFTY3JlZW4gewogICAgcHVibGljOgoJUVFueFNjcmVlbihpbnQgZGlzcGxheV9pZCk6UVNjcmVlbihkaXNwbGF5X2lkKXt9OwoJflFRbnhTY3JlZW4oKXt9OwoKCWJvb2wgY29ubmVjdChjb25zdCBRU3RyaW5nICYgc3BlYyk7Cgl2b2lkIGRpc2Nvbm5lY3QoKTsKCglib29sIGluaXREZXZpY2UoKTsKCXZvaWQgc2h1dGRvd25EZXZpY2UoKTsKCXZvaWQgc2V0TW9kZShpbnQsIGludCwgaW50KTsKCglRR2Z4KiBjcmVhdGVHZnggKHVuc2lnbmVkIGNoYXIqLCBpbnQsIGludCwgaW50LCBpbnQpOwoKCWludCBpbml0Q3Vyc29yKHZvaWQgKiwgYm9vbCk7Cn07CgojaWZuZGVmIFFUX05PX1FXU19DVVJTT1IKY2xhc3MgUVFueEN1cnNvciA6IHB1YmxpYyBRU2NyZWVuQ3Vyc29yCnsKcHVibGljOgogICAgUVFueEN1cnNvcigpe307CiAgICB+UVFueEN1cnNvcigpe307CgogICAgdmlydHVhbCB2b2lkIGluaXQoU1dDdXJzb3JEYXRhICosYm9vbD1GQUxTRSk7CgogICAgdmlydHVhbCB2b2lkIHNldCggY29uc3QgUUltYWdlICZpbWFnZSwgaW50IGhvdHgsIGludCBob3R5ICk7CiAgICB2aXJ0dWFsIHZvaWQgbW92ZSggaW50IHgsIGludCB5ICk7CiAgICB2aXJ0dWFsIHZvaWQgc2hvdygpOwogICAgdmlydHVhbCB2b2lkIGhpZGUoKTsKCiAgICB2aXJ0dWFsIGJvb2wgcmVzdG9yZVVuZGVyKCBjb25zdCBRUmVjdCAmLCBRR2Z4UmFzdGVyQmFzZSAqID0gMCApCiAgICAgICAgICAgICAgICB7IHJldHVybiBGQUxTRTsgfQogICAgdmlydHVhbCB2b2lkIHNhdmVVbmRlcigpIHt9CiAgICB2aXJ0dWFsIHZvaWQgZHJhd0N1cnNvcigpIHt9CiAgICB2aXJ0dWFsIHZvaWQgZHJhdygpIHt9CiAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNBbHBoYUN1cnNvcigpIHsgcmV0dXJuIEZBTFNFOyB9CgogICAgc3RhdGljIGJvb2wgZW5hYmxlZCgpIHsgcmV0dXJuIEZBTFNFOyB9Cgpwcml2YXRlOgogICAgaW50IGhvdHg7CiAgICBpbnQgaG90eTsKICAgIFFCaXRBcnJheSBjdXJzb3IsbWFzazsKICAgIFFDb2xvciBjb2xvdXIwLGNvbG91cjE7Cn07CgojZW5kaWYgLy8gUVRfTk9fUVdTX0NVUlNPUgoKI2VuZGlmIC8vIFFXU0dGWF9RTlg2X0gKAAAAFgBxAHMAcQBsAHEAdQBlAHIAeQAuAGgAABBuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRU1FMUVVFUllfSAojZGVmaW5lIFFTUUxRVUVSWV9ICgojaWZuZGVmIFFUX0gKI2luY2x1ZGUgInFvYmplY3QuaCIKI2luY2x1ZGUgInFzdHJpbmcuaCIKI2luY2x1ZGUgInF2YXJpYW50LmgiCiNpbmNsdWRlICJxdmFsdWVsaXN0LmgiCiNpbmNsdWRlICJxc3FsZXJyb3IuaCIKI2luY2x1ZGUgInFzcWxmaWVsZC5oIgojaW5jbHVkZSAicXNxbC5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19TUUwKCmNsYXNzIFFTcWxEcml2ZXI7CmNsYXNzIFFTcWxSZXN1bHQ7CmNsYXNzIFFTcWxEYXRhYmFzZTsKCmNsYXNzIFFfRVhQT1JUIFFTcWxSZXN1bHRTaGFyZWQgOiBwdWJsaWMgUU9iamVjdCwgcHVibGljIFFTaGFyZWQKewogICAgUV9PQkpFQ1QKcHVibGljOgogICAgUVNxbFJlc3VsdFNoYXJlZCggUVNxbFJlc3VsdCogcmVzdWx0ICk7CiAgICB2aXJ0dWFsIH5RU3FsUmVzdWx0U2hhcmVkKCk7CiAgICBRU3FsUmVzdWx0KiBzcWxSZXN1bHQ7CiAgICBRU3RyaW5nIGV4ZWN1dGVkUXVlcnk7CnByaXZhdGUgc2xvdHM6CiAgICB2b2lkIHNsb3RSZXN1bHREZXN0cm95ZWQoKTsKfTsKCmNsYXNzIFFfRVhQT1JUIFFTcWxRdWVyeQp7CnB1YmxpYzoKICAgIFFTcWxRdWVyeSggUVNxbFJlc3VsdCAqIHIgKTsKICAgIFFTcWxRdWVyeSggY29uc3QgUVN0cmluZyYgcXVlcnkgPSBRU3RyaW5nOjpudWxsLCBRU3FsRGF0YWJhc2UqIGRiID0gMCApOwogICAgUV9FWFBMSUNJVCBRU3FsUXVlcnkoIFFTcWxEYXRhYmFzZSogZGIgKTsKICAgIFFTcWxRdWVyeSggY29uc3QgUVNxbFF1ZXJ5JiBvdGhlciApOwogICAgUVNxbFF1ZXJ5JiBvcGVyYXRvcj0oIGNvbnN0IFFTcWxRdWVyeSYgb3RoZXIgKTsKICAgIHZpcnR1YWwgflFTcWxRdWVyeSgpOwoKICAgIGJvb2wgICAgICAgICAgICAgICAgaXNWYWxpZCgpIGNvbnN0OwogICAgYm9vbCAgICAgICAgICAgICAgICBpc0FjdGl2ZSgpIGNvbnN0OwogICAgYm9vbAkgICAgICAgIGlzTnVsbCggaW50IGZpZWxkICkgY29uc3Q7CiAgICBpbnQgICAgICAgICAgICAgICAgIGF0KCkgY29uc3Q7CiAgICBRU3RyaW5nICAgICAgICAgICAgIGxhc3RRdWVyeSgpIGNvbnN0OwogICAgaW50ICAgICAgICAgICAgICAgICBudW1Sb3dzQWZmZWN0ZWQoKSBjb25zdDsKICAgIFFTcWxFcnJvcgkgICAgICAgIGxhc3RFcnJvcigpIGNvbnN0OwogICAgYm9vbCAgICAgICAgICAgICAgICBpc1NlbGVjdCgpIGNvbnN0OwogICAgaW50ICAgICAgICAgICAgICAgICBzaXplKCkgY29uc3Q7CiAgICBjb25zdCBRU3FsRHJpdmVyKiAgIGRyaXZlcigpIGNvbnN0OwogICAgY29uc3QgUVNxbFJlc3VsdCogICByZXN1bHQoKSBjb25zdDsKICAgIGJvb2wJCWlzRm9yd2FyZE9ubHkoKSBjb25zdDsKICAgIHZvaWQJCXNldEZvcndhcmRPbmx5KCBib29sIGZvcndhcmQgKTsKCiAgICB2aXJ0dWFsIGJvb2wJZXhlYyAoIGNvbnN0IFFTdHJpbmcmIHF1ZXJ5ICk7CiAgICB2aXJ0dWFsIFFWYXJpYW50ICAgIHZhbHVlKCBpbnQgaSApIGNvbnN0OwoKICAgIHZpcnR1YWwgYm9vbAlzZWVrKCBpbnQgaSwgYm9vbCByZWxhdGl2ZSA9IEZBTFNFICk7CiAgICB2aXJ0dWFsIGJvb2wgICAgICAgIG5leHQoKTsKICAgIHZpcnR1YWwgYm9vbCAgICAgICAgcHJldigpOwogICAgdmlydHVhbCBib29sICAgICAgICBmaXJzdCgpOwogICAgdmlydHVhbCBib29sICAgICAgICBsYXN0KCk7CgogICAgLy8gcHJlcGFyZWQgcXVlcnkgc3VwcG9ydAogICAgYm9vbAkJZXhlYygpOwogICAgYm9vbAkJcHJlcGFyZSggY29uc3QgUVN0cmluZyYgcXVlcnkgKTsKICAgIHZvaWQJCWJpbmRWYWx1ZSggY29uc3QgUVN0cmluZyYgcGxhY2Vob2xkZXIsIGNvbnN0IFFWYXJpYW50JiB2YWwgKTsKICAgIHZvaWQJCWJpbmRWYWx1ZSggaW50IHBvcywgY29uc3QgUVZhcmlhbnQmIHZhbCApOwogICAgdm9pZAkJYWRkQmluZFZhbHVlKCBjb25zdCBRVmFyaWFudCYgdmFsICk7CiAgICAvLyByZW1vdmUgdGhlc2Ugb3ZlcmxvYWRzIGluIDQuMAogICAgdm9pZAkJYmluZFZhbHVlKCBjb25zdCBRU3RyaW5nJiBwbGFjZWhvbGRlciwgY29uc3QgUVZhcmlhbnQmIHZhbCwgUVNxbDo6UGFyYW1ldGVyVHlwZSB0eXBlICk7CiAgICB2b2lkCQliaW5kVmFsdWUoIGludCBwb3MsIGNvbnN0IFFWYXJpYW50JiB2YWwsIFFTcWw6OlBhcmFtZXRlclR5cGUgdHlwZSApOwogICAgdm9pZAkJYWRkQmluZFZhbHVlKCBjb25zdCBRVmFyaWFudCYgdmFsLCBRU3FsOjpQYXJhbWV0ZXJUeXBlIHR5cGUgKTsKICAgIFFWYXJpYW50CQlib3VuZFZhbHVlKCBjb25zdCBRU3RyaW5nJiBwbGFjZWhvbGRlciApIGNvbnN0OwogICAgUVZhcmlhbnQJCWJvdW5kVmFsdWUoIGludCBwb3MgKSBjb25zdDsKICAgIFFNYXA8UVN0cmluZywgUVZhcmlhbnQ+IGJvdW5kVmFsdWVzKCkgY29uc3Q7CiAgICBRU3RyaW5nICAgICAgICAgICAgIGV4ZWN1dGVkUXVlcnkoKSBjb25zdDsKICAgIApwcm90ZWN0ZWQ6CiAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGJlZm9yZVNlZWsoKTsKICAgIHZpcnR1YWwgdm9pZCAgICAgICAgYWZ0ZXJTZWVrKCk7Cgpwcml2YXRlOgogICAgdm9pZCAJCWluaXQoIGNvbnN0IFFTdHJpbmcmIHF1ZXJ5LCBRU3FsRGF0YWJhc2UqIGRiICk7CiAgICB2b2lkICAgICAgICAgICAgICAgIGRlcmVmKCk7CiAgICBib29sICAgICAgICAgICAgICAgIGNoZWNrRGV0YWNoKCk7CiAgICBRU3FsUmVzdWx0U2hhcmVkKiAgIGQ7Cn07CgoKI2VuZGlmIC8vIFFUX05PX1NRTAojZW5kaWYKAAAAEgBxAHMAdAByAGkAbgBnAC4AaAAAjTsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFTVFJJTkdfSAojZGVmaW5lIFFTVFJJTkdfSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxY3N0cmluZy5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19DQVNUX0FTQ0lJCiNpbmNsdWRlIDxsaW1pdHMuaD4KI2VuZGlmCgojaWZuZGVmIFFUX05PX1NUTAojaWYgZGVmaW5lZCAoIFFfQ0NfTVNWQ19ORVQgKSAmJiBfTVNWX1ZFUiA8IDEzMTAgLy8gQXZvaWRzIG5hc3R5IHdhcm5pbmcgZm9yIHhsb2NhbGUsIGxpbmUgNDUwCiMgIHByYWdtYSB3YXJuaW5nICggcHVzaCApCiMgIHByYWdtYSB3YXJuaW5nICggZGlzYWJsZSA6IDQxODkgKQojICBpbmNsdWRlIDxzdHJpbmc+CiMgIHByYWdtYSB3YXJuaW5nICggcG9wICkKI2Vsc2UKIyAgaW5jbHVkZSA8c3RyaW5nPgojZW5kaWYKI2lmIGRlZmluZWQoUV9XUk9OR19TQl9DVFlQRV9NQUNST1MpICYmIGRlZmluZWQoX1NCX0NUWVBFX01BQ1JPUykKI3VuZGVmIF9TQl9DVFlQRV9NQUNST1MKI2VuZGlmCiNlbmRpZgoKCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKY2xhc3MgUVJlZ0V4cDsKY2xhc3MgUVN0cmluZzsKY2xhc3MgUUNoYXJSZWY7CnRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBRRGVlcENvcHk7CgpjbGFzcyBRX0VYUE9SVCBRQ2hhciB7CnB1YmxpYzoKICAgIFFDaGFyKCk7CiAgICBRQ2hhciggY2hhciBjICk7CiAgICBRQ2hhciggdWNoYXIgYyApOwogICAgUUNoYXIoIHVjaGFyIGMsIHVjaGFyIHIgKTsKICAgIFFDaGFyKCBjb25zdCBRQ2hhciYgYyApOyAvLyAjIyMgcmVtb3ZlIGluIDQuMCB0byBhbGxvdyBjb21waWxlciBvcHRpbWl6YXRpb24KICAgIFFDaGFyKCB1c2hvcnQgcmMgKTsKICAgIFFDaGFyKCBzaG9ydCByYyApOwogICAgUUNoYXIoIHVpbnQgcmMgKTsKICAgIFFDaGFyKCBpbnQgcmMgKTsKCiAgICBRVF9TVEFUSUNfQ09OU1QgUUNoYXIgbnVsbDsgICAgICAgICAgICAvLyAwMDAwCiAgICBRVF9TVEFUSUNfQ09OU1QgUUNoYXIgcmVwbGFjZW1lbnQ7ICAgICAvLyBGRkZECiAgICBRVF9TVEFUSUNfQ09OU1QgUUNoYXIgYnl0ZU9yZGVyTWFyazsgICAgIC8vIEZFRkYKICAgIFFUX1NUQVRJQ19DT05TVCBRQ2hhciBieXRlT3JkZXJTd2FwcGVkOyAgICAgLy8gRkZGRQogICAgUVRfU1RBVElDX0NPTlNUIFFDaGFyIG5ic3A7ICAgICAgICAgICAgLy8gMDBBMAoKICAgIC8vIFVuaWNvZGUgaW5mb3JtYXRpb24KCiAgICBlbnVtIENhdGVnb3J5CiAgICB7CiAgICAgICAgTm9DYXRlZ29yeSwKCiAgICAgICAgTWFya19Ob25TcGFjaW5nLCAgICAgICAgICAvLyAgIE1uCiAgICAgICAgTWFya19TcGFjaW5nQ29tYmluaW5nLCAgICAvLyAgIE1jCiAgICAgICAgTWFya19FbmNsb3NpbmcsICAgICAgICAgICAvLyAgIE1lCgogICAgICAgIE51bWJlcl9EZWNpbWFsRGlnaXQsICAgICAgLy8gICBOZAogICAgICAgIE51bWJlcl9MZXR0ZXIsICAgICAgICAgICAgLy8gICBObAogICAgICAgIE51bWJlcl9PdGhlciwgICAgICAgICAgICAgLy8gICBObwoKICAgICAgICBTZXBhcmF0b3JfU3BhY2UsICAgICAgICAgIC8vICAgWnMKICAgICAgICBTZXBhcmF0b3JfTGluZSwgICAgICAgICAgIC8vICAgWmwKICAgICAgICBTZXBhcmF0b3JfUGFyYWdyYXBoLCAgICAgIC8vICAgWnAKCiAgICAgICAgT3RoZXJfQ29udHJvbCwgICAgICAgICAgICAvLyAgIENjCiAgICAgICAgT3RoZXJfRm9ybWF0LCAgICAgICAgICAgICAvLyAgIENmCiAgICAgICAgT3RoZXJfU3Vycm9nYXRlLCAgICAgICAgICAvLyAgIENzCiAgICAgICAgT3RoZXJfUHJpdmF0ZVVzZSwgICAgICAgICAvLyAgIENvCiAgICAgICAgT3RoZXJfTm90QXNzaWduZWQsICAgICAgICAvLyAgIENuCgogICAgICAgIExldHRlcl9VcHBlcmNhc2UsICAgICAgICAgLy8gICBMdQogICAgICAgIExldHRlcl9Mb3dlcmNhc2UsICAgICAgICAgLy8gICBMbAogICAgICAgIExldHRlcl9UaXRsZWNhc2UsICAgICAgICAgLy8gICBMdAogICAgICAgIExldHRlcl9Nb2RpZmllciwgICAgICAgICAgLy8gICBMbQogICAgICAgIExldHRlcl9PdGhlciwgICAgICAgICAgICAgLy8gICBMbwoKICAgICAgICBQdW5jdHVhdGlvbl9Db25uZWN0b3IsICAgIC8vICAgUGMKICAgICAgICBQdW5jdHVhdGlvbl9EYXNoLCAgICAgICAgIC8vICAgUGQKICAgICAgICBQdW5jdHVhdGlvbl9EYXNrID0gUHVuY3R1YXRpb25fRGFzaCwgLy8gb29wcwogICAgICAgIFB1bmN0dWF0aW9uX09wZW4sICAgICAgICAgLy8gICBQcwogICAgICAgIFB1bmN0dWF0aW9uX0Nsb3NlLCAgICAgICAgLy8gICBQZQogICAgICAgIFB1bmN0dWF0aW9uX0luaXRpYWxRdW90ZSwgLy8gICBQaQogICAgICAgIFB1bmN0dWF0aW9uX0ZpbmFsUXVvdGUsICAgLy8gICBQZgogICAgICAgIFB1bmN0dWF0aW9uX090aGVyLCAgICAgICAgLy8gICBQbwoKICAgICAgICBTeW1ib2xfTWF0aCwgICAgICAgICAgICAgIC8vICAgU20KICAgICAgICBTeW1ib2xfQ3VycmVuY3ksICAgICAgICAgIC8vICAgU2MKICAgICAgICBTeW1ib2xfTW9kaWZpZXIsICAgICAgICAgIC8vICAgU2sKICAgICAgICBTeW1ib2xfT3RoZXIgICAgICAgICAgICAgIC8vICAgU28KICAgIH07CgogICAgZW51bSBEaXJlY3Rpb24KICAgIHsKICAgICAgICBEaXJMLCBEaXJSLCBEaXJFTiwgRGlyRVMsIERpckVULCBEaXJBTiwgRGlyQ1MsIERpckIsIERpclMsIERpcldTLCBEaXJPTiwKICAgICAgICBEaXJMUkUsIERpckxSTywgRGlyQUwsIERpclJMRSwgRGlyUkxPLCBEaXJQREYsIERpck5TTSwgRGlyQk4KICAgIH07CgogICAgZW51bSBEZWNvbXBvc2l0aW9uCiAgICB7CiAgICAgICAgU2luZ2xlLCBDYW5vbmljYWwsIEZvbnQsIE5vQnJlYWssIEluaXRpYWwsIE1lZGlhbCwKICAgICAgICBGaW5hbCwgSXNvbGF0ZWQsIENpcmNsZSwgU3VwZXIsIFN1YiwgVmVydGljYWwsCiAgICAgICAgV2lkZSwgTmFycm93LCBTbWFsbCwgU3F1YXJlLCBDb21wYXQsIEZyYWN0aW9uCiAgICB9OwoKICAgIGVudW0gSm9pbmluZwogICAgewogICAgICAgIE90aGVySm9pbmluZywgRHVhbCwgUmlnaHQsIENlbnRlcgogICAgfTsKCiAgICBlbnVtIENvbWJpbmluZ0NsYXNzCiAgICB7CiAgICAgICAgQ29tYmluaW5nX0JlbG93TGVmdEF0dGFjaGVkICAgICAgID0gMjAwLAogICAgICAgIENvbWJpbmluZ19CZWxvd0F0dGFjaGVkICAgICAgICAgICA9IDIwMiwKICAgICAgICBDb21iaW5pbmdfQmVsb3dSaWdodEF0dGFjaGVkICAgICAgPSAyMDQsCiAgICAgICAgQ29tYmluaW5nX0xlZnRBdHRhY2hlZCAgICAgICAgICAgID0gMjA4LAogICAgICAgIENvbWJpbmluZ19SaWdodEF0dGFjaGVkICAgICAgICAgICA9IDIxMCwKICAgICAgICBDb21iaW5pbmdfQWJvdmVMZWZ0QXR0YWNoZWQgICAgICAgPSAyMTIsCiAgICAgICAgQ29tYmluaW5nX0Fib3ZlQXR0YWNoZWQgICAgICAgICAgID0gMjE0LAogICAgICAgIENvbWJpbmluZ19BYm92ZVJpZ2h0QXR0YWNoZWQgICAgICA9IDIxNiwKCiAgICAgICAgQ29tYmluaW5nX0JlbG93TGVmdCAgICAgICAgICAgICAgID0gMjE4LAogICAgICAgIENvbWJpbmluZ19CZWxvdyAgICAgICAgICAgICAgICAgICA9IDIyMCwKICAgICAgICBDb21iaW5pbmdfQmVsb3dSaWdodCAgICAgICAgICAgICAgPSAyMjIsCiAgICAgICAgQ29tYmluaW5nX0xlZnQgICAgICAgICAgICAgICAgICAgID0gMjI0LAogICAgICAgIENvbWJpbmluZ19SaWdodCAgICAgICAgICAgICAgICAgICA9IDIyNiwKICAgICAgICBDb21iaW5pbmdfQWJvdmVMZWZ0ICAgICAgICAgICAgICAgPSAyMjgsCiAgICAgICAgQ29tYmluaW5nX0Fib3ZlICAgICAgICAgICAgICAgICAgID0gMjMwLAogICAgICAgIENvbWJpbmluZ19BYm92ZVJpZ2h0ICAgICAgICAgICAgICA9IDIzMiwKCiAgICAgICAgQ29tYmluaW5nX0RvdWJsZUJlbG93ICAgICAgICAgICAgID0gMjMzLAogICAgICAgIENvbWJpbmluZ19Eb3VibGVBYm92ZSAgICAgICAgICAgICA9IDIzNCwKICAgICAgICBDb21iaW5pbmdfSW90YVN1YnNjcmlwdCAgICAgICAgICAgPSAyNDAKICAgIH07CgogICAgLy8gKioqKioqIFdIRU4gQURESU5HIEZVTkNUSU9OUywgQ09OU0lERVIgQURESU5HIFRPIFFDaGFyUmVmIFRPTwoKICAgIGludCBkaWdpdFZhbHVlKCkgY29uc3Q7CiAgICBRQ2hhciBsb3dlcigpIGNvbnN0OwogICAgUUNoYXIgdXBwZXIoKSBjb25zdDsKCiAgICBDYXRlZ29yeSBjYXRlZ29yeSgpIGNvbnN0OwogICAgRGlyZWN0aW9uIGRpcmVjdGlvbigpIGNvbnN0OwogICAgSm9pbmluZyBqb2luaW5nKCkgY29uc3Q7CiAgICBib29sIG1pcnJvcmVkKCkgY29uc3Q7CiAgICBRQ2hhciBtaXJyb3JlZENoYXIoKSBjb25zdDsKICAgIGNvbnN0IFFTdHJpbmcgJmRlY29tcG9zaXRpb24oKSBjb25zdDsgLy8gIyMjIHJldHVybiBqdXN0IFFTdHJpbmcgaW4gNC4wCiAgICBEZWNvbXBvc2l0aW9uIGRlY29tcG9zaXRpb25UYWcoKSBjb25zdDsKICAgIHVuc2lnbmVkIGNoYXIgY29tYmluaW5nQ2xhc3MoKSBjb25zdDsKCiAgICBjaGFyIGxhdGluMSgpIGNvbnN0IHsgcmV0dXJuIHVjcyA+IDB4ZmYgPyAwIDogKGNoYXIpIHVjczsgfQogICAgdXNob3J0IHVuaWNvZGUoKSBjb25zdCB7IHJldHVybiB1Y3M7IH0KI2lmZGVmIFFfTk9fUEFDS0VEX1JFRkVSRU5DRQogICAgdXNob3J0ICZ1bmljb2RlKCkgeyByZXR1cm4gKigmdWNzKTsgfQojZWxzZQogICAgdXNob3J0ICZ1bmljb2RlKCkgeyByZXR1cm4gdWNzOyB9CiNlbmRpZgojaWZuZGVmIFFUX05PX0NBU1RfQVNDSUkKICAgIC8vIGxpa2UgYWxsIGlmZGVmJ2QgY29kZSB0aGlzIGlzIHVuZG9jdW1lbnRlZAogICAgb3BlcmF0b3IgY2hhcigpIGNvbnN0IHsgcmV0dXJuIGxhdGluMSgpOyB9CiNlbmRpZgoKICAgIGJvb2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4gdW5pY29kZSgpPT0wOyB9CiAgICBib29sIGlzUHJpbnQoKSBjb25zdDsKICAgIGJvb2wgaXNQdW5jdCgpIGNvbnN0OwogICAgYm9vbCBpc1NwYWNlKCkgY29uc3Q7CiAgICBib29sIGlzTWFyaygpIGNvbnN0OwogICAgYm9vbCBpc0xldHRlcigpIGNvbnN0OwogICAgYm9vbCBpc051bWJlcigpIGNvbnN0OwogICAgYm9vbCBpc0xldHRlck9yTnVtYmVyKCkgY29uc3Q7CiAgICBib29sIGlzRGlnaXQoKSBjb25zdDsKICAgIGJvb2wgaXNTeW1ib2woKSBjb25zdDsKCiAgICB1Y2hhciBjZWxsKCkgY29uc3QgeyByZXR1cm4gKCh1Y2hhcikgdWNzICYgMHhmZik7IH0KICAgIHVjaGFyIHJvdygpIGNvbnN0IHsgcmV0dXJuICgodWNoYXIpICh1Y3M+PjgpJjB4ZmYpOyB9CiAgICB2b2lkIHNldENlbGwoIHVjaGFyIGNlbGwgKSB7IHVjcyA9ICh1Y3MgJiAweGZmMDApICsgY2VsbDsgfQogICAgdm9pZCBzZXRSb3coIHVjaGFyIHJvdyApIHsgdWNzID0gKCgodXNob3J0KSByb3cpPDw4KSArICh1Y3MmMHhmZik7IH0KCiAgICBzdGF0aWMgYm9vbCBuZXR3b3JrT3JkZXJlZCgpIHsKCWludCB3b3JkU2l6ZTsKCWJvb2wgYmlnRW5kaWFuID0gRkFMU0U7CglxU3lzSW5mbyggJndvcmRTaXplLCAmYmlnRW5kaWFuICk7CglyZXR1cm4gYmlnRW5kaWFuOwogICAgfQoKICAgIGZyaWVuZCBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KCBjaGFyIGNoLCBRQ2hhciBjICk7CiAgICBmcmllbmQgaW5saW5lIGJvb2wgb3BlcmF0b3I9PSggUUNoYXIgYywgY2hhciBjaCApOwogICAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yPT0oIFFDaGFyIGMxLCBRQ2hhciBjMiApOwogICAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yIT0oIFFDaGFyIGMxLCBRQ2hhciBjMiApOwogICAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yIT0oIGNoYXIgY2gsIFFDaGFyIGMgKTsKICAgIGZyaWVuZCBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KCBRQ2hhciBjLCBjaGFyIGNoICk7CiAgICBmcmllbmQgaW5saW5lIGJvb2wgb3BlcmF0b3I8PSggUUNoYXIgYywgY2hhciBjaCApOwogICAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yPD0oIGNoYXIgY2gsIFFDaGFyIGMgKTsKICAgIGZyaWVuZCBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KCBRQ2hhciBjMSwgUUNoYXIgYzIgKTsKCnByaXZhdGU6CiAgICB1c2hvcnQgdWNzOwojaWYgZGVmaW5lZChRVF9RU1RSSU5HX1VDU180KQogICAgdXNob3J0IGdycDsKI2VuZGlmCn0gUV9QQUNLRUQ7CgppbmxpbmUgUUNoYXI6OlFDaGFyKCkgOiB1Y3MoIDAgKQojaWZkZWYgUVRfUVNUUklOR19VQ1NfNAogICAgLCBncnAoIDAgKQojZW5kaWYKewp9CmlubGluZSBRQ2hhcjo6UUNoYXIoIGNoYXIgYyApIDogdWNzKCAodWNoYXIpYyApCiNpZmRlZiBRVF9RU1RSSU5HX1VDU180CiAgICAsIGdycCggMCApCiNlbmRpZgp7Cn0KaW5saW5lIFFDaGFyOjpRQ2hhciggdWNoYXIgYyApIDogdWNzKCBjICkKI2lmZGVmIFFUX1FTVFJJTkdfVUNTXzQKICAgICwgZ3JwKCAwICkKI2VuZGlmCnsKfQppbmxpbmUgUUNoYXI6OlFDaGFyKCB1Y2hhciBjLCB1Y2hhciByICkgOiB1Y3MoIChyIDw8IDgpIHwgYyApCiNpZmRlZiBRVF9RU1RSSU5HX1VDU180CiAgICAsIGdycCggMCApCiNlbmRpZgp7Cn0KaW5saW5lIFFDaGFyOjpRQ2hhciggY29uc3QgUUNoYXImIGMgKSA6IHVjcyggYy51Y3MgKQojaWZkZWYgUVRfUVNUUklOR19VQ1NfNAogICAsIGdycCggYy5ncnAgKQojZW5kaWYKewp9CgppbmxpbmUgUUNoYXI6OlFDaGFyKCB1c2hvcnQgcmMgKSA6IHVjcyggcmMgKQojaWZkZWYgUVRfUVNUUklOR19VQ1NfNAogICAgLCBncnAoIDAgKQojZW5kaWYKewp9CmlubGluZSBRQ2hhcjo6UUNoYXIoIHNob3J0IHJjICkgOiB1Y3MoICh1c2hvcnQpIHJjICkKI2lmZGVmIFFUX1FTVFJJTkdfVUNTXzQKICAgICwgZ3JwKCAwICkKI2VuZGlmCnsKfQppbmxpbmUgUUNoYXI6OlFDaGFyKCB1aW50IHJjICkgOiB1Y3MoICAodXNob3J0ICkgKHJjICYgMHhmZmZmKSApCiNpZmRlZiBRVF9RU1RSSU5HX1VDU180CiAgICAsIGdycCggKHVzaG9ydCkgKChyYyA+PiAxNikgJiAweGZmZmYpICkKI2VuZGlmCnsKfQppbmxpbmUgUUNoYXI6OlFDaGFyKCBpbnQgcmMgKSA6IHVjcyggKHVzaG9ydCkgKHJjICYgMHhmZmZmKSApCiNpZmRlZiBRVF9RU1RSSU5HX1VDU180CiAgICAsIGdycCggKHVzaG9ydCkgKChyYyA+PiAxNikgJiAweGZmZmYpICkKI2VuZGlmCnsKfQoKaW5saW5lIGJvb2wgb3BlcmF0b3I9PSggY2hhciBjaCwgUUNoYXIgYyApCnsKICAgIHJldHVybiAoKHVjaGFyKSBjaCkgPT0gYy51Y3M7Cn0KCmlubGluZSBib29sIG9wZXJhdG9yPT0oIFFDaGFyIGMsIGNoYXIgY2ggKQp7CiAgICByZXR1cm4gKCh1Y2hhcikgY2gpID09IGMudWNzOwp9CgppbmxpbmUgYm9vbCBvcGVyYXRvcj09KCBRQ2hhciBjMSwgUUNoYXIgYzIgKQp7CiAgICByZXR1cm4gYzEudWNzID09IGMyLnVjczsKfQoKaW5saW5lIGJvb2wgb3BlcmF0b3IhPSggUUNoYXIgYzEsIFFDaGFyIGMyICkKewogICAgcmV0dXJuIGMxLnVjcyAhPSBjMi51Y3M7Cn0KCmlubGluZSBib29sIG9wZXJhdG9yIT0oIGNoYXIgY2gsIFFDaGFyIGMgKQp7CiAgICByZXR1cm4gKCh1Y2hhciljaCkgIT0gYy51Y3M7Cn0KCmlubGluZSBib29sIG9wZXJhdG9yIT0oIFFDaGFyIGMsIGNoYXIgY2ggKQp7CiAgICByZXR1cm4gKCh1Y2hhcikgY2gpICE9IGMudWNzOwp9CgppbmxpbmUgYm9vbCBvcGVyYXRvcjw9KCBRQ2hhciBjLCBjaGFyIGNoICkKewogICAgcmV0dXJuIGMudWNzIDw9ICgodWNoYXIpIGNoKTsKfQoKaW5saW5lIGJvb2wgb3BlcmF0b3I8PSggY2hhciBjaCwgUUNoYXIgYyApCnsKICAgIHJldHVybiAoKHVjaGFyKSBjaCkgPD0gYy51Y3M7Cn0KCmlubGluZSBib29sIG9wZXJhdG9yPD0oIFFDaGFyIGMxLCBRQ2hhciBjMiApCnsKICAgIHJldHVybiBjMS51Y3MgPD0gYzIudWNzOwp9CgppbmxpbmUgYm9vbCBvcGVyYXRvcj49KCBRQ2hhciBjLCBjaGFyIGNoICkgeyByZXR1cm4gY2ggPD0gYzsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcj49KCBjaGFyIGNoLCBRQ2hhciBjICkgeyByZXR1cm4gYyA8PSBjaDsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcj49KCBRQ2hhciBjMSwgUUNoYXIgYzIgKSB7IHJldHVybiBjMiA8PSBjMTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcjwoIFFDaGFyIGMsIGNoYXIgY2ggKSB7IHJldHVybiAhKGNoPD1jKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcjwoIGNoYXIgY2gsIFFDaGFyIGMgKSB7IHJldHVybiAhKGM8PWNoKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcjwoIFFDaGFyIGMxLCBRQ2hhciBjMiApIHsgcmV0dXJuICEoYzI8PWMxKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcj4oIFFDaGFyIGMsIGNoYXIgY2ggKSB7IHJldHVybiAhKGNoPj1jKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcj4oIGNoYXIgY2gsIFFDaGFyIGMgKSB7IHJldHVybiAhKGM+PWNoKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcj4oIFFDaGFyIGMxLCBRQ2hhciBjMiApIHsgcmV0dXJuICEoYzI+PWMxKTsgfQoKLy8gaW50ZXJuYWwKc3RydWN0IFFfRVhQT1JUIFFTdHJpbmdEYXRhIDogcHVibGljIFFTaGFyZWQgewogICAgUVN0cmluZ0RhdGEoKSA6CiAgICAgICAgUVNoYXJlZCgpLCB1bmljb2RlKDApLCBhc2NpaSgwKSwgbGVuKDApLCBpc3NpbXBsZXRleHQoVFJVRSksIG1heGwoMCksIGlzbGF0aW4xKEZBTFNFKSB7IHJlZigpOyB9CiAgICBRU3RyaW5nRGF0YShRQ2hhciAqdSwgdWludCBsLCB1aW50IG0pIDoKICAgICAgICBRU2hhcmVkKCksIHVuaWNvZGUodSksIGFzY2lpKDApLCBsZW4obCksIGlzc2ltcGxldGV4dChGQUxTRSksIG1heGwobSksIGlzbGF0aW4xKEZBTFNFKSB7IH0KICAgIH5RU3RyaW5nRGF0YSgpIHsgaWYgKCB1bmljb2RlICkgZGVsZXRlW10gKChjaGFyKil1bmljb2RlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBhc2NpaSApIGRlbGV0ZVtdIGFzY2lpOyB9CgogICAgdm9pZCBkZWxldGVTZWxmKCk7CiAgICBRQ2hhciAqdW5pY29kZTsKICAgIGNoYXIgKmFzY2lpOwogICAgdm9pZCBzZXREaXJ0eSgpIHsKCWlmICggYXNjaWkgKSB7CgkgICAgZGVsZXRlIFtdIGFzY2lpOwoJICAgIGFzY2lpID0gMDsKCX0KCWlzc2ltcGxldGV4dCA9IEZBTFNFOwogICAgfQojaWZkZWYgUV9PU19NQUM5CiAgICB1aW50IGxlbjsKI2Vsc2UKICAgIHVpbnQgbGVuIDogMzA7CiNlbmRpZgogICAgdWludCBpc3NpbXBsZXRleHQgOiAxOwojaWZkZWYgUV9PU19NQUM5CiAgICB1aW50IG1heGw7CiNlbHNlCiAgICB1aW50IG1heGwgOiAzMDsKI2VuZGlmCiAgICB1aW50IGlzbGF0aW4xIDogMTsKCnByaXZhdGU6CiNpZiBkZWZpbmVkKFFfRElTQUJMRV9DT1BZKQogICAgUVN0cmluZ0RhdGEoIGNvbnN0IFFTdHJpbmdEYXRhJiApOwogICAgUVN0cmluZ0RhdGEmIG9wZXJhdG9yPSggY29uc3QgUVN0cmluZ0RhdGEmICk7CiNlbmRpZgp9OwoKCmNsYXNzIFFfRVhQT1JUIFFTdHJpbmcKewpwdWJsaWM6CiAgICBRU3RyaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgbnVsbCBzdHJpbmcKICAgIFFTdHJpbmcoIFFDaGFyICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25lLWNoYXIgc3RyaW5nCiAgICBRU3RyaW5nKCBjb25zdCBRU3RyaW5nICYgKTsgICAgICAgICAgICAgICAgIC8vIGltcGwtc2hhcmVkIGNvcHkKICAgIFFTdHJpbmcoIGNvbnN0IFFCeXRlQXJyYXkmICk7ICAgICAgICAgICAgICAgLy8gZGVlcCBjb3B5CiAgICBRU3RyaW5nKCBjb25zdCBRQ2hhciogdW5pY29kZSwgdWludCBsZW5ndGggKTsgLy8gZGVlcCBjb3B5CiNpZm5kZWYgUVRfTk9fQ0FTVF9BU0NJSQogICAgUVN0cmluZyggY29uc3QgY2hhciAqc3RyICk7ICAgICAgICAgICAgICAgICAvLyBkZWVwIGNvcHkKI2VuZGlmCiNpZm5kZWYgUVRfTk9fU1RMCiAgICBRU3RyaW5nKCBjb25zdCBzdGQ6OnN0cmluZyYgKTsgICAgICAgICAgICAgICAgICAgLy8gZGVlcCBjb3B5CiNlbmRpZgogICAgflFTdHJpbmcoKTsKCiAgICBRU3RyaW5nICAgICZvcGVyYXRvcj0oIGNvbnN0IFFTdHJpbmcgJiApOyAgIC8vIGltcGwtc2hhcmVkIGNvcHkKICAgIFFTdHJpbmcgICAgJm9wZXJhdG9yPSggY29uc3QgY2hhciAqICk7ICAgICAgLy8gZGVlcCBjb3B5CiNpZm5kZWYgUVRfTk9fU1RMCiAgICBRU3RyaW5nICAgICZvcGVyYXRvcj0oIGNvbnN0IHN0ZDo6c3RyaW5nJiApOyAgICAgLy8gZGVlcCBjb3B5CiNlbmRpZgogICAgUVN0cmluZyAgICAmb3BlcmF0b3I9KCBjb25zdCBRQ1N0cmluZyYgKTsgICAvLyBkZWVwIGNvcHkKICAgIFFTdHJpbmcgICAgJm9wZXJhdG9yPSggUUNoYXIgYyApOwogICAgUVN0cmluZyAgICAmb3BlcmF0b3I9KCBjaGFyIGMgKTsKCiAgICBRVF9TVEFUSUNfQ09OU1QgUVN0cmluZyBudWxsOwoKICAgIGJvb2wgICAgICAgIGlzTnVsbCgpICAgICAgICBjb25zdDsKICAgIGJvb2wgICAgICAgIGlzRW1wdHkoKSAgICAgICBjb25zdDsKICAgIHVpbnQgICAgICAgIGxlbmd0aCgpICAgICAgICBjb25zdDsKICAgIHZvaWQgICAgICAgIHRydW5jYXRlKCB1aW50IHBvcyApOwoKICAgIFFTdHJpbmcgJiAgIGZpbGwoIFFDaGFyIGMsIGludCBsZW4gPSAtMSApOwoKICAgIFFTdHJpbmcgICAgIGNvcHkoKSAgY29uc3Q7CgogICAgUVN0cmluZyBhcmcoIGxvbmcgYSwgaW50IGZpZWxkV2lkdGggPSAwLCBpbnQgYmFzZSA9IDEwICkgY29uc3Q7CiAgICBRU3RyaW5nIGFyZyggdWxvbmcgYSwgaW50IGZpZWxkV2lkdGggPSAwLCBpbnQgYmFzZSA9IDEwICkgY29uc3Q7CiAgICBRU3RyaW5nIGFyZyggUV9MTE9ORyBhLCBpbnQgZmllbGR3aWR0aD0wLCBpbnQgYmFzZT0xMCApIGNvbnN0OwogICAgUVN0cmluZyBhcmcoIFFfVUxMT05HIGEsIGludCBmaWVsZHdpZHRoPTAsIGludCBiYXNlPTEwICkgY29uc3Q7CiAgICBRU3RyaW5nIGFyZyggaW50IGEsIGludCBmaWVsZFdpZHRoID0gMCwgaW50IGJhc2UgPSAxMCApIGNvbnN0OwogICAgUVN0cmluZyBhcmcoIHVpbnQgYSwgaW50IGZpZWxkV2lkdGggPSAwLCBpbnQgYmFzZSA9IDEwICkgY29uc3Q7CiAgICBRU3RyaW5nIGFyZyggc2hvcnQgYSwgaW50IGZpZWxkV2lkdGggPSAwLCBpbnQgYmFzZSA9IDEwICkgY29uc3Q7CiAgICBRU3RyaW5nIGFyZyggdXNob3J0IGEsIGludCBmaWVsZFdpZHRoID0gMCwgaW50IGJhc2UgPSAxMCApIGNvbnN0OwogICAgUVN0cmluZyBhcmcoIGRvdWJsZSBhLCBpbnQgZmllbGRXaWR0aCA9IDAsIGNoYXIgZm10ID0gJ2cnLAoJCSBpbnQgcHJlYyA9IC0xICkgY29uc3Q7CiAgICBRU3RyaW5nIGFyZyggY2hhciBhLCBpbnQgZmllbGRXaWR0aCA9IDAgKSBjb25zdDsKICAgIFFTdHJpbmcgYXJnKCBRQ2hhciBhLCBpbnQgZmllbGRXaWR0aCA9IDAgKSBjb25zdDsKICAgIFFTdHJpbmcgYXJnKCBjb25zdCBRU3RyaW5nJiBhLCBpbnQgZmllbGRXaWR0aCA9IDAgKSBjb25zdDsKICAgIFFTdHJpbmcgYXJnKCBjb25zdCBRU3RyaW5nJiBhMSwgY29uc3QgUVN0cmluZyYgYTIgKSBjb25zdDsKICAgIFFTdHJpbmcgYXJnKCBjb25zdCBRU3RyaW5nJiBhMSwgY29uc3QgUVN0cmluZyYgYTIsCgkJIGNvbnN0IFFTdHJpbmcmIGEzICkgY29uc3Q7CiAgICBRU3RyaW5nIGFyZyggY29uc3QgUVN0cmluZyYgYTEsIGNvbnN0IFFTdHJpbmcmIGEyLCBjb25zdCBRU3RyaW5nJiBhMywKCQkgY29uc3QgUVN0cmluZyYgYTQgKSBjb25zdDsKCiNpZm5kZWYgUVRfTk9fU1BSSU5URgogICAgUVN0cmluZyAgICAmc3ByaW50ZiggY29uc3QgY2hhciogZm9ybWF0LCAuLi4gKQojaWYgZGVmaW5lZChRX0NDX0dOVSkgJiYgIWRlZmluZWQoX19JTlNVUkVfXykKICAgICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKI2VuZGlmCiAgICAgICAgOwojZW5kaWYKCiAgICBpbnQgICAgICAgICBmaW5kKCBRQ2hhciBjLCBpbnQgaW5kZXg9MCwgYm9vbCBjcz1UUlVFICkgY29uc3Q7CiAgICBpbnQgICAgICAgICBmaW5kKCBjaGFyIGMsIGludCBpbmRleD0wLCBib29sIGNzPVRSVUUgKSBjb25zdDsKICAgIGludCAgICAgICAgIGZpbmQoIGNvbnN0IFFTdHJpbmcgJnN0ciwgaW50IGluZGV4PTAsIGJvb2wgY3M9VFJVRSApIGNvbnN0OwojaWZuZGVmIFFUX05PX1JFR0VYUAogICAgaW50ICAgICAgICAgZmluZCggY29uc3QgUVJlZ0V4cCAmLCBpbnQgaW5kZXg9MCApIGNvbnN0OwojZW5kaWYKI2lmbmRlZiBRVF9OT19DQVNUX0FTQ0lJCiAgICBpbnQgICAgICAgICBmaW5kKCBjb25zdCBjaGFyKiBzdHIsIGludCBpbmRleD0wICkgY29uc3Q7CiNlbmRpZgogICAgaW50ICAgICAgICAgZmluZFJldiggUUNoYXIgYywgaW50IGluZGV4PS0xLCBib29sIGNzPVRSVUUpIGNvbnN0OwogICAgaW50ICAgICAgICAgZmluZFJldiggY2hhciBjLCBpbnQgaW5kZXg9LTEsIGJvb2wgY3M9VFJVRSkgY29uc3Q7CiAgICBpbnQgICAgICAgICBmaW5kUmV2KCBjb25zdCBRU3RyaW5nICZzdHIsIGludCBpbmRleD0tMSwgYm9vbCBjcz1UUlVFKSBjb25zdDsKI2lmbmRlZiBRVF9OT19SRUdFWFAKICAgIGludCAgICAgICAgIGZpbmRSZXYoIGNvbnN0IFFSZWdFeHAgJiwgaW50IGluZGV4PS0xICkgY29uc3Q7CiNlbmRpZgojaWZuZGVmIFFUX05PX0NBU1RfQVNDSUkKICAgIGludCAgICAgICAgIGZpbmRSZXYoIGNvbnN0IGNoYXIqIHN0ciwgaW50IGluZGV4PS0xICkgY29uc3Q7CiNlbmRpZgogICAgaW50ICAgICAgICAgY29udGFpbnMoIFFDaGFyIGMsIGJvb2wgY3M9VFJVRSApIGNvbnN0OwogICAgaW50ICAgICAgICAgY29udGFpbnMoIGNoYXIgYywgYm9vbCBjcz1UUlVFICkgY29uc3QKICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBjb250YWlucyhRQ2hhcihjKSwgY3MpOyB9CiNpZm5kZWYgUVRfTk9fQ0FTVF9BU0NJSQogICAgaW50ICAgICAgICAgY29udGFpbnMoIGNvbnN0IGNoYXIqIHN0ciwgYm9vbCBjcz1UUlVFICkgY29uc3Q7CiNlbmRpZgogICAgaW50ICAgICAgICAgY29udGFpbnMoIGNvbnN0IFFTdHJpbmcgJnN0ciwgYm9vbCBjcz1UUlVFICkgY29uc3Q7CiNpZm5kZWYgUVRfTk9fUkVHRVhQCiAgICBpbnQgICAgICAgICBjb250YWlucyggY29uc3QgUVJlZ0V4cCAmICkgY29uc3Q7CiNlbmRpZgoKICAgIGVudW0gU2VjdGlvbkZsYWdzIHsKCVNlY3Rpb25EZWZhdWx0ICAgICAgICAgICAgID0gMHgwMCwKCVNlY3Rpb25Ta2lwRW1wdHkgICAgICAgICAgID0gMHgwMSwKCVNlY3Rpb25JbmNsdWRlTGVhZGluZ1NlcCAgID0gMHgwMiwKCVNlY3Rpb25JbmNsdWRlVHJhaWxpbmdTZXAgID0gMHgwNCwKCVNlY3Rpb25DYXNlSW5zZW5zaXRpdmVTZXBzID0gMHgwOAogICAgfTsKICAgIFFTdHJpbmcgICAgIHNlY3Rpb24oIFFDaGFyIHNlcCwgaW50IHN0YXJ0LCBpbnQgZW5kID0gMHhmZmZmZmZmZiwgaW50IGZsYWdzID0gU2VjdGlvbkRlZmF1bHQgKSBjb25zdDsKICAgIFFTdHJpbmcgICAgIHNlY3Rpb24oIGNoYXIgc2VwLCBpbnQgc3RhcnQsIGludCBlbmQgPSAweGZmZmZmZmZmLCBpbnQgZmxhZ3MgPSBTZWN0aW9uRGVmYXVsdCApIGNvbnN0OwojaWZuZGVmIFFUX05PX0NBU1RfQVNDSUkKICAgIFFTdHJpbmcgICAgICBzZWN0aW9uKCBjb25zdCBjaGFyICppbl9zZXAsIGludCBzdGFydCwgaW50IGVuZCA9IDB4ZmZmZmZmZmYsIGludCBmbGFncyA9IFNlY3Rpb25EZWZhdWx0ICkgY29uc3Q7CiNlbmRpZgogICAgUVN0cmluZyAgICAgc2VjdGlvbiggY29uc3QgUVN0cmluZyAmaW5fc2VwLCBpbnQgc3RhcnQsIGludCBlbmQgPSAweGZmZmZmZmZmLCBpbnQgZmxhZ3MgPSBTZWN0aW9uRGVmYXVsdCApIGNvbnN0OwojaWZuZGVmIFFUX05PX1JFR0VYUAogICAgUVN0cmluZyAgICAgc2VjdGlvbiggY29uc3QgUVJlZ0V4cCAmcmVnLCBpbnQgc3RhcnQsIGludCBlbmQgPSAweGZmZmZmZmZmLCBpbnQgZmxhZ3MgPSBTZWN0aW9uRGVmYXVsdCApIGNvbnN0OwojZW5kaWYKCiAgICBRU3RyaW5nICAgICBsZWZ0KCB1aW50IGxlbiApICBjb25zdDsKICAgIFFTdHJpbmcgICAgIHJpZ2h0KCB1aW50IGxlbiApIGNvbnN0OwogICAgUVN0cmluZyAgICAgbWlkKCB1aW50IGluZGV4LCB1aW50IGxlbj0weGZmZmZmZmZmKSBjb25zdDsKCiAgICBRU3RyaW5nICAgICBsZWZ0SnVzdGlmeSggdWludCB3aWR0aCwgUUNoYXIgZmlsbD0nICcsIGJvb2wgdHJ1bmM9RkFMU0UpY29uc3Q7CiAgICBRU3RyaW5nICAgICByaWdodEp1c3RpZnkoIHVpbnQgd2lkdGgsIFFDaGFyIGZpbGw9JyAnLGJvb2wgdHJ1bmM9RkFMU0UpY29uc3Q7CgogICAgUVN0cmluZyAgICAgbG93ZXIoKSBjb25zdDsKICAgIFFTdHJpbmcgICAgIHVwcGVyKCkgY29uc3Q7CgogICAgUVN0cmluZyAgICAgc3RyaXBXaGl0ZVNwYWNlKCkgICAgICAgY29uc3Q7CiAgICBRU3RyaW5nICAgICBzaW1wbGlmeVdoaXRlU3BhY2UoKSAgICBjb25zdDsKCiAgICBRU3RyaW5nICAgICZpbnNlcnQoIHVpbnQgaW5kZXgsIGNvbnN0IFFTdHJpbmcgJiApOwojaWZuZGVmIFFUX05PX0NBU1RfQVNDSUkKICAgIFFTdHJpbmcgICAgJmluc2VydCggdWludCBpbmRleCwgY29uc3QgUUJ5dGVBcnJheSAmICk7CiAgICBRU3RyaW5nICAgICZpbnNlcnQoIHVpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKiApOwojZW5kaWYKICAgIFFTdHJpbmcgICAgJmluc2VydCggdWludCBpbmRleCwgY29uc3QgUUNoYXIqLCB1aW50IGxlbiApOwogICAgUVN0cmluZyAgICAmaW5zZXJ0KCB1aW50IGluZGV4LCBRQ2hhciApOwogICAgUVN0cmluZyAgICAmaW5zZXJ0KCB1aW50IGluZGV4LCBjaGFyIGMgKSB7IHJldHVybiBpbnNlcnQoaW5kZXgsUUNoYXIoYykpOyB9CiAgICBRU3RyaW5nICAgICZhcHBlbmQoIGNoYXIgKTsKICAgIFFTdHJpbmcgICAgJmFwcGVuZCggUUNoYXIgKTsKICAgIFFTdHJpbmcgICAgJmFwcGVuZCggY29uc3QgUVN0cmluZyAmICk7CiNpZm5kZWYgUVRfTk9fQ0FTVF9BU0NJSQogICAgUVN0cmluZyAgICAmYXBwZW5kKCBjb25zdCBRQnl0ZUFycmF5ICYgKTsKICAgIFFTdHJpbmcgICAgJmFwcGVuZCggY29uc3QgY2hhciAqICk7CiNlbmRpZgojaWYgIWRlZmluZWQoUVRfTk9fU1RMKSAmJiAhZGVmaW5lZChRVF9OT19DQVNUX0FTQ0lJKQogICAgUVN0cmluZyAgICAmYXBwZW5kKCBjb25zdCBzdGQ6OnN0cmluZyYgKTsKI2VuZGlmCiAgICBRU3RyaW5nICAgICZwcmVwZW5kKCBjaGFyICk7CiAgICBRU3RyaW5nICAgICZwcmVwZW5kKCBRQ2hhciApOwogICAgUVN0cmluZyAgICAmcHJlcGVuZCggY29uc3QgUVN0cmluZyAmICk7CiNpZm5kZWYgUVRfTk9fQ0FTVF9BU0NJSQogICAgUVN0cmluZyAgICAmcHJlcGVuZCggY29uc3QgUUJ5dGVBcnJheSAmICk7CiAgICBRU3RyaW5nICAgICZwcmVwZW5kKCBjb25zdCBjaGFyICogKTsKI2VuZGlmCiNpZiAhZGVmaW5lZChRVF9OT19TVEwpICYmICFkZWZpbmVkKFFUX05PX0NBU1RfQVNDSUkpCiAgICBRU3RyaW5nICAgICZwcmVwZW5kKCBjb25zdCBzdGQ6OnN0cmluZyYgKTsKI2VuZGlmCiAgICBRU3RyaW5nICAgICZyZW1vdmUoIHVpbnQgaW5kZXgsIHVpbnQgbGVuICk7CiNpZiBkZWZpbmVkKFFfUURPQykKICAgIFFTdHJpbmcgICAgJnJlbW92ZSggY29uc3QgUVN0cmluZyAmIHN0ciwgYm9vbCBjcyA9IFRSVUUgKTsKI2Vsc2UKICAgIC8vICMjIyBRdCA0LjA6IG1lcmdlIHRoZXNlIHR3byBpbnRvIG9uZSwgYW5kIHJlbW92ZSBRX1FET0MgaGFjawogICAgUVN0cmluZyAgICAmcmVtb3ZlKCBjb25zdCBRU3RyaW5nICYgKTsKICAgIFFTdHJpbmcgICAgJnJlbW92ZSggY29uc3QgUVN0cmluZyAmLCBib29sIGNzICk7CiNlbmRpZgogICAgUVN0cmluZyAgICAmcmVtb3ZlKCBRQ2hhciBjICk7CiAgICBRU3RyaW5nICAgICZyZW1vdmUoIGNoYXIgYyApCiAgICB7IHJldHVybiByZW1vdmUoIFFDaGFyKGMpICk7IH0KI2lmbmRlZiBRVF9OT19DQVNUX0FTQ0lJCiAgICBRU3RyaW5nICAgICZyZW1vdmUoIGNvbnN0IGNoYXIgKiApOwojZW5kaWYKI2lmbmRlZiBRVF9OT19SRUdFWFAKICAgIFFTdHJpbmcgICAgJnJlbW92ZSggY29uc3QgUVJlZ0V4cCAmICk7CiNlbmRpZgogICAgUVN0cmluZyAgICAmcmVwbGFjZSggdWludCBpbmRleCwgdWludCBsZW4sIGNvbnN0IFFTdHJpbmcgJiApOwogICAgUVN0cmluZyAgICAmcmVwbGFjZSggdWludCBpbmRleCwgdWludCBsZW4sIGNvbnN0IFFDaGFyKiwgdWludCBjbGVuICk7CiAgICBRU3RyaW5nICAgICZyZXBsYWNlKCB1aW50IGluZGV4LCB1aW50IGxlbiwgUUNoYXIgKTsKICAgIFFTdHJpbmcgICAgJnJlcGxhY2UoIHVpbnQgaW5kZXgsIHVpbnQgbGVuLCBjaGFyIGMgKQogICAgeyByZXR1cm4gcmVwbGFjZSggaW5kZXgsIGxlbiwgUUNoYXIoYykgKTsgfQojaWYgZGVmaW5lZChRX1FET0MpCiAgICBRU3RyaW5nICAgICZyZXBsYWNlKCBRQ2hhciBjLCBjb25zdCBRU3RyaW5nICYgYWZ0ZXIsIGJvb2wgY3MgPSBUUlVFICk7CiAgICBRU3RyaW5nICAgICZyZXBsYWNlKCBjaGFyIGMsIGNvbnN0IFFTdHJpbmcgJiBhZnRlciwgYm9vbCBjcyA9IFRSVUUgKTsKICAgIFFTdHJpbmcgICAgJnJlcGxhY2UoIGNvbnN0IFFTdHJpbmcgJiBiZWZvcmUsIGNvbnN0IFFTdHJpbmcgJiBhZnRlciwKCQkJIGJvb2wgY3MgPSBUUlVFICk7CiNlbHNlCiAgICAvLyAjIyMgUXQgNC4wOiBtZXJnZSB0aGVzZSB0d28gaW50byBvbmUsIGFuZCByZW1vdmUgUV9RRE9DIGhhY2sKICAgIFFTdHJpbmcgICAgJnJlcGxhY2UoIFFDaGFyIGMsIGNvbnN0IFFTdHJpbmcgJiApOwogICAgUVN0cmluZyAgICAmcmVwbGFjZSggUUNoYXIgYywgY29uc3QgUVN0cmluZyAmLCBib29sICk7CgogICAgLy8gIyMjIFF0IDQuMDogbWVyZ2UgdGhlc2UgdHdvIGludG8gb25lLCBhbmQgcmVtb3ZlIFFfUURPQyBoYWNrCiAgICBRU3RyaW5nICAgICZyZXBsYWNlKCBjaGFyIGMsIGNvbnN0IFFTdHJpbmcgJiBhZnRlciApCiAgICB7IHJldHVybiByZXBsYWNlKCBRQ2hhcihjKSwgYWZ0ZXIsIFRSVUUgKTsgfQogICAgUVN0cmluZyAgICAmcmVwbGFjZSggY2hhciBjLCBjb25zdCBRU3RyaW5nICYgYWZ0ZXIsIGJvb2wgY3MgKQogICAgeyByZXR1cm4gcmVwbGFjZSggUUNoYXIoYyksIGFmdGVyLCBjcyApOyB9CgogICAgLy8gIyMjIFF0IDQuMDogbWVyZ2UgdGhlc2UgdHdvIGludG8gb25lLCBhbmQgcmVtb3ZlIFFfUURPQyBoYWNrCiAgICBRU3RyaW5nICAgICZyZXBsYWNlKCBjb25zdCBRU3RyaW5nICYsIGNvbnN0IFFTdHJpbmcgJiApOwogICAgUVN0cmluZyAgICAmcmVwbGFjZSggY29uc3QgUVN0cmluZyAmLCBjb25zdCBRU3RyaW5nICYsIGJvb2wgKTsKI2VuZGlmCiNpZm5kZWYgUVRfTk9fUkVHRVhQX0NBUFRVUkUKICAgIFFTdHJpbmcgICAgJnJlcGxhY2UoIGNvbnN0IFFSZWdFeHAgJiwgY29uc3QgUVN0cmluZyAmICk7CiNlbmRpZgogICAgUVN0cmluZyAgICAmcmVwbGFjZSggUUNoYXIsIFFDaGFyICk7CgogICAgc2hvcnQgICAgICAgdG9TaG9ydCggYm9vbCAqb2s9MCwgaW50IGJhc2U9MTAgKSAgICAgIGNvbnN0OwogICAgdXNob3J0ICAgICAgdG9VU2hvcnQoIGJvb2wgKm9rPTAsIGludCBiYXNlPTEwICkgICAgIGNvbnN0OwogICAgaW50ICAgICAgICAgdG9JbnQoIGJvb2wgKm9rPTAsIGludCBiYXNlPTEwICkgICAgICAgIGNvbnN0OwogICAgdWludCAgICAgICAgdG9VSW50KCBib29sICpvaz0wLCBpbnQgYmFzZT0xMCApICAgICAgIGNvbnN0OwogICAgbG9uZyAgICAgICAgdG9Mb25nKCBib29sICpvaz0wLCBpbnQgYmFzZT0xMCApICAgICAgIGNvbnN0OwogICAgdWxvbmcgICAgICAgdG9VTG9uZyggYm9vbCAqb2s9MCwgaW50IGJhc2U9MTAgKSAgICAgIGNvbnN0OwogICAgUV9MTE9ORyAgICAgdG9Mb25nTG9uZyggYm9vbCAqb2s9MCwgaW50IGJhc2U9MTAgKSAgIGNvbnN0OwogICAgUV9VTExPTkcgICAgdG9VTG9uZ0xvbmcoIGJvb2wgKm9rPTAsIGludCBiYXNlPTEwICkgIGNvbnN0OwogICAgZmxvYXQgICAgICAgdG9GbG9hdCggYm9vbCAqb2s9MCApICAgY29uc3Q7CiAgICBkb3VibGUgICAgICB0b0RvdWJsZSggYm9vbCAqb2s9MCApICBjb25zdDsKCiAgICBRU3RyaW5nICAgICZzZXROdW0oIHNob3J0LCBpbnQgYmFzZT0xMCApOwogICAgUVN0cmluZyAgICAmc2V0TnVtKCB1c2hvcnQsIGludCBiYXNlPTEwICk7CiAgICBRU3RyaW5nICAgICZzZXROdW0oIGludCwgaW50IGJhc2U9MTAgKTsKICAgIFFTdHJpbmcgICAgJnNldE51bSggdWludCwgaW50IGJhc2U9MTAgKTsKICAgIFFTdHJpbmcgICAgJnNldE51bSggbG9uZywgaW50IGJhc2U9MTAgKTsKICAgIFFTdHJpbmcgICAgJnNldE51bSggdWxvbmcsIGludCBiYXNlPTEwICk7CiAgICBRU3RyaW5nICAgICZzZXROdW0oIFFfTExPTkcsIGludCBiYXNlPTEwICk7CiAgICBRU3RyaW5nICAgICZzZXROdW0oIFFfVUxMT05HLCBpbnQgYmFzZT0xMCApOwogICAgUVN0cmluZyAgICAmc2V0TnVtKCBmbG9hdCwgY2hhciBmPSdnJywgaW50IHByZWM9NiApOwogICAgUVN0cmluZyAgICAmc2V0TnVtKCBkb3VibGUsIGNoYXIgZj0nZycsIGludCBwcmVjPTYgKTsKCiAgICBzdGF0aWMgUVN0cmluZyBudW1iZXIoIGxvbmcsIGludCBiYXNlPTEwICk7CiAgICBzdGF0aWMgUVN0cmluZyBudW1iZXIoIHVsb25nLCBpbnQgYmFzZT0xMCk7CiAgICBzdGF0aWMgUVN0cmluZyBudW1iZXIoIFFfTExPTkcsIGludCBiYXNlPTEwICk7CiAgICBzdGF0aWMgUVN0cmluZyBudW1iZXIoIFFfVUxMT05HLCBpbnQgYmFzZT0xMCk7CiAgICBzdGF0aWMgUVN0cmluZyBudW1iZXIoIGludCwgaW50IGJhc2U9MTAgKTsKICAgIHN0YXRpYyBRU3RyaW5nIG51bWJlciggdWludCwgaW50IGJhc2U9MTApOwogICAgc3RhdGljIFFTdHJpbmcgbnVtYmVyKCBkb3VibGUsIGNoYXIgZj0nZycsIGludCBwcmVjPTYgKTsKCiAgICB2b2lkICAgICAgICBzZXRFeHBhbmQoIHVpbnQgaW5kZXgsIFFDaGFyIGMgKTsKCiAgICBRU3RyaW5nICAgICZvcGVyYXRvcis9KCBjb25zdCBRU3RyaW5nICZzdHIgKTsKI2lmbmRlZiBRVF9OT19DQVNUX0FTQ0lJCiAgICBRU3RyaW5nICAgICZvcGVyYXRvcis9KCBjb25zdCBRQnl0ZUFycmF5ICZzdHIgKTsKICAgIFFTdHJpbmcgICAgJm9wZXJhdG9yKz0oIGNvbnN0IGNoYXIgKnN0ciApOwojZW5kaWYKI2lmICFkZWZpbmVkKFFUX05PX1NUTCkgJiYgIWRlZmluZWQoUVRfTk9fQ0FTVF9BU0NJSSkKICAgIFFTdHJpbmcgICAgJm9wZXJhdG9yKz0oIGNvbnN0IHN0ZDo6c3RyaW5nJiApOwojZW5kaWYKICAgIFFTdHJpbmcgICAgJm9wZXJhdG9yKz0oIFFDaGFyIGMgKTsKICAgIFFTdHJpbmcgICAgJm9wZXJhdG9yKz0oIGNoYXIgYyApOwoKICAgIFFDaGFyIGF0KCB1aW50IGkgKSBjb25zdAogICAgICAgIHsgcmV0dXJuIGkgPCBkLT5sZW4gPyBkLT51bmljb2RlW2ldIDogUUNoYXI6Om51bGw7IH0KICAgIFFDaGFyIG9wZXJhdG9yW10oIGludCBpICkgY29uc3QgeyByZXR1cm4gYXQoKHVpbnQpaSk7IH0KICAgIFFDaGFyUmVmIGF0KCB1aW50IGkgKTsKICAgIFFDaGFyUmVmIG9wZXJhdG9yW10oIGludCBpICk7CgogICAgUUNoYXIgY29uc3RyZWYodWludCBpKSBjb25zdAogICAgICAgIHsgcmV0dXJuIGF0KGkpOyB9CiAgICBRQ2hhciYgcmVmKHVpbnQgaSkKICAgICAgICB7IC8vIE9wdGltaXplZCBmb3IgZWFzeS1pbmxpbmluZyBieSBzaW1wbGUgY29tcGlsZXJzLgogICAgICAgICAgICBpZiAoIGQtPmNvdW50ICE9IDEgfHwgaSA+PSBkLT5sZW4gKQogICAgICAgICAgICAgICAgc3ViYXQoIGkgKTsKICAgICAgICAgICAgZC0+c2V0RGlydHkoKTsKICAgICAgICAgICAgcmV0dXJuIGQtPnVuaWNvZGVbaV07CiAgICAgICAgfQoKICAgIGNvbnN0IFFDaGFyKiB1bmljb2RlKCkgY29uc3QgeyByZXR1cm4gZC0+dW5pY29kZTsgfQogICAgY29uc3QgY2hhciogYXNjaWkoKSBjb25zdDsKICAgIHN0YXRpYyBRU3RyaW5nIGZyb21Bc2NpaShjb25zdCBjaGFyKiwgaW50IGxlbj0tMSk7CiAgICBjb25zdCBjaGFyKiBsYXRpbjEoKSBjb25zdDsKICAgIHN0YXRpYyBRU3RyaW5nIGZyb21MYXRpbjEoY29uc3QgY2hhciosIGludCBsZW49LTEpOwogICAgUUNTdHJpbmcgdXRmOCgpIGNvbnN0OwogICAgc3RhdGljIFFTdHJpbmcgZnJvbVV0ZjgoY29uc3QgY2hhciosIGludCBsZW49LTEpOwogICAgUUNTdHJpbmcgbG9jYWw4Qml0KCkgY29uc3Q7CiAgICBzdGF0aWMgUVN0cmluZyBmcm9tTG9jYWw4Qml0KGNvbnN0IGNoYXIqLCBpbnQgbGVuPS0xKTsKICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3Q7CiNpZm5kZWYgUVRfTk9fQVNDSUlfQ0FTVAogICAgb3BlcmF0b3IgY29uc3QgY2hhciAqKCkgY29uc3QgeyByZXR1cm4gYXNjaWkoKTsgfQojZW5kaWYKI2lmbmRlZiBRVF9OT19TVEwKICAgIG9wZXJhdG9yIHN0ZDo6c3RyaW5nKCkgY29uc3QgeyByZXR1cm4gYXNjaWkoKSA/IGFzY2lpKCkgOiAiIjsgfQojZW5kaWYKCiAgICBzdGF0aWMgUVN0cmluZyBmcm9tVWNzMiggY29uc3QgdW5zaWduZWQgc2hvcnQgKnVjczIgKTsKICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICp1Y3MyKCkgY29uc3Q7CgogICAgUVN0cmluZyAmc2V0VW5pY29kZSggY29uc3QgUUNoYXIqIHVuaWNvZGUsIHVpbnQgbGVuICk7CiAgICBRU3RyaW5nICZzZXRVbmljb2RlQ29kZXMoIGNvbnN0IHVzaG9ydCogdW5pY29kZV9hc191c2hvcnRzLCB1aW50IGxlbiApOwogICAgUVN0cmluZyAmc2V0QXNjaWkoIGNvbnN0IGNoYXIqLCBpbnQgbGVuPS0xICk7CiAgICBRU3RyaW5nICZzZXRMYXRpbjEoIGNvbnN0IGNoYXIqLCBpbnQgbGVuPS0xICk7CgogICAgaW50IGNvbXBhcmUoIGNvbnN0IFFTdHJpbmcmIHMgKSBjb25zdDsKICAgIHN0YXRpYyBpbnQgY29tcGFyZSggY29uc3QgUVN0cmluZyYgczEsIGNvbnN0IFFTdHJpbmcmIHMyICkKICAgIHsgcmV0dXJuIHMxLmNvbXBhcmUoIHMyICk7IH0KCiAgICBpbnQgbG9jYWxlQXdhcmVDb21wYXJlKCBjb25zdCBRU3RyaW5nJiBzICkgY29uc3Q7CiAgICBzdGF0aWMgaW50IGxvY2FsZUF3YXJlQ29tcGFyZSggY29uc3QgUVN0cmluZyYgczEsIGNvbnN0IFFTdHJpbmcmIHMyICkKICAgIHsgcmV0dXJuIHMxLmxvY2FsZUF3YXJlQ29tcGFyZSggczIgKTsgfQoKI2lmbmRlZiBRVF9OT19EQVRBU1RSRUFNCiAgICBmcmllbmQgUV9FWFBPUlQgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFTdHJpbmcgJiApOwojZW5kaWYKCiAgICB2b2lkIGNvbXBvc2UoKTsKCiNpZm5kZWYgUVRfTk9fQ09NUEFUCiAgICBjb25zdCBjaGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gYXNjaWkoKTsgfQojZW5kaWYKCiNpZiBkZWZpbmVkKFFfUURPQykKICAgIGJvb2wgc3RhcnRzV2l0aCggY29uc3QgUVN0cmluZyYgc3RyLCBib29sIGNzID0gVFJVRSApIGNvbnN0OwogICAgYm9vbCBlbmRzV2l0aCggY29uc3QgUVN0cmluZyYgc3RyLCBib29sIGNzID0gVFJVRSApIGNvbnN0OwojZWxzZQogICAgLy8gIyMjIFF0IDQuMDogbWVyZ2UgdGhlc2UgdHdvIGludG8gb25lLCBhbmQgcmVtb3ZlIFFfUURPQyBoYWNrCiAgICBib29sIHN0YXJ0c1dpdGgoIGNvbnN0IFFTdHJpbmcmIHN0ciApIGNvbnN0OwogICAgYm9vbCBzdGFydHNXaXRoKCBjb25zdCBRU3RyaW5nJiBzdHIsIGJvb2wgY3MgKSBjb25zdDsKCiAgICAvLyAjIyMgUXQgNC4wOiBtZXJnZSB0aGVzZSB0d28gaW50byBvbmUsIGFuZCByZW1vdmUgUV9RRE9DIGhhY2sKICAgIGJvb2wgZW5kc1dpdGgoIGNvbnN0IFFTdHJpbmcmIHN0ciApIGNvbnN0OwogICAgYm9vbCBlbmRzV2l0aCggY29uc3QgUVN0cmluZyYgc3RyLCBib29sIGNzICkgY29uc3Q7CiNlbmRpZgoKICAgIHZvaWQgc2V0TGVuZ3RoKCB1aW50IG5ld0xlbmd0aCApOwoKICAgIHVpbnQgY2FwYWNpdHkoKSBjb25zdDsKICAgIHZvaWQgcmVzZXJ2ZSggdWludCBtaW5DYXBhY2l0eSApOwogICAgdm9pZCBzcXVlZXplKCk7CgogICAgYm9vbCBzaW1wbGVUZXh0KCkgY29uc3QgeyBpZiAoICFkLT5pc3NpbXBsZXRleHQgKSBjaGVja1NpbXBsZVRleHQoKTsgcmV0dXJuIChib29sKWQtPmlzc2ltcGxldGV4dDsgfQogICAgYm9vbCBpc1JpZ2h0VG9MZWZ0KCkgY29uc3Q7CgoKcHJpdmF0ZToKICAgIFFTdHJpbmcoIGludCBzaXplLCBib29sIC8qICAgICAgICovICk7CS8vIGFsbG9jYXRlIHNpemUgaW5jbC4gXDAKCiAgICB2b2lkIGRlcmVmKCk7CiAgICB2b2lkIHJlYWxfZGV0YWNoKCk7CiAgICB2b2lkIHN1YmF0KCB1aW50ICk7CiAgICBRU3RyaW5nIG11bHRpQXJnKCBpbnQgbnVtQXJncywgY29uc3QgUVN0cmluZyYgYTEsIGNvbnN0IFFTdHJpbmcmIGEyLAoJCSAgICAgIGNvbnN0IFFTdHJpbmcmIGEzID0gUVN0cmluZzo6bnVsbCwKCQkgICAgICBjb25zdCBRU3RyaW5nJiBhNCA9IFFTdHJpbmc6Om51bGwgKSBjb25zdDsKCiAgICB2b2lkIGNoZWNrU2ltcGxlVGV4dCgpIGNvbnN0OwogICAgdm9pZCBncm93KCB1aW50IG5ld0xlbmd0aCApOwojaWZuZGVmIFFUX05PX0NBU1RfQVNDSUkKICAgIFFTdHJpbmcgJmluc2VydEhlbHBlciggdWludCBpbmRleCwgY29uc3QgY2hhciAqcywgdWludCBsZW49VUlOVF9NQVggKTsKICAgIFFTdHJpbmcgJm9wZXJhdG9yUGx1c0VxSGVscGVyKCBjb25zdCBjaGFyICpzLCB1aW50IGxlbjI9VUlOVF9NQVggKTsKI2VuZGlmCgogICAgc3RhdGljIFFDaGFyKiBsYXRpbjFUb1VuaWNvZGUoIGNvbnN0IGNoYXIqLCB1aW50ICogbGVuLCB1aW50IG1heGxlbj0odWludCktMSApOwogICAgc3RhdGljIFFDaGFyKiBsYXRpbjFUb1VuaWNvZGUoIGNvbnN0IFFCeXRlQXJyYXkmLCB1aW50ICogbGVuICk7CiAgICBzdGF0aWMgY2hhciogdW5pY29kZVRvTGF0aW4xKCBjb25zdCBRQ2hhciosIHVpbnQgbGVuICk7CgogICAgUVN0cmluZ0RhdGEgKmQ7CiAgICBzdGF0aWMgUVN0cmluZ0RhdGEqIHNoYXJlZF9udWxsOwogICAgc3RhdGljIFFTdHJpbmdEYXRhKiBtYWtlU2hhcmVkTnVsbCgpOwoKICAgIGZyaWVuZCBjbGFzcyBRQ29uc3RTdHJpbmc7CiAgICBmcmllbmQgY2xhc3MgUVRleHRTdHJlYW07CiAgICBRU3RyaW5nKCBRU3RyaW5nRGF0YSogZGQsIGJvb2wgLyogICAgICAgKi8gKSA6IGQoZGQpIHsgfQoKICAgIC8vIG5lZWRlZCBmb3IgUURlZXBDb3B5CiAgICB2b2lkIGRldGFjaCgpOwogICAgZnJpZW5kIGNsYXNzIFFEZWVwQ29weTxRU3RyaW5nPjsKfTsKCmNsYXNzIFFfRVhQT1JUIFFDaGFyUmVmIHsKICAgIGZyaWVuZCBjbGFzcyBRU3RyaW5nOwogICAgUVN0cmluZyYgczsKICAgIHVpbnQgcDsKICAgIFFDaGFyUmVmKFFTdHJpbmcqIHN0ciwgdWludCBwb3MpIDogcygqc3RyKSwgcChwb3MpIHsgfQoKcHVibGljOgogICAgLy8gbW9zdCBRQ2hhciBvcGVyYXRpb25zIHJlcGVhdGVkIGhlcmUKCiAgICAvLyBhbGwgdGhpcyBpcyBub3QgZG9jdW1lbnRlZDogV2UganVzdCBzYXkgImxpa2UgUUNoYXIiIGFuZCBsZXQgaXQgYmUuCiNpZm5kZWYgUV9RRE9DCiAgICB1c2hvcnQgdW5pY29kZSgpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCkudW5pY29kZSgpOyB9CiAgICBjaGFyIGxhdGluMSgpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCkubGF0aW4xKCk7IH0KCiAgICAvLyBBbiBvcGVyYXRvcj0gZm9yIGVhY2ggUUNoYXIgY2FzdCBjb25zdHJ1Y3RvcnMKICAgIFFDaGFyUmVmIG9wZXJhdG9yPShjaGFyIGMgKSB7IHMucmVmKHApPWM7IHJldHVybiAqdGhpczsgfQogICAgUUNoYXJSZWYgb3BlcmF0b3I9KHVjaGFyIGMgKSB7IHMucmVmKHApPWM7IHJldHVybiAqdGhpczsgfQogICAgUUNoYXJSZWYgb3BlcmF0b3I9KFFDaGFyIGMgKSB7IHMucmVmKHApPWM7IHJldHVybiAqdGhpczsgfQogICAgUUNoYXJSZWYgb3BlcmF0b3I9KGNvbnN0IFFDaGFyUmVmJiBjICkgeyBzLnJlZihwKT1jLnVuaWNvZGUoKTsgcmV0dXJuICp0aGlzOyB9CiAgICBRQ2hhclJlZiBvcGVyYXRvcj0odXNob3J0IHJjICkgeyBzLnJlZihwKT1yYzsgcmV0dXJuICp0aGlzOyB9CiAgICBRQ2hhclJlZiBvcGVyYXRvcj0oc2hvcnQgcmMgKSB7IHMucmVmKHApPXJjOyByZXR1cm4gKnRoaXM7IH0KICAgIFFDaGFyUmVmIG9wZXJhdG9yPSh1aW50IHJjICkgeyBzLnJlZihwKT1yYzsgcmV0dXJuICp0aGlzOyB9CiAgICBRQ2hhclJlZiBvcGVyYXRvcj0oaW50IHJjICkgeyBzLnJlZihwKT1yYzsgcmV0dXJuICp0aGlzOyB9CgogICAgb3BlcmF0b3IgUUNoYXIgKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKTsgfQoKICAgIC8vIGVhY2ggZnVuY3Rpb24uLi4KICAgIGJvb2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4gdW5pY29kZSgpPT0wOyB9CiAgICBib29sIGlzUHJpbnQoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmlzUHJpbnQoKTsgfQogICAgYm9vbCBpc1B1bmN0KCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5pc1B1bmN0KCk7IH0KICAgIGJvb2wgaXNTcGFjZSgpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCkuaXNTcGFjZSgpOyB9CiAgICBib29sIGlzTWFyaygpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCkuaXNNYXJrKCk7IH0KICAgIGJvb2wgaXNMZXR0ZXIoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmlzTGV0dGVyKCk7IH0KICAgIGJvb2wgaXNOdW1iZXIoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmlzTnVtYmVyKCk7IH0KICAgIGJvb2wgaXNMZXR0ZXJPck51bWJlcigpIHsgcmV0dXJuIHMuY29uc3RyZWYocCkuaXNMZXR0ZXJPck51bWJlcigpOyB9CiAgICBib29sIGlzRGlnaXQoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmlzRGlnaXQoKTsgfQoKICAgIGludCBkaWdpdFZhbHVlKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5kaWdpdFZhbHVlKCk7IH0KICAgIFFDaGFyIGxvd2VyKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5sb3dlcigpOyB9CiAgICBRQ2hhciB1cHBlcigpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCkudXBwZXIoKTsgfQoKICAgIFFDaGFyOjpDYXRlZ29yeSBjYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCkuY2F0ZWdvcnkoKTsgfQogICAgUUNoYXI6OkRpcmVjdGlvbiBkaXJlY3Rpb24oKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmRpcmVjdGlvbigpOyB9CiAgICBRQ2hhcjo6Sm9pbmluZyBqb2luaW5nKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5qb2luaW5nKCk7IH0KICAgIGJvb2wgbWlycm9yZWQoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLm1pcnJvcmVkKCk7IH0KICAgIFFDaGFyIG1pcnJvcmVkQ2hhcigpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCkubWlycm9yZWRDaGFyKCk7IH0KICAgIGNvbnN0IFFTdHJpbmcgJmRlY29tcG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmRlY29tcG9zaXRpb24oKTsgfQogICAgUUNoYXI6OkRlY29tcG9zaXRpb24gZGVjb21wb3NpdGlvblRhZygpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCkuZGVjb21wb3NpdGlvblRhZygpOyB9CiAgICB1bnNpZ25lZCBjaGFyIGNvbWJpbmluZ0NsYXNzKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5jb21iaW5pbmdDbGFzcygpOyB9CgogICAgLy8gTm90IHRoZSBub24tY29uc3Qgb25lcyBvZiB0aGVzZS4KICAgIHVjaGFyIGNlbGwoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmNlbGwoKTsgfQogICAgdWNoYXIgcm93KCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5yb3coKTsgfQojZW5kaWYKfTsKCmlubGluZSBRQ2hhclJlZiBRU3RyaW5nOjphdCggdWludCBpICkgeyByZXR1cm4gUUNoYXJSZWYodGhpcyxpKTsgfQppbmxpbmUgUUNoYXJSZWYgUVN0cmluZzo6b3BlcmF0b3JbXSggaW50IGkgKSB7IHJldHVybiBhdCgodWludClpKTsgfQoKCmNsYXNzIFFfRVhQT1JUIFFDb25zdFN0cmluZyA6IHByaXZhdGUgUVN0cmluZyB7CnB1YmxpYzoKICAgIFFDb25zdFN0cmluZyggY29uc3QgUUNoYXIqIHVuaWNvZGUsIHVpbnQgbGVuZ3RoICk7CiAgICB+UUNvbnN0U3RyaW5nKCk7CiAgICBjb25zdCBRU3RyaW5nJiBzdHJpbmcoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQp9OwoKCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNpZm5kZWYgUVRfTk9fREFUQVNUUkVBTQpRX0VYUE9SVCBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwgY29uc3QgUVN0cmluZyAmICk7ClFfRVhQT1JUIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRU3RyaW5nICYgKTsKI2VuZGlmCgovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKLy8gVGhlc2UgdHdvIG1vdmUgY29kZSBpbnRvIG1ha2VTaGFyZWROdWxsKCkgYW5kIGRlbGV0ZXNEYXRhKCkKLy8gdG8gaW1wcm92ZSBjYWNoZS1jb2hlcmVuY2UgKGFuZCByZWR1Y2UgY29kZSBibG9hdCksIHdoaWxlCi8vIGtlZXBpbmcgdGhlIGNvbW1vbiBjYXNlcyBmYXN0LgovLwovLyBObyBzYWZlIHdheSB0byBwcmUtaW5pdCBzaGFyZWRfbnVsbCBvbiBBTEwgY29tcGlsZXJzL2xpbmtlcnMuCmlubGluZSBRU3RyaW5nOjpRU3RyaW5nKCkgOgogICAgZChzaGFyZWRfbnVsbCA/IHNoYXJlZF9udWxsIDogbWFrZVNoYXJlZE51bGwoKSkKewogICAgZC0+cmVmKCk7Cn0KLy8KaW5saW5lIFFTdHJpbmc6On5RU3RyaW5nKCkKewogICAgaWYgKCBkLT5kZXJlZigpICkgewogICAgICAgIGlmICggZCAhPSBzaGFyZWRfbnVsbCApCgkgICAgZC0+ZGVsZXRlU2VsZigpOwogICAgfQp9CgovLyBuZWVkZWQgZm9yIFFEZWVwQ29weQppbmxpbmUgdm9pZCBRU3RyaW5nOjpkZXRhY2goKQp7IHJlYWxfZGV0YWNoKCk7IH0KCmlubGluZSBRU3RyaW5nIFFTdHJpbmc6OnNlY3Rpb24oIFFDaGFyIHNlcCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgZmxhZ3MgKSBjb25zdAp7IHJldHVybiBzZWN0aW9uKFFTdHJpbmcoc2VwKSwgc3RhcnQsIGVuZCwgZmxhZ3MpOyB9CgppbmxpbmUgUVN0cmluZyBRU3RyaW5nOjpzZWN0aW9uKCBjaGFyIHNlcCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgZmxhZ3MgKSBjb25zdAp7IHJldHVybiBzZWN0aW9uKFFDaGFyKHNlcCksIHN0YXJ0LCBlbmQsIGZsYWdzKTsgfQoKI2lmbmRlZiBRVF9OT19DQVNUX0FTQ0lJCmlubGluZSBRU3RyaW5nIFFTdHJpbmc6OnNlY3Rpb24oIGNvbnN0IGNoYXIgKmluX3NlcCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgZmxhZ3MgKSBjb25zdAp7IHJldHVybiBzZWN0aW9uKFFTdHJpbmcoaW5fc2VwKSwgc3RhcnQsIGVuZCwgZmxhZ3MpOyB9CiNlbmRpZgoKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6Om9wZXJhdG9yPSggUUNoYXIgYyApCnsgKnRoaXMgPSBRU3RyaW5nKGMpOyByZXR1cm4gKnRoaXM7IH0KCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpvcGVyYXRvcj0oIGNoYXIgYyApCnsgKnRoaXMgPSBRU3RyaW5nKFFDaGFyKGMpKTsgcmV0dXJuICp0aGlzOyB9CgppbmxpbmUgYm9vbCBRU3RyaW5nOjppc051bGwoKSBjb25zdAp7IHJldHVybiB1bmljb2RlKCkgPT0gMDsgfQoKaW5saW5lIGJvb2wgUVN0cmluZzo6b3BlcmF0b3IhKCkgY29uc3QKeyByZXR1cm4gaXNOdWxsKCk7IH0KCmlubGluZSB1aW50IFFTdHJpbmc6Omxlbmd0aCgpIGNvbnN0CnsgcmV0dXJuIGQtPmxlbjsgfQoKaW5saW5lIHVpbnQgUVN0cmluZzo6Y2FwYWNpdHkoKSBjb25zdAp7IHJldHVybiBkLT5tYXhsOyB9CgppbmxpbmUgYm9vbCBRU3RyaW5nOjppc0VtcHR5KCkgY29uc3QKeyByZXR1cm4gbGVuZ3RoKCkgPT0gMDsgfQoKaW5saW5lIFFTdHJpbmcgUVN0cmluZzo6Y29weSgpIGNvbnN0CnsgcmV0dXJuIFFTdHJpbmcoICp0aGlzICk7IH0KCiNpZm5kZWYgUVRfTk9fQ0FTVF9BU0NJSQppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6aW5zZXJ0KCB1aW50IGluZGV4LCBjb25zdCBjaGFyICpzICkKeyByZXR1cm4gaW5zZXJ0SGVscGVyKCBpbmRleCwgcyApOyB9CgppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6aW5zZXJ0KCB1aW50IGluZGV4LCBjb25zdCBRQnl0ZUFycmF5ICZzICkKewogICAgaW50IHBvcyA9IHMuZmluZCggMCApOwogICAgcmV0dXJuIGluc2VydEhlbHBlciggaW5kZXgsIHMsIHBvcz09LTEgPyBzLnNpemUoKSA6IHBvcyApOwp9CiNlbmRpZgoKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6OnByZXBlbmQoIGNvbnN0IFFTdHJpbmcgJiBzICkKeyByZXR1cm4gaW5zZXJ0KDAscyk7IH0KCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpwcmVwZW5kKCBRQ2hhciBjICkKeyByZXR1cm4gaW5zZXJ0KDAsYyk7IH0KCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpwcmVwZW5kKCBjaGFyIGMgKQp7IHJldHVybiBpbnNlcnQoMCxjKTsgfQoKI2lmbmRlZiBRVF9OT19DQVNUX0FTQ0lJCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpwcmVwZW5kKCBjb25zdCBRQnl0ZUFycmF5ICYgcyApCnsgcmV0dXJuIGluc2VydCgwLHMpOyB9CiNlbmRpZgoKI2lmbmRlZiBRVF9OT19DQVNUX0FTQ0lJCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpvcGVyYXRvcis9KCBjb25zdCBRQnl0ZUFycmF5ICZzICkKewogICAgaW50IHBvcyA9IHMuZmluZCggMCApOwogICAgcmV0dXJuIG9wZXJhdG9yUGx1c0VxSGVscGVyKCBzLCBwb3M9PS0xID8gcy5zaXplKCkgOiBwb3MgKTsKfQojZW5kaWYKCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjphcHBlbmQoIGNvbnN0IFFTdHJpbmcgJiBzICkKeyByZXR1cm4gb3BlcmF0b3IrPShzKTsgfQoKI2lmbmRlZiBRVF9OT19DQVNUX0FTQ0lJCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjphcHBlbmQoIGNvbnN0IFFCeXRlQXJyYXkgJnMgKQp7IHJldHVybiBvcGVyYXRvcis9KHMpOyB9CgppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6YXBwZW5kKCBjb25zdCBjaGFyICogcyApCnsgcmV0dXJuIG9wZXJhdG9yKz0ocyk7IH0KI2VuZGlmCgppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6YXBwZW5kKCBRQ2hhciBjICkKeyByZXR1cm4gb3BlcmF0b3IrPShjKTsgfQoKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6OmFwcGVuZCggY2hhciBjICkKeyByZXR1cm4gb3BlcmF0b3IrPShjKTsgfQoKI2lmbmRlZiBRVF9OT19TVEwKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6Om9wZXJhdG9yPSggY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciApCnsgcmV0dXJuIG9wZXJhdG9yPShzdHIuY19zdHIoKSk7IH0KI2lmbmRlZiBRVF9OT19DQVNUX0FTQ0lJCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpvcGVyYXRvcis9KCBjb25zdCBzdGQ6OnN0cmluZyYgcyApCnsgcmV0dXJuIG9wZXJhdG9yKz0ocy5jX3N0cigpKTsgfQppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6YXBwZW5kKCBjb25zdCBzdGQ6OnN0cmluZyYgcyApCnsgcmV0dXJuIG9wZXJhdG9yKz0ocyk7IH0KaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6OnByZXBlbmQoIGNvbnN0IHN0ZDo6c3RyaW5nJiBzICkKeyByZXR1cm4gaW5zZXJ0KDAsIHMpOyB9CiNlbmRpZgojZW5kaWYKCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpzZXROdW0oIHNob3J0IG4sIGludCBiYXNlICkKeyByZXR1cm4gc2V0TnVtKChRX0xMT05HKW4sIGJhc2UpOyB9CgppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6c2V0TnVtKCB1c2hvcnQgbiwgaW50IGJhc2UgKQp7IHJldHVybiBzZXROdW0oKFFfVUxMT05HKW4sIGJhc2UpOyB9CgppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6c2V0TnVtKCBpbnQgbiwgaW50IGJhc2UgKQp7IHJldHVybiBzZXROdW0oKFFfTExPTkcpbiwgYmFzZSk7IH0KCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpzZXROdW0oIHVpbnQgbiwgaW50IGJhc2UgKQp7IHJldHVybiBzZXROdW0oKFFfVUxMT05HKW4sIGJhc2UpOyB9CgppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6c2V0TnVtKCBmbG9hdCBuLCBjaGFyIGYsIGludCBwcmVjICkKeyByZXR1cm4gc2V0TnVtKChkb3VibGUpbixmLHByZWMpOyB9CgppbmxpbmUgUVN0cmluZyBRU3RyaW5nOjphcmcoIGludCBhLCBpbnQgZmllbGRXaWR0aCwgaW50IGJhc2UgKSBjb25zdAp7IHJldHVybiBhcmcoIChRX0xMT05HKWEsIGZpZWxkV2lkdGgsIGJhc2UgKTsgfQoKaW5saW5lIFFTdHJpbmcgUVN0cmluZzo6YXJnKCB1aW50IGEsIGludCBmaWVsZFdpZHRoLCBpbnQgYmFzZSApIGNvbnN0CnsgcmV0dXJuIGFyZyggKFFfVUxMT05HKWEsIGZpZWxkV2lkdGgsIGJhc2UgKTsgfQoKaW5saW5lIFFTdHJpbmcgUVN0cmluZzo6YXJnKCBzaG9ydCBhLCBpbnQgZmllbGRXaWR0aCwgaW50IGJhc2UgKSBjb25zdAp7IHJldHVybiBhcmcoIChRX0xMT05HKWEsIGZpZWxkV2lkdGgsIGJhc2UgKTsgfQoKaW5saW5lIFFTdHJpbmcgUVN0cmluZzo6YXJnKCB1c2hvcnQgYSwgaW50IGZpZWxkV2lkdGgsIGludCBiYXNlICkgY29uc3QKeyByZXR1cm4gYXJnKCAoUV9VTExPTkcpYSwgZmllbGRXaWR0aCwgYmFzZSApOyB9CgppbmxpbmUgUVN0cmluZyBRU3RyaW5nOjphcmcoIGNvbnN0IFFTdHJpbmcmIGExLCBjb25zdCBRU3RyaW5nJiBhMiApIGNvbnN0IHsKICAgIHJldHVybiBtdWx0aUFyZyggMiwgYTEsIGEyICk7Cn0KCmlubGluZSBRU3RyaW5nIFFTdHJpbmc6OmFyZyggY29uc3QgUVN0cmluZyYgYTEsIGNvbnN0IFFTdHJpbmcmIGEyLAoJCQkgICAgIGNvbnN0IFFTdHJpbmcmIGEzICkgY29uc3QgewogICAgcmV0dXJuIG11bHRpQXJnKCAzLCBhMSwgYTIsIGEzICk7Cn0KCmlubGluZSBRU3RyaW5nIFFTdHJpbmc6OmFyZyggY29uc3QgUVN0cmluZyYgYTEsIGNvbnN0IFFTdHJpbmcmIGEyLAoJCQkgICAgIGNvbnN0IFFTdHJpbmcmIGEzLCBjb25zdCBRU3RyaW5nJiBhNCApIGNvbnN0IHsKICAgIHJldHVybiBtdWx0aUFyZyggNCwgYTEsIGEyLCBhMywgYTQgKTsKfQoKaW5saW5lIGludCBRU3RyaW5nOjpmaW5kKCBjaGFyIGMsIGludCBpbmRleCwgYm9vbCBjcyApIGNvbnN0CnsgcmV0dXJuIGZpbmQoUUNoYXIoYyksIGluZGV4LCBjcyk7IH0KCmlubGluZSBpbnQgUVN0cmluZzo6ZmluZFJldiggY2hhciBjLCBpbnQgaW5kZXgsIGJvb2wgY3MgKSBjb25zdAp7IHJldHVybiBmaW5kUmV2KCBRQ2hhcihjKSwgaW5kZXgsIGNzICk7IH0KCiNpZm5kZWYgUVRfTk9fQ0FTVF9BU0NJSQppbmxpbmUgaW50IFFTdHJpbmc6OmZpbmQoIGNvbnN0IGNoYXIqIHN0ciwgaW50IGluZGV4ICkgY29uc3QKeyByZXR1cm4gZmluZChRU3RyaW5nOjpmcm9tQXNjaWkoc3RyKSwgaW5kZXgpOyB9CgppbmxpbmUgaW50IFFTdHJpbmc6OmZpbmRSZXYoIGNvbnN0IGNoYXIqIHN0ciwgaW50IGluZGV4ICkgY29uc3QKeyByZXR1cm4gZmluZFJldihRU3RyaW5nOjpmcm9tQXNjaWkoc3RyKSwgaW5kZXgpOyB9CiNlbmRpZgoKCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKUV9FWFBPUlQgYm9vbCBvcGVyYXRvciE9KCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgUVN0cmluZyAmczIgKTsKUV9FWFBPUlQgYm9vbCBvcGVyYXRvcjwoIGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBRU3RyaW5nICZzMiApOwpRX0VYUE9SVCBib29sIG9wZXJhdG9yPD0oIGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBRU3RyaW5nICZzMiApOwpRX0VYUE9SVCBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBRU3RyaW5nICZzMiApOwpRX0VYUE9SVCBib29sIG9wZXJhdG9yPiggY29uc3QgUVN0cmluZyAmczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7ClFfRVhQT1JUIGJvb2wgb3BlcmF0b3I+PSggY29uc3QgUVN0cmluZyAmczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CiNpZm5kZWYgUVRfTk9fQ0FTVF9BU0NJSQpRX0VYUE9SVCBib29sIG9wZXJhdG9yIT0oIGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBjaGFyICpzMiApOwpRX0VYUE9SVCBib29sIG9wZXJhdG9yPCggY29uc3QgUVN0cmluZyAmczEsIGNvbnN0IGNoYXIgKnMyICk7ClFfRVhQT1JUIGJvb2wgb3BlcmF0b3I8PSggY29uc3QgUVN0cmluZyAmczEsIGNvbnN0IGNoYXIgKnMyICk7ClFfRVhQT1JUIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUVN0cmluZyAmczEsIGNvbnN0IGNoYXIgKnMyICk7ClFfRVhQT1JUIGJvb2wgb3BlcmF0b3I+KCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKTsKUV9FWFBPUlQgYm9vbCBvcGVyYXRvcj49KCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKTsKUV9FWFBPUlQgYm9vbCBvcGVyYXRvciE9KCBjb25zdCBjaGFyICpzMSwgY29uc3QgUVN0cmluZyAmczIgKTsKUV9FWFBPUlQgYm9vbCBvcGVyYXRvcjwoIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBRU3RyaW5nICZzMiApOwpRX0VYUE9SVCBib29sIG9wZXJhdG9yPD0oIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBRU3RyaW5nICZzMiApOwpRX0VYUE9SVCBib29sIG9wZXJhdG9yPT0oIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBRU3RyaW5nICZzMiApOwovL1FfRVhQT1JUIGJvb2wgb3BlcmF0b3I+KCBjb25zdCBjaGFyICpzMSwgY29uc3QgUVN0cmluZyAmczIgKTsgLy8gTVNWQysrClFfRVhQT1JUIGJvb2wgb3BlcmF0b3I+PSggY29uc3QgY2hhciAqczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CiNlbmRpZgoKUV9FWFBPUlQgaW5saW5lIGNvbnN0IFFTdHJpbmcgb3BlcmF0b3IrKCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgUVN0cmluZyAmczIgKQp7CiAgICBRU3RyaW5nIHRtcCggczEgKTsKICAgIHRtcCArPSBzMjsKICAgIHJldHVybiB0bXA7Cn0KCiNpZm5kZWYgUVRfTk9fQ0FTVF9BU0NJSQpRX0VYUE9SVCBpbmxpbmUgY29uc3QgUVN0cmluZyBvcGVyYXRvcisoIGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBjaGFyICpzMiApCnsKICAgIFFTdHJpbmcgdG1wKCBzMSApOwogICAgdG1wICs9IFFTdHJpbmc6OmZyb21Bc2NpaShzMik7CiAgICByZXR1cm4gdG1wOwp9CgpRX0VYUE9SVCBpbmxpbmUgY29uc3QgUVN0cmluZyBvcGVyYXRvcisoIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBRU3RyaW5nICZzMiApCnsKICAgIFFTdHJpbmcgdG1wID0gUVN0cmluZzo6ZnJvbUFzY2lpKCBzMSApOwogICAgdG1wICs9IHMyOwogICAgcmV0dXJuIHRtcDsKfQojZW5kaWYKClFfRVhQT1JUIGlubGluZSBjb25zdCBRU3RyaW5nIG9wZXJhdG9yKyggY29uc3QgUVN0cmluZyAmczEsIFFDaGFyIGMyICkKewogICAgUVN0cmluZyB0bXAoIHMxICk7CiAgICB0bXAgKz0gYzI7CiAgICByZXR1cm4gdG1wOwp9CgpRX0VYUE9SVCBpbmxpbmUgY29uc3QgUVN0cmluZyBvcGVyYXRvcisoIGNvbnN0IFFTdHJpbmcgJnMxLCBjaGFyIGMyICkKewogICAgUVN0cmluZyB0bXAoIHMxICk7CiAgICB0bXAgKz0gYzI7CiAgICByZXR1cm4gdG1wOwp9CgpRX0VYUE9SVCBpbmxpbmUgY29uc3QgUVN0cmluZyBvcGVyYXRvcisoIFFDaGFyIGMxLCBjb25zdCBRU3RyaW5nICZzMiApCnsKICAgIFFTdHJpbmcgdG1wOwogICAgdG1wICs9IGMxOwogICAgdG1wICs9IHMyOwogICAgcmV0dXJuIHRtcDsKfQoKUV9FWFBPUlQgaW5saW5lIGNvbnN0IFFTdHJpbmcgb3BlcmF0b3IrKCBjaGFyIGMxLCBjb25zdCBRU3RyaW5nICZzMiApCnsKICAgIFFTdHJpbmcgdG1wOwogICAgdG1wICs9IGMxOwogICAgdG1wICs9IHMyOwogICAgcmV0dXJuIHRtcDsKfQoKI2lmbmRlZiBRVF9OT19TVEwKUV9FWFBPUlQgaW5saW5lIGNvbnN0IFFTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IFFTdHJpbmcmIHMxLCBjb25zdCBzdGQ6OnN0cmluZyYgczIpCnsKICAgIHJldHVybiBzMSArIFFTdHJpbmcoczIpOwp9CgpRX0VYUE9SVCBpbmxpbmUgY29uc3QgUVN0cmluZyBvcGVyYXRvcisoY29uc3Qgc3RkOjpzdHJpbmcmIHMxLCBjb25zdCBRU3RyaW5nJiBzMikKewogICAgUVN0cmluZyB0bXAoczIpOwogICAgcmV0dXJuIFFTdHJpbmcodG1wLnByZXBlbmQoczEpKTsKfQojZW5kaWYKCgojaWYgZGVmaW5lZChRX09TX1dJTjMyKQpleHRlcm4gUV9FWFBPUlQgUVN0cmluZyBxdF93aW5RU3RyaW5nKHZvaWQqKTsKZXh0ZXJuIFFfRVhQT1JUIGNvbnN0IHZvaWQqIHF0X3dpblRjaGFyKGNvbnN0IFFTdHJpbmcmIHN0ciwgYm9vbCBhZGRudWwpOwpleHRlcm4gUV9FWFBPUlQgdm9pZCogcXRfd2luVGNoYXJfbmV3KGNvbnN0IFFTdHJpbmcmIHN0cik7CmV4dGVybiBRX0VYUE9SVCBRQ1N0cmluZyBxdF93aW5RU3RyaW5nMk1CKCBjb25zdCBRU3RyaW5nJiBzLCBpbnQgbGVuPS0xICk7CmV4dGVybiBRX0VYUE9SVCBRU3RyaW5nIHF0X3dpbk1CMlFTdHJpbmcoIGNvbnN0IGNoYXIqIG1iLCBpbnQgbGVuPS0xICk7CiNlbmRpZgoKI2RlZmluZSBRX0RFRklORURfUVNUUklORwojaW5jbHVkZSAicXdpbmV4cG9ydC5oIgojZW5kaWYgLy8gUVNUUklOR19ICgAAAAwAcQB1AHIAbAAuAGgAAA3jLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRVVJMX0gKI2RlZmluZSBRVVJMX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXN0cmluZy5oIgojZW5kaWYgLy8gUVRfSAoKI2lmbmRlZiBRVF9OT19VUkwKCmNsYXNzIFFVcmxQcml2YXRlOwoKY2xhc3MgUV9FWFBPUlQgUVVybAp7CnB1YmxpYzoKICAgIFFVcmwoKTsKICAgIFFVcmwoIGNvbnN0IFFTdHJpbmcmIHVybCApOwogICAgUVVybCggY29uc3QgUVVybCYgdXJsICk7CiAgICBRVXJsKCBjb25zdCBRVXJsJiB1cmwsIGNvbnN0IFFTdHJpbmcmIHJlbFVybCwgYm9vbCBjaGVja1NsYXNoID0gRkFMU0UgKTsKICAgIHZpcnR1YWwgflFVcmwoKTsKCiAgICBRU3RyaW5nIHByb3RvY29sKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0UHJvdG9jb2woIGNvbnN0IFFTdHJpbmcmIHByb3RvY29sICk7CgogICAgUVN0cmluZyB1c2VyKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0VXNlciggY29uc3QgUVN0cmluZyYgdXNlciApOwogICAgYm9vbCBoYXNVc2VyKCkgY29uc3Q7CgogICAgUVN0cmluZyBwYXNzd29yZCgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFBhc3N3b3JkKCBjb25zdCBRU3RyaW5nJiBwYXNzICk7CiAgICBib29sIGhhc1Bhc3N3b3JkKCkgY29uc3Q7CgogICAgUVN0cmluZyBob3N0KCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0SG9zdCggY29uc3QgUVN0cmluZyYgdXNlciApOwogICAgYm9vbCBoYXNIb3N0KCkgY29uc3Q7CgogICAgaW50IHBvcnQoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRQb3J0KCBpbnQgcG9ydCApOwogICAgYm9vbCBoYXNQb3J0KCkgY29uc3Q7CgogICAgUVN0cmluZyBwYXRoKCBib29sIGNvcnJlY3QgPSBUUlVFICkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0UGF0aCggY29uc3QgUVN0cmluZyYgcGF0aCApOwogICAgYm9vbCBoYXNQYXRoKCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldEVuY29kZWRQYXRoQW5kUXVlcnkoIGNvbnN0IFFTdHJpbmcmIGVuYyApOwogICAgUVN0cmluZyBlbmNvZGVkUGF0aEFuZFF1ZXJ5KCk7CgogICAgdmlydHVhbCB2b2lkIHNldFF1ZXJ5KCBjb25zdCBRU3RyaW5nJiB0eHQgKTsKICAgIFFTdHJpbmcgcXVlcnkoKSBjb25zdDsKCiAgICBRU3RyaW5nIHJlZigpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFJlZiggY29uc3QgUVN0cmluZyYgdHh0ICk7CiAgICBib29sIGhhc1JlZigpIGNvbnN0OwoKICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwogICAgYm9vbCBpc0xvY2FsRmlsZSgpIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCBhZGRQYXRoKCBjb25zdCBRU3RyaW5nJiBwYXRoICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0RmlsZU5hbWUoIGNvbnN0IFFTdHJpbmcmIHR4dCApOwoKICAgIFFTdHJpbmcgZmlsZU5hbWUoKSBjb25zdDsKICAgIFFTdHJpbmcgZGlyUGF0aCgpIGNvbnN0OwoKICAgIFFVcmwmIG9wZXJhdG9yPSggY29uc3QgUVVybCYgdXJsICk7CiAgICBRVXJsJiBvcGVyYXRvcj0oIGNvbnN0IFFTdHJpbmcmIHVybCApOwoKICAgIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUVVybCYgdXJsICkgY29uc3Q7CiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFTdHJpbmcmIHVybCApIGNvbnN0OwoKICAgIHN0YXRpYyB2b2lkIGRlY29kZSggUVN0cmluZyYgdXJsICk7CiAgICBzdGF0aWMgdm9pZCBlbmNvZGUoIFFTdHJpbmcmIHVybCApOwoKICAgIG9wZXJhdG9yIFFTdHJpbmcoKSBjb25zdDsKICAgIHZpcnR1YWwgUVN0cmluZyB0b1N0cmluZyggYm9vbCBlbmNvZGVkUGF0aCA9IEZBTFNFLCBib29sIGZvcmNlUHJlcGVuZFByb3RvY29sID0gVFJVRSApIGNvbnN0OwoKICAgIHZpcnR1YWwgYm9vbCBjZFVwKCk7CgogICAgc3RhdGljIGJvb2wgaXNSZWxhdGl2ZVVybCggY29uc3QgUVN0cmluZyAmdXJsICk7Cgpwcm90ZWN0ZWQ6CiAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKICAgIHZpcnR1YWwgYm9vbCBwYXJzZSggY29uc3QgUVN0cmluZyYgdXJsICk7Cgpwcml2YXRlOgogICAgUVVybFByaXZhdGUgKmQ7Cgp9OwoKI2VuZGlmIC8vUVRfTk9fVVJMCgojZW5kaWYKAAAAFABxAHcAaQBkAGMAbwBsAGwALgBoAAAERy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojaWZuZGVmIFFXSURDT0xMX0gKI2RlZmluZSBRV0lEQ09MTF9ICiNpbmNsdWRlICJxd2lkZ2V0bGlzdC5oIgojaW5jbHVkZSAicXdpZGdldGludGRpY3QuaCIKI2VuZGlmCgAAACYAcQB0AGUAeAB0AGMAbwBkAGUAYwBmAGEAYwB0AG8AcgB5AC4AaAAAB0AvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNpZm5kZWYgUVRFWFRDT0RFQ0ZBQ1RPUllfSAojZGVmaW5lIFFURVhUQ09ERUNGQUNUT1JZX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicXN0cmluZ2xpc3QuaCIKI2VuZGlmIC8vIFFUX0gKCiNpZm5kZWYgUVRfTk9fVEVYVENPREVDCgpjbGFzcyBRVGV4dENvZGVjOwoKY2xhc3MgUV9FWFBPUlQgUVRleHRDb2RlY0ZhY3RvcnkKewpwdWJsaWM6CiAgICBzdGF0aWMgUVRleHRDb2RlYyAqY3JlYXRlRm9yTmFtZSggY29uc3QgUVN0cmluZyAmICk7CiAgICBzdGF0aWMgUVRleHRDb2RlYyAqY3JlYXRlRm9yTWliKCBpbnQgKTsKfTsKCiNlbmRpZiAvLyBRVF9OT19URVhUQ09ERUMKCiNlbmRpZiAvLyBRVEVYVENPREVDRkFDVE9SWV9ICgAAAB4AcQB3AGkAZABnAGUAdABwAGwAdQBnAGkAbgAuAGgAABCALyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFXSURHRVRQTFVHSU5fSAojZGVmaW5lIFFXSURHRVRQTFVHSU5fSAoKI2lmbmRlZiBRVF9ICiNpbmNsdWRlICJxZ3BsdWdpbi5oIgojaW5jbHVkZSAicXN0cmluZ2xpc3QuaCIKI2luY2x1ZGUgInFpY29uc2V0LmgiCiNlbmRpZiAvLyBRVF9ICiNpZm5kZWYgUVRfTk9fV0lER0VUUExVR0lOCgojaWZkZWYgUV9XU19XSU4KI2lmZGVmIFFUX1BMVUdJTgojZGVmaW5lIFFUX1dJREdFVF9QTFVHSU5fRVhQT1JUIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQojZWxzZQojZGVmaW5lIFFUX1dJREdFVF9QTFVHSU5fRVhQT1JUIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQojZW5kaWYKI2Vsc2UKI2RlZmluZSBRVF9XSURHRVRfUExVR0lOX0VYUE9SVAojZW5kaWYKCmNsYXNzIFFXaWRnZXRQbHVnaW5Qcml2YXRlOwpjbGFzcyBRV2lkZ2V0OwoKY2xhc3MgUV9FWFBPUlQgUVdpZGdldFBsdWdpbiA6IHB1YmxpYyBRR1BsdWdpbgp7CiAgICBRX09CSkVDVApwdWJsaWM6CiAgICBRV2lkZ2V0UGx1Z2luKCk7CiAgICB+UVdpZGdldFBsdWdpbigpOwoKICAgIHZpcnR1YWwgUVN0cmluZ0xpc3Qga2V5cygpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgUVdpZGdldCAqY3JlYXRlKCBjb25zdCBRU3RyaW5nICZrZXksIFFXaWRnZXQgKnBhcmVudCA9IDAsIGNvbnN0IGNoYXIgKm5hbWUgPSAwICkgPSAwOwoKICAgIHZpcnR1YWwgUVN0cmluZyBncm91cCggY29uc3QgUVN0cmluZyAma2V5ICkgY29uc3Q7CiAgICB2aXJ0dWFsIFFJY29uU2V0IGljb25TZXQoIGNvbnN0IFFTdHJpbmcgJmtleSApIGNvbnN0OwogICAgdmlydHVhbCBRU3RyaW5nIGluY2x1ZGVGaWxlKCBjb25zdCBRU3RyaW5nICZrZXkgKSBjb25zdDsKICAgIHZpcnR1YWwgUVN0cmluZyB0b29sVGlwKCBjb25zdCBRU3RyaW5nICZrZXkgKSBjb25zdDsKICAgIHZpcnR1YWwgUVN0cmluZyB3aGF0c1RoaXMoIGNvbnN0IFFTdHJpbmcgJmtleSApIGNvbnN0OwogICAgdmlydHVhbCBib29sIGlzQ29udGFpbmVyKCBjb25zdCBRU3RyaW5nICZrZXkgKSBjb25zdDsKCnByaXZhdGU6CiAgICBRV2lkZ2V0UGx1Z2luUHJpdmF0ZSAqZDsKfTsKCiNpZmRlZiBRVF9DT05UQUlORVJfQ1VTVE9NX1dJREdFVFMKCmNsYXNzIFFXaWRnZXRDb250YWluZXJQbHVnaW5Qcml2YXRlOwoKY2xhc3MgUV9FWFBPUlQgUVdpZGdldENvbnRhaW5lclBsdWdpbiA6IHB1YmxpYyBRV2lkZ2V0UGx1Z2luCnsKCnB1YmxpYzoKICAgIFFXaWRnZXRDb250YWluZXJQbHVnaW4oKTsKICAgIH5RV2lkZ2V0Q29udGFpbmVyUGx1Z2luKCk7CgogICAgdmlydHVhbCBRV2lkZ2V0KiBjb250YWluZXJPZldpZGdldCggY29uc3QgUVN0cmluZyAma2V5LCBRV2lkZ2V0ICpjb250YWluZXIgKSBjb25zdDsKICAgIHZpcnR1YWwgYm9vbCBpc1Bhc3NpdmVJbnRlcmFjdG9yKCBjb25zdCBRU3RyaW5nICZrZXksIFFXaWRnZXQgKmNvbnRhaW5lciApIGNvbnN0OwoKICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c1BhZ2VzKCBjb25zdCBRU3RyaW5nICZrZXkgKSBjb25zdDsKCiAgICB2aXJ0dWFsIFFXaWRnZXQgKmFkZFBhZ2UoIGNvbnN0IFFTdHJpbmcgJmtleSwgUVdpZGdldCAqY29udGFpbmVyLAoJCQkgICAgICBjb25zdCBRU3RyaW5nICZuYW1lLCBpbnQgaW5kZXggKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRQYWdlKCBjb25zdCBRU3RyaW5nICZrZXksIFFXaWRnZXQgKmNvbnRhaW5lciwKCQkJICAgICBjb25zdCBRU3RyaW5nICZuYW1lLCBpbnQgaW5kZXgsIFFXaWRnZXQgKnBhZ2UgKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCByZW1vdmVQYWdlKCBjb25zdCBRU3RyaW5nICZrZXksIFFXaWRnZXQgKmNvbnRhaW5lciwgaW50IGluZGV4ICkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgbW92ZVBhZ2UoIGNvbnN0IFFTdHJpbmcgJmtleSwgUVdpZGdldCAqY29udGFpbmVyLCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCApIGNvbnN0OwogICAgdmlydHVhbCBpbnQgY291bnQoIGNvbnN0IFFTdHJpbmcgJmtleSwgUVdpZGdldCAqY29udGFpbmVyICkgY29uc3Q7CiAgICB2aXJ0dWFsIGludCBjdXJyZW50SW5kZXgoIGNvbnN0IFFTdHJpbmcgJmtleSwgUVdpZGdldCAqY29udGFpbmVyICkgY29uc3Q7CiAgICB2aXJ0dWFsIFFTdHJpbmcgcGFnZUxhYmVsKCBjb25zdCBRU3RyaW5nICZrZXksIFFXaWRnZXQgKmNvbnRhaW5lciwgaW50IGluZGV4ICkgY29uc3Q7CiAgICB2aXJ0dWFsIFFXaWRnZXQgKnBhZ2UoIGNvbnN0IFFTdHJpbmcgJmtleSwgUVdpZGdldCAqY29udGFpbmVyLCBpbnQgaW5kZXggKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCByZW5hbWVQYWdlKCBjb25zdCBRU3RyaW5nICZrZXksIFFXaWRnZXQgKmNvbnRhaW5lciwKCQkJICAgICBpbnQgaW5kZXgsIGNvbnN0IFFTdHJpbmcgJm5ld05hbWUgKSBjb25zdDsKICAgIHZpcnR1YWwgUVdpZGdldExpc3QgcGFnZXMoIGNvbnN0IFFTdHJpbmcgJmtleSwgUVdpZGdldCAqY29udGFpbmVyICkgY29uc3Q7CiAgICB2aXJ0dWFsIFFTdHJpbmcgY3JlYXRlQ29kZSggY29uc3QgUVN0cmluZyAma2V5LCBjb25zdCBRU3RyaW5nICZjb250YWluZXIsCgkJCQljb25zdCBRU3RyaW5nICZwYWdlLCBjb25zdCBRU3RyaW5nICZwYWdlTmFtZSApIGNvbnN0Owp9OwoKI2VuZGlmIC8vIFFUX0NPTlRBSU5FUl9DVVNUT01fV0lER0VUUwojZW5kaWYgLy8gUVRfTk9fV0lER0VUUExVR0lOCiNlbmRpZiAvLyBRV0lER0VUUExVR0lOX0gKAAAAEABxAHQAaQBtAGUAcgAuAGgAAAk5LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZuZGVmIFFUSU1FUl9ICiNkZWZpbmUgUVRJTUVSX0gKCiNpZm5kZWYgUVRfSAojaW5jbHVkZSAicW9iamVjdC5oIgojZW5kaWYgLy8gUVRfSAoKCmNsYXNzIFFfRVhQT1JUIFFUaW1lciA6IHB1YmxpYyBRT2JqZWN0CnsKICAgIFFfT0JKRUNUCnB1YmxpYzoKICAgIFFUaW1lciggUU9iamVjdCAqcGFyZW50PTAsIGNvbnN0IGNoYXIgKm5hbWU9MCApOwogICB+UVRpbWVyKCk7CgogICAgYm9vbAlpc0FjdGl2ZSgpIGNvbnN0OwoKICAgIGludAkJc3RhcnQoIGludCBtc2VjLCBib29sIHNzaG90ID0gRkFMU0UgKTsKICAgIHZvaWQJY2hhbmdlSW50ZXJ2YWwoIGludCBtc2VjICk7CiAgICB2b2lkCXN0b3AoKTsKCiAgICBzdGF0aWMgdm9pZCBzaW5nbGVTaG90KCBpbnQgbXNlYywgUU9iamVjdCAqcmVjZWl2ZXIsIGNvbnN0IGNoYXIgKm1lbWJlciApOwoKICAgIGludAkJdGltZXJJZCgpIGNvbnN0CXsgcmV0dXJuIGlkOyB9CgpzaWduYWxzOgogICAgdm9pZAl0aW1lb3V0KCk7Cgpwcm90ZWN0ZWQ6CiAgICBib29sCWV2ZW50KCBRRXZlbnQgKiApOwoKcHJpdmF0ZToKICAgIGludCBpZDsKICAgIHVpbnQgc2luZ2xlIDogMTsKICAgIHVpbnQgbnVsbHRpbWVyIDogMTsKCnByaXZhdGU6CS8vIERpc2FibGVkIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPQojaWYgZGVmaW5lZChRX0RJU0FCTEVfQ09QWSkKICAgIFFUaW1lciggY29uc3QgUVRpbWVyICYgKTsKICAgIFFUaW1lciAmb3BlcmF0b3I9KCBjb25zdCBRVGltZXIgJiApOwojZW5kaWYKfTsKCgppbmxpbmUgYm9vbCBRVGltZXI6OmlzQWN0aXZlKCkgY29uc3QKewogICAgcmV0dXJuIGlkID49IDA7Cn0KCgojZW5kaWYgLy8gUVRJTUVSX0gKAAAAJgBxAHcAaQBuAGYAdQBuAGMAdABpAG8AbgBzAF8AdwBjAGUALgBoAAAE5i8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBRV0lORlVOQ1RJT05TX1dDRV9ICiNkZWZpbmUgUVdJTkZVTkNUSU9OU19XQ0VfSAoKI2lmbmRlZiBRVF9ICiNlbmRpZiAvLyBRVF9ICgojaW5jbHVkZSAicWZ1bmN0aW9uc193Y2UuaCIKCiNlbmRpZiAvLyBRV0lORlVOQ1RJT05TX1dDRV9ICg==