LyoKICogU2VydmVyLXNpZGUgc29ja2V0IG1hbmFnZW1lbnQKICoKICogQ29weXJpZ2h0IChDKSAxOTk5IE1hcmN1cyBNZWlzc25lciwgT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKgogKiBGSVhNRTogd2UgdXNlIHJlYWR8d3JpdGUgYWNjZXNzIGluIGFsbCBjYXNlcy4gU2hvdWxkbid0IHdlIGRlcGVuZCB0aGF0CiAqIG9uIHRoZSBhY2Nlc3Mgb2YgdGhlIGN1cnJlbnQgaGFuZGxlPwogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2lmZGVmIEhBVkVfU1lTX0VSUk5PX0gKIyBpbmNsdWRlIDxzeXMvZXJybm8uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAojIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19GSUxJT19ICiMgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CiNlbmRpZgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSAibnRzdGF0dXMuaCIKI2RlZmluZSBXSU4zMl9OT19TVEFUVVMKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2ludGVybmwuaCIKCiNpbmNsdWRlICJwcm9jZXNzLmgiCiNpbmNsdWRlICJmaWxlLmgiCiNpbmNsdWRlICJoYW5kbGUuaCIKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAicmVxdWVzdC5oIgojaW5jbHVkZSAidXNlci5oIgoKLyogVG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIFVuaXggc29ja2V0IGhlYWRlcnMuIFBsdXMgd2Ugb25seSBuZWVkIGEgZmV3CiAqIG1hY3JvcyBhbnl3YXkuCiAqLwojZGVmaW5lIFVTRV9XU19QUkVGSVgKI2luY2x1ZGUgIndpbnNvY2syLmgiCgpzdHJ1Y3Qgc29jawp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICAgICAgIG9iajsgICAgICAgICAvKiBvYmplY3QgaGVhZGVyICovCiAgICBzdHJ1Y3QgZmQgICAgICAgICAgKmZkOyAgICAgICAgICAvKiBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHN0YXRlOyAgICAgICAvKiBzdGF0dXMgYml0cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBtYXNrOyAgICAgICAgLyogZXZlbnQgbWFzayAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBobWFzazsgICAgICAgLyogaGVsZCAoYmxvY2tlZCkgZXZlbnRzICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHBtYXNrOyAgICAgICAvKiBwZW5kaW5nIGV2ZW50cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBmbGFnczsgICAgICAgLyogc29ja2V0IGZsYWdzICovCiAgICBpbnQgICAgICAgICAgICAgICAgIHBvbGxpbmc7ICAgICAvKiBpcyBzb2NrZXQgYmVpbmcgcG9sbGVkPyAqLwogICAgdW5zaWduZWQgc2hvcnQgICAgICB0eXBlOyAgICAgICAgLyogc29ja2V0IHR5cGUgKi8KICAgIHVuc2lnbmVkIHNob3J0ICAgICAgZmFtaWx5OyAgICAgIC8qIHNvY2tldCBmYW1pbHkgKi8KICAgIHN0cnVjdCBldmVudCAgICAgICAqZXZlbnQ7ICAgICAgIC8qIGV2ZW50IG9iamVjdCAqLwogICAgdXNlcl9oYW5kbGVfdCAgICAgICB3aW5kb3c7ICAgICAgLyogd2luZG93IHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8gKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgbWVzc2FnZTsgICAgIC8qIG1lc3NhZ2UgdG8gc2VuZCAqLwogICAgb2JqX2hhbmRsZV90ICAgICAgICB3cGFyYW07ICAgICAgLyogbWVzc2FnZSB3cGFyYW0gKHNvY2tldCBoYW5kbGUpICovCiAgICBpbnQgICAgICAgICAgICAgICAgIGVycm9yc1tGRF9NQVhfRVZFTlRTXTsgLyogZXZlbnQgZXJyb3JzICovCiAgICBzdHJ1Y3Qgc29jayAgICAgICAgKmRlZmVycmVkOyAgICAvKiBzb2NrZXQgdGhhdCB3YWl0cyBmb3IgYSBkZWZlcnJlZCBhY2NlcHQgKi8KICAgIHN0cnVjdCBsaXN0ICAgICAgICAgcmVhZF9xOyAgICAgIC8qIHF1ZXVlIGZvciBhc3luY2hyb25vdXMgcmVhZHMgKi8KICAgIHN0cnVjdCBsaXN0ICAgICAgICAgd3JpdGVfcTsgICAgIC8qIHF1ZXVlIGZvciBhc3luY2hyb25vdXMgd3JpdGVzICovCn07CgpzdGF0aWMgdm9pZCBzb2NrX2R1bXAoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKTsKc3RhdGljIGludCBzb2NrX3NpZ25hbGVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApOwpzdGF0aWMgc3RydWN0IGZkICpzb2NrX2dldF9mZCggc3RydWN0IG9iamVjdCAqb2JqICk7CnN0YXRpYyB1bnNpZ25lZCBpbnQgc29ja19tYXBfYWNjZXNzKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHVuc2lnbmVkIGludCBhY2Nlc3MgKTsKc3RhdGljIHZvaWQgc29ja19kZXN0cm95KCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKCnN0YXRpYyBpbnQgc29ja19nZXRfcG9sbF9ldmVudHMoIHN0cnVjdCBmZCAqZmQgKTsKc3RhdGljIHZvaWQgc29ja19wb2xsX2V2ZW50KCBzdHJ1Y3QgZmQgKmZkLCBpbnQgZXZlbnQgKTsKc3RhdGljIGVudW0gc2VydmVyX2ZkX3R5cGUgc29ja19nZXRfaW5mbyggc3RydWN0IGZkICpmZCwgaW50ICpmbGFncyApOwpzdGF0aWMgdm9pZCBzb2NrX3F1ZXVlX2FzeW5jKCBzdHJ1Y3QgZmQgKmZkLCBjb25zdCBhc3luY19kYXRhX3QgKmRhdGEsIGludCB0eXBlLCBpbnQgY291bnQgKTsKc3RhdGljIHZvaWQgc29ja19jYW5jZWxfYXN5bmMoIHN0cnVjdCBmZCAqZmQgKTsKCnN0YXRpYyBpbnQgc29ja19nZXRfZXJyb3IoIGludCBlcnIgKTsKc3RhdGljIHZvaWQgc29ja19zZXRfZXJyb3Iodm9pZCk7CgpzdGF0aWMgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgc29ja19vcHMgPQp7CiAgICBzaXplb2Yoc3RydWN0IHNvY2spLCAgICAgICAgICAvKiBzaXplICovCiAgICBzb2NrX2R1bXAsICAgICAgICAgICAgICAgICAgICAvKiBkdW1wICovCiAgICBhZGRfcXVldWUsICAgICAgICAgICAgICAgICAgICAvKiBhZGRfcXVldWUgKi8KICAgIHJlbW92ZV9xdWV1ZSwgICAgICAgICAgICAgICAgIC8qIHJlbW92ZV9xdWV1ZSAqLwogICAgc29ja19zaWduYWxlZCwgICAgICAgICAgICAgICAgLyogc2lnbmFsZWQgKi8KICAgIG5vX3NhdGlzZmllZCwgICAgICAgICAgICAgICAgIC8qIHNhdGlzZmllZCAqLwogICAgbm9fc2lnbmFsLCAgICAgICAgICAgICAgICAgICAgLyogc2lnbmFsICovCiAgICBzb2NrX2dldF9mZCwgICAgICAgICAgICAgICAgICAvKiBnZXRfZmQgKi8KICAgIHNvY2tfbWFwX2FjY2VzcywgICAgICAgICAgICAgIC8qIG1hcF9hY2Nlc3MgKi8KICAgIG5vX2xvb2t1cF9uYW1lLCAgICAgICAgICAgICAgIC8qIGxvb2t1cF9uYW1lICovCiAgICBub19vcGVuX2ZpbGUsICAgICAgICAgICAgICAgICAvKiBvcGVuX2ZpbGUgKi8KICAgIGZkX2Nsb3NlX2hhbmRsZSwgICAgICAgICAgICAgIC8qIGNsb3NlX2hhbmRsZSAqLwogICAgc29ja19kZXN0cm95ICAgICAgICAgICAgICAgICAgLyogZGVzdHJveSAqLwp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBmZF9vcHMgc29ja19mZF9vcHMgPQp7CiAgICBzb2NrX2dldF9wb2xsX2V2ZW50cywgICAgICAgICAvKiBnZXRfcG9sbF9ldmVudHMgKi8KICAgIHNvY2tfcG9sbF9ldmVudCwgICAgICAgICAgICAgIC8qIHBvbGxfZXZlbnQgKi8KICAgIG5vX2ZsdXNoLCAgICAgICAgICAgICAgICAgICAgIC8qIGZsdXNoICovCiAgICBzb2NrX2dldF9pbmZvLCAgICAgICAgICAgICAgICAvKiBnZXRfZmlsZV9pbmZvICovCiAgICBzb2NrX3F1ZXVlX2FzeW5jLCAgICAgICAgICAgICAvKiBxdWV1ZV9hc3luYyAqLwogICAgc29ja19jYW5jZWxfYXN5bmMgICAgICAgICAgICAgLyogY2FuY2VsX2FzeW5jICovCn07CgoKLyogUGVybXV0YXRpb24gb2YgMC4uRkRfTUFYX0VWRU5UUyAtIDEgcmVwcmVzZW50aW5nIHRoZSBvcmRlciBpbiB3aGljaAogKiB3ZSBwb3N0IG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBldmVudHMuICBVc2VkIHRvIHNlbmQKICogbWVzc2FnZXMuICBUaGUgcHJvYmxlbSBpcyBpZiB0aGVyZSBpcyBib3RoIGEgRkRfQ09OTkVDVCBldmVudCBhbmQsCiAqIHNheSwgYW4gRkRfUkVBRCBldmVudCBhdmFpbGFibGUgb24gdGhlIHNhbWUgc29ja2V0LCB3ZSB3YW50IHRvCiAqIG5vdGlmeSB0aGUgYXBwIG9mIHRoZSBjb25uZWN0IGV2ZW50IGZpcnN0LiAgT3RoZXJ3aXNlIGl0IG1heQogKiBkaXNjYXJkIHRoZSByZWFkIGV2ZW50IGJlY2F1c2UgaXQgdGhpbmtzIGl0IGhhc24ndCBjb25uZWN0ZWQgeWV0LgogKi8Kc3RhdGljIGNvbnN0IGludCBldmVudF9iaXRvcmRlcltGRF9NQVhfRVZFTlRTXSA9CnsKICAgIEZEX0NPTk5FQ1RfQklULAogICAgRkRfQUNDRVBUX0JJVCwKICAgIEZEX09PQl9CSVQsCiAgICBGRF9XUklURV9CSVQsCiAgICBGRF9SRUFEX0JJVCwKICAgIEZEX0NMT1NFX0JJVCwKICAgIDYsIDcsIDgsIDkgIC8qIGxlZnRvdmVycyAqLwp9OwoKLyogRmxhZ3MgdGhhdCBtYWtlIHNlbnNlIG9ubHkgZm9yIFNPQ0tfU1RSRUFNIHNvY2tldHMgKi8KI2RlZmluZSBTVFJFQU1fRkxBR19NQVNLICgodW5zaWduZWQgaW50KSAoRkRfQ09OTkVDVCB8IEZEX0FDQ0VQVCB8IEZEX1dJTkVfTElTVEVOSU5HIHwgRkRfV0lORV9DT05ORUNURUQpKQoKdHlwZWRlZiBlbnVtIHsKICAgIFNPQ0tfU0hVVERPV05fRVJST1IgPSAtMSwKICAgIFNPQ0tfU0hVVERPV05fRU9GID0gMCwKICAgIFNPQ0tfU0hVVERPV05fUE9MTEhVUCA9IDEKfSBzb2NrX3NodXRkb3duX3Q7CgpzdGF0aWMgc29ja19zaHV0ZG93bl90IHNvY2tfc2h1dGRvd25fdHlwZSA9IFNPQ0tfU0hVVERPV05fRVJST1I7CgpzdGF0aWMgc29ja19zaHV0ZG93bl90IHNvY2tfY2hlY2tfcG9sbGh1cCh2b2lkKQp7CiAgICBzb2NrX3NodXRkb3duX3QgcmV0ID0gU09DS19TSFVURE9XTl9FUlJPUjsKICAgIGludCBmZFsyXSwgbjsKICAgIHN0cnVjdCBwb2xsZmQgcGZkOwogICAgY2hhciBkdW1teTsKCiAgICBpZiAoIHNvY2tldHBhaXIoIEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBmZCApICkgZ290byBvdXQ7CiAgICBpZiAoIHNodXRkb3duKCBmZFswXSwgMSApICkgZ290byBvdXQ7CgogICAgcGZkLmZkID0gZmRbMV07CiAgICBwZmQuZXZlbnRzID0gUE9MTElOOwogICAgcGZkLnJldmVudHMgPSAwOwoKICAgIG4gPSBwb2xsKCAmcGZkLCAxLCAwICk7CiAgICBpZiAoIG4gIT0gMSApIGdvdG8gb3V0OyAvKiBlcnJvciBvciB0aW1lb3V0ICovCiAgICBpZiAoIHBmZC5yZXZlbnRzICYgUE9MTEhVUCApCiAgICAgICAgcmV0ID0gU09DS19TSFVURE9XTl9QT0xMSFVQOwogICAgZWxzZSBpZiAoIHBmZC5yZXZlbnRzICYgUE9MTElOICYmCiAgICAgICAgICAgICAgcmVhZCggZmRbMV0sICZkdW1teSwgMSApID09IDAgKQogICAgICAgIHJldCA9IFNPQ0tfU0hVVERPV05fRU9GOwoKb3V0OgogICAgY2xvc2UoIGZkWzBdICk7CiAgICBjbG9zZSggZmRbMV0gKTsKICAgIHJldHVybiByZXQ7Cn0KCnZvaWQgc29ja19pbml0KHZvaWQpCnsKICAgIHNvY2tfc2h1dGRvd25fdHlwZSA9IHNvY2tfY2hlY2tfcG9sbGh1cCgpOwoKICAgIHN3aXRjaCAoIHNvY2tfc2h1dGRvd25fdHlwZSApCiAgICB7CiAgICBjYXNlIFNPQ0tfU0hVVERPV05fRU9GOgogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50Ziggc3RkZXJyLCAic29ja19pbml0OiBzaHV0ZG93bigpIGNhdXNlcyBFT0ZcbiIgKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgU09DS19TSFVURE9XTl9QT0xMSFVQOgogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50Ziggc3RkZXJyLCAic29ja19pbml0OiBzaHV0ZG93bigpIGNhdXNlcyBQT0xMSFVQXG4iICk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGZwcmludGYoIHN0ZGVyciwgInNvY2tfaW5pdDogRVJST1IgaW4gc29ja19jaGVja19wb2xsaHVwKClcbiIgKTsKICAgICAgICBzb2NrX3NodXRkb3duX3R5cGUgPSBTT0NLX1NIVVRET1dOX0VPRjsKICAgIH0KfQoKc3RhdGljIGludCBzb2NrX3Jlc2VsZWN0KCBzdHJ1Y3Qgc29jayAqc29jayApCnsKICAgIGludCBldiA9IHNvY2tfZ2V0X3BvbGxfZXZlbnRzKCBzb2NrLT5mZCApOwoKICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICBmcHJpbnRmKHN0ZGVyciwic29ja19yZXNlbGVjdCglcCk6IG5ldyBtYXNrICV4XG4iLCBzb2NrLCBldik7CgogICAgaWYgKCFzb2NrLT5wb2xsaW5nKSAgLyogRklYTUU6IHNob3VsZCBmaW5kIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzICovCiAgICB7CiAgICAgICAgLyogcHJldmlvdXNseSB1bmNvbm5lY3RlZCBzb2NrZXQsIGlzIHRoaXMgcmVzZWxlY3Qgc3VwcG9zZWQgdG8gY29ubmVjdCBpdD8gKi8KICAgICAgICBpZiAoIShzb2NrLT5zdGF0ZSAmIH5GRF9XSU5FX05PTkJMT0NLSU5HKSkgcmV0dXJuIDA7CiAgICAgICAgLyogb2ssIGl0IGlzLCBhdHRhY2ggaXQgdG8gdGhlIHdpbmVzZXJ2ZXIncyBtYWluIHBvbGwgbG9vcCAqLwogICAgICAgIHNvY2stPnBvbGxpbmcgPSAxOwogICAgfQogICAgLyogdXBkYXRlIGNvbmRpdGlvbiBtYXNrICovCiAgICBzZXRfZmRfZXZlbnRzKCBzb2NrLT5mZCwgZXYgKTsKICAgIHJldHVybiBldjsKfQoKLyogQWZ0ZXIgUE9MTEhVUCBpcyByZWNlaXZlZCwgdGhlIHNvY2tldCB3aWxsIG5vIGxvbmdlciBiZSBpbiB0aGUgbWFpbiBzZWxlY3QgbG9vcC4KICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNpZ25hbCBwZW5kaW5nIGV2ZW50cyBuZXZlcnRoZWxlc3MgKi8Kc3RhdGljIHZvaWQgc29ja190cnlfZXZlbnQoIHN0cnVjdCBzb2NrICpzb2NrLCBpbnQgZXZlbnQgKQp7CiAgICBldmVudCA9IGNoZWNrX2ZkX2V2ZW50cyggc29jay0+ZmQsIGV2ZW50ICk7CiAgICBpZiAoZXZlbnQpCiAgICB7CiAgICAgICAgaWYgKCBkZWJ1Z19sZXZlbCApIGZwcmludGYoIHN0ZGVyciwgInNvY2tfdHJ5X2V2ZW50OiAleFxuIiwgZXZlbnQgKTsKICAgICAgICBzb2NrX3BvbGxfZXZlbnQoIHNvY2stPmZkLCBldmVudCApOwogICAgfQp9CgovKiB3YWtlIGFueWJvZHkgd2FpdGluZyBvbiB0aGUgc29ja2V0IGV2ZW50IG9yIHNlbmQgdGhlIGFzc29jaWF0ZWQgbWVzc2FnZSAqLwpzdGF0aWMgdm9pZCBzb2NrX3dha2VfdXAoIHN0cnVjdCBzb2NrICpzb2NrLCBpbnQgcG9sbGV2ICkKewogICAgdW5zaWduZWQgaW50IGV2ZW50cyA9IHNvY2stPnBtYXNrICYgc29jay0+bWFzazsKICAgIGludCBpOwogICAgaW50IGFzeW5jX2FjdGl2ZSA9IDA7CgogICAgaWYgKCBzb2NrLT5mbGFncyAmIFdTQV9GTEFHX09WRVJMQVBQRUQgKQogICAgewogICAgICAgIGlmICggcG9sbGV2ICYgKFBPTExJTnxQT0xMUFJJKSAmJiAhbGlzdF9lbXB0eSggJnNvY2stPnJlYWRfcSApKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmKCBzdGRlcnIsICJhY3RpdmF0aW5nIHJlYWQgcXVldWUgZm9yIHNvY2tldCAlcFxuIiwgc29jayApOwogICAgICAgICAgICBhc3luY190ZXJtaW5hdGVfaGVhZCggJnNvY2stPnJlYWRfcSwgU1RBVFVTX0FMRVJURUQgKTsKICAgICAgICAgICAgYXN5bmNfYWN0aXZlID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCBwb2xsZXYgJiBQT0xMT1VUICYmICFsaXN0X2VtcHR5KCAmc29jay0+d3JpdGVfcSApKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmKCBzdGRlcnIsICJhY3RpdmF0aW5nIHdyaXRlIHF1ZXVlIGZvciBzb2NrZXQgJXBcbiIsIHNvY2sgKTsKICAgICAgICAgICAgYXN5bmNfdGVybWluYXRlX2hlYWQoICZzb2NrLT53cml0ZV9xLCBTVEFUVVNfQUxFUlRFRCApOwogICAgICAgICAgICBhc3luY19hY3RpdmUgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBEbyBub3Qgc2lnbmFsIGV2ZW50cyBpZiB0aGVyZSBhcmUgc3RpbGwgcGVuZGluZyBhc3luY2hyb25vdXMgSU8gcmVxdWVzdHMgKi8KICAgIC8qIFdlIG5lZWQgdGhpcyB0byBkZWxheSBGRF9DTE9TRSBldmVudHMgdW50aWwgYWxsIHBlbmRpbmcgb3ZlcmxhcHBlZCByZXF1ZXN0cyBhcmUgcHJvY2Vzc2VkICovCiAgICBpZiAoICFldmVudHMgfHwgYXN5bmNfYWN0aXZlICkgcmV0dXJuOwoKICAgIGlmIChzb2NrLT5ldmVudCkKICAgIHsKICAgICAgICBpZiAoZGVidWdfbGV2ZWwpIGZwcmludGYoc3RkZXJyLCAic2lnbmFsbGluZyBldmVudHMgJXggcHRyICVwXG4iLCBldmVudHMsIHNvY2stPmV2ZW50ICk7CiAgICAgICAgc2V0X2V2ZW50KCBzb2NrLT5ldmVudCApOwogICAgfQogICAgaWYgKHNvY2stPndpbmRvdykKICAgIHsKICAgICAgICBpZiAoZGVidWdfbGV2ZWwpIGZwcmludGYoc3RkZXJyLCAic2lnbmFsbGluZyBldmVudHMgJXggd2luICVwXG4iLCBldmVudHMsIHNvY2stPndpbmRvdyApOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRF9NQVhfRVZFTlRTOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpbnQgZXZlbnQgPSBldmVudF9iaXRvcmRlcltpXTsKICAgICAgICAgICAgaWYgKHNvY2stPnBtYXNrICYgKDEgPDwgZXZlbnQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbHBhcmFtID0gKDEgPDwgZXZlbnQpIHwgKHNvY2stPmVycm9yc1tldmVudF0gPDwgMTYpOwogICAgICAgICAgICAgICAgcG9zdF9tZXNzYWdlKCBzb2NrLT53aW5kb3csIHNvY2stPm1lc3NhZ2UsICh1bnNpZ25lZCBsb25nKXNvY2stPndwYXJhbSwgbHBhcmFtICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc29jay0+cG1hc2sgPSAwOwogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIH0KfQoKc3RhdGljIGlubGluZSBpbnQgc29ja19lcnJvciggc3RydWN0IGZkICpmZCApCnsKICAgIHVuc2lnbmVkIGludCBvcHR2YWwgPSAwLCBvcHRsZW47CgogICAgb3B0bGVuID0gc2l6ZW9mKG9wdHZhbCk7CiAgICBnZXRzb2Nrb3B0KCBnZXRfdW5peF9mZChmZCksIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAodm9pZCAqKSAmb3B0dmFsLCAmb3B0bGVuKTsKICAgIHJldHVybiBvcHR2YWwgPyBzb2NrX2dldF9lcnJvcihvcHR2YWwpIDogMDsKfQoKc3RhdGljIHZvaWQgc29ja19wb2xsX2V2ZW50KCBzdHJ1Y3QgZmQgKmZkLCBpbnQgZXZlbnQgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IGdldF9mZF91c2VyKCBmZCApOwogICAgaW50IGhhbmd1cF9zZWVuID0gMDsKCiAgICBhc3NlcnQoIHNvY2stPm9iai5vcHMgPT0gJnNvY2tfb3BzICk7CiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgc2VsZWN0IGV2ZW50OiAleFxuIiwgc29jaywgZXZlbnQpOwogICAgaWYgKHNvY2stPnN0YXRlICYgRkRfQ09OTkVDVCkKICAgIHsKICAgICAgICAvKiBjb25uZWN0aW5nICovCiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTE9VVCkKICAgICAgICB7CiAgICAgICAgICAgIC8qIHdlIGdvdCBjb25uZWN0ZWQgKi8KICAgICAgICAgICAgc29jay0+c3RhdGUgfD0gRkRfV0lORV9DT05ORUNURUR8RkRfUkVBRHxGRF9XUklURTsKICAgICAgICAgICAgc29jay0+c3RhdGUgJj0gfkZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9DT05ORUNUX0JJVF0gPSAwOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBjb25uZWN0aW9uIHN1Y2Nlc3NcbiIsIHNvY2spOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChldmVudCAmIChQT0xMRVJSfFBPTExIVVApKQogICAgICAgIHsKICAgICAgICAgICAgLyogd2UgZGlkbid0IGdldCBjb25uZWN0ZWQ/ICovCiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5GRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ09OTkVDVF9CSVRdID0gc29ja19lcnJvciggZmQgKTsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgY29ubmVjdGlvbiBmYWlsdXJlXG4iLCBzb2NrKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChzb2NrLT5zdGF0ZSAmIEZEX1dJTkVfTElTVEVOSU5HKQogICAgewogICAgICAgIC8qIGxpc3RlbmluZyAqLwogICAgICAgIGlmIChldmVudCAmIFBPTExJTikKICAgICAgICB7CiAgICAgICAgICAgIC8qIGluY29taW5nIGNvbm5lY3Rpb24gKi8KICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQUNDRVBUX0JJVF0gPSAwOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9BQ0NFUFQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGV2ZW50ICYgKFBPTExFUlJ8UE9MTEhVUCkpCiAgICAgICAgewogICAgICAgICAgICAvKiBmYWlsZWQgaW5jb21pbmcgY29ubmVjdGlvbj8gKi8KICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQUNDRVBUX0JJVF0gPSBzb2NrX2Vycm9yKCBmZCApOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9BQ0NFUFQ7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8qIG5vcm1hbCBkYXRhIGZsb3cgKi8KICAgICAgICBpZiAoIHNvY2stPnR5cGUgPT0gU09DS19TVFJFQU0gJiYgKCBldmVudCAmIFBPTExJTiApICkKICAgICAgICB7CiAgICAgICAgICAgIGNoYXIgZHVtbXk7CiAgICAgICAgICAgIGludCBucjsKCiAgICAgICAgICAgIC8qIExpbnV4IDIuNCBkb2Vzbid0IHJlcG9ydCBQT0xMSFVQIGlmIG9ubHkgb25lIHNpZGUgb2YgdGhlIHNvY2tldAogICAgICAgICAgICAgKiBoYXMgYmVlbiBjbG9zZWQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGl0IGV4cGxpY2l0bHkgaGVyZSAqLwogICAgICAgICAgICBuciAgPSByZWN2KCBnZXRfdW5peF9mZCggZmQgKSwgJmR1bW15LCAxLCBNU0dfUEVFSyApOwogICAgICAgICAgICBpZiAoIG5yID4gMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGluY29taW5nIGRhdGEgKi8KICAgICAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1JFQUQ7CiAgICAgICAgICAgICAgICBzb2NrLT5obWFzayB8PSAoRkRfUkVBRHxGRF9DTE9TRSk7CiAgICAgICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfUkVBRF9CSVRdID0gMDsKICAgICAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBpcyByZWFkYWJsZVxuIiwgc29jayApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBuciA9PSAwICkKICAgICAgICAgICAgICAgIGhhbmd1cF9zZWVuID0gMTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBFQUdBSU4gY2FuIGhhcHBlbiBpZiBhbiBhc3luYyByZWN2KCkgZmFsbHMgYmV0d2VlbiB0aGUgc2VydmVyJ3MgcG9sbCgpCiAgICAgICAgICAgICAgICAgICBjYWxsIGFuZCB0aGUgaW52b2NhdGlvbiBvZiB0aGlzIHJvdXRpbmUgKi8KICAgICAgICAgICAgICAgIGlmICggZXJybm8gPT0gRUFHQUlOICkKICAgICAgICAgICAgICAgICAgICBldmVudCAmPSB+UE9MTElOOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICggZGVidWdfbGV2ZWwgKQogICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJyZWN2IGVycm9yIG9uIHNvY2tldCAlcDogJWRcbiIsIHNvY2ssIGVycm5vICk7CiAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBQT0xMRVJSOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBlbHNlIGlmICggc29ja19zaHV0ZG93bl90eXBlID09IFNPQ0tfU0hVVERPV05fUE9MTEhVUCAmJiAoZXZlbnQgJiBQT0xMSFVQKSApCiAgICAgICAgewogICAgICAgICAgICBoYW5ndXBfc2VlbiA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCBldmVudCAmIFBPTExJTiApIC8qIFBPTExJTiBmb3Igbm9uLXN0cmVhbSBzb2NrZXQgKi8KICAgICAgICB7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1JFQUQ7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IChGRF9SRUFEfEZEX0NMT1NFKTsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX1JFQURfQklUXSA9IDA7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVwIGlzIHJlYWRhYmxlXG4iLCBzb2NrICk7CgogICAgICAgIH0KCiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTE9VVCkKICAgICAgICB7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1dSSVRFOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9XUklURTsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX1dSSVRFX0JJVF0gPSAwOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBpcyB3cml0YWJsZVxuIiwgc29jayk7CiAgICAgICAgfQogICAgICAgIGlmIChldmVudCAmIFBPTExQUkkpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9PT0I7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX09PQjsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX09PQl9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgZ290IE9PQiBkYXRhXG4iLCBzb2NrKTsKICAgICAgICB9CiAgICAgICAgLyogQWNjb3JkaW5nIHRvIFdTMiBzcGVjcywgRkRfQ0xPU0UgaXMgb25seSBkZWxpdmVyZWQgd2hlbiB0aGVyZSBpcwogICAgICAgICAgIG5vIG1vcmUgZGF0YSB0byBiZSByZWFkIChpLmUuIGhhbmd1cF9zZWVuID0gMSkgKi8KICAgICAgICBlbHNlIGlmICggaGFuZ3VwX3NlZW4gJiYgKHNvY2stPnN0YXRlICYgKEZEX1JFQUR8RkRfV1JJVEUpICkpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ0xPU0VfQklUXSA9IHNvY2tfZXJyb3IoIGZkICk7CiAgICAgICAgICAgIGlmICggKGV2ZW50ICYgUE9MTEVSUikgfHwgKCBzb2NrX3NodXRkb3duX3R5cGUgPT0gU09DS19TSFVURE9XTl9FT0YgJiYgKGV2ZW50ICYgUE9MTEhVUCkgKSkKICAgICAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5GRF9XUklURTsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQ0xPU0U7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX0NMT1NFOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBhYm9ydGVkIGJ5IGVycm9yICVkLCBldmVudDogJXggLSByZW1vdmluZyBmcm9tIHNlbGVjdCBsb29wXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBzb2NrLCBzb2NrLT5lcnJvcnNbRkRfQ0xPU0VfQklUXSwgZXZlbnQpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHNvY2stPnBtYXNrICYgRkRfQ0xPU0UgfHwgZXZlbnQgJiAoUE9MTEVSUnxQT0xMSFVQKSApCiAgICB7CiAgICAgICAgaWYgKCBkZWJ1Z19sZXZlbCApCiAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgInJlbW92aW5nIHNvY2tldCAlcCBmcm9tIHNlbGVjdCBsb29wXG4iLCBzb2NrICk7CiAgICAgICAgc2V0X2ZkX2V2ZW50cyggc29jay0+ZmQsIC0xICk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgc29ja19yZXNlbGVjdCggc29jayApOwoKICAgIC8qIHdha2UgdXAgYW55b25lIHdhaXRpbmcgZm9yIHdoYXRldmVyIGp1c3QgaGFwcGVuZWQgKi8KICAgIGlmICggc29jay0+cG1hc2sgJiBzb2NrLT5tYXNrIHx8IHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCApIHNvY2tfd2FrZV91cCggc29jaywgZXZlbnQgKTsKCiAgICAvKiBpZiBhbnlvbmUgaXMgc3R1cGlkIGVub3VnaCB0byB3YWl0IG9uIHRoZSBzb2NrZXQgb2JqZWN0IGl0c2VsZiwKICAgICAqIG1heWJlIHdlIHNob3VsZCB3YWtlIHRoZW0gdXAgdG9vLCBqdXN0IGluIGNhc2U/ICovCiAgICB3YWtlX3VwKCAmc29jay0+b2JqLCAwICk7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfZHVtcCggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgdmVyYm9zZSApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKICAgIHByaW50ZiggIlNvY2tldCBmZD0lcCwgc3RhdGU9JXgsIG1hc2s9JXgsIHBlbmRpbmc9JXgsIGhlbGQ9JXhcbiIsCiAgICAgICAgICAgIHNvY2stPmZkLCBzb2NrLT5zdGF0ZSwKICAgICAgICAgICAgc29jay0+bWFzaywgc29jay0+cG1hc2ssIHNvY2stPmhtYXNrICk7Cn0KCnN0YXRpYyBpbnQgc29ja19zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgcmV0dXJuIGNoZWNrX2ZkX2V2ZW50cyggc29jay0+ZmQsIHNvY2tfZ2V0X3BvbGxfZXZlbnRzKCBzb2NrLT5mZCApICkgIT0gMDsKfQoKc3RhdGljIHVuc2lnbmVkIGludCBzb2NrX21hcF9hY2Nlc3MoIHN0cnVjdCBvYmplY3QgKm9iaiwgdW5zaWduZWQgaW50IGFjY2VzcyApCnsKICAgIGlmIChhY2Nlc3MgJiBHRU5FUklDX1JFQUQpICAgIGFjY2VzcyB8PSBGSUxFX0dFTkVSSUNfUkVBRDsKICAgIGlmIChhY2Nlc3MgJiBHRU5FUklDX1dSSVRFKSAgIGFjY2VzcyB8PSBGSUxFX0dFTkVSSUNfV1JJVEU7CiAgICBpZiAoYWNjZXNzICYgR0VORVJJQ19FWEVDVVRFKSBhY2Nlc3MgfD0gRklMRV9HRU5FUklDX0VYRUNVVEU7CiAgICBpZiAoYWNjZXNzICYgR0VORVJJQ19BTEwpICAgICBhY2Nlc3MgfD0gRklMRV9BTExfQUNDRVNTOwogICAgcmV0dXJuIGFjY2VzcyAmIH4oR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSB8IEdFTkVSSUNfRVhFQ1VURSB8IEdFTkVSSUNfQUxMKTsKfQoKc3RhdGljIGludCBzb2NrX2dldF9wb2xsX2V2ZW50cyggc3RydWN0IGZkICpmZCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gZ2V0X2ZkX3VzZXIoIGZkICk7CiAgICB1bnNpZ25lZCBpbnQgbWFzayA9IHNvY2stPm1hc2sgJiBzb2NrLT5zdGF0ZSAmIH5zb2NrLT5obWFzazsKICAgIGludCBldiA9IDA7CgogICAgYXNzZXJ0KCBzb2NrLT5vYmoub3BzID09ICZzb2NrX29wcyApOwoKICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX0NPTk5FQ1QpCiAgICAgICAgLyogY29ubmVjdGluZywgd2FpdCBmb3Igd3JpdGFibGUgKi8KICAgICAgICByZXR1cm4gUE9MTE9VVDsKICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX1dJTkVfTElTVEVOSU5HKQogICAgICAgIC8qIGxpc3RlbmluZywgd2FpdCBmb3IgcmVhZGFibGUgKi8KICAgICAgICByZXR1cm4gKHNvY2stPmhtYXNrICYgRkRfQUNDRVBUKSA/IDAgOiBQT0xMSU47CgogICAgaWYgKG1hc2sgJiAoRkRfUkVBRCkgfHwgKHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCAmJiAhbGlzdF9lbXB0eSggJnNvY2stPnJlYWRfcSApKSkKICAgICAgICBldiB8PSBQT0xMSU4gfCBQT0xMUFJJOwogICAgaWYgKG1hc2sgJiBGRF9XUklURSB8fCAoc29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEICYmICFsaXN0X2VtcHR5KCAmc29jay0+d3JpdGVfcSApKSkKICAgICAgICBldiB8PSBQT0xMT1VUOwogICAgLyogV2UgdXNlIFBPTExJTiB3aXRoIDAgYnl0ZXMgcmVjdigpIGFzIEZEX0NMT1NFIGluZGljYXRpb24gZm9yIHN0cmVhbSBzb2NrZXRzLiAqLwogICAgaWYgKCBzb2NrLT50eXBlID09IFNPQ0tfU1RSRUFNICYmICggc29jay0+bWFzayAmIH5zb2NrLT5obWFzayAmIEZEX0NMT1NFKSApCiAgICAgICAgZXYgfD0gUE9MTElOOwoKICAgIHJldHVybiBldjsKfQoKc3RhdGljIGVudW0gc2VydmVyX2ZkX3R5cGUgc29ja19nZXRfaW5mbyggc3RydWN0IGZkICpmZCwgaW50ICpmbGFncyApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gZ2V0X2ZkX3VzZXIoIGZkICk7CiAgICBhc3NlcnQoIHNvY2stPm9iai5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgKmZsYWdzID0gRkRfRkxBR19BVkFJTEFCTEU7CiAgICBpZiAoc29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEKSAqZmxhZ3MgfD0gRkRfRkxBR19PVkVSTEFQUEVEOwogICAgaWYgKCBzb2NrLT50eXBlICE9IFNPQ0tfU1RSRUFNIHx8IHNvY2stPnN0YXRlICYgRkRfV0lORV9DT05ORUNURUQgKQogICAgewogICAgICAgIGlmICggIShzb2NrLT5zdGF0ZSAmIEZEX1JFQUQgICkgKSAqZmxhZ3MgfD0gRkRfRkxBR19SRUNWX1NIVVRET1dOOwogICAgICAgIGlmICggIShzb2NrLT5zdGF0ZSAmIEZEX1dSSVRFICkgKSAqZmxhZ3MgfD0gRkRfRkxBR19TRU5EX1NIVVRET1dOOwogICAgfQogICAgcmV0dXJuIEZEX1RZUEVfU09DS0VUOwp9CgpzdGF0aWMgdm9pZCBzb2NrX3F1ZXVlX2FzeW5jKCBzdHJ1Y3QgZmQgKmZkLCBjb25zdCBhc3luY19kYXRhX3QgKmRhdGEsIGludCB0eXBlLCBpbnQgY291bnQgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IGdldF9mZF91c2VyKCBmZCApOwogICAgc3RydWN0IGxpc3QgKnF1ZXVlOwogICAgaW50IHBvbGxldjsKCiAgICBhc3NlcnQoIHNvY2stPm9iai5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgaWYgKCAhKHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCkgKQogICAgewogICAgICAgIHNldF9lcnJvciggU1RBVFVTX0lOVkFMSURfSEFORExFICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHN3aXRjaCAodHlwZSkKICAgIHsKICAgIGNhc2UgQVNZTkNfVFlQRV9SRUFEOgogICAgICAgIHF1ZXVlID0gJnNvY2stPnJlYWRfcTsKICAgICAgICBzb2NrLT5obWFzayAmPSB+RkRfQ0xPU0U7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIEFTWU5DX1RZUEVfV1JJVEU6CiAgICAgICAgcXVldWUgPSAmc29jay0+d3JpdGVfcTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgc2V0X2Vycm9yKCBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAoICEoIHNvY2stPnN0YXRlICYgRkRfUkVBRCApICYmIHR5cGUgPT0gQVNZTkNfVFlQRV9SRUFEICApIHx8CiAgICAgICAgICggISggc29jay0+c3RhdGUgJiBGRF9XUklURSApICYmIHR5cGUgPT0gQVNZTkNfVFlQRV9XUklURSApICkKICAgIHsKICAgICAgICBzZXRfZXJyb3IoIFNUQVRVU19QSVBFX0RJU0NPTk5FQ1RFRCApOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmICghY3JlYXRlX2FzeW5jKCBjdXJyZW50LCBOVUxMLCBxdWV1ZSwgZGF0YSApKSByZXR1cm47CiAgICAgICAgc2V0X2Vycm9yKCBTVEFUVVNfUEVORElORyApOwogICAgfQoKICAgIHBvbGxldiA9IHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIGlmICggcG9sbGV2ICkgc29ja190cnlfZXZlbnQoIHNvY2ssIHBvbGxldiApOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2NhbmNlbF9hc3luYyggc3RydWN0IGZkICpmZCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gZ2V0X2ZkX3VzZXIoIGZkICk7CiAgICBhc3NlcnQoIHNvY2stPm9iai5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgYXN5bmNfdGVybWluYXRlX3F1ZXVlKCAmc29jay0+cmVhZF9xLCBTVEFUVVNfQ0FOQ0VMTEVEICk7CiAgICBhc3luY190ZXJtaW5hdGVfcXVldWUoICZzb2NrLT53cml0ZV9xLCBTVEFUVVNfQ0FOQ0VMTEVEICk7Cn0KCnN0YXRpYyBzdHJ1Y3QgZmQgKnNvY2tfZ2V0X2ZkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIHJldHVybiAoc3RydWN0IGZkICopZ3JhYl9vYmplY3QoIHNvY2stPmZkICk7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfZGVzdHJveSggc3RydWN0IG9iamVjdCAqb2JqICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICBhc3NlcnQoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwoKICAgIC8qIEZJWE1FOiBzcGVjaWFsIHNvY2tldCBzaHV0ZG93biBzdHVmZj8gKi8KCiAgICBpZiAoIHNvY2stPmRlZmVycmVkICkKICAgICAgICByZWxlYXNlX29iamVjdCggc29jay0+ZGVmZXJyZWQgKTsKCiAgICBpZiAoIHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCApCiAgICB7CiAgICAgICAgYXN5bmNfdGVybWluYXRlX3F1ZXVlKCAmc29jay0+cmVhZF9xLCBTVEFUVVNfQ0FOQ0VMTEVEICk7CiAgICAgICAgYXN5bmNfdGVybWluYXRlX3F1ZXVlKCAmc29jay0+d3JpdGVfcSwgU1RBVFVTX0NBTkNFTExFRCApOwogICAgfQogICAgaWYgKHNvY2stPmV2ZW50KSByZWxlYXNlX29iamVjdCggc29jay0+ZXZlbnQgKTsKICAgIGlmIChzb2NrLT5mZCkKICAgIHsKICAgICAgICAvKiBzaHV0IHRoZSBzb2NrZXQgZG93biB0byBmb3JjZSBwZW5kaW5nIHBvbGwoKSBjYWxscyBpbiB0aGUgY2xpZW50IHRvIHJldHVybiAqLwogICAgICAgIHNodXRkb3duKCBnZXRfdW5peF9mZChzb2NrLT5mZCksIFNIVVRfUkRXUiApOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrLT5mZCApOwogICAgfQp9CgovKiBjcmVhdGUgYSBuZXcgYW5kIHVuY29ubmVjdGVkIHNvY2tldCAqLwpzdGF0aWMgc3RydWN0IG9iamVjdCAqY3JlYXRlX3NvY2tldCggaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90b2NvbCwgdW5zaWduZWQgaW50IGZsYWdzICkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CiAgICBpbnQgc29ja2ZkOwoKICAgIHNvY2tmZCA9IHNvY2tldCggZmFtaWx5LCB0eXBlLCBwcm90b2NvbCApOwogICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgIGZwcmludGYoc3RkZXJyLCJzb2NrZXQoJWQsJWQsJWQpPSVkXG4iLGZhbWlseSx0eXBlLHByb3RvY29sLHNvY2tmZCk7CiAgICBpZiAoc29ja2ZkID09IC0xKQogICAgewogICAgICAgIHNvY2tfc2V0X2Vycm9yKCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBmY250bChzb2NrZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOyAvKiBtYWtlIHNvY2tldCBub25ibG9ja2luZyAqLwogICAgaWYgKCEoc29jayA9IGFsbG9jX29iamVjdCggJnNvY2tfb3BzICkpKQogICAgewogICAgICAgIGNsb3NlKCBzb2NrZmQgKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHNvY2stPnN0YXRlID0gKHR5cGUgIT0gU09DS19TVFJFQU0pID8gKEZEX1JFQUR8RkRfV1JJVEUpIDogMDsKICAgIHNvY2stPm1hc2sgICAgPSAwOwogICAgc29jay0+aG1hc2sgICA9IDA7CiAgICBzb2NrLT5wbWFzayAgID0gMDsKICAgIHNvY2stPnBvbGxpbmcgPSAwOwogICAgc29jay0+ZmxhZ3MgICA9IGZsYWdzOwogICAgc29jay0+dHlwZSAgICA9IHR5cGU7CiAgICBzb2NrLT5mYW1pbHkgID0gZmFtaWx5OwogICAgc29jay0+ZXZlbnQgICA9IE5VTEw7CiAgICBzb2NrLT53aW5kb3cgID0gMDsKICAgIHNvY2stPm1lc3NhZ2UgPSAwOwogICAgc29jay0+d3BhcmFtICA9IDA7CiAgICBzb2NrLT5kZWZlcnJlZCA9IE5VTEw7CiAgICBpZiAoIShzb2NrLT5mZCA9IGNyZWF0ZV9hbm9ueW1vdXNfZmQoICZzb2NrX2ZkX29wcywgc29ja2ZkLCAmc29jay0+b2JqICkpKQogICAgewogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBsaXN0X2luaXQoICZzb2NrLT5yZWFkX3EgKTsKICAgIGxpc3RfaW5pdCggJnNvY2stPndyaXRlX3EgKTsKICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIGNsZWFyX2Vycm9yKCk7CiAgICByZXR1cm4gJnNvY2stPm9iajsKfQoKLyogYWNjZXB0IGEgc29ja2V0IChjcmVhdGVzIGEgbmV3IGZkKSAqLwpzdGF0aWMgc3RydWN0IHNvY2sgKmFjY2VwdF9zb2NrZXQoIG9ial9oYW5kbGVfdCBoYW5kbGUgKQp7CiAgICBzdHJ1Y3Qgc29jayAqYWNjZXB0c29jazsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgaW50CWFjY2VwdGZkOwogICAgc3RydWN0IHNvY2thZGRyCXNhZGRyOwoKICAgIHNvY2sgPSAoc3RydWN0IHNvY2sgKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcywgaGFuZGxlLCBGSUxFX1JFQURfREFUQSwgJnNvY2tfb3BzICk7CiAgICBpZiAoIXNvY2spCiAgICAJcmV0dXJuIE5VTEw7CgogICAgaWYgKCBzb2NrLT5kZWZlcnJlZCApCiAgICB7CiAgICAgICAgYWNjZXB0c29jayA9IHNvY2stPmRlZmVycmVkOwogICAgICAgIHNvY2stPmRlZmVycmVkID0gTlVMTDsKICAgIH0KICAgIGVsc2UKICAgIHsKCiAgICAgICAgLyogVHJ5IHRvIGFjY2VwdCgyKS4gV2UgY2FuJ3QgYmUgc2FmZSB0aGF0IHRoaXMgYW4gYWxyZWFkeSBjb25uZWN0ZWQgc29ja2V0CiAgICAgICAgICogb3IgdGhhdCBhY2NlcHQoKSBpcyBhbGxvd2VkIG9uIGl0LiBJbiB0aG9zZSBjYXNlcyB3ZSB3aWxsIGdldCAtMS9lcnJubwogICAgICAgICAqIHJldHVybi4KICAgICAgICAgKi8KICAgICAgICB1bnNpZ25lZCBpbnQgc2xlbiA9IHNpemVvZihzYWRkcik7CiAgICAgICAgYWNjZXB0ZmQgPSBhY2NlcHQoIGdldF91bml4X2ZkKHNvY2stPmZkKSwgJnNhZGRyLCAmc2xlbik7CiAgICAgICAgaWYgKGFjY2VwdGZkPT0tMSkKICAgICAgICB7CiAgICAgICAgICAgIHNvY2tfc2V0X2Vycm9yKCk7CiAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBpZiAoIShhY2NlcHRzb2NrID0gYWxsb2Nfb2JqZWN0KCAmc29ja19vcHMgKSkpCiAgICAgICAgewogICAgICAgICAgICBjbG9zZSggYWNjZXB0ZmQgKTsKICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQoKICAgICAgICAvKiBuZXdseSBjcmVhdGVkIHNvY2tldCBnZXRzIHRoZSBzYW1lIHByb3BlcnRpZXMgb2YgdGhlIGxpc3RlbmluZyBzb2NrZXQgKi8KICAgICAgICBmY250bChhY2NlcHRmZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7IC8qIG1ha2Ugc29ja2V0IG5vbmJsb2NraW5nICovCiAgICAgICAgYWNjZXB0c29jay0+c3RhdGUgID0gRkRfV0lORV9DT05ORUNURUR8RkRfUkVBRHxGRF9XUklURTsKICAgICAgICBpZiAoc29jay0+c3RhdGUgJiBGRF9XSU5FX05PTkJMT0NLSU5HKQogICAgICAgICAgICBhY2NlcHRzb2NrLT5zdGF0ZSB8PSBGRF9XSU5FX05PTkJMT0NLSU5HOwogICAgICAgIGFjY2VwdHNvY2stPm1hc2sgICAgPSBzb2NrLT5tYXNrOwogICAgICAgIGFjY2VwdHNvY2stPmhtYXNrICAgPSAwOwogICAgICAgIGFjY2VwdHNvY2stPnBtYXNrICAgPSAwOwogICAgICAgIGFjY2VwdHNvY2stPnBvbGxpbmcgPSAwOwogICAgICAgIGFjY2VwdHNvY2stPnR5cGUgICAgPSBzb2NrLT50eXBlOwogICAgICAgIGFjY2VwdHNvY2stPmZhbWlseSAgPSBzb2NrLT5mYW1pbHk7CiAgICAgICAgYWNjZXB0c29jay0+ZXZlbnQgICA9IE5VTEw7CiAgICAgICAgYWNjZXB0c29jay0+d2luZG93ICA9IHNvY2stPndpbmRvdzsKICAgICAgICBhY2NlcHRzb2NrLT5tZXNzYWdlID0gc29jay0+bWVzc2FnZTsKICAgICAgICBhY2NlcHRzb2NrLT53cGFyYW0gID0gMDsKICAgICAgICBpZiAoc29jay0+ZXZlbnQpIGFjY2VwdHNvY2stPmV2ZW50ID0gKHN0cnVjdCBldmVudCAqKWdyYWJfb2JqZWN0KCBzb2NrLT5ldmVudCApOwogICAgICAgIGFjY2VwdHNvY2stPmZsYWdzID0gc29jay0+ZmxhZ3M7CiAgICAgICAgYWNjZXB0c29jay0+ZGVmZXJyZWQgPSBOVUxMOwogICAgICAgIGlmICghKGFjY2VwdHNvY2stPmZkID0gY3JlYXRlX2Fub255bW91c19mZCggJnNvY2tfZmRfb3BzLCBhY2NlcHRmZCwgJmFjY2VwdHNvY2stPm9iaiApKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBhY2NlcHRzb2NrICk7CiAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBsaXN0X2luaXQoICZhY2NlcHRzb2NrLT5yZWFkX3EgKTsKICAgICAgICBsaXN0X2luaXQoICZhY2NlcHRzb2NrLT53cml0ZV9xICk7CiAgICB9CiAgICBjbGVhcl9lcnJvcigpOwogICAgc29jay0+cG1hc2sgJj0gfkZEX0FDQ0VQVDsKICAgIHNvY2stPmhtYXNrICY9IH5GRF9BQ0NFUFQ7CiAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgcmV0dXJuIGFjY2VwdHNvY2s7Cn0KCi8qIHNldCB0aGUgbGFzdCBlcnJvciBkZXBlbmRpbmcgb24gZXJybm8gKi8Kc3RhdGljIGludCBzb2NrX2dldF9lcnJvciggaW50IGVyciApCnsKICAgIHN3aXRjaCAoZXJyKQogICAgewogICAgICAgIGNhc2UgRUlOVFI6ICAgICAgICAgICAgIHJldHVybiBXU0FFSU5UUjsKICAgICAgICBjYXNlIEVCQURGOiAgICAgICAgICAgICByZXR1cm4gV1NBRUJBREY7CiAgICAgICAgY2FzZSBFUEVSTToKICAgICAgICBjYXNlIEVBQ0NFUzogICAgICAgICAgICByZXR1cm4gV1NBRUFDQ0VTOwogICAgICAgIGNhc2UgRUZBVUxUOiAgICAgICAgICAgIHJldHVybiBXU0FFRkFVTFQ7CiAgICAgICAgY2FzZSBFSU5WQUw6ICAgICAgICAgICAgcmV0dXJuIFdTQUVJTlZBTDsKICAgICAgICBjYXNlIEVNRklMRTogICAgICAgICAgICByZXR1cm4gV1NBRU1GSUxFOwogICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6ICAgICAgIHJldHVybiBXU0FFV09VTERCTE9DSzsKICAgICAgICBjYXNlIEVJTlBST0dSRVNTOiAgICAgICByZXR1cm4gV1NBRUlOUFJPR1JFU1M7CiAgICAgICAgY2FzZSBFQUxSRUFEWTogICAgICAgICAgcmV0dXJuIFdTQUVBTFJFQURZOwogICAgICAgIGNhc2UgRU5PVFNPQ0s6ICAgICAgICAgIHJldHVybiBXU0FFTk9UU09DSzsKICAgICAgICBjYXNlIEVERVNUQUREUlJFUTogICAgICByZXR1cm4gV1NBRURFU1RBRERSUkVROwogICAgICAgIGNhc2UgRU1TR1NJWkU6ICAgICAgICAgIHJldHVybiBXU0FFTVNHU0laRTsKICAgICAgICBjYXNlIEVQUk9UT1RZUEU6ICAgICAgICByZXR1cm4gV1NBRVBST1RPVFlQRTsKICAgICAgICBjYXNlIEVOT1BST1RPT1BUOiAgICAgICByZXR1cm4gV1NBRU5PUFJPVE9PUFQ7CiAgICAgICAgY2FzZSBFUFJPVE9OT1NVUFBPUlQ6ICAgcmV0dXJuIFdTQUVQUk9UT05PU1VQUE9SVDsKICAgICAgICBjYXNlIEVTT0NLVE5PU1VQUE9SVDogICByZXR1cm4gV1NBRVNPQ0tUTk9TVVBQT1JUOwogICAgICAgIGNhc2UgRU9QTk9UU1VQUDogICAgICAgIHJldHVybiBXU0FFT1BOT1RTVVBQOwogICAgICAgIGNhc2UgRVBGTk9TVVBQT1JUOiAgICAgIHJldHVybiBXU0FFUEZOT1NVUFBPUlQ7CiAgICAgICAgY2FzZSBFQUZOT1NVUFBPUlQ6ICAgICAgcmV0dXJuIFdTQUVBRk5PU1VQUE9SVDsKICAgICAgICBjYXNlIEVBRERSSU5VU0U6ICAgICAgICByZXR1cm4gV1NBRUFERFJJTlVTRTsKICAgICAgICBjYXNlIEVBRERSTk9UQVZBSUw6ICAgICByZXR1cm4gV1NBRUFERFJOT1RBVkFJTDsKICAgICAgICBjYXNlIEVORVRET1dOOiAgICAgICAgICByZXR1cm4gV1NBRU5FVERPV047CiAgICAgICAgY2FzZSBFTkVUVU5SRUFDSDogICAgICAgcmV0dXJuIFdTQUVORVRVTlJFQUNIOwogICAgICAgIGNhc2UgRU5FVFJFU0VUOiAgICAgICAgIHJldHVybiBXU0FFTkVUUkVTRVQ7CiAgICAgICAgY2FzZSBFQ09OTkFCT1JURUQ6ICAgICAgcmV0dXJuIFdTQUVDT05OQUJPUlRFRDsKICAgICAgICBjYXNlIEVQSVBFOgogICAgICAgIGNhc2UgRUNPTk5SRVNFVDogICAgICAgIHJldHVybiBXU0FFQ09OTlJFU0VUOwogICAgICAgIGNhc2UgRU5PQlVGUzogICAgICAgICAgIHJldHVybiBXU0FFTk9CVUZTOwogICAgICAgIGNhc2UgRUlTQ09OTjogICAgICAgICAgIHJldHVybiBXU0FFSVNDT05OOwogICAgICAgIGNhc2UgRU5PVENPTk46ICAgICAgICAgIHJldHVybiBXU0FFTk9UQ09OTjsKICAgICAgICBjYXNlIEVTSFVURE9XTjogICAgICAgICByZXR1cm4gV1NBRVNIVVRET1dOOwogICAgICAgIGNhc2UgRVRPT01BTllSRUZTOiAgICAgIHJldHVybiBXU0FFVE9PTUFOWVJFRlM7CiAgICAgICAgY2FzZSBFVElNRURPVVQ6ICAgICAgICAgcmV0dXJuIFdTQUVUSU1FRE9VVDsKICAgICAgICBjYXNlIEVDT05OUkVGVVNFRDogICAgICByZXR1cm4gV1NBRUNPTk5SRUZVU0VEOwogICAgICAgIGNhc2UgRUxPT1A6ICAgICAgICAgICAgIHJldHVybiBXU0FFTE9PUDsKICAgICAgICBjYXNlIEVOQU1FVE9PTE9ORzogICAgICByZXR1cm4gV1NBRU5BTUVUT09MT05HOwogICAgICAgIGNhc2UgRUhPU1RET1dOOiAgICAgICAgIHJldHVybiBXU0FFSE9TVERPV047CiAgICAgICAgY2FzZSBFSE9TVFVOUkVBQ0g6ICAgICAgcmV0dXJuIFdTQUVIT1NUVU5SRUFDSDsKICAgICAgICBjYXNlIEVOT1RFTVBUWTogICAgICAgICByZXR1cm4gV1NBRU5PVEVNUFRZOwojaWZkZWYgRVBST0NMSU0KICAgICAgICBjYXNlIEVQUk9DTElNOiAgICAgICAgICByZXR1cm4gV1NBRVBST0NMSU07CiNlbmRpZgojaWZkZWYgRVVTRVJTCiAgICAgICAgY2FzZSBFVVNFUlM6ICAgICAgICAgICAgcmV0dXJuIFdTQUVVU0VSUzsKI2VuZGlmCiNpZmRlZiBFRFFVT1QKICAgICAgICBjYXNlIEVEUVVPVDogICAgICAgICAgICByZXR1cm4gV1NBRURRVU9UOwojZW5kaWYKI2lmZGVmIEVTVEFMRQogICAgICAgIGNhc2UgRVNUQUxFOiAgICAgICAgICAgIHJldHVybiBXU0FFU1RBTEU7CiNlbmRpZgojaWZkZWYgRVJFTU9URQogICAgICAgIGNhc2UgRVJFTU9URTogICAgICAgICAgIHJldHVybiBXU0FFUkVNT1RFOwojZW5kaWYKICAgIGRlZmF1bHQ6IGVycm5vPWVycjsgcGVycm9yKCJzb2NrX3NldF9lcnJvciIpOyByZXR1cm4gV1NBRUZBVUxUOwogICAgfQp9CgovKiBzZXQgdGhlIGxhc3QgZXJyb3IgZGVwZW5kaW5nIG9uIGVycm5vICovCnN0YXRpYyB2b2lkIHNvY2tfc2V0X2Vycm9yKHZvaWQpCnsKICAgIHNldF9lcnJvciggc29ja19nZXRfZXJyb3IoIGVycm5vICkgKTsKfQoKLyogY3JlYXRlIGEgc29ja2V0ICovCkRFQ0xfSEFORExFUihjcmVhdGVfc29ja2V0KQp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmo7CgogICAgcmVwbHktPmhhbmRsZSA9IDA7CiAgICBpZiAoKG9iaiA9IGNyZWF0ZV9zb2NrZXQoIHJlcS0+ZmFtaWx5LCByZXEtPnR5cGUsIHJlcS0+cHJvdG9jb2wsIHJlcS0+ZmxhZ3MgKSkgIT0gTlVMTCkKICAgIHsKICAgICAgICByZXBseS0+aGFuZGxlID0gYWxsb2NfaGFuZGxlKCBjdXJyZW50LT5wcm9jZXNzLCBvYmosIHJlcS0+YWNjZXNzLCByZXEtPmF0dHJpYnV0ZXMgKTsKICAgICAgICByZWxlYXNlX29iamVjdCggb2JqICk7CiAgICB9Cn0KCi8qIGFjY2VwdCBhIHNvY2tldCAqLwpERUNMX0hBTkRMRVIoYWNjZXB0X3NvY2tldCkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CgogICAgcmVwbHktPmhhbmRsZSA9IDA7CiAgICBpZiAoKHNvY2sgPSBhY2NlcHRfc29ja2V0KCByZXEtPmxoYW5kbGUgKSkgIT0gTlVMTCkKICAgIHsKICAgICAgICByZXBseS0+aGFuZGxlID0gYWxsb2NfaGFuZGxlKCBjdXJyZW50LT5wcm9jZXNzLCAmc29jay0+b2JqLCByZXEtPmFjY2VzcywgcmVxLT5hdHRyaWJ1dGVzICk7CiAgICAgICAgc29jay0+d3BhcmFtID0gcmVwbHktPmhhbmRsZTsgIC8qIHdwYXJhbSBmb3IgbWVzc2FnZSBpcyB0aGUgc29ja2V0IGhhbmRsZSAqLwogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgICAgICByZWxlYXNlX29iamVjdCggJnNvY2stPm9iaiApOwogICAgfQp9CgovKiBzZXQgc29ja2V0IGV2ZW50IHBhcmFtZXRlcnMgKi8KREVDTF9IQU5ETEVSKHNldF9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgc3RydWN0IGV2ZW50ICpvbGRfZXZlbnQ7CiAgICBpbnQgcG9sbGV2OwoKICAgIGlmICghKHNvY2sgPSAoc3RydWN0IHNvY2sgKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfV1JJVEVfQVRUUklCVVRFUywgJnNvY2tfb3BzKSkpIHJldHVybjsKICAgIG9sZF9ldmVudCA9IHNvY2stPmV2ZW50OwogICAgc29jay0+bWFzayAgICA9IHJlcS0+bWFzazsKICAgIHNvY2stPmhtYXNrICAgJj0gfnJlcS0+bWFzazsgLyogcmUtZW5hYmxlIGhlbGQgZXZlbnRzICovCiAgICBzb2NrLT5ldmVudCAgID0gTlVMTDsKICAgIHNvY2stPndpbmRvdyAgPSByZXEtPndpbmRvdzsKICAgIHNvY2stPm1lc3NhZ2UgPSByZXEtPm1zZzsKICAgIHNvY2stPndwYXJhbSAgPSByZXEtPmhhbmRsZTsgIC8qIHdwYXJhbSBpcyB0aGUgc29ja2V0IGhhbmRsZSAqLwogICAgaWYgKHJlcS0+ZXZlbnQpIHNvY2stPmV2ZW50ID0gZ2V0X2V2ZW50X29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5ldmVudCwgRVZFTlRfTU9ESUZZX1NUQVRFICk7CgogICAgaWYgKGRlYnVnX2xldmVsICYmIHNvY2stPmV2ZW50KSBmcHJpbnRmKHN0ZGVyciwgImV2ZW50IHB0cjogJXBcbiIsIHNvY2stPmV2ZW50KTsKCiAgICBwb2xsZXYgPSBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICBpZiAoIHBvbGxldiApIHNvY2tfdHJ5X2V2ZW50KCBzb2NrLCBwb2xsZXYgKTsKCiAgICBpZiAoc29jay0+bWFzaykKICAgICAgICBzb2NrLT5zdGF0ZSB8PSBGRF9XSU5FX05PTkJMT0NLSU5HOwoKICAgIC8qIGlmIGEgbmV0d29yayBldmVudCBpcyBwZW5kaW5nLCBzaWduYWwgdGhlIGV2ZW50IG9iamVjdAogICAgICAgaXQgaXMgcG9zc2libGUgdGhhdCBGRF9DT05ORUNUIG9yIEZEX0FDQ0VQVCBuZXR3b3JrIGV2ZW50cyBoYXMgaGFwcGVuZWQKICAgICAgIGJlZm9yZSBhIFdTQUV2ZW50U2VsZWN0KCkgd2FzIGRvbmUgb24gaXQuCiAgICAgICAod2hlbiBkZWFsaW5nIHdpdGggQXN5bmNocm9ub3VzIHNvY2tldCkgICovCiAgICBpZiAoc29jay0+cG1hc2sgJiBzb2NrLT5tYXNrKSBzb2NrX3dha2VfdXAoIHNvY2ssIHBvbGxldiApOwoKICAgIGlmIChvbGRfZXZlbnQpIHJlbGVhc2Vfb2JqZWN0KCBvbGRfZXZlbnQgKTsgLyogd2UncmUgdGhyb3VnaCB3aXRoIGl0ICovCiAgICByZWxlYXNlX29iamVjdCggJnNvY2stPm9iaiApOwp9CgovKiBnZXQgc29ja2V0IGV2ZW50IHBhcmFtZXRlcnMgKi8KREVDTF9IQU5ETEVSKGdldF9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwoKICAgIHNvY2sgPSAoc3RydWN0IHNvY2sgKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5oYW5kbGUsIEZJTEVfUkVBRF9BVFRSSUJVVEVTLCAmc29ja19vcHMgKTsKICAgIGlmICghc29jaykKICAgIHsKICAgICAgICByZXBseS0+bWFzayAgPSAwOwogICAgICAgIHJlcGx5LT5wbWFzayA9IDA7CiAgICAgICAgcmVwbHktPnN0YXRlID0gMDsKICAgICAgICBzZXRfZXJyb3IoIFdTQUVOT1RTT0NLICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcmVwbHktPm1hc2sgID0gc29jay0+bWFzazsKICAgIHJlcGx5LT5wbWFzayA9IHNvY2stPnBtYXNrOwogICAgcmVwbHktPnN0YXRlID0gc29jay0+c3RhdGU7CiAgICBzZXRfcmVwbHlfZGF0YSggc29jay0+ZXJyb3JzLCBtaW4oIGdldF9yZXBseV9tYXhfc2l6ZSgpLCBzaXplb2Yoc29jay0+ZXJyb3JzKSApKTsKCiAgICBpZiAocmVxLT5zZXJ2aWNlKQogICAgewogICAgICAgIGlmIChyZXEtPmNfZXZlbnQpCiAgICAgICAgewogICAgICAgICAgICBzdHJ1Y3QgZXZlbnQgKmNldmVudCA9IGdldF9ldmVudF9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+Y19ldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVkVOVF9NT0RJRllfU1RBVEUgKTsKICAgICAgICAgICAgaWYgKGNldmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzZXRfZXZlbnQoIGNldmVudCApOwogICAgICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIGNldmVudCApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNvY2stPnBtYXNrID0gMDsKICAgICAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICB9CiAgICByZWxlYXNlX29iamVjdCggJnNvY2stPm9iaiApOwp9CgovKiByZS1lbmFibGUgcGVuZGluZyBzb2NrZXQgZXZlbnRzICovCkRFQ0xfSEFORExFUihlbmFibGVfc29ja2V0X2V2ZW50KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIGludCBwb2xsZXY7CgogICAgaWYgKCEoc29jayA9IChzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+aGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfV1JJVEVfQVRUUklCVVRFUywgJnNvY2tfb3BzKSkpCiAgICAgICAgcmV0dXJuOwoKICAgIHNvY2stPnBtYXNrICY9IH5yZXEtPm1hc2s7IC8qIGlzIHRoaXMgc2FmZT8gKi8KICAgIHNvY2stPmhtYXNrICY9IH5yZXEtPm1hc2s7CiAgICBpZiAoIHJlcS0+bWFzayAmIEZEX1JFQUQgKQogICAgICAgIHNvY2stPmhtYXNrICY9IH5GRF9DTE9TRTsKICAgIHNvY2stPnN0YXRlIHw9IHJlcS0+c3N0YXRlOwogICAgc29jay0+c3RhdGUgJj0gfnJlcS0+Y3N0YXRlOwogICAgaWYgKCBzb2NrLT50eXBlICE9IFNPQ0tfU1RSRUFNICkgc29jay0+c3RhdGUgJj0gflNUUkVBTV9GTEFHX01BU0s7CgogICAgcG9sbGV2ID0gc29ja19yZXNlbGVjdCggc29jayApOwogICAgaWYgKCBwb2xsZXYgKSBzb2NrX3RyeV9ldmVudCggc29jaywgcG9sbGV2ICk7CgogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKREVDTF9IQU5ETEVSKHNldF9zb2NrZXRfZGVmZXJyZWQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrLCAqYWNjZXB0c29jazsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayAqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLCByZXEtPmhhbmRsZSwgRklMRV9XUklURV9BVFRSSUJVVEVTLCAmc29ja19vcHMgKTsKICAgIGlmICggIXNvY2sgKQogICAgewogICAgICAgIHNldF9lcnJvciggV1NBRU5PVFNPQ0sgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBhY2NlcHRzb2NrID0gKHN0cnVjdCBzb2NrICopZ2V0X2hhbmRsZV9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+ZGVmZXJyZWQsIDAsICZzb2NrX29wcyApOwogICAgaWYgKCAhYWNjZXB0c29jayApCiAgICB7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICBzZXRfZXJyb3IoIFdTQUVOT1RTT0NLICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgc29jay0+ZGVmZXJyZWQgPSBhY2NlcHRzb2NrOwogICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKfQo=