LyoNCglGcmVlUlRPUy5vcmcgVjUuMi4wIC0gQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgUmljaGFyZCBCYXJyeS4NCg0KCVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlUlRPUy5vcmcgZGlzdHJpYnV0aW9uLg0KDQoJRnJlZVJUT1Mub3JnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgDQoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodmVyc2lvbiAyKSBhcyBwdWJsaXNoZWQNCglieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBtb2RpZmllZCBieSB0aGUgRnJlZVJUT1MgZXhjZXB0aW9uLg0KDQoJRnJlZVJUT1Mub3JnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCWJ1dCBXSVRIT1VUDQoJQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIA0KCUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgDQoJbW9yZSBkZXRhaWxzLg0KDQoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgDQoJd2l0aCBGcmVlUlRPUy5vcmc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgDQoJVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQS4NCg0KCUEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBpcyBpbmNsdWRlZCB0byBhbGxvdyB5b3UgdG8gZGlzdHJpYnV0ZSBhIA0KCWNvbWJpbmVkIHdvcmsgdGhhdCBpbmNsdWRlcyBGcmVlUlRPUy5vcmcgd2l0aG91dCBiZWluZyBvYmxpZ2VkIHRvIHByb3ZpZGUNCgl0aGUgc291cmNlIGNvZGUgZm9yIGFueSBwcm9wcmlldGFyeSBjb21wb25lbnRzLiAgU2VlIHRoZSBsaWNlbnNpbmcgc2VjdGlvbg0KCW9mIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnIGZvciBmdWxsIGRldGFpbHMuDQoNCg0KCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KCSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KCSogR2V0IHRoZSBGcmVlUlRPUyBlQm9vayEgIFNlZSBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9Eb2N1bWVudGF0aW9uICAgICAgKg0KCSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KCSogVGhpcyBpcyBhIGNvbmNpc2UsIHN0ZXAgYnkgc3RlcCwgJ2hhbmRzIG9uJyBndWlkZSB0aGF0IGRlc2NyaWJlcyBib3RoICAgKg0KCSogZ2VuZXJhbCBtdWx0aXRhc2tpbmcgY29uY2VwdHMgYW5kIEZyZWVSVE9TIHNwZWNpZmljcy4gSXQgcHJlc2VudHMgYW5kICAgKg0KCSogZXhwbGFpbnMgbnVtZXJvdXMgZXhhbXBsZXMgdGhhdCBhcmUgd3JpdHRlbiB1c2luZyB0aGUgRnJlZVJUT1MgQVBJLiAgICAgKg0KCSogRnVsbCBzb3VyY2UgY29kZSBmb3IgYWxsIHRoZSBleGFtcGxlcyBpcyBwcm92aWRlZCBpbiBhbiBhY2NvbXBhbnlpbmcgICAgKg0KCSogLnppcCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KCSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQoJMSB0YWIgPT0gNCBzcGFjZXMhDQoNCglQbGVhc2UgZW5zdXJlIHRvIHJlYWQgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHJlbGV2YW50IHBvcnQgc2VjdGlvbnMgb2YgdGhlDQoJb25saW5lIGRvY3VtZW50YXRpb24uDQoNCglodHRwOi8vd3d3LkZyZWVSVE9TLm9yZyAtIERvY3VtZW50YXRpb24sIGxhdGVzdCBpbmZvcm1hdGlvbiwgbGljZW5zZSBhbmQNCgljb250YWN0IGRldGFpbHMuDQoNCglodHRwOi8vd3d3LlNhZmVSVE9TLmNvbSAtIEEgdmVyc2lvbiB0aGF0IGlzIGNlcnRpZmllZCBmb3IgdXNlIGluIHNhZmV0eQ0KCWNyaXRpY2FsIHN5c3RlbXMuDQoNCglodHRwOi8vd3d3Lk9wZW5SVE9TLmNvbSAtIENvbW1lcmNpYWwgc3VwcG9ydCwgZGV2ZWxvcG1lbnQsIHBvcnRpbmcsDQoJbGljZW5zaW5nIGFuZCB0cmFpbmluZyBzZXJ2aWNlcy4NCiovDQoNCi8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgPHN0cmluZy5oPg0KDQovKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovDQojaW5jbHVkZSAiRnJlZVJUT1MuaCINCiNpbmNsdWRlICJzZW1waHIuaCINCiNpbmNsdWRlICJ0YXNrLmgiDQoNCi8qIERlbW8gYXBwbGljYXRpb24gaW5jbHVkZXMuICovDQojaW5jbHVkZSAiU0FNN19FTUFDLmgiDQoNCi8qIHVJUCBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlICJ1aXAuaCINCg0KLyogSGFyZHdhcmUgc3BlY2lmaWMgaW5jbHVkZXMuICovDQojaW5jbHVkZSAiRW1hYy5oIg0KI2luY2x1ZGUgIm1paS5oIg0KI2luY2x1ZGUgIkFUOTFTQU03WDI1Ni5oIg0KDQoNCi8qIFVTRV9STUlJX0lOVEVSRkFDRSBtdXN0IGJlIGRlZmluZWQgYXMgMSB0byB1c2UgYW4gUk1JSSBpbnRlcmZhY2UsIG9yIDANCnRvIHVzZSBhbiBNSUkgaW50ZXJmYWNlLiAqLw0KI2RlZmluZSBVU0VfUk1JSV9JTlRFUkZBQ0UgMA0KDQovKiBUaGUgYnVmZmVyIGFkZHJlc3NlcyB3cml0dGVuIGludG8gdGhlIGRlc2NyaXB0b3JzIG11c3QgYmUgYWxpZ25lZCBzbyB0aGUNCmxhc3QgZmV3IGJpdHMgYXJlIHplcm8uICBUaGVzZSBiaXRzIGhhdmUgc3BlY2lhbCBtZWFuaW5nIGZvciB0aGUgRU1BQw0KcGVyaXBoZXJhbCBhbmQgY2Fubm90IGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgYWRkcmVzcy4gKi8NCiNkZWZpbmUgZW1hY0FERFJFU1NfTUFTSwkJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIDB4RkZGRkZGRkMgKQ0KDQovKiBCaXQgdXNlZCB3aXRoaW4gdGhlIGFkZHJlc3Mgc3RvcmVkIGluIHRoZSBkZXNjcmlwdG9yIHRvIG1hcmsgdGhlIGxhc3QNCmRlc2NyaXB0b3IgaW4gdGhlIGFycmF5LiAqLw0KI2RlZmluZSBlbWFjUlhfV1JBUF9CSVQJCQkJKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgMHgwMiApDQoNCi8qIEJpdCB1c2VkIHdpdGhpbiB0aGUgVHggZGVzY3JpcHRvciBzdGF0dXMgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUNCmRlc2NyaXB0b3IgaXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIEVNQUMgb3IgdGhlIHNvZnR3YXJlLiAqLw0KI2RlZmluZSBlbWFjVFhfQlVGX1VTRUQJCQkJKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgMHg4MDAwMDAwMCApDQoNCi8qIEEgc2hvcnQgZGVsYXkgaXMgdXNlZCB0byB3YWl0IGZvciBhIGJ1ZmZlciB0byBiZWNvbWUgYXZhaWxhYmxlLCBzaG91bGQNCm9uZSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHdoZW4gdHJ5aW5nIHRvIHRyYW5zbWl0IGEgZnJhbWUuICovDQojZGVmaW5lIGVtYWNCVUZGRVJfV0FJVF9ERUxBWQkJKCAyICkNCiNkZWZpbmUgZW1hY01BWF9XQUlUX0NZQ0xFUwkJCSggY29uZmlnVElDS19SQVRFX0haIC8gNDAgKQ0KDQovKiBNaXNjIGRlZmluZXMuICovDQojZGVmaW5lIGVtYWNJTlRFUlJVUFRfTEVWRUwJCQkoIDUgKQ0KI2RlZmluZSBlbWFjTk9fREVMQVkJCQkJKCAwICkNCiNkZWZpbmUgZW1hY1RPVEFMX0ZSQU1FX0hFQURFUl9TSVpFCSggNTQgKQ0KI2RlZmluZSBlbWFjUEhZX0lOSVRfREVMQVkJCQkoIDUwMDAgLyBwb3J0VElDS19SQVRFX01TICkNCiNkZWZpbmUgZW1hY1JFU0VUX0tFWQkJCQkoICggdW5zaWduZWQgcG9ydExPTkcgKSAweEE1MDAwMDAwICkNCiNkZWZpbmUgZW1hY1JFU0VUX0xFTkdUSAkJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApICggMHgwMSA8PCA4ICkgKQ0KDQovKiBUaGUgQXRtZWwgaGVhZGVyIGZpbGUgb25seSBkZWZpbmVzIHRoZSBUWCBmcmFtZSBsZW5ndGggbWFzay4gKi8NCiNkZWZpbmUgZW1hY1JYX0xFTkdUSF9GUkFNRQkJCSggMHhmZmYgKQ0KDQovKiBQZXJpcGhlcmFsIHNldHVwIGZvciB0aGUgRU1BQy4gKi8NCiNkZWZpbmUgZW1hY1BFUklQSEVSQUxfQV9TRVRVUCAJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIEFUOTFDX1BCMl9FVFgwCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIEFUOTFDX1BCMTJfRVRYRVIJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgcG9ydExPTkcgKSBBVDkxQ19QQjE2X0VDT0wJCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgQVQ5MUNfUEIxMV9FVFgzCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIEFUOTFDX1BCNl9FUlgxCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIEFUOTFDX1BCMTVfRVJYRFYJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgcG9ydExPTkcgKSBBVDkxQ19QQjEzX0VSWDIJCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgQVQ5MUNfUEIzX0VUWDEJCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgQVQ5MUNfUEI4X0VNREMJCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgQVQ5MUNfUEI1X0VSWDAJCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgQVQ5MUNfUEIxNF9FUlgzCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIEFUOTFDX1BCNF9FQ1JTX0VDUlNEVgkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgQVQ5MUNfUEIxX0VUWEVOCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIEFUOTFDX1BCMTBfRVRYMgkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgcG9ydExPTkcgKSBBVDkxQ19QQjBfRVRYQ0tfRVJFRkNLCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgcG9ydExPTkcgKSBBVDkxQ19QQjlfRU1ESU8JCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgQVQ5MUNfUEI3X0VSWEVSCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIEFUOTFDX1BCMTdfRVJYQ0sJCSk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKg0KICogUHJvdG90eXBlIGZvciB0aGUgRU1BQyBpbnRlcnJ1cHQgZnVuY3Rpb24gLSBjYWxsZWQgYnkgdGhlIGFzbSB3cmFwcGVyLg0KICovDQpleHRlcm4gdm9pZCB2RU1BQ0lTUl9XcmFwcGVyKCB2b2lkICkgX19hdHRyaWJ1dGVfXygobmFrZWQpKTsNCg0KLyoNCiAqIEluaXRpYWxpc2UgYm90aCB0aGUgVHggYW5kIFJ4IGRlc2NyaXB0b3JzIHVzZWQgYnkgdGhlIEVNQUMuDQogKi8NCnN0YXRpYyB2b2lkIHBydlNldHVwRGVzY3JpcHRvcnModm9pZCk7DQoNCi8qDQogKiBXcml0ZSBvdXIgTUFDIGFkZHJlc3MgaW50byB0aGUgRU1BQy4gIFRoZSBNQUMgYWRkcmVzcyBpcyBzZXQgYXMgb25lIG9mIHRoZQ0KICogdWlwIG9wdGlvbnMuDQogKi8NCnN0YXRpYyB2b2lkIHBydlNldHVwTUFDQWRkcmVzcyggdm9pZCApOw0KDQovKg0KICogQ29uZmlndXJlIHRoZSBFTUFDIGFuZCBBSUMgZm9yIEVNQUMgaW50ZXJydXB0cy4NCiAqLw0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBFTUFDSW50ZXJydXB0KCB2b2lkICk7DQoNCi8qDQogKiBTb21lIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucyB0YWtlbiBmcm9tIHRoZSBBdG1lbCBFTUFDIHNhbXBsZSBjb2RlLg0KICovDQpzdGF0aWMgdm9pZCB2UmVhZFBIWSggdW5zaWduZWQgcG9ydENIQVIgdWNQSFlBZGRyZXNzLCB1bnNpZ25lZCBwb3J0Q0hBUiB1Y0FkZHJlc3MsIHVuc2lnbmVkIHBvcnRMT05HICpwdWxWYWx1ZSApOw0KI2lmIFVTRV9STUlJX0lOVEVSRkFDRSAhPSAxDQoJc3RhdGljIHZvaWQgdldyaXRlUEhZKCB1bnNpZ25lZCBwb3J0Q0hBUiB1Y1BIWUFkZHJlc3MsIHVuc2lnbmVkIHBvcnRDSEFSIHVjQWRkcmVzcywgdW5zaWduZWQgcG9ydExPTkcgdWxWYWx1ZSk7DQojZW5kaWYNCnN0YXRpYyBwb3J0QkFTRV9UWVBFIHhHZXRMaW5rU3BlZWQoIHZvaWQgKTsNCnN0YXRpYyBwb3J0QkFTRV9UWVBFIHBydlByb2JlUEhZKCB2b2lkICk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiBCdWZmZXIgd3JpdHRlbiB0byBieSB0aGUgRU1BQyBETUEuICBNdXN0IGJlIGFsaWduZWQgYXMgZGVzY3JpYmVkIGJ5IHRoZQ0KY29tbWVudCBhYm92ZSB0aGUgZW1hY0FERFJFU1NfTUFTSyBkZWZpbml0aW9uLiAqLw0KI3ByYWdtYSBkYXRhX2FsaWdubWVudD04DQpzdGF0aWMgdm9sYXRpbGUgcG9ydENIQVIgcGNSeEJ1ZmZlclsgTkJfUlhfQlVGRkVSUyAqIEVUSF9SWF9CVUZGRVJfU0laRSBdOw0KDQovKiBCdWZmZXIgcmVhZCBieSB0aGUgRU1BQyBETUEuICBNdXN0IGJlIGFsaWduZWQgYXMgZGVzY3JpYmVkIGJ5IGhlIGNvbW1lbnQNCmFib3ZlIHRoZSBlbWFjQUREUkVTU19NQVNLIGRlZmluaXRpb24uICovDQojcHJhZ21hIGRhdGFfYWxpZ25tZW50PTgNCnN0YXRpYyBwb3J0Q0hBUiBwY1R4QnVmZmVyWyBOQl9UWF9CVUZGRVJTICogRVRIX1RYX0JVRkZFUl9TSVpFIF07DQoNCi8qIERlc2NyaXB0b3JzIHVzZWQgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiB0aGUgcHJvZ3JhbSBhbmQgdGhlIEVNQUMgcGVyaXBoZXJhbC4NClRoZXNlIGRlc2NyaXB0b3JzIGhvbGQgdGhlIGxvY2F0aW9ucyBhbmQgc3RhdGUgb2YgdGhlIFJ4IGFuZCBUeCBidWZmZXJzLiAqLw0Kc3RhdGljIHZvbGF0aWxlIEFUOTFTX1R4VGREZXNjcmlwdG9yIHhUeERlc2NyaXB0b3JzWyBOQl9UWF9CVUZGRVJTIF07DQpzdGF0aWMgdm9sYXRpbGUgQVQ5MVNfUnhUZERlc2NyaXB0b3IgeFJ4RGVzY3JpcHRvcnNbIE5CX1JYX0JVRkZFUlMgXTsNCg0KLyogVGhlIElQIGFuZCBFdGhlcm5ldCBhZGRyZXNzZXMgYXJlIHJlYWQgZnJvbSB0aGUgdUlQIHNldHVwLiAqLw0KY29uc3QgcG9ydENIQVIgY01BQ0FkZHJlc3NbIDYgXSA9IHsgdWlwTUFDX0FERFIwLCB1aXBNQUNfQUREUjEsIHVpcE1BQ19BRERSMiwgdWlwTUFDX0FERFIzLCB1aXBNQUNfQUREUjQsIHVpcE1BQ19BRERSNSB9Ow0KY29uc3QgdW5zaWduZWQgY2hhciB1Y0lQQWRkcmVzc1sgNCBdICA9IHsgdWlwSVBfQUREUjAsIHVpcElQX0FERFIxLCB1aXBJUF9BRERSMiwgdWlwSVBfQUREUjMgfTsNCg0KLyogVGhlIHNlbWFwaG9yZSB1c2VkIGJ5IHRoZSBFTUFDIElTUiB0byB3YWtlIHRoZSBFTUFDIHRhc2suICovDQpzdGF0aWMgeFNlbWFwaG9yZUhhbmRsZSB4U2VtYXBob3JlID0gTlVMTDsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnhTZW1hcGhvcmVIYW5kbGUgeEVNQUNJbml0KCB2b2lkICkNCnsNCgkvKiBDb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJLyogRGlzYWJsZSBwdWxsIHVwIG9uIFJYRFYgPT4gUEhZIG5vcm1hbCBtb2RlIChub3QgaW4gdGVzdCBtb2RlKSwNCglQSFkgaGFzIGludGVybmFsIHB1bGwgZG93bi4gKi8NCglBVDkxQ19CQVNFX1BJT0ItPlBJT19QUFVEUiA9IDEgPDwgMTU7DQoNCgkjaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCgkgIAkvKiBQSFkgaGFzIGludGVybmFsIHB1bGwgZG93biA6IHNldCBNSUkgbW9kZS4gKi8NCgkgIAlBVDkxQ19CQVNFX1BJT0ItPlBJT19QUFVEUiA9IDEgPDwgMTY7DQoJI2VuZGlmDQoNCgkvKiBDbGVhciBQQjE4IDw9PiBQSFkgcG93ZXJkb3duLiAqLw0KICAgCUFUOTFDX0JBU0VfUElPQi0+UElPX1BFUiA9IDEgPDwgMTg7DQoJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fT0VSID0gMSA8PCAxODsNCglBVDkxQ19CQVNFX1BJT0ItPlBJT19DT0RSID0gMSA8PCAxODsNCg0KCS8qIEFmdGVyIFBIWSBwb3dlciB1cCwgaGFyZHdhcmUgcmVzZXQuICovDQoJQVQ5MUNfQkFTRV9SU1RDLT5SU1RDX1JNUiA9IGVtYWNSRVNFVF9LRVkgfCBlbWFjUkVTRVRfTEVOR1RIOw0KCUFUOTFDX0JBU0VfUlNUQy0+UlNUQ19SQ1IgPSBlbWFjUkVTRVRfS0VZIHwgQVQ5MUNfUlNUQ19FWFRSU1Q7DQoNCgkvKiBXYWl0IGZvciBoYXJkd2FyZSByZXNldCBlbmQuICovDQoJd2hpbGUoICEoIEFUOTFDX0JBU0VfUlNUQy0+UlNUQ19SU1IgJiBBVDkxQ19SU1RDX05SU1RMICkgKQ0KCXsNCgkJX19hc20gdm9sYXRpbGUgKCAiTk9QIiApOw0KCX0NCiAgICBfX2FzbSB2b2xhdGlsZSAoICJOT1AiICk7DQoNCgkvKiBTZXR1cCB0aGUgcGlucy4gKi8NCglBVDkxQ19CQVNFX1BJT0ItPlBJT19BU1IgPSBlbWFjUEVSSVBIRVJBTF9BX1NFVFVQOw0KCUFUOTFDX0JBU0VfUElPQi0+UElPX1BEUiA9IGVtYWNQRVJJUEhFUkFMX0FfU0VUVVA7DQoNCgkvKiBFbmFibGUgY29tIGJldHdlZW4gRU1BQyBQSFkuDQoNCglFbmFibGUgbWFuYWdlbWVudCBwb3J0LiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgfD0gQVQ5MUNfRU1BQ19NUEU7CQ0KDQoJLyogTURDID0gTUNLLzMyLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiB8PSAoIDIgKSA8PCAxMDsJDQoNCgkvKiBXYWl0IGZvciBQSFkgYXV0byBpbml0IGVuZCAocmF0aGVyIGNydWRlIGRlbGF5ISkuICovDQoJdlRhc2tEZWxheSggZW1hY1BIWV9JTklUX0RFTEFZICk7DQoNCgkvKiBQSFkgY29uZmlndXJhdGlvbi4gKi8NCgkjaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCgl7DQoJCXVuc2lnbmVkIHBvcnRMT05HIHVsQ29udHJvbDsNCg0KCQkvKiBQSFkgaGFzIGludGVybmFsIHB1bGwgZG93biA6IGRpc2FibGUgTUlJIGlzb2xhdGUuICovDQoJCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX0JNQ1IsICZ1bENvbnRyb2wgKTsNCgkJdlJlYWRQSFkoIEFUOTFDX1BIWV9BRERSLCBNSUlfQk1DUiwgJnVsQ29udHJvbCApOw0KCQl1bENvbnRyb2wgJj0gfkJNQ1JfSVNPTEFURTsNCgkJdldyaXRlUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX0JNQ1IsIHVsQ29udHJvbCApOw0KCX0NCgkjZW5kaWYNCg0KCS8qIERpc2FibGUgbWFuYWdlbWVudCBwb3J0IGFnYWluLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgJj0gfkFUOTFDX0VNQUNfTVBFOw0KDQoJI2lmIFVTRV9STUlJX0lOVEVSRkFDRSAhPSAxDQoJCS8qIEVuYWJsZSBFTUFDIGluIE1JSSBtb2RlLCBlbmFibGUgY2xvY2sgRVJYQ0sgYW5kIEVUWENLLiAqLw0KCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfVVNSSU8gPSBBVDkxQ19FTUFDX0NMS0VOIDsNCgkjZWxzZQ0KCQkvKiBFbmFibGUgRU1BQyBpbiBSTUlJIG1vZGUsIGVuYWJsZSBSTUlJIGNsb2NrICg1ME1IeiBmcm9tIG9zY2lsbGF0b3INCgkJb24gRVJGQ0spLiAqLw0KCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfVVNSSU8gPSBBVDkxQ19FTUFDX1JNSUkgfCBBVDkxQ19FTUFDX0NMS0VOIDsNCgkjZW5kaWYNCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBTZXR1cCB0aGUgYnVmZmVycyBhbmQgZGVzY3JpcHRvcnMuICovDQoJcHJ2U2V0dXBEZXNjcmlwdG9ycygpOw0KCQ0KCS8qIExvYWQgb3VyIE1BQyBhZGRyZXNzIGludG8gdGhlIEVNQUMuICovDQoJcHJ2U2V0dXBNQUNBZGRyZXNzKCk7DQoNCgkvKiBBcmUgd2UgY29ubmVjdGVkPyAqLw0KCWlmKCBwcnZQcm9iZVBIWSgpICkNCgl7DQoJCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0ISAqLw0KCQlwb3J0RU5URVJfQ1JJVElDQUwoKTsNCgkJew0KCQkJcHJ2U2V0dXBFTUFDSW50ZXJydXB0KCk7DQoJCQl2UGFzc0VNQUNTZW1hcGhvcmUoIHhTZW1hcGhvcmUgKTsNCgkJfQ0KCQlwb3J0RVhJVF9DUklUSUNBTCgpOw0KCX0NCg0KCXJldHVybiB4U2VtYXBob3JlOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnBvcnRMT05HIGxFTUFDU2VuZCggdm9pZCApDQp7DQpzdGF0aWMgdW5zaWduZWQgcG9ydEJBU0VfVFlQRSB1eFR4QnVmZmVySW5kZXggPSAwOw0KcG9ydEJBU0VfVFlQRSB4V2FpdEN5Y2xlcyA9IDA7DQpwb3J0TE9ORyBsUmV0dXJuID0gcGRQQVNTOw0KcG9ydENIQVIgKnBjQnVmZmVyOw0KDQoJLyogSXMgYSBidWZmZXIgYXZhaWxhYmxlPyAqLw0KCXdoaWxlKCAhKCB4VHhEZXNjcmlwdG9yc1sgdXhUeEJ1ZmZlckluZGV4IF0uVV9TdGF0dXMuc3RhdHVzICYgQVQ5MUNfVFJBTlNNSVRfT0sgKSApDQoJew0KCQkvKiBUaGVyZSBpcyBubyByb29tIHRvIHdyaXRlIHRoZSBUeCBkYXRhIHRvIHRoZSBUeCBidWZmZXIuICBXYWl0IGENCgkJc2hvcnQgd2hpbGUsIHRoZW4gdHJ5IGFnYWluLiAqLw0KCQl4V2FpdEN5Y2xlcysrOw0KCQlpZiggeFdhaXRDeWNsZXMgPiBlbWFjTUFYX1dBSVRfQ1lDTEVTICkNCgkJew0KCQkJLyogR2l2ZSB1cC4gKi8NCgkJCWxSZXR1cm4gPSBwZEZBSUw7DQoJCQlicmVhazsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXZUYXNrRGVsYXkoIGVtYWNCVUZGRVJfV0FJVF9ERUxBWSApOw0KCQl9DQoJfQ0KDQoJLyogbFJldHVybiB3aWxsIG9ubHkgYmUgcGRQQVNTIGlmIGEgYnVmZmVyIGlzIGF2YWlsYWJsZS4gKi8NCglpZiggbFJldHVybiA9PSBwZFBBU1MgKQ0KCXsNCgkJLyogQ29weSB0aGUgaGVhZGVycyBpbnRvIHRoZSBUeCBidWZmZXIuICBUaGVzZSB3aWxsIGJlIGluIHRoZSB1SVAgYnVmZmVyLiAqLw0KCQlwY0J1ZmZlciA9ICggcG9ydENIQVIgKiApIHhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5hZGRyOw0KCQltZW1jcHkoICggdm9pZCAqICkgcGNCdWZmZXIsICggdm9pZCAqICkgdWlwX2J1ZiwgZW1hY1RPVEFMX0ZSQU1FX0hFQURFUl9TSVpFICk7DQoNCgkJLyogSWYgdGhlcmUgaXMgcm9vbSwgYWxzbyBjb3B5IGluIHRoZSBhcHBsaWNhdGlvbiBkYXRhIGlmIGFueS4gKi8NCgkJaWYoICggdWlwX2xlbiA+IGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSApICYmICggdWlwX2xlbiA8PSAoIEVUSF9UWF9CVUZGRVJfU0laRSAtIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSApICkgKQ0KCQl7DQoJCQltZW1jcHkoICggdm9pZCAqICkgJiggcGNCdWZmZXJbIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSBdICksICggdm9pZCAqICkgdWlwX2FwcGRhdGEsICggdWlwX2xlbiAtIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSApICk7DQoJCX0NCg0KCQkvKiBTZW5kLiAqLwkNCgkJcG9ydEVOVEVSX0NSSVRJQ0FMKCk7DQoJCXsNCgkJCWlmKCB1eFR4QnVmZmVySW5kZXggPj0gKCBOQl9UWF9CVUZGRVJTIC0gMSApICkNCgkJCXsNCgkJCQkvKiBGaWxsIG91dCB0aGUgbmVjZXNzYXJ5IGluIHRoZSBkZXNjcmlwdG9yIHRvIGdldCB0aGUgZGF0YSBzZW50LiAqLw0KCQkJCXhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgPSAJKCB1aXBfbGVuICYgKCB1bnNpZ25lZCBwb3J0TE9ORyApIEFUOTFDX0xFTkdUSF9GUkFNRSApDQoJCQkJCQkJCQkJCQkJCQkJCQl8IEFUOTFDX0xBU1RfQlVGRkVSDQoJCQkJCQkJCQkJCQkJCQkJCQl8IEFUOTFDX1RSQU5TTUlUX1dSQVA7DQoJCQkJdXhUeEJ1ZmZlckluZGV4ID0gMDsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkvKiBGaWxsIG91dCB0aGUgbmVjZXNzYXJ5IGluIHRoZSBkZXNjcmlwdG9yIHRvIGdldCB0aGUgZGF0YSBzZW50LiAqLw0KCQkJCXhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgPSAJKCB1aXBfbGVuICYgKCB1bnNpZ25lZCBwb3J0TE9ORyApIEFUOTFDX0xFTkdUSF9GUkFNRSApDQoJCQkJCQkJCQkJCQkJCQkJCQl8IEFUOTFDX0xBU1RfQlVGRkVSOw0KCQkJCXV4VHhCdWZmZXJJbmRleCsrOw0KCQkJfQ0KCQ0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiB8PSBBVDkxQ19FTUFDX1RTVEFSVDsNCgkJfQ0KCQlwb3J0RVhJVF9DUklUSUNBTCgpOw0KCX0NCg0KCXJldHVybiBsUmV0dXJuOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnVuc2lnbmVkIHBvcnRMT05HIHVsRU1BQ1BvbGwoIHZvaWQgKQ0Kew0Kc3RhdGljIHVuc2lnbmVkIHBvcnRCQVNFX1RZUEUgdWxOZXh0UnhCdWZmZXIgPSAwOw0KdW5zaWduZWQgcG9ydExPTkcgdWxTZWN0aW9uTGVuZ3RoID0gMCwgdWxMZW5ndGhTb0ZhciA9IDAsIHVsRU9GID0gcGRGQUxTRTsNCnBvcnRDSEFSICpwY1NvdXJjZTsNCg0KCS8qIFNraXAgYW55IGZyYWdtZW50cy4gKi8NCgl3aGlsZSggKCB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5hZGRyICYgQVQ5MUNfT1dORVJTSElQX0JJVCApICYmICEoIHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLlVfU3RhdHVzLnN0YXR1cyAmIEFUOTFDX1NPRiApICkNCgl7DQoJCS8qIE1hcmsgdGhlIGJ1ZmZlciBhcyBmcmVlIGFnYWluLiAqLw0KCQl4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5hZGRyICY9IH4oIEFUOTFDX09XTkVSU0hJUF9CSVQgKTsJCQ0KCQl1bE5leHRSeEJ1ZmZlcisrOw0KCQlpZiggdWxOZXh0UnhCdWZmZXIgPj0gTkJfUlhfQlVGRkVSUyApDQoJCXsNCgkJCXVsTmV4dFJ4QnVmZmVyID0gMDsNCgkJfQ0KCX0NCg0KCS8qIElzIHRoZXJlIGEgcGFja2V0IHJlYWR5PyAqLw0KDQoJd2hpbGUoICggeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmIEFUOTFDX09XTkVSU0hJUF9CSVQgKSAmJiAhdWxTZWN0aW9uTGVuZ3RoICkNCgl7DQoJCXBjU291cmNlID0gKCBwb3J0Q0hBUiAqICkoIHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJiBlbWFjQUREUkVTU19NQVNLICk7DQoJCXVsU2VjdGlvbkxlbmd0aCA9IHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLlVfU3RhdHVzLnN0YXR1cyAmIGVtYWNSWF9MRU5HVEhfRlJBTUU7DQoNCgkJaWYoIHVsU2VjdGlvbkxlbmd0aCA9PSAwICkNCgkJew0KCQkJLyogVGhlIGZyYW1lIGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGlzDQoJCQlkZXNjcmlwdG9yIHNvIGNvcHkgdGhlIGVudGlyZSBidWZmZXIgdG8gdUlQIC0gdGhlbiBtb3ZlIG9udG8NCgkJCXRoZSBuZXh0IGRlc2NyaXB0b3IgdG8gZ2V0IHRoZSByZXN0IG9mIHRoZSBmcmFtZS4gKi8NCgkJCWlmKCAoIHVsTGVuZ3RoU29GYXIgKyBFVEhfUlhfQlVGRkVSX1NJWkUgKSA8PSBVSVBfQlVGU0laRSApDQoJCQl7DQoJCQkJbWVtY3B5KCAmKCB1aXBfYnVmWyB1bExlbmd0aFNvRmFyIF0gKSwgcGNTb3VyY2UsIEVUSF9SWF9CVUZGRVJfU0laRSApOw0KCQkJCXVsTGVuZ3RoU29GYXIgKz0gRVRIX1JYX0JVRkZFUl9TSVpFOw0KCQkJfQkJCQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLyogVGhpcyBpcyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBmcmFtZS4gIENvcHkgdGhlIHNlY3Rpb24gdG8NCgkJCXVJUC4gKi8NCgkJCWlmKCB1bFNlY3Rpb25MZW5ndGggPCBVSVBfQlVGU0laRSApDQoJCQl7DQoJCQkJLyogVGhlIHNlY3Rpb24gbGVuZ3RoIGhvbGRzIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZSBmcmFtZS4NCgkJCQl1bExlbmd0aFNvRmFyIGhvbGRzIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHNlY3Rpb25zIGFscmVhZHkNCgkJCQljb3BpZWQgdG8gdUlQLCBzbyB0aGUgbGVuZ3RoIG9mIHRoZSBmaW5hbCBzZWN0aW9uIGlzDQoJCQkJdWxTZWN0aW9uTGVuZ3RoIC0gdWxMZW5ndGhTb0ZhcjsgKi8NCgkJCQlpZiggdWxTZWN0aW9uTGVuZ3RoID4gdWxMZW5ndGhTb0ZhciApDQoJCQkJew0KCQkJCQltZW1jcHkoICYoIHVpcF9idWZbIHVsTGVuZ3RoU29GYXIgXSApLCBwY1NvdXJjZSwgKCB1bFNlY3Rpb25MZW5ndGggLSB1bExlbmd0aFNvRmFyICkgKTsNCgkJCQl9DQoJCQl9CQkJDQoNCgkJCS8qIElzIHRoaXMgdGhlIGxhc3QgYnVmZmVyIGZvciB0aGUgZnJhbWU/ICBJZiBub3Qgd2h5PyAqLw0KCQkJdWxFT0YgPSB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5VX1N0YXR1cy5zdGF0dXMgJiBBVDkxQ19FT0Y7DQoJCX0NCg0KCQkvKiBNYXJrIHRoZSBidWZmZXIgYXMgZnJlZSBhZ2Fpbi4gKi8NCgkJeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmPSB+KCBBVDkxQ19PV05FUlNISVBfQklUICk7DQoNCgkJLyogSW5jcmVtZW50IHRvIHRoZSBuZXh0IGJ1ZmZlciwgd3JhcHBpbmcgaWYgbmVjZXNzYXJ5LiAqLw0KCQl1bE5leHRSeEJ1ZmZlcisrOw0KCQlpZiggdWxOZXh0UnhCdWZmZXIgPj0gTkJfUlhfQlVGRkVSUyApDQoJCXsNCgkJCXVsTmV4dFJ4QnVmZmVyID0gMDsNCgkJfQ0KCX0NCg0KCS8qIElmIHdlIG9idGFpbmVkIGRhdGEgYnV0IGZvciBzb21lIHJlYXNvbiBkaWQgbm90IGZpbmQgdGhlIGVuZCBvZiB0aGUNCglmcmFtZSB0aGVuIGRpc2NhcmQgdGhlIGRhdGEgYXMgaXQgbXVzdCBjb250YWluIGFuIGVycm9yLiAqLw0KCWlmKCAhdWxFT0YgKQ0KCXsNCgkJdWxTZWN0aW9uTGVuZ3RoID0gMDsNCgl9DQoNCglyZXR1cm4gdWxTZWN0aW9uTGVuZ3RoOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyB2b2lkIHBydlNldHVwRGVzY3JpcHRvcnModm9pZCkNCnsNCnVuc2lnbmVkIHBvcnRCQVNFX1RZUEUgeEluZGV4Ow0KdW5zaWduZWQgcG9ydExPTkcgdWxBZGRyZXNzOw0KDQoJLyogSW5pdGlhbGlzZSB4UnhEZXNjcmlwdG9ycyBkZXNjcmlwdG9yLiAqLw0KCWZvciggeEluZGV4ID0gMDsgeEluZGV4IDwgTkJfUlhfQlVGRkVSUzsgKyt4SW5kZXggKQ0KCXsNCgkJLyogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBudGggYnVmZmVyIHdpdGhpbiB0aGUgYXJyYXkuICovDQoJCXVsQWRkcmVzcyA9ICggdW5zaWduZWQgcG9ydExPTkcgKSggcGNSeEJ1ZmZlciArICggeEluZGV4ICogRVRIX1JYX0JVRkZFUl9TSVpFICkgKTsNCg0KCQkvKiBXcml0ZSB0aGUgYnVmZmVyIGFkZHJlc3MgaW50byB0aGUgZGVzY3JpcHRvci4gIFRoZSBETUEgd2lsbCBwbGFjZQ0KCQl0aGUgZGF0YSBhdCB0aGlzIGFkZHJlc3Mgd2hlbiB0aGlzIGRlc2NyaXB0b3IgaXMgYmVpbmcgdXNlZC4gIE1hc2sgb2ZmDQoJCXRoZSBib3R0b20gYml0cyBvZiB0aGUgYWRkcmVzcyBhcyB0aGVzZSBoYXZlIHNwZWNpYWwgbWVhbmluZy4gKi8NCgkJeFJ4RGVzY3JpcHRvcnNbIHhJbmRleCBdLmFkZHIgPSB1bEFkZHJlc3MgJiBlbWFjQUREUkVTU19NQVNLOw0KCX0JDQoNCgkvKiBUaGUgbGFzdCBidWZmZXIgaGFzIHRoZSB3cmFwIGJpdCBzZXQgc28gdGhlIEVNQUMga25vd3MgdG8gd3JhcCBiYWNrDQoJdG8gdGhlIGZpcnN0IGJ1ZmZlci4gKi8NCgl4UnhEZXNjcmlwdG9yc1sgTkJfUlhfQlVGRkVSUyAtIDEgXS5hZGRyIHw9IGVtYWNSWF9XUkFQX0JJVDsNCg0KCS8qIEluaXRpYWxpc2UgeFR4RGVzY3JpcHRvcnMuICovDQoJZm9yKCB4SW5kZXggPSAwOyB4SW5kZXggPCBOQl9UWF9CVUZGRVJTOyArK3hJbmRleCApDQoJew0KCQkvKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIG50aCBidWZmZXIgd2l0aGluIHRoZSBhcnJheS4gKi8NCgkJdWxBZGRyZXNzID0gKCB1bnNpZ25lZCBwb3J0TE9ORyApKCBwY1R4QnVmZmVyICsgKCB4SW5kZXggKiBFVEhfVFhfQlVGRkVSX1NJWkUgKSApOw0KDQoJCS8qIFdyaXRlIHRoZSBidWZmZXIgYWRkcmVzcyBpbnRvIHRoZSBkZXNjcmlwdG9yLiAgVGhlIERNQSB3aWxsIHJlYWQNCgkJZGF0YSBmcm9tIGhlcmUgd2hlbiB0aGUgZGVzY3JpcHRvciBpcyBiZWluZyB1c2VkLiAqLw0KCQl4VHhEZXNjcmlwdG9yc1sgeEluZGV4IF0uYWRkciA9IHVsQWRkcmVzcyAmIGVtYWNBRERSRVNTX01BU0s7DQoJCXhUeERlc2NyaXB0b3JzWyB4SW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgPSBBVDkxQ19UUkFOU01JVF9PSzsNCgl9CQ0KDQoJLyogVGhlIGxhc3QgYnVmZmVyIGhhcyB0aGUgd3JhcCBiaXQgc2V0IHNvIHRoZSBFTUFDIGtub3dzIHRvIHdyYXAgYmFjaw0KCXRvIHRoZSBmaXJzdCBidWZmZXIuICovDQoJeFR4RGVzY3JpcHRvcnNbIE5CX1RYX0JVRkZFUlMgLSAxIF0uVV9TdGF0dXMuc3RhdHVzID0gQVQ5MUNfVFJBTlNNSVRfV1JBUCB8IEFUOTFDX1RSQU5TTUlUX09LOw0KDQoJLyogVGVsbCB0aGUgRU1BQyB3aGVyZSB0byBmaW5kIHRoZSBkZXNjcmlwdG9ycy4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfUkJRUCA9ICggdW5zaWduZWQgcG9ydExPTkcgKSB4UnhEZXNjcmlwdG9yczsNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfVEJRUCA9ICggdW5zaWduZWQgcG9ydExPTkcgKSB4VHhEZXNjcmlwdG9yczsNCgkNCgkvKiBDbGVhciBhbGwgdGhlIGJpdHMgaW4gdGhlIHJlY2VpdmUgc3RhdHVzIHJlZ2lzdGVyLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19SU1IgPSAoIEFUOTFDX0VNQUNfT1ZSIHwgQVQ5MUNfRU1BQ19SRUMgfCBBVDkxQ19FTUFDX0JOQSApOw0KDQoJLyogRW5hYmxlIHRoZSBjb3B5IG9mIGRhdGEgaW50byB0aGUgYnVmZmVycywgaWdub3JlIGJyb2FkY2FzdHMsDQoJYW5kIGRvbid0IGNvcHkgRkNTLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiB8PSAoIEFUOTFDX0VNQUNfQ0FGIHwgQVQ5MUNfRU1BQ19OQkMgfCBBVDkxQ19FTUFDX0RSRkNTKTsNCg0KCS8qIEVuYWJsZSBSeCBhbmQgVHgsIHBsdXMgdGhlIHN0YXRzIHJlZ2lzdGVyLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgfD0gKCBBVDkxQ19FTUFDX1RFIHwgQVQ5MUNfRU1BQ19SRSB8IEFUOTFDX0VNQUNfV0VTVEFUICk7DQp9CQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyB2b2lkIHBydlNldHVwTUFDQWRkcmVzcyggdm9pZCApDQp7DQoJLyogTXVzdCBiZSB3cml0dGVuIFNBMUwgdGhlbiBTQTFILiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19TQTFMID0JKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgY01BQ0FkZHJlc3NbIDMgXSA8PCAyNCApIHwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIGNNQUNBZGRyZXNzWyAyIF0gPDwgMTYgKSB8DQoJCQkJCQkJCQkoICggdW5zaWduZWQgcG9ydExPTkcgKSBjTUFDQWRkcmVzc1sgMSBdIDw8IDggICkgfA0KCQkJCQkJCQkJY01BQ0FkZHJlc3NbIDAgXTsNCg0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19TQTFIID0JKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgY01BQ0FkZHJlc3NbIDUgXSA8PCA4ICkgfA0KCQkJCQkJCQkJY01BQ0FkZHJlc3NbIDQgXTsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCBwcnZTZXR1cEVNQUNJbnRlcnJ1cHQoIHZvaWQgKQ0Kew0KCS8qIENyZWF0ZSB0aGUgc2VtYXBob3JlIHVzZWQgdG8gdHJpZ2dlciB0aGUgRU1BQyB0YXNrLiAqLw0KCXZTZW1hcGhvcmVDcmVhdGVCaW5hcnkoIHhTZW1hcGhvcmUgKTsNCglpZiggeFNlbWFwaG9yZSApDQoJew0KCQkvKiBXZSBzdGFydCBieSAndGFraW5nJyB0aGUgc2VtYXBob3JlIHNvIHRoZSBJU1IgY2FuICdnaXZlJyBpdCB3aGVuIHRoZQ0KCQlmaXJzdCBpbnRlcnJ1cHQgb2NjdXJzLiAqLw0KCQl4U2VtYXBob3JlVGFrZSggeFNlbWFwaG9yZSwgZW1hY05PX0RFTEFZICk7DQoJCXBvcnRFTlRFUl9DUklUSUNBTCgpOw0KCQl7DQoJCQkvKiBXZSB3YW50IHRvIGludGVycnVwdCBvbiBSeCBldmVudHMuICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfSUVSID0gQVQ5MUNfRU1BQ19SQ09NUDsNCg0KCQkJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHRzIGluIHRoZSBBSUMuICovDQoJCQlBVDkxRl9BSUNfQ29uZmlndXJlSXQoIEFUOTFDX0lEX0VNQUMsIGVtYWNJTlRFUlJVUFRfTEVWRUwsIEFUOTFDX0FJQ19TUkNUWVBFX0lOVF9ISUdIX0xFVkVMLCAoIHZvaWQgKCopKCB2b2lkICkgKSB2RU1BQ0lTUl9XcmFwcGVyICk7DQoJCQlBVDkxQ19CQVNFX0FJQy0+QUlDX0lFQ1IgPSAweDEgPDwgQVQ5MUNfSURfRU1BQzsNCgkJfQ0KCQlwb3J0RVhJVF9DUklUSUNBTCgpOw0KCX0NCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoNCg0KDQovKg0KICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucyB0YWtlbiBmcm9tIHRoZSBBdG1lbA0KICogRU1BQyBzYW1wbGUgY29kZS4NCiAqLw0KDQpzdGF0aWMgcG9ydEJBU0VfVFlQRSBwcnZQcm9iZVBIWSggdm9pZCApDQp7DQp1bnNpZ25lZCBwb3J0TE9ORyB1bFBIWUlkMSwgdWxQSFlJZDIsIHVsU3RhdHVzOw0KcG9ydEJBU0VfVFlQRSB4UmV0dXJuID0gcGRQQVNTOw0KCQ0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBFbmFibGUgbWFuYWdlbWVudCBwb3J0ICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiB8PSBBVDkxQ19FTUFDX01QRTsJDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSIHw9ICggMiApIDw8IDEwOw0KDQoJLyogUmVhZCB0aGUgUEhZIElELiAqLw0KCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX1BIWVNJRDEsICZ1bFBIWUlkMSApOw0KCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX1BIWVNJRDIsICZ1bFBIWUlkMiApOw0KDQoJLyogQU1EIEFNNzlDODc1Og0KCQkJUEhZX0lEMSA9IDB4MDAyMg0KCQkJUEhZX0lEMiA9IDB4NTU0MQ0KCQkJQml0cyAzOjAgUmV2aXNpb24gTnVtYmVyIEZvdXIgYml0IG1hbnVmYWN0dXJlcpJzIHJldmlzaW9uIG51bWJlci4NCgkJCQkwMDAxIHN0YW5kcyBmb3IgUmV2LiBBLCBldGMuDQoJKi8NCglpZiggKCAoIHVsUEhZSWQxIDw8IDE2ICkgfCAoIHVsUEhZSWQyICYgMHhmZmYwICkgKSAhPSBNSUlfRE05MTYxX0lEICkNCgl7DQoJCS8qIERpZCBub3QgZXhwZWN0IHRoaXMgSUQuICovDQoJCXhSZXR1cm4gPSBwZEZBSUw7DQoJfQ0KCWVsc2UNCgl7DQoJCXVsU3RhdHVzID0geEdldExpbmtTcGVlZCgpOw0KDQoJCWlmKCB1bFN0YXR1cyAhPSBwZFBBU1MgKQ0KCQl7DQoJCQl4UmV0dXJuID0gcGRGQUlMOw0KCQl9DQoJfQ0KDQoJLyogRGlzYWJsZSBtYW5hZ2VtZW50IHBvcnQgKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSICY9IH5BVDkxQ19FTUFDX01QRTsJDQoNCgkvKiBFbmQgb2YgY29kZSBzdXBwbGllZCBieSBBdG1lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJcmV0dXJuIHhSZXR1cm47DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHZvaWQgdlJlYWRQSFkoIHVuc2lnbmVkIHBvcnRDSEFSIHVjUEhZQWRkcmVzcywgdW5zaWduZWQgcG9ydENIQVIgdWNBZGRyZXNzLCB1bnNpZ25lZCBwb3J0TE9ORyAqcHVsVmFsdWUgKQ0Kew0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19NQU4gPSAJKEFUOTFDX0VNQUNfU09GICYgKDB4MDE8PDMwKSkNCgkJCQkJCQkJCXwgKDIgPDwgMTYpIHwgKDIgPDwgMjgpDQoJCQkJCQkJCQl8ICgodWNQSFlBZGRyZXNzICYgMHgxZikgPDwgMjMpDQoJCQkJCQkJCQl8ICh1Y0FkZHJlc3MgPDwgMTgpOw0KDQoJLyogV2FpdCB1bnRpbCBJRExFIGJpdCBpbiBOZXR3b3JrIFN0YXR1cyByZWdpc3RlciBpcyBjbGVhcmVkLiAqLw0KCXdoaWxlKCAhKCBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTlNSICYgQVQ5MUNfRU1BQ19JRExFICkgKQ0KCXsNCgkJX19hc20oICJOT1AiICk7DQoJfQ0KDQoJKnB1bFZhbHVlID0gKCBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTUFOICYgMHgwMDAwZmZmZiApOwkNCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KI2lmIFVTRV9STUlJX0lOVEVSRkFDRSAhPSAxDQpzdGF0aWMgdm9pZCB2V3JpdGVQSFkoIHVuc2lnbmVkIHBvcnRDSEFSIHVjUEhZQWRkcmVzcywgdW5zaWduZWQgcG9ydENIQVIgdWNBZGRyZXNzLCB1bnNpZ25lZCBwb3J0TE9ORyB1bFZhbHVlICkNCnsNCgkvKiBDb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIChyZWZvcm1hdHRlZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTUFOID0gKCggQVQ5MUNfRU1BQ19TT0YgJiAoMHgwMTw8MzApKQ0KCQkJCQkJCQl8ICgyIDw8IDE2KSB8ICgxIDw8IDI4KQ0KCQkJCQkJCQl8ICgodWNQSFlBZGRyZXNzICYgMHgxZikgPDwgMjMpDQoJCQkJCQkJCXwgKHVjQWRkcmVzcyA8PCAxOCkpDQoJCQkJCQkJCXwgKHVsVmFsdWUgJiAweGZmZmYpOw0KDQoJLyogV2FpdCB1bnRpbCBJRExFIGJpdCBpbiBOZXR3b3JrIFN0YXR1cyByZWdpc3RlciBpcyBjbGVhcmVkICovDQoJd2hpbGUoICEoIEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OU1IgJiBBVDkxQ19FTUFDX0lETEUgKSApDQoJew0KCQlfX2FzbSggIk5PUCIgKTsNCgl9Ow0KDQoJLyogRW5kIG9mIGNvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCn0NCiNlbmRpZg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyBwb3J0QkFTRV9UWVBFIHhHZXRMaW5rU3BlZWQoIHZvaWQgKQ0Kew0KCXVuc2lnbmVkIHBvcnRMT05HIHVsQk1TUiwgdWxCTUNSLCB1bExQQSwgdWxNQUNDZmcsIHVsU3BlZWQsIHVsRHVwbGV4Ow0KDQoJLyogQ29kZSBzdXBwbGllZCBieSBBdG1lbCAocmVmb3JtYXR0ZWQpIC0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCS8qIExpbmsgc3RhdHVzIGlzIGxhdGNoZWQsIHNvIHJlYWQgdHdpY2UgdG8gZ2V0IGN1cnJlbnQgdmFsdWUgKi8NCgl2UmVhZFBIWShBVDkxQ19QSFlfQUREUiwgTUlJX0JNU1IsICZ1bEJNU1IpOw0KCXZSZWFkUEhZKEFUOTFDX1BIWV9BRERSLCBNSUlfQk1TUiwgJnVsQk1TUik7DQoNCglpZiggISggdWxCTVNSICYgQk1TUl9MU1RBVFVTICkgKQ0KCXsJDQoJCS8qIE5vIExpbmsuICovDQoJCXJldHVybiBwZEZBSUw7DQoJfQ0KDQoJdlJlYWRQSFkoQVQ5MUNfUEhZX0FERFIsIE1JSV9CTUNSLCAmdWxCTUNSKTsNCglpZiAodWxCTUNSICYgQk1DUl9BTkVOQUJMRSkNCgl7CQkJCQ0KCQkvKiBBdXRvTmVnb3RpYXRpb24gaXMgZW5hYmxlZC4gKi8NCgkJaWYgKCEodWxCTVNSICYgQk1TUl9BTkVHQ09NUExFVEUpKQ0KCQl7DQoJCQkvKiBBdXRvLW5lZ290aWF0aW9uIGluIHByb2dyZXNzLiAqLw0KCQkJcmV0dXJuIHBkRkFJTDsJCQkJDQoJCX0JCQ0KDQoJCXZSZWFkUEhZKEFUOTFDX1BIWV9BRERSLCBNSUlfTFBBLCAmdWxMUEEpOw0KCQlpZiggKCB1bExQQSAmIExQQV8xMDBGVUxMICkgfHwgKCB1bExQQSAmIExQQV8xMDBIQUxGICkgKQ0KCQl7DQoJCQl1bFNwZWVkID0gU1BFRURfMTAwOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdWxTcGVlZCA9IFNQRUVEXzEwOw0KCQl9DQoNCgkJaWYoICggdWxMUEEgJiBMUEFfMTAwRlVMTCApIHx8ICggdWxMUEEgJiBMUEFfMTBGVUxMICkgKQ0KCQl7DQoJCQl1bER1cGxleCA9IERVUExFWF9GVUxMOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdWxEdXBsZXggPSBEVVBMRVhfSEFMRjsNCgkJfQ0KCX0NCgllbHNlDQoJew0KCQl1bFNwZWVkID0gKCB1bEJNQ1IgJiBCTUNSX1NQRUVEMTAwICkgPyBTUEVFRF8xMDAgOiBTUEVFRF8xMDsNCgkJdWxEdXBsZXggPSAoIHVsQk1DUiAmIEJNQ1JfRlVMTERQTFggKSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7DQoJfQ0KDQoJLyogVXBkYXRlIHRoZSBNQUMgKi8NCgl1bE1BQ0NmZyA9IEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiAmIH4oIEFUOTFDX0VNQUNfU1BEIHwgQVQ5MUNfRU1BQ19GRCApOw0KCWlmKCB1bFNwZWVkID09IFNQRUVEXzEwMCApDQoJew0KCQlpZiggdWxEdXBsZXggPT0gRFVQTEVYX0ZVTEwgKQ0KCQl7DQoJCQkvKiAxMDAgRnVsbCBEdXBsZXggKi8NCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiA9IHVsTUFDQ2ZnIHwgQVQ5MUNfRU1BQ19TUEQgfCBBVDkxQ19FTUFDX0ZEOw0KCQl9DQoJCWVsc2UNCgkJewkJCQkJDQoJCQkvKiAxMDAgSGFsZiBEdXBsZXggKi8NCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiA9IHVsTUFDQ2ZnIHwgQVQ5MUNfRU1BQ19TUEQ7DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJaWYgKHVsRHVwbGV4ID09IERVUExFWF9GVUxMKQ0KCQl7DQoJCQkvKiAxMCBGdWxsIER1cGxleCAqLw0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSID0gdWxNQUNDZmcgfCBBVDkxQ19FTUFDX0ZEOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLyogMTAgSGFsZiBEdXBsZXggKi8NCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiA9IHVsTUFDQ2ZnOw0KCQl9DQoJfQ0KDQoJLyogRW5kIG9mIGNvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCXJldHVybiBwZFBBU1M7DQp9DQo=