LyogZmlsZXhmZXIuYwogKgogKiBDb3B5cmlnaHQgqSAyMDEzIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgogKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQogKiBkZXRhaWxzLgogKi8KCi8qIENvZGUgaGVyZS1pbiBpcyB0aGUgImdsdWUiIHRoYXQgY29ubmVjdHMgY29udHJvbHZtIG1lc3NhZ2VzIHdpdGggdGhlCiAqIHNwYXJmaWxleGZlciBkcml2ZXIsIHdoaWNoIGlzIHVzZWQgdG8gdHJhbnNmZXIgZmlsZSBjb250ZW50cyBhcyBwYXlsb2FkCiAqIGFjcm9zcyB0aGUgY29udHJvbHZtIGNoYW5uZWwuCiAqLwoKI2luY2x1ZGUgImdsb2JhbHMuaCIKI2luY2x1ZGUgImNvbnRyb2x2bS5oIgojaW5jbHVkZSAidmlzb3JjaGlwc2V0LmgiCiNpbmNsdWRlICJmaWxleGZlci5oIgoKI2lmZGVmIEVOQUJMRV9TUEFSRklMRVhGRVIgLyogc3BhcmZpbGV4ZmVyIGtlcm5lbCBtb2R1bGUgZW5hYmxlZCBpbiBidWlsZCAqLwojaW5jbHVkZSAic3BhcmZpbGV4ZmVyLmgiCgovKiBEcml2ZXItZ2xvYmFsIG1lbW9yeSAqLwpzdGF0aWMgTElTVF9IRUFEKFJlcXVlc3RfbGlzdCk7CS8qIGxpc3Qgb2Ygc3RydWN0IGFueV9yZXF1ZXN0ICosIHZpYQoJCQkJICogcmVxX2xpc3QgbWVtYiAqLwoKLyogbG9jayBmb3IgYWJvdmUgcG9vbCBmb3IgYWxsb2NhdGlvbiBvZiBhbnlfcmVxdWVzdCBzdHJ1Y3RzLCBhbmQgcG9vbAoqIG5hbWU7IG5vdGUgdGhhdCBrbWVtX2NhY2hlX2NyZWF0ZSByZXF1aXJlcyB0aGF0IHdlIGtlZXAgdGhlIHN0b3JhZ2UKKiBmb3IgdGhlIHBvb2wgbmFtZSBmb3IgdGhlIGxpZmUgb2YgdGhlIHBvb2wKICovCnN0YXRpYyBERUZJTkVfU1BJTkxPQ0soUmVxdWVzdF9saXN0X2xvY2spOwoKc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpSZXF1ZXN0X21lbW9yeV9wb29sOwpzdGF0aWMgY29uc3QgY2hhciBSZXF1ZXN0X21lbW9yeV9wb29sX25hbWVbXSA9ICJmaWxleGZlcl9yZXF1ZXN0X3Bvb2wiOwpzaXplX3QgQ2FsbGVyX3JlcV9jb250ZXh0X2J5dGVzID0gMDsJLyogcGFzc2VkIHRvIGZpbGV4ZmVyX2NvbnN0cnVjdG9yKCkgKi8KCi8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBzaW5nbGUgY29udHJvbHZtIEdFVEZJTEUgY29udmVyc2F0aW9uLCB3aGljaAogKiBjb25zaXN0cyBvZiBhIHNpbmdsZSBjb250cm9sdm0gcmVxdWVzdCBtZXNzYWdlIGFuZCAxIG9yIG1vcmUgY29udHJvbHZtCiAqIHJlc3BvbnNlIG1lc3NhZ2VzLgogKi8Kc3RydWN0IGdldGZpbGVfcmVxdWVzdCB7CglDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgY29udHJvbHZtX2hlYWRlcjsKCWF0b21pY190IGJ1ZmZlcnNfaW5fdXNlOwoJR0VUX0NPTlRJR1VPVVNfQ09OVFJPTFZNX1BBWUxPQURfRlVOQyBnZXRfY29udGlndW91c19jb250cm9sdm1fcGF5bG9hZDsKCUNPTlRST0xWTV9SRVNQT05EX1dJVEhfUEFZTE9BRF9GVU5DIGNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZDsKfTsKCi8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBzaW5nbGUgY29udHJvbHZtIFBVVEZJTEUgY29udmVyc2F0aW9uLCB3aGljaAogKiBjb25zaXN0cyBvZiBhIHNpbmdsZSBjb250cm9sdm0gcmVxdWVzdCB3aXRoIGEgZmlsZW5hbWUsIGFuZCBhZGRpdGlvbmFsCiAqIGNvbnRyb2x2bSBtZXNzYWdlcyB3aXRoIGZpbGUgZGF0YS4KICovCnN0cnVjdCBwdXRmaWxlX3JlcXVlc3QgewoJR0VUX0NPTlRST0xWTV9GSUxFREFUQV9GVU5DIGdldF9jb250cm9sdm1fZmlsZWRhdGE7CglDT05UUk9MVk1fUkVTUE9ORF9GVU5DIGNvbnRyb2x2bV9lbmRfcHV0RmlsZTsKfTsKCi8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBzaW5nbGUgZmlsZSB0cmFuc2ZlciBvcGVyYXRpb24sIHdoaWNoIGNhbiBlaXRoZXIKICogYmUgYSBHRVRGSUxFIG9yIFBVVEZJTEUuCiAqLwpzdHJ1Y3QgYW55X3JlcXVlc3QgewoJc3RydWN0IGxpc3RfaGVhZCByZXFfbGlzdDsKCXVsb25nMiBmaWxlX3JlcXVlc3RfbnVtYmVyOwoJdWxvbmcyIGRhdGFfc2VxdWVuY2VfbnVtYmVyOwoJVFJBTlNNSVRGSUxFX0RVTVBfRlVOQyBkdW1wX2Z1bmM7CglCT09MIGlzX2dldDsKCXVuaW9uIHsKCQlzdHJ1Y3QgZ2V0ZmlsZV9yZXF1ZXN0IGdldDsKCQlzdHJ1Y3QgcHV0ZmlsZV9yZXF1ZXN0IHB1dDsKCX07CgkvKiBTaXplIG9mIGNhbGxlcl9jb250ZXh0X2RhdGEgd2lsbCBiZQoJICogPENhbGxlcl9yZXFfY29udGV4dF9ieXRlcz4gYnl0ZXMuICBJIGFsaWduZWQgdGhpcyBiZWNhdXNlIEkKCSAqIGFtIHBhcmFub2lkIGFib3V0IHdoYXQgaGFwcGVucyB3aGVuIGFuIGFyYml0cmFyeSBkYXRhCgkgKiBzdHJ1Y3R1cmUgd2l0aCB1bmtub3duIGFsaWdubWVudCByZXF1aXJlbWVudHMgZ2V0cyBjb3BpZWQKCSAqIGhlcmUuICBJIHdhbnQgY2FsbGVyX2NvbnRleHRfZGF0YSB0byBiZSBhbGlnbmVkIHRvIHRoZQoJICogY29hcnNlc3QgcG9zc2libGUgYWxpZ25tZW50IGJvdW5kYXJ5IHRoYXQgY291bGQgYmUgcmVxdWlyZWQKCSAqIGZvciBhbnkgdXNlciBkYXRhIHN0cnVjdHVyZS4KCSAqLwoJdTggY2FsbGVyX2NvbnRleHRfZGF0YVsxXSBfX2FsaWduZWQoc2l6ZW9mKHVsb25nMikpOwp9OwoKLyoKICogTGlua3MgdGhlIGFueV9yZXF1ZXN0IGludG8gdGhlIGdsb2JhbCBsaXN0IG9mIGFsbG9jYXRlZCByZXF1ZXN0cwogKiAoPFJlcXVlc3RfbGlzdD4pLgogKi8Kc3RhdGljIHZvaWQKdW5pdF90cmFja2luZ19jcmVhdGUoc3RydWN0IGxpc3RfaGVhZCAqZGV2X2xpc3RfbGluaykKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXNwaW5fbG9ja19pcnFzYXZlKCZSZXF1ZXN0X2xpc3RfbG9jaywgZmxhZ3MpOwoJbGlzdF9hZGQoZGV2X2xpc3RfbGluaywgJlJlcXVlc3RfbGlzdCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZSZXF1ZXN0X2xpc3RfbG9jaywgZmxhZ3MpOwp9CgovKiBVbmxpbmtzIGEgYW55X3JlcXVlc3QgZnJvbSB0aGUgZ2xvYmFsIGxpc3QgKDxSZXF1ZXN0X2xpc3Q+KS4KICovCnN0YXRpYyB2b2lkCnVuaXRfdHJhY2tpbmdfZGVzdHJveShzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfbGlzdF9saW5rKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJc3Bpbl9sb2NrX2lycXNhdmUoJlJlcXVlc3RfbGlzdF9sb2NrLCBmbGFncyk7CglsaXN0X2RlbChkZXZfbGlzdF9saW5rKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlJlcXVlc3RfbGlzdF9sb2NrLCBmbGFncyk7Cn0KCi8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYW5kIHJldHVybiBhIG5ldyBhbnlfcmVxdWVzdCBzdHJ1Y3QsIGFuZAogKiBsaW5rIGl0IHRvIHRoZSBnbG9iYWwgbGlzdCBvZiBvdXRzdGFuZGluZyByZXF1ZXN0cy4KICovCnN0YXRpYyBzdHJ1Y3QgYW55X3JlcXVlc3QgKgphbGxvY19yZXF1ZXN0KGNoYXIgKmZuLCBpbnQgbG4pCnsKCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBhbnlfcmVxdWVzdCAqKQoJICAgICh2aXNvcmNoaXBzZXRfY2FjaGVfYWxsb2MoUmVxdWVzdF9tZW1vcnlfcG9vbCwKCQkJCSAgICAgIEZBTFNFLAoJCQkJICAgICAgZm4sIGxuKSk7CglpZiAoIXJlcSkKCQlyZXR1cm4gTlVMTDsKCW1lbXNldChyZXEsIDAsIHNpemVvZihzdHJ1Y3QgYW55X3JlcXVlc3QpICsgQ2FsbGVyX3JlcV9jb250ZXh0X2J5dGVzKTsKCXVuaXRfdHJhY2tpbmdfY3JlYXRlKCZyZXEtPnJlcV9saXN0KTsKCXJldHVybiByZXE7Cn0KCi8qIEJvb2stZW5kIGZvciBhbGxvY19yZXF1ZXN0KCkuCiAqLwpzdGF0aWMgdm9pZApmcmVlX3JlcXVlc3Qoc3RydWN0IGFueV9yZXF1ZXN0ICpyZXEsIGNoYXIgKmZuLCBpbnQgbG4pCnsKCXVuaXRfdHJhY2tpbmdfZGVzdHJveSgmcmVxLT5yZXFfbGlzdCk7Cgl2aXNvcmNoaXBzZXRfY2FjaGVfZnJlZShSZXF1ZXN0X21lbW9yeV9wb29sLCByZXEsIGZuLCBsbik7Cn0KCi8qIENvbnN0cnVjdG9yIGZvciBmaWxleGZlci5vLgogKi8KaW50CmZpbGV4ZmVyX2NvbnN0cnVjdG9yKHNpemVfdCByZXFfY29udGV4dF9ieXRlcykKewoJaW50IHJjID0gLTE7CgoJQ2FsbGVyX3JlcV9jb250ZXh0X2J5dGVzID0gcmVxX2NvbnRleHRfYnl0ZXM7CglSZXF1ZXN0X21lbW9yeV9wb29sID0KCSAgICBrbWVtX2NhY2hlX2NyZWF0ZShSZXF1ZXN0X21lbW9yeV9wb29sX25hbWUsCgkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYW55X3JlcXVlc3QpICsKCQkJICAgICAgQ2FsbGVyX3JlcV9jb250ZXh0X2J5dGVzLAoJCQkgICAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOwoJaWYgKCFSZXF1ZXN0X21lbW9yeV9wb29sKSB7CgkJTE9HRVJSKCJmYWlsZWQgdG8gYWxsb2MgUmVxdWVzdF9tZW1vcnlfcG9vbCIpOwoJCXJjID0gLUVOT01FTTsKCQlnb3RvIEF3YXk7Cgl9CglyYyA9IDA7CkF3YXk6CglpZiAocmMgPCAwKSB7CgkJaWYgKFJlcXVlc3RfbWVtb3J5X3Bvb2wpIHsKCQkJa21lbV9jYWNoZV9kZXN0cm95KFJlcXVlc3RfbWVtb3J5X3Bvb2wpOwoJCQlSZXF1ZXN0X21lbW9yeV9wb29sID0gTlVMTDsKCQl9Cgl9CglyZXR1cm4gcmM7Cn0KCi8qIERlc3RydWN0b3IgZm9yIGZpbGV4ZmVyLm8uCiAqLwp2b2lkCmZpbGV4ZmVyX2Rlc3RydWN0b3Iodm9pZCkKewoJaWYgKFJlcXVlc3RfbWVtb3J5X3Bvb2wpIHsKCQlrbWVtX2NhY2hlX2Rlc3Ryb3koUmVxdWVzdF9tZW1vcnlfcG9vbCk7CgkJUmVxdWVzdF9tZW1vcnlfcG9vbCA9IE5VTEw7Cgl9Cn0KCi8qIFRoaXMgZnVuY3Rpb24gd2lsbCBvYnRhaW4gYW4gYXZhaWxhYmxlIGNodW5rIGZyb20gdGhlIGNvbnRyb2x2bSBwYXlsb2FkIGFyZWEsCiAqIHN0b3JlIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBjaHVuayBpbiA8YWN0dWFsX3NpemU+LCBhbmQgcmV0dXJuIGEgcG9pbnRlcgogKiB0byB0aGUgY2h1bmsuICBUaGUgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBzcGFyZmlsZXhmZXIgZHJpdmVyLCB3aGljaCBjYWxscwogKiBpdCB3aGVuZXZlciBwYXlsb2FkIHNwYWNlIGlzIHJlcXVpcmVkIHRvIGNvcHkgZmlsZSBkYXRhIGludG8uCiAqLwpzdGF0aWMgdm9pZCAqCmdldF9lbXB0eV9idWNrZXRfZm9yX2dldGZpbGVfZGF0YSh2b2lkICpjb250ZXh0LAoJCQkJICB1bG9uZyBtaW5fc2l6ZSwgdWxvbmcgbWF4X3NpemUsCgkJCQkgIHVsb25nICphY3R1YWxfc2l6ZSkKewoJdm9pZCAqYnVja2V0OwoJc3RydWN0IGFueV9yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IGFueV9yZXF1ZXN0ICopIGNvbnRleHQ7CgoJaWYgKCFyZXEtPmlzX2dldCkgewoJCUxPR0VSUigiJXMgLSB1bmV4cGVjdGVkIGNhbGwiLCBfX2Z1bmNfXyk7CgkJcmV0dXJuIE5VTEw7Cgl9CglidWNrZXQgPSAoKnJlcS0+Z2V0LmdldF9jb250aWd1b3VzX2NvbnRyb2x2bV9wYXlsb2FkKQoJICAgIChtaW5fc2l6ZSwgbWF4X3NpemUsIGFjdHVhbF9zaXplKTsKCWlmIChidWNrZXQgIT0gTlVMTCkgewoJCWF0b21pY19pbmMoJnJlcS0+Z2V0LmJ1ZmZlcnNfaW5fdXNlKTsKCQlEQkdJTkYoIiVzIC0gc2VudCAlbHUtYnl0ZSBidWZmZXIiLCBfX2Z1bmNfXywgKmFjdHVhbF9zaXplKTsKCX0KCXJldHVybiBidWNrZXQ7Cn0KCi8qIFRoaXMgZnVuY3Rpb24gd2lsbCBzZW5kIGEgY29udHJvbHZtIHJlc3BvbnNlIHdpdGggZGF0YSBpbiB0aGUgcGF5bG9hZAogKiAod2hvc2Ugc3BhY2Ugd2FzIG9idGFpbmVkIHdpdGggZ2V0X2VtcHR5X2J1Y2tldF9mb3JfZ2V0ZmlsZV9kYXRhKS4gIFRoZQogKiBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gdGhlIHNwYXJmaWxleGZlciBkcml2ZXIsIHdoaWNoIGNhbGxzIGl0IHdoZW5ldmVyIGl0CiAqIHdhbnRzIHRvIHNlbmQgZmlsZSBkYXRhIGJhY2sgYWNyb3NzIHRoZSBjb250cm9sdm0gY2hhbm5lbC4KICovCnN0YXRpYyBpbnQKc2VuZF9mdWxsX2dldGZpbGVfZGF0YV9idWNrZXQodm9pZCAqY29udGV4dCwgdm9pZCAqYnVja2V0LAoJCQkgICAgICB1bG9uZyBidWNrZXRfYWN0dWFsX3NpemUsIHVsb25nIGJ1Y2tldF91c2VkX3NpemUpCnsKCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBhbnlfcmVxdWVzdCAqKSBjb250ZXh0OwoKCWlmICghcmVxLT5pc19nZXQpIHsKCQlMT0dFUlIoIiVzIC0gdW5leHBlY3RlZCBjYWxsIiwgX19mdW5jX18pOwoJCXJldHVybiAwOwoJfQoJREJHSU5GKCJzZW5kaW5nIGJ1ZmZlciBmb3IgJWx1LyVsdSIsCgkgICAgICAgYnVja2V0X3VzZWRfc2l6ZSwgYnVja2V0X2FjdHVhbF9zaXplKTsKCWlmICghKCpyZXEtPmdldC5jb250cm9sdm1fcmVzcG9uZF93aXRoX3BheWxvYWQpCgkgICAgKCZyZXEtPmdldC5jb250cm9sdm1faGVhZGVyLAoJICAgICByZXEtPmZpbGVfcmVxdWVzdF9udW1iZXIsCgkgICAgIHJlcS0+ZGF0YV9zZXF1ZW5jZV9udW1iZXIrKywKCSAgICAgMCwgYnVja2V0LCBidWNrZXRfYWN0dWFsX3NpemUsIGJ1Y2tldF91c2VkX3NpemUsIFRSVUUpKQoJCWF0b21pY19kZWMoJnJlcS0+Z2V0LmJ1ZmZlcnNfaW5fdXNlKTsKCXJldHVybiAwOwp9CgovKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VuZCBhIGNvbnRyb2x2bSByZXNwb25zZSBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgYQogKiBHRVRGSUxFIHRyYW5zZmVyLiAgVGhlIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byB0aGUgc3BhcmZpbGV4ZmVyIGRyaXZlci4KICovCnN0YXRpYyB2b2lkCnNlbmRfZW5kX29mX2dldGZpbGVfZGF0YSh2b2lkICpjb250ZXh0LCBpbnQgc3RhdHVzKQp7CglzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcSA9IChzdHJ1Y3QgYW55X3JlcXVlc3QgKikgY29udGV4dDsKCWlmICghcmVxLT5pc19nZXQpIHsKCQlMT0dFUlIoIiVzIC0gdW5leHBlY3RlZCBjYWxsIiwgX19mdW5jX18pOwoJCXJldHVybjsKCX0KCUxPR0lORigic3RhdHVzPSVkIiwgc3RhdHVzKTsKCSgqcmVxLT5nZXQuY29udHJvbHZtX3Jlc3BvbmRfd2l0aF9wYXlsb2FkKQoJICAgICgmcmVxLT5nZXQuY29udHJvbHZtX2hlYWRlciwKCSAgICAgcmVxLT5maWxlX3JlcXVlc3RfbnVtYmVyLAoJICAgICByZXEtPmRhdGFfc2VxdWVuY2VfbnVtYmVyKyssIHN0YXR1cywgTlVMTCwgMCwgMCwgRkFMU0UpOwoJZnJlZV9yZXF1ZXN0KHJlcSwgX19GSUxFX18sIF9fTElORV9fKTsKCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwp9CgovKiBUaGlzIGZ1bmN0aW9uIHN1cHBsaWVzIGRhdGEgZm9yIGEgUFVURklMRSB0cmFuc2Zlci4KICogVGhlIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byB0aGUgc3BhcmZpbGV4ZmVyIGRyaXZlci4KICovCnN0YXRpYyBpbnQKZ2V0X3B1dGZpbGVfZGF0YSh2b2lkICpjb250ZXh0LCB2b2lkICpwYnVmLCBzaXplX3QgYnVmc2l6ZSwKCQkgQk9PTCBidWZfaXNfdXNlcnNwYWNlLCBzaXplX3QgKmJ5dGVzX3RyYW5zZmVycmVkKQp7CglzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcSA9IChzdHJ1Y3QgYW55X3JlcXVlc3QgKikgY29udGV4dDsKCWlmIChyZXEtPmlzX2dldCkgewoJCUxPR0VSUigiJXMgLSB1bmV4cGVjdGVkIGNhbGwiLCBfX2Z1bmNfXyk7CgkJcmV0dXJuIC0xOwoJfQoJcmV0dXJuICgqcmVxLT5wdXQuZ2V0X2NvbnRyb2x2bV9maWxlZGF0YSkgKCZyZXEtPmNhbGxlcl9jb250ZXh0X2RhdGFbMF0sCgkJCQkJCSAgIHBidWYsIGJ1ZnNpemUsCgkJCQkJCSAgIGJ1Zl9pc191c2Vyc3BhY2UsCgkJCQkJCSAgIGJ5dGVzX3RyYW5zZmVycmVkKTsKfQoKLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiBhIFBVVEZJTEUgdHJhbnNmZXIuCiAqIFRoZSBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gdGhlIHNwYXJmaWxleGZlciBkcml2ZXIuCiAqLwpzdGF0aWMgdm9pZAplbmRfcHV0ZmlsZSh2b2lkICpjb250ZXh0LCBpbnQgc3RhdHVzKQp7CglzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcSA9IChzdHJ1Y3QgYW55X3JlcXVlc3QgKikgY29udGV4dDsKCWlmIChyZXEtPmlzX2dldCkgewoJCUxPR0VSUigiJXMgLSB1bmV4cGVjdGVkIGNhbGwiLCBfX2Z1bmNfXyk7CgkJcmV0dXJuOwoJfQoJKCpyZXEtPnB1dC5jb250cm9sdm1fZW5kX3B1dEZpbGUpICgmcmVxLT5jYWxsZXJfY29udGV4dF9kYXRhWzBdLAoJCQkJCSAgIHN0YXR1cyk7CglmcmVlX3JlcXVlc3QocmVxLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Cn0KCi8qIFJlZmVyIHRvIGZpbGV4ZmVyLmggZm9yIGRlc2NyaXB0aW9uLiAqLwpCT09MCmZpbGV4ZmVyX2dldEZpbGUoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIsCgkJIHVsb25nMiBmaWxlX3JlcXVlc3RfbnVtYmVyLAoJCSB1aW50IHVwbGlua19pbmRleCwKCQkgdWludCBkaXNrX2luZGV4LAoJCSBjaGFyICpmaWxlX25hbWUsCgkJIEdFVF9DT05USUdVT1VTX0NPTlRST0xWTV9QQVlMT0FEX0ZVTkMKCQkgZ2V0X2NvbnRpZ3VvdXNfY29udHJvbHZtX3BheWxvYWQsCgkJIENPTlRST0xWTV9SRVNQT05EX1dJVEhfUEFZTE9BRF9GVU5DCgkJIGNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZCwKCQkgVFJBTlNNSVRGSUxFX0RVTVBfRlVOQyBkdW1wX2Z1bmMpCnsKCUJPT0wgdXNlX2NvdW50X3VwID0gRkFMU0U7CglCT09MIGZhaWxlZCA9IFRSVUU7CglzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcSA9IGFsbG9jX3JlcXVlc3QoX19GSUxFX18sIF9fTElORV9fKTsKCglpZiAoIXJlcSkgewoJCUxPR0VSUigiYWxsb2NhdGlvbiBvZiBhbnlfcmVxdWVzdCBmYWlsZWQiKTsKCQlnb3RvIEF3YXk7Cgl9CgkvKiBXZSBuZWVkIHRvIGluY3JlbWVudCB0aGlzIG1vZHVsZSdzIHVzZSBjb3VudCBiZWNhdXNlIHdlJ3JlIGhhbmRpbmcKCSAqIG9mZiBwb2ludGVycyB0byBmdW5jdGlvbnMgd2l0aGluIHRoaXMgbW9kdWxlIHRvIGJlIHVzZWQgYnkKCSAqIGFub3RoZXIgbW9kdWxlLgoJICovCglfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwoJdXNlX2NvdW50X3VwID0gVFJVRTsKCXJlcS0+aXNfZ2V0ID0gVFJVRTsKCXJlcS0+ZmlsZV9yZXF1ZXN0X251bWJlciA9IGZpbGVfcmVxdWVzdF9udW1iZXI7CglyZXEtPmRhdGFfc2VxdWVuY2VfbnVtYmVyID0gMDsKCXJlcS0+ZHVtcF9mdW5jID0gZHVtcF9mdW5jOwoJcmVxLT5nZXQuY29udHJvbHZtX2hlYWRlciA9ICptc2dIZHI7CglhdG9taWNfc2V0KCZyZXEtPmdldC5idWZmZXJzX2luX3VzZSwgMCk7CglyZXEtPmdldC5nZXRfY29udGlndW91c19jb250cm9sdm1fcGF5bG9hZCA9CgkgICAgZ2V0X2NvbnRpZ3VvdXNfY29udHJvbHZtX3BheWxvYWQ7CglyZXEtPmdldC5jb250cm9sdm1fcmVzcG9uZF93aXRoX3BheWxvYWQgPQoJICAgIGNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZDsKCWlmIChzcGFyZmlsZXhmZXJfbG9jYWwycmVtb3RlKHJlcSwJLyogY29udGV4dCwgcGFzc2VkIHRvCgkJCQkJCSAqIGNhbGxiYWNrIGZ1bmNzICovCgkJCQkgICAgICBmaWxlX25hbWUsCgkJCQkgICAgICBmaWxlX3JlcXVlc3RfbnVtYmVyLAoJCQkJICAgICAgdXBsaW5rX2luZGV4LAoJCQkJICAgICAgZGlza19pbmRleCwKCQkJCSAgICAgIGdldF9lbXB0eV9idWNrZXRfZm9yX2dldGZpbGVfZGF0YSwKCQkJCSAgICAgIHNlbmRfZnVsbF9nZXRmaWxlX2RhdGFfYnVja2V0LAoJCQkJICAgICAgc2VuZF9lbmRfb2ZfZ2V0ZmlsZV9kYXRhKSA8IDApIHsKCQlMT0dFUlIoInNwYXJmaWxleGZlcl9sb2NhbDJyZW1vdGUgZmFpbGVkIik7CgkJZ290byBBd2F5OwoJfQoJZmFpbGVkID0gRkFMU0U7CkF3YXk6CglpZiAoZmFpbGVkKSB7CgkJaWYgKHVzZV9jb3VudF91cCkgewoJCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKCQkJdXNlX2NvdW50X3VwID0gRkFMU0U7CgkJfQoJCWlmIChyZXEpIHsKCQkJZnJlZV9yZXF1ZXN0KHJlcSwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmVxID0gTlVMTDsKCQl9CgkJcmV0dXJuIEZBTFNFOwoJfSBlbHNlIHsKCQlyZXR1cm4gVFJVRTsKCQkvKiBzdWNjZXNzOyBzZW5kIGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCBmb3IgcmVzcG9uc2VzICovCgl9Cn0KCi8qIFJlZmVyIHRvIGZpbGV4ZmVyLmggZm9yIGRlc2NyaXB0aW9uLiAqLwp2b2lkICoKZmlsZXhmZXJfcHV0RmlsZShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKCQkgdWxvbmcyIGZpbGVfcmVxdWVzdF9udW1iZXIsCgkJIHVpbnQgdXBsaW5rX2luZGV4LAoJCSB1aW50IGRpc2tfaW5kZXgsCgkJIGNoYXIgKmZpbGVfbmFtZSwKCQkgVFJBTlNNSVRGSUxFX0lOSVRfQ09OVEVYVF9GVU5DIGluaXRfY29udGV4dCwKCQkgR0VUX0NPTlRST0xWTV9GSUxFREFUQV9GVU5DIGdldF9jb250cm9sdm1fZmlsZWRhdGEsCgkJIENPTlRST0xWTV9SRVNQT05EX0ZVTkMgY29udHJvbHZtX2VuZF9wdXRGaWxlLAoJCSBUUkFOU01JVEZJTEVfRFVNUF9GVU5DIGR1bXBfZnVuYykKewoJQk9PTCB1c2VfY291bnRfdXAgPSBGQUxTRTsKCUJPT0wgZmFpbGVkID0gVFJVRTsKCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxID0gYWxsb2NfcmVxdWVzdChfX0ZJTEVfXywgX19MSU5FX18pOwoJdm9pZCAqY2FsbGVyX2N0eCA9IE5VTEw7CgoJaWYgKCFyZXEpIHsKCQlMT0dFUlIoImFsbG9jYXRpb24gb2YgYW55X3JlcXVlc3QgZmFpbGVkIik7CgkJZ290byBBd2F5OwoJfQoJY2FsbGVyX2N0eCA9ICh2b2lkICopICgmKHJlcS0+Y2FsbGVyX2NvbnRleHRfZGF0YVswXSkpOwoJLyogV2UgbmVlZCB0byBpbmNyZW1lbnQgdGhpcyBtb2R1bGUncyB1c2UgY291bnQgYmVjYXVzZSB3ZSdyZSBoYW5kaW5nCgkgKiBvZmYgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdpdGhpbiB0aGlzIG1vZHVsZSB0byBiZSB1c2VkIGJ5CgkgKiBhbm90aGVyIG1vZHVsZS4KCSAqLwoJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKCXVzZV9jb3VudF91cCA9IFRSVUU7CglyZXEtPmlzX2dldCA9IEZBTFNFOwoJcmVxLT5maWxlX3JlcXVlc3RfbnVtYmVyID0gZmlsZV9yZXF1ZXN0X251bWJlcjsKCXJlcS0+ZGF0YV9zZXF1ZW5jZV9udW1iZXIgPSAwOwoJcmVxLT5kdW1wX2Z1bmMgPSBkdW1wX2Z1bmM7CglyZXEtPnB1dC5nZXRfY29udHJvbHZtX2ZpbGVkYXRhID0gZ2V0X2NvbnRyb2x2bV9maWxlZGF0YTsKCXJlcS0+cHV0LmNvbnRyb2x2bV9lbmRfcHV0RmlsZSA9IGNvbnRyb2x2bV9lbmRfcHV0RmlsZTsKCSgqaW5pdF9jb250ZXh0KSAoY2FsbGVyX2N0eCwgbXNnSGRyLCBmaWxlX3JlcXVlc3RfbnVtYmVyKTsKCWlmIChzcGFyZmlsZXhmZXJfcmVtb3RlMmxvY2FsKHJlcSwJLyogY29udGV4dCwgcGFzc2VkIHRvCgkJCQkJCSAqIGNhbGxiYWNrIGZ1bmNzICovCgkJCQkgICAgICBmaWxlX25hbWUsCgkJCQkgICAgICBmaWxlX3JlcXVlc3RfbnVtYmVyLAoJCQkJICAgICAgdXBsaW5rX2luZGV4LAoJCQkJICAgICAgZGlza19pbmRleCwKCQkJCSAgICAgIGdldF9wdXRmaWxlX2RhdGEsIGVuZF9wdXRmaWxlKSA8IDApIHsKCQlMT0dFUlIoInNwYXJmaWxleGZlcl9yZW1vdGUybG9jYWwgZmFpbGVkIik7CgkJZ290byBBd2F5OwoJfQoJZmFpbGVkID0gRkFMU0U7CkF3YXk6CglpZiAoZmFpbGVkKSB7CgkJaWYgKHVzZV9jb3VudF91cCkgewoJCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKCQkJdXNlX2NvdW50X3VwID0gRkFMU0U7CgkJfQoJCWlmIChyZXEpIHsKCQkJZnJlZV9yZXF1ZXN0KHJlcSwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmVxID0gTlVMTDsKCQl9CgkJcmV0dXJuIE5VTEw7Cgl9IGVsc2UgewoJCXJldHVybiBjYWxsZXJfY3R4OwoJCS8qIHN1Y2Nlc3M7IGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCBmb3IgcmVzcG9uc2VzICovCgl9Cn0KCnN0YXRpYyB2b2lkCmR1bXBfZ2V0X3JlcXVlc3Qoc3RydWN0IHNlcV9maWxlICpmLCBzdHJ1Y3QgZ2V0ZmlsZV9yZXF1ZXN0ICpnZXRyZXEpCnsKCXNlcV9wcmludGYoZiwgIiAgYnVmZmVyc19pbl91c2U9JWRcbiIsCgkJICAgYXRvbWljX3JlYWQoJmdldHJlcS0+YnVmZmVyc19pbl91c2UpKTsKfQoKc3RhdGljIHZvaWQKZHVtcF9wdXRfcmVxdWVzdChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHN0cnVjdCBwdXRmaWxlX3JlcXVlc3QgKnB1dHJlcSkKewp9CgpzdGF0aWMgdm9pZApkdW1wX3JlcXVlc3Qoc3RydWN0IHNlcV9maWxlICpmLCBzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcSkKewoJc2VxX3ByaW50ZihmLCAiKiAlcyBpZD0lbGx1IHNlcT0lbGx1XG4iLAoJCSAgICgocmVxLT5pc19nZXQpID8gIkdldCIgOiAiUHV0IiksCgkJICAgcmVxLT5maWxlX3JlcXVlc3RfbnVtYmVyLCByZXEtPmRhdGFfc2VxdWVuY2VfbnVtYmVyKTsKCWlmIChyZXEtPmlzX2dldCkKCQlkdW1wX2dldF9yZXF1ZXN0KGYsICZyZXEtPmdldCk7CgllbHNlCgkJZHVtcF9wdXRfcmVxdWVzdChmLCAmcmVxLT5wdXQpOwoJaWYgKHJlcS0+ZHVtcF9mdW5jKQoJCSgqcmVxLT5kdW1wX2Z1bmMpIChmLCAmKHJlcS0+Y2FsbGVyX2NvbnRleHRfZGF0YVswXSksICIgICIpOwp9Cgp2b2lkCmZpbGV4ZmVyX2R1bXAoc3RydWN0IHNlcV9maWxlICpmKQp7Cgl1bG9uZyBmbGFnczsKCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwoKCXNlcV9wdXRzKGYsICJPdXRzdGFuZGluZyBUUkFOU01JVF9GSUxFIHJlcXVlc3RzOlxuIik7CglzcGluX2xvY2tfaXJxc2F2ZSgmUmVxdWVzdF9saXN0X2xvY2ssIGZsYWdzKTsKCWxpc3RfZm9yX2VhY2goZW50cnksICZSZXF1ZXN0X2xpc3QpIHsKCQlzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcTsKCQlyZXEgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgYW55X3JlcXVlc3QsIHJlcV9saXN0KTsKCQlkdW1wX3JlcXVlc3QoZiwgcmVxKTsKCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlJlcXVlc3RfbGlzdF9sb2NrLCBmbGFncyk7Cn0KCiNlbHNlCQkJCS8qIGlmZGVmIEVOQUJMRV9TUEFSRklMRVhGRVIgKi8KaW50CmZpbGV4ZmVyX2NvbnN0cnVjdG9yKHNpemVfdCByZXFfY29udGV4dF9ieXRlcykKewoJcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCn0KCnZvaWQKZmlsZXhmZXJfZGVzdHJ1Y3Rvcih2b2lkKQp7Cn0KCkJPT0wKZmlsZXhmZXJfZ2V0RmlsZShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKCQkgdTY0IGZpbGVfcmVxdWVzdF9udW1iZXIsCgkJIHVpbnQgdXBsaW5rX2luZGV4LAoJCSB1aW50IGRpc2tfaW5kZXgsCgkJIGNoYXIgKmZpbGVfbmFtZSwKCQkgR0VUX0NPTlRJR1VPVVNfQ09OVFJPTFZNX1BBWUxPQURfRlVOQwoJCSBnZXRfY29udGlndW91c19jb250cm9sdm1fcGF5bG9hZCwKCQkgQ09OVFJPTFZNX1JFU1BPTkRfV0lUSF9QQVlMT0FEX0ZVTkMKCQkgY29udHJvbHZtX3Jlc3BvbmRfd2l0aF9wYXlsb2FkLAoJCSBUUkFOU01JVEZJTEVfRFVNUF9GVU5DIGR1bXBfZnVuYykKewoJLyogc2luY2Ugbm8gc3BhcmZpbGV4ZmVyIG1vZHVsZSBleGlzdHMgdG8gY2FsbCwgd2UganVzdCBmYWlsICovCglyZXR1cm4gRkFMU0U7Cn0KCnZvaWQgKgpmaWxleGZlcl9wdXRGaWxlKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLAoJCSB1NjQgZmlsZV9yZXF1ZXN0X251bWJlciwKCQkgdWludCB1cGxpbmtfaW5kZXgsCgkJIHVpbnQgZGlza19pbmRleCwKCQkgY2hhciAqZmlsZV9uYW1lLAoJCSBUUkFOU01JVEZJTEVfSU5JVF9DT05URVhUX0ZVTkMgaW5pdF9jb250ZXh0LAoJCSBHRVRfQ09OVFJPTFZNX0ZJTEVEQVRBX0ZVTkMgZ2V0X2NvbnRyb2x2bV9maWxlZGF0YSwKCQkgQ09OVFJPTFZNX1JFU1BPTkRfRlVOQyBjb250cm9sdm1fZW5kX3B1dEZpbGUsCgkJIFRSQU5TTUlURklMRV9EVU1QX0ZVTkMgZHVtcF9mdW5jKQp7CgkvKiBzaW5jZSBubyBzcGFyZmlsZXhmZXIgbW9kdWxlIGV4aXN0cyB0byBjYWxsLCB3ZSBqdXN0IGZhaWwgKi8KCXJldHVybiBOVUxMOwp9Cgp2b2lkCmZpbGV4ZmVyX2R1bXAoc3RydWN0IHNlcV9maWxlICpmKQp7Cn0KCiNlbmRpZgkJCQkvKiBpZmRlZiBFTkFCTEVfU1BBUkZJTEVYRkVSICovCg==