LyogVG9wIGxldmVsIG9mIEdDQyBjb21waWxlcnMgKGNjMSwgY2MxcGx1cywgZXRjLikKICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTg4LCAxOTg5LCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LAogICAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4CiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgoKR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKdmVyc2lvbi4KCkdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQo8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKLyogVGhpcyBpcyB0aGUgdG9wIGxldmVsIG9mIGNjMS9jKysuCiAgIEl0IHBhcnNlcyBjb21tYW5kIGFyZ3MsIG9wZW5zIGZpbGVzLCBpbnZva2VzIHRoZSB2YXJpb3VzIHBhc3NlcwogICBpbiB0aGUgcHJvcGVyIG9yZGVyLCBhbmQgY291bnRzIHRoZSB0aW1lIHVzZWQgYnkgZWFjaC4KICAgRXJyb3IgbWVzc2FnZXMgYW5kIGxvdy1sZXZlbCBpbnRlcmZhY2UgdG8gbWFsbG9jIGFsc28gaGFuZGxlZCBoZXJlLiAgKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI3VuZGVmIEZMT0FUIC8qIFRoaXMgaXMgZm9yIGhwdXguIFRoZXkgc2hvdWxkIGNoYW5nZSBocHV4LiAgKi8KI3VuZGVmIEZGUyAgLyogU29tZSBzeXN0ZW1zIGRlZmluZSB0aGlzIGluIHBhcmFtLmguICAqLwojaW5jbHVkZSAic3lzdGVtLmgiCiNpbmNsdWRlICJjb3JldHlwZXMuaCIKI2luY2x1ZGUgInRtLmgiCiNpbmNsdWRlIDxzaWduYWwuaD4KCiNpZmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICiMgaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiNlbmRpZgoKI2lmZGVmIEhBVkVfU1lTX1RJTUVTX0gKIyBpbmNsdWRlIDxzeXMvdGltZXMuaD4KI2VuZGlmCgojaW5jbHVkZSAibGluZS1tYXAuaCIKI2luY2x1ZGUgImlucHV0LmgiCiNpbmNsdWRlICJ0cmVlLmgiCiNpbmNsdWRlICJ2ZXJzaW9uLmgiCiNpbmNsdWRlICJydGwuaCIKI2luY2x1ZGUgInRtX3AuaCIKI2luY2x1ZGUgImZsYWdzLmgiCiNpbmNsdWRlICJpbnNuLWF0dHIuaCIKI2luY2x1ZGUgImluc24tY29uZmlnLmgiCiNpbmNsdWRlICJpbnNuLWZsYWdzLmgiCiNpbmNsdWRlICJoYXJkLXJlZy1zZXQuaCIKI2luY2x1ZGUgInJlY29nLmgiCiNpbmNsdWRlICJvdXRwdXQuaCIKI2luY2x1ZGUgImV4Y2VwdC5oIgojaW5jbHVkZSAiZnVuY3Rpb24uaCIKI2luY2x1ZGUgInRvcGxldi5oIgojaW5jbHVkZSAiZXhwci5oIgojaW5jbHVkZSAiYmFzaWMtYmxvY2suaCIKI2luY2x1ZGUgImludGwuaCIKI2luY2x1ZGUgImdnYy5oIgojaW5jbHVkZSAiZ3JhcGguaCIKI2luY2x1ZGUgInJlZ3MuaCIKI2luY2x1ZGUgInRpbWV2YXIuaCIKI2luY2x1ZGUgImRpYWdub3N0aWMuaCIKI2luY2x1ZGUgInBhcmFtcy5oIgojaW5jbHVkZSAicmVsb2FkLmgiCiNpbmNsdWRlICJpcmEuaCIKI2luY2x1ZGUgImR3YXJmMmFzbS5oIgojaW5jbHVkZSAiaW50ZWdyYXRlLmgiCiNpbmNsdWRlICJyZWFsLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgojaW5jbHVkZSAidGFyZ2V0LmgiCiNpbmNsdWRlICJsYW5naG9va3MuaCIKI2luY2x1ZGUgImNmZ2xheW91dC5oIgojaW5jbHVkZSAiY2ZnbG9vcC5oIgojaW5jbHVkZSAiaG9zdGhvb2tzLmgiCiNpbmNsdWRlICJjZ3JhcGguaCIKI2luY2x1ZGUgIm9wdHMuaCIKI2luY2x1ZGUgImNvdmVyYWdlLmgiCiNpbmNsdWRlICJ2YWx1ZS1wcm9mLmgiCiNpbmNsdWRlICJhbGxvYy1wb29sLmgiCiNpbmNsdWRlICJ0cmVlLW11ZGZsYXAuaCIKI2luY2x1ZGUgInRyZWUtcGFzcy5oIgojaW5jbHVkZSAiZ2ltcGxlLmgiCgojaWYgZGVmaW5lZCAoRFdBUkYyX1VOV0lORF9JTkZPKSB8fCBkZWZpbmVkIChEV0FSRjJfREVCVUdHSU5HX0lORk8pCiNpbmNsdWRlICJkd2FyZjJvdXQuaCIKI2VuZGlmCgojaWYgZGVmaW5lZChEQlhfREVCVUdHSU5HX0lORk8pIHx8IGRlZmluZWQoWENPRkZfREVCVUdHSU5HX0lORk8pCiNpbmNsdWRlICJkYnhvdXQuaCIKI2VuZGlmCgojaWZkZWYgU0RCX0RFQlVHR0lOR19JTkZPCiNpbmNsdWRlICJzZGJvdXQuaCIKI2VuZGlmCgojaWZkZWYgWENPRkZfREVCVUdHSU5HX0lORk8KI2luY2x1ZGUgInhjb2Zmb3V0LmgiCQkvKiBOZWVkZWQgZm9yIGV4dGVybmFsIGRhdGEKCQkJCSAgIGRlY2xhcmF0aW9ucyBmb3IgZS5nLiBBSVggNC54LiAgKi8KI2VuZGlmCgpzdGF0aWMgdm9pZCBnZW5lcmFsX2luaXQgKGNvbnN0IGNoYXIgKik7CnN0YXRpYyB2b2lkIGRvX2NvbXBpbGUgKHZvaWQpOwpzdGF0aWMgdm9pZCBwcm9jZXNzX29wdGlvbnMgKHZvaWQpOwpzdGF0aWMgdm9pZCBiYWNrZW5kX2luaXQgKHZvaWQpOwpzdGF0aWMgaW50IGxhbmdfZGVwZW5kZW50X2luaXQgKGNvbnN0IGNoYXIgKik7CnN0YXRpYyB2b2lkIGluaXRfYXNtX291dHB1dCAoY29uc3QgY2hhciAqKTsKc3RhdGljIHZvaWQgZmluYWxpemUgKHZvaWQpOwoKc3RhdGljIHZvaWQgY3Jhc2hfc2lnbmFsIChpbnQpIEFUVFJJQlVURV9OT1JFVFVSTjsKc3RhdGljIHZvaWQgc2V0dXBfY29yZV9kdW1waW5nICh2b2lkKTsKc3RhdGljIHZvaWQgY29tcGlsZV9maWxlICh2b2lkKTsKCi8qIE5vbnplcm8gdG8gZHVtcCBkZWJ1ZyBpbmZvIHdoaWxzdCBwYXJzaW5nICgtZHkgb3B0aW9uKS4gICovCnN0YXRpYyBpbnQgc2V0X3l5ZGVidWc7CgovKiBUcnVlIGlmIHdlIGRvbid0IG5lZWQgYSBiYWNrZW5kIChlLmcuIHByZXByb2Nlc3Npbmcgb25seSkuICAqLwpzdGF0aWMgYm9vbCBub19iYWNrZW5kOwoKLyogTGVuZ3RoIG9mIGxpbmUgd2hlbiBwcmludGluZyBzd2l0Y2ggdmFsdWVzLiAgKi8KI2RlZmluZSBNQVhfTElORSA3NQoKLyogTmFtZSBvZiBwcm9ncmFtIGludm9rZWQsIHNhbnMgZGlyZWN0b3JpZXMuICAqLwoKY29uc3QgY2hhciAqcHJvZ25hbWU7CgovKiBDb3B5IG9mIGFyZ3VtZW50IHZlY3RvciB0byB0b3BsZXZfbWFpbi4gICovCnN0YXRpYyBjb25zdCBjaGFyICoqc2F2ZV9hcmd2OwoKLyogTmFtZSBvZiB0b3AtbGV2ZWwgb3JpZ2luYWwgc291cmNlIGZpbGUgKHdoYXQgd2FzIGlucHV0IHRvIGNwcCkuCiAgIFRoaXMgY29tZXMgZnJvbSB0aGUgIy1jb21tYW5kIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFjdHVhbCBpbnB1dC4KICAgSWYgdGhlcmUgaXNuJ3QgYW55IHRoZXJlLCB0aGVuIHRoaXMgaXMgdGhlIGNjMSBpbnB1dCBmaWxlIG5hbWUuICAqLwoKY29uc3QgY2hhciAqbWFpbl9pbnB1dF9maWxlbmFtZTsKCi8qIFVzZWQgdG8gZW5hYmxlIC1mdmFyLXRyYWNraW5nLCAtZndlYiBhbmQgLWZyZW5hbWUtcmVnaXN0ZXJzIGFjY29yZGluZwogICB0byBvcHRpbWl6ZSBhbmQgZGVmYXVsdF9kZWJ1Z19ob29rcyBpbiBwcm9jZXNzX29wdGlvbnMgKCkuICAqLwojZGVmaW5lIEFVVE9ERVRFQ1RfVkFMVUUgMgoKLyogQ3VycmVudCBwb3NpdGlvbiBpbiByZWFsIHNvdXJjZSBmaWxlLiAgKi8KCmxvY2F0aW9uX3QgaW5wdXRfbG9jYXRpb247CgpzdHJ1Y3QgbGluZV9tYXBzICpsaW5lX3RhYmxlOwoKLyogTmFtZSB0byB1c2UgYXMgYmFzZSBvZiBuYW1lcyBmb3IgZHVtcCBvdXRwdXQgZmlsZXMuICAqLwoKY29uc3QgY2hhciAqZHVtcF9iYXNlX25hbWU7CgovKiBOYW1lIHRvIHVzZSBhcyBhIGJhc2UgZm9yIGF1eGlsaWFyeSBvdXRwdXQgZmlsZXMuICAqLwoKY29uc3QgY2hhciAqYXV4X2Jhc2VfbmFtZTsKCi8qIFByZWZpeCBmb3IgcHJvZmlsZSBkYXRhIGZpbGVzICovCmNvbnN0IGNoYXIgKnByb2ZpbGVfZGF0YV9wcmVmaXg7CgovKiBBIG1hc2sgb2YgdGFyZ2V0X2ZsYWdzIHRoYXQgaW5jbHVkZXMgYml0IFggaWYgWCB3YXMgc2V0IG9yIGNsZWFyZWQKICAgb24gdGhlIGNvbW1hbmQgbGluZS4gICovCgppbnQgdGFyZ2V0X2ZsYWdzX2V4cGxpY2l0OwoKLyogRGVidWcgaG9va3MgLSBkZXBlbmRlbnQgdXBvbiBjb21tYW5kIGxpbmUgb3B0aW9ucy4gICovCgpjb25zdCBzdHJ1Y3QgZ2NjX2RlYnVnX2hvb2tzICpkZWJ1Z19ob29rczsKCi8qIERlYnVnIGhvb2tzIC0gdGFyZ2V0IGRlZmF1bHQuICAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCBnY2NfZGVidWdfaG9va3MgKmRlZmF1bHRfZGVidWdfaG9va3M7CgovKiBPdGhlciBmbGFncyBzYXlpbmcgd2hpY2gga2luZHMgb2YgZGVidWdnaW5nIGR1bXAgaGF2ZSBiZWVuIHJlcXVlc3RlZC4gICovCgppbnQgcnRsX2R1bXBfYW5kX2V4aXQ7CmludCBmbGFnX3ByaW50X2FzbV9uYW1lOwplbnVtIGdyYXBoX2R1bXBfdHlwZXMgZ3JhcGhfZHVtcF9mb3JtYXQ7CgovKiBOYW1lIGZvciBvdXRwdXQgZmlsZSBvZiBhc3NlbWJseSBjb2RlLCBzcGVjaWZpZWQgd2l0aCAtby4gICovCgpjb25zdCBjaGFyICphc21fZmlsZV9uYW1lOwoKLyogTm9uemVybyBtZWFucyBkbyBvcHRpbWl6YXRpb25zLiAgLU8uCiAgIFBhcnRpY3VsYXIgbnVtZXJpYyB2YWx1ZXMgc3RhbmQgZm9yIHBhcnRpY3VsYXIgYW1vdW50cyBvZiBvcHRpbWl6YXRpb247CiAgIHRodXMsIC1PMiBzdG9yZXMgMiBoZXJlLiAgSG93ZXZlciwgdGhlIG9wdGltaXphdGlvbnMgYmV5b25kIHRoZSBiYXNpYwogICBvbmVzIGFyZSBub3QgY29udHJvbGxlZCBkaXJlY3RseSBieSB0aGlzIHZhcmlhYmxlLiAgSW5zdGVhZCwgdGhleSBhcmUKICAgY29udHJvbGxlZCBieSBpbmRpdmlkdWFsIGBmbGFnXy4uLicgdmFyaWFibGVzIHRoYXQgYXJlIGRlZmF1bHRlZAogICBiYXNlZCBvbiB0aGlzIHZhcmlhYmxlLiAgKi8KCmludCBvcHRpbWl6ZSA9IDA7CgovKiBOb256ZXJvIG1lYW5zIG9wdGltaXplIGZvciBzaXplLiAgLU9zLgogICBUaGUgb25seSB2YWxpZCB2YWx1ZXMgYXJlIHplcm8gYW5kIG5vbnplcm8uIFdoZW4gb3B0aW1pemVfc2l6ZSBpcwogICBub256ZXJvLCBvcHRpbWl6ZSBkZWZhdWx0cyB0byAyLCBidXQgY2VydGFpbiBpbmRpdmlkdWFsIGNvZGUKICAgYmxvYXRpbmcgb3B0aW1pemF0aW9ucyBhcmUgZGlzYWJsZWQuICAqLwoKaW50IG9wdGltaXplX3NpemUgPSAwOwoKLyogVGhlIEZVTkNUSU9OX0RFQ0wgZm9yIHRoZSBmdW5jdGlvbiBjdXJyZW50bHkgYmVpbmcgY29tcGlsZWQsCiAgIG9yIDAgaWYgYmV0d2VlbiBmdW5jdGlvbnMuICAqLwp0cmVlIGN1cnJlbnRfZnVuY3Rpb25fZGVjbDsKCi8qIFNldCB0byB0aGUgRlVOQ19CRUdJTiBsYWJlbCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbiwgb3IgTlVMTAogICBpZiBub25lLiAgKi8KY29uc3QgY2hhciAqIGN1cnJlbnRfZnVuY3Rpb25fZnVuY19iZWdpbl9sYWJlbDsKCi8qIE5vbnplcm8gbWVhbnMgdG8gY29sbGVjdCBzdGF0aXN0aWNzIHdoaWNoIG1pZ2h0IGJlIGV4cGVuc2l2ZQogICBhbmQgdG8gcHJpbnQgdGhlbSB3aGVuIHdlIGFyZSBkb25lLiAgKi8KaW50IGZsYWdfZGV0YWlsZWRfc3RhdGlzdGljcyA9IDA7CgovKiBBIHJhbmRvbSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSB1c2VyLiAgKi8Kc3RhdGljIGNvbnN0IGNoYXIgKmZsYWdfcmFuZG9tX3NlZWQ7CgovKiBBIGxvY2FsIHRpbWUgc3RhbXAgZGVyaXZlZCBmcm9tIHRoZSB0aW1lIG9mIGNvbXBpbGF0aW9uLiBJdCB3aWxsIGJlCiAgIHplcm8gaWYgdGhlIHN5c3RlbSBjYW5ub3QgcHJvdmlkZSBhIHRpbWUuICBJdCB3aWxsIGJlIC0xdSwgaWYgdGhlCiAgIHVzZXIgaGFzIHNwZWNpZmllZCBhIHBhcnRpY3VsYXIgcmFuZG9tIHNlZWQuICAqLwp1bnNpZ25lZCBsb2NhbF90aWNrOwoKLyogLWYgZmxhZ3MuICAqLwoKLyogTm9uemVybyBtZWFucyBgY2hhcicgc2hvdWxkIGJlIHNpZ25lZC4gICovCgppbnQgZmxhZ19zaWduZWRfY2hhcjsKCi8qIE5vbnplcm8gbWVhbnMgZ2l2ZSBhbiBlbnVtIHR5cGUgb25seSBhcyBtYW55IGJ5dGVzIGFzIGl0IG5lZWRzLiAgQSB2YWx1ZQogICBvZiAyIG1lYW5zIGl0IGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuICAqLwoKaW50IGZsYWdfc2hvcnRfZW51bXM7CgovKiBOb256ZXJvIGlmIHN0cnVjdHVyZXMgYW5kIHVuaW9ucyBzaG91bGQgYmUgcmV0dXJuZWQgaW4gbWVtb3J5LgoKICAgVGhpcyBzaG91bGQgb25seSBiZSBkZWZpbmVkIGlmIGNvbXBhdGliaWxpdHkgd2l0aCBhbm90aGVyIGNvbXBpbGVyIG9yCiAgIHdpdGggYW4gQUJJIGlzIG5lZWRlZCwgYmVjYXVzZSBpdCByZXN1bHRzIGluIHNsb3dlciBjb2RlLiAgKi8KCiNpZm5kZWYgREVGQVVMVF9QQ0NfU1RSVUNUX1JFVFVSTgojZGVmaW5lIERFRkFVTFRfUENDX1NUUlVDVF9SRVRVUk4gMQojZW5kaWYKCi8qIE5vbnplcm8gZm9yIC1mcGNjLXN0cnVjdC1yZXR1cm46IHJldHVybiB2YWx1ZXMgdGhlIHNhbWUgd2F5IFBDQyBkb2VzLiAgKi8KCmludCBmbGFnX3BjY19zdHJ1Y3RfcmV0dXJuID0gREVGQVVMVF9QQ0NfU1RSVUNUX1JFVFVSTjsKCi8qIDAgbWVhbnMgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIGNvbXBsZXggZGl2aWRlIGFjY2VwdGFibGUuCiAgIDEgbWVhbnMgd2lkZSByYW5nZXMgb2YgaW5wdXRzIG11c3Qgd29yayBmb3IgY29tcGxleCBkaXZpZGUuCiAgIDIgbWVhbnMgQzk5LWxpa2UgcmVxdWlyZW1lbnRzIGZvciBjb21wbGV4IG11bHRpcGx5IGFuZCBkaXZpZGUuICAqLwoKaW50IGZsYWdfY29tcGxleF9tZXRob2QgPSAxOwoKLyogTm9uemVybyBtZWFucyB3ZSBzaG91bGQgYmUgc2F2aW5nIGRlY2xhcmF0aW9uIGluZm8gaW50byBhIC5YIGZpbGUuICAqLwoKaW50IGZsYWdfZ2VuX2F1eF9pbmZvID0gMDsKCi8qIFNwZWNpZmllZCBuYW1lIG9mIGF1eC1pbmZvIGZpbGUuICAqLwoKY29uc3QgY2hhciAqYXV4X2luZm9fZmlsZV9uYW1lOwoKLyogTm9uemVybyBpZiB3ZSBhcmUgY29tcGlsaW5nIGNvZGUgZm9yIGEgc2hhcmVkIGxpYnJhcnksIHplcm8gZm9yCiAgIGV4ZWN1dGFibGUuICAqLwoKaW50IGZsYWdfc2hsaWI7CgovKiBHZW5lcmF0ZSBjb2RlIGZvciBHTlUgb3IgTmVYVCBPYmplY3RpdmUtQyBydW50aW1lIGVudmlyb25tZW50LiAgKi8KCiNpZmRlZiBORVhUX09CSkNfUlVOVElNRQppbnQgZmxhZ19uZXh0X3J1bnRpbWUgPSAxOwojZWxzZQppbnQgZmxhZ19uZXh0X3J1bnRpbWUgPSAwOwojZW5kaWYKCi8qIFNldCB0byB0aGUgZGVmYXVsdCB0aHJlYWQtbG9jYWwgc3RvcmFnZSAodGxzKSBtb2RlbCB0byB1c2UuICAqLwoKZW51bSB0bHNfbW9kZWwgZmxhZ190bHNfZGVmYXVsdCA9IFRMU19NT0RFTF9HTE9CQUxfRFlOQU1JQzsKCi8qIFNldCB0aGUgZGVmYXVsdCByZWdpb24gYW5kIGFsZ29yaXRobSBmb3IgdGhlIGludGVncmF0ZWQgcmVnaXN0ZXIKICAgYWxsb2NhdG9yLiAgKi8KCmVudW0gaXJhX2FsZ29yaXRobSBmbGFnX2lyYV9hbGdvcml0aG0gPSBJUkFfQUxHT1JJVEhNX0NCOwplbnVtIGlyYV9yZWdpb24gZmxhZ19pcmFfcmVnaW9uID0gSVJBX1JFR0lPTl9NSVhFRDsKCi8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgLWZpcmEtdmVyYm9zZS4gICovCgp1bnNpZ25lZCBpbnQgZmxhZ19pcmFfdmVyYm9zZSA9IDU7CgovKiBOb256ZXJvIG1lYW5zIGNoYW5nZSBjZXJ0YWluIHdhcm5pbmdzIGludG8gZXJyb3JzLgogICBVc3VhbGx5IHRoZXNlIGFyZSB3YXJuaW5ncyBhYm91dCBmYWlsdXJlIHRvIGNvbmZvcm0gdG8gc29tZSBzdGFuZGFyZC4gICovCgppbnQgZmxhZ19wZWRhbnRpY19lcnJvcnMgPSAwOwoKLyogTm9uemVybyBtZWFucyBtYWtlIHBlcm1lcnJvciBwcm9kdWNlIHdhcm5pbmdzIGluc3RlYWQgb2YgZXJyb3JzLiAgKi8KCmludCBmbGFnX3Blcm1pc3NpdmUgPSAwOwoKLyogLWRBIGNhdXNlcyBkZWJ1ZyBjb21tZW50YXJ5IGluZm9ybWF0aW9uIHRvIGJlIHByb2R1Y2VkIGluCiAgIHRoZSBnZW5lcmF0ZWQgYXNzZW1ibHkgY29kZSAodG8gbWFrZSBpdCBtb3JlIHJlYWRhYmxlKS4gIFRoaXMgb3B0aW9uCiAgIGlzIGdlbmVyYWxseSBvbmx5IG9mIHVzZSB0byB0aG9zZSB3aG8gYWN0dWFsbHkgbmVlZCB0byByZWFkIHRoZQogICBnZW5lcmF0ZWQgYXNzZW1ibHkgY29kZSAocGVyaGFwcyB3aGlsZSBkZWJ1Z2dpbmcgdGhlIGNvbXBpbGVyIGl0c2VsZikuCiAgIEN1cnJlbnRseSwgdGhpcyBzd2l0Y2ggaXMgb25seSB1c2VkIGJ5IGR3YXJmb3V0LmM7IGhvd2V2ZXIsIGl0IGlzIGludGVuZGVkCiAgIHRvIGJlIGEgY2F0Y2hhbGwgZm9yIHByaW50aW5nIGRlYnVnIGluZm9ybWF0aW9uIGluIHRoZSBhc3NlbWJsZXIgZmlsZS4gICovCgppbnQgZmxhZ19kZWJ1Z19hc20gPSAwOwoKLyogLWRQIGNhdXNlcyB0aGUgcnRsIHRvIGJlIGVtaXR0ZWQgYXMgYSBjb21tZW50IGluIGFzc2VtYmx5LiAgKi8KCmludCBmbGFnX2R1bXBfcnRsX2luX2FzbSA9IDA7CgovKiBXaGVuIG5vbi1OVUxMLCBpbmRpY2F0ZXMgdGhhdCB3aGVuZXZlciBzcGFjZSBpcyBhbGxvY2F0ZWQgb24gdGhlCiAgIHN0YWNrLCB0aGUgcmVzdWx0aW5nIHN0YWNrIHBvaW50ZXIgbXVzdCBub3QgcGFzcyB0aGlzCiAgIGFkZHJlc3MtLS10aGF0IGlzLCBmb3Igc3RhY2tzIHRoYXQgZ3JvdyBkb3dud2FyZCwgdGhlIHN0YWNrIHBvaW50ZXIKICAgbXVzdCBhbHdheXMgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgYWRkcmVzczsgZm9yIHN0YWNrcwogICB0aGF0IGdyb3cgdXB3YXJkLCB0aGUgc3RhY2sgcG9pbnRlciBtdXN0IGJlIGxlc3MgdGhhbiB0aGlzIGFkZHJlc3MuCiAgIEF0IHByZXNlbnQsIHRoZSBydHggbWF5IGJlIGVpdGhlciBhIFJFRyBvciBhIFNZTUJPTF9SRUYsIGFsdGhvdWdoCiAgIHRoZSBzdXBwb3J0IHByb3ZpZGVkIGRlcGVuZHMgb24gdGhlIGJhY2tlbmQuICAqLwpydHggc3RhY2tfbGltaXRfcnR4OwoKLyogTm9uemVybyBpZiB3ZSBzaG91bGQgdHJhY2sgdmFyaWFibGVzLiAgV2hlbgogICBmbGFnX3Zhcl90cmFja2luZyA9PSBBVVRPREVURUNUX1ZBTFVFIGl0IHdpbGwgYmUgc2V0IGFjY29yZGluZwogICB0byBvcHRpbWl6ZSwgZGVidWdfaW5mb19sZXZlbCBhbmQgZGVidWdfaG9va3MgaW4gcHJvY2Vzc19vcHRpb25zICgpLiAgKi8KaW50IGZsYWdfdmFyX3RyYWNraW5nID0gQVVUT0RFVEVDVF9WQUxVRTsKCi8qIFR5cGUgb2Ygc3RhY2sgY2hlY2suICAqLwplbnVtIHN0YWNrX2NoZWNrX3R5cGUgZmxhZ19zdGFja19jaGVjayA9IE5PX1NUQUNLX0NIRUNLOwoKLyogVHJ1ZSBpZiB0aGUgdXNlciBoYXMgdGFnZ2VkIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSAnc2VjdGlvbicKICAgYXR0cmlidXRlLiAgKi8KCmJvb2wgdXNlcl9kZWZpbmVkX3NlY3Rpb25fYXR0cmlidXRlID0gZmFsc2U7CgovKiBWYWx1ZXMgb2YgdGhlIC1mYWxpZ24tKiBmbGFnczogaG93IG11Y2ggdG8gYWxpZ24gbGFiZWxzIGluIGNvZGUuCiAgIDAgbWVhbnMgYHVzZSBkZWZhdWx0JywgMSBtZWFucyBgZG9uJ3QgYWxpZ24nLgogICBGb3IgZWFjaCB2YXJpYWJsZSwgdGhlcmUgaXMgYW4gX2xvZyB2YXJpYW50IHdoaWNoIGlzIHRoZSBwb3dlcgogICBvZiB0d28gbm90IGxlc3MgdGhhbiB0aGUgdmFyaWFibGUsIGZvciAuYWxpZ24gb3V0cHV0LiAgKi8KCmludCBhbGlnbl9sb29wc19sb2c7CmludCBhbGlnbl9sb29wc19tYXhfc2tpcDsKaW50IGFsaWduX2p1bXBzX2xvZzsKaW50IGFsaWduX2p1bXBzX21heF9za2lwOwppbnQgYWxpZ25fbGFiZWxzX2xvZzsKaW50IGFsaWduX2xhYmVsc19tYXhfc2tpcDsKaW50IGFsaWduX2Z1bmN0aW9uc19sb2c7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgY29uc3QgY2hhciAqY29uc3Qgc3RyaW5nOwogIGludCAqY29uc3QgdmFyaWFibGU7CiAgY29uc3QgaW50IG9uX3ZhbHVlOwp9CmxhbmdfaW5kZXBlbmRlbnRfb3B0aW9uczsKCi8qIE5vbnplcm8gaWYgc3ViZXhwcmVzc2lvbnMgbXVzdCBiZSBldmFsdWF0ZWQgZnJvbSBsZWZ0LXRvLXJpZ2h0LiAgKi8KaW50IGZsYWdfZXZhbHVhdGlvbl9vcmRlciA9IDA7CgovKiBUaGUgdXNlciBzeW1ib2wgcHJlZml4IGFmdGVyIGhhdmluZyByZXNvbHZlZCBzYW1lLiAgKi8KY29uc3QgY2hhciAqdXNlcl9sYWJlbF9wcmVmaXg7CgpzdGF0aWMgY29uc3QgcGFyYW1faW5mbyBsYW5nX2luZGVwZW5kZW50X3BhcmFtc1tdID0gewojZGVmaW5lIERFRlBBUkFNKEVOVU0sIE9QVElPTiwgSEVMUCwgREVGQVVMVCwgTUlOLCBNQVgpIFwKICB7IE9QVElPTiwgREVGQVVMVCwgZmFsc2UsIE1JTiwgTUFYLCBIRUxQIH0sCiNpbmNsdWRlICJwYXJhbXMuZGVmIgojdW5kZWYgREVGUEFSQU0KICB7IE5VTEwsIDAsIGZhbHNlLCAwLCAwLCBOVUxMIH0KfTsKCi8qIE91dHB1dCBmaWxlcyBmb3IgYXNzZW1ibGVyIGNvZGUgKHJlYWwgY29tcGlsZXIgb3V0cHV0KQogICBhbmQgZGVidWdnaW5nIGR1bXBzLiAgKi8KCkZJTEUgKmFzbV9vdXRfZmlsZTsKRklMRSAqYXV4X2luZm9fZmlsZTsKRklMRSAqZHVtcF9maWxlID0gTlVMTDsKY29uc3QgY2hhciAqZHVtcF9maWxlX25hbWU7CgovKiBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBvZiBhIHRyYW5zbGF0aW9uLiAgSXQncyBnZW5lcmFsbHkgdGhlCiAgIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGNvbXBpbGF0aW9uIHdhcyBpbml0aWF0ZWQsIGJ1dCBhIHByZXByb2Nlc3NlZAogICBmaWxlIG1heSBzcGVjaWZ5IHRoZSBvcmlnaW5hbCBkaXJlY3RvcnkgaW4gd2hpY2ggaXQgd2FzCiAgIGNyZWF0ZWQuICAqLwoKc3RhdGljIGNvbnN0IGNoYXIgKnNyY19wd2Q7CgovKiBJbml0aWFsaXplIHNyY19wd2Qgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLCBhbmQgcmV0dXJuIHRydWUuICBJZiBpdAogICB3YXMgYWxyZWFkeSBpbml0aWFsaXplZCwgcmV0dXJuIGZhbHNlLiAgQXMgYSBzcGVjaWFsIGNhc2UsIGl0IG1heQogICBiZSBjYWxsZWQgd2l0aCBhIE5VTEwgYXJndW1lbnQgdG8gdGVzdCB3aGV0aGVyIHNyY19wd2QgaGFzIE5PVCBiZWVuCiAgIGluaXRpYWxpemVkIHlldC4gICovCgpib29sCnNldF9zcmNfcHdkIChjb25zdCBjaGFyICpwd2QpCnsKICBpZiAoc3JjX3B3ZCkKICAgIHsKICAgICAgaWYgKHN0cmNtcCAoc3JjX3B3ZCwgcHdkKSA9PSAwKQoJcmV0dXJuIHRydWU7CiAgICAgIGVsc2UKCXJldHVybiBmYWxzZTsKICAgIH0KCiAgc3JjX3B3ZCA9IHhzdHJkdXAgKHB3ZCk7CiAgcmV0dXJuIHRydWU7Cn0KCi8qIFJldHVybiB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdGhlIHRyYW5zbGF0aW9uIHVuaXQgd2FzIGluaXRpYXRlZCwKICAgaW4gY2FzZSBzZXRfc3JjX3B3ZCgpIHdhcyBub3QgY2FsbGVkIGJlZm9yZSB0byBhc3NpZ24gaXQgYQogICBkaWZmZXJlbnQgdmFsdWUuICAqLwoKY29uc3QgY2hhciAqCmdldF9zcmNfcHdkICh2b2lkKQp7CiAgaWYgKCEgc3JjX3B3ZCkKICAgIHsKICAgICAgc3JjX3B3ZCA9IGdldHB3ZCAoKTsKICAgICAgaWYgKCFzcmNfcHdkKQoJc3JjX3B3ZCA9ICIuIjsKICAgIH0KCiAgIHJldHVybiBzcmNfcHdkOwp9CgovKiBDYWxsZWQgd2hlbiB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIHBhcnNlZCwKICAgdGhpcyBmdW5jdGlvbiBwcmludHMgb24gc3RkZXJyIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gICovCnZvaWQKYW5ub3VuY2VfZnVuY3Rpb24gKHRyZWUgZGVjbCkKewogIGlmICghcXVpZXRfZmxhZykKICAgIHsKICAgICAgaWYgKHJ0bF9kdW1wX2FuZF9leGl0KQoJZnByaW50ZiAoc3RkZXJyLCAiJXMgIiwgSURFTlRJRklFUl9QT0lOVEVSIChERUNMX05BTUUgKGRlY2wpKSk7CiAgICAgIGVsc2UKCWZwcmludGYgKHN0ZGVyciwgIiAlcyIsIGxhbmdfaG9va3MuZGVjbF9wcmludGFibGVfbmFtZSAoZGVjbCwgMikpOwogICAgICBmZmx1c2ggKHN0ZGVycik7CiAgICAgIHBwX25lZWRzX25ld2xpbmUgKGdsb2JhbF9kYy0+cHJpbnRlcikgPSB0cnVlOwogICAgICBkaWFnbm9zdGljX3NldF9sYXN0X2Z1bmN0aW9uIChnbG9iYWxfZGMsIChkaWFnbm9zdGljX2luZm8gKikgTlVMTCk7CiAgICB9Cn0KCi8qIEluaXRpYWxpemUgbG9jYWxfdGljayB3aXRoIHRoZSB0aW1lIG9mIGRheSwgb3IgLTEgaWYKICAgZmxhZ19yYW5kb21fc2VlZCBpcyBzZXQuICAqLwoKc3RhdGljIHZvaWQKaW5pdF9sb2NhbF90aWNrICh2b2lkKQp7CiAgaWYgKCFmbGFnX3JhbmRvbV9zZWVkKQogICAgewogICAgICAvKiBHZXQgc29tZSBtb3JlIG9yIGxlc3MgcmFuZG9tIGRhdGEuICAqLwojaWZkZWYgSEFWRV9HRVRUSU1FT0ZEQVkKICAgICAgewoJc3RydWN0IHRpbWV2YWwgdHY7CgoJZ2V0dGltZW9mZGF5ICgmdHYsIE5VTEwpOwoJbG9jYWxfdGljayA9IHR2LnR2X3NlYyAqIDEwMDAgKyB0di50dl91c2VjIC8gMTAwMDsKICAgICAgfQojZWxzZQogICAgICB7Cgl0aW1lX3Qgbm93ID0gdGltZSAoTlVMTCk7CgoJaWYgKG5vdyAhPSAodGltZV90KS0xKQoJICBsb2NhbF90aWNrID0gKHVuc2lnbmVkKSBub3c7CiAgICAgIH0KI2VuZGlmCiAgICB9CiAgZWxzZQogICAgbG9jYWxfdGljayA9IC0xOwp9CgovKiBTZXQgdXAgYSBkZWZhdWx0IGZsYWdfcmFuZG9tX3NlZWQgYW5kIGxvY2FsX3RpY2ssIHVubGVzcyB0aGUgdXNlcgogICBhbHJlYWR5IHNwZWNpZmllZCBvbmUuICBNdXN0IGJlIGNhbGxlZCBhZnRlciBpbml0X2xvY2FsX3RpY2suICAqLwoKc3RhdGljIHZvaWQKaW5pdF9yYW5kb21fc2VlZCAodm9pZCkKewogIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgdmFsdWU7CiAgc3RhdGljIGNoYXIgcmFuZG9tX3NlZWRbSE9TVF9CSVRTX1BFUl9XSURFX0lOVCAvIDQgKyAzXTsKCiAgdmFsdWUgPSBsb2NhbF90aWNrIF4gZ2V0cGlkICgpOwoKICBzcHJpbnRmIChyYW5kb21fc2VlZCwgSE9TVF9XSURFX0lOVF9QUklOVF9IRVgsIHZhbHVlKTsKICBmbGFnX3JhbmRvbV9zZWVkID0gcmFuZG9tX3NlZWQ7Cn0KCi8qIE9idGFpbiB0aGUgcmFuZG9tX3NlZWQgc3RyaW5nLiAgVW5sZXNzIE5PSU5JVCwgaW5pdGlhbGl6ZSBpdCBpZgogICBpdCdzIG5vdCBwcm92aWRlZCBpbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KCmNvbnN0IGNoYXIgKgpnZXRfcmFuZG9tX3NlZWQgKGJvb2wgbm9pbml0KQp7CiAgaWYgKCFmbGFnX3JhbmRvbV9zZWVkICYmICFub2luaXQpCiAgICBpbml0X3JhbmRvbV9zZWVkICgpOwogIHJldHVybiBmbGFnX3JhbmRvbV9zZWVkOwp9CgovKiBNb2RpZnkgdGhlIHJhbmRvbV9zZWVkIHN0cmluZyB0byBWQUwuICBSZXR1cm4gaXRzIHByZXZpb3VzCiAgIHZhbHVlLiAgKi8KCmNvbnN0IGNoYXIgKgpzZXRfcmFuZG9tX3NlZWQgKGNvbnN0IGNoYXIgKnZhbCkKewogIGNvbnN0IGNoYXIgKm9sZCA9IGZsYWdfcmFuZG9tX3NlZWQ7CiAgZmxhZ19yYW5kb21fc2VlZCA9IHZhbDsKICByZXR1cm4gb2xkOwp9CgovKiBEZWNvZGUgdGhlIHN0cmluZyBQIGFzIGFuIGludGVncmFsIHBhcmFtZXRlci4KICAgSWYgdGhlIHN0cmluZyBpcyBpbmRlZWQgYW4gaW50ZWdlciByZXR1cm4gaXRzIG51bWVyaWMgdmFsdWUgZWxzZQogICBpc3N1ZSBhbiBJbnZhbGlkIE9wdGlvbiBlcnJvciBmb3IgdGhlIG9wdGlvbiBQTkFNRSBhbmQgcmV0dXJuIERFRlZBTC4KICAgSWYgUE5BTUUgaXMgemVybyBqdXN0IHJldHVybiBERUZWQUwsIGRvIG5vdCBjYWxsIGVycm9yLiAgKi8KCmludApyZWFkX2ludGVncmFsX3BhcmFtZXRlciAoY29uc3QgY2hhciAqcCwgY29uc3QgY2hhciAqcG5hbWUsIGNvbnN0IGludCAgZGVmdmFsKQp7CiAgY29uc3QgY2hhciAqZW5kcCA9IHA7CgogIHdoaWxlICgqZW5kcCkKICAgIHsKICAgICAgaWYgKElTRElHSVQgKCplbmRwKSkKCWVuZHArKzsKICAgICAgZWxzZQoJYnJlYWs7CiAgICB9CgogIGlmICgqZW5kcCAhPSAwKQogICAgewogICAgICBpZiAocG5hbWUgIT0gMCkKCWVycm9yICgiaW52YWxpZCBvcHRpb24gYXJndW1lbnQgJXFzIiwgcG5hbWUpOwogICAgICByZXR1cm4gZGVmdmFsOwogICAgfQoKICByZXR1cm4gYXRvaSAocCk7Cn0KCi8qIFdoZW4gY29tcGlsaW5nIHdpdGggYSByZWNlbnQgZW5vdWdoIEdDQywgd2UgdXNlIHRoZSBHTlUgQyAiZXh0ZXJuIGlubGluZSIKICAgZm9yIGZsb29yX2xvZzIgYW5kIGV4YWN0X2xvZzI7IHNlZSB0b3BsZXYuaC4gIFRoYXQgY29uc3RydWN0LCBob3dldmVyLAogICBjb25mbGljdHMgd2l0aCB0aGUgSVNPIEMrKyBPbmUgRGVmaW5pdGlvbiBSdWxlLiAgICovCgojaWYgR0NDX1ZFUlNJT04gPCAzMDA0IHx8ICFkZWZpbmVkIChfX2NwbHVzcGx1cykKCi8qIEdpdmVuIFgsIGFuIHVuc2lnbmVkIG51bWJlciwgcmV0dXJuIHRoZSBsYXJnZXN0IGludCBZIHN1Y2ggdGhhdCAyKipZIDw9IFguCiAgIElmIFggaXMgMCwgcmV0dXJuIC0xLiAgKi8KCmludApmbG9vcl9sb2cyICh1bnNpZ25lZCBIT1NUX1dJREVfSU5UIHgpCnsKICBpbnQgdCA9IDA7CgogIGlmICh4ID09IDApCiAgICByZXR1cm4gLTE7CgojaWZkZWYgQ0xaX0hXSQogIHQgPSBIT1NUX0JJVFNfUEVSX1dJREVfSU5UIC0gMSAtIChpbnQpIENMWl9IV0kgKHgpOwojZWxzZQogIGlmIChIT1NUX0JJVFNfUEVSX1dJREVfSU5UID4gNjQpCiAgICBpZiAoeCA+PSAodW5zaWduZWQgSE9TVF9XSURFX0lOVCkgMSA8PCAodCArIDY0KSkKICAgICAgdCArPSA2NDsKICBpZiAoSE9TVF9CSVRTX1BFUl9XSURFX0lOVCA+IDMyKQogICAgaWYgKHggPj0gKCh1bnNpZ25lZCBIT1NUX1dJREVfSU5UKSAxKSA8PCAodCArIDMyKSkKICAgICAgdCArPSAzMjsKICBpZiAoeCA+PSAoKHVuc2lnbmVkIEhPU1RfV0lERV9JTlQpIDEpIDw8ICh0ICsgMTYpKQogICAgdCArPSAxNjsKICBpZiAoeCA+PSAoKHVuc2lnbmVkIEhPU1RfV0lERV9JTlQpIDEpIDw8ICh0ICsgOCkpCiAgICB0ICs9IDg7CiAgaWYgKHggPj0gKCh1bnNpZ25lZCBIT1NUX1dJREVfSU5UKSAxKSA8PCAodCArIDQpKQogICAgdCArPSA0OwogIGlmICh4ID49ICgodW5zaWduZWQgSE9TVF9XSURFX0lOVCkgMSkgPDwgKHQgKyAyKSkKICAgIHQgKz0gMjsKICBpZiAoeCA+PSAoKHVuc2lnbmVkIEhPU1RfV0lERV9JTlQpIDEpIDw8ICh0ICsgMSkpCiAgICB0ICs9IDE7CiNlbmRpZgoKICByZXR1cm4gdDsKfQoKLyogUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgWCwgYmFzZSAyLCBjb25zaWRlcmluZyBYIHVuc2lnbmVkLAogICBpZiBYIGlzIGEgcG93ZXIgb2YgMi4gIE90aGVyd2lzZSwgcmV0dXJucyAtMS4gICovCgppbnQKZXhhY3RfbG9nMiAodW5zaWduZWQgSE9TVF9XSURFX0lOVCB4KQp7CiAgaWYgKHggIT0gKHggJiAteCkpCiAgICByZXR1cm4gLTE7CiNpZmRlZiBDVFpfSFdJCiAgcmV0dXJuIHggPyBDVFpfSFdJICh4KSA6IC0xOwojZWxzZQogIHJldHVybiBmbG9vcl9sb2cyICh4KTsKI2VuZGlmCn0KCiNlbmRpZiAvKiAgR0NDX1ZFUlNJT04gPCAzMDA0IHx8ICFkZWZpbmVkIChfX2NwbHVzcGx1cykgICovCgovKiBIYW5kbGVyIGZvciBmYXRhbCBzaWduYWxzLCBzdWNoIGFzIFNJR1NFR1YuICBUaGVzZSBhcmUgdHJhbnNmb3JtZWQKICAgaW50byBJQ0UgbWVzc2FnZXMsIHdoaWNoIGlzIG11Y2ggbW9yZSB1c2VyIGZyaWVuZGx5LiAgSW4gY2FzZSB0aGUKICAgZXJyb3IgcHJpbnRlciBjcmFzaGVzLCByZXNldCB0aGUgc2lnbmFsIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uLiAgKi8KCnN0YXRpYyB2b2lkCmNyYXNoX3NpZ25hbCAoaW50IHNpZ25vKQp7CiAgc2lnbmFsIChzaWdubywgU0lHX0RGTCk7CgogIC8qIElmIHdlIGNyYXNoZWQgd2hpbGUgcHJvY2Vzc2luZyBhbiBBU00gc3RhdGVtZW50LCB0aGVuIGJlIGEgbGl0dGxlIG1vcmUKICAgICBncmFjZWZ1bC4gIEl0J3MgbW9zdCBsaWtlbHkgdGhlIHVzZXIncyBmYXVsdC4gICovCiAgaWYgKHRoaXNfaXNfYXNtX29wZXJhbmRzKQogICAgewogICAgICBvdXRwdXRfb3BlcmFuZF9sb3NzYWdlICgidW5yZWNvdmVyYWJsZSBlcnJvciIpOwogICAgICBleGl0IChGQVRBTF9FWElUX0NPREUpOwogICAgfQoKICBpbnRlcm5hbF9lcnJvciAoIiVzIiwgc3Ryc2lnbmFsIChzaWdubykpOwp9CgovKiBBcnJhbmdlIHRvIGR1bXAgY29yZSBvbiBlcnJvci4gIChUaGUgcmVndWxhciBlcnJvciBtZXNzYWdlIGlzIHN0aWxsCiAgIHByaW50ZWQgZmlyc3QsIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBhYm9ydCgpLikgICovCgpzdGF0aWMgdm9pZApzZXR1cF9jb3JlX2R1bXBpbmcgKHZvaWQpCnsKI2lmZGVmIFNJR0FCUlQKICBzaWduYWwgKFNJR0FCUlQsIFNJR19ERkwpOwojZW5kaWYKI2lmIGRlZmluZWQoSEFWRV9TRVRSTElNSVQpCiAgewogICAgc3RydWN0IHJsaW1pdCBybGltOwogICAgaWYgKGdldHJsaW1pdCAoUkxJTUlUX0NPUkUsICZybGltKSAhPSAwKQogICAgICBmYXRhbF9lcnJvciAoImdldHRpbmcgY29yZSBmaWxlIHNpemUgbWF4aW11bSBsaW1pdDogJW0iKTsKICAgIHJsaW0ucmxpbV9jdXIgPSBybGltLnJsaW1fbWF4OwogICAgaWYgKHNldHJsaW1pdCAoUkxJTUlUX0NPUkUsICZybGltKSAhPSAwKQogICAgICBmYXRhbF9lcnJvciAoInNldHRpbmcgY29yZSBmaWxlIHNpemUgbGltaXQgdG8gbWF4aW11bTogJW0iKTsKICB9CiNlbmRpZgogIGRpYWdub3N0aWNfYWJvcnRfb25fZXJyb3IgKGdsb2JhbF9kYyk7Cn0KCgovKiBTdHJpcCBvZmYgYSBsZWdpdGltYXRlIHNvdXJjZSBlbmRpbmcgZnJvbSB0aGUgaW5wdXQgc3RyaW5nIE5BTUUgb2YKICAgbGVuZ3RoIExFTi4gIFJhdGhlciB0aGFuIGhhdmluZyB0byBrbm93IHRoZSBuYW1lcyB1c2VkIGJ5IGFsbCBvZgogICBvdXIgZnJvbnQgZW5kcywgd2Ugc3RyaXAgb2ZmIGFuIGVuZGluZyBvZiBhIHBlcmlvZCBmb2xsb3dlZCBieQogICB1cCB0byBmaXZlIGNoYXJhY3RlcnMuICAoSmF2YSB1c2VzICIuY2xhc3MiLikgICovCgp2b2lkCnN0cmlwX29mZl9lbmRpbmcgKGNoYXIgKm5hbWUsIGludCBsZW4pCnsKICBpbnQgaTsKICBmb3IgKGkgPSAyOyBpIDwgNiAmJiBsZW4gPiBpOyBpKyspCiAgICB7CiAgICAgIGlmIChuYW1lW2xlbiAtIGldID09ICcuJykKCXsKCSAgbmFtZVtsZW4gLSBpXSA9ICdcMCc7CgkgIGJyZWFrOwoJfQogICAgfQp9CgovKiBPdXRwdXQgYSBxdW90ZWQgc3RyaW5nLiAgKi8KCnZvaWQKb3V0cHV0X3F1b3RlZF9zdHJpbmcgKEZJTEUgKmFzbV9maWxlLCBjb25zdCBjaGFyICpzdHJpbmcpCnsKI2lmZGVmIE9VVFBVVF9RVU9URURfU1RSSU5HCiAgT1VUUFVUX1FVT1RFRF9TVFJJTkcgKGFzbV9maWxlLCBzdHJpbmcpOwojZWxzZQogIGNoYXIgYzsKCiAgcHV0YyAoJ1wiJywgYXNtX2ZpbGUpOwogIHdoaWxlICgoYyA9ICpzdHJpbmcrKykgIT0gMCkKICAgIHsKICAgICAgaWYgKElTUFJJTlQgKGMpKQoJewoJICBpZiAoYyA9PSAnXCInIHx8IGMgPT0gJ1xcJykKCSAgICBwdXRjICgnXFwnLCBhc21fZmlsZSk7CgkgIHB1dGMgKGMsIGFzbV9maWxlKTsKCX0KICAgICAgZWxzZQoJZnByaW50ZiAoYXNtX2ZpbGUsICJcXCUwM28iLCAodW5zaWduZWQgY2hhcikgYyk7CiAgICB9CiAgcHV0YyAoJ1wiJywgYXNtX2ZpbGUpOwojZW5kaWYKfQoKLyogT3V0cHV0IGEgZmlsZSBuYW1lIGluIHRoZSBmb3JtIHdhbnRlZCBieSBTeXN0ZW0gVi4gICovCgp2b2lkCm91dHB1dF9maWxlX2RpcmVjdGl2ZSAoRklMRSAqYXNtX2ZpbGUsIGNvbnN0IGNoYXIgKmlucHV0X25hbWUpCnsKICBpbnQgbGVuOwogIGNvbnN0IGNoYXIgKm5hOwoKICBpZiAoaW5wdXRfbmFtZSA9PSBOVUxMKQogICAgaW5wdXRfbmFtZSA9ICI8c3RkaW4+IjsKICBlbHNlCiAgICBpbnB1dF9uYW1lID0gcmVtYXBfZGVidWdfZmlsZW5hbWUgKGlucHV0X25hbWUpOwoKICBsZW4gPSBzdHJsZW4gKGlucHV0X25hbWUpOwogIG5hID0gaW5wdXRfbmFtZSArIGxlbjsKCiAgLyogTkEgZ2V0cyBJTlBVVF9OQU1FIHNhbnMgZGlyZWN0b3J5IG5hbWVzLiAgKi8KICB3aGlsZSAobmEgPiBpbnB1dF9uYW1lKQogICAgewogICAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAobmFbLTFdKSkKCWJyZWFrOwogICAgICBuYS0tOwogICAgfQoKI2lmZGVmIEFTTV9PVVRQVVRfU09VUkNFX0ZJTEVOQU1FCiAgQVNNX09VVFBVVF9TT1VSQ0VfRklMRU5BTUUgKGFzbV9maWxlLCBuYSk7CiNlbHNlCiAgZnByaW50ZiAoYXNtX2ZpbGUsICJcdC5maWxlXHQiKTsKICBvdXRwdXRfcXVvdGVkX3N0cmluZyAoYXNtX2ZpbGUsIG5hKTsKICBmcHV0YyAoJ1xuJywgYXNtX2ZpbGUpOwojZW5kaWYKfQoKLyogQSBzdWJyb3V0aW5lIG9mIHdyYXB1cF9nbG9iYWxfZGVjbGFyYXRpb25zLiAgV2UndmUgY29tZSB0byB0aGUgZW5kIG9mCiAgIHRoZSBjb21waWxhdGlvbiB1bml0LiAgQWxsIGRlZmVycmVkIHZhcmlhYmxlcyBzaG91bGQgYmUgdW5kZWZlcnJlZCwKICAgYW5kIGFsbCBpbmNvbXBsZXRlIGRlY2xzIHNob3VsZCBiZSBmaW5hbGl6ZWQuICAqLwoKdm9pZAp3cmFwdXBfZ2xvYmFsX2RlY2xhcmF0aW9uXzEgKHRyZWUgZGVjbCkKewogIC8qIFdlJ3JlIG5vdCBkZWZlcnJpbmcgdGhpcyBhbnkgbG9uZ2VyLiAgQXNzaWdubWVudCBpcyBjb25kaXRpb25hbCB0bwogICAgIGF2b2lkIG5lZWRsZXNzbHkgZGlydHlpbmcgUENIIHBhZ2VzLiAgKi8KICBpZiAoQ09ERV9DT05UQUlOU19TVFJVQ1QgKFRSRUVfQ09ERSAoZGVjbCksIFRTX0RFQ0xfV0lUSF9WSVMpCiAgICAgICYmIERFQ0xfREVGRVJfT1VUUFVUIChkZWNsKSAhPSAwKQogICAgREVDTF9ERUZFUl9PVVRQVVQgKGRlY2wpID0gMDsKCiAgaWYgKFRSRUVfQ09ERSAoZGVjbCkgPT0gVkFSX0RFQ0wgJiYgREVDTF9TSVpFIChkZWNsKSA9PSAwKQogICAgbGFuZ19ob29rcy5maW5pc2hfaW5jb21wbGV0ZV9kZWNsIChkZWNsKTsKfQoKLyogQSBzdWJyb3V0aW5lIG9mIHdyYXB1cF9nbG9iYWxfZGVjbGFyYXRpb25zLiAgRGVjaWRlIHdoZXRoZXIgb3Igbm90IERFQ0wKICAgbmVlZHMgdG8gYmUgb3V0cHV0LiAgUmV0dXJuIHRydWUgaWYgaXQgaXMgb3V0cHV0LiAgKi8KCmJvb2wKd3JhcHVwX2dsb2JhbF9kZWNsYXJhdGlvbl8yICh0cmVlIGRlY2wpCnsKICBpZiAoVFJFRV9BU01fV1JJVFRFTiAoZGVjbCkgfHwgREVDTF9FWFRFUk5BTCAoZGVjbCkpCiAgICByZXR1cm4gZmFsc2U7CgogIC8qIERvbid0IHdyaXRlIG91dCBzdGF0aWMgY29uc3RzLCB1bmxlc3Mgd2Ugc3RpbGwgbmVlZCB0aGVtLgoKICAgICBXZSBhbHNvIGtlZXAgc3RhdGljIGNvbnN0cyBpZiBub3Qgb3B0aW1pemluZyAoZm9yIGRlYnVnZ2luZyksCiAgICAgdW5sZXNzIHRoZSB1c2VyIHNwZWNpZmllZCAtZm5vLWtlZXAtc3RhdGljLWNvbnN0cy4KICAgICA/Pz8gVGhleSBtaWdodCBiZSBiZXR0ZXIgd3JpdHRlbiBpbnRvIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbi4KICAgICBUaGlzIGlzIHBvc3NpYmxlIHdoZW4gdXNpbmcgRFdBUkYuCgogICAgIEEgbGFuZ3VhZ2UgcHJvY2Vzc29yIHRoYXQgd2FudHMgc3RhdGljIGNvbnN0YW50cyB0byBiZSBhbHdheXMKICAgICB3cml0dGVuIG91dCAoZXZlbiBpZiBpdCBpcyBub3QgdXNlZCkgaXMgcmVzcG9uc2libGUgZm9yCiAgICAgY2FsbGluZyByZXN0X29mX2RlY2xfY29tcGlsYXRpb24gaXRzZWxmLiAgRS5nLiB0aGUgQyBmcm9udC1lbmQKICAgICBjYWxscyByZXN0X29mX2RlY2xfY29tcGlsYXRpb24gZnJvbSBmaW5pc2hfZGVjbC4KICAgICBPbmUgbW90aXZhdGlvbiBmb3IgdGhpcyBpcyB0aGF0IGlzIGNvbnZlbnRpb25hbCBpbiBzb21lCiAgICAgZW52aXJvbm1lbnRzIHRvIHdyaXRlIHRoaW5ncyBsaWtlOgogICAgIHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPSAiLi4uIHZlcnNpb24gc3RyaW5nIC4uLiI7CiAgICAgaW50ZW5kaW5nIHRvIGZvcmNlIHRoZSBzdHJpbmcgdG8gYmUgaW4gdGhlIGV4ZWN1dGFibGUuCgogICAgIEEgbGFuZ3VhZ2UgcHJvY2Vzc29yIHRoYXQgd291bGQgcHJlZmVyIHRvIGhhdmUgdW5uZWVkZWQKICAgICBzdGF0aWMgY29uc3RhbnRzICJvcHRpbWl6ZWQgYXdheSIgd291bGQganVzdCBkZWZlciB3cml0aW5nCiAgICAgdGhlbSBvdXQgdW50aWwgaGVyZS4gIEUuZy4gQysrIGRvZXMgdGhpcywgYmVjYXVzZSBzdGF0aWMKICAgICBjb25zdGFudHMgYXJlIG9mdGVuIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzLgoKICAgICA/Pz8gQSB0ZW1wdGluZyBhbHRlcm5hdGl2ZSAoZm9yIGJvdGggQyBhbmQgQysrKSB3b3VsZCBiZQogICAgIHRvIGZvcmNlIGEgY29uc3RhbnQgdG8gYmUgd3JpdHRlbiBpZiBhbmQgb25seSBpZiBpdCBpcwogICAgIGRlZmluZWQgaW4gYSBtYWluIGZpbGUsIGFzIG9wcG9zZWQgdG8gYW4gaW5jbHVkZSBmaWxlLiAgKi8KCiAgaWYgKFRSRUVfQ09ERSAoZGVjbCkgPT0gVkFSX0RFQ0wgJiYgVFJFRV9TVEFUSUMgKGRlY2wpKQogICAgewogICAgICBzdHJ1Y3QgdmFycG9vbF9ub2RlICpub2RlOwogICAgICBib29sIG5lZWRlZCA9IHRydWU7CiAgICAgIG5vZGUgPSB2YXJwb29sX25vZGUgKGRlY2wpOwoKICAgICAgaWYgKG5vZGUtPmZpbmFsaXplZCkKCW5lZWRlZCA9IGZhbHNlOwogICAgICBlbHNlIGlmIChub2RlLT5hbGlhcykKCW5lZWRlZCA9IGZhbHNlOwogICAgICBlbHNlIGlmICghY2dyYXBoX2dsb2JhbF9pbmZvX3JlYWR5CgkgICAgICAgJiYgKFRSRUVfVVNFRCAoZGVjbCkKCQkgICB8fCBUUkVFX1VTRUQgKERFQ0xfQVNTRU1CTEVSX05BTUUgKGRlY2wpKSkpCgkvKiBuZWVkZWQgKi87CiAgICAgIGVsc2UgaWYgKG5vZGUtPm5lZWRlZCkKCS8qIG5lZWRlZCAqLzsKICAgICAgZWxzZSBpZiAoREVDTF9DT01EQVQgKGRlY2wpKQoJbmVlZGVkID0gZmFsc2U7CiAgICAgIGVsc2UgaWYgKFRSRUVfUkVBRE9OTFkgKGRlY2wpICYmICFUUkVFX1BVQkxJQyAoZGVjbCkKCSAgICAgICAmJiAob3B0aW1pemUgfHwgIWZsYWdfa2VlcF9zdGF0aWNfY29uc3RzCgkJICAgfHwgREVDTF9BUlRJRklDSUFMIChkZWNsKSkpCgluZWVkZWQgPSBmYWxzZTsKCiAgICAgIGlmIChuZWVkZWQpCgl7CgkgIHJlc3Rfb2ZfZGVjbF9jb21waWxhdGlvbiAoZGVjbCwgMSwgMSk7CgkgIHJldHVybiB0cnVlOwoJfQogICAgfQoKICByZXR1cm4gZmFsc2U7Cn0KCi8qIERvIGFueSBmaW5hbCBwcm9jZXNzaW5nIHJlcXVpcmVkIGZvciB0aGUgZGVjbGFyYXRpb25zIGluIFZFQywgb2YKICAgd2hpY2ggdGhlcmUgYXJlIExFTi4gIFdlIHdyaXRlIG91dCBpbmxpbmUgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMKICAgdGhhdCBoYXZlIGJlZW4gZGVmZXJyZWQgdW50aWwgdGhpcyBwb2ludCwgYnV0IHdoaWNoIGFyZSByZXF1aXJlZC4KICAgUmV0dXJucyBub256ZXJvIGlmIGFueXRoaW5nIHdhcyBwdXQgb3V0LiAgKi8KCmJvb2wKd3JhcHVwX2dsb2JhbF9kZWNsYXJhdGlvbnMgKHRyZWUgKnZlYywgaW50IGxlbikKewogIGJvb2wgcmVjb25zaWRlciwgb3V0cHV0X3NvbWV0aGluZyA9IGZhbHNlOwogIGludCBpOwoKICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCiAgICB3cmFwdXBfZ2xvYmFsX2RlY2xhcmF0aW9uXzEgKHZlY1tpXSk7CgogIC8qIE5vdyBlbWl0IGFueSBnbG9iYWwgdmFyaWFibGVzIG9yIGZ1bmN0aW9ucyB0aGF0IHdlIGhhdmUgYmVlbgogICAgIHB1dHRpbmcgb2ZmLiAgV2UgbmVlZCB0byBsb29wIGluIGNhc2Ugb25lIG9mIHRoZSB0aGluZ3MgZW1pdHRlZAogICAgIGhlcmUgcmVmZXJlbmNlcyBhbm90aGVyIG9uZSB3aGljaCBjb21lcyBlYXJsaWVyIGluIHRoZSBsaXN0LiAgKi8KICBkbwogICAgewogICAgICByZWNvbnNpZGVyID0gZmFsc2U7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKCXJlY29uc2lkZXIgfD0gd3JhcHVwX2dsb2JhbF9kZWNsYXJhdGlvbl8yICh2ZWNbaV0pOwogICAgICBpZiAocmVjb25zaWRlcikKCW91dHB1dF9zb21ldGhpbmcgPSB0cnVlOwogICAgfQogIHdoaWxlIChyZWNvbnNpZGVyKTsKCiAgcmV0dXJuIG91dHB1dF9zb21ldGhpbmc7Cn0KCi8qIEEgc3Vicm91dGluZSBvZiBjaGVja19nbG9iYWxfZGVjbGFyYXRpb25zLiAgSXNzdWUgYXBwcm9wcmlhdGUgd2FybmluZ3MKICAgZm9yIHRoZSBnbG9iYWwgZGVjbGFyYXRpb24gREVDTC4gICovCgp2b2lkCmNoZWNrX2dsb2JhbF9kZWNsYXJhdGlvbl8xICh0cmVlIGRlY2wpCnsKICAvKiBXYXJuIGFib3V0IGFueSBmdW5jdGlvbiBkZWNsYXJlZCBzdGF0aWMgYnV0IG5vdCBkZWZpbmVkLiAgV2UgZG9uJ3QKICAgICB3YXJuIGFib3V0IHZhcmlhYmxlcywgYmVjYXVzZSBtYW55IHByb2dyYW1zIGhhdmUgc3RhdGljIHZhcmlhYmxlcwogICAgIHRoYXQgZXhpc3Qgb25seSB0byBnZXQgc29tZSB0ZXh0IGludG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KICBpZiAoVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMCiAgICAgICYmIERFQ0xfSU5JVElBTCAoZGVjbCkgPT0gMAogICAgICAmJiBERUNMX0VYVEVSTkFMIChkZWNsKQogICAgICAmJiAhIERFQ0xfQVJUSUZJQ0lBTCAoZGVjbCkKICAgICAgJiYgISBUUkVFX05PX1dBUk5JTkcgKGRlY2wpCiAgICAgICYmICEgVFJFRV9QVUJMSUMgKGRlY2wpCiAgICAgICYmICh3YXJuX3VudXNlZF9mdW5jdGlvbgoJICB8fCBUUkVFX1NZTUJPTF9SRUZFUkVOQ0VEIChERUNMX0FTU0VNQkxFUl9OQU1FIChkZWNsKSkpKQogICAgewogICAgICBpZiAoVFJFRV9TWU1CT0xfUkVGRVJFTkNFRCAoREVDTF9BU1NFTUJMRVJfTkFNRSAoZGVjbCkpKQoJcGVkd2FybiAoaW5wdXRfbG9jYXRpb24sIDAsICIlcStGIHVzZWQgYnV0IG5ldmVyIGRlZmluZWQiLCBkZWNsKTsKICAgICAgZWxzZQoJd2FybmluZyAoT1BUX1d1bnVzZWRfZnVuY3Rpb24sICIlcStGIGRlY2xhcmVkICU8c3RhdGljJT4gYnV0IG5ldmVyIGRlZmluZWQiLCBkZWNsKTsKICAgICAgLyogVGhpcyBzeW1ib2wgaXMgZWZmZWN0aXZlbHkgYW4gImV4dGVybiIgZGVjbGFyYXRpb24gbm93LiAgKi8KICAgICAgVFJFRV9QVUJMSUMgKGRlY2wpID0gMTsKICAgICAgYXNzZW1ibGVfZXh0ZXJuYWwgKGRlY2wpOwogICAgfQoKICAvKiBXYXJuIGFib3V0IHN0YXRpYyBmbnMgb3IgdmFycyBkZWZpbmVkIGJ1dCBub3QgdXNlZC4gICovCiAgaWYgKCgod2Fybl91bnVzZWRfZnVuY3Rpb24gJiYgVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMKQogICAgICAgLyogV2UgZG9uJ3Qgd2FybiBhYm91dCAic3RhdGljIGNvbnN0IiB2YXJpYWJsZXMgYmVjYXVzZSB0aGUKCSAgInJjc19pZCIgaWRpb20gdXNlcyB0aGF0IGNvbnN0cnVjdGlvbi4gICovCiAgICAgICB8fCAod2Fybl91bnVzZWRfdmFyaWFibGUKCSAgICYmIFRSRUVfQ09ERSAoZGVjbCkgPT0gVkFSX0RFQ0wgJiYgISBUUkVFX1JFQURPTkxZIChkZWNsKSkpCiAgICAgICYmICEgREVDTF9JTl9TWVNURU1fSEVBREVSIChkZWNsKQogICAgICAmJiAhIFRSRUVfVVNFRCAoZGVjbCkKICAgICAgLyogVGhlIFRSRUVfVVNFRCBiaXQgZm9yIGZpbGUtc2NvcGUgZGVjbHMgaXMga2VwdCBpbiB0aGUgaWRlbnRpZmllciwKCSB0byBoYW5kbGUgbXVsdGlwbGUgZXh0ZXJuYWwgZGVjbHMgaW4gZGlmZmVyZW50IHNjb3Blcy4gICovCiAgICAgICYmICEgKERFQ0xfTkFNRSAoZGVjbCkgJiYgVFJFRV9VU0VEIChERUNMX05BTUUgKGRlY2wpKSkKICAgICAgJiYgISBERUNMX0VYVEVSTkFMIChkZWNsKQogICAgICAmJiAhIFRSRUVfUFVCTElDIChkZWNsKQogICAgICAvKiBBIHZvbGF0aWxlIHZhcmlhYmxlIG1pZ2h0IGJlIHVzZWQgaW4gc29tZSBub24tb2J2aW91cyB3YXkuICAqLwogICAgICAmJiAhIFRSRUVfVEhJU19WT0xBVElMRSAoZGVjbCkKICAgICAgLyogR2xvYmFsIHJlZ2lzdGVyIHZhcmlhYmxlcyBtdXN0IGJlIGRlY2xhcmVkIHRvIHJlc2VydmUgdGhlbS4gICovCiAgICAgICYmICEgKFRSRUVfQ09ERSAoZGVjbCkgPT0gVkFSX0RFQ0wgJiYgREVDTF9SRUdJU1RFUiAoZGVjbCkpCiAgICAgIC8qIE90aGVyd2lzZSwgYXNrIHRoZSBsYW5ndWFnZS4gICovCiAgICAgICYmIGxhbmdfaG9va3MuZGVjbHMud2Fybl91bnVzZWRfZ2xvYmFsIChkZWNsKSkKICAgIHdhcm5pbmcgKChUUkVFX0NPREUgKGRlY2wpID09IEZVTkNUSU9OX0RFQ0wpIAoJICAgICA/IE9QVF9XdW51c2VkX2Z1bmN0aW9uIAogICAgICAgICAgICAgOiBPUFRfV3VudXNlZF92YXJpYWJsZSwgCgkgICAgICIlcStEIGRlZmluZWQgYnV0IG5vdCB1c2VkIiwgZGVjbCk7Cn0KCi8qIElzc3VlIGFwcHJvcHJpYXRlIHdhcm5pbmdzIGZvciB0aGUgZ2xvYmFsIGRlY2xhcmF0aW9ucyBpbiBWRUMgKG9mCiAgIHdoaWNoIHRoZXJlIGFyZSBMRU4pLiAgKi8KCnZvaWQKY2hlY2tfZ2xvYmFsX2RlY2xhcmF0aW9ucyAodHJlZSAqdmVjLCBpbnQgbGVuKQp7CiAgaW50IGk7CgogIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKICAgIGNoZWNrX2dsb2JhbF9kZWNsYXJhdGlvbl8xICh2ZWNbaV0pOwp9CgovKiBFbWl0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYWxsIGdsb2JhbCBkZWNsYXJhdGlvbnMgaW4gVkVDLiAgKi8KCnZvaWQKZW1pdF9kZWJ1Z19nbG9iYWxfZGVjbGFyYXRpb25zICh0cmVlICp2ZWMsIGludCBsZW4pCnsKICBpbnQgaTsKCiAgLyogQXZvaWQgY29uZnVzaW5nIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBtYWNoaW5lcnkgd2hlbiB0aGVyZSBhcmUgZXJyb3JzLiAgKi8KICBpZiAoZXJyb3Jjb3VudCAhPSAwIHx8IHNvcnJ5Y291bnQgIT0gMCkKICAgIHJldHVybjsKCiAgdGltZXZhcl9wdXNoIChUVl9TWU1PVVQpOwogIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKICAgIGRlYnVnX2hvb2tzLT5nbG9iYWxfZGVjbCAodmVjW2ldKTsKICB0aW1ldmFyX3BvcCAoVFZfU1lNT1VUKTsKfQoKLyogV2FybiBhYm91dCBhIHVzZSBvZiBhbiBpZGVudGlmaWVyIHdoaWNoIHdhcyBtYXJrZWQgZGVwcmVjYXRlZC4gICovCnZvaWQKd2Fybl9kZXByZWNhdGVkX3VzZSAodHJlZSBub2RlKQp7CiAgaWYgKG5vZGUgPT0gMCB8fCAhd2Fybl9kZXByZWNhdGVkX2RlY2wpCiAgICByZXR1cm47CgogIGlmIChERUNMX1AgKG5vZGUpKQogICAgewogICAgICBleHBhbmRlZF9sb2NhdGlvbiB4bG9jID0gZXhwYW5kX2xvY2F0aW9uIChERUNMX1NPVVJDRV9MT0NBVElPTiAobm9kZSkpOwogICAgICB3YXJuaW5nIChPUFRfV2RlcHJlY2F0ZWRfZGVjbGFyYXRpb25zLAoJICAgICAgICIlcUQgaXMgZGVwcmVjYXRlZCAoZGVjbGFyZWQgYXQgJXM6JWQpIiwKCSAgICAgICBub2RlLCB4bG9jLmZpbGUsIHhsb2MubGluZSk7CiAgICB9CiAgZWxzZSBpZiAoVFlQRV9QIChub2RlKSkKICAgIHsKICAgICAgY29uc3QgY2hhciAqd2hhdCA9IE5VTEw7CiAgICAgIHRyZWUgZGVjbCA9IFRZUEVfU1RVQl9ERUNMIChub2RlKTsKCiAgICAgIGlmIChUWVBFX05BTUUgKG5vZGUpKQoJewoJICBpZiAoVFJFRV9DT0RFIChUWVBFX05BTUUgKG5vZGUpKSA9PSBJREVOVElGSUVSX05PREUpCgkgICAgd2hhdCA9IElERU5USUZJRVJfUE9JTlRFUiAoVFlQRV9OQU1FIChub2RlKSk7CgkgIGVsc2UgaWYgKFRSRUVfQ09ERSAoVFlQRV9OQU1FIChub2RlKSkgPT0gVFlQRV9ERUNMCgkJICAgJiYgREVDTF9OQU1FIChUWVBFX05BTUUgKG5vZGUpKSkKCSAgICB3aGF0ID0gSURFTlRJRklFUl9QT0lOVEVSIChERUNMX05BTUUgKFRZUEVfTkFNRSAobm9kZSkpKTsKCX0KCiAgICAgIGlmIChkZWNsKQoJewoJICBleHBhbmRlZF9sb2NhdGlvbiB4bG9jCgkgICAgPSBleHBhbmRfbG9jYXRpb24gKERFQ0xfU09VUkNFX0xPQ0FUSU9OIChkZWNsKSk7CgkgIGlmICh3aGF0KQoJICAgIHdhcm5pbmcgKE9QVF9XZGVwcmVjYXRlZF9kZWNsYXJhdGlvbnMsCgkJICAgICAiJXFzIGlzIGRlcHJlY2F0ZWQgKGRlY2xhcmVkIGF0ICVzOiVkKSIsIHdoYXQsCgkJICAgICB4bG9jLmZpbGUsIHhsb2MubGluZSk7CgkgIGVsc2UKCSAgICB3YXJuaW5nIChPUFRfV2RlcHJlY2F0ZWRfZGVjbGFyYXRpb25zLAoJCSAgICAgInR5cGUgaXMgZGVwcmVjYXRlZCAoZGVjbGFyZWQgYXQgJXM6JWQpIiwKCQkgICAgIHhsb2MuZmlsZSwgeGxvYy5saW5lKTsKCX0KICAgICAgZWxzZQoJewoJICBpZiAod2hhdCkKCSAgICB3YXJuaW5nIChPUFRfV2RlcHJlY2F0ZWRfZGVjbGFyYXRpb25zLCAiJXFzIGlzIGRlcHJlY2F0ZWQiLCB3aGF0KTsKCSAgZWxzZQoJICAgIHdhcm5pbmcgKE9QVF9XZGVwcmVjYXRlZF9kZWNsYXJhdGlvbnMsICJ0eXBlIGlzIGRlcHJlY2F0ZWQiKTsKCX0KICAgIH0KfQoKLyogQ29tcGlsZSBhbiBlbnRpcmUgdHJhbnNsYXRpb24gdW5pdC4gIFdyaXRlIGEgZmlsZSBvZiBhc3NlbWJseQogICBvdXRwdXQgYW5kIHZhcmlvdXMgZGVidWdnaW5nIGR1bXBzLiAgKi8KCnN0YXRpYyB2b2lkCmNvbXBpbGVfZmlsZSAodm9pZCkKewogIC8qIEluaXRpYWxpemUgeWV0IGFub3RoZXIgcGFzcy4gICovCgogIGdnY19wcm90ZWN0X2lkZW50aWZpZXJzID0gdHJ1ZTsKCiAgaW5pdF9jZ3JhcGggKCk7CiAgaW5pdF9maW5hbCAobWFpbl9pbnB1dF9maWxlbmFtZSk7CiAgY292ZXJhZ2VfaW5pdCAoYXV4X2Jhc2VfbmFtZSk7CiAgc3RhdGlzdGljc19pbml0ICgpOwoKICB0aW1ldmFyX3B1c2ggKFRWX1BBUlNFKTsKCiAgLyogQ2FsbCB0aGUgcGFyc2VyLCB3aGljaCBwYXJzZXMgdGhlIGVudGlyZSBmaWxlIChjYWxsaW5nCiAgICAgcmVzdF9vZl9jb21waWxhdGlvbiBmb3IgZWFjaCBmdW5jdGlvbikuICAqLwogIGxhbmdfaG9va3MucGFyc2VfZmlsZSAoc2V0X3l5ZGVidWcpOwoKICAvKiBDb21waWxhdGlvbiBpcyBub3cgZmluaXNoZWQgZXhjZXB0IGZvciB3cml0aW5nCiAgICAgd2hhdCdzIGxlZnQgb2YgdGhlIHN5bWJvbCB0YWJsZSBvdXRwdXQuICAqLwogIHRpbWV2YXJfcG9wIChUVl9QQVJTRSk7CgogIGlmIChmbGFnX3N5bnRheF9vbmx5KQogICAgcmV0dXJuOwoKICBnZ2NfcHJvdGVjdF9pZGVudGlmaWVycyA9IGZhbHNlOwoKICBsYW5nX2hvb2tzLmRlY2xzLmZpbmFsX3dyaXRlX2dsb2JhbHMgKCk7CgogIGlmIChlcnJvcmNvdW50IHx8IHNvcnJ5Y291bnQpCiAgICByZXR1cm47CgogIHZhcnBvb2xfYXNzZW1ibGVfcGVuZGluZ19kZWNscyAoKTsKICBmaW5pc2hfYWxpYXNlc18yICgpOwoKICAvKiBUaGlzIG11c3Qgb2NjdXIgYWZ0ZXIgdGhlIGxvb3AgdG8gb3V0cHV0IGRlZmVycmVkIGZ1bmN0aW9ucy4KICAgICBFbHNlIHRoZSBjb3ZlcmFnZSBpbml0aWFsaXplciB3b3VsZCBub3QgYmUgZW1pdHRlZCBpZiBhbGwgdGhlCiAgICAgZnVuY3Rpb25zIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdCB3ZXJlIGRlZmVycmVkLiAgKi8KICBjb3ZlcmFnZV9maW5pc2ggKCk7CgogIC8qIExpa2V3aXNlIGZvciBtdWRmbGFwIHN0YXRpYyBvYmplY3QgcmVnaXN0cmF0aW9ucy4gICovCiAgaWYgKGZsYWdfbXVkZmxhcCkKICAgIG11ZGZsYXBfZmluaXNoX2ZpbGUgKCk7CgogIC8qIExpa2V3aXNlIGZvciBlbXVsYXRlZCB0aHJlYWQtbG9jYWwgc3RvcmFnZS4gICovCiAgaWYgKCF0YXJnZXRtLmhhdmVfdGxzKQogICAgZW11dGxzX2ZpbmlzaCAoKTsKCiAgb3V0cHV0X3NoYXJlZF9jb25zdGFudF9wb29sICgpOwogIG91dHB1dF9vYmplY3RfYmxvY2tzICgpOwoKICAvKiBXcml0ZSBvdXQgYW55IHBlbmRpbmcgd2VhayBzeW1ib2wgZGVjbGFyYXRpb25zLiAgKi8KICB3ZWFrX2ZpbmlzaCAoKTsKCiAgLyogRG8gZGJ4IHN5bWJvbHMuICAqLwogIHRpbWV2YXJfcHVzaCAoVFZfU1lNT1VUKTsKCiNpZiBkZWZpbmVkIERXQVJGMl9ERUJVR0dJTkdfSU5GTyB8fCBkZWZpbmVkIERXQVJGMl9VTldJTkRfSU5GTwogIGlmIChkd2FyZjJvdXRfZG9fZnJhbWUgKCkpCiAgICBkd2FyZjJvdXRfZnJhbWVfZmluaXNoICgpOwojZW5kaWYKCiAgKCpkZWJ1Z19ob29rcy0+ZmluaXNoKSAobWFpbl9pbnB1dF9maWxlbmFtZSk7CiAgdGltZXZhcl9wb3AgKFRWX1NZTU9VVCk7CgogIC8qIE91dHB1dCBzb21lIHN0dWZmIGF0IGVuZCBvZiBmaWxlIGlmIG5lYy4gICovCgogIGR3Ml9vdXRwdXRfaW5kaXJlY3RfY29uc3RhbnRzICgpOwoKICAvKiBGbHVzaCBhbnkgcGVuZGluZyBleHRlcm5hbCBkaXJlY3RpdmVzLiAgKi8KICBwcm9jZXNzX3BlbmRpbmdfYXNzZW1ibGVfZXh0ZXJuYWxzICgpOwoKICAvKiBBdHRhY2ggYSBzcGVjaWFsIC5pZGVudCBkaXJlY3RpdmUgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSB0byBpZGVudGlmeQogICAgIHRoZSB2ZXJzaW9uIG9mIEdDQyB3aGljaCBjb21waWxlZCB0aGlzIGNvZGUuICBUaGUgZm9ybWF0IG9mIHRoZSAuaWRlbnQKICAgICBzdHJpbmcgaXMgcGF0dGVybmVkIGFmdGVyIHRoZSBvbmVzIHByb2R1Y2VkIGJ5IG5hdGl2ZSBTVlI0IGNvbXBpbGVycy4gICovCiNpZmRlZiBJREVOVF9BU01fT1AKICBpZiAoIWZsYWdfbm9faWRlbnQpCiAgICB7CiAgICAgIGNvbnN0IGNoYXIgKnBrZ192ZXJzaW9uID0gIihHTlUpICI7CgogICAgICBpZiAoc3RyY21wICgiKEdDQykgIiwgcGtndmVyc2lvbl9zdHJpbmcpKQoJcGtnX3ZlcnNpb24gPSBwa2d2ZXJzaW9uX3N0cmluZzsKICAgICAgZnByaW50ZiAoYXNtX291dF9maWxlLCAiJXNcIkdDQzogJXMlc1wiXG4iLAoJICAgICAgIElERU5UX0FTTV9PUCwgcGtnX3ZlcnNpb24sIHZlcnNpb25fc3RyaW5nKTsKICAgIH0KI2VuZGlmCgogIC8qIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kLiAgU29tZSB0YXJnZXQgcG9ydHMgZW1pdCBlbmQgb2YgZmlsZSBkaXJlY3RpdmVzCiAgICAgaW50byB0aGUgYXNzZW1ibHkgZmlsZSBoZXJlLCBhbmQgaGVuY2Ugd2UgY2FuIG5vdCBvdXRwdXQgYW55dGhpbmcgdG8gdGhlCiAgICAgYXNzZW1ibHkgZmlsZSBhZnRlciB0aGlzIHBvaW50LiAgKi8KICB0YXJnZXRtLmFzbV9vdXQuZmlsZV9lbmQgKCk7Cn0KCi8qIFBhcnNlIGEgLWQuLi4gY29tbWFuZCBsaW5lIHN3aXRjaC4gICovCgp2b2lkCmRlY29kZV9kX29wdGlvbiAoY29uc3QgY2hhciAqYXJnKQp7CiAgaW50IGM7CgogIHdoaWxlICgqYXJnKQogICAgc3dpdGNoIChjID0gKmFyZysrKQogICAgICB7CiAgICAgIGNhc2UgJ0EnOgoJZmxhZ19kZWJ1Z19hc20gPSAxOwoJYnJlYWs7CiAgICAgIGNhc2UgJ3AnOgoJZmxhZ19wcmludF9hc21fbmFtZSA9IDE7CglicmVhazsKICAgICAgY2FzZSAnUCc6CglmbGFnX2R1bXBfcnRsX2luX2FzbSA9IDE7CglmbGFnX3ByaW50X2FzbV9uYW1lID0gMTsKCWJyZWFrOwogICAgICBjYXNlICd2JzoKCWdyYXBoX2R1bXBfZm9ybWF0ID0gdmNnOwoJYnJlYWs7CiAgICAgIGNhc2UgJ3gnOgoJcnRsX2R1bXBfYW5kX2V4aXQgPSAxOwoJYnJlYWs7CiAgICAgIGNhc2UgJ3knOgoJc2V0X3l5ZGVidWcgPSAxOwoJYnJlYWs7CiAgICAgIGNhc2UgJ0QnOgkvKiBUaGVzZSBhcmUgaGFuZGxlZCBieSB0aGUgcHJlcHJvY2Vzc29yLiAgKi8KICAgICAgY2FzZSAnSSc6CiAgICAgIGNhc2UgJ00nOgogICAgICBjYXNlICdOJzoKICAgICAgY2FzZSAnVSc6CglicmVhazsKICAgICAgY2FzZSAnSCc6CglzZXR1cF9jb3JlX2R1bXBpbmcoKTsKCWJyZWFrOwogICAgICBjYXNlICdhJzoKCWVuYWJsZV9ydGxfZHVtcF9maWxlICgpOwoJYnJlYWs7CgogICAgICBkZWZhdWx0OgoJICB3YXJuaW5nICgwLCAidW5yZWNvZ25pemVkIGdjYyBkZWJ1Z2dpbmcgb3B0aW9uOiAlYyIsIGMpOwoJYnJlYWs7CiAgICAgIH0KfQoKLyogSW5kZXhlZCBieSBlbnVtIGRlYnVnX2luZm9fdHlwZS4gICovCmNvbnN0IGNoYXIgKmNvbnN0IGRlYnVnX3R5cGVfbmFtZXNbXSA9CnsKICAibm9uZSIsICJzdGFicyIsICJjb2ZmIiwgImR3YXJmLTIiLCAieGNvZmYiLCAidm1zIgp9OwoKLyogUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiB0byBGSUxFLgogICBFYWNoIGxpbmUgYmVnaW5zIHdpdGggSU5ERU5UIChmb3IgdGhlIGNhc2Ugd2hlcmUgRklMRSBpcyB0aGUKICAgYXNzZW1ibGVyIG91dHB1dCBmaWxlKS4gICovCgp2b2lkCnByaW50X3ZlcnNpb24gKEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKmluZGVudCkKewogIHN0YXRpYyBjb25zdCBjaGFyIGZtdDFbXSA9CiNpZmRlZiBfX0dOVUNfXwogICAgTl8oIiVzJXMlcyAlc3ZlcnNpb24gJXMgKCVzKVxuJXNcdGNvbXBpbGVkIGJ5IEdOVSBDIHZlcnNpb24gJXMsICIpCiNlbHNlCiAgICBOXygiJXMlcyVzICVzdmVyc2lvbiAlcyAoJXMpIGNvbXBpbGVkIGJ5IENDLCAiKQojZW5kaWYKICAgIDsKICBzdGF0aWMgY29uc3QgY2hhciBmbXQyW10gPQogICAgTl8oIkdNUCB2ZXJzaW9uICVzLCBNUEZSIHZlcnNpb24gJXMuXG4iKTsKICBzdGF0aWMgY29uc3QgY2hhciBmbXQzW10gPQogICAgTl8oIiVzJXN3YXJuaW5nOiAlcyBoZWFkZXIgdmVyc2lvbiAlcyBkaWZmZXJzIGZyb20gbGlicmFyeSB2ZXJzaW9uICVzLlxuIik7CiAgc3RhdGljIGNvbnN0IGNoYXIgZm10NFtdID0KICAgIE5fKCIlcyVzR0dDIGhldXJpc3RpY3M6IC0tcGFyYW0gZ2djLW1pbi1leHBhbmQ9JWQgLS1wYXJhbSBnZ2MtbWluLWhlYXBzaXplPSVkXG4iKTsKI2lmbmRlZiBfX1ZFUlNJT05fXwojZGVmaW5lIF9fVkVSU0lPTl9fICJbP10iCiNlbmRpZgogIGZwcmludGYgKGZpbGUsCgkgICBmaWxlID09IHN0ZGVyciA/IF8oZm10MSkgOiBmbXQxLAoJICAgaW5kZW50LCAqaW5kZW50ICE9IDAgPyAiICIgOiAiIiwKCSAgIGxhbmdfaG9va3MubmFtZSwgcGtndmVyc2lvbl9zdHJpbmcsIHZlcnNpb25fc3RyaW5nLCBUQVJHRVRfTkFNRSwKCSAgIGluZGVudCwgX19WRVJTSU9OX18pOwoKICAvKiBXZSBuZWVkIHRvIHN0cmluZ2lmeSB0aGUgR01QIG1hY3JvIHZhbHVlcy4gIFVnaCwgZ21wX3ZlcnNpb24gaGFzCiAgICAgdHdvIHN0cmluZyBmb3JtYXRzLCAiaS5qLmsiIGFuZCAiaS5qIiB3aGVuIGsgaXMgemVyby4gIEFzIG9mCiAgICAgZ21wLTQuMy4wLCBHTVAgYWx3YXlzIHVzZXMgdGhlIDMgbnVtYmVyIGZvcm1hdC4gICovCiNkZWZpbmUgR0NDX0dNUF9TVFJJTkdJRllfVkVSU0lPTjMoWCkgI1gKI2RlZmluZSBHQ0NfR01QX1NUUklOR0lGWV9WRVJTSU9OMihYKSBHQ0NfR01QX1NUUklOR0lGWV9WRVJTSU9OMyhYKQojZGVmaW5lIEdDQ19HTVBfVkVSU0lPTl9OVU0oWCxZLFopICgoKFgpIDw8IDE2TCkgfCAoKFkpIDw8IDgpIHwgKFopKQojZGVmaW5lIEdDQ19HTVBfVkVSU0lPTiBcCiAgR0NDX0dNUF9WRVJTSU9OX05VTShfX0dOVV9NUF9WRVJTSU9OLCBfX0dOVV9NUF9WRVJTSU9OX01JTk9SLCBfX0dOVV9NUF9WRVJTSU9OX1BBVENITEVWRUwpCiNpZiBHQ0NfR01QX1ZFUlNJT04gPCBHQ0NfR01QX1ZFUlNJT05fTlVNKDQsMywwKSAmJiBfX0dOVV9NUF9WRVJTSU9OX1BBVENITEVWRUwgPT0gMAojZGVmaW5lIEdDQ19HTVBfU1RSSU5HSUZZX1ZFUlNJT04gR0NDX0dNUF9TVFJJTkdJRllfVkVSU0lPTjIoX19HTlVfTVBfVkVSU0lPTikgIi4iIFwKICBHQ0NfR01QX1NUUklOR0lGWV9WRVJTSU9OMihfX0dOVV9NUF9WRVJTSU9OX01JTk9SKQojZWxzZQojZGVmaW5lIEdDQ19HTVBfU1RSSU5HSUZZX1ZFUlNJT04gR0NDX0dNUF9TVFJJTkdJRllfVkVSU0lPTjIoX19HTlVfTVBfVkVSU0lPTikgIi4iIFwKICBHQ0NfR01QX1NUUklOR0lGWV9WRVJTSU9OMihfX0dOVV9NUF9WRVJTSU9OX01JTk9SKSAiLiIgXAogIEdDQ19HTVBfU1RSSU5HSUZZX1ZFUlNJT04yKF9fR05VX01QX1ZFUlNJT05fUEFUQ0hMRVZFTCkKI2VuZGlmCiAgZnByaW50ZiAoZmlsZSwKCSAgIGZpbGUgPT0gc3RkZXJyID8gXyhmbXQyKSA6IGZtdDIsCgkgICBHQ0NfR01QX1NUUklOR0lGWV9WRVJTSU9OLCBNUEZSX1ZFUlNJT05fU1RSSU5HKTsKICBpZiAoc3RyY21wIChHQ0NfR01QX1NUUklOR0lGWV9WRVJTSU9OLCBnbXBfdmVyc2lvbikpCiAgICBmcHJpbnRmIChmaWxlLAoJICAgICBmaWxlID09IHN0ZGVyciA/IF8oZm10MykgOiBmbXQzLAoJICAgICBpbmRlbnQsICppbmRlbnQgIT0gMCA/ICIgIiA6ICIiLAoJICAgICAiR01QIiwgR0NDX0dNUF9TVFJJTkdJRllfVkVSU0lPTiwgZ21wX3ZlcnNpb24pOwogIGlmIChzdHJjbXAgKE1QRlJfVkVSU0lPTl9TVFJJTkcsIG1wZnJfZ2V0X3ZlcnNpb24gKCkpKQogICAgZnByaW50ZiAoZmlsZSwKCSAgICAgZmlsZSA9PSBzdGRlcnIgPyBfKGZtdDMpIDogZm10MywKCSAgICAgaW5kZW50LCAqaW5kZW50ICE9IDAgPyAiICIgOiAiIiwKCSAgICAgIk1QRlIiLCBNUEZSX1ZFUlNJT05fU1RSSU5HLCBtcGZyX2dldF92ZXJzaW9uICgpKTsKICBmcHJpbnRmIChmaWxlLAoJICAgZmlsZSA9PSBzdGRlcnIgPyBfKGZtdDQpIDogZm10NCwKCSAgIGluZGVudCwgKmluZGVudCAhPSAwID8gIiAiIDogIiIsCgkgICBQQVJBTV9WQUxVRSAoR0dDX01JTl9FWFBBTkQpLCBQQVJBTV9WQUxVRSAoR0dDX01JTl9IRUFQU0laRSkpOwp9CgojaWZkZWYgQVNNX0NPTU1FTlRfU1RBUlQKc3RhdGljIGludApwcmludF90b19hc21fb3V0X2ZpbGUgKHByaW50X3N3aXRjaF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKiB0ZXh0KQp7CiAgYm9vbCBwcmVwZW5kX3NlcCA9IHRydWU7CgogIHN3aXRjaCAodHlwZSkKICAgIHsKICAgIGNhc2UgU1dJVENIX1RZUEVfTElORV9FTkQ6CiAgICAgIHB1dGMgKCdcbicsIGFzbV9vdXRfZmlsZSk7CiAgICAgIHJldHVybiAxOwoKICAgIGNhc2UgU1dJVENIX1RZUEVfTElORV9TVEFSVDoKICAgICAgZnB1dHMgKEFTTV9DT01NRU5UX1NUQVJULCBhc21fb3V0X2ZpbGUpOwogICAgICByZXR1cm4gc3RybGVuIChBU01fQ09NTUVOVF9TVEFSVCk7CgogICAgY2FzZSBTV0lUQ0hfVFlQRV9ERVNDUklQVElWRToKICAgICAgaWYgKEFTTV9DT01NRU5UX1NUQVJUWzBdID09IDApCglwcmVwZW5kX3NlcCA9IGZhbHNlOwogICAgICAvKiBEcm9wIHRocm91Z2guICAqLwogICAgY2FzZSBTV0lUQ0hfVFlQRV9QQVNTRUQ6CiAgICBjYXNlIFNXSVRDSF9UWVBFX0VOQUJMRUQ6CiAgICAgIGlmIChwcmVwZW5kX3NlcCkKCWZwdXRjICgnICcsIGFzbV9vdXRfZmlsZSk7CiAgICAgIGZwcmludGYgKGFzbV9vdXRfZmlsZSwgdGV4dCk7CiAgICAgIC8qIE5vIG5lZWQgdG8gcmV0dXJuIHRoZSBsZW5ndGggaGVyZSBhcwoJIHByaW50X3NpbmdsZV9zd2l0Y2ggaGFzIGFscmVhZHkgZG9uZSBpdC4gICovCiAgICAgIHJldHVybiAwOwoKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiAtMTsKICAgIH0KfQojZW5kaWYKCnN0YXRpYyBpbnQKcHJpbnRfdG9fc3RkZXJyIChwcmludF9zd2l0Y2hfdHlwZSB0eXBlLCBjb25zdCBjaGFyICogdGV4dCkKewogIHN3aXRjaCAodHlwZSkKICAgIHsKICAgIGNhc2UgU1dJVENIX1RZUEVfTElORV9FTkQ6CiAgICAgIHB1dGMgKCdcbicsIHN0ZGVycik7CiAgICAgIHJldHVybiAxOwoKICAgIGNhc2UgU1dJVENIX1RZUEVfTElORV9TVEFSVDoKICAgICAgcmV0dXJuIDA7CiAgICAgIAogICAgY2FzZSBTV0lUQ0hfVFlQRV9QQVNTRUQ6CiAgICBjYXNlIFNXSVRDSF9UWVBFX0VOQUJMRUQ6CiAgICAgIGZwdXRjICgnICcsIHN0ZGVycik7CiAgICAgIC8qIERyb3AgdGhyb3VnaC4gICovCgogICAgY2FzZSBTV0lUQ0hfVFlQRV9ERVNDUklQVElWRToKICAgICAgZnByaW50ZiAoc3RkZXJyLCB0ZXh0KTsKICAgICAgLyogTm8gbmVlZCB0byByZXR1cm4gdGhlIGxlbmd0aCBoZXJlIGFzCgkgcHJpbnRfc2luZ2xlX3N3aXRjaCBoYXMgYWxyZWFkeSBkb25lIGl0LiAgKi8KICAgICAgcmV0dXJuIDA7CgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIC0xOwogICAgfQp9CgovKiBQcmludCBhbiBvcHRpb24gdmFsdWUgYW5kIHJldHVybiB0aGUgYWRqdXN0ZWQgcG9zaXRpb24gaW4gdGhlIGxpbmUuCiAgID8/PyBwcmludF9mbiBkb2Vzbid0IGhhbmRsZSBlcnJvcnMsIGVnIGRpc2sgZnVsbDsgcHJlc3VtYWJseSBvdGhlcgogICBjb2RlIHdpbGwgY2F0Y2ggYSBkaXNrIGZ1bGwgdGhvdWdoLiAgKi8KCnN0YXRpYyBpbnQKcHJpbnRfc2luZ2xlX3N3aXRjaCAocHJpbnRfc3dpdGNoX2ZuX3R5cGUgcHJpbnRfZm4sCgkJICAgICBpbnQgcG9zLAoJCSAgICAgcHJpbnRfc3dpdGNoX3R5cGUgdHlwZSwKCQkgICAgIGNvbnN0IGNoYXIgKiB0ZXh0KQp7CiAgLyogVGhlIHVsdHJpeCBmcHJpbnRmIHJldHVybnMgMCBvbiBzdWNjZXNzLCBzbyBjb21wdXRlIHRoZSByZXN1bHQKICAgICB3ZSB3YW50IGhlcmUgc2luY2Ugd2UgbmVlZCBpdCBmb3IgdGhlIGZvbGxvd2luZyB0ZXN0LiAgVGhlICsxCiAgICAgaXMgZm9yIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIHRoYXQgd2lsbCBwcm9iYWJseSBiZSBlbWl0dGVkLiAgKi8KICBpbnQgbGVuID0gc3RybGVuICh0ZXh0KSArIDE7CgogIGlmIChwb3MgIT0gMAogICAgICAmJiBwb3MgKyBsZW4gPiBNQVhfTElORSkKICAgIHsKICAgICAgcHJpbnRfZm4gKFNXSVRDSF9UWVBFX0xJTkVfRU5ELCBOVUxMKTsKICAgICAgcG9zID0gMDsKICAgIH0KCiAgaWYgKHBvcyA9PSAwKQogICAgcG9zICs9IHByaW50X2ZuIChTV0lUQ0hfVFlQRV9MSU5FX1NUQVJULCBOVUxMKTsKCiAgcHJpbnRfZm4gKHR5cGUsIHRleHQpOwogIHJldHVybiBwb3MgKyBsZW47Cn0KCi8qIFByaW50IGFjdGl2ZSB0YXJnZXQgc3dpdGNoZXMgdXNpbmcgUFJJTlRfRk4uCiAgIFBPUyBpcyB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gYW5kIE1BWCBpcyB0aGUgc2l6ZSBvZiBhICJsaW5lIi4KICAgRWFjaCBsaW5lIGJlZ2lucyB3aXRoIElOREVOVCBhbmQgZW5kcyB3aXRoIFRFUk0uCiAgIEVhY2ggc3dpdGNoIGlzIHNlcGFyYXRlZCBmcm9tIHRoZSBuZXh0IGJ5IFNFUC4gICovCgpzdGF0aWMgdm9pZApwcmludF9zd2l0Y2hfdmFsdWVzIChwcmludF9zd2l0Y2hfZm5fdHlwZSBwcmludF9mbikKewogIGludCBwb3MgPSAwOwogIHNpemVfdCBqOwogIGNvbnN0IGNoYXIgKipwOwoKICAvKiBGaWxsIGluIHRoZSAtZnJhbmRvbS1zZWVkIG9wdGlvbiwgaWYgdGhlIHVzZXIgZGlkbid0IHBhc3MgaXQsIHNvCiAgICAgdGhhdCBpdCBjYW4gYmUgcHJpbnRlZCBiZWxvdy4gIFRoaXMgaGVscHMgcmVwcm9kdWNpYmlsaXR5LiAgKi8KICBpZiAoIWZsYWdfcmFuZG9tX3NlZWQpCiAgICBpbml0X3JhbmRvbV9zZWVkICgpOwoKICAvKiBQcmludCB0aGUgb3B0aW9ucyBhcyBwYXNzZWQuICAqLwogIHBvcyA9IHByaW50X3NpbmdsZV9zd2l0Y2ggKHByaW50X2ZuLCBwb3MsCgkJCSAgICAgU1dJVENIX1RZUEVfREVTQ1JJUFRJVkUsIF8oIm9wdGlvbnMgcGFzc2VkOiAiKSk7CgogIGZvciAocCA9ICZzYXZlX2FyZ3ZbMV07ICpwICE9IE5VTEw7IHArKykKICAgIHsKICAgICAgaWYgKCoqcCA9PSAnLScpCgl7CgkgIC8qIElnbm9yZSB0aGVzZS4gICovCgkgIGlmIChzdHJjbXAgKCpwLCAiLW8iKSA9PSAwCgkgICAgICB8fCBzdHJjbXAgKCpwLCAiLWR1bXBiYXNlIikgPT0gMAoJICAgICAgfHwgc3RyY21wICgqcCwgIi1hdXhiYXNlIikgPT0gMCkKCSAgICB7CgkgICAgICBpZiAocFsxXSAhPSBOVUxMKQoJCXArKzsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCgkgIGlmIChzdHJjbXAgKCpwLCAiLXF1aWV0IikgPT0gMAoJICAgICAgfHwgc3RyY21wICgqcCwgIi12ZXJzaW9uIikgPT0gMCkKCSAgICBjb250aW51ZTsKCgkgIGlmICgoKnApWzFdID09ICdkJykKCSAgICBjb250aW51ZTsKCX0KCiAgICAgIHBvcyA9IHByaW50X3NpbmdsZV9zd2l0Y2ggKHByaW50X2ZuLCBwb3MsIFNXSVRDSF9UWVBFX1BBU1NFRCwgKnApOwogICAgfQoKICBpZiAocG9zID4gMCkKICAgIHByaW50X2ZuIChTV0lUQ0hfVFlQRV9MSU5FX0VORCwgTlVMTCk7CgogIC8qIFByaW50IHRoZSAtZiBhbmQgLW0gb3B0aW9ucyB0aGF0IGhhdmUgYmVlbiBlbmFibGVkLgogICAgIFdlIGRvbid0IGhhbmRsZSBsYW5ndWFnZSBzcGVjaWZpYyBvcHRpb25zIGJ1dCBwcmludGluZyBhcmd2CiAgICAgc2hvdWxkIHN1ZmZpY2UuICAqLwogIHBvcyA9IHByaW50X3NpbmdsZV9zd2l0Y2ggKHByaW50X2ZuLCAwLAoJCQkgICAgIFNXSVRDSF9UWVBFX0RFU0NSSVBUSVZFLCBfKCJvcHRpb25zIGVuYWJsZWQ6ICIpKTsKCiAgZm9yIChqID0gMDsgaiA8IGNsX29wdGlvbnNfY291bnQ7IGorKykKICAgIGlmICgoY2xfb3B0aW9uc1tqXS5mbGFncyAmIENMX1JFUE9SVCkKCSYmIG9wdGlvbl9lbmFibGVkIChqKSA+IDApCiAgICAgIHBvcyA9IHByaW50X3NpbmdsZV9zd2l0Y2ggKHByaW50X2ZuLCBwb3MsCgkJCQkgU1dJVENIX1RZUEVfRU5BQkxFRCwgY2xfb3B0aW9uc1tqXS5vcHRfdGV4dCk7CgogIHByaW50X2ZuIChTV0lUQ0hfVFlQRV9MSU5FX0VORCwgTlVMTCk7Cn0KCi8qIE9wZW4gYXNzZW1ibHkgY29kZSBvdXRwdXQgZmlsZS4gIERvIHRoaXMgZXZlbiBpZiAtZnN5bnRheC1vbmx5IGlzCiAgIG9uLCBiZWNhdXNlIHRoZW4gdGhlIGRyaXZlciB3aWxsIGhhdmUgcHJvdmlkZWQgdGhlIG5hbWUgb2YgYQogICB0ZW1wb3JhcnkgZmlsZSBvciBiaXQgYnVja2V0IGZvciB1cy4gIE5BTUUgaXMgdGhlIGZpbGUgc3BlY2lmaWVkIG9uCiAgIHRoZSBjb21tYW5kIGxpbmUsIHBvc3NpYmx5IE5VTEwuICAqLwpzdGF0aWMgdm9pZAppbml0X2FzbV9vdXRwdXQgKGNvbnN0IGNoYXIgKm5hbWUpCnsKICBpZiAobmFtZSA9PSBOVUxMICYmIGFzbV9maWxlX25hbWUgPT0gMCkKICAgIGFzbV9vdXRfZmlsZSA9IHN0ZG91dDsKICBlbHNlCiAgICB7CiAgICAgIGlmIChhc21fZmlsZV9uYW1lID09IDApCgl7CgkgIGludCBsZW4gPSBzdHJsZW4gKGR1bXBfYmFzZV9uYW1lKTsKCSAgY2hhciAqZHVtcG5hbWUgPSBYTkVXVkVDIChjaGFyLCBsZW4gKyA2KTsKCgkgIG1lbWNweSAoZHVtcG5hbWUsIGR1bXBfYmFzZV9uYW1lLCBsZW4gKyAxKTsKCSAgc3RyaXBfb2ZmX2VuZGluZyAoZHVtcG5hbWUsIGxlbik7CgkgIHN0cmNhdCAoZHVtcG5hbWUsICIucyIpOwoJICBhc21fZmlsZV9uYW1lID0gZHVtcG5hbWU7Cgl9CiAgICAgIGlmICghc3RyY21wIChhc21fZmlsZV9uYW1lLCAiLSIpKQoJYXNtX291dF9maWxlID0gc3Rkb3V0OwogICAgICBlbHNlCglhc21fb3V0X2ZpbGUgPSBmb3BlbiAoYXNtX2ZpbGVfbmFtZSwgIncrYiIpOwogICAgICBpZiAoYXNtX291dF9maWxlID09IDApCglmYXRhbF9lcnJvciAoImNhbiUndCBvcGVuICVzIGZvciB3cml0aW5nOiAlbSIsIGFzbV9maWxlX25hbWUpOwogICAgfQoKICBpZiAoIWZsYWdfc3ludGF4X29ubHkpCiAgICB7CiAgICAgIHRhcmdldG0uYXNtX291dC5maWxlX3N0YXJ0ICgpOwoKICAgICAgaWYgKGZsYWdfcmVjb3JkX2djY19zd2l0Y2hlcykKCXsKCSAgaWYgKHRhcmdldG0uYXNtX291dC5yZWNvcmRfZ2NjX3N3aXRjaGVzKQoJICAgIHsKCSAgICAgIC8qIExldCB0aGUgdGFyZ2V0IGtub3cgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gc3RhcnQgcmVjb3JkaW5nLiAgKi8KCSAgICAgIHRhcmdldG0uYXNtX291dC5yZWNvcmRfZ2NjX3N3aXRjaGVzIChTV0lUQ0hfVFlQRV9ERVNDUklQVElWRSwKCQkJCQkJICAgTlVMTCk7CgkgICAgICAvKiBOb3cgcmVjb3JkIHRoZSBzd2l0Y2hlcy4gICovCgkgICAgICBwcmludF9zd2l0Y2hfdmFsdWVzICh0YXJnZXRtLmFzbV9vdXQucmVjb3JkX2djY19zd2l0Y2hlcyk7CgkgICAgICAvKiBMZXQgdGhlIHRhcmdldCBrbm93IHRoYXQgdGhlIHJlY29yZGluZyBpcyBvdmVyLiAgKi8KCSAgICAgIHRhcmdldG0uYXNtX291dC5yZWNvcmRfZ2NjX3N3aXRjaGVzIChTV0lUQ0hfVFlQRV9ERVNDUklQVElWRSwKCQkJCQkJICAgTlVMTCk7CgkgICAgfQoJICBlbHNlCgkgICAgaW5mb3JtIChpbnB1dF9sb2NhdGlvbiwgIi1mcmVjb3JkLWdjYy1zd2l0Y2hlcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHRhcmdldCIpOwoJfQoKI2lmZGVmIEFTTV9DT01NRU5UX1NUQVJUCiAgICAgIGlmIChmbGFnX3ZlcmJvc2VfYXNtKQoJewoJICAvKiBQcmludCB0aGUgbGlzdCBvZiBzd2l0Y2hlcyBpbiBlZmZlY3QKCSAgICAgaW50byB0aGUgYXNzZW1ibGVyIGZpbGUgYXMgY29tbWVudHMuICAqLwoJICBwcmludF92ZXJzaW9uIChhc21fb3V0X2ZpbGUsIEFTTV9DT01NRU5UX1NUQVJUKTsKCSAgcHJpbnRfc3dpdGNoX3ZhbHVlcyAocHJpbnRfdG9fYXNtX291dF9maWxlKTsKCSAgZnByaW50ZiAoYXNtX291dF9maWxlLCAiXG4iKTsKCX0KI2VuZGlmCiAgICB9Cn0KCi8qIFJldHVybiB0cnVlIGlmIHRoZSBzdGF0ZSBvZiBvcHRpb24gT1BUSU9OIHNob3VsZCBiZSBzdG9yZWQgaW4gUENIIGZpbGVzCiAgIGFuZCBjaGVja2VkIGJ5IGRlZmF1bHRfcGNoX3ZhbGlkX3AuICBTdG9yZSB0aGUgb3B0aW9uJ3MgY3VycmVudCBzdGF0ZQogICBpbiBTVEFURSBpZiBzby4gICovCgpzdGF0aWMgaW5saW5lIGJvb2wKb3B0aW9uX2FmZmVjdHNfcGNoX3AgKGludCBvcHRpb24sIHN0cnVjdCBjbF9vcHRpb25fc3RhdGUgKnN0YXRlKQp7CiAgaWYgKChjbF9vcHRpb25zW29wdGlvbl0uZmxhZ3MgJiBDTF9UQVJHRVQpID09IDApCiAgICByZXR1cm4gZmFsc2U7CiAgaWYgKGNsX29wdGlvbnNbb3B0aW9uXS5mbGFnX3ZhciA9PSAmdGFyZ2V0X2ZsYWdzKQogICAgaWYgKHRhcmdldG0uY2hlY2tfcGNoX3RhcmdldF9mbGFncykKICAgICAgcmV0dXJuIGZhbHNlOwogIHJldHVybiBnZXRfb3B0aW9uX3N0YXRlIChvcHRpb24sIHN0YXRlKTsKfQoKLyogRGVmYXVsdCB2ZXJzaW9uIG9mIGdldF9wY2hfdmFsaWRpdHkuCiAgIEJ5IGRlZmF1bHQsIGV2ZXJ5IGZsYWcgZGlmZmVyZW5jZSBpcyBmYXRhbDsgdGhhdCB3aWxsIGJlIG1vc3RseSByaWdodCBmb3IKICAgbW9zdCB0YXJnZXRzLCBidXQgY29tcGxldGVseSByaWdodCBmb3IgdmVyeSBmZXcuICAqLwoKdm9pZCAqCmRlZmF1bHRfZ2V0X3BjaF92YWxpZGl0eSAoc2l6ZV90ICpsZW4pCnsKICBzdHJ1Y3QgY2xfb3B0aW9uX3N0YXRlIHN0YXRlOwogIHNpemVfdCBpOwogIGNoYXIgKnJlc3VsdCwgKnI7CgogICpsZW4gPSAyOwogIGlmICh0YXJnZXRtLmNoZWNrX3BjaF90YXJnZXRfZmxhZ3MpCiAgICAqbGVuICs9IHNpemVvZiAodGFyZ2V0X2ZsYWdzKTsKICBmb3IgKGkgPSAwOyBpIDwgY2xfb3B0aW9uc19jb3VudDsgaSsrKQogICAgaWYgKG9wdGlvbl9hZmZlY3RzX3BjaF9wIChpLCAmc3RhdGUpKQogICAgICAqbGVuICs9IHN0YXRlLnNpemU7CgogIHJlc3VsdCA9IHIgPSBYTkVXVkVDIChjaGFyLCAqbGVuKTsKICByWzBdID0gZmxhZ19waWM7CiAgclsxXSA9IGZsYWdfcGllOwogIHIgKz0gMjsKICBpZiAodGFyZ2V0bS5jaGVja19wY2hfdGFyZ2V0X2ZsYWdzKQogICAgewogICAgICBtZW1jcHkgKHIsICZ0YXJnZXRfZmxhZ3MsIHNpemVvZiAodGFyZ2V0X2ZsYWdzKSk7CiAgICAgIHIgKz0gc2l6ZW9mICh0YXJnZXRfZmxhZ3MpOwogICAgfQoKICBmb3IgKGkgPSAwOyBpIDwgY2xfb3B0aW9uc19jb3VudDsgaSsrKQogICAgaWYgKG9wdGlvbl9hZmZlY3RzX3BjaF9wIChpLCAmc3RhdGUpKQogICAgICB7CgltZW1jcHkgKHIsIHN0YXRlLmRhdGEsIHN0YXRlLnNpemUpOwoJciArPSBzdGF0ZS5zaXplOwogICAgICB9CgogIHJldHVybiByZXN1bHQ7Cn0KCi8qIFJldHVybiBhIG1lc3NhZ2Ugd2hpY2ggc2F5cyB0aGF0IGEgUENIIGZpbGUgd2FzIGNyZWF0ZWQgd2l0aCBhIGRpZmZlcmVudAogICBzZXR0aW5nIG9mIE9QVElPTi4gICovCgpzdGF0aWMgY29uc3QgY2hhciAqCnBjaF9vcHRpb25fbWlzbWF0Y2ggKGNvbnN0IGNoYXIgKm9wdGlvbikKewogIGNoYXIgKnI7CgogIGFzcHJpbnRmICgmciwgXygiY3JlYXRlZCBhbmQgdXNlZCB3aXRoIGRpZmZlcmluZyBzZXR0aW5ncyBvZiAnJXMnIiksIG9wdGlvbik7CiAgaWYgKHIgPT0gTlVMTCkKICAgIHJldHVybiBfKCJvdXQgb2YgbWVtb3J5Iik7CiAgcmV0dXJuIHI7Cn0KCi8qIERlZmF1bHQgdmVyc2lvbiBvZiBwY2hfdmFsaWRfcC4gICovCgpjb25zdCBjaGFyICoKZGVmYXVsdF9wY2hfdmFsaWRfcCAoY29uc3Qgdm9pZCAqZGF0YV9wLCBzaXplX3QgbGVuKQp7CiAgc3RydWN0IGNsX29wdGlvbl9zdGF0ZSBzdGF0ZTsKICBjb25zdCBjaGFyICpkYXRhID0gKGNvbnN0IGNoYXIgKilkYXRhX3A7CiAgc2l6ZV90IGk7CgogIC8qIC1mcGljIGFuZCAtZnBpZSBhbHNvIHVzdWFsbHkgbWFrZSBhIFBDSCBpbnZhbGlkLiAgKi8KICBpZiAoZGF0YVswXSAhPSBmbGFnX3BpYykKICAgIHJldHVybiBfKCJjcmVhdGVkIGFuZCB1c2VkIHdpdGggZGlmZmVyZW50IHNldHRpbmdzIG9mIC1mcGljIik7CiAgaWYgKGRhdGFbMV0gIT0gZmxhZ19waWUpCiAgICByZXR1cm4gXygiY3JlYXRlZCBhbmQgdXNlZCB3aXRoIGRpZmZlcmVudCBzZXR0aW5ncyBvZiAtZnBpZSIpOwogIGRhdGEgKz0gMjsKCiAgLyogQ2hlY2sgdGFyZ2V0X2ZsYWdzLiAgKi8KICBpZiAodGFyZ2V0bS5jaGVja19wY2hfdGFyZ2V0X2ZsYWdzKQogICAgewogICAgICBpbnQgdGY7CiAgICAgIGNvbnN0IGNoYXIgKnI7CgogICAgICBtZW1jcHkgKCZ0ZiwgZGF0YSwgc2l6ZW9mICh0YXJnZXRfZmxhZ3MpKTsKICAgICAgZGF0YSArPSBzaXplb2YgKHRhcmdldF9mbGFncyk7CiAgICAgIGxlbiAtPSBzaXplb2YgKHRhcmdldF9mbGFncyk7CiAgICAgIHIgPSB0YXJnZXRtLmNoZWNrX3BjaF90YXJnZXRfZmxhZ3MgKHRmKTsKICAgICAgaWYgKHIgIT0gTlVMTCkKCXJldHVybiByOwogICAgfQoKICBmb3IgKGkgPSAwOyBpIDwgY2xfb3B0aW9uc19jb3VudDsgaSsrKQogICAgaWYgKG9wdGlvbl9hZmZlY3RzX3BjaF9wIChpLCAmc3RhdGUpKQogICAgICB7CglpZiAobWVtY21wIChkYXRhLCBzdGF0ZS5kYXRhLCBzdGF0ZS5zaXplKSAhPSAwKQoJICByZXR1cm4gcGNoX29wdGlvbl9taXNtYXRjaCAoY2xfb3B0aW9uc1tpXS5vcHRfdGV4dCk7CglkYXRhICs9IHN0YXRlLnNpemU7CglsZW4gLT0gc3RhdGUuc2l6ZTsKICAgICAgfQoKICByZXR1cm4gTlVMTDsKfQoKLyogRGVmYXVsdCB0cmVlIHByaW50ZXIuICAgSGFuZGxlcyBkZWNsYXJhdGlvbnMgb25seS4gICovCnN0YXRpYyBib29sCmRlZmF1bHRfdHJlZV9wcmludGVyIChwcmV0dHlfcHJpbnRlciAqIHBwLCB0ZXh0X2luZm8gKnRleHQsIGNvbnN0IGNoYXIgKnNwZWMsCgkJICAgICAgaW50IHByZWNpc2lvbiwgYm9vbCB3aWRlLCBib29sIHNldF9sb2N1cywgYm9vbCBoYXNoKQp7CiAgdHJlZSB0OwoKICAvKiBGVVRVUkU6ICUreCBzaG91bGQgc2V0IHRoZSBsb2N1cy4gICovCiAgaWYgKHByZWNpc2lvbiAhPSAwIHx8IHdpZGUgfHwgaGFzaCkKICAgIHJldHVybiBmYWxzZTsKCiAgc3dpdGNoICgqc3BlYykKICAgIHsKICAgIGNhc2UgJ0QnOgogICAgICB0ID0gdmFfYXJnICgqdGV4dC0+YXJnc19wdHIsIHRyZWUpOwogICAgICBpZiAoREVDTF9ERUJVR19FWFBSX0lTX0ZST00gKHQpICYmIERFQ0xfREVCVUdfRVhQUiAodCkpCgl0ID0gREVDTF9ERUJVR19FWFBSICh0KTsKICAgICAgYnJlYWs7CgogICAgY2FzZSAnRic6CiAgICBjYXNlICdUJzoKICAgICAgdCA9IHZhX2FyZyAoKnRleHQtPmFyZ3NfcHRyLCB0cmVlKTsKICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICBpZiAoc2V0X2xvY3VzICYmIHRleHQtPmxvY3VzKQogICAgKnRleHQtPmxvY3VzID0gREVDTF9TT1VSQ0VfTE9DQVRJT04gKHQpOwoKICBpZiAoREVDTF9QICh0KSkKICAgIHsKICAgICAgY29uc3QgY2hhciAqbiA9IERFQ0xfTkFNRSAodCkKICAgICAgICA/IGxhbmdfaG9va3MuZGVjbF9wcmludGFibGVfbmFtZSAodCwgMikKICAgICAgICA6ICI8YW5vbnltb3VzPiI7CiAgICAgIHBwX3N0cmluZyAocHAsIG4pOwogICAgfQogIGVsc2UKICAgIGR1bXBfZ2VuZXJpY19ub2RlIChwcCwgdCwgMCwgVERGX0RJQUdOT1NUSUMsIDApOwoKICByZXR1cm4gdHJ1ZTsKfQoKLyogQSBoZWxwZXIgZnVuY3Rpb247IHVzZWQgYXMgdGhlIHJlYWxsb2NhdG9yIGZ1bmN0aW9uIGZvciBjcHAncyBsaW5lCiAgIHRhYmxlLiAgKi8Kc3RhdGljIHZvaWQgKgpyZWFsbG9jX2Zvcl9saW5lX21hcCAodm9pZCAqcHRyLCBzaXplX3QgbGVuKQp7CiAgcmV0dXJuIGdnY19yZWFsbG9jIChwdHIsIGxlbik7Cn0KCi8qIEluaXRpYWxpemF0aW9uIG9mIHRoZSBmcm9udCBlbmQgZW52aXJvbm1lbnQsIGJlZm9yZSBjb21tYW5kIGxpbmUKICAgb3B0aW9ucyBhcmUgcGFyc2VkLiAgU2lnbmFsIGhhbmRsZXJzLCBpbnRlcm5hdGlvbmFsaXphdGlvbiBldGMuCiAgIEFSR1YwIGlzIG1haW4ncyBhcmd2WzBdLiAgKi8Kc3RhdGljIHZvaWQKZ2VuZXJhbF9pbml0IChjb25zdCBjaGFyICphcmd2MCkKewogIGNvbnN0IGNoYXIgKnA7CgogIHAgPSBhcmd2MCArIHN0cmxlbiAoYXJndjApOwogIHdoaWxlIChwICE9IGFyZ3YwICYmICFJU19ESVJfU0VQQVJBVE9SIChwWy0xXSkpCiAgICAtLXA7CiAgcHJvZ25hbWUgPSBwOwoKICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2duYW1lKTsKCiAgaGV4X2luaXQgKCk7CgogIC8qIFVubG9jayB0aGUgc3RkaW8gc3RyZWFtcy4gICovCiAgdW5sb2NrX3N0ZF9zdHJlYW1zICgpOwoKICBnY2NfaW5pdF9saWJpbnRsICgpOwoKICAvKiBJbml0aWFsaXplIHRoZSBkaWFnbm9zdGljcyByZXBvcnRpbmcgbWFjaGluZXJ5LCBzbyBvcHRpb24gcGFyc2luZwogICAgIGNhbiBnaXZlIHdhcm5pbmdzIGFuZCBlcnJvcnMuICAqLwogIGRpYWdub3N0aWNfaW5pdGlhbGl6ZSAoZ2xvYmFsX2RjKTsKICAvKiBTZXQgYSBkZWZhdWx0IHByaW50ZXIuICBMYW5ndWFnZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbnMgd2lsbAogICAgIG92ZXJyaWRlIGl0IGxhdGVyLiAgKi8KICBwcF9mb3JtYXRfZGVjb2RlciAoZ2xvYmFsX2RjLT5wcmludGVyKSA9ICZkZWZhdWx0X3RyZWVfcHJpbnRlcjsKCiAgLyogVHJhcCBmYXRhbCBzaWduYWxzLCBlLmcuIFNJR1NFR1YsIGFuZCBjb252ZXJ0IHRoZW0gdG8gSUNFIG1lc3NhZ2VzLiAgKi8KI2lmZGVmIFNJR1NFR1YKICBzaWduYWwgKFNJR1NFR1YsIGNyYXNoX3NpZ25hbCk7CiNlbmRpZgojaWZkZWYgU0lHSUxMCiAgc2lnbmFsIChTSUdJTEwsIGNyYXNoX3NpZ25hbCk7CiNlbmRpZgojaWZkZWYgU0lHQlVTCiAgc2lnbmFsIChTSUdCVVMsIGNyYXNoX3NpZ25hbCk7CiNlbmRpZgojaWZkZWYgU0lHQUJSVAogIHNpZ25hbCAoU0lHQUJSVCwgY3Jhc2hfc2lnbmFsKTsKI2VuZGlmCiNpZiBkZWZpbmVkIFNJR0lPVCAmJiAoIWRlZmluZWQgU0lHQUJSVCB8fCBTSUdBQlJUICE9IFNJR0lPVCkKICBzaWduYWwgKFNJR0lPVCwgY3Jhc2hfc2lnbmFsKTsKI2VuZGlmCiNpZmRlZiBTSUdGUEUKICBzaWduYWwgKFNJR0ZQRSwgY3Jhc2hfc2lnbmFsKTsKI2VuZGlmCgogIC8qIE90aGVyIGhvc3Qtc3BlY2lmaWMgc2lnbmFsIHNldHVwLiAgKi8KICAoKmhvc3RfaG9va3MuZXh0cmFfc2lnbmFscykoKTsKCiAgLyogSW5pdGlhbGl6ZSB0aGUgZ2FyYmFnZS1jb2xsZWN0b3IsIHN0cmluZyBwb29scyBhbmQgdHJlZSB0eXBlIGhhc2gKICAgICB0YWJsZS4gICovCiAgaW5pdF9nZ2MgKCk7CiAgaW5pdF9zdHJpbmdwb29sICgpOwogIGxpbmVfdGFibGUgPSBHR0NfTkVXIChzdHJ1Y3QgbGluZV9tYXBzKTsKICBsaW5lbWFwX2luaXQgKGxpbmVfdGFibGUpOwogIGxpbmVfdGFibGUtPnJlYWxsb2NhdG9yID0gcmVhbGxvY19mb3JfbGluZV9tYXA7CiAgaW5pdF90dHJlZSAoKTsKCiAgLyogSW5pdGlhbGl6ZSByZWdpc3RlciB1c2FnZSBub3cgc28gc3dpdGNoZXMgbWF5IG92ZXJyaWRlLiAgKi8KICBpbml0X3JlZ19zZXRzICgpOwoKICAvKiBSZWdpc3RlciB0aGUgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgcGFyYW1ldGVycy4gICovCiAgYWRkX3BhcmFtcyAobGFuZ19pbmRlcGVuZGVudF9wYXJhbXMsIExBU1RfUEFSQU0pOwoKICAvKiBUaGlzIG11c3QgYmUgZG9uZSBhZnRlciBhZGRfcGFyYW1zIGJ1dCBiZWZvcmUgYXJndW1lbnQgcHJvY2Vzc2luZy4gICovCiAgaW5pdF9nZ2NfaGV1cmlzdGljcygpOwogIGluaXRfb3B0aW1pemF0aW9uX3Bhc3NlcyAoKTsKICBzdGF0aXN0aWNzX2Vhcmx5X2luaXQgKCk7Cn0KCi8qIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IHRhcmdldCBzdXBwb3J0cyAtZnNlY3Rpb24tYW5jaG9ycy4gICovCgpzdGF0aWMgYm9vbAp0YXJnZXRfc3VwcG9ydHNfc2VjdGlvbl9hbmNob3JzX3AgKHZvaWQpCnsKICBpZiAodGFyZ2V0bS5taW5fYW5jaG9yX29mZnNldCA9PSAwICYmIHRhcmdldG0ubWF4X2FuY2hvcl9vZmZzZXQgPT0gMCkKICAgIHJldHVybiBmYWxzZTsKCiAgaWYgKHRhcmdldG0uYXNtX291dC5vdXRwdXRfYW5jaG9yID09IE5VTEwpCiAgICByZXR1cm4gZmFsc2U7CgogIHJldHVybiB0cnVlOwp9CgovKiBEZWZhdWx0IHRoZSBhbGlnbl8qIHZhcmlhYmxlcyB0byAxIGlmIHRoZXkncmUgc3RpbGwgdW5zZXQsIGFuZAogICBzZXQgdXAgdGhlIGFsaWduXypfbG9nIHZhcmlhYmxlcy4gICovCnN0YXRpYyB2b2lkCmluaXRfYWxpZ25tZW50cyAodm9pZCkKewogIGlmIChhbGlnbl9sb29wcyA8PSAwKQogICAgYWxpZ25fbG9vcHMgPSAxOwogIGlmIChhbGlnbl9sb29wc19tYXhfc2tpcCA+IGFsaWduX2xvb3BzKQogICAgYWxpZ25fbG9vcHNfbWF4X3NraXAgPSBhbGlnbl9sb29wcyAtIDE7CiAgYWxpZ25fbG9vcHNfbG9nID0gZmxvb3JfbG9nMiAoYWxpZ25fbG9vcHMgKiAyIC0gMSk7CiAgaWYgKGFsaWduX2p1bXBzIDw9IDApCiAgICBhbGlnbl9qdW1wcyA9IDE7CiAgaWYgKGFsaWduX2p1bXBzX21heF9za2lwID4gYWxpZ25fanVtcHMpCiAgICBhbGlnbl9qdW1wc19tYXhfc2tpcCA9IGFsaWduX2p1bXBzIC0gMTsKICBhbGlnbl9qdW1wc19sb2cgPSBmbG9vcl9sb2cyIChhbGlnbl9qdW1wcyAqIDIgLSAxKTsKICBpZiAoYWxpZ25fbGFiZWxzIDw9IDApCiAgICBhbGlnbl9sYWJlbHMgPSAxOwogIGFsaWduX2xhYmVsc19sb2cgPSBmbG9vcl9sb2cyIChhbGlnbl9sYWJlbHMgKiAyIC0gMSk7CiAgaWYgKGFsaWduX2xhYmVsc19tYXhfc2tpcCA+IGFsaWduX2xhYmVscykKICAgIGFsaWduX2xhYmVsc19tYXhfc2tpcCA9IGFsaWduX2xhYmVscyAtIDE7CiAgaWYgKGFsaWduX2Z1bmN0aW9ucyA8PSAwKQogICAgYWxpZ25fZnVuY3Rpb25zID0gMTsKICBhbGlnbl9mdW5jdGlvbnNfbG9nID0gZmxvb3JfbG9nMiAoYWxpZ25fZnVuY3Rpb25zICogMiAtIDEpOwp9CgovKiBQcm9jZXNzIHRoZSBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHBhcnNlZC4gICovCnN0YXRpYyB2b2lkCnByb2Nlc3Nfb3B0aW9ucyAodm9pZCkKewogIC8qIEp1c3QgaW4gY2FzZSBsYW5nX2hvb2tzLnBvc3Rfb3B0aW9ucyBlbmRzIHVwIGNhbGxpbmcgYSBkZWJ1Z19ob29rLgogICAgIFRoaXMgY2FuIGhhcHBlbiB3aXRoIGluY29ycmVjdCBwcmUtcHJvY2Vzc2VkIGlucHV0LiAqLwogIGRlYnVnX2hvb2tzID0gJmRvX25vdGhpbmdfZGVidWdfaG9va3M7CgogIC8qIFRoaXMgcmVwbGFjZXMgc2V0X1d1bnVzZWQuICAqLwogIGlmICh3YXJuX3VudXNlZF9mdW5jdGlvbiA9PSAtMSkKICAgIHdhcm5fdW51c2VkX2Z1bmN0aW9uID0gd2Fybl91bnVzZWQ7CiAgaWYgKHdhcm5fdW51c2VkX2xhYmVsID09IC0xKQogICAgd2Fybl91bnVzZWRfbGFiZWwgPSB3YXJuX3VudXNlZDsKICAvKiBXdW51c2VkLXBhcmFtZXRlciBpcyBlbmFibGVkIGlmIGJvdGggLVd1bnVzZWQgLVdleHRyYSBhcmUgZW5hYmxlZC4gICovCiAgaWYgKHdhcm5fdW51c2VkX3BhcmFtZXRlciA9PSAtMSkKICAgIHdhcm5fdW51c2VkX3BhcmFtZXRlciA9ICh3YXJuX3VudXNlZCAmJiBleHRyYV93YXJuaW5ncyk7CiAgaWYgKHdhcm5fdW51c2VkX3ZhcmlhYmxlID09IC0xKQogICAgd2Fybl91bnVzZWRfdmFyaWFibGUgPSB3YXJuX3VudXNlZDsKICBpZiAod2Fybl91bnVzZWRfdmFsdWUgPT0gLTEpCiAgICB3YXJuX3VudXNlZF92YWx1ZSA9IHdhcm5fdW51c2VkOwoKICAvKiBBbGxvdyB0aGUgZnJvbnQgZW5kIHRvIHBlcmZvcm0gY29uc2lzdGVuY3kgY2hlY2tzIGFuZCBkbyBmdXJ0aGVyCiAgICAgaW5pdGlhbGl6YXRpb24gYmFzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLiAgVGhpcyBob29rIGFsc28KICAgICBzZXRzIHRoZSBvcmlnaW5hbCBmaWxlbmFtZSBpZiBhcHByb3ByaWF0ZSAoZS5nLiBmb28uaSAtPiBmb28uYykKICAgICBzbyB3ZSBjYW4gY29ycmVjdGx5IGluaXRpYWxpemUgZGVidWcgb3V0cHV0LiAgKi8KICBub19iYWNrZW5kID0gbGFuZ19ob29rcy5wb3N0X29wdGlvbnMgKCZtYWluX2lucHV0X2ZpbGVuYW1lKTsKCiNpZmRlZiBPVkVSUklERV9PUFRJT05TCiAgLyogU29tZSBtYWNoaW5lcyBtYXkgcmVqZWN0IGNlcnRhaW4gY29tYmluYXRpb25zIG9mIG9wdGlvbnMuICAqLwogIE9WRVJSSURFX09QVElPTlM7CiNlbmRpZgoKICBpZiAoZmxhZ19zZWN0aW9uX2FuY2hvcnMgJiYgIXRhcmdldF9zdXBwb3J0c19zZWN0aW9uX2FuY2hvcnNfcCAoKSkKICAgIHsKICAgICAgd2FybmluZyAoT1BUX2ZzZWN0aW9uX2FuY2hvcnMsCgkgICAgICAgInRoaXMgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgJXFzIiwgIi1mc2VjdGlvbi1hbmNob3JzIik7CiAgICAgIGZsYWdfc2VjdGlvbl9hbmNob3JzID0gMDsKICAgIH0KCiAgaWYgKGZsYWdfc2hvcnRfZW51bXMgPT0gMikKICAgIGZsYWdfc2hvcnRfZW51bXMgPSB0YXJnZXRtLmRlZmF1bHRfc2hvcnRfZW51bXMgKCk7CgogIC8qIFNldCBhdXhfYmFzZV9uYW1lIGlmIG5vdCBhbHJlYWR5IHNldC4gICovCiAgaWYgKGF1eF9iYXNlX25hbWUpCiAgICA7CiAgZWxzZSBpZiAobWFpbl9pbnB1dF9maWxlbmFtZSkKICAgIHsKICAgICAgY2hhciAqbmFtZSA9IHhzdHJkdXAgKGxiYXNlbmFtZSAobWFpbl9pbnB1dF9maWxlbmFtZSkpOwoKICAgICAgc3RyaXBfb2ZmX2VuZGluZyAobmFtZSwgc3RybGVuIChuYW1lKSk7CiAgICAgIGF1eF9iYXNlX25hbWUgPSBuYW1lOwogICAgfQogIGVsc2UKICAgIGF1eF9iYXNlX25hbWUgPSAiZ2NjYXV4IjsKCiNpZm5kZWYgSEFWRV9jbG9vZwogIGlmIChmbGFnX2dyYXBoaXRlCiAgICAgIHx8IGZsYWdfbG9vcF9ibG9jawogICAgICB8fCBmbGFnX2xvb3BfaW50ZXJjaGFuZ2UKICAgICAgfHwgZmxhZ19sb29wX3N0cmlwX21pbmUKICAgICAgfHwgZmxhZ19ncmFwaGl0ZV9pZGVudGl0eSkKICAgIHNvcnJ5ICgiR3JhcGhpdGUgbG9vcCBvcHRpbWl6YXRpb25zIGNhbm5vdCBiZSB1c2VkIik7CiNlbmRpZgoKICAvKiBVbnJvbGxpbmcgYWxsIGxvb3BzIGltcGxpZXMgdGhhdCBzdGFuZGFyZCBsb29wIHVucm9sbGluZyBtdXN0IGFsc28KICAgICBiZSBkb25lLiAgKi8KICBpZiAoZmxhZ191bnJvbGxfYWxsX2xvb3BzKQogICAgZmxhZ191bnJvbGxfbG9vcHMgPSAxOwoKICAvKiBUaGUgbG9vcCB1bnJvbGxpbmcgY29kZSBhc3N1bWVzIHRoYXQgY3NlIHdpbGwgYmUgcnVuIGFmdGVyIGxvb3AuCiAgICAgd2ViIGFuZCByZW5hbWUtcmVnaXN0ZXJzIGFsc28gaGVscCB3aGVuIHJ1biBhZnRlciBsb29wIHVucm9sbGluZy4gICovCgogIGlmIChmbGFnX3JlcnVuX2NzZV9hZnRlcl9sb29wID09IEFVVE9ERVRFQ1RfVkFMVUUpCiAgICBmbGFnX3JlcnVuX2NzZV9hZnRlcl9sb29wID0gZmxhZ191bnJvbGxfbG9vcHMgfHwgZmxhZ19wZWVsX2xvb3BzOwogIGlmIChmbGFnX3dlYiA9PSBBVVRPREVURUNUX1ZBTFVFKQogICAgZmxhZ193ZWIgPSBmbGFnX3Vucm9sbF9sb29wcyB8fCBmbGFnX3BlZWxfbG9vcHM7CiAgaWYgKGZsYWdfcmVuYW1lX3JlZ2lzdGVycyA9PSBBVVRPREVURUNUX1ZBTFVFKQogICAgZmxhZ19yZW5hbWVfcmVnaXN0ZXJzID0gZmxhZ191bnJvbGxfbG9vcHMgfHwgZmxhZ19wZWVsX2xvb3BzOwoKICBpZiAoZmxhZ19ub25fY2FsbF9leGNlcHRpb25zKQogICAgZmxhZ19hc3luY2hyb25vdXNfdW53aW5kX3RhYmxlcyA9IDE7CiAgaWYgKGZsYWdfYXN5bmNocm9ub3VzX3Vud2luZF90YWJsZXMpCiAgICBmbGFnX3Vud2luZF90YWJsZXMgPSAxOwoKICBpZiAoZmxhZ192YWx1ZV9wcm9maWxlX3RyYW5zZm9ybWF0aW9ucykKICAgIGZsYWdfcHJvZmlsZV92YWx1ZXMgPSAxOwoKICAvKiBXYXJuIGFib3V0IG9wdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIG1hY2hpbmUuICAqLwojaWZuZGVmIElOU05fU0NIRURVTElORwogIGlmIChmbGFnX3NjaGVkdWxlX2luc25zIHx8IGZsYWdfc2NoZWR1bGVfaW5zbnNfYWZ0ZXJfcmVsb2FkKQogICAgd2FybmluZyAoMCwgImluc3RydWN0aW9uIHNjaGVkdWxpbmcgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHRhcmdldCBtYWNoaW5lIik7CiNlbmRpZgojaWZuZGVmIERFTEFZX1NMT1RTCiAgaWYgKGZsYWdfZGVsYXllZF9icmFuY2gpCiAgICB3YXJuaW5nICgwLCAidGhpcyB0YXJnZXQgbWFjaGluZSBkb2VzIG5vdCBoYXZlIGRlbGF5ZWQgYnJhbmNoZXMiKTsKI2VuZGlmCgogIHVzZXJfbGFiZWxfcHJlZml4ID0gVVNFUl9MQUJFTF9QUkVGSVg7CiAgaWYgKGZsYWdfbGVhZGluZ191bmRlcnNjb3JlICE9IC0xKQogICAgewogICAgICAvKiBJZiB0aGUgZGVmYXVsdCBwcmVmaXggaXMgbW9yZSBjb21wbGljYXRlZCB0aGFuICIiIG9yICJfIiwKCSBpc3N1ZSBhIHdhcm5pbmcgYW5kIGlnbm9yZSB0aGlzIG9wdGlvbi4gICovCiAgICAgIGlmICh1c2VyX2xhYmVsX3ByZWZpeFswXSA9PSAwIHx8CgkgICh1c2VyX2xhYmVsX3ByZWZpeFswXSA9PSAnXycgJiYgdXNlcl9sYWJlbF9wcmVmaXhbMV0gPT0gMCkpCgl7CgkgIHVzZXJfbGFiZWxfcHJlZml4ID0gZmxhZ19sZWFkaW5nX3VuZGVyc2NvcmUgPyAiXyIgOiAiIjsKCX0KICAgICAgZWxzZQoJd2FybmluZyAoMCwgIi1mJXNsZWFkaW5nLXVuZGVyc2NvcmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHRhcmdldCBtYWNoaW5lIiwKCQkgZmxhZ19sZWFkaW5nX3VuZGVyc2NvcmUgPyAiIiA6ICJuby0iKTsKICAgIH0KCiAgLyogSWYgd2UgYXJlIGluIHZlcmJvc2UgbW9kZSwgd3JpdGUgb3V0IHRoZSB2ZXJzaW9uIGFuZCBtYXliZSBhbGwgdGhlCiAgICAgb3B0aW9uIGZsYWdzIGluIHVzZS4gICovCiAgaWYgKHZlcnNpb25fZmxhZykKICAgIHsKICAgICAgcHJpbnRfdmVyc2lvbiAoc3RkZXJyLCAiIik7CiAgICAgIGlmICghIHF1aWV0X2ZsYWcpCglwcmludF9zd2l0Y2hfdmFsdWVzIChwcmludF90b19zdGRlcnIpOwogICAgfQoKICBpZiAoZmxhZ19zeW50YXhfb25seSkKICAgIHsKICAgICAgd3JpdGVfc3ltYm9scyA9IE5PX0RFQlVHOwogICAgICBwcm9maWxlX2ZsYWcgPSAwOwogICAgfQoKICAvKiBBIGxvdCBvZiBjb2RlIGFzc3VtZXMgd3JpdGVfc3ltYm9scyA9PSBOT19ERUJVRyBpZiB0aGUgZGVidWdnaW5nCiAgICAgbGV2ZWwgaXMgMC4gICovCiAgaWYgKGRlYnVnX2luZm9fbGV2ZWwgPT0gRElORk9fTEVWRUxfTk9ORSkKICAgIHdyaXRlX3N5bWJvbHMgPSBOT19ERUJVRzsKCiAgLyogTm93IHdlIGtub3cgd3JpdGVfc3ltYm9scywgc2V0IHVwIHRoZSBkZWJ1ZyBob29rcyBiYXNlZCBvbiBpdC4KICAgICBCeSBkZWZhdWx0IHdlIGRvIG5vdGhpbmcgZm9yIGRlYnVnIG91dHB1dC4gICovCiAgaWYgKFBSRUZFUlJFRF9ERUJVR0dJTkdfVFlQRSA9PSBOT19ERUJVRykKICAgIGRlZmF1bHRfZGVidWdfaG9va3MgPSAmZG9fbm90aGluZ19kZWJ1Z19ob29rczsKI2lmIGRlZmluZWQoREJYX0RFQlVHR0lOR19JTkZPKQogIGVsc2UgaWYgKFBSRUZFUlJFRF9ERUJVR0dJTkdfVFlQRSA9PSBEQlhfREVCVUcpCiAgICBkZWZhdWx0X2RlYnVnX2hvb2tzID0gJmRieF9kZWJ1Z19ob29rczsKI2VuZGlmCiNpZiBkZWZpbmVkKFhDT0ZGX0RFQlVHR0lOR19JTkZPKQogIGVsc2UgaWYgKFBSRUZFUlJFRF9ERUJVR0dJTkdfVFlQRSA9PSBYQ09GRl9ERUJVRykKICAgIGRlZmF1bHRfZGVidWdfaG9va3MgPSAmeGNvZmZfZGVidWdfaG9va3M7CiNlbmRpZgojaWZkZWYgU0RCX0RFQlVHR0lOR19JTkZPCiAgZWxzZSBpZiAoUFJFRkVSUkVEX0RFQlVHR0lOR19UWVBFID09IFNEQl9ERUJVRykKICAgIGRlZmF1bHRfZGVidWdfaG9va3MgPSAmc2RiX2RlYnVnX2hvb2tzOwojZW5kaWYKI2lmZGVmIERXQVJGMl9ERUJVR0dJTkdfSU5GTwogIGVsc2UgaWYgKFBSRUZFUlJFRF9ERUJVR0dJTkdfVFlQRSA9PSBEV0FSRjJfREVCVUcpCiAgICBkZWZhdWx0X2RlYnVnX2hvb2tzID0gJmR3YXJmMl9kZWJ1Z19ob29rczsKI2VuZGlmCiNpZmRlZiBWTVNfREVCVUdHSU5HX0lORk8KICBlbHNlIGlmIChQUkVGRVJSRURfREVCVUdHSU5HX1RZUEUgPT0gVk1TX0RFQlVHCgkgICB8fCBQUkVGRVJSRURfREVCVUdHSU5HX1RZUEUgPT0gVk1TX0FORF9EV0FSRjJfREVCVUcpCiAgICBkZWZhdWx0X2RlYnVnX2hvb2tzID0gJnZtc2RiZ19kZWJ1Z19ob29rczsKI2VuZGlmCgogIGlmICh3cml0ZV9zeW1ib2xzID09IE5PX0RFQlVHKQogICAgOwojaWYgZGVmaW5lZChEQlhfREVCVUdHSU5HX0lORk8pCiAgZWxzZSBpZiAod3JpdGVfc3ltYm9scyA9PSBEQlhfREVCVUcpCiAgICBkZWJ1Z19ob29rcyA9ICZkYnhfZGVidWdfaG9va3M7CiNlbmRpZgojaWYgZGVmaW5lZChYQ09GRl9ERUJVR0dJTkdfSU5GTykKICBlbHNlIGlmICh3cml0ZV9zeW1ib2xzID09IFhDT0ZGX0RFQlVHKQogICAgZGVidWdfaG9va3MgPSAmeGNvZmZfZGVidWdfaG9va3M7CiNlbmRpZgojaWZkZWYgU0RCX0RFQlVHR0lOR19JTkZPCiAgZWxzZSBpZiAod3JpdGVfc3ltYm9scyA9PSBTREJfREVCVUcpCiAgICBkZWJ1Z19ob29rcyA9ICZzZGJfZGVidWdfaG9va3M7CiNlbmRpZgojaWZkZWYgRFdBUkYyX0RFQlVHR0lOR19JTkZPCiAgZWxzZSBpZiAod3JpdGVfc3ltYm9scyA9PSBEV0FSRjJfREVCVUcpCiAgICBkZWJ1Z19ob29rcyA9ICZkd2FyZjJfZGVidWdfaG9va3M7CiNlbmRpZgojaWZkZWYgVk1TX0RFQlVHR0lOR19JTkZPCiAgZWxzZSBpZiAod3JpdGVfc3ltYm9scyA9PSBWTVNfREVCVUcgfHwgd3JpdGVfc3ltYm9scyA9PSBWTVNfQU5EX0RXQVJGMl9ERUJVRykKICAgIGRlYnVnX2hvb2tzID0gJnZtc2RiZ19kZWJ1Z19ob29rczsKI2VuZGlmCiAgZWxzZQogICAgZXJyb3IgKCJ0YXJnZXQgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgdGhlIFwiJXNcIiBkZWJ1ZyBmb3JtYXQiLAoJICAgZGVidWdfdHlwZV9uYW1lc1t3cml0ZV9zeW1ib2xzXSk7CgogIC8qIE5vdyB3ZSBrbm93IHdoaWNoIGRlYnVnIG91dHB1dCB3aWxsIGJlIHVzZWQgc28gd2UgY2FuIHNldAogICAgIGZsYWdfdmFyX3RyYWNraW5nLCBmbGFnX3JlbmFtZV9yZWdpc3RlcnMgaWYgdGhlIHVzZXIgaGFzCiAgICAgbm90IHNwZWNpZmllZCB0aGVtLiAgKi8KICBpZiAoZGVidWdfaW5mb19sZXZlbCA8IERJTkZPX0xFVkVMX05PUk1BTAogICAgICB8fCBkZWJ1Z19ob29rcy0+dmFyX2xvY2F0aW9uID09IGRvX25vdGhpbmdfZGVidWdfaG9va3MudmFyX2xvY2F0aW9uKQogICAgewogICAgICBpZiAoZmxhZ192YXJfdHJhY2tpbmcgPT0gMQoJICB8fCBmbGFnX3Zhcl90cmFja2luZ191bmluaXQgPT0gMSkKICAgICAgICB7CgkgIGlmIChkZWJ1Z19pbmZvX2xldmVsIDwgRElORk9fTEVWRUxfTk9STUFMKQoJICAgIHdhcm5pbmcgKDAsICJ2YXJpYWJsZSB0cmFja2luZyByZXF1ZXN0ZWQsIGJ1dCB1c2VsZXNzIHVubGVzcyAiCgkJICAgICAicHJvZHVjaW5nIGRlYnVnIGluZm8iKTsKCSAgZWxzZQoJICAgIHdhcm5pbmcgKDAsICJ2YXJpYWJsZSB0cmFja2luZyByZXF1ZXN0ZWQsIGJ1dCBub3Qgc3VwcG9ydGVkICIKCQkgICAgICJieSB0aGlzIGRlYnVnIGZvcm1hdCIpOwoJfQogICAgICBmbGFnX3Zhcl90cmFja2luZyA9IDA7CiAgICAgIGZsYWdfdmFyX3RyYWNraW5nX3VuaW5pdCA9IDA7CiAgICB9CgogIGlmIChmbGFnX3JlbmFtZV9yZWdpc3RlcnMgPT0gQVVUT0RFVEVDVF9WQUxVRSkKICAgIGZsYWdfcmVuYW1lX3JlZ2lzdGVycyA9IGRlZmF1bHRfZGVidWdfaG9va3MtPnZhcl9sb2NhdGlvbgoJICAgIAkJICAgICE9IGRvX25vdGhpbmdfZGVidWdfaG9va3MudmFyX2xvY2F0aW9uOwoKICBpZiAoZmxhZ192YXJfdHJhY2tpbmcgPT0gQVVUT0RFVEVDVF9WQUxVRSkKICAgIGZsYWdfdmFyX3RyYWNraW5nID0gb3B0aW1pemUgPj0gMTsKCiAgaWYgKGZsYWdfdHJlZV9jc2VsaW0gPT0gQVVUT0RFVEVDVF9WQUxVRSkKI2lmZGVmIEhBVkVfY29uZGl0aW9uYWxfbW92ZQogICAgZmxhZ190cmVlX2NzZWxpbSA9IDE7CiNlbHNlCiAgICBmbGFnX3RyZWVfY3NlbGltID0gMDsKI2VuZGlmCgogIC8qIElmIHRoZSB1c2VyIHNwZWNpZmljYWxseSByZXF1ZXN0ZWQgdmFyaWFibGUgdHJhY2tpbmcgd2l0aCB0YWdnaW5nCiAgICAgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIHdlIG5lZWQgdG8gdHVybiBvbiB2YXJpYWJsZSB0cmFja2luZy4KICAgICAoV2UgYWxyZWFkeSBkZXRlcm1pbmVkIGFib3ZlIHRoYXQgdmFyaWFibGUgdHJhY2tpbmcgaXMgZmVhc2libGUuKSAgKi8KICBpZiAoZmxhZ192YXJfdHJhY2tpbmdfdW5pbml0KQogICAgZmxhZ192YXJfdHJhY2tpbmcgPSAxOwoKICAvKiBJZiBhdXhpbGlhcnkgaW5mbyBnZW5lcmF0aW9uIGlzIGRlc2lyZWQsIG9wZW4gdGhlIG91dHB1dCBmaWxlLgogICAgIFRoaXMgZ29lcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIHNvdXJjZSBmaWxlLS11bmxpa2UKICAgICBhbGwgdGhlIG90aGVyIG91dHB1dCBmaWxlcy4gICovCiAgaWYgKGZsYWdfZ2VuX2F1eF9pbmZvKQogICAgewogICAgICBhdXhfaW5mb19maWxlID0gZm9wZW4gKGF1eF9pbmZvX2ZpbGVfbmFtZSwgInciKTsKICAgICAgaWYgKGF1eF9pbmZvX2ZpbGUgPT0gMCkKCWZhdGFsX2Vycm9yICgiY2FuJSd0IG9wZW4gJXM6ICVtIiwgYXV4X2luZm9fZmlsZV9uYW1lKTsKICAgIH0KCiAgaWYgKCEgdGFyZ2V0bS5oYXZlX25hbWVkX3NlY3Rpb25zKQogICAgewogICAgICBpZiAoZmxhZ19mdW5jdGlvbl9zZWN0aW9ucykKCXsKCSAgd2FybmluZyAoMCwgIi1mZnVuY3Rpb24tc2VjdGlvbnMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB0YXJnZXQiKTsKCSAgZmxhZ19mdW5jdGlvbl9zZWN0aW9ucyA9IDA7Cgl9CiAgICAgIGlmIChmbGFnX2RhdGFfc2VjdGlvbnMpCgl7CgkgIHdhcm5pbmcgKDAsICItZmRhdGEtc2VjdGlvbnMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB0YXJnZXQiKTsKCSAgZmxhZ19kYXRhX3NlY3Rpb25zID0gMDsKCX0KICAgIH0KCiAgaWYgKGZsYWdfZnVuY3Rpb25fc2VjdGlvbnMgJiYgcHJvZmlsZV9mbGFnKQogICAgewogICAgICB3YXJuaW5nICgwLCAiLWZmdW5jdGlvbi1zZWN0aW9ucyBkaXNhYmxlZDsgaXQgbWFrZXMgcHJvZmlsaW5nIGltcG9zc2libGUiKTsKICAgICAgZmxhZ19mdW5jdGlvbl9zZWN0aW9ucyA9IDA7CiAgICB9CgojaWZuZGVmIEhBVkVfcHJlZmV0Y2gKICBpZiAoZmxhZ19wcmVmZXRjaF9sb29wX2FycmF5cykKICAgIHsKICAgICAgd2FybmluZyAoMCwgIi1mcHJlZmV0Y2gtbG9vcC1hcnJheXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB0YXJnZXQiKTsKICAgICAgZmxhZ19wcmVmZXRjaF9sb29wX2FycmF5cyA9IDA7CiAgICB9CiNlbHNlCiAgaWYgKGZsYWdfcHJlZmV0Y2hfbG9vcF9hcnJheXMgJiYgIUhBVkVfcHJlZmV0Y2gpCiAgICB7CiAgICAgIHdhcm5pbmcgKDAsICItZnByZWZldGNoLWxvb3AtYXJyYXlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgdGFyZ2V0ICh0cnkgLW1hcmNoIHN3aXRjaGVzKSIpOwogICAgICBmbGFnX3ByZWZldGNoX2xvb3BfYXJyYXlzID0gMDsKICAgIH0KI2VuZGlmCgogIC8qIFRoaXMgY29tYmluYXRpb24gb2Ygb3B0aW9ucyBpc24ndCBoYW5kbGVkIGZvciBpMzg2IHRhcmdldHMgYW5kIGRvZXNuJ3QKICAgICBtYWtlIG11Y2ggc2Vuc2UgYW55d2F5LCBzbyBkb24ndCBhbGxvdyBpdC4gICovCiAgaWYgKGZsYWdfcHJlZmV0Y2hfbG9vcF9hcnJheXMgJiYgb3B0aW1pemVfc2l6ZSkKICAgIHsKICAgICAgd2FybmluZyAoMCwgIi1mcHJlZmV0Y2gtbG9vcC1hcnJheXMgaXMgbm90IHN1cHBvcnRlZCB3aXRoIC1PcyIpOwogICAgICBmbGFnX3ByZWZldGNoX2xvb3BfYXJyYXlzID0gMDsKICAgIH0KCiAgLyogVGhlIHByZXNlbmNlIG9mIElFRUUgc2lnbmFsaW5nIE5hTnMsIGltcGxpZXMgYWxsIG1hdGggY2FuIHRyYXAuICAqLwogIGlmIChmbGFnX3NpZ25hbGluZ19uYW5zKQogICAgZmxhZ190cmFwcGluZ19tYXRoID0gMTsKCiAgLyogV2UgY2Fubm90IHJlYXNzb2NpYXRlIGlmIHdlIHdhbnQgdHJhcHMgb3Igc2lnbmVkIHplcm9zLiCgKi8KICBpZiAoZmxhZ19hc3NvY2lhdGl2ZV9tYXRoICYmIChmbGFnX3RyYXBwaW5nX21hdGggfHwgZmxhZ19zaWduZWRfemVyb3MpKQogICAgewogICAgICB3YXJuaW5nICgwLCAiLWZhc3NvY2lhdGl2ZS1tYXRoIGRpc2FibGVkOyBvdGhlciBvcHRpb25zIHRha2UgcHJlY2VkZW5jZSIpOwogICAgICBmbGFnX2Fzc29jaWF0aXZlX21hdGggPSAwOwogICAgfQoKICAvKiBXaXRoIC1mY3gtbGltaXRlZC1yYW5nZSwgd2UgZG8gY2hlYXAgYW5kIHF1aWNrIGNvbXBsZXggYXJpdGhtZXRpYy4gICovCiAgaWYgKGZsYWdfY3hfbGltaXRlZF9yYW5nZSkKICAgIGZsYWdfY29tcGxleF9tZXRob2QgPSAwOwoKICAvKiBXaXRoIC1mY3gtZm9ydHJhbi1ydWxlcywgd2UgZG8gc29tZXRoaW5nIGluLWJldHdlZW4gY2hlYXAgYW5kIEM5OS4gICovCiAgaWYgKGZsYWdfY3hfZm9ydHJhbl9ydWxlcykKICAgIGZsYWdfY29tcGxleF9tZXRob2QgPSAxOwoKICAvKiBUYXJnZXRzIG11c3QgYmUgYWJsZSB0byBwbGFjZSBzcGlsbCBzbG90cyBhdCBsb3dlciBhZGRyZXNzZXMuICBJZiB0aGUKICAgICB0YXJnZXQgYWxyZWFkeSB1c2VzIGEgc29mdCBmcmFtZSBwb2ludGVyLCB0aGUgdHJhbnNpdGlvbiBpcyB0cml2aWFsLiAgKi8KICBpZiAoIUZSQU1FX0dST1dTX0RPV05XQVJEICYmIGZsYWdfc3RhY2tfcHJvdGVjdCkKICAgIHsKICAgICAgd2FybmluZyAoMCwgIi1mc3RhY2stcHJvdGVjdG9yIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgdGFyZ2V0Iik7CiAgICAgIGZsYWdfc3RhY2tfcHJvdGVjdCA9IDA7CiAgICB9CiAgaWYgKCFmbGFnX3N0YWNrX3Byb3RlY3QpCiAgICB3YXJuX3N0YWNrX3Byb3RlY3QgPSAwOwoKICAvKiA/Pz8gVW53aW5kIGluZm8gaXMgbm90IGNvcnJlY3QgYXJvdW5kIHRoZSBDRkcgdW5sZXNzIGVpdGhlciBhIGZyYW1lCiAgICAgcG9pbnRlciBpcyBwcmVzZW50IG9yIEFfT19BIGlzIHNldC4gIEZpeGluZyB0aGlzIHJlcXVpcmVzIHJld3JpdGluZwogICAgIHVud2luZCBpbmZvIGdlbmVyYXRpb24gdG8gYmUgYXdhcmUgb2YgdGhlIENGRyBhbmQgcHJvcGFnYXRpbmcgc3RhdGVzCiAgICAgYXJvdW5kIGVkZ2VzLiAgKi8KICBpZiAoZmxhZ191bndpbmRfdGFibGVzICYmICFBQ0NVTVVMQVRFX09VVEdPSU5HX0FSR1MKICAgICAgJiYgZmxhZ19vbWl0X2ZyYW1lX3BvaW50ZXIpCiAgICB7CiAgICAgIHdhcm5pbmcgKDAsICJ1bndpbmQgdGFibGVzIGN1cnJlbnRseSByZXF1aXJlIGEgZnJhbWUgcG9pbnRlciAiCgkgICAgICAgImZvciBjb3JyZWN0bmVzcyIpOwogICAgICBmbGFnX29taXRfZnJhbWVfcG9pbnRlciA9IDA7CiAgICB9Cn0KCi8qIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byByZWluaXRpYWxpemUgdGhlIGNvbXBpbGVyCiAgIGJhY2sgZW5kIHdoZW4gcmVnaXN0ZXIgY2xhc3NlcyBvciBpbnN0cnVjdGlvbiBzZXRzIGhhdmUgY2hhbmdlZCwKICAgYmVmb3JlIGVhY2ggZnVuY3Rpb24uICAqLwpzdGF0aWMgdm9pZApiYWNrZW5kX2luaXRfdGFyZ2V0ICh2b2lkKQp7CiAgLyogSW5pdGlhbGl6ZSBhbGlnbm1lbnQgdmFyaWFibGVzLiAgKi8KICBpbml0X2FsaWdubWVudHMgKCk7CgogIC8qIFRoaXMgcmVpbml0aWFsaXplcyBoYXJkX2ZyYW1lX3BvaW50ZXIsIGFuZCBjYWxscyBpbml0X3JlZ19tb2Rlc190YXJnZXQoKQogICAgIHRvIGluaXRpYWxpemUgcmVnX3Jhd19tb2RlW10uICAqLwogIGluaXRfZW1pdF9yZWdzICgpOwoKICAvKiBUaGlzIGludm9rZXMgdGFyZ2V0IGhvb2tzIHRvIHNldCBmaXhlZF9yZWdbXSBldGMsIHdoaWNoIGlzCiAgICAgbW9kZS1kZXBlbmRlbnQuICAqLwogIGluaXRfcmVncyAoKTsKCiAgLyogVGhpcyBkZXBlbmRzIG9uIHN0YWNrX3BvaW50ZXJfcnR4LiAgKi8KICBpbml0X2Zha2Vfc3RhY2tfbWVtcyAoKTsKCiAgLyogU2V0cyBzdGF0aWNfYmFzZV92YWx1ZVtIQVJEX0ZSQU1FX1BPSU5URVJfUkVHTlVNXSwgd2hpY2ggaXMKICAgICBtb2RlLWRlcGVuZGVudC4gICovCiAgaW5pdF9hbGlhc190YXJnZXQgKCk7CgogIC8qIERlcGVuZHMgb24gSEFSRF9GUkFNRV9QT0lOVEVSX1JFR05VTS4gICovCiAgaW5pdF9yZWxvYWQgKCk7CgogIC8qIFRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIG5lZWQgdG8gZ2VuZXJhdGUgcnRsLCBzbwogICAgIHByb3ZpZGUgYSBkdW1teSBmdW5jdGlvbiBjb250ZXh0IGZvciB0aGVtLiAgKi8KICBpbml0X2R1bW15X2Z1bmN0aW9uX3N0YXJ0ICgpOwoKICAvKiBydHhfY29zdCBpcyBtb2RlLWRlcGVuZGVudCwgc28gY2FjaGVkIHZhbHVlcyBuZWVkIHRvIGJlIHJlY29tcHV0ZWQKICAgICBvbiBhIG1vZGUgY2hhbmdlLiAgKi8KICBpbml0X2V4cG1lZCAoKTsKCiAgLyogV2UgbWF5IG5lZWQgdG8gcmVjb21wdXRlIHJlZ25vX3NhdmVfY29kZVtdIGFuZCByZWdub19yZXN0b3JlX2NvZGVbXQogICAgIGFmdGVyIGEgbW9kZSBjaGFuZ2UgYXMgd2VsbC4gICovCiAgY2FsbGVyX3NhdmVfaW5pdGlhbGl6ZWRfcCA9IGZhbHNlOwoKICBleHBhbmRfZHVtbXlfZnVuY3Rpb25fZW5kICgpOwp9CgovKiBJbml0aWFsaXplIHRoZSBjb21waWxlciBiYWNrIGVuZC4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgb25jZSwKICAgd2hlbiBzdGFydGluZyB0aGUgY29tcGlsZXIuICAqLwpzdGF0aWMgdm9pZApiYWNrZW5kX2luaXQgKHZvaWQpCnsKICBpbml0X2VtaXRfb25jZSAoZGVidWdfaW5mb19sZXZlbCA9PSBESU5GT19MRVZFTF9OT1JNQUwKCQkgIHx8IGRlYnVnX2luZm9fbGV2ZWwgPT0gRElORk9fTEVWRUxfVkVSQk9TRQojaWZkZWYgVk1TX0RFQlVHR0lOR19JTkZPCgkJICAgIC8qIEVuYWJsZSBsaW5lIG51bWJlciBpbmZvIGZvciB0cmFjZWJhY2suICAqLwoJCSAgICB8fCBkZWJ1Z19pbmZvX2xldmVsID4gRElORk9fTEVWRUxfTk9ORQojZW5kaWYKCQkgICAgfHwgZmxhZ190ZXN0X2NvdmVyYWdlKTsKCiAgaW5pdF9ydGxhbmFsICgpOwogIGluaXRfaW5saW5lX29uY2UgKCk7CiAgaW5pdF92YXJhc21fb25jZSAoKTsKICBzYXZlX3JlZ2lzdGVyX2luZm8gKCk7CgogIC8qIEluaXRpYWxpemUgdGhlIHRhcmdldC1zcGVjaWZpYyBiYWNrIGVuZCBwaWVjZXMuICAqLwogIGlyYV9pbml0X29uY2UgKCk7CiAgYmFja2VuZF9pbml0X3RhcmdldCAoKTsKfQoKLyogSW5pdGlhbGl6ZSB0aGluZ3MgdGhhdCBhcmUgYm90aCBsYW5nLWRlcGVuZGVudCBhbmQgdGFyZ2V0LWRlcGVuZGVudC4KICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGlmIHRhcmdldCBwYXJhbWV0ZXJzIGNoYW5nZS4gICovCnN0YXRpYyB2b2lkCmxhbmdfZGVwZW5kZW50X2luaXRfdGFyZ2V0ICh2b2lkKQp7CiAgLyogVGhpcyBjcmVhdGVzIHZhcmlvdXMgX0RFQ0wgbm9kZXMsIHNvIG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciB0aGUKICAgICBmcm9udCBlbmQgaXMgaW5pdGlhbGl6ZWQuICBJdCBhbHNvIGRlcGVuZHMgb24gdGhlIEhBVkVfeHh4IG1hY3JvcwogICAgIGdlbmVyYXRlZCBmcm9tIHRoZSB0YXJnZXQgbWFjaGluZSBkZXNjcmlwdGlvbi4gICovCiAgaW5pdF9vcHRhYnMgKCk7CgogIC8qIFRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIG5lZWQgdG8gZ2VuZXJhdGUgcnRsLCBzbwogICAgIHByb3ZpZGUgYSBkdW1teSBmdW5jdGlvbiBjb250ZXh0IGZvciB0aGVtLiAgKi8KICBpbml0X2R1bW15X2Z1bmN0aW9uX3N0YXJ0ICgpOwoKICAvKiBEbyB0aGUgdGFyZ2V0LXNwZWNpZmljIHBhcnRzIG9mIGV4cHIgaW5pdGlhbGl6YXRpb24uICAqLwogIGluaXRfZXhwcl90YXJnZXQgKCk7CgogIC8qIEFsdGhvdWdoIHRoZSBhY3Rpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQsCiAgICAgdGhleSB1c2Ugb3B0YWJzLCBzbyB3ZSBjYW5ub3QgY2FsbCB0aGVtIGZyb20gYmFja2VuZF9pbml0LiAgKi8KICBpbml0X3NldF9jb3N0cyAoKTsKICBpcmFfaW5pdCAoKTsKCiAgZXhwYW5kX2R1bW15X2Z1bmN0aW9uX2VuZCAoKTsKfQoKLyogTGFuZ3VhZ2UtZGVwZW5kZW50IGluaXRpYWxpemF0aW9uLiAgUmV0dXJucyBub256ZXJvIG9uIHN1Y2Nlc3MuICAqLwpzdGF0aWMgaW50CmxhbmdfZGVwZW5kZW50X2luaXQgKGNvbnN0IGNoYXIgKm5hbWUpCnsKICBsb2NhdGlvbl90IHNhdmVfbG9jID0gaW5wdXRfbG9jYXRpb247CiAgaWYgKGR1bXBfYmFzZV9uYW1lID09IDApCiAgICBkdW1wX2Jhc2VfbmFtZSA9IG5hbWUgJiYgbmFtZVswXSA/IG5hbWUgOiAiZ2NjZHVtcCI7CgogIC8qIE90aGVyIGZyb250LWVuZCBpbml0aWFsaXphdGlvbi4gICovCiAgaW5wdXRfbG9jYXRpb24gPSBCVUlMVElOU19MT0NBVElPTjsKICBpZiAobGFuZ19ob29rcy5pbml0ICgpID09IDApCiAgICByZXR1cm4gMDsKICBpbnB1dF9sb2NhdGlvbiA9IHNhdmVfbG9jOwoKICBpbml0X2FzbV9vdXRwdXQgKG5hbWUpOwoKICAvKiBUaGlzIGNyZWF0ZXMgdmFyaW91cyBfREVDTCBub2Rlcywgc28gbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyIHRoZQogICAgIGZyb250IGVuZCBpcyBpbml0aWFsaXplZC4gICovCiAgaW5pdF9laCAoKTsKCiAgLyogRG8gdGhlIHRhcmdldC1zcGVjaWZpYyBwYXJ0cyBvZiB0aGUgaW5pdGlhbGl6YXRpb24uICAqLwogIGxhbmdfZGVwZW5kZW50X2luaXRfdGFyZ2V0ICgpOwoKICAvKiBJZiBkYnggc3ltYm9sIHRhYmxlIGRlc2lyZWQsIGluaXRpYWxpemUgd3JpdGluZyBpdCBhbmQgb3V0cHV0IHRoZQogICAgIHByZWRlZmluZWQgdHlwZXMuICAqLwogIHRpbWV2YXJfcHVzaCAoVFZfU1lNT1VUKTsKCiNpZiBkZWZpbmVkIERXQVJGMl9ERUJVR0dJTkdfSU5GTyB8fCBkZWZpbmVkIERXQVJGMl9VTldJTkRfSU5GTwogIGlmIChkd2FyZjJvdXRfZG9fZnJhbWUgKCkpCiAgICBkd2FyZjJvdXRfZnJhbWVfaW5pdCAoKTsKI2VuZGlmCgogIC8qIE5vdyB3ZSBoYXZlIHRoZSBjb3JyZWN0IG9yaWdpbmFsIGZpbGVuYW1lLCB3ZSBjYW4gaW5pdGlhbGl6ZQogICAgIGRlYnVnIG91dHB1dC4gICovCiAgKCpkZWJ1Z19ob29rcy0+aW5pdCkgKG5hbWUpOwoKICB0aW1ldmFyX3BvcCAoVFZfU1lNT1VUKTsKCiAgcmV0dXJuIDE7Cn0KCgovKiBSZWluaXRpYWxpemUgZXZlcnl0aGluZyB3aGVuIHRhcmdldCBwYXJhbWV0ZXJzLCBzdWNoIGFzIHJlZ2lzdGVyIHVzYWdlLAogICBoYXZlIGNoYW5nZWQuICAqLwp2b2lkCnRhcmdldF9yZWluaXQgKHZvaWQpCnsKICAvKiBSZWluaXRpYWxpemUgUlRMIGJhY2tlbmQuICAqLwogIGJhY2tlbmRfaW5pdF90YXJnZXQgKCk7CgogIC8qIFJlaW5pdGlhbGl6ZSBsYW5nLWRlcGVuZGVudCBwYXJ0cy4gICovCiAgbGFuZ19kZXBlbmRlbnRfaW5pdF90YXJnZXQgKCk7Cn0KCnZvaWQKZHVtcF9tZW1vcnlfcmVwb3J0IChib29sIGZpbmFsKQp7CiAgZ2djX3ByaW50X3N0YXRpc3RpY3MgKCk7CiAgc3RyaW5ncG9vbF9zdGF0aXN0aWNzICgpOwogIGR1bXBfdHJlZV9zdGF0aXN0aWNzICgpOwogIGR1bXBfZ2ltcGxlX3N0YXRpc3RpY3MgKCk7CiAgZHVtcF9ydHhfc3RhdGlzdGljcyAoKTsKICBkdW1wX3ZhcnJheV9zdGF0aXN0aWNzICgpOwogIGR1bXBfYWxsb2NfcG9vbF9zdGF0aXN0aWNzICgpOwogIGR1bXBfYml0bWFwX3N0YXRpc3RpY3MgKCk7CiAgZHVtcF92ZWNfbG9jX3N0YXRpc3RpY3MgKCk7CiAgZHVtcF9nZ2NfbG9jX3N0YXRpc3RpY3MgKGZpbmFsKTsKfQoKLyogQ2xlYW4gdXA6IGNsb3NlIG9wZW5lZCBmaWxlcywgZXRjLiAgKi8KCnN0YXRpYyB2b2lkCmZpbmFsaXplICh2b2lkKQp7CiAgLyogQ2xvc2UgdGhlIGR1bXAgZmlsZXMuICAqLwogIGlmIChmbGFnX2dlbl9hdXhfaW5mbykKICAgIHsKICAgICAgZmNsb3NlIChhdXhfaW5mb19maWxlKTsKICAgICAgaWYgKGVycm9yY291bnQpCgl1bmxpbmsgKGF1eF9pbmZvX2ZpbGVfbmFtZSk7CiAgICB9CgogIC8qIENsb3NlIG5vbi1kZWJ1Z2dpbmcgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4gIFRha2Ugc3BlY2lhbCBjYXJlIHRvIG5vdGUKICAgICB3aGV0aGVyIGZjbG9zZSByZXR1cm5zIGFuIGVycm9yLCBzaW5jZSB0aGUgcGFnZXMgbWlnaHQgc3RpbGwgYmUgb24gdGhlCiAgICAgYnVmZmVyIGNoYWluIHdoaWxlIHRoZSBmaWxlIGlzIG9wZW4uICAqLwoKICBpZiAoYXNtX291dF9maWxlKQogICAgewogICAgICBpZiAoZmVycm9yIChhc21fb3V0X2ZpbGUpICE9IDApCglmYXRhbF9lcnJvciAoImVycm9yIHdyaXRpbmcgdG8gJXM6ICVtIiwgYXNtX2ZpbGVfbmFtZSk7CiAgICAgIGlmIChmY2xvc2UgKGFzbV9vdXRfZmlsZSkgIT0gMCkKCWZhdGFsX2Vycm9yICgiZXJyb3IgY2xvc2luZyAlczogJW0iLCBhc21fZmlsZV9uYW1lKTsKICAgIH0KCiAgc3RhdGlzdGljc19maW5pICgpOwogIGZpbmlzaF9vcHRpbWl6YXRpb25fcGFzc2VzICgpOwoKICBpcmFfZmluaXNoX29uY2UgKCk7CgogIGlmIChtZW1fcmVwb3J0KQogICAgZHVtcF9tZW1vcnlfcmVwb3J0ICh0cnVlKTsKCiAgLyogTGFuZ3VhZ2Utc3BlY2lmaWMgZW5kIG9mIGNvbXBpbGF0aW9uIGFjdGlvbnMuICAqLwogIGxhbmdfaG9va3MuZmluaXNoICgpOwp9CgovKiBJbml0aWFsaXplIHRoZSBjb21waWxlciwgYW5kIGNvbXBpbGUgdGhlIGlucHV0IGZpbGUuICAqLwpzdGF0aWMgdm9pZApkb19jb21waWxlICh2b2lkKQp7CiAgLyogSW5pdGlhbGl6ZSB0aW1pbmcgZmlyc3QuICBUaGUgQyBmcm9udCBlbmRzIHJlYWQgdGhlIG1haW4gZmlsZSBpbgogICAgIHRoZSBwb3N0X29wdGlvbnMgaG9vaywgYW5kIEMrKyBkb2VzIGZpbGUgdGltaW5ncy4gICovCiAgaWYgKHRpbWVfcmVwb3J0IHx8ICFxdWlldF9mbGFnICB8fCBmbGFnX2RldGFpbGVkX3N0YXRpc3RpY3MpCiAgICB0aW1ldmFyX2luaXQgKCk7CiAgdGltZXZhcl9zdGFydCAoVFZfVE9UQUwpOwoKICBwcm9jZXNzX29wdGlvbnMgKCk7CgogIC8qIERvbid0IGRvIGFueSBtb3JlIGlmIGFuIGVycm9yIGhhcyBhbHJlYWR5IG9jY3VycmVkLiAgKi8KICBpZiAoIWVycm9yY291bnQpCiAgICB7CiAgICAgIC8qIFRoaXMgbXVzdCBiZSBydW4gYWx3YXlzLCBiZWNhdXNlIGl0IGlzIG5lZWRlZCB0byBjb21wdXRlIHRoZSBGUAoJIHByZWRlZmluZWQgbWFjcm9zLCBzdWNoIGFzIF9fTERCTF9NQVhfXywgZm9yIHRhcmdldHMgdXNpbmcgbm9uCgkgZGVmYXVsdCBGUCBmb3JtYXRzLiAgKi8KICAgICAgaW5pdF9hZGp1c3RfbWFjaGluZV9tb2RlcyAoKTsKCiAgICAgIC8qIFNldCB1cCB0aGUgYmFjay1lbmQgaWYgcmVxdWVzdGVkLiAgKi8KICAgICAgaWYgKCFub19iYWNrZW5kKQoJYmFja2VuZF9pbml0ICgpOwoKICAgICAgLyogTGFuZ3VhZ2UtZGVwZW5kZW50IGluaXRpYWxpemF0aW9uLiAgUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuICAqLwogICAgICBpZiAobGFuZ19kZXBlbmRlbnRfaW5pdCAobWFpbl9pbnB1dF9maWxlbmFtZSkpCgljb21waWxlX2ZpbGUgKCk7CgogICAgICBmaW5hbGl6ZSAoKTsKICAgIH0KCiAgLyogU3RvcCB0aW1pbmcgYW5kIHByaW50IHRoZSB0aW1lcy4gICovCiAgdGltZXZhcl9zdG9wIChUVl9UT1RBTCk7CiAgdGltZXZhcl9wcmludCAoc3RkZXJyKTsKfQoKLyogRW50cnkgcG9pbnQgb2YgY2MxLCBjYzFwbHVzLCBqYzEsIGY3NzEsIGV0Yy4KICAgRXhpdCBjb2RlIGlzIEZBVEFMX0VYSVRfQ09ERSBpZiBjYW4ndCBvcGVuIGZpbGVzIG9yIGlmIHRoZXJlIHdlcmUKICAgYW55IGVycm9ycywgb3IgU1VDQ0VTU19FWElUX0NPREUgaWYgY29tcGlsYXRpb24gc3VjY2VlZGVkLgoKICAgSXQgaXMgbm90IHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG1vcmUgdGhhbiBvbmNlLiAgKi8KCmludAp0b3BsZXZfbWFpbiAodW5zaWduZWQgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQp7CiAgc2F2ZV9hcmd2ID0gYXJndjsKCiAgLyogSW5pdGlhbGl6YXRpb24gb2YgR0NDJ3MgZW52aXJvbm1lbnQsIGFuZCBkaWFnbm9zdGljcy4gICovCiAgZ2VuZXJhbF9pbml0IChhcmd2WzBdKTsKCiAgLyogUGFyc2UgdGhlIG9wdGlvbnMgYW5kIGRvIG1pbmltYWwgcHJvY2Vzc2luZzsgYmFzaWNhbGx5IGp1c3QKICAgICBlbm91Z2ggdG8gZGVmYXVsdCBmbGFncyBhcHByb3ByaWF0ZWx5LiAgKi8KICBkZWNvZGVfb3B0aW9ucyAoYXJnYywgYXJndik7CgogIGluaXRfbG9jYWxfdGljayAoKTsKCiAgLyogRXhpdCBlYXJseSBpZiB3ZSBjYW4gKGUuZy4gLWhlbHApLiAgKi8KICBpZiAoIWV4aXRfYWZ0ZXJfb3B0aW9ucykKICAgIGRvX2NvbXBpbGUgKCk7CgogIGlmICh3YXJuaW5nY291bnQgfHwgZXJyb3Jjb3VudCkgCiAgICBwcmludF9pZ25vcmVkX29wdGlvbnMgKCk7CgogIGlmIChlcnJvcmNvdW50IHx8IHNvcnJ5Y291bnQpCiAgICByZXR1cm4gKEZBVEFMX0VYSVRfQ09ERSk7CgogIHJldHVybiAoU1VDQ0VTU19FWElUX0NPREUpOwp9Cg==