LyokVCBodHRwZC5jIEdDIDEuMTM4IDExLzE3LzA3IDEzOjEwOjIyICovDQoNCi8qDQogKiBcYWRkdG9ncm91cCBhcHBzIEB7IKMNCiAqIFxkZWZncm91cCBodHRwZCBXZWIgc2VydmVyIEB7IFRoZSB1SVAgd2ViIHNlcnZlciBpcyBhIHZlcnkgc2ltcGxpc3RpYw0KICogaW1wbGVtZW50YXRpb24gb2YgYW4gSFRUUCBzZXJ2ZXIuIEl0IGNhbiBzZXJ2ZSB3ZWIgcGFnZXMgYW5kIGZpbGVzIGZyb20gYQ0KICogcmVhZC1vbmx5IFJPTSBmaWxlc3lzdGVtLCBhbmQgcHJvdmlkZXMgYSB2ZXJ5IHNtYWxsIHNjcmlwdGluZyBsYW5ndWFnZS4gow0KICogXGZpbGUgV2ViIHNlcnZlciBcYXV0aG9yIEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPiCjDQogKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEFkYW0gRHVua2Vscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gUmVkaXN0cmlidXRpb24gYW5kIHVzZQ0KICogaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQNCiAqIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UNCiAqIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUNCiAqIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlDQogKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluDQogKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gMy4NCiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQNCiAqIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljDQogKiBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQNCiAqIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQNCiAqIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQ0KICogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SDQogKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwNCiAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQNCiAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUw0KICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4NCiAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcNCiAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQ0KICogT0YgU1VDSCBEQU1BR0UuIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSB1SVAgVENQL0lQIHN0YWNrLiBBdXRob3I6IEFkYW0gRHVua2Vscw0KICogPGFkYW1Ac2ljcy5zZT4gJElkOiBodHRwZC5jLHYgMS4yIDIwMDYvMDYvMTEgMjE6NDY6MzggYWRhbSBFeHAgJA0KICovDQojaW5jbHVkZSAidWlwLmgiDQojaW5jbHVkZSAiaHR0cGQuaCINCiNpbmNsdWRlICJodHRwZC1mcy5oIg0KI2luY2x1ZGUgImh0dHBkLWNnaS5oIg0KI2luY2x1ZGUgImh0dHAtc3RyaW5ncy5oIg0KDQojaW5jbHVkZSA8c3RyaW5nLmg+DQoNCiNkZWZpbmUgU1RBVEVfV0FJVElORwkwDQojZGVmaW5lIFNUQVRFX09VVFBVVAkxDQoNCiNkZWZpbmUgSVNPX25sCQkJMHgwYQ0KI2RlZmluZSBJU09fc3BhY2UJCTB4MjANCiNkZWZpbmUgSVNPX2JhbmcJCTB4MjENCiNkZWZpbmUgSVNPX3BlcmNlbnQJCTB4MjUNCiNkZWZpbmUgSVNPX3BlcmlvZAkJMHgyZQ0KI2RlZmluZSBJU09fc2xhc2gJCTB4MmYNCiNkZWZpbmUgSVNPX2NvbG9uCQkweDNhDQoNCi8qDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICovDQpzdGF0aWMgdW5zaWduZWQgc2hvcnQgZ2VuZXJhdGVfcGFydF9vZl9maWxlKHZvaWQgKnN0YXRlKQ0Kew0KCS8qfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4qLw0KCXN0cnVjdCBodHRwZF9zdGF0ZQkqcyA9IChzdHJ1Y3QgaHR0cGRfc3RhdGUgKikgc3RhdGU7DQoJLyp+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiovDQoNCglpZihzLT5maWxlLmxlbiA+IHVpcF9tc3MoKSkNCgl7DQoJCXMtPmxlbiA9IHVpcF9tc3MoKTsNCgl9DQoJZWxzZQ0KCXsNCgkJcy0+bGVuID0gcy0+ZmlsZS5sZW47DQoJfQ0KDQoJbWVtY3B5KHVpcF9hcHBkYXRhLCBzLT5maWxlLmRhdGEsIHMtPmxlbik7DQoNCglyZXR1cm4gcy0+bGVuOw0KfQ0KDQovKg0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqLw0Kc3RhdGljIFBUX1RIUkVBRChzZW5kX2ZpbGUgKHN0cnVjdCBodHRwZF9zdGF0ZSAqcykpDQp7DQoJUFNPQ0tfQkVHSU4oJnMtPnNvdXQpOw0KDQoJZG8NCgl7DQoJCVBTT0NLX0dFTkVSQVRPUl9TRU5EKCZzLT5zb3V0LCBnZW5lcmF0ZV9wYXJ0X29mX2ZpbGUsIHMpOw0KCQlzLT5maWxlLmxlbiAtPSBzLT5sZW47DQoJCXMtPmZpbGUuZGF0YSArPSBzLT5sZW47DQoJfSB3aGlsZShzLT5maWxlLmxlbiA+IDApOw0KDQoJUFNPQ0tfRU5EKCZzLT5zb3V0KTsNCn0NCg0KLyoNCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKi8NCnN0YXRpYyBQVF9USFJFQUQoc2VuZF9wYXJ0X29mX2ZpbGUgKHN0cnVjdCBodHRwZF9zdGF0ZSAqcykpDQp7DQoJUFNPQ0tfQkVHSU4oJnMtPnNvdXQpOw0KDQoJUFNPQ0tfU0VORCgmcy0+c291dCwgcy0+ZmlsZS5kYXRhLCBzLT5sZW4pOw0KDQoJUFNPQ0tfRU5EKCZzLT5zb3V0KTsNCn0NCg0KLyoNCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKi8NCnN0YXRpYyB2b2lkIG5leHRfc2NyaXB0c3RhdGUoc3RydWN0IGh0dHBkX3N0YXRlICpzKQ0Kew0KCS8qfn5+fn5+fiovDQoJY2hhcgkqcDsNCgkvKn5+fn5+fn4qLw0KDQoJcCA9IHN0cmNocihzLT5zY3JpcHRwdHIsIElTT19ubCkgKyAxOw0KCXMtPnNjcmlwdGxlbiAtPSAodW5zaWduZWQgc2hvcnQpIChwIC0gcy0+c2NyaXB0cHRyKTsNCglzLT5zY3JpcHRwdHIgPSBwOw0KfQ0KDQovKg0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqLw0Kc3RhdGljIFBUX1RIUkVBRChoYW5kbGVfc2NyaXB0IChzdHJ1Y3QgaHR0cGRfc3RhdGUgKnMpKQ0Kew0KCS8qfn5+fn5+fn5+Ki8NCgljaGFyCSpwdHI7DQoJLyp+fn5+fn5+fn4qLw0KDQoJUFRfQkVHSU4oJnMtPnNjcmlwdHB0KTsNCg0KCXdoaWxlKHMtPmZpbGUubGVuID4gMCkNCgl7DQoJCS8qIENoZWNrIGlmIHdlIHNob3VsZCBzdGFydCBleGVjdXRpbmcgYSBzY3JpcHQuICovDQoJCWlmKCpzLT5maWxlLmRhdGEgPT0gSVNPX3BlcmNlbnQgJiYgKihzLT5maWxlLmRhdGEgKyAxKSA9PSBJU09fYmFuZykNCgkJew0KCQkJcy0+c2NyaXB0cHRyID0gcy0+ZmlsZS5kYXRhICsgMzsNCgkJCXMtPnNjcmlwdGxlbiA9IHMtPmZpbGUubGVuIC0gMzsNCgkJCWlmKCoocy0+c2NyaXB0cHRyIC0gMSkgPT0gSVNPX2NvbG9uKQ0KCQkJew0KCQkJCWh0dHBkX2ZzX29wZW4ocy0+c2NyaXB0cHRyICsgMSwgJnMtPmZpbGUpOw0KCQkJCVBUX1dBSVRfVEhSRUFEKCZzLT5zY3JpcHRwdCwgc2VuZF9maWxlKHMpKTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQlQVF9XQUlUX1RIUkVBRCgmcy0+c2NyaXB0cHQsIGh0dHBkX2NnaShzLT5zY3JpcHRwdHIpIChzLCBzLT5zY3JpcHRwdHIpKTsNCgkJCX0NCg0KCQkJbmV4dF9zY3JpcHRzdGF0ZShzKTsNCg0KCQkJLyoNCgkJCSAqIFRoZSBzY3JpcHQgaXMgb3Zlciwgc28gd2UgcmVzZXQgdGhlIHBvaW50ZXJzIGFuZCBjb250aW51ZSBzZW5kaW5nIHRoZSByZXN0IG9mDQoJCQkgKiB0aGUgZmlsZS4NCgkJCSAqLw0KCQkJcy0+ZmlsZS5kYXRhID0gcy0+c2NyaXB0cHRyOw0KCQkJcy0+ZmlsZS5sZW4gPSBzLT5zY3JpcHRsZW47DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkvKiBTZWUgaWYgd2UgZmluZCB0aGUgc3RhcnQgb2Ygc2NyaXB0IG1hcmtlciBpbiB0aGUgYmxvY2sgb2YgSFRNTCB0byBiZSBzZW50LiAqLw0KCQkJaWYocy0+ZmlsZS5sZW4gPiB1aXBfbXNzKCkpDQoJCQl7DQoJCQkJcy0+bGVuID0gdWlwX21zcygpOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCXMtPmxlbiA9IHMtPmZpbGUubGVuOw0KCQkJfQ0KDQoJCQlpZigqcy0+ZmlsZS5kYXRhID09IElTT19wZXJjZW50KQ0KCQkJew0KCQkJCXB0ciA9IHN0cmNocihzLT5maWxlLmRhdGEgKyAxLCBJU09fcGVyY2VudCk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJcHRyID0gc3RyY2hyKHMtPmZpbGUuZGF0YSwgSVNPX3BlcmNlbnQpOw0KCQkJfQ0KDQoJCQlpZihwdHIgIT0gTlVMTCAmJiBwdHIgIT0gcy0+ZmlsZS5kYXRhKQ0KCQkJew0KCQkJCXMtPmxlbiA9IChpbnQpIChwdHIgLSBzLT5maWxlLmRhdGEpOw0KCQkJCWlmKHMtPmxlbiA+PSB1aXBfbXNzKCkpDQoJCQkJew0KCQkJCQlzLT5sZW4gPSB1aXBfbXNzKCk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlQVF9XQUlUX1RIUkVBRCgmcy0+c2NyaXB0cHQsIHNlbmRfcGFydF9vZl9maWxlKHMpKTsNCgkJCXMtPmZpbGUuZGF0YSArPSBzLT5sZW47DQoJCQlzLT5maWxlLmxlbiAtPSBzLT5sZW47DQoJCX0NCgl9DQoNCglQVF9FTkQoJnMtPnNjcmlwdHB0KTsNCn0NCg0KLyoNCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKi8NCnN0YXRpYyBQVF9USFJFQUQoc2VuZF9oZWFkZXJzIChzdHJ1Y3QgaHR0cGRfc3RhdGUgKnMsIGNvbnN0IGNoYXIgKnN0YXR1c2hkcikpDQp7DQoJLyp+fn5+fn5+fn4qLw0KCWNoYXIJKnB0cjsNCgkvKn5+fn5+fn5+fiovDQoNCglQU09DS19CRUdJTigmcy0+c291dCk7DQoNCglQU09DS19TRU5EX1NUUigmcy0+c291dCwgc3RhdHVzaGRyKTsNCg0KCXB0ciA9IHN0cnJjaHIocy0+ZmlsZW5hbWUsIElTT19wZXJpb2QpOw0KCWlmKHB0ciA9PSBOVUxMKQ0KCXsNCgkJUFNPQ0tfU0VORF9TVFIoJnMtPnNvdXQsIGh0dHBfY29udGVudF90eXBlX2JpbmFyeSk7DQoJfQ0KCWVsc2UgaWYoc3RybmNtcChodHRwX2h0bWwsIHB0ciwgNSkgPT0gMCB8fCBzdHJuY21wKGh0dHBfc2h0bWwsIHB0ciwgNikgPT0gMCkNCgl7DQoJCVBTT0NLX1NFTkRfU1RSKCZzLT5zb3V0LCBodHRwX2NvbnRlbnRfdHlwZV9odG1sKTsNCgl9DQoJZWxzZSBpZihzdHJuY21wKGh0dHBfY3NzLCBwdHIsIDQpID09IDApDQoJew0KCQlQU09DS19TRU5EX1NUUigmcy0+c291dCwgaHR0cF9jb250ZW50X3R5cGVfY3NzKTsNCgl9DQoJZWxzZSBpZihzdHJuY21wKGh0dHBfcG5nLCBwdHIsIDQpID09IDApDQoJew0KCQlQU09DS19TRU5EX1NUUigmcy0+c291dCwgaHR0cF9jb250ZW50X3R5cGVfcG5nKTsNCgl9DQoJZWxzZSBpZihzdHJuY21wKGh0dHBfZ2lmLCBwdHIsIDQpID09IDApDQoJew0KCQlQU09DS19TRU5EX1NUUigmcy0+c291dCwgaHR0cF9jb250ZW50X3R5cGVfZ2lmKTsNCgl9DQoJZWxzZSBpZihzdHJuY21wKGh0dHBfanBnLCBwdHIsIDQpID09IDApDQoJew0KCQlQU09DS19TRU5EX1NUUigmcy0+c291dCwgaHR0cF9jb250ZW50X3R5cGVfanBnKTsNCgl9DQoJZWxzZQ0KCXsNCgkJUFNPQ0tfU0VORF9TVFIoJnMtPnNvdXQsIGh0dHBfY29udGVudF90eXBlX3BsYWluKTsNCgl9DQoNCglQU09DS19FTkQoJnMtPnNvdXQpOw0KfQ0KDQovKg0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqLw0Kc3RhdGljIFBUX1RIUkVBRChoYW5kbGVfb3V0cHV0IChzdHJ1Y3QgaHR0cGRfc3RhdGUgKnMpKQ0Kew0KCS8qfn5+fn5+fn5+Ki8NCgljaGFyCSpwdHI7DQoJLyp+fn5+fn5+fn4qLw0KDQoJUFRfQkVHSU4oJnMtPm91dHB1dHB0KTsNCg0KCWlmKCFodHRwZF9mc19vcGVuKHMtPmZpbGVuYW1lLCAmcy0+ZmlsZSkpDQoJew0KCQlodHRwZF9mc19vcGVuKGh0dHBfNDA0X2h0bWwsICZzLT5maWxlKTsNCgkJc3RyY3B5KHMtPmZpbGVuYW1lLCBodHRwXzQwNF9odG1sKTsNCgkJUFRfV0FJVF9USFJFQUQoJnMtPm91dHB1dHB0LCBzZW5kX2hlYWRlcnMocywgaHR0cF9oZWFkZXJfNDA0KSk7DQoJCVBUX1dBSVRfVEhSRUFEKCZzLT5vdXRwdXRwdCwgc2VuZF9maWxlKHMpKTsNCgl9DQoJZWxzZQ0KCXsNCgkJUFRfV0FJVF9USFJFQUQoJnMtPm91dHB1dHB0LCBzZW5kX2hlYWRlcnMocywgaHR0cF9oZWFkZXJfMjAwKSk7DQoJCXB0ciA9IHN0cmNocihzLT5maWxlbmFtZSwgSVNPX3BlcmlvZCk7DQoJCWlmKHB0ciAhPSBOVUxMICYmIHN0cm5jbXAocHRyLCBodHRwX3NodG1sLCA2KSA9PSAwKQ0KCQl7DQoJCQl2UHJvY2Vzc0lucHV0KCBzLT5maWxlbmFtZSApOw0KCQkJUFRfSU5JVCgmcy0+c2NyaXB0cHQpOw0KCQkJUFRfV0FJVF9USFJFQUQoJnMtPm91dHB1dHB0LCBoYW5kbGVfc2NyaXB0KHMpKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCVBUX1dBSVRfVEhSRUFEKCZzLT5vdXRwdXRwdCwgc2VuZF9maWxlKHMpKTsNCgkJfQ0KCX0NCg0KCVBTT0NLX0NMT1NFKCZzLT5zb3V0KTsNCglQVF9FTkQoJnMtPm91dHB1dHB0KTsNCn0NCg0KLyoNCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKi8NCnN0YXRpYyBQVF9USFJFQUQoaGFuZGxlX2lucHV0IChzdHJ1Y3QgaHR0cGRfc3RhdGUgKnMpKQ0Kew0KCVBTT0NLX0JFR0lOKCZzLT5zaW4pOw0KDQoJUFNPQ0tfUkVBRFRPKCZzLT5zaW4sIElTT19zcGFjZSk7DQoNCglpZihzdHJuY21wKHMtPmlucHV0YnVmLCBodHRwX2dldCwgNCkgIT0gMCkNCgl7DQoJCVBTT0NLX0NMT1NFX0VYSVQoJnMtPnNpbik7DQoJfQ0KDQoJUFNPQ0tfUkVBRFRPKCZzLT5zaW4sIElTT19zcGFjZSk7DQoNCglpZihzLT5pbnB1dGJ1ZlswXSAhPSBJU09fc2xhc2gpDQoJew0KCQlQU09DS19DTE9TRV9FWElUKCZzLT5zaW4pOw0KCX0NCg0KCWlmKHMtPmlucHV0YnVmWzFdID09IElTT19zcGFjZSkNCgl7DQoJCXN0cm5jcHkocy0+ZmlsZW5hbWUsIGh0dHBfaW5kZXhfaHRtbCwgc2l6ZW9mKHMtPmZpbGVuYW1lKSk7DQoJfQ0KCWVsc2UNCgl7DQoJCXMtPmlucHV0YnVmW1BTT0NLX0RBVEFMRU4oJnMtPnNpbikgLSAxXSA9IDA7DQoNCgkJLyogUHJvY2VzcyBhbnkgZm9ybSBpbnB1dCBiZWluZyBzZW50IHRvIHRoZSBzZXJ2ZXIuICovDQoJCXsNCgkJCS8qDQoJCQkgKiBleHRlcm4gdm9pZCB2QXBwbGljYXRpb25Qcm9jZXNzRm9ybUlucHV0KCBjaGFyICpwY0lucHV0U3RyaW5nLCBsb25nDQoJCQkgKiB4SW5wdXRMZW5ndGggKTsgow0KCQkJICogdkFwcGxpY2F0aW9uUHJvY2Vzc0Zvcm1JbnB1dCggcy0+aW5wdXRidWYsIFBTT0NLX0RBVEFMRU4oJnMtPnNpbikgKTsNCgkJCSAqLw0KCQl9DQoNCgkJc3RybmNweShzLT5maWxlbmFtZSwgJnMtPmlucHV0YnVmWzBdLCBzaXplb2Yocy0+ZmlsZW5hbWUpKTsNCgl9DQoNCgkvKiBodHRwZF9sb2dfZmlsZSh1aXBfY29ubi0+cmlwYWRkciwgcy0+ZmlsZW5hbWUpOyAqLw0KCXMtPnN0YXRlID0gU1RBVEVfT1VUUFVUOw0KDQoJd2hpbGUoMSkNCgl7DQoJCVBTT0NLX1JFQURUTygmcy0+c2luLCBJU09fbmwpOw0KDQoJCWlmKHN0cm5jbXAocy0+aW5wdXRidWYsIGh0dHBfcmVmZXJlciwgOCkgPT0gMCkNCgkJew0KCQkJcy0+aW5wdXRidWZbUFNPQ0tfREFUQUxFTigmcy0+c2luKSAtIDJdID0gMDsNCg0KCQkJLyogaHR0cGRfbG9nKCZzLT5pbnB1dGJ1Zls5XSk7ICovDQoJCX0NCgl9DQoNCglQU09DS19FTkQoJnMtPnNpbik7DQp9DQoNCi8qDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICovDQpzdGF0aWMgdm9pZCBoYW5kbGVfY29ubmVjdGlvbihzdHJ1Y3QgaHR0cGRfc3RhdGUgKnMpDQp7DQoJaGFuZGxlX2lucHV0KHMpOw0KCWlmKHMtPnN0YXRlID09IFNUQVRFX09VVFBVVCkNCgl7DQoJCWhhbmRsZV9vdXRwdXQocyk7DQoJfQ0KfQ0KDQovKg0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqLw0Kdm9pZCBodHRwZF9hcHBjYWxsKHZvaWQpDQp7DQoJLyp+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4qLw0KCXN0cnVjdCBodHRwZF9zdGF0ZQkqcyA9IChzdHJ1Y3QgaHR0cGRfc3RhdGUgKikgJih1aXBfY29ubi0+YXBwc3RhdGUpOw0KCS8qfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ki8NCg0KCWlmKHVpcF9jbG9zZWQoKSB8fCB1aXBfYWJvcnRlZCgpIHx8IHVpcF90aW1lZG91dCgpKQ0KCXsNCgl9DQoJZWxzZSBpZih1aXBfY29ubmVjdGVkKCkpDQoJew0KCQlQU09DS19JTklUKCZzLT5zaW4sIHMtPmlucHV0YnVmLCBzaXplb2Yocy0+aW5wdXRidWYpIC0gMSk7DQoJCVBTT0NLX0lOSVQoJnMtPnNvdXQsIHMtPmlucHV0YnVmLCBzaXplb2Yocy0+aW5wdXRidWYpIC0gMSk7DQoJCVBUX0lOSVQoJnMtPm91dHB1dHB0KTsNCgkJcy0+c3RhdGUgPSBTVEFURV9XQUlUSU5HOw0KDQoJCS8qIHRpbWVyX3NldCgmcy0+dGltZXIsIENMT0NLX1NFQ09ORCAqIDEwMCk7ICovDQoJCXMtPnRpbWVyID0gMDsNCgkJaGFuZGxlX2Nvbm5lY3Rpb24ocyk7DQoJfQ0KCWVsc2UgaWYocyAhPSBOVUxMKQ0KCXsNCgkJaWYodWlwX3BvbGwoKSkNCgkJew0KCQkJKytzLT50aW1lcjsNCgkJCWlmKHMtPnRpbWVyID49IDIwKQ0KCQkJew0KCQkJCXVpcF9hYm9ydCgpOw0KCQkJfQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJcy0+dGltZXIgPSAwOw0KCQl9DQoNCgkJaGFuZGxlX2Nvbm5lY3Rpb24ocyk7DQoJfQ0KCWVsc2UNCgl7DQoJCXVpcF9hYm9ydCgpOw0KCX0NCn0NCg0KLyoNCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIFxicmllZiBJbml0aWFsaXplIHRoZSB3ZWIgc2VydmVyIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHdlYiBzZXJ2ZXIgYW5kIHNob3VsZCBiZSBjYWxsZWQgYXQgc3lzdGVtIGJvb3QtdXAuDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqLw0Kdm9pZCBodHRwZF9pbml0KHZvaWQpDQp7DQoJdWlwX2xpc3RlbihIVE9OUyg4MCkpOw0KfQ0KDQovKiBAfSAqLw0K