LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIFRyYWNlYWx5emVyIHYyLjcuMCBSZWNvcmRlciBMaWJyYXJ5DQogKiBQZXJjZXBpbyBBQiwgd3d3LnBlcmNlcGlvLmNvbQ0KICoNCiAqIHRyY1VzZXIuaA0KICogVGhlIHB1YmxpYyBBUEkgb2YgdGhlIHRyYWNlIHJlY29yZGVyIGxpYnJhcnkuDQogKg0KICogVGVybXMgb2YgVXNlDQogKiBUaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodCBQZXJjZXBpbyBBQi4gVGhlIHJlY29yZGVyIGxpYnJhcnkgaXMgZnJlZSBmb3INCiAqIHVzZSB0b2dldGhlciB3aXRoIFBlcmNlcGlvIHByb2R1Y3RzLiBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIHJlY29yZGVyIGxpYnJhcnkNCiAqIGluIGl0cyBvcmlnaW5hbCBmb3JtLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucyBpbiB0cmNIYXJkd2FyZVBvcnQuYy8uaA0KICogZ2l2ZW4gdGhhdCB0aGVzZSBtb2RpZmljYXRpb24gYXJlIGNsZWFybHkgbWFya2VkIGFzIHlvdXIgb3duIG1vZGlmaWNhdGlvbnMNCiAqIGFuZCBkb2N1bWVudGVkIGluIHRoZSBpbml0aWFsIGNvbW1lbnQgc2VjdGlvbiBvZiB0aGVzZSBzb3VyY2UgZmlsZXMuDQogKiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgUGVyY2VwaW8gQUIgYW5kIG1heSBub3QgYmUNCiAqIHNvbGQgb3IgaW4gb3RoZXIgd2F5cyBjb21tZXJjaWFsbHkgcmVkaXN0cmlidXRlZCB3aXRob3V0IGV4cGxpY2l0IHdyaXR0ZW4NCiAqIHBlcm1pc3Npb24gYnkgUGVyY2VwaW8gQUIuDQogKg0KICogRGlzY2xhaW1lcg0KICogVGhlIHRyYWNlIHRvb2wgYW5kIHJlY29yZGVyIGxpYnJhcnkgaXMgYmVpbmcgZGVsaXZlcmVkIHRvIHlvdSBBUyBJUyBhbmQNCiAqIFBlcmNlcGlvIEFCIG1ha2VzIG5vIHdhcnJhbnR5IGFzIHRvIGl0cyB1c2Ugb3IgcGVyZm9ybWFuY2UuIFBlcmNlcGlvIEFCIGRvZXMNCiAqIG5vdCBhbmQgY2Fubm90IHdhcnJhbnQgdGhlIHBlcmZvcm1hbmNlIG9yIHJlc3VsdHMgeW91IG1heSBvYnRhaW4gYnkgdXNpbmcgdGhlDQogKiBzb2Z0d2FyZSBvciBkb2N1bWVudGF0aW9uLiBQZXJjZXBpbyBBQiBtYWtlIG5vIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3INCiAqIGltcGxpZWQsIGFzIHRvIG5vbmluZnJpbmdlbWVudCBvZiB0aGlyZCBwYXJ0eSByaWdodHMsIG1lcmNoYW50YWJpbGl0eSwgb3INCiAqIGZpdG5lc3MgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIEluIG5vIGV2ZW50IHdpbGwgUGVyY2VwaW8gQUIsIGl0cw0KICogdGVjaG5vbG9neSBwYXJ0bmVycywgb3IgZGlzdHJpYnV0b3JzIGJlIGxpYWJsZSB0byB5b3UgZm9yIGFueSBjb25zZXF1ZW50aWFsLA0KICogaW5jaWRlbnRhbCBvciBzcGVjaWFsIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgbG9zdCBwcm9maXRzIG9yIGxvc3Qgc2F2aW5ncywNCiAqIGV2ZW4gaWYgYSByZXByZXNlbnRhdGl2ZSBvZiBQZXJjZXBpbyBBQiBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eQ0KICogb2Ygc3VjaCBkYW1hZ2VzLCBvciBmb3IgYW55IGNsYWltIGJ5IGFueSB0aGlyZCBwYXJ0eS4gU29tZSBqdXJpc2RpY3Rpb25zIGRvDQogKiBub3QgYWxsb3cgdGhlIGV4Y2x1c2lvbiBvciBsaW1pdGF0aW9uIG9mIGluY2lkZW50YWwsIGNvbnNlcXVlbnRpYWwgb3Igc3BlY2lhbA0KICogZGFtYWdlcywgb3IgdGhlIGV4Y2x1c2lvbiBvZiBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgbGltaXRhdGlvbnMgb24gaG93IGxvbmcgYW4NCiAqIGltcGxpZWQgd2FycmFudHkgbWF5IGxhc3QsIHNvIHRoZSBhYm92ZSBsaW1pdGF0aW9ucyBtYXkgbm90IGFwcGx5IHRvIHlvdS4NCiAqDQogKiBUYWJzIGFyZSB1c2VkIGZvciBpbmRlbnQgaW4gdGhpcyBmaWxlICgxIHRhYiA9IDQgc3BhY2VzKQ0KICoNCiAqIENvcHlyaWdodCBQZXJjZXBpbyBBQiwgMjAxNC4NCiAqIHd3dy5wZXJjZXBpby5jb20NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpZm5kZWYgVFJDVVNFUl9IDQojZGVmaW5lIFRSQ1VTRVJfSA0KDQojaWZkZWYgX19jcGx1c3BsdXMNCmV4dGVybiAiQyIgew0KI2VuZGlmDQoNCiNpbmNsdWRlICJ0cmNLZXJuZWxQb3J0LmgiDQoNCiNpZiAoVVNFX1RSQUNFQUxZWkVSX1JFQ09SREVSID09IDEpDQoNCiNpZm5kZWYgVVNFX1NFUEFSQVRFX1VTRVJfRVZFTlRfQlVGRkVSDQojZGVmaW5lIFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiAwDQojZW5kaWYNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIFRSQUNFX1NUT1BfSE9PSyAtIEhvb2sgUG9pbnRlciBEYXRhIFR5cGUNCiAqDQogKiBEZWNsYXJlcyBhIGRhdGEgdHlwZSBmb3IgYSBjYWxsIGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbmV2ZXINCiAqIHRoZSByZWNvcmRlciBpcyBzdG9wcGVkLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnR5cGVkZWYgdm9pZCAoKlRSQUNFX1NUT1BfSE9PSykodm9pZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdG9wSG9va1B0cg0KICoNCiAqIFBvaW50cyB0byBhIGNhbGwgYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBmcm9tIHZUcmFjZVN0b3AoKS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpleHRlcm4gVFJBQ0VfU1RPUF9IT09LIHZUcmFjZVN0b3BIb29rUHRyOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlSW5pdFRyYWNlRGF0YQ0KICoNCiAqIEFsbG9jYXRlcywgaWYgbmVjZXNzYXJ5LCBhbmQgaW5pdGlhbGl6ZXMgdGhlIHJlY29yZGVyIGRhdGEgc3RydWN0dXJlLCBiYXNlZA0KICogb24gdGhlIGNvbnN0YW50cyBpbiB0cmNDb25maWcuaC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZUluaXRUcmFjZURhdGEodm9pZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTZXRSZWNvcmRlckRhdGENCiAqDQogKiBJZiBjdXN0b20gYWxsb2NhdGlvbiBpcyB1c2VkLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHNvIHRoZSByZWNvcmRlcg0KICogbGlicmFyeSBrbm93cyB3aGVyZSB0byBzYXZlIHRoZSB0cmFjZSBkYXRhLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNpZiAoVFJBQ0VfREFUQV9BTExPQ0FUSU9OID09IFRSQUNFX0RBVEFfQUxMT0NBVElPTl9DVVNUT00pDQp2b2lkIHZUcmFjZVNldFJlY29yZGVyRGF0YSh2b2lkKiBwUmVjb3JkZXJEYXRhKTsNCiNlbmRpZg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlU2V0U3RvcEhvb2sNCiAqDQogKiBTZXRzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlY29yZGVyIGlzIHN0b3BwZWQuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTZXRTdG9wSG9vayhUUkFDRV9TVE9QX0hPT0sgc3RvcEhvb2tGdW5jdGlvbik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB1aVRyYWNlU3RhcnQNCiAqDQogKiBTdGFydHMgdGhlIHJlY29yZGVyLiBUaGUgcmVjb3JkZXIgd2lsbCBub3QgYmUgc3RhcnRlZCBpZiBhbiBlcnJvciBoYXMgYmVlbg0KICogaW5kaWNhdGVkIHVzaW5nIHZUcmFjZUVycm9yLCBlLmcuIGlmIGFueSBvZiB0aGUgTnggY29uc3RhbnRzIGluIHRyY0NvbmZpZy5oDQogKiBoYXMgYSB0b28gc21hbGwgdmFsdWUgKE5UQVNLLCBOUVVFVUUsIGV0YykuDQogKg0KICogUmV0dXJucyAxIGlmIHRoZSByZWNvcmRlciB3YXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkuDQogKiBSZXR1cm5zIDAgaWYgdGhlIHJlY29yZGVyIHN0YXJ0IHdhcyBwcmV2ZW50ZWQgZHVlIHRvIGEgcHJldmlvdXMgaW50ZXJuYWwNCiAqIGVycm9yLiBJbiB0aGF0IGNhc2UsIGNoZWNrIHZUcmFjZUdldExhc3RFcnJvciB0byBnZXQgdGhlIGVycm9yIG1lc3NhZ2UuDQogKiBBbnkgZXJyb3IgbWVzc2FnZSBpcyBhbHNvIHByZXNlbnRlZCB3aGVuIG9wZW5pbmcgYSB0cmFjZSBmaWxlLg0KICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1aW50MzJfdCB1aVRyYWNlU3RhcnQodm9pZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdGFydA0KICoNCiAqIFN0YXJ0cyB0aGUgcmVjb3JkZXIuIFRoZSByZWNvcmRlciB3aWxsIG5vdCBiZSBzdGFydGVkIGlmIGFuIGVycm9yIGhhcyBiZWVuDQogKiBpbmRpY2F0ZWQgdXNpbmcgdlRyYWNlRXJyb3IsIGUuZy4gaWYgYW55IG9mIHRoZSBOeCBjb25zdGFudHMgaW4gdHJjQ29uZmlnLmgNCiAqIGhhcyBhIHRvbyBzbWFsbCB2YWx1ZSAoTlRBU0ssIE5RVUVVRSwgZXRjKS4NCiAqDQogKiBUaGlzIGZ1bmN0aW9uIGlzIG9ic29sZXRlLCBidXQgaGFzIGJlZW4gc2F2ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Lg0KICogV2UgcmVjb21tZW5kIHVzaW5nIHVpVHJhY2VTdGFydCBpbnN0ZWFkLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RhcnQodm9pZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdG9wDQogKg0KICogU3RvcHMgdGhlIHJlY29yZGVyLiBUaGUgcmVjb3JkaW5nIGNhbiBiZSByZXN1bWVkIGJ5IGNhbGxpbmcgdlRyYWNlU3RhcnQuDQogKiBUaGlzIGRvZXMgbm90IHJlc2V0IHRoZSByZWNvcmRlci4gVXNlIHZUcmFjZUNsZWFyIGlzIHRoYXQgaXMgZGVzaXJlZC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVN0b3Aodm9pZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB4VHJhY2VHZXRMYXN0RXJyb3INCiAqDQogKiBHaXZlcyB0aGUgbGFzdCBlcnJvciBtZXNzYWdlLCBpZiBhbnkuIE5VTEwgaWYgbm8gZXJyb3IgbWVzc2FnZSBpcyBzdG9yZWQuDQogKiBBbnkgZXJyb3IgbWVzc2FnZSBpcyBhbHNvIHByZXNlbnRlZCB3aGVuIG9wZW5pbmcgYSB0cmFjZSBmaWxlLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCmNoYXIqIHhUcmFjZUdldExhc3RFcnJvcih2b2lkKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZUNsZWFyDQogKg0KICogUmVzZXRzIHRoZSByZWNvcmRlci4gT25seSBuZWNlc3NhcnkgaWYgYSByZXN0YXJ0IGlzIGRlc2lyZWQgLSB0aGlzIGlzIG5vdA0KICogbmVlZGVkIGluIHRoZSBzdGFydHVwIGluaXRpYWxpemF0aW9uLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlQ2xlYXIodm9pZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIHZUcmFjZUNsZWFyRXJyb3INCioNCiogUmVtb3ZlcyBhbnkgcHJldmlvdXMgZXJyb3IgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgcmVjb3JkZXIgY2FsbGluZyB2VHJhY2VFcnJvci4NCiogQnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBpdCBtYXkgYmUgcG9zc2libGUgdG8gc3RhcnQvcmVzdGFydCB0aGUgdHJhY2UNCiogZGVzcGl0ZSBlcnJvcnMgaW4gdGhlIHJlY29yZGVyLCBidXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHRyYWNlDQoqIHJlY29yZGVyIHdpbGwgd29yayBjb3JyZWN0bHkgaW4gdGhhdCBjYXNlLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgZXJyb3IuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZUNsZWFyRXJyb3IoaW50IHJlc2V0RXJyb3JNZXNzYWdlKTsNCg0KI2lmIChJTkNMVURFX0lTUl9UUkFDSU5HID09IDEpDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzDQogKg0KICogUmVnaXN0ZXJzIGFuIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUgaW4gdGhlIHJlY29yZGVyIGxpYnJhcnksIFRoaXMgbXVzdCBiZQ0KICogY2FsbGVkIGJlZm9yZSB1c2luZyB2VHJhY2VTdG9yZUlTUkJlZ2luIHRvIHN0b3JlIElTUiBldmVudHMuIFRoaXMgaXMNCiAqIHR5cGljYWxseSBjYWxsZWQgaW4gdGhlIHN0YXJ0dXAgb2YgdGhlIHN5c3RlbSwgYmVmb3JlIHRoZSBzY2hlZHVsZXIgaXMNCiAqIHN0YXJ0ZWQuDQogKg0KICogRXhhbXBsZToNCiAqCSAjZGVmaW5lIElEX0lTUl9USU1FUjEgMQkJLy8gbG93ZXN0IHZhbGlkIElEIGlzIDENCiAqCSAjZGVmaW5lIFBSSU9fT0ZfSVNSX1RJTUVSMSAzIC8vIHRoZSBoYXJkd2FyZSBwcmlvcml0eSBvZiB0aGUgaW50ZXJydXB0DQogKgkgLi4uDQogKgkgdlRyYWNlU2V0SVNSUHJvcGVydGllcyhJRF9JU1JfVElNRVIxLCAiSVNSVGltZXIxIiwgUFJJT19PRl9JU1JfVElNRVIxKTsNCiAqCSAuLi4NCiAqCSB2b2lkIElTUl9oYW5kbGVyKCkNCiAqCSB7DQogKgkJIHZUcmFjZVN0b3JlSVNSQmVnaW4oSURfT0ZfSVNSX1RJTUVSMSk7DQogKgkJIC4uLg0KICoJCSB2VHJhY2VTdG9yZUlTUkVuZCgwKTsNCiAqCSB9DQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKG9iamVjdEhhbmRsZVR5cGUgaGFuZGxlLCBjb25zdCBjaGFyKiBuYW1lLCBjaGFyIHByaW9yaXR5KTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVN0b3JlSVNSQmVnaW4NCiAqDQogKiBSZWdpc3RlcnMgdGhlIGJlZ2lubmluZyBvZiBhbiBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lLg0KICogSWYgYWxsb3dpbmcgbmVzdGVkIElTUnMsIHRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLg0KICoNCiAqIEV4YW1wbGU6DQogKgkgI2RlZmluZSBJRF9JU1JfVElNRVIxIDEJCS8vIGxvd2VzdCB2YWxpZCBJRCBpcyAxDQogKgkgI2RlZmluZSBQUklPX09GX0lTUl9USU1FUjEgMyAvLyB0aGUgaGFyZHdhcmUgcHJpb3JpdHkgb2YgdGhlIGludGVycnVwdA0KICoJIC4uLg0KICoJIHZUcmFjZVNldElTUlByb3BlcnRpZXMoSURfSVNSX1RJTUVSMSwgIklTUlRpbWVyMSIsIFBSSU9fT0ZfSVNSX1RJTUVSMSk7DQogKgkgLi4uDQogKgkgdm9pZCBJU1JfaGFuZGxlcigpDQogKgkgew0KICoJCSB2VHJhY2VTdG9yZUlTUkJlZ2luKElEX09GX0lTUl9USU1FUjEpOw0KICoJCSAuLi4NCiAqCQkgdlRyYWNlU3RvcmVJU1JFbmQoMCk7DQogKgkgfQ0KICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVN0b3JlSVNSQmVnaW4ob2JqZWN0SGFuZGxlVHlwZSBpZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdG9yZUlTUkVuZA0KICoNCiAqIFJlZ2lzdGVycyB0aGUgZW5kIG9mIGFuIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUuDQogKg0KICogVGhlIHBhcmFtZXRlciBwZW5kaW5nSVNSIGluZGljYXRlcyBpZiB0aGUgaW50ZXJydXB0IGhhcyByZXF1ZXN0ZWQgYQ0KICogdGFzay1zd2l0Y2ggKD0gMSkgb3IgaWYgdGhlIGludGVycnVwdCByZXR1cm5zIHRvIHRoZSBlYXJsaWVyIGNvbnRleHQgKD0gMCkNCiAqDQogKiBFeGFtcGxlOg0KICoJICNkZWZpbmUgSURfSVNSX1RJTUVSMSAxCSAgLy8gbG93ZXN0IHZhbGlkIElEIGlzIDENCiAqCSAjZGVmaW5lIFBSSU9fT0ZfSVNSX1RJTUVSMSAzIC8vIHRoZSBoYXJkd2FyZSBwcmlvcml0eSBvZiB0aGUgaW50ZXJydXB0DQogKgkgLi4uDQogKgkgdlRyYWNlU2V0SVNSUHJvcGVydGllcyhJRF9JU1JfVElNRVIxLCAiSVNSVGltZXIxIiwgUFJJT19PRl9JU1JfVElNRVIxKTsNCiAqCSAuLi4NCiAqCSB2b2lkIElTUl9oYW5kbGVyKCkNCiAqCSB7DQogKgkJIHZUcmFjZVN0b3JlSVNSQmVnaW4oSURfT0ZfSVNSX1RJTUVSMSk7DQogKgkJIC4uLg0KICoJCSB2VHJhY2VTdG9yZUlTUkVuZCgwKTsNCiAqCSB9DQogKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RvcmVJU1JFbmQoaW50IHBlbmRpbmdJU1IpOw0KDQojZWxzZQ0KCS8qIElmIG5vdCBpbmNsdWRpbmcgdGhlIElTUiByZWNvcmRpbmcgKi8NCg0Kdm9pZCB2VHJhY2VJbmNyZWFzZUlTUkFjdGl2ZSh2b2lkKTsNCg0Kdm9pZCB2VHJhY2VEZWNyZWFzZUlTUkFjdGl2ZSh2b2lkKTsNCg0KI2RlZmluZSB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKGhhbmRsZSwgbmFtZSwgcHJpb3JpdHkpDQojZGVmaW5lIHZUcmFjZVN0b3JlSVNSQmVnaW4oaWQpIHZUcmFjZUluY3JlYXNlSVNSQWN0aXZlKCkNCiNkZWZpbmUgdlRyYWNlU3RvcmVJU1JFbmQoKSB2VHJhY2VEZWNyZWFzZUlTUkFjdGl2ZSgpDQoNCiNlbmRpZg0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVRhc2tJbnN0YW5jZUZpbmlzaCh2b2lkKQ0KICoNCiAqIE1hcmtzIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UgYXMgZmluaXNoZWQgb24gdGhlIG5leHQga2VybmVsIGNhbGwuDQogKg0KICogSWYgdGhhdCBrZXJuZWwgY2FsbCBpcyBibG9ja2luZywgdGhlIGluc3RhbmNlIGVuZHMgYWZ0ZXIgdGhlIGJsb2NraW5nIGV2ZW50DQogKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcmV0dXJuIGV2ZW50IGlzIHRoZW4gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGluc3RhbmNlLg0KICogSWYgdGhlIGtlcm5lbCBjYWxsIGlzIG5vdCBibG9ja2luZywgdGhlIHZpZXdlciBpbnN0ZWFkIHNwbGl0cyB0aGUgY3VycmVudA0KICogZnJhZ21lbnQgcmlnaHQgYmVmb3JlIHRoZSBrZXJuZWwgY2FsbCwgd2hpY2ggbWFrZXMgdGhpcyBjYWxsIHRoZSBmaXJzdCBldmVudA0KICogb2YgdGhlIG5leHQgaW5zdGFuY2UuDQogKg0KICogU2VlIGFsc28gVVNFX0lNUExJQ0lUX0lGRV9SVUxFUyBpbiB0cmNDb25maWcuaA0KICoNCiAqIEV4YW1wbGU6DQogKg0KICoJCXdoaWxlKDEpDQogKgkJew0KICoJCQl4UXVldWVSZWNlaXZlKENvbW1hbmRRdWV1ZSwgJmNvbW1hbmQsIHRpbWVvdXREdXJhdGlvbik7DQogKgkJCXByb2Nlc3NDb21tYW5kKGNvbW1hbmQpOw0KICogICAgICAgICAgdlRyYWNlSW5zdGFuY2VGaW5pc2goKTsNCiAqCQl9DQogKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VUYXNrSW5zdGFuY2VGaW5pc2godm9pZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVRhc2tJbnN0YW5jZUZpbmlzaERpcmVjdCh2b2lkKQ0KICoNCiAqIE1hcmtzIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UgYXMgZmluaXNoZWQgYXQgdGhpcyB2ZXJ5IGluc3RhbnQuDQogKiBUaGlzIG1ha2VzIHRoZSB2aWV3ZXIgdG8gc3BsaXRzIHRoZSBjdXJyZW50IGZyYWdtZW50IGF0IHRoaXMgcG9pbnQgYW5kIGJlZ2luDQogKiBhIG5ldyBhY3RvciBpbnN0YW5jZS4NCiAqDQogKiBTZWUgYWxzbyBVU0VfSU1QTElDSVRfSUZFX1JVTEVTIGluIHRyY0NvbmZpZy5oDQogKg0KICogRXhhbXBsZToNCiAqDQogKgkJVGhpcyBleGFtcGxlIHdpbGwgZ2VuZXJhdGUgdHdvIGluc3RhbmNlcyBmb3IgZWFjaCBsb29wIGl0ZXJhdGlvbi4NCiAqCQlUaGUgZmlyc3QgaW5zdGFuY2UgZW5kcyBhdCB2VHJhY2VJbnN0YW5jZUZpbmlzaERpcmVjdCgpLCB3aGlsZSB0aGUgc2Vjb25kDQogKiAgICAgIGluc3RhbmNlIGVuZHMgYXQgdGhlIG5leHQgeFF1ZXVlUmVjZWl2ZSBjYWxsLg0KICoNCiAqCQl3aGlsZSAoMSkNCiAqCQl7DQogKiAgICAgICAgICB4UXVldWVSZWNlaXZlKENvbW1hbmRRdWV1ZSwgJmNvbW1hbmQsIHRpbWVvdXREdXJhdGlvbik7DQogKgkJCVByb2Nlc3NDb21tYW5kKGNvbW1hbmQpOw0KICoJCQl2VHJhY2VJbnN0YW5jZUZpbmlzaERpcmVjdCgpOw0KICoJCQlEb1NvbWV0aW5nRWxzZSgpOw0KICogICAgICAgICAgdlRyYWNlSW5zdGFuY2VGaW5pc2goKTsNCiAqICAgICAgfQ0KICoNCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVRhc2tJbnN0YW5jZUZpbmlzaERpcmVjdCh2b2lkKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZUdldFRyYWNlQnVmZmVyDQogKg0KICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJlY29yZGVyIGRhdGEgc3RydWN0dXJlLiBVc2UgdGhpcyB0b2dldGhlciB3aXRoDQogKiB1aVRyYWNlR2V0VHJhY2VCdWZmZXJTaXplIGlmIHlvdSB3aXNoIHRvIGltcGxlbWVudCBhbiBvd24gc3RvcmUvdXBsb2FkDQogKiBzb2x1dGlvbiwgZS5nLiwgaW4gY2FzZSBhIGRlYnVnZ2VyIGNvbm5lY3Rpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgdXBsb2FkaW5nDQogKiB0aGUgZGF0YS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkKiB2VHJhY2VHZXRUcmFjZUJ1ZmZlcih2b2lkKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHVpVHJhY2VHZXRUcmFjZUJ1ZmZlclNpemUNCiAqDQogKiBHZXRzIHRoZSBzaXplIG9mIHRoZSByZWNvcmRlciBkYXRhIHN0cnVjdHVyZS4gRm9yIHVzZSB0b2dldGhlciB3aXRoDQogKiB2VHJhY2VHZXRUcmFjZUJ1ZmZlciBpZiB5b3Ugd2lzaCB0byBpbXBsZW1lbnQgYW4gb3duIHN0b3JlL3VwbG9hZCBzb2x1dGlvbiwNCiAqIGUuZy4sIGluIGNhc2UgYSBkZWJ1Z2dlciBjb25uZWN0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIHVwbG9hZGluZyB0aGUgZGF0YS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1aW50MzJfdCB1aVRyYWNlR2V0VHJhY2VCdWZmZXJTaXplKHZvaWQpOw0KDQojaWYgKElOQ0xVREVfVVNFUl9FVkVOVFMgPT0gMSkNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHhUcmFjZU9wZW5MYWJlbA0KICoNCiAqIENyZWF0ZXMgdXNlciBldmVudCBsYWJlbHMgZm9yIHVzZXIgZXZlbnQgY2hhbm5lbHMgb3IgZm9yIGluZGl2aWR1YWwgZXZlbnRzLg0KICogVXNlciBldmVudHMgY2FuIGJlIHVzZWQgdG8gbG9nIGFwcGxpY2F0aW9uIGV2ZW50cyBhbmQgZGF0YSBmb3IgZGlzcGxheSBpbg0KICogdGhlIHZpc3VhbGl6YXRpb24gdG9vbC4gQSB1c2VyIGV2ZW50IGlzIGlkZW50aWZpZWQgYnkgYSBsYWJlbCwgaS5lLiwgYSBzdHJpbmcsDQogKiB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIHJlY29yZGVyJ3Mgc3ltYm9sIHRhYmxlLg0KICogV2hlbiBsb2dnaW5nIGEgdXNlciBldmVudCwgYSBudW1lcmljIGhhbmRsZSAocmVmZXJlbmNlKSB0byB0aGlzIHN0cmluZyBpcw0KICogdXNlZCB0byBpZGVudGlmeSB0aGUgZXZlbnQuIFRoaXMgaXMgb2J0YWluZWQgYnkgY2FsbGluZw0KICoNCiAqCSB4VHJhY2VPcGVuTGFiZWwoKQ0KICoNCiAqIHdoaWhjIGFkZHMgdGhlIHN0cmluZyB0byB0aGUgc3ltYm9sIHRhYmxlIChpZiBub3QgYWxyZWFkeSBwcmVzZW50KQ0KICogYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlLg0KICoNCiAqIFRoaXMgY2FuIGJlIHVzZWQgaW4gdHdvIHdheXM6DQogKg0KICogMS4gVGhlIGhhbmRsZSBpcyBsb29rZWQgdXAgZXZlcnkgdGltZSwgd2hlbiBzdG9yaW5nIHRoZSB1c2VyIGV2ZW50Lg0KICoNCiAqIEV4YW1wbGU6DQogKgkgdlRyYWNlVXNlckV2ZW50KHhUcmFjZU9wZW5MYWJlbCgiTXlVc2VyRXZlbnQiKSk7DQogKg0KICogMi4gVGhlIGxhYmVsIGlzIHJlZ2lzdGVyZWQganVzdCBvbmNlLCB3aXRoIHRoZSBoYW5kbGUgc3RvcmVkIGluIGFuDQogKiBhcHBsaWNhdGlvbiB2YXJpYWJsZSAtIG11Y2ggbGlrZSB1c2luZyBhIGZpbGUgaGFuZGxlLg0KICoNCiAqIEV4YW1wbGU6DQogKgkgbXlFdmVudEhhbmRsZSA9IHhUcmFjZU9wZW5MYWJlbCgiTXlVc2VyRXZlbnQiKTsNCiAqCSAuLi4NCiAqCSB2VHJhY2VVc2VyRXZlbnQobXlFdmVudEhhbmRsZSk7DQogKg0KICogVGhlIHNlY29uZCBvcHRpb24gaXMgZmFzdGVyIHNpbmNlIG5vIGxvb2t1cCBpcyByZXF1aXJlZCBvbiBlYWNoIGV2ZW50LCBhbmQNCiAqIHRoZXJlZm9yZSByZWNvbW1lbmRlZCBmb3IgdXNlciBldmVudHMgdGhhdCBhcmUgZnJlcXVlbnRseQ0KICogZXhlY3V0ZWQgYW5kL29yIGxvY2F0ZWQgaW4gdGltZS1jcml0aWNhbCBjb2RlLiBUaGUgbG9va3VwIG9wZXJhdGlvbiBpcw0KICogaG93ZXZlciBmYWlybHkgZmFzdCBkdWUgdG8gdGhlIGRlc2lnbiBvZiB0aGUgc3ltYm9sIHRhYmxlLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnRyYWNlTGFiZWwgeFRyYWNlT3BlbkxhYmVsKGNvbnN0IGNoYXIqIGxhYmVsKTsNCg0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVVzZXJFdmVudA0KICoNCiAqIEJhc2ljIHVzZXIgZXZlbnQgKFN0YW5kYXJkIGFuZCBQcm9mZXNzaW9uYWwgRWRpdGlvbiBvbmx5KQ0KICoNCiAqIEdlbmVyYXRlcyBhIFVzZXIgRXZlbnQgd2l0aCBhIHRleHQgbGFiZWwuIFRoZSBsYWJlbCBpcyBjcmVhdGVkL2xvb2tlZCB1cA0KICogaW4gdGhlIHN5bWJvbCB0YWJsZSB1c2luZyB4VHJhY2VPcGVuTGFiZWwuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VVc2VyRXZlbnQodHJhY2VMYWJlbCBldmVudExhYmVsKTsNCg0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVByaW50Rg0KICoNCiAqIEFkdmFuY2VkIHVzZXIgZXZlbnRzIChQcm9mZXNzaW9uYWwgRWRpdGlvbiBvbmx5KQ0KICoNCiAqIEdlbmVyYXRlcyBVc2VyIEV2ZW50IHdpdGggZm9ybWF0dGVkIHRleHQgYW5kIGRhdGEsIHNpbWlsYXIgdG8gYSAicHJpbnRmIi4NCiAqIEl0IGlzIHZlcnkgZmFzdCBjb21wYXJlZCB0byBhIG5vcm1hbCAicHJpbnRmIiBzaW5jZSB0aGlzIGZ1bmN0aW9uIG9ubHkNCiAqIHN0b3JlcyB0aGUgYXJndW1lbnRzLiBUaGUgYWN0dWFsIGZvcm1hdHRpbmcgaXMgZG9uZQ0KICogb24gdGhlIGhvc3QgUEMgd2hlbiB0aGUgdHJhY2UgaXMgZGlzcGxheWVkIGluIHRoZSB2aWV3ZXIgdG9vbC4NCiAqDQogKiBVc2VyIEV2ZW50IGxhYmVscyBhcmUgY3JlYXRlZCB1c2luZyB4VHJhY2VPcGVuTGFiZWwuDQogKiBFeGFtcGxlOg0KICoNCiAqCSB0cmFjZUxhYmVsIGFkY191ZWNoYW5uZWwgPSB4VHJhY2VPcGVuTGFiZWwoIkFEQyBVc2VyIEV2ZW50cyIpOw0KICoJIC4uLg0KICoJIHZUcmFjZVByaW50KGFkY191ZWNoYW5uZWwsDQogKgkJCQkgIkFEQyBjaGFubmVsICVkOiAlbGYgdm9sdHMiLA0KICoJCQkJIGNoLCAoZG91YmxlKWFkY19yZWFkaW5nLyhkb3VibGUpc2NhbGUpOw0KICoNCiAqIFRoaXMgY2FuIGJlIGNvbWJpbmVkIGludG8gb25lIGxpbmUsIGlmIGRlc2lyZWQsIGJ1dCB0aGlzIGlzIHNsb3dlcjoNCiAqDQogKgkgdlRyYWNlUHJpbnQoeFRyYWNlT3BlbkxhYmVsKCJBREMgVXNlciBFdmVudHMiKSwNCiAqCQkJCSAiQURDIGNoYW5uZWwgJWQ6ICVsZiB2b2x0cyIsDQogKgkJCQkgY2gsIChkb3VibGUpYWRjX3JlYWRpbmcvKGRvdWJsZSlzY2FsZSk7DQogKg0KICogQ2FsbGluZyB4VHJhY2VPcGVuTGFiZWwgbXVsdGlwbGUgdGltZXMgd2lsbCBub3QgY3JlYXRlIGR1cGxpY2F0ZSBlbnRyaWVzLCBidXQNCiAqIGl0IGlzIG9mIGNvdXJzZSBmYXN0ZXIgdG8ganVzdCBkbyBpdCBvbmNlLCBhbmQgdGhlbiBrZWVwIHRoZSBoYW5kbGUgZm9yIGxhdGVyDQogKiB1c2UuIElmIHlvdSBkb260dCBoYXZlIGFueSBkYXRhIGFyZ3VtZW50cywgb25seSBhIHRleHQgbGFiZWwvc3RyaW5nLCBpdCBpcw0KICogYmV0dGVyIHRvIHVzZSB2VHJhY2VVc2VyRXZlbnQgLSBpdCBpcyBmYXN0ZXIuDQogKg0KICogRm9ybWF0IHNwZWNpZmllcnMgc3VwcG9ydGVkOg0KICogJWQgLSAzMiBiaXQgc2lnbmVkIGludGVnZXINCiAqICV1IC0gMzIgYml0IHVuc2lnbmVkIGludGVnZXINCiAqICVmIC0gMzIgYml0IGZsb2F0DQogKiAlcyAtIHN0cmluZyAoaXMgY29waWVkIHRvIHRoZSByZWNvcmRlciBzeW1ib2wgdGFibGUpDQogKiAlaGQgLSAxNiBiaXQgc2lnbmVkIGludGVnZXINCiAqICVodSAtIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VyDQogKiAlYmQgLSA4IGJpdCBzaWduZWQgaW50ZWdlcg0KICogJWJ1IC0gOCBiaXQgdW5zaWduZWQgaW50ZWdlcg0KICogJWxmIC0gZG91YmxlLXByZWNpc2lvbiBmbG9hdCAoTm90ZSEgU2VlIGJlbG93Li4uKQ0KICoNCiAqIFVwIHRvIDE1IGRhdGEgYXJndW1lbnRzIGFyZSBhbGxvd2VkLCB3aXRoIGEgdG90YWwgc2l6ZSBvZiBtYXhpbXVtIDMyIGJ5dGUuDQogKiBJbiBjYXNlIHRoaXMgaXMgZXhjZWVkZWQsIHRoZSB1c2VyIGV2ZW50IGlzIGNoYW5nZWQgaW50byBhbiBlcnJvciBtZXNzYWdlLg0KICoNCiAqIFRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0cmFjZSBidWZmZXIsIGFuZCBpcyBwYWNrZWQgdG8gYWxsb3cgc3RvcmluZyBtdWx0aXBsZQ0KICogc21hbGxlciBkYXRhIGVudHJpZXMgaW4gdGhlIHNhbWUgNC1ieXRlIHJlY29yZCwgZS5nLiwgZm91ciA4LWJpdCB2YWx1ZXMuDQogKiBBIHN0cmluZyByZXF1aXJlcyB0d28gYnl0ZXMsIGFzIHRoZSBzeW1ib2wgdGFibGUgaXMgbGltaXRlZCB0byA2NEsuIFN0b3JpbmcNCiAqIGEgZG91YmxlICglbGYpIHVzZXMgdHdvIHJlY29yZHMsIHNvIHRoaXMgaXMgcXVpdGUgY29zdGx5LiBVc2UgZmxvYXQgKCVmKQ0KICogdW5sZXNzIHRoZSBoaWdoZXIgcHJlY2lzaW9uIGlzIHJlYWxseSBuZWNlc3NhcnkuDQogKg0KICogTm90ZSB0aGF0IHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0ICglbGYpIGFzc3VtZXMgYSA2NCBiaXQgZG91YmxlDQogKiByZXByZXNlbnRhdGlvbi4gVGhpcyBkb2VzIG5vdCBzZWVtIHRvIGJlIHRoZSBjYXNlIG9uIGUuZy4gUElDMjQgYW5kIFBJQzMyLg0KICogQmVmb3JlIHVzaW5nIGEgJWxmIGFyZ3VtZW50IG9uIGEgMTYtYml0IE1DVSwgcGxlYXNlIHZlcmlmeSB0aGF0DQogKiAic2l6ZW9mKGRvdWJsZSkiIGFjdHVhbGx5IGdpdmVzIDggYXMgZXhwZWN0ZWQuIElmIG5vdCwgdXNlICVmIGluc3RlYWQuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VQcmludEYodHJhY2VMYWJlbCBldmVudExhYmVsLCBjb25zdCBjaGFyKiBmb3JtYXRTdHIsIC4uLik7DQoNCiNpZiAoVVNFX1NFUEFSQVRFX1VTRVJfRVZFTlRfQlVGRkVSID09IDEpDQpVc2VyRXZlbnRDaGFubmVsIHhUcmFjZVJlZ2lzdGVyQ2hhbm5lbEZvcm1hdCh0cmFjZUxhYmVsIGNoYW5uZWwsIHRyYWNlTGFiZWwgZm9ybWF0U3RyKTsNCnZvaWQgdlRyYWNlQ2hhbm5lbFByaW50RihVc2VyRXZlbnRDaGFubmVsIGNoYW5uZWwsIC4uLik7DQp2b2lkIHZUcmFjZUNoYW5uZWxVc2VyRXZlbnQoVXNlckV2ZW50Q2hhbm5lbCBjaGFubmVsKTsNCiNlbmRpZg0KDQojZWxzZQ0KDQojZGVmaW5lIHZUcmFjZVByaW50RihldmVudExhYmVsLCBmb3JtYXRTdHIsIC4uLik7DQojZGVmaW5lIHhUcmFjZU9wZW5MYWJlbChsYWJlbCkgMA0KI2RlZmluZSB2VHJhY2VVc2VyRXZlbnQoZXZlbnRMYWJlbCkNCg0KI2VuZGlmDQoNCiNlbHNlDQoNCi8qIEVtcHR5IGRlZmluZXMgZm9yIHVzZXIgZnVuY3Rpb25zIHRvIGF2b2lkIGNvbXBpbGVyIGVycm9ycyBpZiB0cmFjZSBpcyBub3QgdG8gYmUgdXNlZCAqLw0KDQojZGVmaW5lIHZUcmFjZUluaXRUcmFjZURhdGEoKQ0KI2RlZmluZSB1aVRyYWNlU3RhcnQoKSAoMSkgLy8gRmFrZSAic3VjY2VzcyIsIGlmIHVzZWQgd2hlbiByZWNvcmRlciBpcyBleGNsdWRlZCBmcm9tIGJ1aWxkDQojZGVmaW5lIHZUcmFjZVN0YXJ0KCkNCiNkZWZpbmUgdlRyYWNlU3RvcCgpDQojZGVmaW5lIHZUcmFjZUNsZWFyKCkNCiNkZWZpbmUgdlRyYWNlU3RhcnRTdGF0dXNNb25pdG9yKCkNCiNkZWZpbmUgdlRyYWNlR2V0VHJhY2VCdWZmZXIoKSAoKHZvaWQqKTApDQojZGVmaW5lIHVpVHJhY2VHZXRUcmFjZUJ1ZmZlclNpemUoKSAwDQojZGVmaW5lIHhUcmFjZU9wZW5MYWJlbChsYWJlbCkgMA0KI2RlZmluZSB2VHJhY2VVc2VyRXZlbnQoZXZlbnRMYWJlbCkNCiNkZWZpbmUgdlRyYWNlUHJpbnRGKGV2ZW50TGFiZWwsZm9ybWF0U3RyLC4uLikNCiNkZWZpbmUgdlRyYWNlRXhjbHVkZVRhc2tGcm9tU2NoZWR1bGluZ1RyYWNlKG5hbWUpDQoNCiNkZWZpbmUgdlRyYWNlU2V0SVNSUHJvcGVydGllcyhoYW5kbGUsIG5hbWUsIHByaW9yaXR5KQ0KI2RlZmluZSB2VHJhY2VTdG9yZUlTUkJlZ2luKGlkKQ0KI2RlZmluZSB2VHJhY2VTdG9yZUlTUkVuZCgpDQojZGVmaW5lIHZUcmFjZUV4Y2x1ZGVUYXNrRnJvbVRyYWNlKGhhbmRsZSkNCiNkZWZpbmUgdlRyYWNlU2V0UXVldWVOYW1lKGEsIGIpDQojZGVmaW5lIHZUcmFjZVNldE11dGV4TmFtZShhLCBiKQ0KI2RlZmluZSB2VHJhY2VTZXRTZW1hcGhvcmVOYW1lKGEsIGIpDQojZGVmaW5lIHZUcmFjZVNldEV2ZW50R3JvdXBOYW1lKGEsIGIpDQoNCiNkZWZpbmUgdlRyYWNlU2V0U3RvcEhvb2soYSkNCiNlbmRpZg0KDQojaWZkZWYgX19jcGx1c3BsdXMNCn0NCiNlbmRpZg0KDQojZW5kaWYNCg==