LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQogKiBUcmFjZWFseXplciB2Mi41LjAgUmVjb3JkZXIgTGlicmFyeQ0KICogUGVyY2VwaW8gQUIsIHd3dy5wZXJjZXBpby5jb20NCiAqDQogKiB0cmNIYXJkd2FyZVBvcnQuaA0KICoNCiAqIENvbnRhaW5zIHRvZ2V0aGVyIHdpdGggdHJjSGFyZHdhcmVQb3J0LmMgYWxsIGhhcmR3YXJlIHBvcnRhYmlsaXR5IGlzc3VlcyBvZiANCiAqIHRoZSB0cmFjZSByZWNvcmRlciBsaWJyYXJ5Lg0KICoNCiAqIFRlcm1zIG9mIFVzZQ0KICogVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHQgUGVyY2VwaW8gQUIuIFRoZSByZWNvcmRlciBsaWJyYXJ5IGlzIGZyZWUgZm9yDQogKiB1c2UgdG9nZXRoZXIgd2l0aCBQZXJjZXBpbyBwcm9kdWN0cy4gWW91IG1heSBkaXN0cmlidXRlIHRoZSByZWNvcmRlciBsaWJyYXJ5DQogKiBpbiBpdHMgb3JpZ2luYWwgZm9ybSwgaW5jbHVkaW5nIG1vZGlmaWNhdGlvbnMgaW4gdHJjUG9ydC5jIGFuZCB0cmNQb3J0LmgNCiAqIGdpdmVuIHRoYXQgdGhlc2UgbW9kaWZpY2F0aW9uIGFyZSBjbGVhcmx5IG1hcmtlZCBhcyB5b3VyIG93biBtb2RpZmljYXRpb25zDQogKiBhbmQgZG9jdW1lbnRlZCBpbiB0aGUgaW5pdGlhbCBjb21tZW50IHNlY3Rpb24gb2YgdGhlc2Ugc291cmNlIGZpbGVzLiANCiAqIFRoaXMgc29mdHdhcmUgaXMgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBQZXJjZXBpbyBBQiBhbmQgbWF5IG5vdCBiZSANCiAqIHNvbGQgb3IgaW4gb3RoZXIgd2F5cyBjb21tZXJjaWFsbHkgcmVkaXN0cmlidXRlZCB3aXRob3V0IGV4cGxpY2l0IHdyaXR0ZW4gDQogKiBwZXJtaXNzaW9uIGJ5IFBlcmNlcGlvIEFCLg0KICoNCiAqIERpc2NsYWltZXIgDQogKiBUaGUgdHJhY2UgdG9vbCBhbmQgcmVjb3JkZXIgbGlicmFyeSBpcyBiZWluZyBkZWxpdmVyZWQgdG8geW91IEFTIElTIGFuZCANCiAqIFBlcmNlcGlvIEFCIG1ha2VzIG5vIHdhcnJhbnR5IGFzIHRvIGl0cyB1c2Ugb3IgcGVyZm9ybWFuY2UuIFBlcmNlcGlvIEFCIGRvZXMgDQogKiBub3QgYW5kIGNhbm5vdCB3YXJyYW50IHRoZSBwZXJmb3JtYW5jZSBvciByZXN1bHRzIHlvdSBtYXkgb2J0YWluIGJ5IHVzaW5nIHRoZSANCiAqIHNvZnR3YXJlIG9yIGRvY3VtZW50YXRpb24uIFBlcmNlcGlvIEFCIG1ha2Ugbm8gd2FycmFudGllcywgZXhwcmVzcyBvciANCiAqIGltcGxpZWQsIGFzIHRvIG5vbmluZnJpbmdlbWVudCBvZiB0aGlyZCBwYXJ0eSByaWdodHMsIG1lcmNoYW50YWJpbGl0eSwgb3IgDQogKiBmaXRuZXNzIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiBJbiBubyBldmVudCB3aWxsIFBlcmNlcGlvIEFCLCBpdHMgDQogKiB0ZWNobm9sb2d5IHBhcnRuZXJzLCBvciBkaXN0cmlidXRvcnMgYmUgbGlhYmxlIHRvIHlvdSBmb3IgYW55IGNvbnNlcXVlbnRpYWwsIA0KICogaW5jaWRlbnRhbCBvciBzcGVjaWFsIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgbG9zdCBwcm9maXRzIG9yIGxvc3Qgc2F2aW5ncywgDQogKiBldmVuIGlmIGEgcmVwcmVzZW50YXRpdmUgb2YgUGVyY2VwaW8gQUIgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgDQogKiBvZiBzdWNoIGRhbWFnZXMsIG9yIGZvciBhbnkgY2xhaW0gYnkgYW55IHRoaXJkIHBhcnR5LiBTb21lIGp1cmlzZGljdGlvbnMgZG8gDQogKiBub3QgYWxsb3cgdGhlIGV4Y2x1c2lvbiBvciBsaW1pdGF0aW9uIG9mIGluY2lkZW50YWwsIGNvbnNlcXVlbnRpYWwgb3Igc3BlY2lhbCANCiAqIGRhbWFnZXMsIG9yIHRoZSBleGNsdXNpb24gb2YgaW1wbGllZCB3YXJyYW50aWVzIG9yIGxpbWl0YXRpb25zIG9uIGhvdyBsb25nIGFuIA0KICogaW1wbGllZCB3YXJyYW50eSBtYXkgbGFzdCwgc28gdGhlIGFib3ZlIGxpbWl0YXRpb25zIG1heSBub3QgYXBwbHkgdG8geW91Lg0KICoNCiAqIENvcHlyaWdodCBQZXJjZXBpbyBBQiwgMjAxMy4NCiAqIHd3dy5wZXJjZXBpby5jb20NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpZm5kZWYgVFJDUE9SVF9IDQojZGVmaW5lIFRSQ1BPUlRfSA0KDQojaW5jbHVkZSAidHJjS2VybmVsUG9ydC5oIg0KDQovKiBJZiBXaW4zMiBwb3J0ICovDQojaWZkZWYgV0lOMzINCg0KICAgI3VuZGVmIF9XSU4zMl9XSU5OVA0KICAgI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNjAwDQoNCiAgIC8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLw0KICAgI2luY2x1ZGUgPHN0ZGlvLmg+DQogICAjaW5jbHVkZSA8d2luZG93cy5oPg0KICAgI2luY2x1ZGUgPGRpcmVjdC5oPg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogVGhlIFdpbjMyIHBvcnQgYnkgZGVmYXVsdCBzYXZlcyB0aGUgdHJhY2UgdG8gZmlsZSBhbmQgdGhlbiBraWxscyB0aGUNCiAqIHByb2dyYW0gd2hlbiB0aGUgcmVjb3JkZXIgaXMgc3RvcHBlZCwgdG8gZmFjaWxpdGF0ZSBxdWljaywgc2ltcGxlIHRlc3RzDQogKiBvZiB0aGUgcmVjb3JkZXIuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICAgI2RlZmluZSBXSU4zMl9QT1JUX1NBVkVfV0hFTl9TVE9QUEVEIDENCiAgICNkZWZpbmUgV0lOMzJfUE9SVF9FWElUX1dIRU5fU1RPUFBFRCAxDQoNCiNlbmRpZg0KDQojZGVmaW5lIERJUkVDVElPTl9JTkNSRU1FTlRJTkcgMQ0KI2RlZmluZSBESVJFQ1RJT05fREVDUkVNRU5USU5HIDINCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogU3VwcG9ydGVkIHBvcnRzDQogKiANCiAqIFBPUlRfSFdJbmRlcGVuZGVudA0KICogQSBoYXJkd2FyZSBpbmRlcGVuZGVudCBmYWxsYmFjayBvcHRpb24gZm9yIGV2ZW50IHRpbWVzdGFtcGluZy4gUHJvdmlkZXMgbG93IA0KICogcmVzb2x1dGlvbiB0aW1lc3RhbXBzIGJhc2VkIG9uIHRoZSBPUyB0aWNrLg0KICogVGhpcyBtYXkgYmUgdXNlZCBvbiB0aGUgV2luMzIgcG9ydCwgYnV0IG1heSBhbHNvIGJlIHVzZWQgb24gZW1iZWRkZWQgaGFyZHdhcmUgDQogKiBwbGF0Zm9ybXMuIEFsbCB0aW1lIGR1cmF0aW9ucyB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgT1MgdGljayBmcmVxdWVuY3ksIA0KICogdHlwaWNhbGx5IDEgS0h6LiBUaGlzIG1lYW5zIHRoYXQgYSB0YXNrIG9yIElTUiB0aGF0IGV4ZWN1dGVzIGluIGxlc3MgdGhhbiANCiAqIDEgbXMgZ2V0IGFuIGV4ZWN1dGlvbiB0aW1lIG9mIHplcm8uDQogKg0KICogUE9SVF9XaW4zMg0KICogIkFjY3VyYXRlIiB0aW1lc3RhbXBpbmcgYmFzZWQgb24gdGhlIFdpbmRvd3MgcGVyZm9ybWFuY2UgY291bnRlciBmb3IgV2luMzIgYnVpbGRzLg0KICogTm90ZSB0aGF0IHRoaXMgZ2l2ZXMgdGhlIGhvc3QgbWFjaGluZSB0aW1lLCBub3QgdGhlIGtlcm5lbCB0aW1lLg0KICoNCiAqIE9mZmljaWFsbHkgc3VwcG9ydGVkIGhhcmR3YXJlIHRpbWVyIHBvcnRzOg0KICogLSBQT1JUX0F0bWVsX0FUOTFTQU03DQogKiAtIFBPUlRfQXRtZWxfVUMzQTANCiAqIC0gUE9SVF9BUk1fQ29ydGV4TSANCiAqIC0gUE9SVF9SZW5lc2FzX1JYNjAwDQogKiAtIFBPUlRfTWljcm9jaGlwX2RzUElDX0FORF9QSUMyNA0KICoNCiAqIFdlIGFsc28gcHJvdmlkZSBzZXZlcmFsICJ1bm9mZmljaWFsIiBoYXJkd2FyZS1zcGVjaWZpYyBwb3J0cy4gVGhlcmUgaGF2ZSANCiAqIGJlZW4gZGV2ZWxvcGVkIGJ5IGV4dGVybmFsIGNvbnRyaWJ1dG9ycywgYW5kIGhhdmUgbm90IHlldCBiZWVuIHZlcmlmaWVkIA0KICogYnkgUGVyY2VwaW8gQUIuIExldCB1cyBrbm93IGlmIHlvdSBoYXZlIHByb2JsZW1zIGdldHRpbmcgdGhlc2UgdG8gd29yay4NCiAqIA0KICogVW5vZmZpY2lhbCBoYXJkd2FyZSBzcGVjaWZpYyBwb3J0cyBwcm92aWRlZCBhcmU6DQogKiAtIFBPUlRfVEVYQVNfSU5TVFJVTUVOVFNfVE1TNTcwDQogKiAtIFBPUlRfVEVYQVNfSU5TVFJVTUVOVFNfTVNQNDMwDQogKiAtIFBPUlRfTUlDUk9DSElQX1BJQzMyDQogKiAtIFBPUlRfWElMSU5YX1BQQzQwNQ0KICogLSBQT1JUX1hJTElOWF9QUEM0NDANCiAqIC0gUE9SVF9YSUxJTlhfTUlDUk9CTEFaRQ0KICogLSBQT1JUX05YUF9MUEMyMTBYDQogKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojZGVmaW5lIFBPUlRfTk9UX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgLTENCiNkZWZpbmUgUE9SVF9BUFBMSUNBVElPTl9ERUZJTkVECQkJICAtMg0KDQovKioqIE9mZmljaWFsbHkgc3VwcG9ydGVkIGhhcmR3YXJlIHRpbWVyIHBvcnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojZGVmaW5lIFBPUlRfSFdJbmRlcGVuZGVudCAgICAgICAgICAgICAgICAgICAgIDANCiNkZWZpbmUgUE9SVF9XaW4zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQ0KI2RlZmluZSBQT1JUX0F0bWVsX0FUOTFTQU03ICAgICAgICAgICAgICAgICAgICAyDQojZGVmaW5lIFBPUlRfQXRtZWxfVUMzQTAgICAgICAgICAgICAgICAgICAgICAgIDMNCiNkZWZpbmUgUE9SVF9BUk1fQ29ydGV4TSAgICAgICAgICAgICAgICAgICAgICAgNA0KI2RlZmluZSBQT1JUX1JlbmVzYXNfUlg2MDAgICAgICAgICAgICAgICAgICAgICA1DQojZGVmaW5lIFBPUlRfTWljcm9jaGlwX2RzUElDX0FORF9QSUMyNCAgICAgICAgIDYNCg0KLyoqKiBVbm9mZmljaWFsIHBvcnRzLCBwcm92aWRlZCBieSBleHRlcm5hbCBkZXZlbG9wZXJzLCBub3QgeWV0IHZlcmlmaWVkICoqKioqLw0KI2RlZmluZSBQT1JUX1RFWEFTX0lOU1RSVU1FTlRTX1RNUzU3MCAgICAgICAgICA3DQojZGVmaW5lIFBPUlRfVEVYQVNfSU5TVFJVTUVOVFNfTVNQNDMwICAgICAgICAgIDgNCiNkZWZpbmUgUE9SVF9NSUNST0NISVBfUElDMzIgICAgICAgICAgICAgICAgICAgOQ0KI2RlZmluZSBQT1JUX1hJTElOWF9QUEM0MDUgICAgICAgICAgICAgICAgICAgIDEwDQojZGVmaW5lIFBPUlRfWElMSU5YX1BQQzQ0MCAgICAgICAgICAgICAgICAgICAgMTENCiNkZWZpbmUgUE9SVF9YSUxJTlhfTUlDUk9CTEFaRSAgICAgICAgICAgICAgICAxMg0KI2RlZmluZSBQT1JUX05YUF9MUEMyMTBYICAgICAgICAgICAgICAgICAgICAgIDEzDQoNCi8qKiogU2VsZWN0IHlvdXIgcG9ydCBoZXJlISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUgU0VMRUNURURfUE9SVCBQT1JUX05PVF9TRVQNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KI2lmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfTk9UX1NFVCkgDQojZXJyb3IgIllvdSBuZWVkIHRvIGRlZmluZSBTRUxFQ1RFRF9QT1JUIGhlcmUhIg0KI2VuZGlmDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiBJUlFfUFJJT1JJVFlfT1JERVINCiAqDQogKiBNYWNybyB3aGljaCBzaG91bGQgYmUgZGVmaW5lZCBhcyBhbiBpbnRlZ2VyIG9mIDAgb3IgMS4NCiAqDQogKiBUaGlzIHNob3VsZCBiZSAwIGlmIGxvd2VyIElSUSBwcmlvcml0eSB2YWx1ZXMgaW1wbGllcyBoaWdoZXIgcHJpb3JpdHkgDQogKiBsZXZlbHMsIHN1Y2ggYXMgb24gQVJNIENvcnRleCBNLiBJZiB0aGUgb3Bwb3NpdGUgc2NoZW1lIGlzIHVzZWQsIGkuZS4sIA0KICogaWYgaGlnaGVyIElSUSBwcmlvcml0eSB2YWx1ZXMgbWVhbnMgaGlnaGVyIHByaW9yaXR5LCB0aGlzIHNob3VsZCBiZSAxLg0KICoNCiAqIFRoaXMgc2V0dGluZyBpcyBub3QgY3JpdGljYWwuIEl0IGlzIHVzZWQgb25seSB0byBzb3J0IGFuZCBjb2xvcml6ZSB0aGUgDQogKiBpbnRlcnJ1cHRzIGluIHByaW9yaXR5IG9yZGVyLCBpbiBjYXNlIHlvdSByZWNvcmQgaW50ZXJydXB0cyB1c2luZw0KICogdGhlIHZUcmFjZVN0b3JlSVNSQmVnaW4gYW5kIHZUcmFjZVN0b3JlSVNSRW5kIHJvdXRpbmVzLg0KICoNCiAqIFdlIHByb3ZpZGUgdGhpcyBzZXR0aW5nIGZvciBzb21lIGhhcmR3YXJlIGFyY2hpdGVjdHVyZXMgYmVsb3c6DQogKiAtIEFSTSBDb3J0ZXggTTogICAgICAgMCAobG93ZXIgSVJRIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudCkNCiAqIC0gQXRtZWwgQVQ5MVNBTTd4OiAgICAxIChoaWdoZXIgSVJRIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudCkNCiAqIC0gQXRtZWwgQVZSMzI6ICAgICAgICAxIChoaWdoZXIgSVJRIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudCkNCiAqIC0gUmVuZXNhcyBSWDYwMDogICAgICAxIChoaWdoZXIgSVJRIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudCkNCiAqIC0gTWljcm9jaGlwIFBJQzI0OiAgICAwIChsb3dlciBJUlEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50KQ0KICogLSBNaWNyb2NoaXAgZHNQSUM6ICAgIDAgKGxvd2VyIElSUSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQpDQogKiAtIFRJIFRNUzU3MDogICAgICAgICAgMCAobG93ZXIgSVJRIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudCkNCiAqIC0gRnJlZXNjYWxlIEhDUzA4OiAgICAwIChsb3dlciBJUlEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50KQ0KICogLSBGcmVlc2NhbGUgSENTMTI6ICAgIDAgKGxvd2VyIElSUSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQpDQogKiAtIFBvd2VyUEMgNDA1OiAgICAgICAgMCAobG93ZXIgSVJRIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudCkNCiAqIC0gUG93ZXJQQyA0NDA6ICAgICAgICAwIChsb3dlciBJUlEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50KQ0KICogLSBGcmVlc2NhbGUgQ29sZEZpcmU6IDEgKGhpZ2hlciBJUlEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50KQ0KICogLSBOWFAgTFBDMjEweDogICAgICAgIDAgKGxvd2VyIElSUSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQpDQogKiAtIE1pY3JvQmxhemU6ICAgICAgICAwICAobG93ZXIgSVJRIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudCkNCiAqDQogKiBJZiB5b3VyIGNoaXAgaXMgbm90IG9uIHRoZSBhYm92ZSBsaXN0LCBhbmQgeW91IHBlcmhhcHMga25vdyB0aGlzIGRldGFpbCBieSANCiAqIGhlYXJ0LCBwbGVhc2UgaW5mb3JtIHVzIGJ5IGUtbWFpbCB0byBzdXBwb3J0QHBlcmNlcGlvLmNvbS4NCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKg0KICogSFdUQyBNYWNyb3MgDQogKg0KICogVGhlc2UgZm91ciBIV1RDIG1hY3JvcyBwcm92aWRlcyBhIGhhcmR3YXJlIGlzb2xhdGlvbiBsYXllciByZXByZXNlbnRpbmcgYSANCiAqIGdlbmVyaWMgaGFyZHdhcmUgdGltZXIvY291bnRlciB1c2VkIGZvciBkcml2aW5nIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRpY2ssIA0KICogc3VjaCBhcyB0aGUgU3lzVGljayBmZWF0dXJlIG9mIEFSTSBDb3J0ZXggTTMvTTQsIG9yIHRoZSBQSVQgb2YgdGhlIEF0bWVsIA0KICogQVQ5MVNBTTdYLg0KICoNCiAqIEhXVENfQ09VTlQ6IFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb3VudGVyLiBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIHJlc2V0IA0KICogYSBlYWNoIHRpY2sgaW50ZXJydXB0LiBUaHVzLCB3aGVuIHRoZSB0aWNrIGhhbmRsZXIgc3RhcnRzLCB0aGUgY291bnRlciBoYXMgDQogKiBhbHJlYWR5IHdyYXBwZWQuDQogKg0KICogSFdUQ19DT1VOVF9ESVJFQ1RJT046IFNob3VsZCBiZSBvbmUgb2Y6DQogKiAtIERJUkVDVElPTl9JTkNSRU1FTlRJTkcgLSBmb3IgaGFyZHdhcmUgdGltZXIvY291bnRlcnMgb2YgaW5jcmVtZW50aW5nIHR5cGUNCiAqICAgc3VjaCBhcyB0aGUgUElUIG9uIEF0bWVsIEFUOTFTQU03WC4NCiAqICAgV2hlbiB0aGUgY291bnRlciB2YWx1ZSByZWFjaCBIV1RDX1BFUklPRCwgaXQgaXMgcmVzZXQgdG8gemVybyBhbmQgdGhlDQogKiAgIGludGVycnVwdCBpcyBzaWduYWxlZC4NCiAqIC0gRElSRUNUSU9OX0RFQ1JFTUVOVElORyAtIGZvciBoYXJkd2FyZSB0aW1lci9jb3VudGVycyBvZiBkZWNyZW1lbnRpbmcgdHlwZQ0KICogICBzdWNoIGFzIHRoZSBTeXNUaWNrIG9uIEFSTSBDb3J0ZXggTTMvTTQgY2hpcHMuDQogKiAgIFdoZW4gdGhlIGNvdW50ZXIgdmFsdWUgcmVhY2ggMCwgaXQgaXMgcmVzZXQgdG8gSFdUQ19QRVJJT0QgYW5kIHRoZQ0KICogICBpbnRlcnJ1cHQgaXMgc2lnbmFsZWQuDQogKg0KICogSFdUQ19QRVJJT0Q6IFRoZSBudW1iZXIgb2YgaW5jcmVtZW50cyBvciBkZWNyZW1lbnRzIG9mIEhXVENfQ09VTlQgYmV0d2Vlbg0KICogdHdvIHRpY2sgaW50ZXJydXB0cy4gVGhpcyBzaG91bGQgcHJlZmVyYWJseSBiZSBtYXBwZWQgdG8gdGhlIHJlbG9hZA0KICogcmVnaXN0ZXIgb2YgdGhlIGhhcmR3YXJlIHRpbWVyLCB0byBtYWtlIGl0IG1vcmUgcG9ydGFibGUgYmV0d2VlbiBjaGlwcyBpbiB0aGUgDQogKiBzYW1lIGZhbWlseS4gVGhlIG1hY3JvIHNob3VsZCBpbiBtb3N0IGNhc2VzIGJlIChyZWxvYWQgcmVnaXN0ZXIgKyAxKS4NCiAqDQogKiBIV1RDX0RJVklTT1I6IElmIHRoZSB0aW1lciBmcmVxdWVuY3kgaXMgdmVyeSBoaWdoLCBsaWtlIG9uIHRoZSBDb3J0ZXggTSBjaGlwcw0KICogKHdoZXJlIHRoZSBTeXNUaWNrIHJ1bnMgYXQgdGhlIGNvcmUgY2xvY2sgZnJlcXVlbmN5KSwgdGhlICJkaWZmZXJlbnRpYWwgDQogKiB0aW1lc3RhbXBpbmciIHVzZWQgaW4gdGhlIHJlY29yZGVyIHdpbGwgbW9yZSBmcmVxdWVudGx5IGluc2VydCBleHRyYSBYVFMgDQogKiBldmVudHMgdG8gc3RvcmUgdGhlIHRpbWVzdGFtcHMsIHdoaWNoIGluY3JlYXNlcyB0aGUgZXZlbnQgYnVmZmVyIHVzYWdlLiANCiAqIEluIHN1Y2ggY2FzZXMsIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFhUUyBldmVudHMgYW5kIHRoZXJlYnkgZ2V0IGxvbmdlciANCiAqIHRyYWNlcywgeW91IHVzZSBIV1RDX0RJVklTT1IgdG8gc2NhbGUgZG93biB0aGUgdGltZXN0YW1wcyBhbmQgZnJlcXVlbmN5Lg0KICogQXNzdW1pbmcgYSBPUyB0aWNrIHJhdGUgb2YgMSBLSHosIGl0IGlzIHN1Z2dlc3RlZCB0byBrZWVwIHRoZSBlZmZlY3RpdmUgdGltZXINCiAqIGZyZXF1ZW5jeSBiZWxvdyA2NSBNSHogdG8gYXZvaWQgYW4gZXhjZXNzaXZlIGFtb3VudCBvZiBYVFMgZXZlbnRzLiBUaHVzLCBhDQogKiBDb3J0ZXggTSBjaGlwIHJ1bm5pbmcgYXQgNzIgTUhaIHNob3VsZCB1c2UgYSBIV1RDX0RJVklTT1Igb2YgMiwgd2hpbGUgYSANCiAqIGZhc3RlciBjaGlwIHJlcXVpcmUgYSBoaWdoZXIgSFdUQ19ESVZJU09SIHZhbHVlLiANCiAqDQogKiBUaGUgSFdUQyBtYWNyb3MgYW5kIHZUcmFjZVBvcnRHZXRUaW1lU3RhbXAgaXMgdGhlIG1haW4gcG9ydGluZyBpc3N1ZQ0KICogb3IgdGhlIHRyYWNlIHJlY29yZGVyIGxpYnJhcnkuIFR5cGljYWxseSB5b3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGNoYW5nZQ0KICogdGhlIGNvZGUgb2YgdlRyYWNlUG9ydEdldFRpbWVTdGFtcCBpZiB1c2luZyB0aGUgSFdUQyBtYWNyb3MuDQogKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KI2lmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfV2luMzIpDQogICAgDQogICAgI2RlZmluZSBIV1RDX0NPVU5UX0RJUkVDVElPTiBESVJFQ1RJT05fSU5DUkVNRU5USU5HDQogICAgI2RlZmluZSBIV1RDX0NPVU5UICh1bEdldFJ1blRpbWVDb3VudGVyVmFsdWUoKSkNCiAgICAjZGVmaW5lIEhXVENfUEVSSU9EIDANCiAgICAjZGVmaW5lIEhXVENfRElWSVNPUiAxDQogICAgDQogICAgI2RlZmluZSBJUlFfUFJJT1JJVFlfT1JERVIgMSAgLy8gUGxlYXNlIHVwZGF0ZSBhY2NvcmRpbmcgdG8geW91ciBoYXJkd2FyZS4uLg0KDQojZWxpZiAoU0VMRUNURURfUE9SVCA9PSBQT1JUX0hXSW5kZXBlbmRlbnQpDQogICAgDQogICAgI2RlZmluZSBIV1RDX0NPVU5UX0RJUkVDVElPTiBESVJFQ1RJT05fSU5DUkVNRU5USU5HDQogICAgI2RlZmluZSBIV1RDX0NPVU5UIDANCiAgICAjZGVmaW5lIEhXVENfUEVSSU9EIDENCiAgICAjZGVmaW5lIEhXVENfRElWSVNPUiAxDQoNCiAgICAjZGVmaW5lIElSUV9QUklPUklUWV9PUkRFUiAxICAvLyBQbGVhc2UgdXBkYXRlIGFjY29yZGluZyB0byB5b3VyIGhhcmR3YXJlLi4uDQoNCiNlbGlmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfQXRtZWxfQVQ5MVNBTTcpDQojZXJyb3IgSFdUQ19QRVJJT0QgbXVzdCBwb2ludCB0byB0aGUgcmVsb2FkIHJlZ2lzdGVyISBOb3QgdmVyaWZpZWQgZm9yIHRoaXMgaGFyZHdhcmUgcG9ydCENCg0KICAgIC8qIEhXVENfUEVSSU9EIGlzIGhhcmRjb2RlZCBmb3IgQVQ5MVNBTTdYMjU2LUVLIEJvYXJkICg0OCBNSHopDQogICAgQSBtb3JlIGdlbmVyaWMgc29sdXRpb24gaXMgdG8gZ2V0IHRoZSBwZXJpb2QgZnJvbSBweFBJVC0+UElUQ19QSU1SICovDQogICAgDQogICAgI2RlZmluZSBIV1RDX0NPVU5UX0RJUkVDVElPTiBESVJFQ1RJT05fSU5DUkVNRU5USU5HDQogICAgI2RlZmluZSBIV1RDX0NPVU5UIChBVDkxQ19CQVNFX1BJVEMtPlBJVENfUElJUiAmIDB4RkZGRkYpDQogICAgI2RlZmluZSBIV1RDX1BFUklPRCAoQVQ5MUNfQkFTRV9QSVRDLT5QSVRDX1BJTVIgKyAxKQ0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDENCg0KICAgICNkZWZpbmUgSVJRX1BSSU9SSVRZX09SREVSIDEgIC8vIGhpZ2hlciBJUlEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50DQoNCiNlbGlmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfQXRtZWxfVUMzQTApDQojZXJyb3IgSFdUQ19QRVJJT0QgbXVzdCBwb2ludCB0byB0aGUgcmVsb2FkIHJlZ2lzdGVyISBOb3QgeWV0IHVwZGF0ZWQgZm9yIHRoaXMgaGFyZHdhcmUgcG9ydCENCiAgDQogICAgLyogRm9yIEF0bWVsIEFWUjMyIChBVDMyVUMzQSkgKi8NCiAgICAjZGVmaW5lIEhXVENfQ09VTlRfRElSRUNUSU9OIERJUkVDVElPTl9JTkNSRU1FTlRJTkcNCiAgICAjZGVmaW5lIEhXVENfQ09VTlQgc3lzcmVnX3JlYWQoQVZSMzJfQ09VTlQpDQogICAgI2RlZmluZSBIV1RDX1BFUklPRCANCiAgICAjZGVmaW5lIEhXVENfRElWSVNPUiAxICAgIA0KDQogICAgI2RlZmluZSBJUlFfUFJJT1JJVFlfT1JERVIgMSAgLy8gaGlnaGVyIElSUSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQNCg0KI2VsaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9BUk1fQ29ydGV4TSkNCg0KICAgIC8qIEZvciBhbGwgY2hpcHMgdXNpbmcgQVJNIENvcnRleCBNIGNvcmVzICovDQoNCiAgICAjZGVmaW5lIEhXVENfQ09VTlRfRElSRUNUSU9OIERJUkVDVElPTl9ERUNSRU1FTlRJTkcNCiAgICAjZGVmaW5lIEhXVENfQ09VTlQgKCooKHVpbnQzMl90KikweEUwMDBFMDE4KSkNCiAgICAjZGVmaW5lIEhXVENfUEVSSU9EICgoKih1aW50MzJfdCopMHhFMDAwRTAxNCkgKyAxKQ0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDINCiAgICANCiAgICAjZGVmaW5lIElSUV9QUklPUklUWV9PUkRFUiAwICAvLyBsb3dlciBJUlEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50DQoNCiNlbGlmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfUmVuZXNhc19SWDYwMCkgICAgDQoNCiAgICAjaW5jbHVkZSAiaW9kZWZpbmUuaCINCg0KICAgICNkZWZpbmUgSFdUQ19DT1VOVF9ESVJFQ1RJT04gRElSRUNUSU9OX0lOQ1JFTUVOVElORw0KICAgICNkZWZpbmUgSFdUQ19DT1VOVCAoQ01UMC5DTUNOVCkNCiAgICAjZGVmaW5lIEhXVENfUEVSSU9EIChDTVQwLkNNQ09SICsgMSkNCiAgICAjZGVmaW5lIEhXVENfRElWSVNPUiAxDQoNCiAgICAjZGVmaW5lIElSUV9QUklPUklUWV9PUkRFUiAxICAvLyBoaWdoZXIgSVJRIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudA0KDQojZWxpZiAoU0VMRUNURURfUE9SVCA9PSBQT1JUX01pY3JvY2hpcF9kc1BJQ19BTkRfUElDMjQpDQoNCiAgICAvKiBGb3IgTWljcm9jaGlwIFBJQzI0IGFuZCBkc1BJQyAoMTYgYml0KSAqLw0KDQogICAgLyogTm90ZTogVGhlIHRyYWNlIGxpYnJhcnkgd2FzIG9yaWdpbmFsbHkgZGVzaWduZWQgZm9yIDMyLWJpdCBNQ1VzLCBhbmQgaXMgc2xvd2VyDQogICAgICAgdGhhbiBpbnRlbmRlZCBvbiAxNi1iaXQgTUNVcy4gU3RvcmluZyBhbiBldmVudCBvbiBhIFBJQzI0IHRha2VzIGFib3V0IDcwILVzLiANCiAgICAgICBJbiBjb21wYXJpc29uLCAzMi1iaXQgTUNVcyBhcmUgb2Z0ZW4gMTAtMjAgdGltZXMgZmFzdGVyLiBJZiByZWNvcmRpbmcgb3ZlcmhlYWQgDQogICAgICAgYmVjb21lcyBhIHByb2JsZW0gb24gUElDMjQsIHVzZSB0aGUgZmlsdGVycyB0byBleGNsdWRlIGxlc3MgaW50ZXJlc3RpbmcgdGFza3MgDQogICAgICAgb3Igc3lzdGVtIGNhbGxzLiAqLw0KDQogICAgI2RlZmluZSBIV1RDX0NPVU5UX0RJUkVDVElPTiBESVJFQ1RJT05fSU5DUkVNRU5USU5HDQogICAgI2RlZmluZSBIV1RDX0NPVU5UIChUTVIxKQ0KICAgICNkZWZpbmUgSFdUQ19QRVJJT0QgKFBSMSsxKQ0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDENCg0KICAgICNkZWZpbmUgSVJRX1BSSU9SSVRZX09SREVSIDAgIC8vIGxvd2VyIElSUSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQNCg0KI2VsaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9OWFBfTFBDMjEwWCkNCiNlcnJvciBIV1RDX1BFUklPRCBtdXN0IHBvaW50IHRvIHRoZSByZWxvYWQgcmVnaXN0ZXIhIE5vdCB5ZXQgdXBkYXRlZCBmb3IgdGhpcyBoYXJkd2FyZSBwb3J0IQ0KICAgIC8qIFVOT0ZGSUNJQUwgUE9SVCAtIE5PVCBZRVQgVkVSSUZJRUQgQlkgUEVSQ0VQSU8gKi8NCiAgICANCiAgICAvKiBUZXN0ZWQgd2l0aCBMUEMyMTA2LCBidXQgc2hvdWxkIHdvcmsgd2l0aCBtb3N0IExQQzIxWFggY2hpcHMuICovDQogICAgICANCiAgICAjZGVmaW5lIEhXVENfQ09VTlRfRElSRUNUSU9OIERJUkVDVElPTl9JTkNSRU1FTlRJTkcNCiAgICAjZGVmaW5lIEhXVENfQ09VTlQgICooKHVpbnQzMl90ICopMHhFMDAwNDAwOCApDQogICAgI2RlZmluZSBIV1RDX1BFUklPRCANCiAgICAjZGVmaW5lIEhXVENfRElWSVNPUiAxICAgIA0KDQogICAgI2RlZmluZSBJUlFfUFJJT1JJVFlfT1JERVIgMCAgLy8gbG93ZXIgSVJRIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudA0KDQojZWxpZiAoU0VMRUNURURfUE9SVCA9PSBQT1JUX1RFWEFTX0lOU1RSVU1FTlRTX1RNUzU3MCkNCiNlcnJvciBIV1RDX1BFUklPRCBtdXN0IHBvaW50IHRvIHRoZSByZWxvYWQgcmVnaXN0ZXIhIE5vdCB2ZXJpZmllZCBmb3IgdGhpcyBoYXJkd2FyZSBwb3J0IQ0KICAgIC8qIFVOT0ZGSUNJQUwgUE9SVCAtIE5PVCBZRVQgVkVSSUZJRUQgQlkgUEVSQ0VQSU8gKi8NCg0KICAgICNkZWZpbmUgUlRJRlJDMCAqKCh1aW50MzJfdCAqKTB4RkZGRkZDMTApDQogICAgI2RlZmluZSBSVElDT01QMCAqKCh1aW50MzJfdCAqKTB4RkZGRkZDNTApDQogICAgI2RlZmluZSBSVElVRENQMCAqKCh1aW50MzJfdCAqKTB4RkZGRkZDNTQpDQogICAgI2RlZmluZSBIV1RDX0NPVU5UX0RJUkVDVElPTiBESVJFQ1RJT05fSU5DUkVNRU5USU5HDQogICAgI2RlZmluZSBIV1RDX0NPVU5UIChSVElGUkMwIC0gKFJUSUNPTVAwIC0gUlRJVURDUDApKQ0KICAgICNkZWZpbmUgSFdUQ19QRVJJT0QgKFJUSVVEQ1AwKQ0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDENCg0KICAgICNkZWZpbmUgSVJRX1BSSU9SSVRZX09SREVSIDAgIC8vIGxvd2VyIElSUSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQNCg0KI2VsaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9URVhBU19JTlNUUlVNRU5UU19NU1A0MzApDQojZXJyb3IgSFdUQ19QRVJJT0QgbXVzdCBwb2ludCB0byB0aGUgcmVsb2FkIHJlZ2lzdGVyISBOb3QgdmVyaWZpZWQgZm9yIHRoaXMgaGFyZHdhcmUgcG9ydCENCiAgICAvKiBVTk9GRklDSUFMIFBPUlQgLSBOT1QgWUVUIFZFUklGSUVEIEJZIFBFUkNFUElPICovDQoNCiAgICAjZGVmaW5lIEhXVENfQ09VTlRfRElSRUNUSU9OIERJUkVDVElPTl9JTkNSRU1FTlRJTkcNCiAgICAjZGVmaW5lIEhXVENfQ09VTlQgKFRBMFIpDQogICAgI2RlZmluZSBIV1RDX1BFUklPRCBUUkFDRV9DUFVfQ0xPQ0tTX1BFUl9USUNLICAgICAgDQogICAgI2RlZmluZSBIV1RDX0RJVklTT1IgMQ0KDQogICAgI2RlZmluZSBJUlFfUFJJT1JJVFlfT1JERVIgMSAgLy8gaGlnaGVyIElSUSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQNCg0KI2VsaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9NSUNST0NISVBfUElDMzIpDQogICAgLyogVU5PRkZJQ0lBTCBQT1JUIC0gTk9UIFlFVCBWRVJJRklFRCBCWSBQRVJDRVBJTyAqLw0KDQogICAgI2RlZmluZSBIV1RDX0NPVU5UX0RJUkVDVElPTiBESVJFQ1RJT05fSU5DUkVNRU5USU5HDQogICAgI2RlZmluZSBIV1RDX0NPVU5UIChSZWFkVGltZXIxKCkpICAgICAvKiBTaG91bGQgYmUgYXZhaWxhYmxlIGluIEJTUCAqLw0KICAgICNkZWZpbmUgSFdUQ19QRVJJT0QgKFJlYWRQZXJpb2QxKCkrMSkgLyogU2hvdWxkIGJlIGF2YWlsYWJsZSBpbiBCU1AgKi8NCiAgICAjZGVmaW5lIEhXVENfRElWSVNPUiAxDQoNCiAgICAjZGVmaW5lIElSUV9QUklPUklUWV9PUkRFUiAwICAvLyBsb3dlciBJUlEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50DQoNCiNlbGlmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfWElMSU5YX1BQQzQwNSkNCiNlcnJvciBIV1RDX1BFUklPRCBtdXN0IHBvaW50IHRvIHRoZSByZWxvYWQgcmVnaXN0ZXIhIE5vdCB2ZXJpZmllZCBmb3IgdGhpcyBoYXJkd2FyZSBwb3J0IQ0KICAgIC8qIFVOT0ZGSUNJQUwgUE9SVCAtIE5PVCBZRVQgVkVSSUZJRUQgQlkgUEVSQ0VQSU8gKi8NCg0KICAgICNkZWZpbmUgSFdUQ19DT1VOVF9ESVJFQ1RJT04gRElSRUNUSU9OX0RFQ1JFTUVOVElORw0KICAgICNkZWZpbmUgSFdUQ19DT1VOVCAgbWZzcHIoIDB4M2RiKQ0KICAgICNkZWZpbmUgSFdUQ19QRVJJT0QgDQogICAgI2RlZmluZSBIV1RDX0RJVklTT1IgMQ0KDQogICAgI2RlZmluZSBJUlFfUFJJT1JJVFlfT1JERVIgMCAgLy8gbG93ZXIgSVJRIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudA0KDQojZWxpZiAoU0VMRUNURURfUE9SVCA9PSBQT1JUX1hJTElOWF9QUEM0NDApDQojZXJyb3IgSFdUQ19QRVJJT0QgbXVzdCBwb2ludCB0byB0aGUgcmVsb2FkIHJlZ2lzdGVyISBOb3QgdmVyaWZpZWQgZm9yIHRoaXMgaGFyZHdhcmUgcG9ydCENCiAgICAvKiBVTk9GRklDSUFMIFBPUlQgLSBOT1QgWUVUIFZFUklGSUVEIEJZIFBFUkNFUElPICovDQoNCiAgICAvKiBUaGlzIHNob3VsZCB3b3JrIHdpdGggbW9zdCBQb3dlclBDIGNoaXBzICovDQogICAgDQogICAgI2RlZmluZSBIV1RDX0NPVU5UX0RJUkVDVElPTiBESVJFQ1RJT05fREVDUkVNRU5USU5HDQogICAgI2RlZmluZSBIV1RDX0NPVU5UICBtZnNwciggMHgwMTYgKQ0KICAgICNkZWZpbmUgSFdUQ19QRVJJT0QgDQogICAgI2RlZmluZSBIV1RDX0RJVklTT1IgMSAgICANCg0KICAgICNkZWZpbmUgSVJRX1BSSU9SSVRZX09SREVSIDAgIC8vIGxvd2VyIElSUSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQNCiAgICANCiNlbGlmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfWElMSU5YX01JQ1JPQkxBWkUpDQojZXJyb3IgSFdUQ19QRVJJT0QgbXVzdCBwb2ludCB0byB0aGUgcmVsb2FkIHJlZ2lzdGVyISBOb3QgdmVyaWZpZWQgZm9yIHRoaXMgaGFyZHdhcmUgcG9ydCENCiAgICAvKiBVTk9GRklDSUFMIFBPUlQgLSBOT1QgWUVUIFZFUklGSUVEIEJZIFBFUkNFUElPICovDQoNCiAgICAvKiBUaGlzIHNob3VsZCB3b3JrIHdpdGggbW9zdCBNaWNyb2JsYXplIGNvbmZpZ3VyYXRpb25zLg0KICAgICAqIEl0IHVzZXMgdGhlIEFYSSBUaW1lciAwIC0gdGhlIHRpY2sgaW50ZXJydXB0IHNvdXJjZS4NCiAgICAgKiBJZiBhbiBBWEkgVGltZXIgMCBwZXJpcGhlcmFsIGlzIGF2YWlsYWJsZSBvbiB5b3VyIGhhcmR3YXJlIHBsYXRmb3JtLCBubyBtb2RpZmljYXRpb25zIGFyZSByZXF1aXJlZC4NCiAgICAgKi8NCiAgICAjaW5jbHVkZSAieHRtcmN0cl9sLmgiDQoNCiAgICAjZGVmaW5lIEhXVENfQ09VTlRfRElSRUNUSU9OIERJUkVDVElPTl9ERUNSRU1FTlRJTkcNCiAgICAjZGVmaW5lIEhXVENfQ09VTlQgWFRtckN0cl9HZXRUaW1lckNvdW50ZXJSZWcoIFhQQVJfVE1SQ1RSXzBfQkFTRUFERFIsIDAgKQ0KICAgICNkZWZpbmUgSFdUQ19QRVJJT0QgDQogICAgI2RlZmluZSBIV1RDX0RJVklTT1IgMTYNCg0KICAgICNkZWZpbmUgSVJRX1BSSU9SSVRZX09SREVSIDAgIC8vIGxvd2VyIElSUSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQNCg0KI2VsaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9BUFBMSUNBVElPTl9ERUZJTkVEKQ0KDQoJI2lmICEoIGRlZmluZWQgKEhXVENfQ09VTlRfRElSRUNUSU9OKSAmJiBkZWZpbmVkIChIV1RDX0NPVU5UKSAmJiBkZWZpbmVkIChIV1RDX1BFUklPRCkgJiYgZGVmaW5lZCAoSFdUQ19ESVZJU09SKSAmJiBkZWZpbmVkIChJUlFfUFJJT1JJVFlfT1JERVIpICkNCgkJI2Vycm9yIFNFTEVDVEVEX1BPUlQgaXMgUE9SVF9BUFBMSUNBVElPTl9ERUZJTkVEIGJ1dCBub3QgYWxsIG9mIHRoZSBuZWNlc3NhcnkgY29uc3RhbnRzIGhhdmUgYmVlbiBkZWZpbmVkLg0KCSNlbmRpZg0KDQoNCiNlbGlmIChTRUxFQ1RFRF9QT1JUICE9IFBPUlRfTk9UX1NFVCkNCg0KICAgICNlcnJvciAiU0VMRUNURURfUE9SVCBoYWQgdW5zdXBwb3J0ZWQgdmFsdWUhIg0KICAgICNkZWZpbmUgU0VMRUNURURfUE9SVCBQT1JUX05PVF9TRVQNCg0KI2VuZGlmDQoNCiNpZiAoU0VMRUNURURfUE9SVCAhPSBQT1JUX05PVF9TRVQpDQogICAgDQogICAgI2lmbmRlZiBIV1RDX0NPVU5UX0RJUkVDVElPTg0KICAgICNlcnJvciAiSFdUQ19DT1VOVF9ESVJFQ1RJT04gaXMgbm90IHNldCEiDQogICAgI2VuZGlmIA0KICAgIA0KICAgICNpZm5kZWYgSFdUQ19DT1VOVA0KICAgICNlcnJvciAiSFdUQ19DT1VOVCBpcyBub3Qgc2V0ISIgICAgDQogICAgI2VuZGlmIA0KICAgIA0KICAgICNpZm5kZWYgSFdUQ19QRVJJT0QNCiAgICAjZXJyb3IgIkhXVENfUEVSSU9EIGlzIG5vdCBzZXQhIg0KICAgICNlbmRpZiANCiAgICANCiAgICAjaWZuZGVmIEhXVENfRElWSVNPUg0KICAgICNlcnJvciAiSFdUQ19ESVZJU09SIGlzIG5vdCBzZXQhIiAgICANCiAgICAjZW5kaWYgDQogICAgDQogICAgI2lmbmRlZiBJUlFfUFJJT1JJVFlfT1JERVINCiAgICAjZXJyb3IgIklSUV9QUklPUklUWV9PUkRFUiBpcyBub3Qgc2V0ISINCiAgICAjZWxpZiAoSVJRX1BSSU9SSVRZX09SREVSICE9IDApICYmIChJUlFfUFJJT1JJVFlfT1JERVIgIT0gMSkNCiAgICAjZXJyb3IgIklSUV9QUklPUklUWV9PUkRFUiBoYXMgYmFkIHZhbHVlISINCiAgICAjZW5kaWYgDQogICAgDQogICAgI2lmIChIV1RDX0RJVklTT1IgPCAxKQ0KICAgICNlcnJvciAiSFdUQ19ESVZJU09SIG11c3QgYmUgYSBub24temVybyBwb3NpdGl2ZSB2YWx1ZSEiDQogICAgI2VuZGlmIA0KDQojZW5kaWYNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VDb25zb2xlTWVzc2FnZQ0KICoNCiAqIEEgd3JhcHBlciBmb3IgeW91ciBzeXN0ZW0tc3BlY2lmaWMgY29uc29sZSAicHJpbnRmIiBjb25zb2xlIG91dHB1dCBmdW5jdGlvbi4NCiAqIFRoaXMgbmVlZHMgdG8gYmUgY29ycmVjdGx5IGRlZmluZWQgdG8gc2VlIHN0YXR1cyByZXBvcnRzIGZyb20gdGhlIHRyYWNlIA0KICogc3RhdHVzIG1vbml0b3IgdGFzayAodGhpcyBpcyBkZWZpbmVkIGluIHRyY1VzZXIuYykuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAgICAgIA0KI2lmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfQXRtZWxfQVQ5MVNBTTcpDQovKiBQb3J0IHNwZWNpZmljIGluY2x1ZGVzICovDQojaW5jbHVkZSAiY29uc29sZS5oIg0KI2VuZGlmDQoNCiNkZWZpbmUgdlRyYWNlQ29uc29sZU1lc3NhZ2UoeCkNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVBvcnRHZXRUaW1lU3RhbXANCiAqDQogKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgYmFzZWQgb24gdGhlIEhXVEMgbWFjcm9zIHdoaWNoIHByb3ZpZGUgYSBoYXJkd2FyZQ0KICogaXNvbGF0aW9uIGxheWVyIHRvd2FyZHMgdGhlIGhhcmR3YXJlIHRpbWVyL2NvdW50ZXIuDQogKg0KICogVGhlIEhXVEMgbWFjcm9zIGFuZCB2VHJhY2VQb3J0R2V0VGltZVN0YW1wIGlzIHRoZSBtYWluIHBvcnRpbmcgaXNzdWUNCiAqIG9yIHRoZSB0cmFjZSByZWNvcmRlciBsaWJyYXJ5LiBUeXBpY2FsbHkgeW91IHNob3VsZCBub3QgbmVlZCB0byBjaGFuZ2UNCiAqIHRoZSBjb2RlIG9mIHZUcmFjZVBvcnRHZXRUaW1lU3RhbXAgaWYgdXNpbmcgdGhlIEhXVEMgbWFjcm9zLg0KICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVBvcnRHZXRUaW1lU3RhbXAodWludDMyX3QgKnB1aVRpbWVzdGFtcCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VQb3J0RW5kDQogKiANCiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHJlY29yZGVyIGlzIHN0b3BwZWQgZHVlIHRvIGZ1bGwgYnVmZmVyLg0KICogTWFpbmx5IGludGVuZGVkIHRvIHNob3cgYSBtZXNzYWdlIGluIHRoZSBjb25zb2xlLg0KICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBXaW4zMiBwb3J0IHRvIHN0b3JlIHRoZSB0cmFjZSB0byBhIGZpbGUuIFRoZSBmaWxlIHBhdGggaXMNCiAqIHNldCB1c2luZyB2VHJhY2VQb3J0U2V0RmlsZU5hbWUuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VQb3J0RW5kKHZvaWQpOw0KDQojZW5kaWYNCg==