LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCiNpZm5kZWYgQUdFTlRfSEFORExFUl9ICiNkZWZpbmUgQUdFTlRfSEFORExFUl9ICgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICAgICAgICAgICJDIiB7CiNlbmRpZgoKLyoqIEBmaWxlIGFnZW50X2hhbmRsZXIuaAogKgogKiAgQGFkZHRvZ3JvdXAgaGFuZGxlcgogKgogKiBAewogKi8KCnN0cnVjdCBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX3M7CgovKgogKiBwZXIgbWliIGhhbmRsZXIgZmxhZ3MuCiAqIE5PVEU6IExvd2VyIGJpdHMgYXJlIHJlc2VydmVkIGZvciB0aGUgYWdlbnQgaGFuZGxlcidzIHVzZS4KICogICAgICAgVGhlIGhpZ2ggNCBiaXRzICgzMS0yOCkgYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGhhbmRsZXIuCiAqLwojZGVmaW5lIE1JQl9IQU5ETEVSX0FVVE9fTkVYVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCiNkZWZpbmUgTUlCX0hBTkRMRVJfQVVUT19ORVhUX09WRVJSSURFX09OQ0UgICAgIDB4MDAwMDAwMDIKI2RlZmluZSBNSUJfSEFORExFUl9JTlNUQU5DRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAoKI2RlZmluZSBNSUJfSEFORExFUl9DVVNUT000ICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAojZGVmaW5lIE1JQl9IQU5ETEVSX0NVU1RPTTMgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCiNkZWZpbmUgTUlCX0hBTkRMRVJfQ1VTVE9NMiAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKI2RlZmluZSBNSUJfSEFORExFUl9DVVNUT00xICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAoKCi8qKiBAdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9taWJfaGFuZGxlcl9zIG5ldHNubXBfbWliX2hhbmRsZXIKICogVHlwZWRlZnMgdGhlIG5ldHNubXBfbWliX2hhbmRsZXJfcyBzdHJ1Y3QgaW50byAgbmV0c25tcF9taWJfaGFuZGxlciAqLwoKLyoqIEBzdHJ1Y3QgbmV0c25tcF9taWJfaGFuZGxlcl9zCiAqICB0aGUgbWliIGhhbmRsZXIgc3RydWN0dXJlIHRvIGJlIHJlZ2lzdGVyZWQKICovCnR5cGVkZWYgc3RydWN0IG5ldHNubXBfbWliX2hhbmRsZXJfcyB7CiAgICAgICAgY2hhciAgICAgICAgICAgKmhhbmRsZXJfbmFtZTsKCS8qKiBmb3IgaGFuZGxlcidzIGludGVybmFsIHVzZSAqLwogICAgICAgIHZvaWQgICAgICAgICAgICpteXZvaWQ7IAogICAgICAgIC8qKiBmb3IgYWdlbnRfaGFuZGxlcidzIGludGVybmFsIHVzZSAqLwogICAgICAgIGludCAgICAgICAgICAgICBmbGFnczsKCiAgICAgICAgLyoqIGlmIHlvdSBhZGQgbW9yZSBtZW1iZXJzLCB5b3UgcHJvYmFibHkgYWxzbyB3YW50IHRvIHVwZGF0ZSAqLwogICAgICAgIC8qKiBfY2xvbmVfaGFuZGxlciBpbiBhZ2VudF9oYW5kbGVyLmMuICovCgkKICAgICAgICBpbnQgICAgICAgICAgICAgKCphY2Nlc3NfbWV0aG9kKSAoc3RydWN0IG5ldHNubXBfbWliX2hhbmRsZXJfcyAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9zICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mb19zICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRzbm1wX3JlcXVlc3RfaW5mb19zICopOwogICAgICAgIHZvaWQgKCpkYXRhX2ZyZWUpKHZvaWQgKm15dm9pZCk7IC8qKjwgZGF0YSBmcmVlIGhvb2sgZm9yIG15dm9pZCAqLwoKICAgICAgICBzdHJ1Y3QgbmV0c25tcF9taWJfaGFuZGxlcl9zICpuZXh0OwogICAgICAgIHN0cnVjdCBuZXRzbm1wX21pYl9oYW5kbGVyX3MgKnByZXY7Cn0gbmV0c25tcF9taWJfaGFuZGxlcjsKCi8qCiAqIHBlciByZWdpc3RyYXRpb24gZmxhZ3MKICovCiNkZWZpbmUgSEFORExFUl9DQU5fR0VUQU5ER0VUTkVYVCAgICAgMHgwMSAgICAgICAvKiBtdXN0IGJlIGFibGUgdG8gZG8gYm90aCAqLwojZGVmaW5lIEhBTkRMRVJfQ0FOX1NFVCAgICAgICAgICAgICAgIDB4MDIgICAgICAgICAgIC8qIGltcGxpZXMgY3JlYXRlLCB0b28gKi8KI2RlZmluZSBIQU5ETEVSX0NBTl9HRVRCVUxLICAgICAgICAgICAweDA0CiNkZWZpbmUgSEFORExFUl9DQU5fTk9UX0NSRUFURSAgICAgICAgMHgwOCAgICAgICAgIC8qIGF1dG8gc2V0IGlmICEgQ0FOX1NFVCAqLwojZGVmaW5lIEhBTkRMRVJfQ0FOX0JBQllfU1RFUCAgICAgICAgIDB4MTAKI2RlZmluZSBIQU5ETEVSX0NBTl9TVEFTSCAgICAgICAgICAgICAweDIwCgoKI2RlZmluZSBIQU5ETEVSX0NBTl9ST05MWSAgIChIQU5ETEVSX0NBTl9HRVRBTkRHRVRORVhUKQojZGVmaW5lIEhBTkRMRVJfQ0FOX1JXUklURSAgKEhBTkRMRVJfQ0FOX0dFVEFOREdFVE5FWFQgfCBIQU5ETEVSX0NBTl9TRVQpCiNkZWZpbmUgSEFORExFUl9DQU5fU0VUX09OTFkgKEhBTkRMRVJfQ0FOX1NFVCB8IEhBTkRMRVJfQ0FOX05PVF9DUkVBVEUpCiNkZWZpbmUgSEFORExFUl9DQU5fREVGQVVMVCAoSEFORExFUl9DQU5fUk9OTFkgfCBIQU5ETEVSX0NBTl9OT1RfQ1JFQVRFKQoKLyoqIEB0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX3MgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbgogKiBUeXBlZGVmcyB0aGUgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9zIHN0cnVjdCBpbnRvIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gICovCgovKiogQHN0cnVjdCBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX3MKICogIFJvb3QgcmVnaXN0cmF0aW9uIGluZm8uCiAqICBUaGUgdmFyaWFibGVzIGhhbmRsZXJOYW1lLCBjb250ZXh0TmFtZSwgYW5kIHJvb3RvaWQgbmVlZCB0byBiZSBhbGxvY2F0ZWQKICogIG9uIHRoZSBoZWFwLCB3aGVuIHRoZSByZWdpc3RyYXRpb24gc3RydWN0dXJlIGlzIHVucmVnaXN0ZXJlZCB1c2luZwogKiAgdW5yZWdpc3Rlcl9taWJfY29udGV4dCgpIHRoZSBjb2RlIGF0dGVtcHRzIHRvIGZyZWUgdGhlbS4KICovCnR5cGVkZWYgc3RydWN0IG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb25fcyB7CgoJLyoqIGZvciBtclRhYmxlIGxpc3RpbmdzLCBhbmQgb3RoZXIgdXNlcyAqLwogICAgICAgIGNoYXIgICAgICAgICAgICpoYW5kbGVyTmFtZTsKCS8qKiBOVUxMID0gZGVmYXVsdCBjb250ZXh0ICovCiAgICAgICAgY2hhciAgICAgICAgICAgKmNvbnRleHROYW1lOyAgICAKCiAgICAgICAgLyoqCiAgICAgICAgICogd2hlcmUgYXJlIHdlIHJlZ2lzdGVyZWQgYXQ/IAogICAgICAgICAqLwogICAgICAgIG9pZCAgICAgICAgICAgICpyb290b2lkOwogICAgICAgIHNpemVfdCAgICAgICAgICByb290b2lkX2xlbjsKCiAgICAgICAgLyoqCiAgICAgICAgICogaGFuZGxlciBkZXRhaWxzIAogICAgICAgICAqLwogICAgICAgIG5ldHNubXBfbWliX2hhbmRsZXIgKmhhbmRsZXI7CiAgICAgICAgaW50ICAgICAgICAgICAgIG1vZGVzOwoKICAgICAgICAvKioKICAgICAgICAgKiBtb3JlIG9wdGlvbmFsIHN0dWZmIAogICAgICAgICAqLwogICAgICAgIGludCAgICAgICAgICAgICBwcmlvcml0eTsKICAgICAgICBpbnQgICAgICAgICAgICAgcmFuZ2Vfc3ViaWQ7CiAgICAgICAgb2lkICAgICAgICAgICAgIHJhbmdlX3Vib3VuZDsKICAgICAgICBpbnQgICAgICAgICAgICAgdGltZW91dDsKICAgICAgICBpbnQgICAgICAgICAgICAgZ2xvYmFsX2NhY2hlaWQ7CgogICAgICAgIC8qKgogICAgICAgICAqIHZvaWQgcHRyIGZvciByZWdpc3RlcmVlCiAgICAgICAgICovCiAgICAgICAgdm9pZCAqICAgICAgICAgIG15X3JlZ192b2lkOwoKfSBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uOwoKLyoKICogZnVuY3Rpb24gaGFuZGxlciBkZWZpbml0aW9ucyAKICovCgp0eXBlZGVmIGludCAoTmV0c25tcF9Ob2RlX0hhbmRsZXIpIChuZXRzbm1wX21pYl9oYW5kbGVyICpoYW5kbGVyLAogICAgLyoqIHBvaW50ZXIgdG8gcmVnaXN0cmF0aW9uIHN0cnVjdCAqLwogICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqcmVnaW5mbywKICAgIC8qKiBwb2ludGVyIHRvIGN1cnJlbnQgdHJhbnNhY3Rpb24gKi8KICAgIG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvICpyZXFpbmZvLAogICAgbmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3RzKTsKCiAgICB0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX2hhbmRsZXJfYXJnc19zIHsKICAgICAgICBuZXRzbm1wX21pYl9oYW5kbGVyICpoYW5kbGVyOwogICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKnJlZ2luZm87CiAgICAgICAgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8gKnJlcWluZm87CiAgICAgICAgbmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3RzOwogICAgfSBuZXRzbm1wX2hhbmRsZXJfYXJnczsKCiAgICB0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX2RlbGVnYXRlZF9jYWNoZV9zIHsKICAgICAgICBpbnQgICAgICAgICAgICAgdHJhbnNhY3Rpb25faWQ7CiAgICAgICAgbmV0c25tcF9taWJfaGFuZGxlciAqaGFuZGxlcjsKICAgICAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uICpyZWdpbmZvOwogICAgICAgIG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvICpyZXFpbmZvOwogICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0czsKICAgICAgICB2b2lkICAgICAgICAgICAqbG9jYWxpbmZvOwogICAgfSBuZXRzbm1wX2RlbGVnYXRlZF9jYWNoZTsKCiAgICAvKgogICAgICogaGFuZGxlciBBUEkgZnVuY3Rpb25zIAogICAgICovCiAgICB2b2lkICAgICAgICAgICAgbmV0c25tcF9pbml0X2hhbmRsZXJfY29uZih2b2lkKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX3JlZ2lzdGVyX2hhbmRsZXIobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbyk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF91bnJlZ2lzdGVyX2hhbmRsZXIobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpbmZvKTsKICAgIGludCAgICAgICAgICAgIAogICAgICAgIG5ldHNubXBfcmVnaXN0ZXJfaGFuZGxlcl9ub2NhbGxiYWNrKG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbyk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9pbmplY3RfaGFuZGxlcihuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfbWliX2hhbmRsZXIgKmhhbmRsZXIpOwogICAgaW50CiAgICAgICAgbmV0c25tcF9pbmplY3RfaGFuZGxlcl9iZWZvcmUobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21pYl9oYW5kbGVyICpoYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJlZm9yZV93aGF0KTsKICAgIG5ldHNubXBfbWliX2hhbmRsZXIKICAgICAgICAqbmV0c25tcF9maW5kX2hhbmRsZXJfYnlfbmFtZShuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2luZm8sIGNvbnN0IGNoYXIgKm5hbWUpOwogICAgdm9pZCAgICAgICAgICAKICAgICAgICAqbmV0c25tcF9maW5kX2hhbmRsZXJfZGF0YV9ieV9uYW1lKG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpbmZvLCBjb25zdCBjaGFyICpuYW1lKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX2NhbGxfaGFuZGxlcnMobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlcWluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0cyk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9jYWxsX2hhbmRsZXIobmV0c25tcF9taWJfaGFuZGxlciAqbmV4dF9oYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXFpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0cyk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9jYWxsX25leHRfaGFuZGxlcihuZXRzbm1wX21pYl9oYW5kbGVyICpjdXJyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlcWluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlcXVlc3RzKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX2NhbGxfbmV4dF9oYW5kbGVyX29uZV9yZXF1ZXN0KG5ldHNubXBfbWliX2hhbmRsZXIgKmN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uICpyZWdpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8gKnJlcWluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdHMpOwogICAgCiAgICBuZXRzbm1wX21pYl9oYW5kbGVyICpuZXRzbm1wX2NyZWF0ZV9oYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHNubXBfTm9kZV9IYW5kbGVyICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl9hY2Nlc3NfbWV0aG9kKTsKICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKgogICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfbWliX2hhbmRsZXIgKmhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiByZWdfb2lkLCBzaXplX3QgcmVnX29pZF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZXMpOwogICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqCiAgICBuZXRzbm1wX2NyZWF0ZV9oYW5kbGVyX3JlZ2lzdHJhdGlvbihjb25zdCBjaGFyICpuYW1lLCBOZXRzbm1wX05vZGVfSGFuZGxlcioKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfYWNjZXNzX21ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqcmVnX29pZCwgc2l6ZV90IHJlZ19vaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGVzKTsKCiAgICBuZXRzbm1wX2RlbGVnYXRlZF9jYWNoZQogICAgICAgICpuZXRzbm1wX2NyZWF0ZV9kZWxlZ2F0ZWRfY2FjaGUobmV0c25tcF9taWJfaGFuZGxlciAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICosIHZvaWQgKik7CiAgICB2b2lkIG5ldHNubXBfZnJlZV9kZWxlZ2F0ZWRfY2FjaGUobmV0c25tcF9kZWxlZ2F0ZWRfY2FjaGUgKmRjYWNoZSk7CiAgICBuZXRzbm1wX2RlbGVnYXRlZF9jYWNoZQogICAgICAgICpuZXRzbm1wX2hhbmRsZXJfY2hlY2tfY2FjaGUobmV0c25tcF9kZWxlZ2F0ZWRfY2FjaGUgKmRjYWNoZSk7CiAgICB2b2lkICAgICAgICAgICAgbmV0c25tcF9yZWdpc3Rlcl9oYW5kbGVyX2J5X25hbWUoY29uc3QgY2hhciAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfbWliX2hhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKTsKCiAgICB2b2lkICAgICAgICAgICAgbmV0c25tcF9jbGVhcl9oYW5kbGVyX2xpc3Qodm9pZCk7CgogICAgdm9pZAogICAgICAgIG5ldHNubXBfcmVxdWVzdF9hZGRfbGlzdF9kYXRhKG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZGF0YV9saXN0ICpub2RlKTsKICAgIGludCBuZXRzbm1wX3JlcXVlc3RfcmVtb3ZlX2xpc3RfZGF0YShuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKCiAgICBpbnQKICAgICAgICBuZXRzbm1wX3JlcXVlc3RfcmVtb3ZlX2xpc3RfZGF0YShuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKCiAgICB2b2lkICAgICpuZXRzbm1wX3JlcXVlc3RfZ2V0X2xpc3RfZGF0YShuZXRzbm1wX3JlcXVlc3RfaW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwoKICAgIHZvaWQKICAgICAgICAgICAgICBuZXRzbm1wX2ZyZWVfcmVxdWVzdF9kYXRhX3NldChuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdCk7CgogICAgdm9pZAogICAgICAgICAgICAgbmV0c25tcF9mcmVlX3JlcXVlc3RfZGF0YV9zZXRzKG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0KTsKCiAgICB2b2lkICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX2ZyZWUobmV0c25tcF9taWJfaGFuZGxlciAqKTsKICAgIG5ldHNubXBfbWliX2hhbmRsZXIgKm5ldHNubXBfaGFuZGxlcl9kdXAobmV0c25tcF9taWJfaGFuZGxlciAqKTsKICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24KICAgICAgICAqbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9kdXAobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqKTsKICAgIHZvaWQgICAgICAgICAgIAogICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb25fZnJlZShuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uICopOwoKI2RlZmluZSBSRVFVRVNUX0lTX0RFTEVHQVRFRCAgICAgMQojZGVmaW5lIFJFUVVFU1RfSVNfTk9UX0RFTEVHQVRFRCAwCiAgICB2b2lkICAgICAgICAgICAKICAgICAgICBuZXRzbm1wX2hhbmRsZXJfbWFya19yZXF1ZXN0c19hc19kZWxlZ2F0ZWQobmV0c25tcF9yZXF1ZXN0X2luZm8gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KTsKICAgIHZvaWQgICAgICAgICAgICpuZXRzbm1wX2hhbmRsZXJfZ2V0X3BhcmVudF9kYXRhKG5ldHNubXBfcmVxdWVzdF9pbmZvICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICopOwoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFHRU5UX0hBTkRMRVJfSCAqLwovKiogQH0gKi8K