LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogQGZpbGUgICAgIHN5c3RlbV9YTUMxMTAwLmMNCiAqIEBicmllZiAgICBEZXZpY2Ugc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBYTUMxMTAwLVNlcmllcyBhY2NvcmRpbmcgDQogKiB0byBDTVNJUw0KICogQHZlcnNpb24gIFYxLjQNCiAqIEBkYXRlICAgICAwMSBGZWIgMjAxMw0KICoNCiAqIEBub3RlDQogKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBJbmZpbmVvbiBUZWNobm9sb2dpZXMgQUcuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNCiAqDQogKiBAcGFyDQogKiBJbmZpbmVvbiBUZWNobm9sb2dpZXMgQUcgKEluZmluZW9uKSBpcyBzdXBwbHlpbmcgdGhpcyBzb2Z0d2FyZSBmb3IgdXNlIHdpdGggDQogKiBJbmZpbmVvbpJzIG1pY3JvY29udHJvbGxlcnMuDQogKiAgIA0KICogVGhpcyBmaWxlIGNhbiBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgd2l0aGluIGRldmVsb3BtZW50IHRvb2xzIHRoYXQgYXJlIA0KICogc3VwcG9ydGluZyBzdWNoIG1pY3JvY29udHJvbGxlcnMuDQogKiAgDQogKg0KICogQHBhcg0KICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLiAgTk8gV0FSUkFOVElFUywgV0hFVEhFUiBFWFBSRVNTLCBJTVBMSUVEDQogKiBPUiBTVEFUVVRPUlksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YNCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVBQTFkgVE8gVEhJUyBTT0ZUV0FSRS4NCiAqIElORklORU9OIFNIQUxMIE5PVCwgSU4gQU5ZIENJUkNVTVNUQU5DRVMsIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgSU5DSURFTlRBTCwNCiAqIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgRk9SIEFOWSBSRUFTT04gV0hBVFNPRVZFUi4NCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoNCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKiBDaGFuZ2UgaGlzdG9yeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogVjEuMiwgMTMgRGVjIDIwMTIsIFBLQiA6IENyZWF0ZWQgY2hhbmdlIGhpc3RvcnkgdGFibGUNCiAqIFYxLjMsIDIwIERlYyAyMDEyLCBQS0IgOiBGaXhlZCBTeXN0ZW1Db3JlQ2xvY2sgY29tcHV0YXRpb24NCiAqIFYxLjMsIDAxIEZlYiAyMDEzLCBQS0IgOiBTQ1VfQ0xPQ0sgLT4gU0NVX0NMSw0KICovDQoNCiNpbmNsdWRlICJzeXN0ZW1fWE1DMTEwMC5oIg0KI2luY2x1ZGUgPFhNQzExMDAuaD4NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiBFeHRlcm4gZGVmaW5pdGlvbnMgDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmV4dGVybiB1aW50MzJfdCBBbGxvd0Nsa0luaXRCeVN0YXJ0dXAodm9pZCk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBHbG9iYWwgZGVmaW5lcw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNkZWZpbmUgRENPX0RDTEsgICAgICAgICAgICAgICAgICA2NDAwMDAwMFVMDQojZGVmaW5lIERDT19EQ0xLX01VTFRJUExJRVIgICAgICAgMTYzODQwMDBVTA0KI2RlZmluZSBEQ09fRENMS19ESVZJREVSICAgICAgICAgIDlVTA0KI2RlZmluZSBNQ0xLX01IWiAgICAgICAgICAgICAgICAgIDMyMDAwMDAwVUwNCiNkZWZpbmUgS0haX01VTFRJUExJRVIgICAgICAgICAgICAxMDAwVUwNCiNkZWZpbmUgRlJBQ0JJVFMgICAgICAgICAgICAgICAgICA4VUwNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykgKE1DTEsgb24gVElNTTEpICovDQp1aW50MzJfdCBTeXN0ZW1Db3JlQ2xvY2s7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBGaXhlZCBwb2ludCBtYXRoIGRlZmluaXRpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KdHlwZWRlZiBpbnQzMl90IFFfMjRfODsNCnR5cGVkZWYgaW50MzJfdCBRXzE1XzA7DQoNCi8qKg0KICAqIEBicmllZiAgU2V0dXAgdGhlIG1pY3JvY29udHJvbGxlciBzeXN0ZW0uDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFN5c3RlbUluaXQodm9pZCkNCnsgICAgDQoNCiAgLyoNCiAgICogQ2xvY2sgdHJlZSBzZXR1cCBieSBDTVNJUyByb3V0aW5lcyBpcyBhbGxvd2VkIG9ubHkgaW4gdGhlIGFic2VuY2Ugb2YgREFWRQ0KICAgKiBDbG9jayBhcHAuDQogICAqLyANCiAgaWYoQWxsb3dDbGtJbml0QnlTdGFydHVwKCkpeyANCiAgLyogRG8gbm90IGNoYW5nZSBkZWZhdWx0IHZhbHVlcyBvZiBJRElWLEZESVYgYW5kIFJUQ0NMS1NFTCAqLw0KICAvKiA9PT09PT0gRGVmYXVsdCBjb25maWd1cmF0aW9uID09PT09PT0gKi8NCiAgLyoNCiAgICogTUNMSyAgICA9IERDT19EQ0xLDQogICAqIFBDTEsgICAgPSBNQ0xLDQogICAqIFJUQyBDTEsgPSBTdGFuZGJ5IGNsb2NrDQogICAqLw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgVXBkYXRlIFN5c3RlbUNvcmVDbG9jayBhY2NvcmRpbmcgdG8gQ2xvY2sgUmVnaXN0ZXIgVmFsdWVzDQogICogQG5vdGUgICAtICANCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU3lzdGVtQ29yZUNsb2NrVXBkYXRlKHZvaWQpDQp7DQogIHVpbnQzMl90IElESVYsIEZESVYsIENMS0NSLCBDbG9jazsNCg0KICBDTEtDUiA9IFNDVV9DTEsgLT4gQ0xLQ1I7DQogIElESVYgPSAoQ0xLQ1IgJiBTQ1VfQ0xLX0NMS0NSX0lESVZfTXNrKSA+PiBTQ1VfQ0xLX0NMS0NSX0lESVZfUG9zOw0KICBGRElWID0gKENMS0NSICYgU0NVX0NMS19DTEtDUl9GRElWX01zaykgPj4gU0NVX0NMS19DTEtDUl9GRElWX1BvczsNCiAgDQogIGlmKElESVYpDQogIHsNCiAgICAvKiBEaXZpZGVyIGlzIGVuYWJsZWQgYW5kIHVzZWQgKi8NCiAgICBpZigwID09IEZESVYpDQogICAgIHsNCiAgICAgICAvKiBObyBmcmFjdGlvbmFsIGRpdmlkZXIsIHNvIE1DTEsgPSBEQ09fQ2xrIC8gKDIgKiBJRElWKSAqLw0KICAgICAgIENsb2NrID0gTUNMS19NSFogLyBJRElWOw0KICAgICB9DQogICAgZWxzZQ0KICAgICB7DQogICAgICAgLyogQm90aCBpbnRlZ2VyIGFuZCBmcmFjdGlvbmFsIGRpdmlkZXIgbXVzdCBiZSBjb25zaWRlcmVkICovDQogICAgICAgLyogMS4gSURJViArIEZESVYvMjU2ICovDQogICAgICAgUV8yNF84IEZEaXZfSURpdl9TdW0gPSAoSURJViA8PCBGUkFDQklUUykgKyBGRElWOyAgDQoNCiAgICAgICAvKiAyLiBGaXhlZCBwb2ludCBkaXZpc2lvbiBRMjQuOCAvIFE5LjggPSBRMTUuMCAqLw0KICAgICAgIFFfMTVfMCBDbG9ja1ZhbCA9IChEQ09fRENMS19NVUxUSVBMSUVSIDw8IEZSQUNCSVRTKS8gRkRpdl9JRGl2X1N1bTsNCiAgICAgICBDbG9jayA9ICgodWludDMyX3QpQ2xvY2tWYWwpICogS0haX01VTFRJUExJRVI7DQogICAgICAgQ2xvY2sgPSBDbG9jayA+PiBEQ09fRENMS19ESVZJREVSOw0KICAgICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGl2aWRlciBieXBhc3NlZC4gU2ltcGx5IGRpdmlkZSBEQ09fRENMSyBieSAyICovDQogICAgQ2xvY2sgPSBNQ0xLX01IWjsNCiAgfQ0KDQogIC8qIEZpbmFsbHkgd2l0aCB0aGUgbWF0aCBjbGFzcyBvdmVyLCB1cGRhdGUgU3lzdGVtQ29yZUNsb2NrICovDQogIFN5c3RlbUNvcmVDbG9jayA9IENsb2NrOyAgDQp9DQoNCg==