LyoKICoKICogQ29weXJpZ2h0IChDKSAyMDAwICBSb2JlcnQgT2xzc29uLgogKiBTd2VkaXNoIFVuaXZlcnNpdHkgb2YgQWdyaWN1bHR1cmFsIFNjaWVuY2VzCiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KICoKICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKICogbGF0ZXIgdmVyc2lvbi4KICoKICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKICogMDIxMTEtMTMwNywgVVNBLiAgCiAqLwoKLyogCiAqIFRoaXMgd29yayBpbmNsdWRlcyB3b3JrIHdpdGggdGhlIGZvbGxvd2luZyBjb3B5d3JpdGU6CiAqCiAqIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCBLdW5paGlybyBJc2hpZ3VybwogKgogKi8KCi8qIAogKiBUaGFua3MgdG8gSmVucyBM5eVzIGF0IFN3ZWRpc2ggVW5pdmVyc2l0eSBvZiBBZ3JpY3VsdHVyYWwgU2NpZW5jZXMKICogZm9yIHJldmlld2luZyBhbmQgdGVzdHMuCiAqLwoKCiNpbmNsdWRlIDx6ZWJyYS5oPgoKI2lmZGVmIEhBVkVfSVJEUCAKCiNpbmNsdWRlICJpZi5oIgojaW5jbHVkZSAidnR5LmgiCiNpbmNsdWRlICJzb2NrdW5pb24uaCIKI2luY2x1ZGUgInByZWZpeC5oIgojaW5jbHVkZSAiY29tbWFuZC5oIgojaW5jbHVkZSAibWVtb3J5LmgiCiNpbmNsdWRlICJzdHJlYW0uaCIKI2luY2x1ZGUgImlvY3RsLmgiCiNpbmNsdWRlICJjb25uZWN0ZWQuaCIKI2luY2x1ZGUgImxvZy5oIgojaW5jbHVkZSAiemNsaWVudC5oIgojaW5jbHVkZSAidGhyZWFkLmgiCiNpbmNsdWRlICJ6ZWJyYS9pbnRlcmZhY2UuaCIKI2luY2x1ZGUgInplYnJhL3J0YWR2LmgiCiNpbmNsdWRlICJ6ZWJyYS9yaWIuaCIKI2luY2x1ZGUgInplYnJhL3pzZXJ2LmgiCiNpbmNsdWRlICJ6ZWJyYS9yZWRpc3RyaWJ1dGUuaCIKI2luY2x1ZGUgInplYnJhL2lyZHAuaCIKI2luY2x1ZGUgPG5ldGluZXQvaXBfaWNtcC5oPgojaW5jbHVkZSAiaWYuaCIKI2luY2x1ZGUgInNvY2t1bmlvbi5oIgojaW5jbHVkZSAibG9nLmgiCgoKLyogTWFzdGVyIG9mIHRocmVhZHMuICovCmV4dGVybiBzdHJ1Y3QgemVicmFfdCB6ZWJyYWQ7CgppbnQgaW5fY2tzdW0gKHZvaWQgKnB0ciwgaW50IG5ieXRlcyk7CmV4dGVybiBpbnQgaXJkcF9zb2NrOwppbnQgaXJkcF9zZW5kX3RocmVhZChzdHJ1Y3QgdGhyZWFkICp0X2FkdmVydCk7CmNoYXIgKmluZXRfMmEodV9pbnQzMl90IGEsIGNoYXIgKmIpOwp2b2lkIGlyZHBfYWR2ZXJ0X29mZihzdHJ1Y3QgaW50ZXJmYWNlICppZnApOwoKCmNoYXIgYjFbMTZdLCBiMlsxNl0sIGIzWzE2XSwgYjRbMTZdOyAgLyogRm9yIGluZXRfMmEgKi8KCnN0YXRpYyBzdHJ1Y3QgcHJlZml4ICoKaXJkcF9nZXRfcHJlZml4KHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICBzdHJ1Y3QgY29ubmVjdGVkICppZmM7CiAgCiAgaWYgKGlmcC0+Y29ubmVjdGVkKQogICAgZm9yIChBTExfTElTVF9FTEVNRU5UU19STyAoaWZwLT5jb25uZWN0ZWQsIG5vZGUsIGlmYykpCiAgICAgIHJldHVybiBpZmMtPmFkZHJlc3M7CgogIHJldHVybiBOVUxMOwp9CgovKiBKb2luIHRvIHRoZSBhZGQvbGVhdmUgbXVsdGljYXN0IGdyb3VwLiAqLwpzdGF0aWMgaW50CmlmX2dyb3VwIChzdHJ1Y3QgaW50ZXJmYWNlICppZnAsIAoJICBpbnQgc29jaywgCgkgIHVfaW50MzJfdCBncm91cCwgCgkgIGludCBhZGRfbGVhdmUpCnsKICBzdHJ1Y3QgemVicmFfaWYgKnppOwogIHN0cnVjdCBpcF9tcmVxIG07CiAgc3RydWN0IHByZWZpeCAqcDsKICBpbnQgcmV0OwoKICB6aSA9IGlmcC0+aW5mbzsKCiAgbWVtc2V0ICgmbSwgMCwgc2l6ZW9mIChtKSk7CiAgbS5pbXJfbXVsdGlhZGRyLnNfYWRkciA9IGh0b25sIChncm91cCk7CiAgcCA9IGlyZHBfZ2V0X3ByZWZpeChpZnApOwoKICBpZighcCkgewogICAgICAgIHpsb2dfd2FybiAoIklSRFA6IGNhbid0IGdldCBhZGRyZXNzIGZvciAlcyIsIGlmcC0+bmFtZSk7CglyZXR1cm4gMTsKICB9CgogIG0uaW1yX2ludGVyZmFjZSA9IHAtPnUucHJlZml4NDsKCiAgcmV0ID0gc2V0c29ja29wdCAoc29jaywgSVBQUk9UT19JUCwgYWRkX2xlYXZlLAoJCSAgICAoY2hhciAqKSAmbSwgc2l6ZW9mIChzdHJ1Y3QgaXBfbXJlcSkpOwogIGlmIChyZXQgPCAwKQogICAgemxvZ193YXJuICgiSVJEUDogJXMgY2FuJ3Qgc2V0c29ja29wdCAlczogJXMiLAoJICAgICAgIGFkZF9sZWF2ZSA9PSBJUF9BRERfTUVNQkVSU0hJUD8gImpvaW4gZ3JvdXAiOiJsZWF2ZSBncm91cCIsIAogICAgICAgICAgICAgICBpbmV0XzJhKGdyb3VwLCBiMSksCiAgICAgICAgICAgICAgIHNhZmVfc3RyZXJyb3IgKGVycm5vKSk7CgogIHJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQKaWZfYWRkX2dyb3VwIChzdHJ1Y3QgaW50ZXJmYWNlICppZnApCnsKICBzdHJ1Y3QgemVicmFfaWYgKnppPSBpZnAtPmluZm87CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwID0gJnppLT5pcmRwOwogIGludCByZXQ7CgogIHJldCA9IGlmX2dyb3VwIChpZnAsIGlyZHBfc29jaywgSU5BRERSX0FMTFJUUlNfR1JPVVAsIElQX0FERF9NRU1CRVJTSElQKTsKICBpZiAocmV0IDwgMCkgewogICAgcmV0dXJuIHJldDsKICB9CgogIGlmKGlyZHAtPmZsYWdzICYgSUZfREVCVUdfTUlTQyApCiAgICB6bG9nX2RlYnVnKCJJUkRQOiBBZGRpbmcgZ3JvdXAgJXMgZm9yICVzIiwgCgkgICAgICAgaW5ldF8yYShodG9ubChJTkFERFJfQUxMUlRSU19HUk9VUCksIGIxKSwKCSAgICAgICBpZnAtPm5hbWUpOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmlmX2Ryb3BfZ3JvdXAgKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKewogIHN0cnVjdCB6ZWJyYV9pZiAqemk9IGlmcC0+aW5mbzsKICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHAgPSAmemktPmlyZHA7CiAgaW50IHJldDsKCiAgcmV0ID0gaWZfZ3JvdXAgKGlmcCwgaXJkcF9zb2NrLCBJTkFERFJfQUxMUlRSU19HUk9VUCwgSVBfRFJPUF9NRU1CRVJTSElQKTsKICBpZiAocmV0IDwgMCkKICAgIHJldHVybiByZXQ7CgogIGlmKGlyZHAtPmZsYWdzICYgSUZfREVCVUdfTUlTQykKICAgIHpsb2dfZGVidWcoIklSRFA6IExlYXZpbmcgZ3JvdXAgJXMgZm9yICVzIiwgCgkgICAgICAgaW5ldF8yYShodG9ubChJTkFERFJfQUxMUlRSU19HUk9VUCksIGIxKSwKCSAgICAgICBpZnAtPm5hbWUpOwogIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZAppZl9zZXRfZGVmYXVsdHMoc3RydWN0IGludGVyZmFjZSAqaWZwKQp7CiAgc3RydWN0IHplYnJhX2lmICp6aT1pZnAtPmluZm87CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwPSZ6aS0+aXJkcDsKCiAgaXJkcC0+TWF4QWR2ZXJ0SW50ZXJ2YWwgPSBJUkRQX01BWEFEVkVSVElOVEVSVkFMOwogIGlyZHAtPk1pbkFkdmVydEludGVydmFsID0gSVJEUF9NSU5BRFZFUlRJTlRFUlZBTDsKICBpcmRwLT5QcmVmZXJlbmNlID0gSVJEUF9QUkVGRVJFTkNFOwogIGlyZHAtPkxpZmV0aW1lID0gSVJEUF9MSUZFVElNRTsKfQoKCnN0cnVjdCBBZHYgKkFkdl9uZXcgKHZvaWQpCnsKICByZXR1cm4gWENBTExPQyAoTVRZUEVfVE1QLCBzaXplb2YgKHN0cnVjdCBBZHYpKTsKfQoKc3RhdGljIHZvaWQKQWR2X2ZyZWUgKHN0cnVjdCBBZHYgKmFkdikKewogIFhGUkVFIChNVFlQRV9UTVAsIGFkdik7Cn0KCnN0YXRpYyB2b2lkCmlyZHBfaWZfc3RhcnQoc3RydWN0IGludGVyZmFjZSAqaWZwLCBpbnQgbXVsdGljYXN0LCBpbnQgc2V0X2RlZmF1bHRzKQp7CiAgc3RydWN0IHplYnJhX2lmICp6aT0gaWZwLT5pbmZvOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcCA9ICZ6aS0+aXJkcDsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgc3RydWN0IGNvbm5lY3RlZCAqaWZjOwogIHVfaW50MzJfdCB0aW1lciwgc2VlZDsKCiAgaWYgKGlyZHAtPmZsYWdzICYgSUZfQUNUSVZFICkgewogICAgemxvZ193YXJuKCJJUkRQOiBJbnRlcmZhY2UgaXMgYWxyZWFkeSBhY3RpdmUgJXMiLCBpZnAtPm5hbWUpOwogICAgcmV0dXJuOwogIH0KICBpZiAoKGlyZHBfc29jayA8IDApICYmICgoaXJkcF9zb2NrID0gaXJkcF9zb2NrX2luaXQoKSkgPCAwKSkgewogICAgemxvZ193YXJuKCJJUkRQOiBDYW5ub3QgYWN0aXZhdGUgaW50ZXJmYWNlICVzIChjYW5ub3QgY3JlYXRlICIKCSAgICAgICJJUkRQIHNvY2tldCkiLCBpZnAtPm5hbWUpOwogICAgcmV0dXJuOwogIH0KICBpcmRwLT5mbGFncyB8PSBJRl9BQ1RJVkU7CgogIGlmKCFtdWx0aWNhc3QpIAogICAgaXJkcC0+ZmxhZ3MgfD0gSUZfQlJPQURDQVNUOwoKICBpZl9hZGRfdXBkYXRlKGlmcCk7CgogIGlmICghIChpZnAtPmZsYWdzICYgSUZGX1VQKSkgewogICAgemxvZ193YXJuKCJJUkRQOiBJbnRlcmZhY2UgaXMgZG93biAlcyIsIGlmcC0+bmFtZSk7CiAgfQoKICAvKiBTaGFsbCB3ZSBjYW5jZWwgaWZfc3RhcnQgaWYgaWZfYWRkX2dyb3VwIGZhaWxzPyAqLwoKICBpZiggbXVsdGljYXN0KSB7CiAgICBpZl9hZGRfZ3JvdXAoaWZwKTsKICAgIAogICAgaWYgKCEgKGlmcC0+ZmxhZ3MgJiAoSUZGX01VTFRJQ0FTVHxJRkZfQUxMTVVMVEkpKSkgewogICAgICB6bG9nX3dhcm4oIklSRFA6IEludGVyZmFjZSBub3QgbXVsdGljYXN0IGVuYWJsZWQgJXMiLCBpZnAtPm5hbWUpOwogICAgfQogIH0KCiAgaWYoc2V0X2RlZmF1bHRzKSAKICAgIGlmX3NldF9kZWZhdWx0cyhpZnApOwoKICBpcmRwLT5pcmRwX3NlbnQgPSAwOwoKICAvKiBUaGUgc3BlYyBzdWdnZXN0cyB0aGlzIGZvciByYW5kb21uZXNzICovCgogIHNlZWQgPSAwOwogIGlmKCBpZnAtPmNvbm5lY3RlZCkKICAgIGZvciAoQUxMX0xJU1RfRUxFTUVOVFNfUk8gKGlmcC0+Y29ubmVjdGVkLCBub2RlLCBpZmMpKQogICAgICB7CiAgICAgICAgc2VlZCA9IGlmYy0+YWRkcmVzcy0+dS5wcmVmaXg0LnNfYWRkcjsKICAgICAgICBicmVhazsKICAgICAgfQogIAogIHNyYW5kb20oc2VlZCk7CiAgdGltZXIgPSAgKHJhbmRvbSAoKSAlIElSRFBfREVGQVVMVF9JTlRFUlZBTCkgKyAxOyAKCiAgaXJkcC0+QWR2UHJlZkxpc3QgPSBsaXN0X25ldygpOwogIGlyZHAtPkFkdlByZWZMaXN0LT5kZWwgPSAgKHZvaWQgKCopKHZvaWQgKikpIEFkdl9mcmVlOyAvKiBEZXN0cnVjdG9yICovCgoKICAvKiBBbmQgdGhpcyBmb3Igc3RhcnR1cC4gU3BlZWQgbGltaXQgZnJvbSAxOTkxIDotKS4gQnV0IGl0J3MgT0sqLwoKICBpZihpcmRwLT5pcmRwX3NlbnQgPCBNQVhfSU5JVElBTF9BRFZFUlRJU0VNRU5UUyAmJgogICAgIHRpbWVyID4gTUFYX0lOSVRJQUxfQURWRVJUX0lOVEVSVkFMICkgCgkgIHRpbWVyPSBNQVhfSU5JVElBTF9BRFZFUlRfSU5URVJWQUw7CgogIAogIGlmKGlyZHAtPmZsYWdzICYgSUZfREVCVUdfTUlTQykKICAgIHpsb2dfZGVidWcoIklSRFA6IEluaXQgdGltZXIgZm9yICVzIHNldCB0byAldSIsIAoJICAgICAgIGlmcC0+bmFtZSwgCgkgICAgICAgdGltZXIpOwoKICBpcmRwLT50X2FkdmVydGlzZSA9IHRocmVhZF9hZGRfdGltZXIoemVicmFkLm1hc3RlciwgCgkJCQkgICAgICAgaXJkcF9zZW5kX3RocmVhZCwgCgkJCQkgICAgICAgaWZwLCAKCQkJCSAgICAgICB0aW1lcik7Cn0KCnN0YXRpYyB2b2lkCmlyZHBfaWZfc3RvcChzdHJ1Y3QgaW50ZXJmYWNlICppZnApCnsKICBzdHJ1Y3QgemVicmFfaWYgKnppPWlmcC0+aW5mbzsKICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA9JnppLT5pcmRwOwogIAogIGlmIChpcmRwID09IE5VTEwpIHsKICAgIHpsb2dfd2FybiAoIkludGVyZmFjZSAlcyBzdHJ1Y3R1cmUgaXMgTlVMTCIsIGlmcC0+bmFtZSk7CiAgICByZXR1cm47CiAgfQoKICBpZiAoISAoaXJkcC0+ZmxhZ3MgJiBJRl9BQ1RJVkUgKSkgewogICAgemxvZ193YXJuKCJJbnRlcmZhY2UgaXMgbm90IGFjdGl2ZSAlcyIsIGlmcC0+bmFtZSk7CiAgICByZXR1cm47CiAgfQoKICBpZighIChpcmRwLT5mbGFncyAmIElGX0JST0FEQ0FTVCkpIAogICAgaWZfZHJvcF9ncm91cChpZnApOwoKICBpcmRwX2FkdmVydF9vZmYoaWZwKTsKCiAgbGlzdF9kZWxldGUoaXJkcC0+QWR2UHJlZkxpc3QpOwogIGlyZHAtPkFkdlByZWZMaXN0PU5VTEw7CgogIGlyZHAtPmZsYWdzID0gMDsKfQoKCnN0YXRpYyB2b2lkCmlyZHBfaWZfc2h1dGRvd24oc3RydWN0IGludGVyZmFjZSAqaWZwKQp7CiAgc3RydWN0IHplYnJhX2lmICp6aT0gaWZwLT5pbmZvOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcCA9ICZ6aS0+aXJkcDsKCiAgaWYgKGlyZHAtPmZsYWdzICYgSUZfU0hVVERPV04gKSB7CiAgICB6bG9nX3dhcm4oIklSRFA6IEludGVyZmFjZSBpcyBhbHJlYWR5IHNodXRkb3duICVzIiwgaWZwLT5uYW1lKTsKICAgIHJldHVybjsKICB9CgogIGlyZHAtPmZsYWdzIHw9IElGX1NIVVRET1dOOwogIGlyZHAtPmZsYWdzICY9IH5JRl9BQ1RJVkU7CgogIGlmKCEgKGlyZHAtPmZsYWdzICYgSUZfQlJPQURDQVNUKSkgCiAgICBpZl9kcm9wX2dyb3VwKGlmcCk7CiAgCiAgLyogVGVsbCB0aGUgaG9zdHMgd2UgYXJlIG91dCBvZiBzZXJ2aWNlICovCiAgaXJkcF9hZHZlcnRfb2ZmKGlmcCk7Cn0KCnN0YXRpYyB2b2lkCmlyZHBfaWZfbm9fc2h1dGRvd24oc3RydWN0IGludGVyZmFjZSAqaWZwKQp7CiAgc3RydWN0IHplYnJhX2lmICp6aT0gaWZwLT5pbmZvOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcCA9ICZ6aS0+aXJkcDsKCiAgaWYgKCEgKGlyZHAtPmZsYWdzICYgSUZfU0hVVERPV04gKSkgewogICAgemxvZ193YXJuKCJJUkRQOiBJbnRlcmZhY2UgaXMgbm90IHNodXRkb3duICVzIiwgaWZwLT5uYW1lKTsKICAgIHJldHVybjsKICB9CgogIGlyZHAtPmZsYWdzICY9IH5JRl9TSFVURE9XTjsKCiAgaXJkcF9pZl9zdGFydChpZnAsIGlyZHAtPmZsYWdzICYgSUZfQlJPQURDQVNUPyBGQUxTRSA6IFRSVUUsIEZBTFNFKTsgCgp9CgoKLyogV3JpdGUgY29uZmlndXJhdGlvbiB0byB1c2VyICovCgp2b2lkIGlyZHBfY29uZmlnX3dyaXRlIChzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKewogIHN0cnVjdCB6ZWJyYV9pZiAqemk9aWZwLT5pbmZvOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcD0memktPmlyZHA7CiAgc3RydWN0IEFkdiAqYWR2OwogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKCiAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9BQ1RJVkUgfHwgaXJkcC0+ZmxhZ3MgJiBJRl9TSFVURE9XTikgewoKICAgIGlmKCBpcmRwLT5mbGFncyAmIElGX1NIVVRET1dOKSAKICAgICAgdnR5X291dCAodnR5LCAiIGlwIGlyZHAgc2h1dGRvd24gJXMiLCAgVlRZX05FV0xJTkUpOwoKICAgIGlmKCBpcmRwLT5mbGFncyAmIElGX0JST0FEQ0FTVCkgCiAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBpcCBpcmRwIGJyb2FkY2FzdCVzIiwgIFZUWV9ORVdMSU5FKTsKICAgIGVsc2UgCiAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBpcCBpcmRwIG11bHRpY2FzdCVzIiwgIFZUWV9ORVdMSU5FKTsKCiAgICB2dHlfb3V0ICh2dHksICIgaXAgaXJkcCBwcmVmZXJlbmNlICVsZCVzIiwgIAoJICAgICBpcmRwLT5QcmVmZXJlbmNlLCBWVFlfTkVXTElORSk7CgogICAgZm9yIChBTExfTElTVF9FTEVNRU5UU19STyAoaXJkcC0+QWR2UHJlZkxpc3QsIG5vZGUsIGFkdikpCiAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBpcCBpcmRwIGFkZHJlc3MgJXMgcHJlZmVyZW5jZSAlZCVzIiwKICAgICAgICAgICAgICAgICAgICBpbmV0XzJhKGFkdi0+aXAuc19hZGRyLCBiMSksCiAgICAgICAgICAgICAgICAgICAgYWR2LT5wcmVmLCAKICAgICAgICAgICAgICAgICAgICBWVFlfTkVXTElORSk7CgogICAgdnR5X291dCAodnR5LCAiIGlwIGlyZHAgaG9sZHRpbWUgJWQlcyIsICAKCSAgICAgaXJkcC0+TGlmZXRpbWUsIFZUWV9ORVdMSU5FKTsKCiAgICB2dHlfb3V0ICh2dHksICIgaXAgaXJkcCBtaW5hZHZlcnRpbnRlcnZhbCAlbGQlcyIsICAKCSAgICAgaXJkcC0+TWluQWR2ZXJ0SW50ZXJ2YWwsIFZUWV9ORVdMSU5FKTsKCiAgICB2dHlfb3V0ICh2dHksICIgaXAgaXJkcCBtYXhhZHZlcnRpbnRlcnZhbCAlbGQlcyIsICAKCSAgICAgaXJkcC0+TWF4QWR2ZXJ0SW50ZXJ2YWwsIFZUWV9ORVdMSU5FKTsKCiAgfQp9CgoKREVGVU4gKGlwX2lyZHBfbXVsdGljYXN0LAogICAgICAgaXBfaXJkcF9tdWx0aWNhc3RfY21kLAogICAgICAgImlwIGlyZHAgbXVsdGljYXN0IiwKICAgICAgIElQX1NUUgogICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBvbiB0aGlzIGludGVyZmFjZSB1c2luZyBtdWx0aWNhc3RcbiIpCnsKICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CgogIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CiAgaWYoIWlmcCkgewoJICByZXR1cm4gQ01EX1dBUk5JTkc7CiAgfQoKICBpcmRwX2lmX3N0YXJ0KGlmcCwgVFJVRSwgVFJVRSk7CiAgcmV0dXJuIENNRF9TVUNDRVNTOwp9CgpERUZVTiAoaXBfaXJkcF9icm9hZGNhc3QsCiAgICAgICBpcF9pcmRwX2Jyb2FkY2FzdF9jbWQsCiAgICAgICAiaXAgaXJkcCBicm9hZGNhc3QiLAogICAgICAgSVBfU1RSCiAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IG9uIHRoaXMgaW50ZXJmYWNlIHVzaW5nIGJyb2FkY2FzdFxuIikKewogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKCiAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKICBpZighaWZwKSB7CgkgIHJldHVybiBDTURfV0FSTklORzsKICB9CgogIGlyZHBfaWZfc3RhcnQoaWZwLCBGQUxTRSwgVFJVRSk7CiAgcmV0dXJuIENNRF9TVUNDRVNTOwp9CgpERUZVTiAobm9faXBfaXJkcCwKICAgICAgIG5vX2lwX2lyZHBfY21kLAogICAgICAgIm5vIGlwIGlyZHAiLAogICAgICAgTk9fU1RSCiAgICAgICBJUF9TVFIKICAgICAgICJEaXNhYmxlIElDTVAgUm91dGVyIGRpc2NvdmVyeSBvbiB0aGlzIGludGVyZmFjZVxuIikKewogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKCiAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKICBpZighaWZwKSB7CgkgIHJldHVybiBDTURfV0FSTklORzsKICB9CgogIGlyZHBfaWZfc3RvcChpZnApOwogIHJldHVybiBDTURfU1VDQ0VTUzsKfQoKREVGVU4gKGlwX2lyZHBfc2h1dGRvd24sCiAgICAgICBpcF9pcmRwX3NodXRkb3duX2NtZCwKICAgICAgICJpcCBpcmRwIHNodXRkb3duIiwKICAgICAgIElQX1NUUgogICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBzaHV0ZG93biBvbiB0aGlzIGludGVyZmFjZVxuIikKewogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKCiAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKICBpZighaWZwKSB7CgkgIHJldHVybiBDTURfV0FSTklORzsKICB9CgogIGlyZHBfaWZfc2h1dGRvd24oaWZwKTsKICByZXR1cm4gQ01EX1NVQ0NFU1M7Cn0KCkRFRlVOIChub19pcF9pcmRwX3NodXRkb3duLAogICAgICAgbm9faXBfaXJkcF9zaHV0ZG93bl9jbWQsCiAgICAgICAibm8gaXAgaXJkcCBzaHV0ZG93biIsCiAgICAgICBOT19TVFIKICAgICAgIElQX1NUUgogICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBubyBzaHV0ZG93biBvbiB0aGlzIGludGVyZmFjZVxuIikKewogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKCiAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKICBpZighaWZwKSB7CgkgIHJldHVybiBDTURfV0FSTklORzsKICB9CgogIGlyZHBfaWZfbm9fc2h1dGRvd24oaWZwKTsKICByZXR1cm4gQ01EX1NVQ0NFU1M7Cn0KCkRFRlVOIChpcF9pcmRwX2hvbGR0aW1lLAogICAgICAgaXBfaXJkcF9ob2xkdGltZV9jbWQsCiAgICAgICAiaXAgaXJkcCBob2xkdGltZSA8MC05MDAwPiIsCiAgICAgICBJUF9TVFIKICAgICAgICJJQ01QIFJvdXRlciBkaXNjb3Zlcnkgb24gdGhpcyBpbnRlcmZhY2VcbiIKICAgICAgICJTZXQgaG9sZHRpbWUgdmFsdWVcbiIKICAgICAgICJIb2xkdGltZSB2YWx1ZSBpbiBzZWNvbmRzLiBEZWZhdWx0IGlzIDE4MDAgc2Vjb25kc1xuIikKewogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICBzdHJ1Y3QgemVicmFfaWYgKnppOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OwogIGlmKCFpZnApIHsKCSAgcmV0dXJuIENNRF9XQVJOSU5HOwogIH0KCiAgemk9aWZwLT5pbmZvOwogIGlyZHA9JnppLT5pcmRwOwoKICBpcmRwLT5MaWZldGltZSA9IGF0b2koYXJndlswXSk7CiAgcmV0dXJuIENNRF9TVUNDRVNTOwp9CgpERUZVTiAoaXBfaXJkcF9taW5hZHZlcnRpbnRlcnZhbCwKICAgICAgIGlwX2lyZHBfbWluYWR2ZXJ0aW50ZXJ2YWxfY21kLAogICAgICAgImlwIGlyZHAgbWluYWR2ZXJ0aW50ZXJ2YWwgPDMtMTgwMD4iLAogICAgICAgSVBfU1RSCiAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IG9uIHRoaXMgaW50ZXJmYWNlXG4iCiAgICAgICAiU2V0IG1pbmltdW0gdGltZSBiZXR3ZWVuIGFkdmVydGlzZW1lbnRcbiIKICAgICAgICJNaW5pbXVtIGFkdmVydGlzZW1lbnQgaW50ZXJ2YWwgaW4gc2Vjb25kc1xuIikKewogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICBzdHJ1Y3QgemVicmFfaWYgKnppOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OwogIGlmKCFpZnApIHsKCSAgcmV0dXJuIENNRF9XQVJOSU5HOwogIH0KCiAgemk9aWZwLT5pbmZvOwogIGlyZHA9JnppLT5pcmRwOwoKICBpZiggKHVuc2lnbmVkKSBhdG9pKGFyZ3ZbMF0pIDw9IGlyZHAtPk1heEFkdmVydEludGVydmFsKSB7CiAgICAgIGlyZHAtPk1pbkFkdmVydEludGVydmFsID0gYXRvaShhcmd2WzBdKTsKCiAgICAgIHJldHVybiBDTURfU1VDQ0VTUzsKICB9CgogIHZ0eV9vdXQgKHZ0eSwgIklDTVAgd2FybmluZyBtYXhhZHZlcnRpbnRlcnZhbCBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gbWluYWR2ZXJ0aW50ZXJ2YWwlcyIsIAoJICAgICBWVFlfTkVXTElORSk7CgogIHZ0eV9vdXQgKHZ0eSwgIlBsZWFzZSBjb3JyZWN0ISVzIiwgCgkgICAgIFZUWV9ORVdMSU5FKTsKICByZXR1cm4gQ01EX1dBUk5JTkc7Cn0KCkRFRlVOIChpcF9pcmRwX21heGFkdmVydGludGVydmFsLAogICAgICAgaXBfaXJkcF9tYXhhZHZlcnRpbnRlcnZhbF9jbWQsCiAgICAgICAiaXAgaXJkcCBtYXhhZHZlcnRpbnRlcnZhbCA8NC0xODAwPiIsCiAgICAgICBJUF9TVFIKICAgICAgICJJQ01QIFJvdXRlciBkaXNjb3Zlcnkgb24gdGhpcyBpbnRlcmZhY2VcbiIKICAgICAgICJTZXQgbWF4aW11bSB0aW1lIGJldHdlZW4gYWR2ZXJ0aXNlbWVudFxuIgogICAgICAgIk1heGltdW0gYWR2ZXJ0aXNlbWVudCBpbnRlcnZhbCBpbiBzZWNvbmRzXG4iKQp7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogIHN0cnVjdCB6ZWJyYV9pZiAqemk7CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOwogIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CiAgaWYoIWlmcCkgewoJICByZXR1cm4gQ01EX1dBUk5JTkc7CiAgfQoKICB6aT1pZnAtPmluZm87CiAgaXJkcD0memktPmlyZHA7CgoKICBpZiggaXJkcC0+TWluQWR2ZXJ0SW50ZXJ2YWwgPD0gKHVuc2lnbmVkKSBhdG9pKGFyZ3ZbMF0pICkgewogICAgaXJkcC0+TWF4QWR2ZXJ0SW50ZXJ2YWwgPSBhdG9pKGFyZ3ZbMF0pOwoKICAgICAgcmV0dXJuIENNRF9TVUNDRVNTOwogIH0KCiAgdnR5X291dCAodnR5LCAiSUNNUCB3YXJuaW5nIG1heGFkdmVydGludGVydmFsIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBtaW5hZHZlcnRpbnRlcnZhbCVzIiwgCgkgICAgIFZUWV9ORVdMSU5FKTsKCiAgdnR5X291dCAodnR5LCAiUGxlYXNlIGNvcnJlY3QhJXMiLCAKCSAgICAgVlRZX05FV0xJTkUpOwogIHJldHVybiBDTURfV0FSTklORzsKfQoKLyogREVGVU4gbmVlZHMgdG8gYmUgZml4ZWQgZm9yIG5lZ2F0aXZlIHJhbmFnZXMuLi4KICogImlwIGlyZHAgcHJlZmVyZW5jZSA8LTIxNDc0ODM2NDgtMjE0NzQ4MzY0Nz4iLAogKiBCZSBwb3NpdGl2ZSBmb3Igbm93LiA6LSkKICovCgpERUZVTiAoaXBfaXJkcF9wcmVmZXJlbmNlLAogICAgICAgaXBfaXJkcF9wcmVmZXJlbmNlX2NtZCwKICAgICAgICJpcCBpcmRwIHByZWZlcmVuY2UgPDAtMjE0NzQ4MzY0Nz4iLAogICAgICAgSVBfU1RSCiAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IG9uIHRoaXMgaW50ZXJmYWNlXG4iCiAgICAgICAiU2V0IGRlZmF1bHQgcHJlZmVyZW5jZSBsZXZlbCBmb3IgdGhpcyBpbnRlcmZhY2VcbiIKICAgICAgICJQcmVmZXJlbmNlIGxldmVsXG4iKQp7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogIHN0cnVjdCB6ZWJyYV9pZiAqemk7CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOwogIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CiAgaWYoIWlmcCkgewoJICByZXR1cm4gQ01EX1dBUk5JTkc7CiAgfQoKICB6aT1pZnAtPmluZm87CiAgaXJkcD0memktPmlyZHA7CgogIGlyZHAtPlByZWZlcmVuY2UgPSBhdG9pKGFyZ3ZbMF0pOwogIHJldHVybiBDTURfU1VDQ0VTUzsKfQoKREVGVU4gKGlwX2lyZHBfYWRkcmVzc19wcmVmZXJlbmNlLAogICAgICAgaXBfaXJkcF9hZGRyZXNzX3ByZWZlcmVuY2VfY21kLAogICAgICAgImlwIGlyZHAgYWRkcmVzcyBBLkIuQy5EIHByZWZlcmVuY2UgPDAtMjE0NzQ4MzY0Nz4iLAogICAgICAgSVBfU1RSCiAgICAgICAiQWx0ZXIgSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IHByZWZlcmVuY2UgdGhpcyBpbnRlcmZhY2VcbiIKICAgICAgICJTcGVjaWZ5IElSRFAgbm9uLWRlZmF1bHQgcHJlZmVyZW5jZSB0byBhZHZlcnRpc2VcbiIKICAgICAgICJTZXQgSVJEUCBhZGRyZXNzIGZvciBhZHZlcnRpc2VcbiIKICAgICAgICJQcmVmZXJlbmNlIGxldmVsXG4iKQp7CiAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogIHN0cnVjdCBpbl9hZGRyIGlwOyAKICBpbnQgcHJlZjsKICBpbnQgcmV0OwogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICBzdHJ1Y3QgemVicmFfaWYgKnppOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKICBzdHJ1Y3QgQWR2ICphZHY7CgogIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CiAgaWYoIWlmcCkgewoJICByZXR1cm4gQ01EX1dBUk5JTkc7CiAgfQoKICB6aT1pZnAtPmluZm87CiAgaXJkcD0memktPmlyZHA7CgogIHJldCA9IGluZXRfYXRvbihhcmd2WzBdLCAmaXApOwogIGlmKCFyZXQpIHJldHVybiBDTURfV0FSTklORzsKCiAgcHJlZiA9IGF0b2koYXJndlsxXSk7CgogIGZvciAoQUxMX0xJU1RfRUxFTUVOVFNfUk8gKGlyZHAtPkFkdlByZWZMaXN0LCBub2RlLCBhZHYpKQogICAgaWYoYWR2LT5pcC5zX2FkZHIgPT0gaXAuc19hZGRyKSAKICAgICAgcmV0dXJuIENNRF9TVUNDRVNTOwoKICBhZHYgPSBBZHZfbmV3KCk7CiAgYWR2LT5pcCA9IGlwOwogIGFkdi0+cHJlZiA9IHByZWY7CiAgbGlzdG5vZGVfYWRkKGlyZHAtPkFkdlByZWZMaXN0LCBhZHYpOwoKICByZXR1cm4gQ01EX1NVQ0NFU1M7Cgp9CgpERUZVTiAobm9faXBfaXJkcF9hZGRyZXNzX3ByZWZlcmVuY2UsCiAgICAgICBub19pcF9pcmRwX2FkZHJlc3NfcHJlZmVyZW5jZV9jbWQsCiAgICAgICAibm8gaXAgaXJkcCBhZGRyZXNzIEEuQi5DLkQgcHJlZmVyZW5jZSA8MC0yMTQ3NDgzNjQ3PiIsCiAgICAgICBOT19TVFIKICAgICAgIElQX1NUUgogICAgICAgIkFsdGVyIElDTVAgUm91dGVyIGRpc2NvdmVyeSBwcmVmZXJlbmNlIHRoaXMgaW50ZXJmYWNlXG4iCiAgICAgICAiUmVtb3ZlcyBJUkRQIG5vbi1kZWZhdWx0IHByZWZlcmVuY2VcbiIKICAgICAgICJTZWxlY3QgSVJEUCBhZGRyZXNzXG4iCiAgICAgICAiT2xkIHByZWZlcmVuY2UgbGV2ZWxcbiIpCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGUsICpubm9kZTsKICBzdHJ1Y3QgaW5fYWRkciBpcDsgCiAgaW50IHByZWY7CiAgaW50IHJldDsKICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAgc3RydWN0IHplYnJhX2lmICp6aTsKICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA7CiAgc3RydWN0IEFkdiAqYWR2OwoKICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OwogIGlmKCFpZnApIHsKCSAgcmV0dXJuIENNRF9XQVJOSU5HOwogIH0KCiAgemk9aWZwLT5pbmZvOwogIGlyZHA9JnppLT5pcmRwOwoKICByZXQgPSBpbmV0X2F0b24oYXJndlswXSwgJmlwKTsKICBpZiAoIXJldCkgCiAgICByZXR1cm4gQ01EX1dBUk5JTkc7CgogIHByZWYgPSBhdG9pKGFyZ3ZbMV0pOwoKICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTIChpcmRwLT5BZHZQcmVmTGlzdCwgbm9kZSwgbm5vZGUsIGFkdikpCiAgICB7CiAgICAgIGlmKGFkdi0+aXAuc19hZGRyID09IGlwLnNfYWRkciApCiAgICAgICAgewogICAgICAgICAgbGlzdG5vZGVfZGVsZXRlKGlyZHAtPkFkdlByZWZMaXN0LCBhZHYpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogIAogIHJldHVybiBDTURfU1VDQ0VTUzsKfQoKREVGVU4gKGlwX2lyZHBfZGVidWdfbWVzc2FnZXMsCiAgICAgICBpcF9pcmRwX2RlYnVnX21lc3NhZ2VzX2NtZCwKICAgICAgICJpcCBpcmRwIGRlYnVnIG1lc3NhZ2VzIiwKICAgICAgIElQX1NUUgogICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBkZWJ1ZyBBdmVydHMuIGFuZCBTb2xpY2l0cyAoc2hvcnQpXG4iKQp7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogIHN0cnVjdCB6ZWJyYV9pZiAqemk7CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOwogIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CiAgaWYoIWlmcCkgewoJICByZXR1cm4gQ01EX1dBUk5JTkc7CiAgfQoKICB6aT1pZnAtPmluZm87CiAgaXJkcD0memktPmlyZHA7CgogIGlyZHAtPmZsYWdzIHw9IElGX0RFQlVHX01FU1NBR0VTOwoKICByZXR1cm4gQ01EX1NVQ0NFU1M7Cn0KCkRFRlVOIChpcF9pcmRwX2RlYnVnX21pc2MsCiAgICAgICBpcF9pcmRwX2RlYnVnX21pc2NfY21kLAogICAgICAgImlwIGlyZHAgZGVidWcgbWlzYyIsCiAgICAgICBJUF9TVFIKICAgICAgICJJQ01QIFJvdXRlciBkaXNjb3ZlcnkgZGVidWcgQXZlcnRzLiBhbmQgU29saWNpdHMgKHNob3J0KVxuIikKewogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICBzdHJ1Y3QgemVicmFfaWYgKnppOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OwogIGlmKCFpZnApIHsKCSAgcmV0dXJuIENNRF9XQVJOSU5HOwogIH0KCiAgemk9aWZwLT5pbmZvOwogIGlyZHA9JnppLT5pcmRwOwoKICBpcmRwLT5mbGFncyB8PSBJRl9ERUJVR19NSVNDOwoKICByZXR1cm4gQ01EX1NVQ0NFU1M7Cn0KCkRFRlVOIChpcF9pcmRwX2RlYnVnX3BhY2tldCwKICAgICAgIGlwX2lyZHBfZGVidWdfcGFja2V0X2NtZCwKICAgICAgICJpcCBpcmRwIGRlYnVnIHBhY2tldCIsCiAgICAgICBJUF9TVFIKICAgICAgICJJQ01QIFJvdXRlciBkaXNjb3ZlcnkgZGVidWcgQXZlcnRzLiBhbmQgU29saWNpdHMgKHNob3J0KVxuIikKewogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICBzdHJ1Y3QgemVicmFfaWYgKnppOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OwogIGlmKCFpZnApIHsKCSAgcmV0dXJuIENNRF9XQVJOSU5HOwogIH0KCiAgemk9aWZwLT5pbmZvOwogIGlyZHA9JnppLT5pcmRwOwoKICBpcmRwLT5mbGFncyB8PSBJRl9ERUJVR19QQUNLRVQ7CgogIHJldHVybiBDTURfU1VDQ0VTUzsKfQoKCkRFRlVOIChpcF9pcmRwX2RlYnVnX2Rpc2FibGUsCiAgICAgICBpcF9pcmRwX2RlYnVnX2Rpc2FibGVfY21kLAogICAgICAgImlwIGlyZHAgZGVidWcgZGlzYWJsZSIsCiAgICAgICBJUF9TVFIKICAgICAgICJJQ01QIFJvdXRlciBkaXNjb3ZlcnkgZGVidWcgQXZlcnRzLiBhbmQgU29saWNpdHMgKHNob3J0KVxuIikKewogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICBzdHJ1Y3QgemVicmFfaWYgKnppOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OwogIGlmKCFpZnApIHsKCSAgcmV0dXJuIENNRF9XQVJOSU5HOwogIH0KCiAgemk9aWZwLT5pbmZvOwogIGlyZHA9JnppLT5pcmRwOwoKICBpcmRwLT5mbGFncyAmPSB+SUZfREVCVUdfUEFDS0VUOwogIGlyZHAtPmZsYWdzICY9IH5JRl9ERUJVR19NRVNTQUdFUzsKICBpcmRwLT5mbGFncyAmPSB+SUZfREVCVUdfTUlTQzsKCiAgcmV0dXJuIENNRF9TVUNDRVNTOwp9Cgp2b2lkCmlyZHBfaW5pdCAoKQp7CiAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJmlwX2lyZHBfYnJvYWRjYXN0X2NtZCk7CiAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJmlwX2lyZHBfbXVsdGljYXN0X2NtZCk7CiAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJm5vX2lwX2lyZHBfY21kKTsKICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9zaHV0ZG93bl9jbWQpOwogIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZub19pcF9pcmRwX3NodXRkb3duX2NtZCk7CiAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJmlwX2lyZHBfaG9sZHRpbWVfY21kKTsKICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9tYXhhZHZlcnRpbnRlcnZhbF9jbWQpOwogIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX21pbmFkdmVydGludGVydmFsX2NtZCk7CiAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJmlwX2lyZHBfcHJlZmVyZW5jZV9jbWQpOwogIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX2FkZHJlc3NfcHJlZmVyZW5jZV9jbWQpOwogIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZub19pcF9pcmRwX2FkZHJlc3NfcHJlZmVyZW5jZV9jbWQpOwoKICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9kZWJ1Z19tZXNzYWdlc19jbWQpOwogIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX2RlYnVnX21pc2NfY21kKTsKICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9kZWJ1Z19wYWNrZXRfY21kKTsKICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9kZWJ1Z19kaXNhYmxlX2NtZCk7Cn0KCiNlbmRpZiAvKiBIQVZFX0lSRFAgKi8K