LyoKICogY29tX3JpZ2h0LmMgLS0gcHJvdmlkZSBIZWltZGFsbCAvIEtlcmJlcm9zNGt0aCBjb21fZXJyIGludGVyZmFjZXMKICogCWZvciBiYWNrd2FyZHMgY29tcGF0YmlsaXR5CiAqCiAqIENvcHlyaWdodCAoYykgMjAwMyBieSBUaGVvZG9yZSBUcydvCiAqCiAqIFRha2VuIGZyb20gbGliL2NvbV9lcnIvZXJyb3IuYyBmcm9tIEtlcmJlcm9zNGt0aCBkaXN0cmlidXRpb24uCiAqCiAqIENvcHlyaWdodCAoYykgMTk5NywgMTk5OCwgMjAwMSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAiY29tX2Vyci5oIgojaW5jbHVkZSAiZXJyb3JfdGFibGUuaCIKCmNvbnN0IGNoYXIgKgpjb21fcmlnaHQoc3RydWN0IGV0X2xpc3QgKmxpc3QsIGxvbmcgY29kZSkKewogICAgc3RydWN0IGV0X2xpc3QgKnA7CiAgICBmb3IgKHAgPSBsaXN0OyBwOyBwID0gcC0+bmV4dCkgewoJaWYgKGNvZGUgPj0gcC0+dGFibGUtPmJhc2UgJiYgY29kZSA8IHAtPnRhYmxlLT5iYXNlICsgcC0+dGFibGUtPm5fbXNncykKCSAgICByZXR1cm4gcC0+dGFibGUtPm1zZ3NbY29kZSAtIHAtPnRhYmxlLT5iYXNlXTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9Cgpjb25zdCBjaGFyICoKY29tX3JpZ2h0X3Ioc3RydWN0IGV0X2xpc3QgKmxpc3QsIGxvbmcgY29kZSwgY2hhciAqc3RyLCBzaXplX3QgbGVuKQp7CiAgICBzdHJ1Y3QgZXRfbGlzdCAqcDsKICAgIGZvciAocCA9IGxpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CglpZiAoKGNvZGUgPj0gcC0+dGFibGUtPmJhc2UpICYmCgkgICAgKGNvZGUgPCBwLT50YWJsZS0+YmFzZSArIHAtPnRhYmxlLT5uX21zZ3MpKSB7CiAgICAgICAgICAgIHN0cm5jcHkoc3RyLCBwLT50YWJsZS0+bXNnc1tjb2RlIC0gcC0+dGFibGUtPmJhc2VdLCBsZW4pOwogICAgICAgICAgICBzdHJbbGVuLTFdID0gJ1wwJzsKICAgICAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKc3RydWN0IGZvb2JhciB7CiAgICBzdHJ1Y3QgZXRfbGlzdCBldGw7CiAgICBzdHJ1Y3QgZXJyb3JfdGFibGUgdGFiOwp9OwoKLyoKICogV2UgcHJvdmlkZSB0aGlzIHJvdXRpbmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBIZWltZGFsbCBnZW5lcmF0ZWQKICogZm9vX2Vyci5jIGZpbGVzLCBidXQgd2UgZG9uJ3QgdXNlIHRoaXMgb3Vyc2VsdmVzIGZvciBmb29fZXJyLmMKICogZmlsZXMgZ2VuZXJhdGVkIGJ5IG91ciBjb21waWxlX2V0LiAgVGhpcyBpcyBzbyBvdXIgZm9vX2Vyci5jCiAqIGZpbGVzIGNhbiBiZSB1c2VkIHdpdGggb2xkZXIgY29tX2VyciBsaWJyYXJpZXMgd2l0aG91dCBydW5uaW5nCiAqIGFmb3VsIG9mIGRlcGVuZGVuY2llcy4KICovCnZvaWQKaW5pdGlhbGl6ZV9lcnJvcl90YWJsZV9yKHN0cnVjdCBldF9saXN0ICoqbGlzdCwKCQkJIGNvbnN0IGNoYXIgKiptZXNzYWdlcywKCQkJIGludCBudW1fZXJyb3JzLAoJCQkgbG9uZyBiYXNlKQp7CiAgICBzdHJ1Y3QgZXRfbGlzdCAqZXQsICoqZW5kOwogICAgc3RydWN0IGVycm9yX3RhYmxlICp0YWI7CiAgICBzdHJ1Y3QgZm9vYmFyICpmOwoKICAgIGZvciAoZW5kID0gbGlzdCwgZXQgPSAqbGlzdDsgZXQ7IGVuZCA9ICZldC0+bmV4dCwgZXQgPSBldC0+bmV4dCkKICAgICAgICBpZiAoZXQtPnRhYmxlLT5tc2dzID09IG1lc3NhZ2VzKQogICAgICAgICAgICByZXR1cm47CiAgICBmID0gbWFsbG9jKHNpemVvZigqZikpOwogICAgaWYgKGYgPT0gTlVMTCkKICAgICAgICByZXR1cm47CiAgICBldCA9ICZmLT5ldGw7CiAgICBldC0+dGFibGUgPSB0YWIgPSAmZi0+dGFiOwogICAgdGFiLT5tc2dzID0gbWVzc2FnZXM7CiAgICB0YWItPm5fbXNncyA9IG51bV9lcnJvcnM7CiAgICB0YWItPmJhc2UgPSBiYXNlOwogICAgZXQtPm5leHQgPSBOVUxMOwogICAgKmVuZCA9IGV0Owp9CgoKdm9pZApmcmVlX2Vycm9yX3RhYmxlKHN0cnVjdCBldF9saXN0ICpldCkKewogICAgd2hpbGUoZXQpewoJc3RydWN0IGV0X2xpc3QgKnAgPSBldDsKCWV0ID0gZXQtPm5leHQ7CglmcmVlKHApOwogICAgfQp9Cg==