LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogqSAyMDEzIE1pY3JvY2hpcCBUZWNobm9sb2d5IEluYy4gYW5kIGl0cyBzdWJzaWRpYXJpZXMuDQoqIFlvdSBtYXkgdXNlIHRoaXMgc29mdHdhcmUgYW5kIGFueSBkZXJpdmF0aXZlcyBleGNsdXNpdmVseSB3aXRoDQoqIE1pY3JvY2hpcCBwcm9kdWN0cy4NCiogVEhJUyBTT0ZUV0FSRSBJUyBTVVBQTElFRCBCWSBNSUNST0NISVAgIkFTIElTIi4NCiogTk8gV0FSUkFOVElFUywgV0hFVEhFUiBFWFBSRVNTLCBJTVBMSUVEIE9SIFNUQVRVVE9SWSwgQVBQTFkgVE8gVEhJUyBTT0ZUV0FSRSwNCiogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLA0KKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIElUUyBJTlRFUkFDVElPTiBXSVRIIE1JQ1JPQ0hJUA0KKiBQUk9EVUNUUywgQ09NQklOQVRJT04gV0lUSCBBTlkgT1RIRVIgUFJPRFVDVFMsIE9SIFVTRSBJTiBBTlkgQVBQTElDQVRJT04uDQoqIElOIE5PIEVWRU5UIFdJTEwgTUlDUk9DSElQIEJFIExJQUJMRSBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBQVU5JVElWRSwNCiogSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIExPU1MsIERBTUFHRSwgQ09TVCBPUiBFWFBFTlNFIE9GIEFOWSBLSU5EDQoqIFdIQVRTT0VWRVIgUkVMQVRFRCBUTyBUSEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VELCBFVkVOIElGIE1JQ1JPQ0hJUCBIQVMNCiogQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPUiBUSEUgREFNQUdFUyBBUkUgRk9SRVNFRUFCTEUuDQoqIFRPIFRIRSBGVUxMRVNUIEVYVEVOVCBBTExPV0VEIEJZIExBVywgTUlDUk9DSElQJ1MgVE9UQUwgTElBQklMSVRZIE9OIEFMTA0KKiBDTEFJTVMgSU4gQU5ZIFdBWSBSRUxBVEVEIFRPIFRISVMgU09GVFdBUkUgV0lMTCBOT1QgRVhDRUVEIFRIRSBBTU9VTlQgT0YNCiogRkVFUywgSUYgQU5ZLCBUSEFUIFlPVSBIQVZFIFBBSUQgRElSRUNUTFkgVE8gTUlDUk9DSElQIEZPUiBUSElTIFNPRlRXQVJFLg0KKiBNSUNST0NISVAgUFJPVklERVMgVEhJUyBTT0ZUV0FSRSBDT05ESVRJT05BTExZIFVQT04gWU9VUiBBQ0NFUFRBTkNFDQoqIE9GIFRIRVNFIFRFUk1TLg0KKi8NCg0KLyoqIEBkZWZncm91cCBwd20gcHdtX2Nfd3JhcHBlcg0KICogIEB7DQogKi8NCi8qKiBAZmlsZSBwd21fY193cmFwcGVyLmNwcA0KIFxicmllZiB0aGUgcHdtIGNvbXBvbmVudCBDIHdyYXBwZXIgICANCiBUaGlzIHByb2dyYW0gaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIG90aGVyIEMgcHJvZ3JhbXMgdG8gYmUgYWJsZSB0byB1c2UgdGhpcyBjb21wb25lbnQNCg0KIFRoZXJlIGFyZSBlbnRyeSBwb2ludHMgZm9yIGFsbCBDIHdyYXBwZXIgQVBJIGltcGxlbWVudGF0aW9uDQoNCjxiPlBsYXRmb3JtOjwvYj4gVGhpcyBpcyBBUkMtYmFzZWQgY29tcG9uZW50IA0KDQo8Yj5Ub29sc2V0OjwvYj4gTWV0YXdhcmUgSURFKDguNS4xKQ0KPGI+UmVmZXJlbmNlOjwvYj4gc21zY19yZXVzYWJsZV9md19yZXF1aXJlbWVudC5kb2MgKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqICBTTVNDIHZlcnNpb24gY29udHJvbCBpbmZvcm1hdGlvbiAoUGVyZm9yY2UpOg0KICoNCiAqICBGSUxFOiAgICAgJEZpbGU6IC8vZGVwb3RfcGNzL0ZXRW5nL3Byb2plY3RzL01FQzIwMTYvUGxheWdyb3VuZC9wcmFtYW5zLzE2MDYyM19GcmVlUlRPU19NaWNyb2NoaXBfTUVDMTcweC9EZW1vL0NPUlRFWF9NUFVfTUVDMTcwMV9LZWlsX0dDQy9wZXJpcGhlcmFsX2xpYnJhcnkvcGxhdGZvcm0uaCAkDQogKiAgUkVWSVNJT046ICRSZXZpc2lvbjogIzEgJA0KICogIERBVEVUSU1FOiAkRGF0ZVRpbWU6IDIwMTYvMDkvMjIgMDg6MDM6NDkgJA0KICogIEFVVEhPUjogICAkQXV0aG9yOiBwcmFtYW5zICQNCiAqDQogKiAgUmV2aXNpb24gaGlzdG9yeSAobGF0ZXN0IGZpcnN0KToNCiAqICAgICAgI3h4DQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqLw0KDQojaWZuZGVmIF9QTEFURk9STV9IXw0KI2RlZmluZSBfUExBVEZPUk1fSF8NCiNpbmNsdWRlIDxzdGRpbnQuaD4NCg0KLyogRW5hYmxlIGFueSBvbmUgb2YgdGhlIGJlbG93IGZsYWcgd2hpY2ggZW5hYmxlcyBlaXRoZXIgQWdncmVnYXRlZCBvciBEaXNhZ2dyZWdhdGVkIEludGVycnVwdHMgKi8NCiNkZWZpbmUgRElTQUdHUkVHQVRFRF9JTlBUX0RFRklORUQgCQkxDQovLyNkZWZpbmUgQUdHUkVHQVRFRF9JTlBUX0RFRklORUQJCQkxDQoNCi8qIFBsYXRmb3JtIENvbmZpZ3VyYXRpb24gUHJlUHJvY2Vzc29yIENvbmRpdGlvbnMgKi8NCiNkZWZpbmUgVE9PTEtFSUwgICAgMQ0KI2RlZmluZSBUT09MUEMgICAgICAyDQojZGVmaW5lIFRPT0xNVwkJMw0KI2RlZmluZSBUT09MTURLCQk0DQoNCiNkZWZpbmUgUENMSU5UICAgICAgOSAgIC8vYWRkZWQgdG8gc2F0aXNmeSBQQyBMaW50J3MgbmVlZCBmb3IgYSB2YWx1ZSBoZXJlDQoNCiNpZmRlZiBfX0NDX0FSTSAgICAgICAgIC8vIEtlaWwgQVJNIE1ESw0KI2RlZmluZSBUT09MU0VUIFRPT0xNREsNCiNlbmRpZg0KDQojaWYgMA0KI2lmZGVmIF9XSU4zMiAgICAgICAgICAgLy9hbHdheXMgZGVmaW5lZCBieSB2aXN1YWwgYysrDQojZGVmaW5lIFRPT0xTRVQgVE9PTFBDDQojZW5kaWYNCg0KI2lmZGVmIF9fV0lOMzJfXyAgICAgICAgLy9hbHdheXMgZGVmaW5lZCBieSBib3JsYW5kDQojZGVmaW5lIFRPT0xTRVQgVE9PTFBDDQojZW5kaWYNCiNlbmRpZg0KDQoNCiNpZmRlZiBfQVJDDQojZGVmaW5lIFRPT0xTRVQgVE9PTE1XICAgIC8vIEFSQyBNZXRhd2FyZQ0KI2VuZGlmDQoNCiNpZm5kZWYgVE9PTFNFVA0KLy8jZXJyb3IgIkVSUk9SOiBjZmcuaCBUT09MU0VUIG5vdCBkZWZpbmVkISINCiNlbmRpZg0KDQojaWYgVE9PTFNFVCA9PSBUT09MTURLDQojZGVmaW5lIF9LRUlMX0FSTV8gIDEgICAvKiBNYWtlIDEgZm9yIEtlaWwgTURLIENvbXBpbGVyICAgICAqLw0KI2RlZmluZSBfS0VJTF8gIDAgICAgICAgLyogTWFrZSAxIGZvciBLZWlsIENvbXBpbGVyICAgICAqLw0KI2RlZmluZSBfUENfICAgIDAgICANCiNkZWZpbmUgX0FSQ19DT1JFXwkwDQojZW5kaWYNCg0KI2lmIFRPT0xTRVQgPT0gVE9PTEtFSUwNCiNkZWZpbmUgX0tFSUxfQVJNXyAgMA0KI2RlZmluZSBfS0VJTF8gIDEgICAvKiBNYWtlIDEgZm9yIEtlaWwgQ29tcGlsZXIgICAgICovDQojZGVmaW5lIF9QQ18gICAgMCAgIA0KI2RlZmluZSBfQVJDX0NPUkVfCTANCiNlbmRpZg0KDQojaWYgVE9PTFNFVCA9PSBUT09MUEMNCiNkZWZpbmUgX0tFSUxfQVJNXyAgMA0KI2RlZmluZSBfS0VJTF8gIDAgICANCiNkZWZpbmUgX1BDXyAgICAxIAkvKiBNYWtlIDEgZm9yIFBDIEVudmlyb25tZW50ICAgICovDQojZGVmaW5lIF9BUkNfQ09SRV8JMA0KI2VuZGlmDQoNCiNpZiBUT09MU0VUID09IFRPT0xNVw0KI2RlZmluZSBfS0VJTF9BUk1fICAwDQojZGVmaW5lIF9LRUlMXwkwDQojZGVmaW5lIF9QQ18JMA0KI2RlZmluZSBfQVJDX0NPUkVfCTENCiNlbmRpZg0KDQovKiBTaG9ydCBmb3JtIGZvciBTdGFuZGFyZCBEYXRhIFR5cGVzICovDQp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAgIFVJTlQ4Ow0KdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgICBVSU5UMTY7DQp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIFVJTlQzMjsNCg0KdHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICBSRUc4Ow0KDQp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAgIEJZVEU7DQp0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgIFdPUkQ7DQp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIERXT1JEOw0KDQp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAgIFVDSEFSOw0KdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgICBVU0hPUlQ7DQp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIFVMT05HOw0KDQp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAgIEJPT0w7DQp0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgICAgIFVJTlQ7DQoNCi8qIHNpZ25lZCB0eXBlcyAqLw0KdHlwZWRlZiBzaWduZWQgY2hhciAgICAgICAgICAgICBJTlQ4Ow0KdHlwZWRlZiBzaWduZWQgc2hvcnQgICAgICAgICAgICBJTlQxNjsNCnR5cGVkZWYgc2lnbmVkIGxvbmcgICAgICAgICAgICAgSU5UMzI7DQoNCnR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICAgICAgVk9JRDsNCg0KdHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgICAgVlVJTlQ4Ow0KdHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBpbnQgVlVJTlQxNjsNCnR5cGVkZWYgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpbnQgIFZVSU5UMzI7DQovKiB1bmlvbiB0eXBlcyAqLw0KdHlwZWRlZiB1bmlvbiBfQklUU184DQp7DQogICAgVUlOVDggYnl0ZTsNCiAgICBzdHJ1Y3QNCiAgICB7DQoJCVVJTlQ4IGJpdDA6IDE7DQoJCVVJTlQ4IGJpdDE6IDE7DQoJCVVJTlQ4IGJpdDI6IDE7DQoJCVVJTlQ4IGJpdDM6IDE7DQoJCVVJTlQ4IGJpdDQ6IDE7DQoJCVVJTlQ4IGJpdDU6IDE7DQoJCVVJTlQ4IGJpdDY6IDE7DQoJCVVJTlQ4IGJpdDc6IDE7DQogICB9Yml0Ow0KfUJJVFNfODsNCg0KDQovKiBNQUNST1MgRk9SIFBsYXRmb3JtIFBvcnRhYmlsaXR5ICovDQoNCi8qIG1hY3JvIGZvciBkZWZpbmluZyBNTUNSIHJlZ2lzdGVyICovDQovKiBhZGQgTU1DUkFSUkFZKCkgJiBFWFRFUk5NTUNSQVJSQVkoKSAqLw0KI2lmCV9LRUlMXw0KI2RlZmluZSBNTUNSKG5hbWUsYWRkcmVzcykgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHhkYXRhIG5hbWUgX2F0XyBhZGRyZXNzDQojZGVmaW5lIE1NQ1JBUlJBWShuYW1lLGxlbmd0aCxhZGRyZXNzKSAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciB4ZGF0YSBuYW1lW2xlbmd0aF0gX2F0XyBhZGRyZXNzDQojZGVmaW5lIE1NQ1JUWVBFKG5hbWUsZHR5cGUsYWRkcmVzcykgdm9sYXRpbGUgZHR5cGUgeGRhdGEgbmFtZSBfYXRfIGFkZHJlc3MNCiNkZWZpbmUgRVhURVJOTU1DUihuYW1lKSAgICAgICAgZXh0ZXJuIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgeGRhdGEgbmFtZQ0KI2RlZmluZSBFWFRFUk5NTUNSQVJSQVkobmFtZSkgICBleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgY2hhciB4ZGF0YSBuYW1lW10NCiNkZWZpbmUgRVhURVJOTU1DUlRZUEUobmFtZSxkdHlwZSkgZXh0ZXJuIHZvbGF0aWxlIGR0eXBlIHhkYXRhIG5hbWUNCiNkZWZpbmUgU0ZSKG5hbWUsYWRkcmVzcykgICAgICAgc2ZyIG5hbWUgPSBhZGRyZXNzDQojZGVmaW5lIFNGUkJJVChuYW1lLGFkZHJlc3MpICAgIHNiaXQgbmFtZSA9IGFkZHJlc3MNCiNkZWZpbmUgRVhURVJOU0ZSKG5hbWUpIA0KI2RlZmluZSBCSVRBRERSRVNTVFlQRShuYW1lKSAgICBiaXQgbmFtZQ0KI2RlZmluZSBYREFUQSAgICAgICAgICAgICAgICAgICB4ZGF0YQ0KI2RlZmluZSBDT0RFICAgICAgICAgICAgICAgICAgICBjb2RlDQojZGVmaW5lIERBVEEgICAgICAgICAgICAgICAgICAgIGRhdGENCiNkZWZpbmUgSURBVEEgICAgICAgICAgICAgICAgICAgaWRhdGENCiNkZWZpbmUgSU5URVJSVVBUKHgpICAgICAgICAgICAgaW50ZXJydXB0IHgNCiNkZWZpbmUgU0VUX0dMT0JBTF9JTlRSX0VOQUJMRSgpCShzZnJJRV9FQWJpdCA9IFRSVUU7KQ0KI2RlZmluZSBDTFJfR0xPQkFMX0lOVFJfRU5BQkxFKCkJKHNmcklFX0VBYml0ID0gRkFMU0U7KQ0KI2RlZmluZSBOVUxMUFRSCQkJCQkJKGNoYXIgKikoMCkNCiNkZWZpbmUJUExBVEZPUk1fVFJJTV9PU0MoKQkJCS8vIFRPRE8NCiNkZWZpbmUgUE5PUCgpIA0KI2RlZmluZSBESVNBQkxFX0lOVEVSUlVQVFMoKSBzZnJJRV9FQWJpdD0wDQojZGVmaW5lIEVOQUJMRV9JTlRFUlJVUFRTKCkgc2ZySUVfRUFiaXQ9MQ0KI2RlZmluZSBTQVZFX0RJU19JTlRFUlJVUFRTKHgpIHsgeD1zZnJJRV9FQWJpdDsgc2ZySUVfRUFiaXQ9MDsgfQ0KI2RlZmluZSBSRVNUT1JFX0lOVEVSUlVQVFMoeCkgeyBzZnJJRV9FQWJpdD14OyB9DQojZGVmaW5lIEFUT01JQ19DUFVfU0xFRVAoKQ0KI2RlZmluZSBOVU1fSVJRX1ZFQ1RPUlMgICAgIDEyICAvLyBEVy04MDUxDQojZGVmaW5lIElSUV9WRUNUT1JfU0laRSAgICAgOCANCiNkZWZpbmUgVVNFX0lOTElORV9QQVRDSEVSICAxDQojZGVmaW5lIElSUV9WRUNUQUJMRV9JTl9SQU0gMA0KI2RlZmluZSBQTEFUX1JPTV9JUlFfVkVDVE9SX0JBU0UgMHgwMyAgLy8gUk9NIHN0YXJ0DQojZGVmaW5lIFBMQVRfSVJRX1ZFQ1RPUl9CQVNFIDB4MTAwMyAgICAvLyBSQU0gc3RhcnQNCiNkZWZpbmUgRlVOQ19ORVZFUl9SRVRVUk5TDQojZGVmaW5lIEJFR0lOX1NNQUxMX0RBVEFfQkxPQ0soeCkNCiNkZWZpbmUgRU5EX1NNQUxMX0RBVEFfQkxPQ0soKQ0KVUlOVDMyIHNvZnRfbm9ybShVSU5UMzIgdmFsKTsNCiNkZWZpbmUgTk9STSh4KSBzb2Z0X25vcm0oeCkNCi8vDQojZGVmaW5lIFVTRV9GVU5DX1JFUExBQ0VNRU5UICAgIDANCiNlbmRpZg0KDQojaWYgX1BDXw0KI2RlZmluZSBNTUNSKG5hbWUsYWRkcmVzcykgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIG5hbWUNCiNkZWZpbmUgTU1DUkFSUkFZKG5hbWUsbGVuZ3RoLGFkZHJlc3MpICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIG5hbWVbbGVuZ3RoXQ0KI2RlZmluZSBNTUNSVFlQRShuYW1lLGR0eXBlLGFkZHJlc3MpIHZvbGF0aWxlIGR0eXBlIG5hbWUNCiNkZWZpbmUgRVhURVJOTU1DUihuYW1lKSAgICAgICAgZXh0ZXJuIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgbmFtZQ0KI2RlZmluZSBFWFRFUk5NTUNSQVJSQVkobmFtZSkgICBleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgY2hhciBuYW1lW10NCiNkZWZpbmUgRVhURVJOTU1DUlRZUEUobmFtZSxkdHlwZSkgZXh0ZXJuIHZvbGF0aWxlIGR0eXBlIG5hbWUNCiNkZWZpbmUgU0ZSKG5hbWUsYWRkcmVzcykgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBuYW1lDQojZGVmaW5lIFNGUkJJVChuYW1lLGFkZHJlc3MpICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgbmFtZQ0KI2RlZmluZSBFWFRFUk5TRlIobmFtZSkgICAgICAgICBleHRlcm4Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBuYW1lDQojZGVmaW5lIEJJVEFERFJFU1NUWVBFKG5hbWUpICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgbmFtZQ0KI2RlZmluZSBYREFUQQ0KI2RlZmluZSBDT0RFICAgICAgICAgICAgICAgIA0KI2RlZmluZSBEQVRBDQojZGVmaW5lIElEQVRBDQojZGVmaW5lIElOVEVSUlVQVCh4KQ0KI2RlZmluZSBTRVRfR0xPQkFMX0lOVFJfRU5BQkxFKCkJKHNmcklFX0VBYml0ID0gVFJVRTspDQojZGVmaW5lIENMUl9HTE9CQUxfSU5UUl9FTkFCTEUoKQkoc2ZySUVfRUFiaXQgPSBGQUxTRTspDQojZGVmaW5lIE5VTExQVFIJCQkJCQkoY2hhciAqKSgwKQ0KI2RlZmluZQlQTEFURk9STV9UUklNX09TQygpCQkJLy8gVE9ETw0KI2RlZmluZSBQTk9QKCkgDQojZGVmaW5lIERJU0FCTEVfSU5URVJSVVBUUygpIA0KI2RlZmluZSBFTkFCTEVfSU5URVJSVVBUUygpDQojZGVmaW5lIFNBVkVfRElTX0lOVEVSUlVQVFMoeCkgDQojZGVmaW5lIFJFU1RPUkVfSU5URVJSVVBUUyh4KSANCiNkZWZpbmUgQVRPTUlDX0NQVV9TTEVFUCgpDQojZGVmaW5lIE5VTV9JUlFfVkVDVE9SUyAgICAgMjQNCiNkZWZpbmUgSVJRX1ZFQ1RPUl9TSVpFICAgICA4DQojZGVmaW5lIFVTRV9JTkxJTkVfUEFUQ0hFUiAgMQ0KI2RlZmluZSBJUlFfVkVDVEFCTEVfSU5fUkFNIDANCiNkZWZpbmUgRlVOQ19ORVZFUl9SRVRVUk5TDQojZGVmaW5lIEJFR0lOX1NNQUxMX0RBVEFfQkxPQ0soeCkNCiNkZWZpbmUgRU5EX1NNQUxMX0RBVEFfQkxPQ0soKQ0KVUlOVDMyIHNvZnRfbm9ybShVSU5UMzIgdmFsKTsNCiNkZWZpbmUgTk9STSh4KSBzb2Z0X25vcm0oeCkNCi8vDQojZGVmaW5lIFVTRV9GVU5DX1JFUExBQ0VNRU5UICAgIDANCiNlbmRpZg0KDQojaWYgX0FSQ19DT1JFXw0KLy8gQVJDIEMgaGFzIG5vIGVxdWl2YWxlbnQgb3BlcmF0b3IgdG8gc3BlY2lmeSBhZGRyZXNzIG9mIGEgdmFyaWFibGUNCi8vIEFSQyBNTUNSJ3MgYXJlIDMyLWJpdCByZWdpc3RlcnMNCiNkZWZpbmUgTU1DUihuYW1lLGFkZHJlc3MpICAgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBuYW1lDQojZGVmaW5lIE1NQ1JBUlJBWShuYW1lLGxlbmd0aCxhZGRyZXNzKSAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBuYW1lW2xlbmd0aF0NCiNkZWZpbmUgTU1DUlRZUEUobmFtZSxkdHlwZSxhZGRyZXNzKSB2b2xhdGlsZSBkdHlwZSBuYW1lIA0KI2RlZmluZSBFWFRFUk5NTUNSKG5hbWUpICAgICAgICBleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgY2hhciBuYW1lDQojZGVmaW5lIEVYVEVSTk1NQ1JBUlJBWShuYW1lKSAgIGV4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIG5hbWVbXQ0KI2RlZmluZSBFWFRFUk5NTUNSVFlQRShuYW1lLGR0eXBlKSBleHRlcm4gdm9sYXRpbGUgZHR5cGUgbmFtZQ0KI2RlZmluZSBTRlIobmFtZSxhZGRyZXNzKSAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgbmFtZSAgICAgICAgDQojZGVmaW5lIFNGUkJJVChuYW1lLGFkZHJlc3MpIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgbmFtZSANCiNkZWZpbmUgRVhURVJOU0ZSKG5hbWUpIGV4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIG5hbWUgDQojZGVmaW5lIEJJVEFERFJFU1NUWVBFKG5hbWUpIA0KI2RlZmluZSBYREFUQQ0KI2RlZmluZSBDT0RFICAgICANCiNkZWZpbmUgREFUQQ0KI2RlZmluZSBJREFUQQ0KI2RlZmluZSBJTlRFUlJVUFQoeCkNCiNkZWZpbmUgU0VUX0dMT0JBTF9JTlRSX0VOQUJMRSgpCShfZW5hYmxlKCkpDQojZGVmaW5lIENMUl9HTE9CQUxfSU5UUl9FTkFCTEUoKQkoX2Rpc2FibGUoKSkNCiNkZWZpbmUgTlVMTFBUUgkJCQkJCShjaGFyICopKDApDQojZGVmaW5lIE5VTExWT0lEUFRSICAgICAgICAgICAgICAgICAodm9pZCAqKSgwKQ0KI2RlZmluZSBOVUxMRlBUUgkJCQkJKHZvaWQgKCopKHZvaWQpKTANCiNkZWZpbmUJUExBVEZPUk1fVFJJTV9PU0MoKQkJCS8vIFRPRE8NCiNkZWZpbmUgUE5PUCgpIF9ub3AoKQ0KI2RlZmluZSBESVNBQkxFX0lOVEVSUlVQVFMoKSBfZGlzYWJsZSgpDQojZGVmaW5lIEVOQUJMRV9JTlRFUlJVUFRTKCkgX2VuYWJsZSgpDQojZGVmaW5lIFNBVkVfRElTX0lOVEVSUlVQVFMoeCkgeyB4PV9scihSRUdfU1RBVFVTMzIpO19mbGFnKHggJiB+KFJFR19TVEFUVVMzMl9FMV9CSVQgfCBSRUdfU1RBVFVTMzJfRTJfQklUKSk7X25vcCgpOyB9DQojZGVmaW5lIFJFU1RPUkVfSU5URVJSVVBUUyh4KSB7IF9mbGFnKChfbHIoUkVHX1NUQVRVUzMyKSB8ICh4ICYgKFJFR19TVEFUVVMzMl9FMV9CSVQgfCBSRUdfU1RBVFVTMzJfRTJfQklUKSkpKTtfbm9wKCk7IH0NCiNkZWZpbmUgQVRPTUlDX0NQVV9TTEVFUCgpIF9mbGFnKDYpO19zbGVlcCgpO19ub3AoKTtfbm9wKCk7DQojZGVmaW5lIE5VTV9JUlFfVkVDVE9SUyAgICAgMjQNCiNkZWZpbmUgSVJRX1ZFQ1RPUl9TSVpFICAgICA4DQojZGVmaW5lIFVTRV9JTkxJTkVfUEFUQ0hFUiAgMA0KI2RlZmluZSBEQ0NNX0NPREVfQUxJQVNfQUREUiAgMHgwMDA2MDAwMA0KI2RlZmluZSBQTEFUX1JPTV9JUlFfVkVDVE9SX0JBU0UgMA0KI2RlZmluZSBQTEFUX0lSUV9WRUNUT1JfQkFTRSAgKERDQ01fQ09ERV9BTElBU19BRERSKQ0KLy8vIHkgI2RlZmluZSBJUlFfVkVDVEFCTEVfSU5fUkFNIDENCiNkZWZpbmUgSVJRX1ZFQ1RBQkxFX0lOX1JBTSAwDQojZGVmaW5lIEZVTkNfTkVWRVJfUkVUVVJOUyAgX0NDKF9ORVZFUl9SRVRVUk5TKQ0KI2RlZmluZSBCRUdJTl9TTUFMTF9EQVRBX0JMT0NLKHgpICAjcHJhZ21hIFB1c2hfc21hbGxfZGF0YSh4KQ0KI2RlZmluZSBFTkRfU01BTExfREFUQV9CTE9DSygpICAjcHJhZ21hIFBvcF9zbWFsbF9kYXRhKCkNCiNkZWZpbmUgTk9STSh4KSBfbm9ybSh4KQ0KDQojZGVmaW5lIElOTElORV9GVU5DVElPTih4KSAjcHJhZ21hIE9uX2lubGluZSh4KQ0KDQovLw0KI2RlZmluZSBVU0VfRlVOQ19SRVBMQUNFTUVOVCAgICAwDQojZW5kaWYNCg0KI2lmIF9LRUlMX0FSTV8NCi8vIEZvciBBUk0gTURLIGNvbXBpbGVyDQovLyBBUk0gTU1DUidzIGFyZSAzMi1iaXQgcmVnaXN0ZXJzDQojZGVmaW5lIE1NQ1IobmFtZSxhZGRyZXNzKSAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgbmFtZQ0KI2RlZmluZSBNTUNSQVJSQVkobmFtZSxsZW5ndGgsYWRkcmVzcykgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgbmFtZVtsZW5ndGhdDQojZGVmaW5lIE1NQ1JUWVBFKG5hbWUsZHR5cGUsYWRkcmVzcykgdm9sYXRpbGUgZHR5cGUgbmFtZSANCiNkZWZpbmUgRVhURVJOTU1DUihuYW1lKSAgICAgICAgZXh0ZXJuIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgbmFtZQ0KI2RlZmluZSBFWFRFUk5NTUNSQVJSQVkobmFtZSkgICBleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgY2hhciBuYW1lW10NCiNkZWZpbmUgRVhURVJOTU1DUlRZUEUobmFtZSxkdHlwZSkgZXh0ZXJuIHZvbGF0aWxlIGR0eXBlIG5hbWUNCiNkZWZpbmUgU0ZSKG5hbWUsYWRkcmVzcykgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIG5hbWUgICAgICAgIA0KI2RlZmluZSBTRlJCSVQobmFtZSxhZGRyZXNzKSB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIG5hbWUgDQojZGVmaW5lIEVYVEVSTlNGUihuYW1lKSBleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgY2hhciBuYW1lIA0KI2RlZmluZSBCSVRBRERSRVNTVFlQRShuYW1lKSANCiNkZWZpbmUgWERBVEENCiNkZWZpbmUgQ09ERSAgICAgDQojZGVmaW5lIERBVEENCiNkZWZpbmUgSURBVEENCiNkZWZpbmUgSU5URVJSVVBUKHgpDQojZGVmaW5lIFNFVF9HTE9CQUxfSU5UUl9FTkFCTEUoKQkoX19lbmFibGVfaXJxKCkpDQojZGVmaW5lIENMUl9HTE9CQUxfSU5UUl9FTkFCTEUoKQkoX19kaXNhYmxlX2lycSgpKQ0KI2RlZmluZSBOVUxMUFRSCQkJCQkJKGNoYXIgKikoMCkNCiNkZWZpbmUgTlVMTFZPSURQVFIgICAgICAgICAgICAgICAgICh2b2lkICopKDApDQojZGVmaW5lIE5VTExGUFRSCQkJCQkodm9pZCAoKikodm9pZCkpMA0KI2RlZmluZQlQTEFURk9STV9UUklNX09TQygpCQkJLy8gVE9ETw0KI2RlZmluZSBQTk9QKCkgX19OT1AoKQ0KI2RlZmluZSBESVNBQkxFX0lOVEVSUlVQVFMoKSBfX2Rpc2FibGVfaXJxKCkNCiNkZWZpbmUgRU5BQkxFX0lOVEVSUlVQVFMoKSBfX2VuYWJsZV9pcnEoKQ0KI2RlZmluZSBBVE9NSUNfQ1BVX1NMRUVQKCkgX193ZmkoKTtfX25vcCgpO19fbm9wKCk7DQoNCiNpZiAwIC8qIG5lZWQgZnVydGhlciBlZmZvcnRzIGlmIG5lZWRlZCAqLw0KI2RlZmluZSBTQVZFX0RJU19JTlRFUlJVUFRTKHgpIHsgeD1fbHIoUkVHX1NUQVRVUzMyKTtfZmxhZyh4ICYgfihSRUdfU1RBVFVTMzJfRTFfQklUIHwgUkVHX1NUQVRVUzMyX0UyX0JJVCkpO19ub3AoKTsgfQ0KI2RlZmluZSBSRVNUT1JFX0lOVEVSUlVQVFMoeCkgeyBfZmxhZygoX2xyKFJFR19TVEFUVVMzMikgfCAoeCAmIChSRUdfU1RBVFVTMzJfRTFfQklUIHwgUkVHX1NUQVRVUzMyX0UyX0JJVCkpKSk7X25vcCgpOyB9DQojZGVmaW5lIE5VTV9JUlFfVkVDVE9SUyAgICAgMjQNCiNkZWZpbmUgSVJRX1ZFQ1RPUl9TSVpFICAgICA4DQojZGVmaW5lIFVTRV9JTkxJTkVfUEFUQ0hFUiAgMA0KI2RlZmluZSBEQ0NNX0NPREVfQUxJQVNfQUREUiAgMHgwMDA2MDAwMA0KI2RlZmluZSBQTEFUX1JPTV9JUlFfVkVDVE9SX0JBU0UgMA0KI2RlZmluZSBQTEFUX0lSUV9WRUNUT1JfQkFTRSAgKERDQ01fQ09ERV9BTElBU19BRERSKQ0KLy8vIHkgI2RlZmluZSBJUlFfVkVDVEFCTEVfSU5fUkFNIDENCiNkZWZpbmUgSVJRX1ZFQ1RBQkxFX0lOX1JBTSAwDQojZGVmaW5lIEJFR0lOX1NNQUxMX0RBVEFfQkxPQ0soeCkgICNwcmFnbWEgUHVzaF9zbWFsbF9kYXRhKHgpDQojZGVmaW5lIEVORF9TTUFMTF9EQVRBX0JMT0NLKCkgICNwcmFnbWEgUG9wX3NtYWxsX2RhdGEoKQ0KI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04oeCkgI3ByYWdtYSBPbl9pbmxpbmUoeCkNCiNkZWZpbmUgVVNFX0ZVTkNfUkVQTEFDRU1FTlQgICAgMA0KI2VuZGlmDQoNCiNpZiAwDQojZGVmaW5lIEZVTkNfTkVWRVJfUkVUVVJOUyAgX0NDKF9ORVZFUl9SRVRVUk5TKQ0KI2RlZmluZSBOT1JNKHgpIF9ub3JtKHgpDQojZWxzZQ0KLyogZm9yIEFSTSBNREsgKi8NCiNkZWZpbmUgRlVOQ19ORVZFUl9SRVRVUk5TDQpVSU5UMzIgc29mdF9ub3JtKFVJTlQzMiB2YWwpOw0KI2RlZmluZSBOT1JNKHgpIHNvZnRfbm9ybSh4KQ0KI2VuZGlmDQojZW5kaWYNCg0KLyogR2VuZXJhbCBDb25zdGFudHMgKi8NCiNkZWZpbmUgRkFMU0UgICAweDAwDQojZGVmaW5lIFRSVUUgICAgIUZBTFNFDQoNCiNkZWZpbmUgQklUX25fTUFTSyhuKQkoMVUgPDwgKG4pKQ0KI2RlZmluZSBCSVRfMF9NQVNLICAgICgxPDwwKQ0KI2RlZmluZSBCSVRfMV9NQVNLICAgICgxPDwxKQ0KI2RlZmluZSBCSVRfMl9NQVNLICAgICgxPDwyKQ0KI2RlZmluZSBCSVRfM19NQVNLICAgICgxPDwzKQ0KI2RlZmluZSBCSVRfNF9NQVNLICAgICgxPDw0KQ0KI2RlZmluZSBCSVRfNV9NQVNLICAgICgxPDw1KQ0KI2RlZmluZSBCSVRfNl9NQVNLICAgICgxPDw2KQ0KI2RlZmluZSBCSVRfN19NQVNLICAgICgxPDw3KQ0KI2RlZmluZSBCSVRfOF9NQVNLICAgICgoVUlOVDE2KTE8PDgpDQojZGVmaW5lIEJJVF85X01BU0sgICAgKChVSU5UMTYpMTw8OSkNCiNkZWZpbmUgQklUXzEwX01BU0sgICAoKFVJTlQxNikxPDwxMCkNCiNkZWZpbmUgQklUXzExX01BU0sgICAoKFVJTlQxNikxPDwxMSkNCiNkZWZpbmUgQklUXzEyX01BU0sgICAoKFVJTlQxNikxPDwxMikNCiNkZWZpbmUgQklUXzEzX01BU0sgICAoKFVJTlQxNikxPDwxMykNCiNkZWZpbmUgQklUXzE0X01BU0sgICAoKFVJTlQxNikxPDwxNCkNCiNkZWZpbmUgQklUXzE1X01BU0sgICAoKFVJTlQxNikxPDwxNSkNCiNkZWZpbmUgQklUXzE2X01BU0sgICAgICgoVUlOVDMyKTE8PDE2KQ0KI2RlZmluZSBCSVRfMTdfTUFTSyAgICAgKChVSU5UMzIpMTw8MTcpDQojZGVmaW5lIEJJVF8xOF9NQVNLICAgICAoKFVJTlQzMikxPDwxOCkNCiNkZWZpbmUgQklUXzE5X01BU0sgICAgICgoVUlOVDMyKTE8PDE5KQ0KI2RlZmluZSBCSVRfMjBfTUFTSyAgICAgKChVSU5UMzIpMTw8MjApDQojZGVmaW5lIEJJVF8yMV9NQVNLICAgICAoKFVJTlQzMikxPDwyMSkNCiNkZWZpbmUgQklUXzIyX01BU0sgICAgICgoVUlOVDMyKTE8PDIyKQ0KI2RlZmluZSBCSVRfMjNfTUFTSyAgICAgKChVSU5UMzIpMTw8MjMpDQojZGVmaW5lIEJJVF8yNF9NQVNLICAgICAoKFVJTlQzMikxPDwyNCkNCiNkZWZpbmUgQklUXzI1X01BU0sgICAgICgoVUlOVDMyKTE8PDI1KQ0KI2RlZmluZSBCSVRfMjZfTUFTSyAgICAgKChVSU5UMzIpMTw8MjYpDQojZGVmaW5lIEJJVF8yN19NQVNLICAgICAoKFVJTlQzMikxPDwyNykNCiNkZWZpbmUgQklUXzI4X01BU0sgICAgICgoVUlOVDMyKTE8PDI4KQ0KI2RlZmluZSBCSVRfMjlfTUFTSyAgICAgKChVSU5UMzIpMTw8MjkpDQojZGVmaW5lIEJJVF8zMF9NQVNLICAgICAoKFVJTlQzMikxPDwzMCkNCiNkZWZpbmUgQklUXzMxX01BU0sgICAgICgoVUlOVDMyKTE8PDMxKQ0KDQoNCi8qIEZvciBDRUMgYXBwbGljYXRpb24gICovDQojZGVmaW5lIE9OICAxDQojZGVmaW5lIE9GRiAwDQoNCiNlbmRpZiAvKl9QTEFURk9STV9IXyovDQoNCi8qKiAgIEB9DQogKi8NCg0K