LyoNCiAgICBGcmVlUlRPUyBWOC4wLjEgLSBDb3B5cmlnaHQgKEMpIDIwMTQgUmVhbCBUaW1lIEVuZ2luZWVycyBMdGQuDQogICAgQWxsIHJpZ2h0cyByZXNlcnZlZA0KDQogICAgVklTSVQgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcgVE8gRU5TVVJFIFlPVSBBUkUgVVNJTkcgVEhFIExBVEVTVCBWRVJTSU9OLg0KDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBGcmVlUlRPUyBwcm92aWRlcyBjb21wbGV0ZWx5IGZyZWUgeWV0IHByb2Zlc3Npb25hbGx5IGRldmVsb3BlZCwgICAgKg0KICAgICAqICAgIHJvYnVzdCwgc3RyaWN0bHkgcXVhbGl0eSBjb250cm9sbGVkLCBzdXBwb3J0ZWQsIGFuZCBjcm9zcyAgICAgICAgICAqDQogICAgICogICAgcGxhdGZvcm0gc29mdHdhcmUgdGhhdCBoYXMgYmVjb21lIGEgZGUgZmFjdG8gc3RhbmRhcmQuICAgICAgICAgICAgICoNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgIEhlbHAgeW91cnNlbGYgZ2V0IHN0YXJ0ZWQgcXVpY2tseSBhbmQgc3VwcG9ydCB0aGUgRnJlZVJUT1MgICAgICAgICAqDQogICAgICogICAgcHJvamVjdCBieSBwdXJjaGFzaW5nIGEgRnJlZVJUT1MgdHV0b3JpYWwgYm9vaywgcmVmZXJlbmNlICAgICAgICAgICoNCiAgICAgKiAgICBtYW51YWwsIG9yIGJvdGggZnJvbTogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvRG9jdW1lbnRhdGlvbiAgICAgICAgKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgVGhhbmsgeW91ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQogICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVSVE9TIGRpc3RyaWJ1dGlvbi4NCg0KICAgIEZyZWVSVE9TIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCiAgICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICh2ZXJzaW9uIDIpIGFzIHB1Ymxpc2hlZCBieSB0aGUNCiAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gPj4hQU5EIE1PRElGSUVEIEJZITw8IHRoZSBGcmVlUlRPUyBleGNlcHRpb24uDQoNCiAgICA+PiEgICBOT1RFOiBUaGUgbW9kaWZpY2F0aW9uIHRvIHRoZSBHUEwgaXMgaW5jbHVkZWQgdG8gYWxsb3cgeW91IHRvICAgICAhPDwNCiAgICA+PiEgICBkaXN0cmlidXRlIGEgY29tYmluZWQgd29yayB0aGF0IGluY2x1ZGVzIEZyZWVSVE9TIHdpdGhvdXQgYmVpbmcgICAhPDwNCiAgICA+PiEgICBvYmxpZ2VkIHRvIHByb3ZpZGUgdGhlIHNvdXJjZSBjb2RlIGZvciBwcm9wcmlldGFyeSBjb21wb25lbnRzICAgICAhPDwNCiAgICA+PiEgICBvdXRzaWRlIG9mIHRoZSBGcmVlUlRPUyBrZXJuZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPDwNCg0KICAgIEZyZWVSVE9TIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KICAgIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MNCiAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBGdWxsIGxpY2Vuc2UgdGV4dCBpcyBhdmFpbGFibGUgZnJvbSB0aGUgZm9sbG93aW5nDQogICAgbGluazogaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvYTAwMTE0Lmh0bWwNCg0KICAgIDEgdGFiID09IDQgc3BhY2VzIQ0KDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBIYXZpbmcgYSBwcm9ibGVtPyAgU3RhcnQgYnkgcmVhZGluZyB0aGUgRkFRICJNeSBhcHBsaWNhdGlvbiBkb2VzICAgKg0KICAgICAqICAgIG5vdCBydW4sIHdoYXQgY291bGQgYmUgd3Jvbmc/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9GQVFIZWxwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZyAtIERvY3VtZW50YXRpb24sIGJvb2tzLCB0cmFpbmluZywgbGF0ZXN0IHZlcnNpb25zLA0KICAgIGxpY2Vuc2UgYW5kIFJlYWwgVGltZSBFbmdpbmVlcnMgTHRkLiBjb250YWN0IGRldGFpbHMuDQoNCiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9wbHVzIC0gQSBzZWxlY3Rpb24gb2YgRnJlZVJUT1MgZWNvc3lzdGVtIHByb2R1Y3RzLA0KICAgIGluY2x1ZGluZyBGcmVlUlRPUytUcmFjZSAtIGFuIGluZGlzcGVuc2FibGUgcHJvZHVjdGl2aXR5IHRvb2wsIGEgRE9TDQogICAgY29tcGF0aWJsZSBGQVQgZmlsZSBzeXN0ZW0sIGFuZCBvdXIgdGlueSB0aHJlYWQgYXdhcmUgVURQL0lQIHN0YWNrLg0KDQogICAgaHR0cDovL3d3dy5PcGVuUlRPUy5jb20gLSBSZWFsIFRpbWUgRW5naW5lZXJzIGx0ZCBsaWNlbnNlIEZyZWVSVE9TIHRvIEhpZ2gNCiAgICBJbnRlZ3JpdHkgU3lzdGVtcyB0byBzZWxsIHVuZGVyIHRoZSBPcGVuUlRPUyBicmFuZC4gIExvdyBjb3N0IE9wZW5SVE9TDQogICAgbGljZW5zZXMgb2ZmZXIgdGlja2V0ZWQgc3VwcG9ydCwgaW5kZW1uaWZpY2F0aW9uIGFuZCBtaWRkbGV3YXJlLg0KDQogICAgaHR0cDovL3d3dy5TYWZlUlRPUy5jb20gLSBIaWdoIEludGVncml0eSBTeXN0ZW1zIGFsc28gcHJvdmlkZSBhIHNhZmV0eQ0KICAgIGVuZ2luZWVyZWQgYW5kIGluZGVwZW5kZW50bHkgU0lMMyBjZXJ0aWZpZWQgdmVyc2lvbiBmb3IgdXNlIGluIHNhZmV0eSBhbmQNCiAgICBtaXNzaW9uIGNyaXRpY2FsIGFwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUgcHJvdmFibGUgZGVwZW5kYWJpbGl0eS4NCg0KICAgIDEgdGFiID09IDQgc3BhY2VzIQ0KKi8NCg0KDQovKg0KICogQ3JlYXRlcyBhbGwgdGhlIGRlbW8gYXBwbGljYXRpb24gdGFza3MsIHRoZW4gc3RhcnRzIHRoZSBzY2hlZHVsZXIuICBUaGUgV0VCDQogKiBkb2N1bWVudGF0aW9uIHByb3ZpZGVzIG1vcmUgZGV0YWlscyBvZiB0aGUgc3RhbmRhcmQgZGVtbyBhcHBsaWNhdGlvbiB0YXNrcw0KICogKHdoaWNoIGp1c3QgZXhpc3QgdG8gdGVzdCB0aGUga2VybmVsIHBvcnQgYW5kIHByb3ZpZGUgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlDQogKiBlYWNoIEZyZWVSVE9TIEFQSSBmdW5jdGlvbikuDQogKg0KICogSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIGRlbW8gdGFza3MsIHRoZSBmb2xsb3dpbmcgdGFza3MgYW5kIHRlc3RzIGFyZQ0KICogZGVmaW5lZCBhbmQvb3IgY3JlYXRlZCB3aXRoaW4gdGhpcyBmaWxlOg0KICoNCiAqICJDaGVjayIgdGFzayAtIFRoaXMgb25seSBleGVjdXRlcyBldmVyeSBmaXZlIHNlY29uZHMgYnV0IGhhcyB0aGUgaGlnaGVzdA0KICogcHJpb3JpdHkgc28gaXMgZ3VhcmFudGVlZCB0byBnZXQgcHJvY2Vzc29yIHRpbWUuICBJdHMgbWFpbiBmdW5jdGlvbiBpcyB0bw0KICogY2hlY2sgdGhhdCBhbGwgdGhlIHN0YW5kYXJkIGRlbW8gdGFza3MgYXJlIHN0aWxsIG9wZXJhdGlvbmFsLiBUaGUgY2hlY2sgdGFzaw0KICogd2lsbCB0b2dnbGUgTEVEIDMgKFBCMTEpIGV2ZXJ5IGZpdmUgc2Vjb25kcyBzbyBsb25nIGFzIG5vIGVycm9ycyBoYXZlIGJlZW4NCiAqIGRldGVjdGVkLiAgVGhlIHRvZ2dsZSByYXRlIHdpbGwgaW5jcmVhc2UgdG8gaGFsZiBhIHNlY29uZCBpZiBhbiBlcnJvciBoYXMNCiAqIGJlZW4gZm91bmQgaW4gYW55IHRhc2suDQogKg0KICogIkVjaG8iIHRhc2sgLSBUaGlzIGlzIGEgdmVyeSBiYXNpYyB0YXNrIHRoYXQgc2ltcGx5IGVjaG9lcyBhbnkgY2hhcmFjdGVycw0KICogcmVjZWl2ZWQgb24gQ09NMCAoVVNBUlQxKS4gIFRoaXMgY2FuIGJlIHRlc3RlZCBieSB0cmFuc21pdHRpbmcgYSB0ZXh0IGZpbGUNCiAqIGZyb20gYSBkdW1iIHRlcm1pbmFsIHRvIHRoZSBTVE0zMiBVU0FSVCB0aGVuIG9ic2VydmluZyBvciBjYXB0dXJpbmcgdGhlIHRleHQNCiAqIHRoYXQgaXMgZWNob2VkIGJhY2suICBNaXNzaW5nIGNoYXJhY3RlcnMgd2lsbCBiZSBhbGwgdGhlIG1vcmUgb2J2aW91cyBpZiB0aGUNCiAqIGZpbGUgY29udGFpbnMgYSBzaW1wbGUgcmVwZWF0aW5nIHN0cmluZyBvZiBmaXhlZCB3aWR0aC4NCiAqDQogKiBDdXJyZW50bHkgdGhpcyBkZW1vIGRvZXMgbm90IGluY2x1ZGUgaW50ZXJydXB0IG5lc3RpbmcgZXhhbXBsZXMuICBIaWdoDQogKiBmcmVxdWVuY3kgdGltZXIgYW5kIHNpbXBsZXIgbmVzdGluZyBleGFtcGxlcyBjYW4gYmUgZm91bmQgaW4gbW9zdCBDb3J0ZXgtTTMNCiAqIGRlbW8gYXBwbGljYXRpb25zLg0KICoNCiAqIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBpbml0aWFsaXNlLCBzZXQgYW5kIGNsZWFyIExFRCBvdXRwdXRzIGFyZSBub3JtYWxseQ0KICogZGVmaW5lZCBpbiBwYXJ0ZXN0LmMuICBUaGlzIGRlbW8gaW5jbHVkZXMgdHdvIHBhcnRlc3QgZmlsZXMsIG9uZSB0aGF0IGlzDQogKiBjb25maWd1cmVkIGZvciB1c2Ugd2l0aCB0aGUgS2VpbCBNQ0JTVE0zMiBldmFsdWF0aW9uIGJvYXJkIChjYWxsZWQNCiAqIFBhclRlc3RfTUNCU1RNMzIuYykgYW5kIG9uZSB0aGF0IGlzIGNvbmZpZ3VyZWQgZm9yIHVzZSB3aXRoIHRoZSBvZmZpY2lhbA0KICogU1QgRXZhbCBib2FyZCAoY2FsbGVkIFBhclRlc3RfU1RfRXZhbC5jKS4gIE9uZSBvbmUgb2YgdGhlc2UgZmlsZXMgc2hvdWxkIGJlDQogKiBpbmNsdWRlZCBpbiB0aGUgYnVpbGQgYXQgYW55IG9uZSB0aW1lLCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGhhcmR3YXJlDQogKiBhY3R1YWxseSBiZWluZyB1c2VkLg0KICovDQoNCi8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgPHN0cmluZy5oPg0KDQovKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovDQojaW5jbHVkZSAiRnJlZVJUT1MuaCINCiNpbmNsdWRlICJ0YXNrLmgiDQojaW5jbHVkZSAicXVldWUuaCINCg0KLyogTGlicmFyeSBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfaXQuaCINCg0KLyogRGVtbyBhcHAgaW5jbHVkZXMuICovDQojaW5jbHVkZSAiQmxvY2tRLmgiDQojaW5jbHVkZSAiaW50ZWdlci5oIg0KI2luY2x1ZGUgImZsYXNoLmgiDQojaW5jbHVkZSAicGFydGVzdC5oIg0KI2luY2x1ZGUgInNlbXRlc3QuaCINCiNpbmNsdWRlICJHZW5RVGVzdC5oIg0KI2luY2x1ZGUgIlFQZWVrLmgiDQojaW5jbHVkZSAicmVjbXV0ZXguaCINCg0KLyogRHJpdmVyIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIlNUTTMyX1VTQVJULmgiDQoNCg0KLyogVGhlIHRpbWUgYmV0d2VlbiBjeWNsZXMgb2YgdGhlICdjaGVjaycgdGFzayAtIHdoaWNoIGRlcGVuZHMgb24gd2hldGhlciB0aGUNCmNoZWNrIHRhc2sgaGFzIGRldGVjdGVkIGFuIGVycm9yIG9yIG5vdC4gKi8NCiNkZWZpbmUgbWFpbkNIRUNLX0RFTEFZX05PX0VSUk9SCQkJKCAoIFRpY2tUeXBlX3QgKSA1MDAwIC8gcG9ydFRJQ0tfUEVSSU9EX01TICkNCiNkZWZpbmUgbWFpbkNIRUNLX0RFTEFZX0VSUk9SCQkJCSggKCBUaWNrVHlwZV90ICkgNTAwIC8gcG9ydFRJQ0tfUEVSSU9EX01TICkNCg0KLyogVGhlIExFRCBjb250cm9sbGVkIGJ5IHRoZSAnY2hlY2snIHRhc2suICovDQojZGVmaW5lIG1haW5DSEVDS19MRUQJCQkJCQkoIDMgKQ0KDQovKiBUYXNrIHByaW9yaXRpZXMuICovDQojZGVmaW5lIG1haW5TRU1fVEVTVF9QUklPUklUWQkJCQkoIHRza0lETEVfUFJJT1JJVFkgKyAxICkNCiNkZWZpbmUgbWFpbkJMT0NLX1FfUFJJT1JJVFkJCQkJKCB0c2tJRExFX1BSSU9SSVRZICsgMiApDQojZGVmaW5lIG1haW5DSEVDS19UQVNLX1BSSU9SSVRZCQkJCSggdHNrSURMRV9QUklPUklUWSArIDMgKQ0KI2RlZmluZSBtYWluRkxBU0hfVEFTS19QUklPUklUWQkJCQkoIHRza0lETEVfUFJJT1JJVFkgKyAyICkNCiNkZWZpbmUgbWFpbkVDSE9fVEFTS19QUklPUklUWQkJCQkoIHRza0lETEVfUFJJT1JJVFkgKyAxICkNCiNkZWZpbmUgbWFpbklOVEVHRVJfVEFTS19QUklPUklUWSAgICAgICAgICAgKCB0c2tJRExFX1BSSU9SSVRZICkNCiNkZWZpbmUgbWFpbkdFTl9RVUVVRV9UQVNLX1BSSU9SSVRZCQkJKCB0c2tJRExFX1BSSU9SSVRZICkNCg0KLyogQ09NIHBvcnQgYW5kIGJhdWQgcmF0ZSB1c2VkIGJ5IHRoZSBlY2hvIHRhc2suICovDQojZGVmaW5lIG1haW5DT00wCQkJCQkJCSggMCApDQojZGVmaW5lIG1haW5CQVVEX1JBVEUJCQkJCQkoIDExNTIwMCApDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKg0KICogQ29uZmlndXJlIHRoZSBoYXJkd2FyZSBmb3IgdGhlIGRlbW8uDQogKi8NCnN0YXRpYyB2b2lkIHBydlNldHVwSGFyZHdhcmUoIHZvaWQgKTsNCg0KLyogVGhlICdjaGVjaycgdGFzayBhcyBkZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuICovDQpzdGF0aWMgdm9pZCBwcnZDaGVja1Rhc2soIHZvaWQgKnB2UGFyYW1ldGVycyApOw0KDQovKiBBIHNpbXBsZSB0YXNrIHRoYXQgZWNob2VzIGFsbCB0aGUgY2hhcmFjdGVycyB0aGF0IGFyZSByZWNlaXZlZCBvbiBDT00wDQooVVNBUlQxKS4gKi8NCnN0YXRpYyB2b2lkIHBydlVTQVJURWNob1Rhc2soIHZvaWQgKnB2UGFyYW1ldGVycyApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KaW50IG1haW4oIHZvaWQgKQ0Kew0KI2lmZGVmIERFQlVHDQogIGRlYnVnKCk7DQojZW5kaWYNCg0KCS8qIFNldCB1cCB0aGUgY2xvY2tzIGFuZCBtZW1vcnkgaW50ZXJmYWNlLiAqLw0KCXBydlNldHVwSGFyZHdhcmUoKTsNCg0KCS8qIFN0YXJ0IHRoZSBzdGFuZGFyZCBkZW1vIHRhc2tzLiAgVGhlc2UgYXJlIGp1c3QgaGVyZSB0byBleGVyY2lzZSB0aGUNCglrZXJuZWwgcG9ydCBhbmQgcHJvdmlkZSBleGFtcGxlcyBvZiBob3cgdGhlIEZyZWVSVE9TIEFQSSBjYW4gYmUgdXNlZC4gKi8NCgl2U3RhcnRCbG9ja2luZ1F1ZXVlVGFza3MoIG1haW5CTE9DS19RX1BSSU9SSVRZICk7DQogICAgdlN0YXJ0U2VtYXBob3JlVGFza3MoIG1haW5TRU1fVEVTVF9QUklPUklUWSApOw0KICAgIHZTdGFydEludGVnZXJNYXRoVGFza3MoIG1haW5JTlRFR0VSX1RBU0tfUFJJT1JJVFkgKTsNCiAgICB2U3RhcnRHZW5lcmljUXVldWVUYXNrcyggbWFpbkdFTl9RVUVVRV9UQVNLX1BSSU9SSVRZICk7DQoJdlN0YXJ0TEVERmxhc2hUYXNrcyggbWFpbkZMQVNIX1RBU0tfUFJJT1JJVFkgKTsNCiAgICB2U3RhcnRRdWV1ZVBlZWtUYXNrcygpOw0KICAgIHZTdGFydFJlY3Vyc2l2ZU11dGV4VGFza3MoKTsNCg0KCS8qIENyZWF0ZSB0aGUgJ2VjaG8nIHRhc2ssIHdoaWNoIGlzIGFsc28gZGVmaW5lZCB3aXRoaW4gdGhpcyBmaWxlLiAqLw0KCXhUYXNrQ3JlYXRlKCBwcnZVU0FSVEVjaG9UYXNrLCAiRWNobyIsIGNvbmZpZ01JTklNQUxfU1RBQ0tfU0laRSwgTlVMTCwgbWFpbkVDSE9fVEFTS19QUklPUklUWSwgTlVMTCApOw0KDQoJLyogQ3JlYXRlIHRoZSAnY2hlY2snIHRhc2ssIHdoaWNoIGlzIGFsc28gZGVmaW5lZCB3aXRoaW4gdGhpcyBmaWxlLiAqLw0KCXhUYXNrQ3JlYXRlKCBwcnZDaGVja1Rhc2ssICJDaGVjayIsIGNvbmZpZ01JTklNQUxfU1RBQ0tfU0laRSwgTlVMTCwgbWFpbkNIRUNLX1RBU0tfUFJJT1JJVFksIE5VTEwgKTsNCg0KICAgIC8qIFN0YXJ0IHRoZSBzY2hlZHVsZXIuICovDQoJdlRhc2tTdGFydFNjaGVkdWxlcigpOw0KDQogICAgLyogV2lsbCBvbmx5IGdldCBoZXJlIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGNyZWF0ZSB0aGUgaWRsZQ0KICAgIHRhc2suICBUaGUgaWRsZSB0YXNrIGlzIGNyZWF0ZWQgd2l0aGluIHZUYXNrU3RhcnRTY2hlZHVsZXIoKS4gKi8NCglmb3IoIDs7ICk7DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogRGVzY3JpYmVkIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLiAqLw0Kc3RhdGljIHZvaWQgcHJ2Q2hlY2tUYXNrKCB2b2lkICpwdlBhcmFtZXRlcnMgKQ0Kew0KVGlja1R5cGVfdCB4TGFzdEV4ZWN1dGlvblRpbWU7DQp1bnNpZ25lZCBsb25nIHVsVGlja3NUb1dhaXQgPSBtYWluQ0hFQ0tfREVMQVlfTk9fRVJST1I7DQoNCgkvKiBKdXN0IHRvIHJlbW92ZSB0aGUgY29tcGlsZXIgd2FybmluZyBhYm91dCB0aGUgdW51c2VkIHBhcmFtZXRlci4gKi8NCgkoIHZvaWQgKSBwdlBhcmFtZXRlcnM7DQoNCgkvKiBJbml0aWFsaXNlIHRoZSB2YXJpYWJsZSB1c2VkIHRvIGNvbnRyb2wgb3VyIGl0ZXJhdGlvbiByYXRlIHByaW9yIHRvDQoJaXRzIGZpcnN0IHVzZS4gKi8NCgl4TGFzdEV4ZWN1dGlvblRpbWUgPSB4VGFza0dldFRpY2tDb3VudCgpOw0KDQoJZm9yKCA7OyApDQoJew0KCQkvKiBXYWl0IHVudGlsIGl0IGlzIHRpbWUgdG8gcnVuIHRoZSB0ZXN0cyBhZ2Fpbi4gKi8NCgkJdlRhc2tEZWxheVVudGlsKCAmeExhc3RFeGVjdXRpb25UaW1lLCB1bFRpY2tzVG9XYWl0ICk7DQoNCgkJLyogSGFzIGFuIGVycm9yIGJlZW4gZm91bmQgaW4gYW55IHRhc2s/ICovDQoJCWlmKCB4QXJlR2VuZXJpY1F1ZXVlVGFza3NTdGlsbFJ1bm5pbmcoKSAhPSBwZFRSVUUgKQ0KCQl7DQoJCQkvKiBSZWR1Y2UgdGhlIHRpbWUgYmV0d2VlbiBjeWNsZXMgb2YgdGhpcyB0YXNrIC0gd2hpY2ggaGFzIHRoZQ0KCQkJZWZmZWN0IG9mIGluY3JlYXNpbmcgdGhlIHJhdGUgYXQgd2hpY2ggdGhlICdjaGVjaycgTEVEIHRvZ2dsZXMgdG8NCgkJCWluZGljYXRlIHRoZSBleGlzdGVuY2Ugb2YgYW4gZXJyb3IgdG8gYW4gb2JzZXJ2ZXIuICovDQoJCQl1bFRpY2tzVG9XYWl0ID0gbWFpbkNIRUNLX0RFTEFZX0VSUk9SOw0KCQl9DQoJCWVsc2UgaWYoIHhBcmVRdWV1ZVBlZWtUYXNrc1N0aWxsUnVubmluZygpICE9IHBkVFJVRSApDQoJCXsNCgkJCXVsVGlja3NUb1dhaXQgPSBtYWluQ0hFQ0tfREVMQVlfRVJST1I7DQoJCX0NCgkJZWxzZSBpZiggeEFyZUJsb2NraW5nUXVldWVzU3RpbGxSdW5uaW5nKCkgIT0gcGRUUlVFICkNCgkJew0KCQkJdWxUaWNrc1RvV2FpdCA9IG1haW5DSEVDS19ERUxBWV9FUlJPUjsNCgkJfQ0KCSAgICBlbHNlIGlmKCB4QXJlU2VtYXBob3JlVGFza3NTdGlsbFJ1bm5pbmcoKSAhPSBwZFRSVUUgKQ0KCSAgICB7DQoJICAgICAgICB1bFRpY2tzVG9XYWl0ID0gbWFpbkNIRUNLX0RFTEFZX0VSUk9SOw0KCSAgICB9DQoJICAgIGVsc2UgaWYoIHhBcmVJbnRlZ2VyTWF0aHNUYXNrU3RpbGxSdW5uaW5nKCkgIT0gcGRUUlVFICkNCgkgICAgew0KCSAgICAgICAgdWxUaWNrc1RvV2FpdCA9IG1haW5DSEVDS19ERUxBWV9FUlJPUjsNCgkgICAgfQ0KCSAgICBlbHNlIGlmKCB4QXJlUmVjdXJzaXZlTXV0ZXhUYXNrc1N0aWxsUnVubmluZygpICE9IHBkVFJVRSApDQoJICAgIHsNCgkgICAgCXVsVGlja3NUb1dhaXQgPSBtYWluQ0hFQ0tfREVMQVlfRVJST1I7DQoJICAgIH0NCg0KCQl2UGFyVGVzdFRvZ2dsZUxFRCggbWFpbkNIRUNLX0xFRCApOw0KCX0NCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiBEZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuICovDQpzdGF0aWMgdm9pZCBwcnZVU0FSVEVjaG9UYXNrKCB2b2lkICpwdlBhcmFtZXRlcnMgKQ0Kew0Kc2lnbmVkIGNoYXIgY0NoYXI7DQoNCi8qIFN0cmluZyBkZWNsYXJlZCBzdGF0aWMgdG8gZW5zdXJlIGl0IGRvZXMgbm90IGVuZCB1cCBvbiB0aGUgc3RhY2ssIG5vIG1hdHRlcg0Kd2hhdCB0aGUgb3B0aW1pc2F0aW9uIGxldmVsLiAqLw0Kc3RhdGljIGNvbnN0IGNoYXIgKnBjTG9uZ2lzaFN0cmluZyA9DQoiQUJCQSB3YXMgYSBTd2VkaXNoIHBvcCBtdXNpYyBncm91cCBmb3JtZWQgaW4gU3RvY2tob2xtIGluIDE5NzIsIGNvbnNpc3Rpbmcgb2YgQW5uaS1GcmlkIEZyaWRhIEx5bmdzdGFkLCAiDQoiQmr2cm4gVWx2YWV1cywgQmVubnkgQW5kZXJzc29uIGFuZCBBZ25ldGhhIEbkbHRza29nLiBUaHJvdWdob3V0IHRoZSBiYW5kJ3MgZXhpc3RlbmNlLCBG5Gx0c2tvZyBhbmQgVWx2YWV1cyAiDQoid2VyZSBhIG1hcnJpZWQgY291cGxlLCBhcyB3ZXJlIEx5bmdzdGFkIGFuZCBBbmRlcnNzb24gLSBhbHRob3VnaCBib3RoIGNvdXBsZXMgbGF0ZXIgZGl2b3JjZWQuIFRoZXkgYmVjYW1lIG9uZSAiDQoib2YgdGhlIG1vc3QgY29tbWVyY2lhbGx5IHN1Y2Nlc3NmdWwgYWN0cyBpbiB0aGUgaGlzdG9yeSBvZiBwb3B1bGFyIG11c2ljLCBhbmQgdGhleSB0b3BwZWQgdGhlIGNoYXJ0cyB3b3JsZHdpZGUgIg0KImZyb20gMTk3MiB0byAxOTgzLiAgQUJCQSBnYWluZWQgaW50ZXJuYXRpb25hbCBwb3B1bGFyaXR5IGVtcGxveWluZyBjYXRjaHkgc29uZyBob29rcywgc2ltcGxlIGx5cmljcywgc291bmQgIg0KImVmZmVjdHMgKHJldmVyYiwgcGhhc2luZykgYW5kIGEgV2FsbCBvZiBTb3VuZCBhY2hpZXZlZCBieSBvdmVyZHViYmluZyB0aGUgZmVtYWxlIHNpbmdlcnMnIHZvaWNlcyBpbiBtdWx0aXBsZSAiDQoiaGFybW9uaWVzLiBBcyB0aGVpciBwb3B1bGFyaXR5IGdyZXcsIHRoZXkgd2VyZSBzb3VnaHQgYWZ0ZXIgdG8gdG91ciBFdXJvcGUsIEF1c3RyYWxpYSwgYW5kIE5vcnRoIEFtZXJpY2EsIGRyYXdpbmcgIg0KImNyb3dkcyBvZiBhcmRlbnQgZmFucywgbm90YWJseSBpbiBBdXN0cmFsaWEuIFRvdXJpbmcgYmVjYW1lIGEgY29udGVudGlvdXMgaXNzdWUsIGJlaW5nIHBhcnRpY3VsYXJseSBjdW1iZXJzb21lIGZvciAiDQoiRuRsdHNrb2csIGJ1dCB0aGV5IGNvbnRpbnVlZCB0byByZWxlYXNlIHN0dWRpbyBhbGJ1bXMgdG8gd2lkZXNwcmVhZCBjb21tZXJjaWFsIHN1Y2Nlc3MuIEF0IHRoZSBoZWlnaHQgb2YgdGhlaXIgIg0KInBvcHVsYXJpdHksIGhvd2V2ZXIsIGJvdGggcmVsYXRpb25zaGlwcyBiZWdhbiBzdWZmZXJpbmcgc3RyYWluIHRoYXQgbGVkIHVsdGltYXRlbHkgdG8gdGhlIGNvbGxhcHNlIG9mIGZpcnN0IHRoZSAiDQoiVWx2YWV1cy1G5Gx0c2tvZyBtYXJyaWFnZSAoaW4gMTk3OSkgYW5kIHRoZW4gb2YgdGhlIEFuZGVyc3Nvbi1MeW5nc3RhZCBtYXJyaWFnZSBpbiAxOTgxLiBJbiB0aGUgbGF0ZSAxOTcwcyBhbmQgZWFybHkgIg0KIjE5ODBzIHRoZXNlIHJlbGF0aW9uc2hpcCBjaGFuZ2VzIGJlZ2FuIG1hbmlmZXN0aW5nIGluIHRoZSBncm91cCdzIG11c2ljLCBhcyB0aGV5IHByb2R1Y2VkIG1vcmUgdGhvdWdodGZ1bCwgIg0KImludHJvc3BlY3RpdmUgbHlyaWNzIHdpdGggZGlmZmVyZW50IGNvbXBvc2l0aW9ucy4iOw0KDQoJLyogSnVzdCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4gKi8NCgkoIHZvaWQgKSBwdlBhcmFtZXRlcnM7DQoNCgkvKiBJbml0aWFsaXNlIENPTTAsIHdoaWNoIGlzIFVTQVJUMSBhY2NvcmRpbmcgdG8gdGhlIFNUTTMyIGxpYnJhcmllcy4gKi8NCglsQ09NUG9ydEluaXQoIG1haW5DT00wLCBtYWluQkFVRF9SQVRFICk7DQoNCgkvKiBUcnkgc2VuZGluZyBvdXQgYSBzdHJpbmcgYWxsIGluIG9uZSBnbywgYXMgYSB2ZXJ5IGJhc2ljIHRlc3Qgb2YgdGhlDQogICAgbFNlcmlhbFB1dFN0cmluZygpIGZ1bmN0aW9uLiAqLw0KICAgIGxTZXJpYWxQdXRTdHJpbmcoIG1haW5DT00wLCBwY0xvbmdpc2hTdHJpbmcsIHN0cmxlbiggcGNMb25naXNoU3RyaW5nICkgKTsNCg0KCWZvciggOzsgKQ0KCXsNCgkJLyogQmxvY2sgdG8gd2FpdCBmb3IgYSBjaGFyYWN0ZXIgdG8gYmUgcmVjZWl2ZWQgb24gQ09NMC4gKi8NCgkJeFNlcmlhbEdldENoYXIoIG1haW5DT00wLCAmY0NoYXIsIHBvcnRNQVhfREVMQVkgKTsNCg0KCQkvKiBXcml0ZSB0aGUgcmVjZWl2ZWQgY2hhcmFjdGVyIGJhY2sgdG8gQ09NMC4gKi8NCgkJeFNlcmlhbFB1dENoYXIoIG1haW5DT00wLCBjQ2hhciwgMCApOw0KCX0NCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCBwcnZTZXR1cEhhcmR3YXJlKCB2b2lkICkNCnsNCgkvKiBSQ0Mgc3lzdGVtIHJlc2V0KGZvciBkZWJ1ZyBwdXJwb3NlKS4gKi8NCglSQ0NfRGVJbml0ICgpOw0KDQogICAgLyogRW5hYmxlIEhTRS4gKi8NCglSQ0NfSFNFQ29uZmlnKCBSQ0NfSFNFX09OICk7DQoNCgkvKiBXYWl0IHRpbGwgSFNFIGlzIHJlYWR5LiAqLw0KCXdoaWxlIChSQ0NfR2V0RmxhZ1N0YXR1cyhSQ0NfRkxBR19IU0VSRFkpID09IFJFU0VUKTsNCg0KICAgIC8qIEhDTEsgPSBTWVNDTEsuICovDQoJUkNDX0hDTEtDb25maWcoIFJDQ19TWVNDTEtfRGl2MSApOw0KDQogICAgLyogUENMSzIgID0gSENMSy4gKi8NCglSQ0NfUENMSzJDb25maWcoIFJDQ19IQ0xLX0RpdjEgKTsNCg0KICAgIC8qIFBDTEsxICA9IEhDTEsvMi4gKi8NCglSQ0NfUENMSzFDb25maWcoIFJDQ19IQ0xLX0RpdjIgKTsNCg0KCS8qIEFEQ0NMSyA9IFBDTEsyLzQuICovDQoJUkNDX0FEQ0NMS0NvbmZpZyggUkNDX1BDTEsyX0RpdjQgKTsNCg0KICAgIC8qIEZsYXNoIDIgd2FpdCBzdGF0ZS4gKi8NCgkqKCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICAqICkweDQwMDIyMDAwID0gMHgwMTsNCg0KCS8qIFBMTENMSyA9IDhNSHogKiA5ID0gNzIgTUh6ICovDQoJUkNDX1BMTENvbmZpZyggUkNDX1BMTFNvdXJjZV9IU0VfRGl2MSwgUkNDX1BMTE11bF85ICk7DQoNCiAgICAvKiBFbmFibGUgUExMLiAqLw0KCVJDQ19QTExDbWQoIEVOQUJMRSApOw0KDQoJLyogV2FpdCB0aWxsIFBMTCBpcyByZWFkeS4gKi8NCgl3aGlsZSAoUkNDX0dldEZsYWdTdGF0dXMoUkNDX0ZMQUdfUExMUkRZKSA9PSBSRVNFVCk7DQoNCgkvKiBTZWxlY3QgUExMIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuICovDQoJUkNDX1NZU0NMS0NvbmZpZyAoUkNDX1NZU0NMS1NvdXJjZV9QTExDTEspOw0KDQoJLyogV2FpdCB0aWxsIFBMTCBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuICovDQoJd2hpbGUgKFJDQ19HZXRTWVNDTEtTb3VyY2UoKSAhPSAweDA4KTsNCg0KCS8qIEVuYWJsZSBHUElPQSwgR1BJT0IsIEdQSU9DLCBHUElPRCwgR1BJT0UgYW5kIEFGSU8gY2xvY2tzICovDQoJUkNDX0FQQjJQZXJpcGhDbG9ja0NtZCgJUkNDX0FQQjJQZXJpcGhfR1BJT0EgfCBSQ0NfQVBCMlBlcmlwaF9HUElPQiB8UkNDX0FQQjJQZXJpcGhfR1BJT0MNCgkJCQkJCQl8IFJDQ19BUEIyUGVyaXBoX0dQSU9EIHwgUkNDX0FQQjJQZXJpcGhfR1BJT0UgfCBSQ0NfQVBCMlBlcmlwaF9BRklPLCBFTkFCTEUgKTsNCg0KCS8qIFNldCB0aGUgVmVjdG9yIFRhYmxlIGJhc2UgYWRkcmVzcyBhdCAweDA4MDAwMDAwLiAqLw0KCU5WSUNfU2V0VmVjdG9yVGFibGUoIE5WSUNfVmVjdFRhYl9GTEFTSCwgMHgwICk7DQoNCglOVklDX1ByaW9yaXR5R3JvdXBDb25maWcoIE5WSUNfUHJpb3JpdHlHcm91cF80ICk7DQoNCgkvKiBDb25maWd1cmUgSENMSyBjbG9jayBhcyBTeXNUaWNrIGNsb2NrIHNvdXJjZS4gKi8NCglTeXNUaWNrX0NMS1NvdXJjZUNvbmZpZyggU3lzVGlja19DTEtTb3VyY2VfSENMSyApOw0KDQoJLyogSW5pdGlhbGlzZSB0aGUgSU8gdXNlZCBmb3IgdGhlIExFRCBvdXRwdXRzLiAqLw0KCXZQYXJUZXN0SW5pdGlhbGlzZSgpOw0KDQoJLyogU1BJMiBQZXJpcGggY2xvY2sgZW5hYmxlICovDQoJUkNDX0FQQjFQZXJpcGhDbG9ja0NtZCggUkNDX0FQQjFQZXJpcGhfU1BJMiwgRU5BQkxFICk7DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kdm9pZCB2QXBwbGljYXRpb25TdGFja092ZXJmbG93SG9vayggVGFza0hhbmRsZV90IHB4VGFzaywgY2hhciAqcGNUYXNrTmFtZSApDQp7DQoJLyogVGhpcyBmdW5jdGlvbiB3aWxsIGdldCBjYWxsZWQgaWYgYSB0YXNrIG92ZXJmbG93cyBpdHMgc3RhY2suICAgSWYgdGhlDQoJcGFyYW1ldGVycyBhcmUgY29ycnVwdCB0aGVuIGluc3BlY3QgcHhDdXJyZW50VENCIHRvIGZpbmQgd2hpY2ggd2FzIHRoZQ0KCW9mZmVuZGluZyB0YXNrLiAqLw0KDQoJKCB2b2lkICkgcHhUYXNrOw0KCSggdm9pZCApIHBjVGFza05hbWU7DQoNCglmb3IoIDs7ICk7DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kdm9pZCBhc3NlcnRfZmFpbGVkKCB1bnNpZ25lZCBjaGFyICpwdWNGaWxlLCB1bnNpZ25lZCBsb25nIHVsTGluZSApDQp7DQoJKCB2b2lkICkgcHVjRmlsZTsNCgkoIHZvaWQgKSB1bExpbmU7DQoNCglmb3IoIDs7ICk7DQp9DQoNCg==