CkFwYWNoZSBDb21tb25zIElPIDIuMTYuMCBSZWxlYXNlIE5vdGVzCgpJbnRyb2R1Y3Rpb24KLS0tLS0tLS0tLS0tCgpDb21tb25zIElPIGlzIGEgcGFja2FnZSBvZiBKYXZhIHV0aWxpdHkgY2xhc3NlcyBsaWtlIGphdmEuaW8uICAKQ2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc28gc3RhbmRhcmQgYW5kIG9mIHN1Y2ggaGlnaCAKcmV1c2UgYXMgdG8ganVzdGlmeSBleGlzdGVuY2UgaW4gamF2YS5pby4KClRoZSBBcGFjaGUgQ29tbW9ucyBJTyBsaWJyYXJ5IGNvbnRhaW5zIHV0aWxpdHkgY2xhc3Nlcywgc3RyZWFtIGltcGxlbWVudGF0aW9ucywgZmlsZSBmaWx0ZXJzLApmaWxlIGNvbXBhcmF0b3JzLCBlbmRpYW4gdHJhbnNmb3JtYXRpb24gY2xhc3NlcywgYW5kIG11Y2ggbW9yZS4KCkphdmEgOCBpcyByZXF1aXJlZC4KCk5ldyBmZWF0dXJlcwotLS0tLS0tLS0tLS0KCm8gICAgICAgICAgQWRkIGFuZCB1c2UgUGF0aFV0aWxzLmdldEZpbGVOYW1lKFBhdGgsIEZ1bmN0aW9uPFBhdGgsIFI+KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQWRkIGFuZCB1c2UgUGF0aFV0aWxzLmdldEZpbGVOYW1lU3RyaW5nKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIE1ha2UgcHVibGljIEVyYXNlLnJldGhyb3coVGhyb3dhYmxlKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tODI2OiAgQWRkIEJyb2tlbklucHV0U3RyZWFtLkJyb2tlbklucHV0U3RyZWFtKFRocm93YWJsZSkuIFRoYW5rcyB0byBtYXJrc2xhdGVyLCBHYXJ5IEdyZWdvcnkuIApvIElPLTgyNjogIEFkZCBCcm9rZW5SZWFkZXIuQnJva2VuUmVhZGVyKFRocm93YWJsZSkuIFRoYW5rcyB0byBtYXJrc2xhdGVyLCBHYXJ5IEdyZWdvcnkuIApvIElPLTgyNjogIEFkZCBCcm9rZW5PdXRwdXRTdHJlYW0uQnJva2VuT3V0cHV0U3RyZWFtKFRocm93YWJsZSkuIFRoYW5rcyB0byBtYXJrc2xhdGVyLCBHYXJ5IEdyZWdvcnkuIApvIElPLTgyNjogIEFkZCBCcm9rZW5Xcml0ZXIuQnJva2VuV3JpdGVyKFRocm93YWJsZSkuIFRoYW5rcyB0byBtYXJrc2xhdGVyLCBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBCb3VuZGVkSW5wdXRTdHJlYW0uZ2V0UmVtYWluaW5nKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBGaWxlVGltZXMudG9OdGZzVGltZShsb25nKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQWRkIEZpbGVUaW1lcy5mcm9tVW5peFRpbWUobG9uZykuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBGaWxlVGltZXMuaXNVbml4VGltZShGaWxlVGltZSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBGaWxlVGltZXMuaXNVbml4VGltZShsb25nKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQWRkIEZpbGVUaW1lcy50b1VuaXhUaW1lKEZpbGVUaW1lKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQWRkIEJyb2tlbklucHV0U3RyZWFtLkJ1aWxkZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBQYXRoVXRpbHMuZ2V0RXh0ZW5zaW9uKFBhdGgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgUGF0aFV0aWxzLmdldEJhc2VOYW1lKFBhdGgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgVGhyb3R0bGVkSW5wdXRTdHJlYW0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBJT1J1bm5hYmxlLm5vb3AoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQWRkIENoZWNrc3VtSW5wdXRTdHJlYW0gYW5kIHRlc3QgIzU0OC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQWRkIEFic3RyYWN0U3RyZWFtQnVpbGRlci5nZXRSZWFkZXIoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQWRkIE1hdmVuIHByb3BlcnR5IHByb2plY3QuYnVpbGQub3V0cHV0VGltZXN0YW1wIGZvciBidWlsZCByZXByb2R1Y2liaWxpdHkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBQcm94eUlucHV0U3RyZWFtLnVud3JhcCgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgYSBydW5uaW5nIGNvdW50IGFuZCBidWlsZGVyIHRvIEJvdW5kZWRJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpGaXhlZCBCdWdzCi0tLS0tLS0tLS0KCm8gICAgICAgICAgRml4IGFuZCByZS1lbmFibGUgdGVzdFNraXBfUmVxdWlyZWRDaGFyc2V0cyAjNTE4LiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyBJTy04MjQ6ICBTeW1ib2xpY0xpbmVGaWxlRmlsdGVyIGRvY3VtZW50YXRpb24gZml4ZXMuIFRoYW5rcyB0byBNaWd1ZWwgTXVub3osIEdhcnkgR3JlZ29yeS4gCm8gSU8tNzk1OiAgQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0ucmVzZXQoKSBvbmx5IHdvcmtzIG9uY2UgIzUyMC4gVGhhbmtzIHRvIE1pZ3VlbCBNdW5veiwgR2FyeSBHcmVnb3J5LiAKbyBJTy03OTU6ICBGaW5pc2ggVE9ETyBvbiBDaGFyU2VxdWVuY2VJbnB1dFN0cmVhbSAjNTQwLiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyBJTy04MjU6ICBBZGQgYnl0ZSBhcnJheSBzaXplIHZhbGlkYXRpb24gZm9yIG1ldGhvZHMgaW4gRW5kaWFuVXRpbHMgIzUyMS4gVGhhbmtzIHRvIEFydGh1ciBDaGFuLCBHYXJ5IEdyZWdvcnkuIApvIElPLTgyNTogIEFkZCBtaXNzaW5nIHRlc3QgY2FzZSBDaXJjdWxhckJ5dGVCdWZmZXJUZXN0LiBUaGFua3MgdG8gZGtkYWwsIEdhcnkgR3JlZ29yeS4gCm8gSU8tNzgxOiAgTWFrZSBDaGFyU2VxdWVuY2VJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSBtb3JlIGNvcnJlY3QgaW4gdGhlIGZhY2Ugb2YgbXVsdGlieXRlIGVuY29kaW5ncyAjNTI1LiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyBJTy03ODE6ICBSZW1vdmUgdW5yZWFjaGFibGUgY29kZSBpbiBBYnN0cmFjdElPRmlsZUZpbHRlclRlc3QgIzUyNi4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZC4gCm8gSU8tODA4OiAgUmF0aW9uYWxpemUgYW5kIHVuaWZ5IGNoZWNraW5nIGZvciBleGlzdGVuY2Ugb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzICM1MjkuIFRoYW5rcyB0byBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQuIApvICAgICAgICAgIEF2b2lkIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIElPQ2FzZS5jaGVja0VxdWFscyhTdHJpbmcsIFN0cmluZykgb24gbnVsbCBpbnB1dC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gQ2FuRXhlY3V0ZUZpbGVGaWx0ZXIuYWNjZXB0KEZpbGUpIG9uIG51bGwgaW5wdXQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEF2b2lkIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIENhbkV4ZWN1dGVGaWxlRmlsdGVyLmFjY2VwdChQYXRoLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzKSBvbiBudWxsIGlucHV0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBDYW5SZWFkRmlsZUZpbHRlci5hY2NlcHQoRmlsZSkgb24gbnVsbCBpbnB1dC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gQ2FuUmVhZEZpbGVGaWx0ZXIuYWNjZXB0KFBhdGgsIEJhc2ljRmlsZUF0dHJpYnV0ZXMpIG9uIG51bGwgaW5wdXQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEF2b2lkIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIENhbldyaXRlRmlsZUZpbHRlci5hY2NlcHQoRmlsZSkgb24gbnVsbCBpbnB1dC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gQ2FuV3JpdGVGaWxlRmlsdGVyLmFjY2VwdChQYXRoLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzKSBvbiBudWxsIGlucHV0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBEaXJlY3RvcnlGaWxlRmlsdGVyLmFjY2VwdChGaWxlKSBvbiBudWxsIGlucHV0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBEaXJlY3RvcnlGaWxlRmlsdGVyLmFjY2VwdChQYXRoLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzKSBvbiBudWxsIGlucHV0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBFbXB0eUZpbGVGaWx0ZXIuYWNjZXB0KEZpbGUpIG9uIG51bGwgaW5wdXQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEF2b2lkIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIEVtcHR5RmlsZUZpbHRlci5hY2NlcHQoUGF0aCwgQmFzaWNGaWxlQXR0cmlidXRlcykgb24gbnVsbCBpbnB1dC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gRmlsZUZpbGVGaWx0ZXIuYWNjZXB0KEZpbGUpIG9uIG51bGwgaW5wdXQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEF2b2lkIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIEZpbGVGaWxlRmlsdGVyLmFjY2VwdChQYXRoLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzKSBvbiBudWxsIGlucHV0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBIaWRkZW5GaWxlRmlsdGVyLmFjY2VwdChGaWxlKSBvbiBudWxsIGlucHV0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBIaWRkZW5GaWxlRmlsdGVyLmFjY2VwdChQYXRoLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzKSBvbiBudWxsIGlucHV0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBJT0Nhc2UuY2hlY2tJbmRleE9mKFN0cmluZywgaW50LCBTdHJpbmcpIG9uIG51bGwgaW5wdXQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEF2b2lkIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIElPQ2FzZS5jaGVja1JlZ2lvbk1hdGNoZXMoU3RyaW5nLCBpbnQsIFN0cmluZykgb24gbnVsbCBpbnB1dC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQm91bmRlZElucHV0U3RyZWFtLmdldENvdW50KCkgc2hvdWxkIG5vdCBjb3VudCBFT0YuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIE1vZGVybml6ZSB0ZW1wb3JhcnkgZmlsZSBjcmVhdGlvbiBhbmQgZGVsZXRpb24gaW4gRGVmZXJyZWRGaWxlT3V0cHV0U3RyZWFtVGVzdCAjNTM1LiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLCBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBQYXRoTWF0Y2hlciB0byBJT0ZpbGVGaWx0ZXIgY2xhc3MgSmF2YWRvYyAjNTM2LiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyBJTy03ODE6ICBGaXggQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0gY29kaW5nIGV4Y2VwdGlvbiBoYW5kbGluZyAjNTM3LiBUaGFua3MgdG8gTWFyY29ubzEyMzQuIApvIElPLTc4MTogIERlcHJlY2F0ZSBpbnQgQ291bnRpbmdJbnB1dFN0cmVhbSNnZXRDb3VudCgpIGluIGZhdm9yIG9mIGxvbmcgQ291bnRpbmdJbnB1dFN0cmVhbSNnZXRCeXRlQ291bnQoKS4gVGhhbmtzIHRvIE1hcmNvbm8xMjM0LiAKbyBJTy04Mjg6ICBEZXByZWNhdGUgQ291bnRpbmdJbnB1dFN0cmVhbS5yZXNldENvdW50KCkgaW4gZmF2b3Igb2YgcmVzZXRCeXRlQ291bnQoKS4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZCwgR2FyeSBHcmVnb3J5LiAKbyBJTy04Mjg6ICBEZXByZWNhdGUgQ291bnRpbmdJbnB1dFN0cmVhbS5nZXRNYXhMZW5ndGgoKSBpbiBmYXZvciBvZiBnZXRNYXhDb3VudCgpKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tODE4OiAgTnVsbElucHV0U3RyZWFtIGJyZWFrcyBJbnB1dFN0cmVhbSdzIHJlYWQgbWV0aG9kIGNvbnRyYWN0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBKYXZhZG9jIHNob3VsZG4ndCByZWZlcmVuY2UgMS54IGJlaGF2aW9yICM1MzkuIFRoYW5rcyB0byBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQuIApvIElPLTgyOTogIERvbid0IGRlY29kZSBhbmQgcmVlbmNvZGUgY2hhcmFjdGVycyBpbiBhIHBvdGVudGlhbGx5IGRpZmZlcmVudCBjaGFyc2V0IGluIEFic3RyYWN0T3JpZ2luLkNoYXJTZXF1ZW5jZU9yaWdpbi5nZXRSZWFkZXIoQ2hhcnNldCkuIFRoYW5rcyB0byBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQsIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgTGV0IHN1YmNsYXNzZXMgb2YgQ291bnRpbmdJbnB1dFN0cmVhbS5hZnRlclJlYWQoaW50KSB0aHJvdyBJT0V4Y2VwdGlvbi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tODA3OiAgQ2hhcmFjdGVyaXphdGlvbiB0ZXN0IGZvciBicm9rZW4gc3ltbGlua3Mgd2hlbiBjb3B5aW5nIGRpcmVjdG9yaWVzICM1NDcuIFRoYW5rcyB0byBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQsIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQ2xvc2VkSW5wdXRTdHJlYW0ucmVhZChieXRlW10sIGludCwgaW50KSBkb2VzIG5vdCBhbHdheXMgcmV0dXJuIC0xLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBDbG9zZWRPdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZVtdLCBpbnQsIGludCkgZG9lcyBub3QgYWx3YXlzIHRocm93IElPRXhjZXB0aW9uLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBYbWxTdHJlYW1SZWFkZXIgY2FuJ3QgcGFyc2UgYW4gWE1MIGRvY3VtZW50IHdpdGggYSBtdWx0aS1saW5lIHByb2xvZyAjNTUwLiBUaGFua3MgdG8gU3lsd2VzdGVyIExhY2hpZXdpY3osIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgWG1sU3RyZWFtUmVhZGVyIGNhbid0IHBhcnNlIFhNTCBhbiBkb2N1bWVudCB3aXRoIGFuIGV4dGVybmFsIHBhcnNlZCBlbnRpdHkgcHJvbG9nLiBUaGFua3MgdG8gQW5kcmVhcyBIdWJvbGQsIEdhcnkgR3JlZ29yeS4gCm8gSU8tODM2OiAgVXBkYXRlIEZpbGVOYW1lVXRpbHMgSmF2YWRvYyAjNTU0LiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyBJTy04MDc6ICBDb3B5IHN5bWxpbmtzLCBub3QgdGhlIGZpbGVzIHRoZSBzeW1saW5rcyBwb2ludCB0byAjNTU4LiBUaGFua3MgdG8gSm9yZGkgU29sYSwgRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyAgICAgICAgICBQaWNrdXAgYXBhY2hlLXJhdC1wbHVnaW4gdmVyc2lvbiBmcm9tIHBhcmVudCBQT00uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCB0ZXN0IGZvciBjb3B5aW5nIGEgc3ltbGluayBGaWxlVXRpbHNUZXN0I3Rlc3RDb3B5RmlsZV9zeW1MaW5rKCkgIzU2NC4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZC4gCm8gICAgICAgICAgTWFrZSBjb3B5RmlsZSBjb3B5IHN5bWJvbGljIGxpbmtzIGJ5IHZhbHVlIHJhdGhlciB0aGFuIHJlZmVyZW5jZSAjNTY1LiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyAgICAgICAgICBEZXByZWNhdGUgQ29weVV0aWxzIDAtYXJndW1lbnQgY29uc3RydWN0b3IuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTg0MzogIERlcHJlY2F0ZSBFbmRpYW5VdGlscyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LCBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQuIApvICAgICAgICAgIERlcHJlY2F0ZSBGaWxlU3lzdGVtVXRpbHMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgRGVwcmVjYXRlIEZpbGVuYW1lVXRpbHMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgRGVwcmVjYXRlIFJhbmRvbUFjY2Vzc0ZpbGVzIDAtYXJndW1lbnQgY29uc3RydWN0b3IuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIENsYXJpZnkgYW5kIGNvcnJlY3QgRW5kaWFuVXRpbHMgYW5kIFN3YXBwZWREYXRhSW5wdXRTdHJlYW0gQVBJIGRvYyAjNTY2LiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLCBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBjaGFyYWN0ZXJpemF0aW9uIHRlc3QgZm9yIGNvcHlpbmcgYSBzeW1saW5rZWQgZGlyZWN0b3J5ICM1NzAuIFRoYW5rcyB0byBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQuIApvICAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGVJbnB1dFN0cmVhbS5idWlsZGVyKCkuZ2V0KCkgbm93IHRocm93cyBJU0UgaW5zdGVhZCBvZiBOUEUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTg0NTogIFRlc3QgbGlua3MgdG8gdGFyZ2V0cyBvdXRzaWRlIHRoZSBzb3VyY2UgZGlyZWN0b3J5ICM1NzEuIFRoYW5rcyB0byBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQuIApvICAgICAgICAgIEZvY3VzIEphdmFkb2Mgb24gY3VycmVudCB2ZXJzaW9uIHJhdGhlciB0aGFuIHBhc3QgdmVyc2lvbnMgIzU3MywgIzU3NC4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZC4gCm8gSU8tNDY5OiAgIlNlbGYtc3VwcHJlc3Npb24gbm90IHBlcm1pdHRlZCIgd2hpbGUgdXNpbmcgQnJva2VuT3V0cHV0IGFuZCBCcm9rZW5JbnB1dCBzdHJlYW1zIHdpdGggdHJ5LXdpdGgtcmVzb3VyY2VzLiBUaGFua3MgdG8gR3JpZ29yeSBGYWRlZXYsIEtyaXN0aWFuIFJvc2Vudm9sZCwgRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyBJTy00MDU6ICBIYW5kbGUgemVybyBhbmQgbmVnYXRpdmUgdGhyZXNob2xkcyAjNTg3LiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyAgICAgICAgICBEZXByZWNhdGUgQ291bnRpbmdJbnB1dFN0cmVhbSBpbiBmYXZvciBvZiBCb3VuZGVkSW5wdXRTdHJlYW0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIFBhdGhVdGlscy5zZXRQb3NpeFBlcm1pc3Npb25zKC4uLikgb25seSBzZXRzIHBlcm1pc3Npb25zIGlmIG5lZWRlZC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgUGF0aFV0aWxzLnNldFJlYWRPbmx5KC4uLikgb25seSBzZXRzIHBlcm1pc3Npb25zIGlmIG5lZWRlZC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgUGF0aFV0aWxzLmRlbGV0ZUZpbGUoLi4uLCBEZWxldGVPcHRpb24uLi4pIG9ubHkgc2V0cyBwZXJtaXNzaW9ucyBpZiBuZWVkZWQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIENsZWFuaW5nUGF0aFZpc2l0b3Igb25seSBzZXRzIHBlcm1pc3Npb25zIGlmIG5lZWRlZC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgRGVsZXRpbmdQYXRoVmlzaXRvciBvbmx5IHNldHMgcGVybWlzc2lvbnMgaWYgbmVlZGVkLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKCkNoYW5nZXMKLS0tLS0tLQoKbyAgICAgICAgICBCdW1wIGNvbW1vbnMuYnl0ZWJ1ZGR5LnZlcnNpb24gZnJvbSAxLjE0LjEwIHRvIDEuMTQuMTIgIzUzNCwgIzU5Mi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQnVtcCBvcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1wYXJlbnQgZnJvbSA2NSB0byA2Ny4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQnVtcCBjb21tb25zLWNvZGVjOmNvbW1vbnMtY29kZWMgZnJvbSAxLjE2LjAgdG8gMS4xNi4xICM1ODMuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKbyAgICAgICAgICBCdW1wIG9yZy5jb2RlaGF1cy5tb2pvOmV4ZWMtbWF2ZW4tcGx1Z2luIGZyb20gMy4xLjEgdG8gMy4yLjAgIzU5My4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoKCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKSGlzdG9yaWNhbCBsaXN0IG9mIGNoYW5nZXM6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2NoYW5nZXMtcmVwb3J0Lmh0bWwKCkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQ29tbW9ucyBJTywgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLApwYXRjaGVzLCBvciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQsIHNlZSB0aGUgQXBhY2hlIENvbW1vbnMgSU8gd2Vic2l0ZToKCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvLwoKRG93bmxvYWQgcGFnZTogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vZG93bmxvYWRfaW8uY2dpCgpIYXZlIGZ1biEKLUFwYWNoZSBDb21tb25zIFRlYW0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCkFwYWNoZSBDb21tb25zIElPIApWZXJzaW9uIDIuMTUuMQpSZWxlYXNlIE5vdGVzCgpJbnRyb2R1Y3Rpb24KLS0tLS0tLS0tLS0tCgpDb21tb25zIElPIGlzIGEgcGFja2FnZSBvZiBKYXZhIHV0aWxpdHkgY2xhc3NlcyBsaWtlIGphdmEuaW8uICAKQ2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc28gc3RhbmRhcmQgYW5kIG9mIHN1Y2ggaGlnaCAKcmV1c2UgYXMgdG8ganVzdGlmeSBleGlzdGVuY2UgaW4gamF2YS5pby4KClRoZSBBcGFjaGUgQ29tbW9ucyBJTyBsaWJyYXJ5IGNvbnRhaW5zIHV0aWxpdHkgY2xhc3Nlcywgc3RyZWFtIGltcGxlbWVudGF0aW9ucywgZmlsZSBmaWx0ZXJzLApmaWxlIGNvbXBhcmF0b3JzLCBlbmRpYW4gdHJhbnNmb3JtYXRpb24gY2xhc3NlcywgYW5kIG11Y2ggbW9yZS4KCkphdmEgOCBpcyByZXF1aXJlZC4KCkZpeGVkIEJ1Z3MKLS0tLS0tLS0tLQoKKiAgICAgICAgICAgRml4IHdyb25nIGlzc3VlIGlkIGluIGNoYW5nZSBsb2cgIzUwMy4gVGhhbmtzIHRvIEdyZWdvciBEc2NodW5nLiAKKiAgICAgICAgICAgQWRkIHRlc3QgZm9yIEZpbGVDaGFubmVscy5jb250ZW50RXF1YWxzKCkgIzUwOS4gVGhhbmtzIHRvIFN0ZXBoYW4gTWFya3dhbGRlciwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IEZpbGVDaGFubmVscy5jb250ZW50RXF1YWxzKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggc29tZSBKYXZhZG9jIGlzc3VlcyBpbiBMaW5lSXRlcmF0b3IgYW5kIElPVXRpbHMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBTaW1wbGlmeSBGaWxlQWx0ZXJhdGlvbk9ic2VydmVyIGludGVybmFsIHByb2Nlc3NpbmcuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBSZWdleEZpbGVGaWx0ZXIuUmVnZXhGaWxlRmlsdGVyKFBhdHRlcm4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gUmVnZXhGaWxlRmlsdGVyLmFjY2VwdChQYXRoLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogQ2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGVmaWx0ZXIuUmVnZXhGaWxlRmlsdGVyIGRlZmluZXMgbm9uLXRyYW5zaWVudCBub24tc2VyaWFsaXphYmxlIGluc3RhbmNlIGZpZWxkIHBhdGhUb1N0cmluZyBbb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGVmaWx0ZXIuUmVnZXhGaWxlRmlsdGVyXSBJbiBSZWdleEZpbGVGaWx0ZXIuamF2YSBTRV9CQURfRklFTEQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IENsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlZmlsdGVyLkRlbGVnYXRlRmlsZUZpbHRlciBkZWZpbmVzIG5vbi10cmFuc2llbnQgbm9uLXNlcmlhbGl6YWJsZSBpbnN0YW5jZSBmaWVsZCBmaWxlRmlsdGVyIFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZWZpbHRlci5EZWxlZ2F0ZUZpbGVGaWx0ZXJdIEluIERlbGVnYXRlRmlsZUZpbHRlci5qYXZhIFNFX0JBRF9GSUVMRC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogQ2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGVmaWx0ZXIuRGVsZWdhdGVGaWxlRmlsdGVyIGRlZmluZXMgbm9uLXRyYW5zaWVudCBub24tc2VyaWFsaXphYmxlIGluc3RhbmNlIGZpZWxkIGZpbGVOYW1lRmlsdGVyIFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZWZpbHRlci5EZWxlZ2F0ZUZpbGVGaWx0ZXJdIEluIERlbGVnYXRlRmlsZUZpbHRlci5qYXZhIFNFX0JBRF9GSUVMRC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogb3JnLmFwYWNoZS5jb21tb25zLmlvLmZ1bmN0aW9uLklPU3RyZWFtJDEubmV4dCgpIGNhbm5vdCB0aHJvdyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZnVuY3Rpb24uSU9TdHJlYW0kMV0gQXQgSU9TdHJlYW0uamF2YTpbbGluZSA5OF0gSVRfTk9fU1VDSF9FTEVNRU5ULiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8ubW9uaXRvci5GaWxlQWx0ZXJhdGlvbk1vbml0b3IuZ2V0T2JzZXJ2ZXJzKCkgbWF5IGV4cG9zZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBieSByZXR1cm5pbmcgRmlsZUFsdGVyYXRpb25Nb25pdG9yLm9ic2VydmVycyBbb3JnLmFwYWNoZS5jb21tb25zLmlvLm1vbml0b3IuRmlsZUFsdGVyYXRpb25Nb25pdG9yXSBBdCBGaWxlQWx0ZXJhdGlvbk1vbml0b3IuamF2YTpbbGluZSAxMjRdIEVJX0VYUE9TRV9SRVAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IENsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5pby5tb25pdG9yLkZpbGVBbHRlcmF0aW9uT2JzZXJ2ZXIgZGVmaW5lcyBub24tdHJhbnNpZW50IG5vbi1zZXJpYWxpemFibGUgaW5zdGFuY2UgZmllbGQgZmlsZUZpbHRlciBbb3JnLmFwYWNoZS5jb21tb25zLmlvLm1vbml0b3IuRmlsZUFsdGVyYXRpb25PYnNlcnZlcl0gSW4gRmlsZUFsdGVyYXRpb25PYnNlcnZlci5qYXZhIFNFX0JBRF9GSUVMRC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogQ2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmlvLm1vbml0b3IuRmlsZUFsdGVyYXRpb25PYnNlcnZlciBkZWZpbmVzIG5vbi10cmFuc2llbnQgbm9uLXNlcmlhbGl6YWJsZSBpbnN0YW5jZSBmaWVsZCBsaXN0ZW5lcnMgW29yZy5hcGFjaGUuY29tbW9ucy5pby5tb25pdG9yLkZpbGVBbHRlcmF0aW9uT2JzZXJ2ZXJdIEluIEZpbGVBbHRlcmF0aW9uT2JzZXJ2ZXIuamF2YSBTRV9CQURfRklFTEQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlQ2xlYW5pbmdUcmFja2VyLmdldERlbGV0ZUZhaWx1cmVzKCkgbWF5IGV4cG9zZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBieSByZXR1cm5pbmcgRmlsZUNsZWFuaW5nVHJhY2tlci5kZWxldGVGYWlsdXJlcyBbb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVDbGVhbmluZ1RyYWNrZXJdIEF0IEZpbGVDbGVhbmluZ1RyYWNrZXIuamF2YTpbbGluZSAyMThdIEVJX0VYUE9TRV9SRVAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT0V4Y2VwdGlvbkxpc3QuZ2V0Q2F1c2VMaXN0KCkgbWF5IGV4cG9zZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBieSByZXR1cm5pbmcgSU9FeGNlcHRpb25MaXN0LmNhdXNlTGlzdCBbb3JnLmFwYWNoZS5jb21tb25zLmlvLklPRXhjZXB0aW9uTGlzdF0gQXQgSU9FeGNlcHRpb25MaXN0LmphdmE6W2xpbmUgMTE4XSBFSV9FWFBPU0VfUkVQLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9FeGNlcHRpb25MaXN0LmdldENhdXNlTGlzdChDbGFzcykgbWF5IGV4cG9zZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBieSByZXR1cm5pbmcgSU9FeGNlcHRpb25MaXN0LmNhdXNlTGlzdCBbb3JnLmFwYWNoZS5jb21tb25zLmlvLklPRXhjZXB0aW9uTGlzdF0gQXQgSU9FeGNlcHRpb25MaXN0LmphdmE6W2xpbmUgMTI5XSBFSV9FWFBPU0VfUkVQLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZS5BY2N1bXVsYXRvclBhdGhWaXNpdG9yLmdldERpckxpc3QoKSBtYXkgZXhwb3NlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGJ5IHJldHVybmluZyBBY2N1bXVsYXRvclBhdGhWaXNpdG9yLmRpckxpc3QgW29yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlLkFjY3VtdWxhdG9yUGF0aFZpc2l0b3JdIEF0IEFjY3VtdWxhdG9yUGF0aFZpc2l0b3IuamF2YTpbbGluZSAxNzldIEVJX0VYUE9TRV9SRVAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlLkFjY3VtdWxhdG9yUGF0aFZpc2l0b3IuZ2V0RmlsZUxpc3QoKSBtYXkgZXhwb3NlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGJ5IHJldHVybmluZyBBY2N1bXVsYXRvclBhdGhWaXNpdG9yLmZpbGVMaXN0IFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZS5BY2N1bXVsYXRvclBhdGhWaXNpdG9yXSBBdCBBY2N1bXVsYXRvclBhdGhWaXNpdG9yLmphdmE6W2xpbmUgMTg4XSBFSV9FWFBPU0VfUkVQLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuT2JzZXJ2YWJsZUlucHV0U3RyZWFtLmdldE9ic2VydmVycygpIG1heSBleHBvc2UgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gYnkgcmV0dXJuaW5nIE9ic2VydmFibGVJbnB1dFN0cmVhbS5vYnNlcnZlcnMgW29yZy5hcGFjaGUuY29tbW9ucy5pby5pbnB1dC5PYnNlcnZhYmxlSW5wdXRTdHJlYW1dIEF0IE9ic2VydmFibGVJbnB1dFN0cmVhbS5qYXZhOltsaW5lIDE4N10gRUlfRVhQT1NFX1JFUC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogRXhjZXB0aW9uIHRocm93biBpbiBjbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbSBhdCBuZXcgb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0LlVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZVtdLCBpbnQpIHdpbGwgbGVhdmUgdGhlIGNvbnN0cnVjdG9yLiBUaGUgb2JqZWN0IHVuZGVyIGNvbnN0cnVjdGlvbiByZW1haW5zIHBhcnRpYWxseSBpbml0aWFsaXplZCBhbmQgbWF5IGJlIHZ1bG5lcmFibGUgdG8gRmluYWxpemVyIGF0dGFja3MuIFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbSwgb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0LlVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW1dIEF0IFVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0uamF2YTpbbGluZSAyMDJdQXQgVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbS5qYXZhOltsaW5lIDIwMl0gQ1RfQ09OU1RSVUNUT1JfVEhST1cuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IEV4Y2VwdGlvbiB0aHJvd24gaW4gY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0LlVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0gYXQgbmV3IG9yZy5hcGFjaGUuY29tbW9ucy5pby5pbnB1dC5VbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVbXSwgaW50LCBpbnQpIHdpbGwgbGVhdmUgdGhlIGNvbnN0cnVjdG9yLiBUaGUgb2JqZWN0IHVuZGVyIGNvbnN0cnVjdGlvbiByZW1haW5zIHBhcnRpYWxseSBpbml0aWFsaXplZCBhbmQgbWF5IGJlIHZ1bG5lcmFibGUgdG8gRmluYWxpemVyIGF0dGFja3MuIFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbSwgb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0LlVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW1dIEF0IFVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0uamF2YTpbbGluZSAyMjNdQXQgVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbS5qYXZhOltsaW5lIDIyM10gQ1RfQ09OU1RSVUNUT1JfVEhST1cuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKQ2hhbmdlcwotLS0tLS0tCgoqICAgICAgICAgICBCdW1wIG9yZy5jb2RlaGF1cy5tb2pvOmV4ZWMtbWF2ZW4tcGx1Z2luIGZyb20gMy4xLjAgdG8gMy4xLjEgIzUxMi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAgY29tbW9ucy1sYW5nMyBmcm9tIDMuMTMuMCB0byAzLjE0LjAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIGNvbW1vbnMuYnl0ZWJ1ZGR5LnZlcnNpb24gZnJvbSAxLjE0LjkgdG8gMS4xNC4xMCAjNTE2LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgIEJ1bXAgY29tbW9ucy1wYXJlbnQgZnJvbSA2NCB0byA2NS4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNjoKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IFllcy4KU2VtYW50aWMgY29tcGF0aWJsZTogWWVzLgoKQ29tbW9ucyBJTyAyLjcgYW5kIHVwIHJlcXVpcmVzIEphdmEgOCBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgSmF2YSA3IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMyB0aHJvdWdoIDIuNSByZXF1aXJlcyBKYXZhIDYgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEphdmEgNSBvciBhYm92ZS4KQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUuCgpIaXN0b3JpY2FsIGxpc3Qgb2YgY2hhbmdlczogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vY2hhbmdlcy1yZXBvcnQuaHRtbAoKRm9yIGNvbXBsZXRlIGluZm9ybWF0aW9uIG9uIEFwYWNoZSBDb21tb25zIElPLCBpbmNsdWRpbmcgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBzdWJtaXQgYnVnIHJlcG9ydHMsCnBhdGNoZXMsIG9yIHN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudCwgc2VlIHRoZSBBcGFjaGUgQ29tbW9ucyBJTyB3ZWJzaXRlOgoKaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vCgpEb3dubG9hZCBwYWdlOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9kb3dubG9hZF9pby5jZ2kKCkhhdmUgZnVuIQotQXBhY2hlIENvbW1vbnMgVGVhbQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyAKVmVyc2lvbiAyLjE1LjAKUmVsZWFzZSBOb3RlcwoKSW50cm9kdWN0aW9uCi0tLS0tLS0tLS0tLQoKQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLiAgCkNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNvIHN0YW5kYXJkIGFuZCBvZiBzdWNoIGhpZ2ggCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsIGZpbGUgZmlsdGVycywKZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpKYXZhIDggaXMgcmVxdWlyZWQuCgpOZXcgZmVhdHVyZXMKLS0tLS0tLS0tLS0tCgoqICAgICAgICAgICBBZGQgb3JnLmFwYWNoZS5jb21tb25zLmlvLmNoYW5uZWxzLkZpbGVDaGFubmVscy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBSYW5kb21BY2Nlc3NGaWxlcyNjb250ZW50RXF1YWxzKFJhbmRvbUFjY2Vzc0ZpbGUsIFJhbmRvbUFjY2Vzc0ZpbGUpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFJhbmRvbUFjY2Vzc0ZpbGVzI3Jlc2V0KFJhbmRvbUFjY2Vzc0ZpbGUpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFBhdGhVdGlsc0NvbnRlbnRFcXVhbHNCZW5jaG1hcmsuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgb3JnLmFwYWNoZS5jb21tb25zLmlvLlN0cmVhbUl0ZXJhdG9yLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIE1lc3NhZ2VEaWdlc3RJbnB1dFN0cmVhbSBhbmQgZGVwcmVjYXRlIE1lc3NhZ2VEaWdlc3RDYWxjdWxhdGluZ0lucHV0U3RyZWFtLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKCkZpeGVkIEJ1Z3MKLS0tLS0tLS0tLQoKKiBJTy04MTU6ICBYbWxTdHJlYW1SZWFkZXIgZW5jb2RpbmcgbWF0Y2ggUkUgaXMgdG9vIHN0cmljdC4gVGhhbmtzIHRvIExhdXJlbmNlIEdvbnNhbHZlcy4gCiogSU8tODEwOiAgSmF2YWRvYyBpbiBGaWxlVXRpbHMgZG9lcyBub3QgcmVmbGVjdCBjb2RlIGZvciB0aHJvd24gZXhjZXB0aW9ucy4gVGhhbmtzIHRvIEdyZWdvciBEc2NodW5nLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTgxMjogIEphdmFkb2Mgc2hvdWxkIG1lbnRpb24gY2xvc2luZyBTdHJlYW1zIGJhc2VkIG9uIGZpbGUgcmVzb3VyY2VzLiBUaGFua3MgdG8gQWRhbSBSYXVjaCwgR2FyeSBHcmVnb3J5LiAKKiBJTy04MTE6ICBJbiB0ZXN0cywgRmlsZXMud2FsaygpIGRpcmVjdCBhbmQgaW5kaXJlY3QgY2FsbGVycyBmYWlsIHRvIGNsb3NlIHRoZSByZXR1cm5lZCBTdHJlYW0uIFRoYW5rcyB0byBBZGFtIFJhdWNoLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTgxMTogIEZpbGVVdGlscy5saXN0RmlsZXMoRmlsZSwgU3RyaW5nW10sIGJvb2xlYW4pIGZhaWxzIHRvIGNsb3NlIGl0cyBpbnRlcm5hbCBTdHJlYW0uIFRoYW5rcyB0byBBZGFtIFJhdWNoLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTgxMTogIEZpbGVVdGlscy5pdGVyYXRlRmlsZXMoRmlsZSwgU3RyaW5nW10sIGJvb2xlYW4pIGZhaWxzIHRvIGNsb3NlIGl0cyBpbnRlcm5hbCBTdHJlYW0uIFRoYW5rcyB0byBBZGFtIFJhdWNoLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTgxMTogIFN0cmVhbUl0ZXJhdG9yIGZhaWxzIHRvIGNsb3NlIGl0cyBpbnRlcm5hbCBTdHJlYW0uIFRoYW5rcyB0byBBZGFtIFJhdWNoLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTgxNDogIERvbid0IHRocm93IFVuY2hlY2tlZElPRXhjZXB0aW9uICM0OTEuIFRoYW5rcyB0byBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQsIEdhcnkgR3JlZ29yeS4gCiogSU8tNDE0OiAgRG9uJ3Qgd3JpdGUgYSBCT00gb24gZXZlcnkgKG9yIGFueSkgbGluZSAjNDkyLiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTgxNDogIFJhbmRvbUFjY2Vzc0ZpbGVNb2RlLmNyZWF0ZShQYXRoKSBwcm92aWRlcyBhIGJldHRlciBOdWxsUG9pbnRlckV4Y2VwdGlvbiBtZXNzYWdlLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgSW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBQYXRoVXRpbHMuZmlsZUNvbnRlbnRFcXVhbHMoUGF0aCwgUGF0aCwgTGlua09wdGlvbltdLCBPcGVuT3B0aW9uW10pIGJ5IGFib3V0IDYwJSwgc2VlIFBhdGhVdGlsc0NvbnRlbnRFcXVhbHNCZW5jaG1hcmsuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBJbXByb3ZlIHBlcmZvcm1hbmNlIG9mIFBhdGhVdGlscy5maWxlQ29udGVudEVxdWFscyhQYXRoLCBQYXRoKSBieSBhYm91dCA2MCUsIHNlZSBQYXRoVXRpbHNDb250ZW50RXF1YWxzQmVuY2htYXJrLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgSW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBGaWxlVXRpbHMuY29udGVudEVxdWFscyhGaWxlLCBGaWxlKSBieSBhYm91dCA2MCUsIHNlZSBQYXRoVXRpbHNDb250ZW50RXF1YWxzQmVuY2htYXJrLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgUmVtb3ZlIHVudXNlZCB0ZXN0IGNvZGUgIzQ5NC4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZC4gCiogICAgICAgICAgIFtKYXZhZG9jXSBJT1V0aWxzI2NvbnRlbnRFcXVhbHMgZG9lcyBub3QgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24gIzQ5Ni4gVGhhbmtzIHRvIHNlYmJBU0YuIAoqICAgICAgICAgICBGaXggQ29kZVFMIHdhcm5pbmdzIGluIFVuc3luY2hyb25pemVkQnVmZmVyZWRJbnB1dFN0cmVhbTogSW1wbGljaXQgbmFycm93aW5nIGNvbnZlcnNpb24gaW4gY29tcG91bmQgYXNzaWdubWVudC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIE1lc3NhZ2VEaWdlc3RDYWxjdWxhdGluZ0lucHV0U3RyZWFtLk1lc3NhZ2VEaWdlc3RNYWludGFpbmluZ09ic2VydmVyLk1lc3NhZ2VEaWdlc3RNYWludGFpbmluZ09ic2VydmVyKE1lc3NhZ2VEaWdlc3QpIG5vdyB0aHJvd3MgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbgogICAgICAgIGlmIHRoZSBNZXNzYWdlRGlnZXN0IGlzIG51bGwuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBNZXNzYWdlRGlnZXN0Q2FsY3VsYXRpbmdJbnB1dFN0cmVhbS5NZXNzYWdlRGlnZXN0Q2FsY3VsYXRpbmdJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSwgTWVzc2FnZURpZ2VzdCkgbm93IHRocm93cyBhIE51bGxQb2ludGVyRXhjZXB0aW9uCiAgICAgICAgaWYgdGhlIE1lc3NhZ2VEaWdlc3QgaXMgbnVsbC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tODE2OiAgVW5zeW5jaHJvbml6ZWRCdWZmZXJlZElucHV0U3RyZWFtLnJlYWQoYnl0ZVtdLCBpbnQsIGludCkgZG9lcyBub3QgdXNlIGJ1ZmZlci4gVGhhbmtzIHRvIEFuZHJlYXMgTG90aCwgR2FyeSBHcmVnb3J5LiAKCkNoYW5nZXMKLS0tLS0tLQoKKiAgICAgICAgICAgQnVtcCBvcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1wYXJlbnQgZnJvbSA2MiB0byA2NC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpDb21wYXRpYmlsaXR5IHdpdGggMi42OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCkhpc3RvcmljYWwgbGlzdCBvZiBjaGFuZ2VzOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9jaGFuZ2VzLXJlcG9ydC5odG1sCgpGb3IgY29tcGxldGUgaW5mb3JtYXRpb24gb24gQXBhY2hlIENvbW1vbnMgSU8sIGluY2x1ZGluZyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHN1Ym1pdCBidWcgcmVwb3J0cywKcGF0Y2hlcywgb3Igc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50LCBzZWUgdGhlIEFwYWNoZSBDb21tb25zIElPIHdlYnNpdGU6CgpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby8KCkRvd25sb2FkIHBhZ2U6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2Rvd25sb2FkX2lvLmNnaQoKSGF2ZSBmdW4hCi1BcGFjaGUgQ29tbW9ucyBUZWFtCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFwYWNoZSBDb21tb25zIElPIApWZXJzaW9uIDIuMTQuMApSZWxlYXNlIE5vdGVzCgpJbnRyb2R1Y3Rpb24KLS0tLS0tLS0tLS0tCgpDb21tb25zIElPIGlzIGEgcGFja2FnZSBvZiBKYXZhIHV0aWxpdHkgY2xhc3NlcyBsaWtlIGphdmEuaW8uICAKQ2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc28gc3RhbmRhcmQgYW5kIG9mIHN1Y2ggaGlnaCAKcmV1c2UgYXMgdG8ganVzdGlmeSBleGlzdGVuY2UgaW4gamF2YS5pby4KClRoZSBBcGFjaGUgQ29tbW9ucyBJTyBsaWJyYXJ5IGNvbnRhaW5zIHV0aWxpdHkgY2xhc3Nlcywgc3RyZWFtIGltcGxlbWVudGF0aW9ucywgZmlsZSBmaWx0ZXJzLApmaWxlIGNvbXBhcmF0b3JzLCBlbmRpYW4gdHJhbnNmb3JtYXRpb24gY2xhc3NlcywgYW5kIG11Y2ggbW9yZS4KCkphdmEgOCByZXF1aXJlZC4KCk5ldyBmZWF0dXJlcwotLS0tLS0tLS0tLS0KCiogICAgICAgICAgIEFkZCBEZWZlcnJlZEZpbGVPdXRwdXRTdHJlYW0uZ2V0UGF0aCgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIEZpbGVDbGVhbmluZ1RyYWNrZXIudHJhY2soUGF0aCwgT2JqZWN0WywgRmlsZURlbGV0ZVN0cmF0ZWd5XSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgSU9VdGlscy5za2lwW0Z1bGx5XShJbnB1dFN0cmVhbSwgbG9uZywgU3VwcGxpZXI8Ynl0ZVtdPikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgRmlsZXNVbmNoZWNrLmZpbmQoUGF0aCwgaW50LCBCaVByZWRpY2F0ZSVsdDtQYXRoLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzPiwgRmlsZVZpc2l0T3B0aW9uLi4uKSBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIElPSW50U3VwcGxpZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgSU9Mb25nU3VwcGxpZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgVW5jaGVjay5nZXRBc0ludChJT0ludFN1cHBsaWVyIFssIFN1cHBsaWVyPFN0cmluZz5dKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBVbmNoZWNrLmdldEFzTG9uZyhJT0xvbmdTdXBwbGllciBbLCBTdXBwbGllcjxTdHJpbmc+XSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgVW5jaGVjay5ydW4oSU9SdW5uYWJsZSwgU3VwcGxpZXI8U3RyaW5nPikgVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBVbmNoZWNrLmdldChJT1N1cHBsaWVyLCBTdXBwbGllcjxTdHJpbmc+KSBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgSU9GaWxlRmlsdGVyIG5vdyBhbHNvIGV4dGVuZHMgamF2YS5uaW8uZmlsZS5QYXRoTWF0Y2hlci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBQYXRoTWF0Y2hlckZpbGVGaWx0ZXIgdG8gYWRhcHQgamF2YS5uaW8uZmlsZS5QYXRoTWF0Y2hlci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBUaHJlc2hvbGRpbmdPdXRwdXRTdHJlYW0uZ2V0T3V0cHV0U3RyZWFtKCkgYW5kIGRlcHJlY2F0ZSBnZXRTdHJlYW0oKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBEZWZlcnJlZEZpbGVPdXRwdXRTdHJlYW0uQnVpbGRlci5zZXRPdXRwdXRGaWxlKFBhdGgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIERlZmVycmVkRmlsZU91dHB1dFN0cmVhbS5CdWlsZGVyLnNldERpcmVjdG9yeShQYXRoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBBYnN0cmFjdFN0cmVhbUJ1aWxkZXIuc2V0QnVmZmVyU2l6ZUNoZWNrZXIoSW50VG9JbnRGdW5jdGlvbikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQWJzdHJhY3RTdHJlYW1CdWlsZGVyLnNldEJ1ZmZlclNpemVNYXgoaW50KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpGaXhlZCBCdWdzCi0tLS0tLS0tLS0KCiogSU8tNzk5OiAgUmVhZGVySW5wdXRTdHJlYW0ucmVhZCgpIHRocm93cyBhbiBleGNlcHRpb24gaW5zdGVhZCBvZiByZXR1cm5pbmcgLTEgd2hlbiBjYWxsZWQgYWdhaW4gYWZ0ZXIgcmV0dXJuaW5nIC0xLiBUaGFua3MgdG8gSmVyb2VuIHZhbiBkZXIgVmVndCwgR2FyeSBHcmVnb3J5LiAKKiBJTy04MDQ6ICBGaWxlVXRpbHMuZm9yY2VNa2RpclBhcmVudCgpIEphdmFkb2MgaXMgaW5jb3JyZWN0LiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBbU3RlcFNlY3VyaXR5XSBjaTogSGFyZGVuIEdpdEh1YiBBY3Rpb25zICM0NjEuIFRoYW5rcyB0byBzdGVwLXNlY3VyaXR5LWJvdCwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgTWFnaWNOdW1iZXJGaWxlRmlsdGVyLmFjY2VwdChQYXRoLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzKSBkb2Vzbid0IGl0cyBieXRlT2Zmc2V0IGJlZm9yZSByZWFkaW5nLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgSmF2YWRvYyBpbXByb3ZlbWVudHMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBTcGVsbGluZyAjNDY4LiBUaGFua3MgdG8gSm9zaCBTb3JlZiwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgVXNlIGFzc2VydFRocm93cyAjNDc1LiBUaGFua3MgdG8gSmFrdWIgS3VwY3p5ay4gCgpDaGFuZ2VzCi0tLS0tLS0KCiogICAgICAgICAgIEJ1bXAgamltZnMgZnJvbSAxLjIgdG8gMS4zLjAgIzQ2NSAodGVzdHMpLiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgIEJ1bXAgY29tbW9ucy1wYXJlbnQgZnJvbSA1OCB0byA2Mi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAgY29tbW9ucy1sYW5nMyBmcm9tIDMuMTIgdG8gMy4xMy4wLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjY6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBZZXMuClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKSGlzdG9yaWNhbCBsaXN0IG9mIGNoYW5nZXM6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2NoYW5nZXMtcmVwb3J0Lmh0bWwKCkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQ29tbW9ucyBJTywgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLApwYXRjaGVzLCBvciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQsIHNlZSB0aGUgQXBhY2hlIENvbW1vbnMgSU8gd2Vic2l0ZToKCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvLwoKRG93bmxvYWQgcGFnZTogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vZG93bmxvYWRfaW8uY2dpCgpIYXZlIGZ1biEKLUFwYWNoZSBDb21tb25zIFRlYW0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gClZlcnNpb24gMi4xMy4wClJlbGVhc2UgTm90ZXMKCkludHJvZHVjdGlvbgotLS0tLS0tLS0tLS0KCkNvbW1vbnMgSU8gaXMgYSBwYWNrYWdlIG9mIEphdmEgdXRpbGl0eSBjbGFzc2VzIGxpa2UgamF2YS5pby4gIApDbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgY29uc2lkZXJlZCB0byBiZSBzbyBzdGFuZGFyZCBhbmQgb2Ygc3VjaCBoaWdoIApyZXVzZSBhcyB0byBqdXN0aWZ5IGV4aXN0ZW5jZSBpbiBqYXZhLmlvLgoKVGhlIEFwYWNoZSBDb21tb25zIElPIGxpYnJhcnkgY29udGFpbnMgdXRpbGl0eSBjbGFzc2VzLCBzdHJlYW0gaW1wbGVtZW50YXRpb25zLCBmaWxlIGZpbHRlcnMsCmZpbGUgY29tcGFyYXRvcnMsIGVuZGlhbiB0cmFuc2Zvcm1hdGlvbiBjbGFzc2VzLCBhbmQgbXVjaCBtb3JlLgoKSmF2YSA4IHJlcXVpcmVkLgoKTmV3IGZlYXR1cmVzCi0tLS0tLS0tLS0tLQoKKiAgICAgICAgICAgQWRkIENoYXJTZXF1ZW5jZUlucHV0U3RyZWFtLkJ1aWxkZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQ2h1bmtlZE91dHB1dFN0cmVhbS5CdWlsZGVyLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIEFic3RyYWN0U3RyZWFtQnVpbGRlci5zZXRPcGVuT3B0aW9ucyhPcGVuT3B0aW9uLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBzb21lIG1pc3NpbmcgY29udmVyc2lvbnMgdG8gQWJzdHJhY3RPcmlnaW4gc3ViY2xhc3Nlcy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBBYnN0cmFjdE9yaWdpbi5nZXRCeXRlQXJyYXkobG9uZywgaW50KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBhbmQgdXNlIFJhbmRvbUFjY2Vzc0ZpbGVzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIEFic3RyYWN0T3JpZ2luLnNpemUoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBQYXRoVXRpbHMuRU1QVFlfRklMRV9BVFRSSUJVVEVfQVJSQVkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0uQnVpbGRlci5zZXRDaGFyc2V0RW5jb2RlcihDaGFyc2V0RW5jb2RlcikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQ2hhcnNldEVuY29kZXJzLnRvQ2hhcnNldEVuY29kZXIoQ2hhcnNldEVuY29kZXIsIFN1cHBsaWVyPENoYXJzZXRFbmNvZGVyPikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKRml4ZWQgQnVncwotLS0tLS0tLS0tCgoqIElPLTc5MTogIFJlZ3Jlc3Npb24gaW4gRmlsZVV0aWxzLnRvdWNoKCkgLSBubyBsb25nZXIgY3JlYXRlcyBwYXJlbnQgZGlyZWN0b3JpZXMuIFRoYW5rcyB0byBDaGFkIFdpbHNvbiwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQnl0ZUFycmF5T3JpZ2luIHNob3VsZCBiZSBhYmxlIGNvbnZlcnQgYSBieXRlW10gdG8gYSBCeXRlQXJyYXlJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFic3RyYWN0T3JpZ2luU3VwcGxpZXIuY2hlY2tPcmlnaW4oKSBub3cgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpbnN0ZWFkIG9mIE51bGxQb2ludGVyRXhjZXB0aW9uLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy03OTY6ICBGaWxlQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiBpbiBQYXRoVXRpbHMuY3JlYXRlUGFyZW50RGlyZWN0b3JpZXMoUGF0aCwgTGlua09wdGlvbiwgRmlsZUF0dHJpYnV0ZS4uLikuIFRoYW5rcyB0byBHaWFjb21vIEJvY2NhcmRvLCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBPbmx5IHJlYWQgdGhlIHJlbGV2YW50IHBvcnRpb24gb2YgYSBmaWxlIGluIEFic3RyYWN0T3JpZ2luLkZpbGVPcmlnaW4uZ2V0Qnl0ZUFycmF5KGxvbmcsIGludCkgVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIE9ubHkgcmVhZCB0aGUgcmVsZXZhbnQgcG9ydGlvbiBvZiBhIGZpbGUgaW4gQWJzdHJhY3RPcmlnaW4uUGF0aE9yaWdpbi5nZXRCeXRlQXJyYXkobG9uZywgaW50KSBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy03OTg6ICBEZWZlcnJlZEZpbGVPdXRwdXRTdHJlYW0gdGhyb3dzIGV4Y2VwdGlvbiB3aGVuIHN5c3RlbSB0ZW1wIGRpciBpcyBhIHN5bWxpbmsuIFRoYW5rcyB0byBTaGFpIFNoYXBpcmEsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIFJlYWRlcklucHV0U3RyZWFtLkJ1aWxkZXIuc2V0Q2hhcnNldEVuY29kZXIobnVsbCkgc2hvdWxkIHJlc2V0IHRvIGEgZGVmYXVsdCBvYmplY3QsIG5vdCB0aHJvdyBhbiBOUEUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBSZWFkZXJJbnB1dFN0cmVhbS5CdWlsZGVyLnNldENoYXJzZXQobnVsbCkgc2hvdWxkIHJlc2V0IHRvIGEgZGVmYXVsdCBvYmplY3QsIG5vdCB0aHJvdyBhbiBOUEUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKQ2hhbmdlcwotLS0tLS0tCgoqICAgICAgICAgICBCdW1wIGNvbW1vbnMtcGFyZW50IGZyb20gNTcgdG8gNTguIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnksIERlcGVuZGFib3QuIAoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNjoKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IFllcy4KU2VtYW50aWMgY29tcGF0aWJsZTogWWVzLgoKQ29tbW9ucyBJTyAyLjcgYW5kIHVwIHJlcXVpcmVzIEphdmEgOCBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgSmF2YSA3IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMyB0aHJvdWdoIDIuNSByZXF1aXJlcyBKYXZhIDYgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEphdmEgNSBvciBhYm92ZS4KQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUuCgpIaXN0b3JpY2FsIGxpc3Qgb2YgY2hhbmdlczogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vY2hhbmdlcy1yZXBvcnQuaHRtbAoKRm9yIGNvbXBsZXRlIGluZm9ybWF0aW9uIG9uIEFwYWNoZSBDb21tb25zIElPLCBpbmNsdWRpbmcgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBzdWJtaXQgYnVnIHJlcG9ydHMsCnBhdGNoZXMsIG9yIHN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudCwgc2VlIHRoZSBBcGFjaGUgQ29tbW9ucyBJTyB3ZWJzaXRlOgoKaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vCgpEb3dubG9hZCBwYWdlOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9kb3dubG9hZF9pby5jZ2kKCkhhdmUgZnVuIQotQXBhY2hlIENvbW1vbnMgVGVhbQoKQXBhY2hlIENvbW1vbnMgSU8gClZlcnNpb24gMi4xMi4wClJlbGVhc2UgTm90ZXMKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSW50cm9kdWN0aW9uCi0tLS0tLS0tLS0tLQoKQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLiAgCkNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNvIHN0YW5kYXJkIGFuZCBvZiBzdWNoIGhpZ2ggCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsIGZpbGUgZmlsdGVycywKZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpKYXZhIDggcmVxdWlyZWQuCgpOZXcgZmVhdHVyZXMKLS0tLS0tLS0tLS0tCgoqIElPLTc0NjogIERyb3AgdW5uZWNlc3NhcnkgY2FzdHMgYW5kIGNvbnZlcnNpb25zICMyNjcuIFRoYW5rcyB0byBEYXZpZGUgQW5nZWxvY29sYS4gCiogICAgICAgICAgIEFkZCBHaXRIdWIgY292ZXJhZ2UueW1sLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIEJyb2tlblJlYWRlci5JTlNUQU5DRS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBVbmNoZWNrZWRCdWZmZXJlZFJlYWRlci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBVbmNoZWNrZWRGaWx0ZXJSZWFkZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgVW5jaGVja2VkRmlsdGVyV3JpdGVyLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFN0cmluZ0lucHV0U3RyZWFtLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFVuY2hlY2tlZEZpbHRlcklucHV0U3RyZWFtLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFVuY2hlY2tlZEZpbHRlck91dHB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBCcm9rZW5JbnB1dFN0cmVhbS5JTlNUQU5DRS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBDbG9zZWRJbnB1dFN0cmVhbS5JTlNUQU5DRSBhbmQgZGVwcmVjYXRlIENMT1NFRF9JTlBVVF9TVFJFQU0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQ2xvc2VkUmVhZGVyLklOU1RBTkNFIGFuZCBkZXByZWNhdGUgQ0xPU0VEX1JFQURFUi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBCcm9rZW5Xcml0ZXIuSU5TVEFOQ0UuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQ2xvc2VkT3V0cHV0U3RyZWFtLklOU1RBTkNFIGFuZCBkZXByZWNhdGUgQ0xPU0VEX09VVFBVVF9TVFJFQU0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQ2xvc2VkV3JpdGVyLklOU1RBTkNFIGFuZCBkZXByZWNhdGUgQ0xPU0VEX1dSSVRFUi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBOdWxsT3V0cHV0U3RyZWFtLklOU1RBTkNFIGFuZCBkZXByZWNhdGUgTlVMTF9PVVRQVVRfU1RSRUFNLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIE51bGxQcmludFN0cmVhbS5JTlNUQU5DRSBhbmQgZGVwcmVjYXRlIE5VTExfUFJJTlRfU1RSRUFNLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIE51bGxXcml0ZXIuSU5TVEFOQ0UgYW5kIGRlcHJlY2F0ZSBOVUxMX1dSSVRFUi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBOdWxsSW5wdXRTdHJlYW0uSU5TVEFOQ0UuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgTnVsbFJlYWRlci5JTlNUQU5DRS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBQYXRoVXRpbHMucmVhZFN0cmluZyhQYXRoLCBDaGFyc2V0KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBGaWxlVXRpbHMubmV3T3V0cHV0U3RyZWFtKEZpbGUsIGJvb2xlYW4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFBhdGhVdGlscy5uZXdPdXRwdXRTdHJlYW0oUGF0aCwgYm9vbGVhbikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgVW5jaGVja2VkQXBwZW5kYWJsZS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBhbmQgcmV1c2UgVW5jaGVja2VkSU9FeGNlcHRpb25zLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFBhdGhVdGlscy5nZXRUZW1wRGlyZWN0b3J5KCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgRmlsZVN5c3RlbS5nZXROYW1lU2VwYXJhdG9yKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgRmlsZVN5c3RlbS5ub3JtYWxpemVTZXBhcmF0b3JzKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgUGF0aFV0aWxzLmlzTmV3ZXIoUGF0aCwgRmlsZVRpbWUsIExpbmtPcHRpb24uLi4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFBhdGhVdGlscy5pc05ld2VyKFBhdGgsIEluc3RhbnQsIExpbmtPcHRpb24uLi4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIEFnZUZpbGVGaWx0ZXIuQWdlRmlsZUZpbHRlcihJbnN0YW50KS4KICAgICAgICBBZGQgQWdlRmlsZUZpbHRlci5BZ2VGaWxlRmlsdGVyKEluc3RhbnQsIGJvb2xlYW4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIEZpbGVVdGlscy5sYXN0TW9kaWZpZWRGaWxlVGltZShGaWxlKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBGaWxlVGltZXMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgUGF0aFV0aWxzLndhaXRGb3IoUGF0aCwgRHVyYXRpb24sIExpbmtPcHRpb24uLi4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIG9yZy5hcGFjaGUuY29tbW9ucy5pby5pbnB1dC5UYWlsZXIuZ2V0RGVsYXlEdXJhdGlvbigpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIEZpbGVVdGlscy5jdXJyZW50KCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgYW5kIHVzZSBQYXRoVXRpbHMuc2V0TGFzdE1vZGlmaWVkVGltZShQYXRoKSBmb3IgbW9yZSBwcmVjaXNpb24uCiAgICAgICAgQWRkIGFuZCB1c2UgUGF0aFV0aWxzLnNldExhc3RNb2RpZmllZFRpbWUoUGF0aCwgUGF0aCkgZm9yIG1vcmUgcHJlY2lzaW9uLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIGFuZCB1c2UgUGF0aFV0aWxzLmlzTmV3ZXIoUGF0aCwgQ2hyb25vWm9uZWREYXRlVGltZSwgTGlua09wdGlvbi4uLikgZm9yIG1vcmUgcHJlY2lzaW9uLgogICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5pc05ld2VyKFBhdGgsIFBhdGgpIGZvciBtb3JlIHByZWNpc2lvbi4KICAgICAgICBBZGQgYW5kIHVzZSBGaWxlVXRpbHMuaXNOZXdlcihGaWxlLCBGaWxlVGltZSkgZm9yIG1vcmUgcHJlY2lzaW9uLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIGFuZCB1c2UgUGF0aFV0aWxzLmlzT2xkZXIoUGF0aCwgRmlsZVRpbWUsIExpbmtPcHRpb24uLi4pLgogICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5pc09sZGVyKFBhdGgsIEluc3RhbnQsIExpbmtPcHRpb24uLi4pLgogICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5pc09sZGVyKFBhdGgsIGxvbmcsIExpbmtPcHRpb24uLi4pLgogICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5pc09sZGVyKFBhdGgsIFBhdGgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIGFuZCB1c2UgUGF0aFV0aWxzLnNpemVPZihQYXRoKS4KICAgICAgICBBZGQgYW5kIHVzZSBQYXRoVXRpbHMuc2l6ZU9mQXNCaWdJbnRlZ2VyKFBhdGgpLgogICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5zaXplT2ZEaXJlY3RvcnkoUGF0aCkuCiAgICAgICAgQWRkIGFuZCB1c2UgUGF0aFV0aWxzLnNpemVPZkRpcmVjdG9yeUFzQmlnSW50ZWdlcihQYXRoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBhbmQgdXNlIElPQ2FzZS52YWx1ZShJT0Nhc2UsIElPQ2FzZSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgVGFpbGVyLlRhaWxhYmxlIGludGVyZmFjZSB0byBhbGxvdyB0YWlsaW5nIG9mIHJlbW90ZSBmaWxlcyBmb3IgZXhhbXBsZSB1c2luZyBqQ0lGUy4gVGhhbmtzIHRvIEpvbiBGcmVlZG1hbiwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIGFuZCB1c2UgUmFuZG9tQWNjZXNzRmlsZU1vZGUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgUGF0aFV0aWxzLndyaXRlU3RyaW5nKFBhdGgsIENoYXJTZXF1ZW5jZSwgQ2hhcnNldCwgT3Blbk9wdGlvbi4uLikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgUGF0aFV0aUZpbGVzLmdldEZpbGVBdHRyaWJ1dGVWaWV3KCkgc2hvcnRoYW5kczoKICAgICAgICAgIC0gUGF0aFV0aWxzLmdldEFjbEZpbGVBdHRyaWJ1dGVWaWV3KFBhdGgsIExpbmtPcHRpb24uLi4pCiAgICAgICAgICAtIFBhdGhVdGlscy5nZXREb3NGaWxlQXR0cmlidXRlVmlldyhQYXRoLCBMaW5rT3B0aW9uLi4uKQogICAgICAgICAgLSBQYXRoVXRpbHMuZ2V0UG9zaXhGaWxlQXR0cmlidXRlVmlldyhQYXRoLCBMaW5rT3B0aW9uLi4uKSBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy03NDc6ICBNYWtlIGNvbW1vbnMtaW8gYSBKUE1TIG1vZHVsZSBieSBhZGRpbmcgbW9kdWxlLWluZm8uY2xhc3MuIAoqIElPLTc1MzogIEFkZCBJT1V0aWxzIG1ldGhvZCB0byBjb3B5IG91dHB1dCBzdHJlYW0gdG8gaW5wdXQgc3RyZWFtICMyODEuIFRoYW5rcyB0byBTZWJhc3RpYW5EaWV0cmljaCwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFBhdGhVdGlscy5pc1Bvc2l4KFBhdGgsIExpbmtPcHRpb24uLi4pLiAjMjkwIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgUGF0aFV0aWxzLnJlYWRBdHRyaWJ1dGVzKFBhdGgsIENsYXNzLCBMaW5rT3B0aW9uLi4uKS4gIzI5MCBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIElPRXhjZXB0aW9uTGlzdC5jaGVja0VtcHR5KExpc3QsIE9iamVjdCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgSU9CaUNvbnN1bWVyLCBJT1RyaUNvbnN1bWVyLCBJT0NvbXBhcmF0b3IsIElPVW5hcnlPcGVyYXRvciwgSU9CaW5hcnlPcGVyYXRvci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBhbmQgcmV1c2UgSU9Db25zdW1lciBmb3JBbGwoKiksIGZvckVhY2goKiksIGFuZCBmb3JFYWNoSW5kZXhlZCgqKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBDaGFyc2V0RW5jb2RlcnMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQ2hhcnNldERlY29kZXJzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFBhdGhVdGlscy5jcmVhdGVQYXJlbnREaXJlY3RvcmllcyhQYXRoLCBMaW5rT3B0aW9uLCBGaWxlQXR0cmlidXRlLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIFVwZGF0ZSBGaWxlRW50cnkgdG8gdXNlIEZpbGVUaW1lIGluc3RlYWQgb2YgbG9uZyBmb3IgZmlsZSB0aW1lIHN0YW1wcy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjgwOiAgQWRkIG1vcmUgdGVzdHMgZm9yIElPVXRpbHMuY29udGVudEVxdWFsc0lnbm9yZUVPTCAjMTM3LiBUaGFua3MgdG8gWGVub0FtZXNzLCBzZWJiQVNGLCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBSZWR1Y2UgYm9pbGVycGxhdGUgdGhyb3VnaCBuZXcgVW5jaGVja2VkSU8gY2xhc3MgYW5kIGZyaWVuZHMgaW4gb3JnLmFwYWNoZS5jb21tb25zLmlvLmZ1bmN0aW9uLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFBhdGhVdGlscy50b3VjaChQYXRoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBGaWxlU3lzdGVtLmdldElsbGVnYWxGaWxlTmFtZUNvZGVQb2ludHMoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBGaWxlVXRpbHMuaXNGaWxlTmV3ZXIoRmlsZSwgQ2hyb25vTG9jYWxEYXRlLCBPZmZzZXRUaW1lKS4KICAgICAgICBBZGQgRmlsZVV0aWxzLmlzRmlsZU5ld2VyKEZpbGUsIE9mZnNldERhdGVUaW1lKS4KICAgICAgICBBZGQgRmlsZVV0aWxzLmlzRmlsZU9sZGVyKEZpbGUsIENocm9ub0xvY2FsRGF0ZSwgT2Zmc2V0VGltZSkuCiAgICAgICAgQWRkIEZpbGVVdGlscy5pc0ZpbGVPbGRlcihGaWxlLCBPZmZzZXREYXRlVGltZSkuIFRoYW5rcyB0byBJc2lyYSBTZW5ldmlyYXRuZSwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIElPQmlDb25zdW1lci5ub29wKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgSU9VdGlscy5jbG9zZVF1aWV0bHkoSXRlcmFibGU8Q2xvc2VhYmxlPikuCiAgICAgICAgQWRkIElPVXRpbHMuY2xvc2VRdWlldGx5KFN0cmVhbTxDbG9zZWFibGU+KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBDaGFyc2V0cy50b0NoYXJzZXQoQ2hhcnNldCwgQ2hhcnNldCkuCiAgICAgICAgQWRkIENoYXJzZXRzLnRvQ2hhcnNldChTdHJpbmcsIENoYXJzZXQpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFhtbFN0cmVhbVdyaXRlcihPdXRwdXRTdHJlYW0sIENoYXJzZXQpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFBhdGhVdGlscy5nZXRMYXN0TW9kaWZpZWRGaWxlVGltZSgqKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBJT0JpRnVuY3Rpb24sIElPVHJpRnVuY3Rpb24sIElPUXVhZEZ1bmN0aW9uLCBJT1ByZWRpY2F0ZSwgSU9JdGVyYXRvciwgSU9TcGxpdGVyYXRvciwgSU9CYXNlU3RyZWFtLCBJT1N0cmVhbSwgRmlsZXNVbmNoZWNrLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIElPVXRpbHMuY29uc3VtZShSZWFkZXIpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIElPU3VwcGxpZXIuYXNTdXBwbGllcigpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIElPRnVuY3Rpb24uYXNGdW5jdGlvbigpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIElPQ29uc3VtZXIuYXNDb25zdW1lcigpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFRpbWVzdGFtcGVkT2JzZXJ2ZXIuaXNDbG9zZWQoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIElPRXhjZXB0aW9uTGlzdCBpbXBsZW1lbnRzIEl0ZXJhYmxlLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy03ODQ6ICBBZGQgc3VwcG9ydCBmb3IgQXBwZW5kYWJsZSB0byBIZXhEdW1wICM0MTguIFRoYW5rcyB0byBGcmVkcmlrIEtqZWxsYmVyZywgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIGFuZCB1c2UgVGhyZWFkVXRpbHMuIFRoYW5rcyB0byBEYUdlUmUsIEdhcnkgR3JlZ29yeS4gCiogSU8tNzg2OiAgQWRkIFVuc3luY2hyb25pemVkRmlsdGVySW5wdXRTdHJlYW0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTc4NjogIEFkZCBVbnN5bmNocm9uaXplZEJ1ZmZlcmVkSW5wdXRTdHJlYW0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnksIEJlbm9pdCBUZWxsaWVyLiAKKiAgICAgICAgICAgQWRkIEZpbGVTeXN0ZW0uZ2V0QmxvY2tTaXplKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgYnVpbGRlcnMgYW5kIGF2b2lkIGNyZWF0aW5nIG1vcmUgY29uc3RydWN0b3JzIGZvciBhbGwgcGVybXV0YXRpb25zIG9mIGN1cnJlbnQgb3B0aW9ucy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIFJlZmFjdG9yIHVzaW5nIG5ldyBTdXBwbGllciBBUEkgSU9VdGlscy50b1N0cmluZyhJT1N1cHBsaWVyPElucHV0U3RyZWFtPiwgQ2hhcnNldFssIElPU3VwcGxpZXI8U3RyaW5nPl0pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LCBtYXh4ZWRldi4gCiogICAgICAgICAgIFJlZmFjdG9yIHVzaW5nIG5ldyBTdXBwbGllciBBUEkgb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGUuUGF0aFV0aWxzLmNvcHkoSU9TdXBwbGllcjxJbnB1dFN0cmVhbT4sIFBhdGgsIENvcHlPcHRpb24uLi4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LCBtYXh4ZWRldi4gCgpGaXhlZCBCdWdzCi0tLS0tLS0tLS0KCiogSU8tNjk3OiAgSU9VdGlscy50b0J5dGVBcnJheSBzaXplIHZhbGlkYXRpb24gZG9lcyBub3QgbWF0Y2ggZG9jdW1lbnRhdGlvbi4gVGhhbmtzIHRvIG90dGVyNjA2LiAKKiAgICAgICAgICAgRml4IEphdmFkb2MgbGlua3MgdG8gdGhlIEpSRSBKYXZhZG9jIDguIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTc0NDogIEZpbGVXcml0ZXJXaXRoRW5jb2RpbmcgZm9yIGFuIGV4aXN0aW5nIGZpbGUgbm8gbG9uZ2VyIHRydW5jYXRlcyB0aGUgZmlsZS4gIzI1MS4gVGhhbmtzIHRvIFJCUmksIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEEgbnVsbCBDaGFyc2V0IG9yIENoYXJzZXQgbmFtZSBpbiBGaWxlV3JpdGVyV2l0aEVuY29kaW5nIGNvbnN0cnVjdG9ycyB1c2VzIHRoZSBkZWZhdWx0IENoYXJzZXQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggdXNhZ2Ugb2YgYXNzZXJ0Tm90TnVsbCAjMjY5LiBUaGFua3MgdG8gRGF2aWRlIEFuZ2Vsb2NvbGEuIAoqIElPLTcyNzogIEZpbGVuYW1lVXRpbHMgZGlyZWN0b3J5Q29udGFpbnMoKSBzaG91bGQgaGFuZGxlIGZpbGVzIHdpdGggdGhlIHNhbWUgcHJlZml4ICMyMTcuIFRoYW5rcyB0byB0cnVuZ1BhLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTc0ODogIEZpbGVVdGlscy5tb3ZlVG9EaXJlY3RvcnkoKSBleGNlcHRpb24gZG9jdW1lbnRhdGlvbiBhbmQgZXhjZXB0aW9uIG1lc3NhZ2UgZXJyb3IuIFRoYW5rcyB0byBEaXJrIEhlaW5yaWNocywgR2FyeSBHcmVnb3J5LCBFbGFuZ28gUmF2aS4gCiogICAgICAgICAgIFRocmVhZE1vbml0b3Iuc2xlZXAoRHVyYXRpb24pIGlnbm9yZXMgbmFub3NlY29uZHMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggSmF2YWRvYyBpbiBUaHJlYWRNb25pdG9yI3J1bigpIG1ldGhvZC4gIzI3My4gVGhhbmtzIHRvIEFydHVybyBCZXJuYWwuIAoqIElPLTc0OTogIEZpbGVVdGlscy5saXN0RmlsZXMoKSBkb2VzIG5vdCBsaXN0IG1hdGNoaW5nIGZpbGVzIGlmIEZpbGUgcGFyYW1ldGVyIGlzIGEgc3ltYm9saWMgbGluay4gVGhhbmtzIHRvIGhhaWh1aXlhbmcsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCB0eXBvIGluIEphdmFkb2NzIGZvciBGaWxlVXRpbHMjY29udmVydEZpbGVDb2xsZWN0aW9uVG9GaWxlQXJyYXkoKSAjMjc2LiBUaGFua3MgdG8gbmlyYW5qYW5naHVsZSwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQXZvaWQgQ29kZSBEdXBsaWNhdGlvbjogUmV1c2UgU2xlZXAgZnJvbSBUaHJlYWRNb25pdG9yICM2Ni4gVGhhbmtzIHRvIERhR2VSZSwgR2FyeSBHcmVnb3J5LiAKKiBJTy03NTA6ICBGaWxlVXRpbHMuaXRlcmF0ZUZpbGVzIGFsc28gbGlzdHMgZGlyZWN0b3JpZXMuIFRoYW5rcyB0byBTaXRhIEdl325lciwgU2ViYXN0aWFuIFBldGVycywgR2FyeSBHcmVnb3J5LiAKKiBJTy03MjE6ICBXcm9uZyBleGNlcHRpb24gbWVzc2FnZSBpbiBGaWxlVXRpbHMuc2V0TGFzdE1vZGlmaWVkKEZpbGUsIEZpbGUpLiBUaGFua3MgdG8gRGlyayBIZWlucmljaHMsIEdhcnkgR3JlZ29yeS4gCiogSU8tNzE3OiAgSW5maW5pdGUgbG9vcCBpbiBSZWFkZXJJbnB1dFN0cmVhbSBpbnN0ZWFkIG9mIHRocm93aW5nIGV4Y2VwdGlvbiBmb3IgQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JULiBUaGFua3MgdG8gTWFyY29ubzEyMzQsIEdhcnkgR3JlZ29yeS4gCiogSU8tNzE2OiAgUmVhZGVySW5wdXRTdHJlYW0gZW50ZXIgaW5maW5pdGUgbG9vcCBmb3IgdG9vIHNtYWxsIGJ1ZmZlciBzaXplcy4gVGhhbmtzIHRvIE1hcmNvbm8xMjM0LCBHYXJ5IEdyZWdvcnkuIAoqIElPLTYzODogIEluZmluaXRlIGxvb3AgaW4gQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0ucmVhZCBmb3IgNC1ieXRlIGNoYXJhY3RlcnMgd2l0aCBVVEYtOCBhbmQgMy1ieXRlIGJ1ZmZlci4gVGhhbmtzIHRvIFRoYXluZSBNY0NvbWJzLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTYzODogIFBhdGhVdGlscy5zZXRSZWFkT25seShQYXRoLCBib29sZWFuLCBMaW5rT3B0aW9uLi4uKSBzaG91bGQgYWRkIFJFQURfKiBmaWxlIGF0dHJpYnV0ZXMgd2hlbiB1c2luZyBQT1NJWC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjM4OiAgUGF0aFV0aWxzLnNldFJlYWRPbmx5KFBhdGgsIGJvb2xlYW4sIExpbmtPcHRpb24uLi4pIHJlYWRPbmx5IGFyZ3VtZW50IGlzIGFsd2F5cyBhc3N1bWVkIHRydWUgb24gUE9TSVguIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTcyOTogIFByZXZlbnQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ucyBpbiBCcm9rZW5JbnB1dFN0cmVhbS9SZWFkZXIvT3V0cHV0U3RyZWFtL1dyaXRlciAjMjc4LiBUaGFua3MgdG8gUm9iIFNwb29yLCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaWxlVXRpbHMuY29weVVSTFRvRmlsZShVUkwsIEZpbGUsIGludCwgaW50KSBsZWFrcyBpdHMgVVJMQ29ubmVjdGlvbi4KICAgICAgICBDYWxsZWQgYnkgRmlsZVV0aWxzLmNvcHlVUkxUb0ZpbGUoVVJMLCBGaWxlKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNzE0OiAgRml4ZWQgUmVhZGVySW5wdXRTdHJlYW0gbm90IGNhbGxpbmcgQ2hhcnNldEVuY29kZXIuZmx1c2ggaXNzdWUgIzI4My4gVGhhbmtzIHRvIGtldmlud2FuZzE5NzUsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIE1pbm9yIGNoYW5nZXMgIzI4Ny4gVGhhbmtzIHRvIEFydHVybyBCZXJuYWwuIAoqIElPLTc1NjogIFVwZGF0ZSBGaWxlV3JpdGVyV2l0aEVuY29kaW5nIHRvIGV4dGVuZCBQcm94eVdyaXRlciAjMjk2LiBUaGFua3MgdG8gd29kZW5jYWZlLCBHYXJ5IEdyZWdvcnksIEJydW5vIFAuIEtpbm9zaGl0YS4gCiogICAgICAgICAgIEluaXRpYWxpemUgdGhlIG1lc3NhZ2Ugb2YgYW4gSU9FeGNlcHRpb25MaXN0IHRvIGEgZGVmYXVsdCBpZiBudWxsLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy03NTE6ICBXaGVuIGRlbGV0aW5nIHN5bWxpbmtzLCBGaWxlL1BhdGhVdGlscy5kZWxldGVEaXJlY3RvcnkoKSBjaGFuZ2VzIGZpbGUgcGVybWlzc2lvbnMgb2YgdGhlIHRhcmdldC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeSwgUmljaGFyZCBDeWdhbmlhay4gCiogICAgICAgICAgIFJlYWRlcklucHV0U3RyZWFtIG1hcHMgbnVsbCBDaGFyc2V0LCBDaGFyc2V0IG5hbWUsIGFuZCBDaGFyc2V0RW5jb2RlciB0byB0aGUgcGxhdGZvcm0gZGVmYXVsdCBpbnN0ZWFkIG9mIHRocm93aW5nIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBDaGFyU2VxdWVuY2VJbnB1dFN0cmVhbSBtYXBzIG51bGwgQ2hhcnNldCBhbmQgQ2hhcnNldCBuYW1lIHRvIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGluc3RlYWQgb2YgdGhyb3dpbmcgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIFdyaXRlck91dHB1dFN0cmVhbSBtYXBzIG51bGwgQ2hhcnNldCwgQ2hhcnNldCBuYW1lLCBhbmQgQ2hhcnNldEVuY29kZXIgbmFtZSB0byB0aGUgcGxhdGZvcm0gZGVmYXVsdCBpbnN0ZWFkIG9mIHRocm93aW5nIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaWxlVXRpbHMuY29weVVSTFRvRmlsZSBzaG91bGQgY3JlYXRlIHRhcmdldCBwYXJlbnQgZGlyZWN0b3JpZXMgYW5kIG92ZXJ3cml0ZSB0YXJnZXQgZmlsZSAjMzE5LiBUaGFua3MgdG8gQ2hhZCBXaWxzb24sIEdhcnkgR3JlZ29yeS4gCiogSU8tNDg0OiAgRml4IGluY29ycmVjdCBGaWxlbmFtZVV0aWxzIEphdmFkb2MgZm9yIG51bGwgYnl0ZXMgIzMxMC4gVGhhbmtzIHRvIE1hcmNvbm8xMjM0LCBHYXJ5IEdyZWdvcnkuIAoqIElPLTQ4NDogIENoYW5nZSB0byB1cHBlcmNhc2UgdmFyaWFibGUgY29uc3RhbnQuICMzMjMuIFRoYW5rcyB0byBBcnR1cm8gQmVybmFsLiAKKiBJTy00ODQ6ICBJT0Nhc2UuaXNDYXNlU2Vuc2l0aXZlKElPQ2FzZSkgcmVzdWx0IGlzIGJhY2t3YXJkICMzMjUuIFRoYW5rcyB0byBEYXZpZCBIdWFuZywgR2FyeSBHcmVnb3J5LiAKKiBJTy03NTg6ICBEZXByZWNhdGUgUGF0aFV0aWxzLk5PRk9MTE9XX0xJTktfT1BUSU9OX0FSUkFZIGluIGZhdm9yIG9mIG5vRm9sbG93TGlua09wdGlvbkFycmF5KCkuIFRoYW5rcyB0byBNYXJjb25vMTIzNCwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgSW1wcm92ZSBSZWFkZXJJbnB1dFN0cmVhbSBkb2N1bWVudGF0aW9uICMyOTEuIFRoYW5rcyB0byBNYXJjb25vMTIzNCwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IG1pc2xlYWRpbmcgY29tbWVudHMgaW4gRmlsZUZpbHRlclRlc3QgIzMzNC4gVGhhbmtzIHRvIHJpY2hhcmRhMjMuIAoqICAgICAgICAgICBBZGQgbWlzc2luZyBKYXZhZG9jIGZvciBleGNlcHRpb25zIHRocm93biBmb3IgaW52YWxpZCBhcmd1bWVudHMgIzMzOS4gVGhhbmtzIHRvIERpZWdvIE1hcmNpbGlvLiAKKiAgICAgICAgICAgRmlsZUZpbHRlclRlc3QgbWlub3IgZml4ZXMgIzM0MC4gVGhhbmtzIHRvIHJpY2hhcmRhMjMuIAoqIElPLTc2NDogIElPVXRpbHMud3JpdGUoKSB0aHJvd3MgT3V0T2ZNZW1vcnlFcnJvci9OZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiB3aGlsZSB3cml0aW5nIGJpZyBzdHJpbmdzICMzNDMuIFRoYW5rcyB0byBEYUdlUmUsIEdhcnkgR3JlZ29yeS4gCiogSU8tNzY4OiAgQWRkIHJlc2VydmVkIFdpbmRvd3MgZmlsZSBuYW1lcyBDT05JTiQgYW5kIENPTk9VVCQgdG8gRmlsZVN5c3RlbSAjMzU1LiBUaGFua3MgdG8gTWFyY29ubzEyMzQsIE1pY2hhZWwgT3NpcG92LiAKKiBJTy03NzM6ICBSZWdleEZpbGVGaWx0ZXIgaXMgbm8gbG9uZ2VyIFNlcmlhbGl6YWJsZS4gVGhhbmtzIHRvIERvbWluaWsgUmVpbmFyeiwgR2FyeSBHcmVnb3J5LiAKKiBJTy03NjM6ICBbSmF2YWRvY10gRmlsZUZpbHRlclV0aWxzIGRvYyBkb2VzIG5vdCBtYXRjaCBpbXBsOiBtaXNzaW5nIHNvbWUgZmlsZSBmaWx0ZXJzLiBUaGFua3MgdG8gUmljaGFyZCBBZGFtcywgR2FyeSBHcmVnb3J5LiAKKiBJTy03NjI6ICBGaWxlU3lzdGVtLldJTkRPV1MuaXNSZXNlcnZlZEZpbGVOYW1lIGRvZXNuJ3QgY2hlY2sgZm9yIGZpbGUgZXh0ZW5zaW9uLiBUaGFua3MgdG8gTGVvbmlkYXMgQ2hpcm9uLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTc3MjogIENvbmZ1c2luZyBKYXZhZG9jIG9uIElPVXRpbHMjcmVzb3VyY2VUb1VSTCgpIGFuZCBvdGhlciByZXNvdXJjZSogbWV0aG9kcy4gVGhhbmtzIHRvIERhbiBaaWVtYmEsIEdhcnkgR3JlZ29yeS4gCiogSU8tNDQzOiAgRmlsZVV0aWxzLmNvcHlGaWxlIG1ldGhvZHMgdGhyb3cgYW4gdW5uZWNlc3NhcnkgIkZhaWxlZCB0byBjb3B5IGZ1bGwgY29udGVudHMgZnJvbSIgZXhjZXB0aW9uLiBUaGFua3MgdG8gRGFuIFppZW1iYSwgR2FyeSBHcmVnb3J5LiAKKiBJTy01NjQ6ICBQaWNrIHVwIEphdmFkb2MgZnJvbSBzdXBlciBmb3Igb3ZlcnJpZGUgd3JpdGUoKSBtZXRob2RzIGluIEFic3RyYWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFuZCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0uIFRoYW5rcyB0byBIYW8gWmhvbmcsIEJlcm5kIEVja2VuZmVscywgUGFzY2FsIFNjaHVtYWNoZXIsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCBtaW5vciB0eXBvcyAjMzY3LiBUaGFua3MgdG8gTWFyYyBXcm9iZWwuIAoqIElPLTc3NjogIEZpeCBwYXJhbWV0ZXJzIHRvIHJlcXVpcmVOb25OdWxsIGNhbGwgaW4gRGVmZXJyZWRPdXRwdXRTdGVhbSAjMzY4LiBUaGFua3MgdG8gQ2hyaXMgUG92aXJrLiAKKiAgICAgICAgICAgRml4IFBhdGhVdGlscy5jb3B5RmlsZVRvRGlyZWN0b3J5KFVSTCxQYXRoLENvcHlPcHRpb25bXSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTM4NjogIEZpbGVVdGlscy5kb0NvcHlGaWxlIHVzZXMgZGlmZmVyZW50IG1ldGhvZHMgdG8gY2hlY2sgdGhlIGZpbGUgc2l6ZXMuIFRoYW5rcyB0byBTZWJiLCBCZXJuZCBFY2tlbmZlbHMsIHpoaXBlbmd4dSwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IHR5cG9zICMzNzUuIFRoYW5rcyB0byBNaWNoYWVsIEVybnN0LiAKKiBJTy02MTE6ICBGaWxlbmFtZVV0aWxzLm5vcm1hbGl6ZSBqYXZhZG9jIGFuZCB0ZXN0cyAjMzgzLiBUaGFua3MgdG8gRmVkb3IgVXJ2YW5vdi4gCiogSU8tNjExOiAgQmV0dGVyIGRvY3MgaW4gSU9VdGlscyBhbmQgSU9VdGlscy5ieXRlQXJyYXkoaW50IHNpemUpICMzNzQuIFRoYW5rcyB0byBBcmRlbkwtTGl1LCBCcnVubyBQLiBLaW5vc2hpdGEsIEdhcnkgR3JlZ29yeS4gCiogSU8tNzgyOiAgU2VxdWVuY2VSZWFkZXIgc2hvdWxkIGNsb3NlIHJlYWRlcnMgd2hlbiBpdHMgY2xvc2UgbWV0aG9kIGlzIGNhbGxlZCAjMzkxLiBUaGFua3MgdG8gTWF0dGVvIERpIEdpb3ZpbmF6em8sIEdhcnkgR3JlZ29yeS4gCiogSU8tNzkwOiAgRml4IHN5bWJvbGljIGxpbmsgZmlsZSBmaWx0ZXIgIzQ1MC4gVGhhbmtzIHRvIE1pZ3VlbCBNdfFveiwgR2FyeSBHcmVnb3J5LiAKKiBJTy03OTA6ICBBcHBseSBuYW5vc2Vjb25kcyBwcmVjaXNpb24gZm9yIFF1ZXVlSW5wdXRTdHJlYW0gdGltZW91dCBkdXJhdGlvbi4gIzQ1My4gVGhhbmtzIHRvIG1heHhlZGV2LCBHYXJ5IEdyZWdvcnksIEJydW5vIFAuIEtpbm9zaGl0YS4gCiogICAgICAgICAgIEZpeCBvdmVyZmxvdyBmb3IgRmlsZVV0aWxzVGVzdCBjb25zdGFudHMgIzQ1Ni4gVGhhbmtzIHRvIE1hcmNvbm8xMjM0LiAKKiAgICAgICAgICAgU2VyaWFsaXphdGlvbiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMy4wLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRmlsZVN5c3RlbVV0aWxzLnBlcmZvcm1Db21tYW5kKFN0cmluZ1tdLCBpbnQsIER1cmF0aW9uKTogVXNlIExvY2FsZS5nZXREZWZhdWx0KCkgaW5zdGVhZCBvZiBFTkdMSVNILiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy03MjY6ICBBZGQgTWVtb3J5TWFwcGVkRmlsZUlucHV0U3RyZWFtICMyMTUuIFRoYW5rcyB0byBzaG9sbGFuZGVyLCBHYXJ5IEdyZWdvcnkuIAoKQ2hhbmdlcwotLS0tLS0tCgoqICAgICAgICAgICBCdW1wIGFjdGlvbnMvY2FjaGUgZnJvbSAyLjEuNiB0byAzLjAuMTAgIzMwNywgIzMzNywgIzM5My4gVGhhbmtzIHRvIERlcGVuZGFib3QsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAgYWN0aW9ucy9jaGVja291dCBmcm9tIDIuMy40IHRvIDMuMS4wICMyODYsICMyOTgsICMzMzAsICMzOTIuIFRoYW5rcyB0byBEZXBlbmRhYm90LCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIGFjdGlvbnMvc2V0dXAtamF2YSBmcm9tIDIgdG8gMy42LjAgIzM0NiwgIzM5Ny4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoqICAgICAgICAgICBCdW1wIGdpdGh1Yi9jb2RlcWwtYWN0aW9uIGZyb20gMSB0byAyICMzNTMuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiAgICAgICAgICAgQnVtcCBNYXZlbiBKYXZhZG9jIHBsdWdpbiBmcm9tIDMuMi4wIHRvIDMuNC4xLiBUaGFua3MgdG8gRGVwZW5kYWJvdCwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQnVtcCBzcG90YnVncy1tYXZlbi1wbHVnaW4gZnJvbSA0LjIuMyB0byA0LjcuMy4wICMyNTAsICMyNTksICMyNzIsICMyNzQsICMyODUsICMyODgsICMyODksICMzMDUsICMzMTUsICMzMjYsICMzMzgsICMzNjAsICMzNjYsICMzNzAsICMzODAsICMzOTUsICM0MDMuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiAgICAgICAgICAgQnVtcCBzcG90YnVncyBmcm9tIDQuNS4yIHRvIDQuNy4zICMzMTMsICMzMTcsICMzNTcsICMzODIsICMzOTguIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnksIERlcGVuZGFib3QuIAoqICAgICAgICAgICBCdW1wIEpVbml0IGZyb20gNS43LjIgdG8gNS44LjIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIG1hdmVuLWVuZm9yY2VyLXBsdWdpbiBmcm9tIDMuMC4wLU0zIHRvIDMuMy4wICMyNTUsICMzNjMsICM0MzEsICM0NDYuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiAgICAgICAgICAgQnVtcCBjaGVja3N0eWxlIGZyb20gOC40NCB0byA5LjMgIzI1NiwgIzI1NywgIzI2NiwgIzI3OSwgIzI5Mi4gIzMwOC4gVGhhbmtzIHRvIERlcGVuZGFib3QsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAganVuaXQtYm9tIGZyb20gNS44LjAtTTEgdG8gNS45LjEgIzI2MCwgIzI3MSwgIzI3NSwgIzMwOSwgIzM4Ni4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoqICAgICAgICAgICBCdW1wIG1vY2tpdG8taW5saW5lIGZyb20gMy4xMS4yIHRvIDQuMTEuMCAjMjYyLCAjMjY0LCAjMjgyLCAjMzA2LCAjMzE0LCAjMzMxLCAjMzQ4LCAjMzU5LCAjMzgxLCAjMzk5LCAjNDA1LCAjNDE0LCAjNDIwLiBUaGFua3MgdG8gRGVwZW5kYWJvdCwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQnVtcCBqbWgudmVyc2lvbiBmcm9tIDEuMzIgdG8gMS4zNiAjMjU4LCAjMzE2LCAjMzQyLCAjNDA0LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgIEJ1bXAgbW9kaXRlY3QtbWF2ZW4tcGx1Z2luIGZyb20gMS4wLjAuUkMxIHRvIDEuMC4wLkZpbmFsICMyODAsICM0MzksICM0NDUuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiAgICAgICAgICAgQnVtcCBqdW5pdC1waW9uZWVyIGZyb20gMS40LjIgdG8gMS45LjEgIzMwNC4gIzMzNSwgIzM2MiwgIzQwMiwgIzQwNiwgIzQwOS4gVGhhbmtzIHRvIERlcGVuZGFib3QsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAgamFwaWNtcC1tYXZlbi1wbHVnaW4gZnJvbSAwLjE1LjMgdG8gMC4xNi4wLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQnVtcCBjb21tb25zLXBhcmVudCBmcm9tIDUyIHRvIDU3ICMzODgsICM0MTUsICM0MjEsICMxODQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnksIERlcGVuZGFib3QuIAoqICAgICAgICAgICBCdW1wIGphY29jby1tYXZlbi1wbHVnaW4gZnJvbSAwLjguNyB0byAwLjguOC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAgbWF2ZW4tYW50cnVuLXBsdWdpbiBmcm9tIDMuMC4wIHRvIDMuMS4wICMzNTQuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiAgICAgICAgICAgQnVtcCBjb21tb25zLnN1cmVmaXJlLnZlcnNpb24gMy4wLjAtTTUgdG8gMy4wLjAtTTcuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIFBNRCBmcm9tIDYuNDQuMCB0byA2LjUyLjAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIG1hdmVuLXBtZC1wbHVnaW4gZnJvbSAzLjE2LjAgdG8gMy4xOS4wLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQnVtcCBhcGFjaGUtcmF0IGZyb20gMC4xMyB0byAwLjE0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQnVtcCBleGVjLW1hdmVuLXBsdWdpbiBmcm9tIDMuMC4wIHRvIDMuMS4wICMzNjkuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiAgICAgICAgICAgQnVtcCBtYXZlbi1jaGVja3N0eWxlLXBsdWdpbiBmcm9tIDMuMS4yIHRvIDMuMi4wICMzNzYuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiAgICAgICAgICAgQnVtcCBhcGFjaGUtcmF0LXBsdWdpbiBmcm9tIDAuMTQgdG8gMC4xNSAjMzg3LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgIEJ1bXAgZGVmYXVsdCBidWZmZXIgc2l6ZSBmb3IgQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0gdG8gSU9VdGlscyNERUZBVUxUX0JVRkZFUl9TSVpFLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQnVtcCBkZWZhdWx0IGJ1ZmZlciBzaXplIGZvciBDaHVua2VkT3V0cHV0U3RyZWFtIHRvIElPVXRpbHMjREVGQVVMVF9CVUZGRVJfU0laRS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAgZGVmYXVsdCBidWZmZXIgc2l6ZSBmb3IgQ2h1bmtlZFdyaXRlciB0byBJT1V0aWxzI0RFRkFVTFRfQlVGRkVSX1NJWkUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIGRlZmF1bHQgYnVmZmVyIHNpemUgZm9yIFJlYWRlcklucHV0U3RyZWFtIHRvIElPVXRpbHMjREVGQVVMVF9CVUZGRVJfU0laRS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAgZGVmYXVsdCBidWZmZXIgc2l6ZSBmb3IgV3JpdGVyT3V0cHV0U3RyZWFtIHRvIElPVXRpbHMjREVGQVVMVF9CVUZGRVJfU0laRS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpDb21wYXRpYmlsaXR5IHdpdGggMi42OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCkhpc3RvcmljYWwgbGlzdCBvZiBjaGFuZ2VzOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9jaGFuZ2VzLXJlcG9ydC5odG1sCgpGb3IgY29tcGxldGUgaW5mb3JtYXRpb24gb24gQXBhY2hlIENvbW1vbnMgSU8sIGluY2x1ZGluZyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHN1Ym1pdCBidWcgcmVwb3J0cywKcGF0Y2hlcywgb3Igc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50LCBzZWUgdGhlIEFwYWNoZSBDb21tb25zIElPIHdlYnNpdGU6CgpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby8KCkRvd25sb2FkIHBhZ2U6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2Rvd25sb2FkX2lvLmNnaQoKSGF2ZSBmdW4hCi1BcGFjaGUgQ29tbW9ucyBUZWFtCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFwYWNoZSBDb21tb25zIElPIApWZXJzaW9uIDIuMTEuMApSZWxlYXNlIE5vdGVzCgpJbnRyb2R1Y3Rpb24KLS0tLS0tLS0tLS0tCgpDb21tb25zIElPIGlzIGEgcGFja2FnZSBvZiBKYXZhIHV0aWxpdHkgY2xhc3NlcyBsaWtlIGphdmEuaW8uICAKQ2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc28gc3RhbmRhcmQgYW5kIG9mIHN1Y2ggaGlnaCAKcmV1c2UgYXMgdG8ganVzdGlmeSBleGlzdGVuY2UgaW4gamF2YS5pby4KClRoZSBBcGFjaGUgQ29tbW9ucyBJTyBsaWJyYXJ5IGNvbnRhaW5zIHV0aWxpdHkgY2xhc3Nlcywgc3RyZWFtIGltcGxlbWVudGF0aW9ucywgZmlsZSBmaWx0ZXJzLApmaWxlIGNvbXBhcmF0b3JzLCBlbmRpYW4gdHJhbnNmb3JtYXRpb24gY2xhc3NlcywgYW5kIG11Y2ggbW9yZS4KCkphdmEgOCByZXF1aXJlZC4KCkZpeGVkIEJ1Z3MKLS0tLS0tLS0tLQoKKiBJTy03NDE6ICBGaWxlVXRpbHMubGlzdEZpbGVzIGRvZXMgbm90IGxpc3QgbWF0Y2hpbmcgZmlsZXMgaWYgRmlsZSBwYXJhbWV0ZXIgaXMgYSBzeW1ib2xpYyBsaW5rLiBUaGFua3MgdG8gWmFjaCBTaGVybWFuLiAKKiBJTy03MjQ6ICBGaWxlVXRpbHMjZGVsZXRlRGlyZWN0b3J5KEZpbGUpIGV4Y2VwdGlvbiBKYXZhZG9jIGluYWNjdXJhdGUgdXBkYXRlICMyNDUuIFRoYW5rcyB0byBsaXJhbjIwMDAuIAoqICAgICAgICAgIE1pbm9yIGNoYW5nZXMgIzI0My4gVGhhbmtzIHRvIEFydHVybyBCZXJuYWwuIAoqICAgICAgICAgIFJlcGxhY2UgY29uc3RydWN0aW9uIG9mIEZpbGVJbnB1dFN0cmVhbSBhbmQgRmlsZU91dHB1dFN0cmVhbSBvYmplY3RzIHdpdGggRmlsZXMgTklPIEFQSXMuICMyMjEuIFRoYW5rcyB0byBBcnR1cm8gQmVybmFsLiAKKiAgICAgICAgICBGaXggSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpbiBJT0V4Y2VwdGlvbkxpc3QgY29uc3RydWN0b3JzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICBSZW1vdmUgSU9FeGNlcHRpb24gZnJvbSB0aGUgbWV0aG9kIHNpZ25hdHVyZXMgdGhhdCBubyBsb25nZXIgdGhyb3cgSU9FeGNlcHRpb24uCiAgICAgICAgICAgVGhpcyBtYWludGFpbnMgYmluYXJ5IGNvbXBhdGliaWxpdHkgYnV0IG5vdCBzb3VyY2UgY29tcGF0aWJpbGl0eS4KICAgICAgICAgICAtIEZpbGVuYW1lVXRpbHMKICAgICAgICAgICAgICAgZGlyZWN0b3J5Q29udGFpbnMoU3RyaW5nLCBTdHJpbmcpCiAgICAgICAgICAgLSBCb3VuZGVkUmVhZGVyCiAgICAgICAgICAgICAgIEJvdW5kZWRSZWFkZXIoamF2YS5pby5SZWFkZXIsIGludCkKICAgICAgICAgICAtIElPVXRpbHMKICAgICAgICAgICAgICAgbGluZUl0ZXJhdG9yKGphdmEuaW8uSW5wdXRTdHJlYW0sIENoYXJzZXQpCiAgICAgICAgICAgICAgIGxpbmVJdGVyYXRvcihqYXZhLmlvLklucHV0U3RyZWFtLCBTdHJpbmcpCiAgICAgICAgICAgICAgIHRvQnl0ZUFycmF5KFN0cmluZykKICAgICAgICAgICAgICAgdG9JbnB1dFN0cmVhbShDaGFyU2VxdWVuY2UsIFN0cmluZykKICAgICAgICAgICAgICAgdG9JbnB1dFN0cmVhbShTdHJpbmcsIFN0cmluZykKICAgICAgICAgICAgICAgdG9TdHJpbmcoYnl0ZVtdKQogICAgICAgICAgICAgICB0b1N0cmluZyhieXRlW10sIFN0cmluZykgVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpDaGFuZ2VzCi0tLS0tLS0KCiogICAgICAgICAgQWRkIFN5bWJvbGljTGlua0ZpbGVGaWx0ZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgIEFkZCB0ZXN0IHRvIG1ha2Ugc3VyZSB0aGUgc2V0dGVyIG9mIEFuZEZpbGVGaWx0ZXIgd29ya3MgY29ycmVjdGx5ICMyNDQuIFRoYW5rcyB0byB0cm5jYXRlLgoqICAgICAgICAgIEFkZCBYbWxTdHJlYW1SZWFkZXIoUGF0aCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgIEJ1bXAgbW9ja2l0by1pbmxpbmUgZnJvbSAzLjExLjAgdG8gMy4xMS4yICMyNDcuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiAgICAgICAgICBCdW1wIGptaC52ZXJzaW9uIGZyb20gMS4yNyB0byAxLjMyICMyMzcuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiAgICAgICAgICBCdW1wIHNwb3RidWdzIGZyb20gNC4yLjMgdG8gNC4zLjAgIzI0OS4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNjoKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IFllcy4KU2VtYW50aWMgY29tcGF0aWJsZTogWWVzLgoKQ29tbW9ucyBJTyAyLjcgYW5kIHVwIHJlcXVpcmVzIEphdmEgOCBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgSmF2YSA3IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMyB0aHJvdWdoIDIuNSByZXF1aXJlcyBKYXZhIDYgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEphdmEgNSBvciBhYm92ZS4KQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUuCgpIaXN0b3JpY2FsIGxpc3Qgb2YgY2hhbmdlczogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vY2hhbmdlcy1yZXBvcnQuaHRtbAoKRm9yIGNvbXBsZXRlIGluZm9ybWF0aW9uIG9uIEFwYWNoZSBDb21tb25zIElPLCBpbmNsdWRpbmcgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBzdWJtaXQgYnVnIHJlcG9ydHMsCnBhdGNoZXMsIG9yIHN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudCwgc2VlIHRoZSBBcGFjaGUgQ29tbW9ucyBJTyB3ZWJzaXRlOgoKaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vCgpEb3dubG9hZCBwYWdlOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9kb3dubG9hZF9pby5jZ2kKCkhhdmUgZnVuIQotQXBhY2hlIENvbW1vbnMgVGVhbQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyAKVmVyc2lvbiAyLjEwLjAKUmVsZWFzZSBOb3RlcwoKSW50cm9kdWN0aW9uCi0tLS0tLS0tLS0tLQoKQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLiAgCkNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNvIHN0YW5kYXJkIGFuZCBvZiBzdWNoIGhpZ2ggCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsIGZpbGUgZmlsdGVycywKZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpKYXZhIDggcmVxdWlyZWQuCgpOZXcgZmVhdHVyZXMKLS0tLS0tLS0tLS0tCgoqICAgICAgICAgICBBZGQgYW5kIHVzZSBSZWdleEZpbGVGaWx0ZXIudG9TdHJpbmcoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBhbmQgdXNlIFJlZ2V4RmlsZUZpbHRlci5SZWdleEZpbGVGaWx0ZXIoUGF0dGVybiwgRnVuY3Rpb248UGF0aD4sIFN0cmluZz4pIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgYW5kIHVzZSBJT0Nhc2UuaXNDYXNlU2Vuc2l0aXZlKElPQ2FzZSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKRml4ZWQgQnVncwotLS0tLS0tLS0tCgoqIElPLTczMzogIFJlZ2V4RmlsZUZpbHRlciB1c2VzIHRoZSBwYXRoIGFuZCBmaWxlIG5hbWUgaW5zdGVhZCBvZiBqdXN0IHRoZSBmaWxlIG5hbWUuIFRoYW5rcyB0byBKaW0gU2VsbGVycywgR2FyeSBHcmVnb3J5LiAKKiBJTy03MzQ6ICBUaGUgT1NHaSBtYW5pZmVzdCBub3cgY29udGFpbnMgc3VuLiogaW1wb3J0IHBhY2thZ2VzICMyMzkuIFRoYW5rcyB0byBFcmljIE5vcm1hbi4gCiogSU8tNTg1OiAgU2FuaXRpemUgZG91YmxlIHNsYXNoIGFmdGVyIHByZWZpeCAjNzkuIFRoYW5rcyB0byBBZGFtIE1jQ2xlbmFnaGFuLiAKCkNoYW5nZXMKLS0tLS0tLQoKKiAgICAgICAgICAgQnVtcCBhY3Rpb25zL2NhY2hlIGZyb20gMi4xLjUgdG8gMi4xLjYgIzIzOC4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoqICAgICAgICAgICBCdW1wIGp1bml0LXBpb25lZXIgZnJvbSAxLjQuMSB0byAxLjQuMiAjMjQwLiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgIEJ1bXAgY2hlY2tzdHlsZSBmcm9tIDguNDIgdG8gOC40MyAjMjQxLiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgIEJ1bXAgbW9ja2l0by1pbmxpbmUgZnJvbSAzLjEwLjAgdG8gMy4xMS4wICMyNDIuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjY6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBZZXMuClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKSGlzdG9yaWNhbCBsaXN0IG9mIGNoYW5nZXM6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2NoYW5nZXMtcmVwb3J0Lmh0bWwKCkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQ29tbW9ucyBJTywgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLApwYXRjaGVzLCBvciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQsIHNlZSB0aGUgQXBhY2hlIENvbW1vbnMgSU8gd2Vic2l0ZToKCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvLwoKRG93bmxvYWQgcGFnZTogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vZG93bmxvYWRfaW8uY2dpCgpIYXZlIGZ1biEKLUFwYWNoZSBDb21tb25zIFRlYW0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gClZlcnNpb24gMi44LjAKUmVsZWFzZSBOb3RlcwoKSW50cm9kdWN0aW9uCi0tLS0tLS0tLS0tLQoKQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLiAgCkNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNvIHN0YW5kYXJkIGFuZCBvZiBzdWNoIGhpZ2ggCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsIGZpbGUgZmlsdGVycywKZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpKYXZhIDggcmVxdWlyZWQuCgpOZXcgZmVhdHVyZXMKLS0tLS0tLS0tLS0tCgoqIEFkZCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuQ2lyY3VsYXJJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogQWRkIG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlLlBhdGhVdGlscy5jbGVhbkRpcmVjdG9yeShQYXRoLCBGaWxlVmlzaXRPcHRpb24uLi4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBBZGQgb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGUuUGF0aFV0aWxzLmRlbGV0ZURpcmVjdG9yeShQYXRoLCBGaWxlVmlzaXRPcHRpb24uLi4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBBZGQgTnVsbEFwcGVuZGFibGUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIEFkZCBQYXRoVXRpbHMuZ2V0QWNsRW50cnlMaXN0KFBhdGgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBOdWxsLWd1YXJkIElPVXRpbHMuY2xvc2UoQ2xvc2VhYmxlLCBJT0NvbnN1bWVyKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogQWRkIFJldmVyc2VkTGluZXNGaWxlUmVhZGVyLnJlYWRMaW5lcyhpbnQpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBBZGQgUmV2ZXJzZWRMaW5lc0ZpbGVSZWFkZXIudG9TdHJpbmcoaW50KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjg0OiAgQWRkIFBhdGhVdGlscy5kZWxldGUoUGF0aCwgRGVsZXRlT3B0aW9uLi4uKS4KICAgICAgICBBZGQgUGF0aFV0aWxzLmRlbGV0ZURpcmVjdG9yeShQYXRoLCBEZWxldGVPcHRpb24uLi4pLgogICAgICAgIEFkZCBQYXRoVXRpbHMuZGVsZXRlRmlsZShQYXRoLCBEZWxldGVPcHRpb24uLi4pLgogICAgICAgIEFkZCBQYXRoVXRpbHMuc2V0UmVhZE9ubHkoUGF0aCwgYm9vbGVhbiwgTGlua09wdGlvbi4uLikuCiAgICAgICAgQWRkIENsZWFuaW5nUGF0aFZpc2l0b3IuQ2xlYW5pbmdQYXRoVmlzaXRvcihQYXRoQ291bnRlcnMsIERlbGV0ZU9wdGlvbltdLCBTdHJpbmcuLi4pLgogICAgICAgIEFkZCBEZWxldGluZ1BhdGhWaXNpdG9yLkRlbGV0aW5nUGF0aFZpc2l0b3IoUGF0aENvdW50ZXJzLCBEZWxldGVPcHRpb25bXSwgU3RyaW5nLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeSwgUm9iaW4gSmFuc29obi4gCiogQWRkIFJhbmRvbUFjY2Vzc0ZpbGVJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjgxOiAgSU9VdGlscy5jbG9zZShDbG9zZWFibGUpIHNob3VsZCBhbGxvdyBhIGxpc3Qgb2YgY2xvc2VhYmxlcy4gCiogQWRkIElPVXRpbHMuY29uc3VtZShJbnB1dFN0cmVhbSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTY3NjogIEFkZCBpc0ZpbGVOZXdlcigpIGFuZCBpc0ZpbGVPbGRlcigpIG1ldGhvZHMgdGhhdCBzdXBwb3J0IHRoZSBKYXZhIDggRGF0ZS9UaW1lIEFQSS4gIzEyNC4gVGhhbmtzIHRvIElzaXJhIFNlbmV2aXJhdG5lLCBHYXJ5IEdyZWdvcnkuIAoqIEFkZCBhIE1hcmtTaGllbGRJbnB1dFN0cmVhbSAjMTE5LiBUaGFua3MgdG8gQWRhbSBSZXR0ZXIsIEdhcnkgR3JlZ29yeS4gCiogRGVwcmVjYXRlIElPVXRpbHMuTElORV9TRVBBUkFUT1IgaW4gZmF2b3Igb2YgSmF2YSA3J3MgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpGaXhlZCBCdWdzCi0tLS0tLS0tLS0KCiogQ2hhclNlcXVlbmNlUmVhZGVyLnNraXAgc2hvdWxkIHJldHVybiAwIGluc3RlYWQgb2YgRU9GIG9uIHN0cmVhbSBlbmQgIzEyMy4gVGhhbmtzIHRvIFJvYiBTcG9vciwgSm9jaGVuIFdpZWRtYW5uLiAKKiBJbXBsZW1lbnQgQ2hhclNlcXVlbmNlUmVhZGVyLnJlYWR5KCkgIzEyMi4gVGhhbmtzIHRvIFJvYiBTcG9vci4gCiogSU8tNjY5OiAgRml4IGNvZGUgc21lbGxzOyBmaXggdHlwb3MgIzExNS4gVGhhbmtzIHRvIFhlbm9BbWVzcywgR2FyeSBHcmVnb3J5LiAKKiBBZGQgY2FjaGluZyBmb3IgcmVxdWlyZWQgY2hhcnNldHMgIzEyMC4gVGhhbmtzIHRvIEplcm9tZSBXb2xmZiwgR2FyeSBHcmVnb3J5LiAKKiBJTy02NzM6ICBNYWtlIHNvbWUgc2ltcGxpZmljYXRpb25zICMxMjEuIFRoYW5rcyB0byBKZXJvbWUgV29sZmYuIAoqIElPLTY3NDogIEluZmluaXRlQ2lyY3VsYXJJbnB1dFN0cmVhbSBpcyBub3QgaW5maW5pdGUgaWYgaXRzIGlucHV0IGJ1ZmZlciBjb250YWlucyAtMS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjc1OiAgSW5maW5pdGVDaXJjdWxhcklucHV0U3RyZWFtIHRocm93cyBhIGRpdmlkZS1ieS16ZXJvIGV4Y2VwdGlvbiB3aGVuIHJlYWRpbmcgaWYgaXRzIGlucHV0IGJ1ZmZlciBpcyBzaXplIDAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTY3NzogIEZpbGVTeXN0ZW0uZ2V0Q3VycmVudCgpIGRvZXMgbm90IHJldHVybiB0aGUgY29ycmVjdCBlbnVtLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02Nzk6ICBpbnB1dC5BYnN0cmFjdENoYXJhY3RlckZpbHRlclJlYWRlciBwYXNzZXMgY291bnQgb2YgY2hhcnMgcmVhZCAjMTMyLiBUaGFua3MgdG8gcHJvbmVlbC4gCiogSU8tNjgzOiAgQ2lyY3VsYXJCdWZmZXJJbnB1dFN0cmVhbS5yZWFkKCkgZmFpbHMgdG8gY29udmVydCBieXRlIHRvIHVuc2lnbmVkIGludCAKKiBGaXggU3BvdEJ1Z3MgaXNzdWVzIGluIG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTY3MjogIENvcHlpbmcgYSBGaWxlIHNldHMgbGFzdCBtb2RpZmllZCBkYXRlIHRvIDAxIEphbnVhcnkgMTk3MC4gCiogSU8tNjc2OiAgUHJldmVudCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBSZXZlcnNlZExpbmVzRmlsZVJlYWRlciBjb25zdHJ1Y3RvcnMgIzExNy4gVGhhbmtzIHRvIE1pY2hhZWwgRXJuc3QsIEdhcnkgR3JlZ29yeS4gCgpDaGFuZ2VzCi0tLS0tLS0KCiogUmVwbGFjZSBGaW5kQnVncyB3aXRoIFNwb3RCdWdzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBtYXZlbi1jaGVja3N0eWxlLXBsdWdpbiAzLjEuMCAtPiAzLjEuMS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogVXBkYXRlIHRlc3RzIGZyb20gb3JnLmFwYWNoZS5jb21tb25zOmNvbW1vbnMtbGFuZzMgMy4xMCB0byAzLjExLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBVcGRhdGUgY29tbW9ucy1wYXJlbnQgZnJvbSA1MCB0byA1MSAjMTI5LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBVcGRhdGUgYWN0aW9ucy9jaGVja291dCBmcm9tIHYxIHRvIHYyLjMuMSAjMTI2LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBVcGRhdGUganVuaXQtcGlvbmVlciBmcm9tIDAuNi4wIHRvIDAuOC4wLCAjMTI3LCAjMTM1LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBVcGRhdGUgbW9ja2l0by1jb3JlIGZyb20gMy4zLjMgdG8gMy41LjkgIzEyOCwgIzEzMywgIzE0NSwgIzE0OSwgIzE1MS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogVXBkYXRlIHNwb3RidWdzIGZyb20gNC4wLjYgdG8gNC4xLjEgIzEzNC4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoqIFVwZGF0ZSBqdW5pdC1waW9uZWVyIGZyb20gMC44LjAgdG8gMC45LjAgIzEzOC4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoqIFVwZGF0ZSBhY3Rpb25zL2NoZWNrb3V0IGZyb20gdjIuMy4xIHRvIHYyLjMuMiAjMTQwLiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogVXBkYXRlIGFjdGlvbnMvc2V0dXAtamF2YSBmcm9tIHYxLjQuMCB0byB2MS40LjIgIzE0MSwgIzE0OC4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNzoKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IFllcy4KU2VtYW50aWMgY29tcGF0aWJsZTogWWVzLgoKQ29tbW9ucyBJTyAyLjcgYW5kIHVwIHJlcXVpcmVzIEphdmEgOCBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgSmF2YSA3IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMyB0aHJvdWdoIDIuNSByZXF1aXJlcyBKYXZhIDYgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEphdmEgNSBvciBhYm92ZS4KQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUuCgpIaXN0b3JpY2FsIGxpc3Qgb2YgY2hhbmdlczogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vY2hhbmdlcy1yZXBvcnQuaHRtbAoKRm9yIGNvbXBsZXRlIGluZm9ybWF0aW9uIG9uIEFwYWNoZSBDb21tb25zIElPLCBpbmNsdWRpbmcgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBzdWJtaXQgYnVnIHJlcG9ydHMsCnBhdGNoZXMsIG9yIHN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudCwgc2VlIHRoZSBBcGFjaGUgQ29tbW9ucyBJTyB3ZWJzaXRlOgoKaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vCgpEb3dubG9hZCBwYWdlOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9kb3dubG9hZF9pby5jZ2kKCkhhdmUgZnVuIQotQXBhY2hlIENvbW1vbnMgVGVhbQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyAKVmVyc2lvbiAyLjcKUmVsZWFzZSBOb3RlcwoKSW50cm9kdWN0aW9uCi0tLS0tLS0tLS0tLQoKQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLiAgCkNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNvIHN0YW5kYXJkIGFuZCBvZiBzdWNoIGhpZ2ggCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsIGZpbGUgZmlsdGVycywKZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpKYXZhIDggcmVxdWlyZWQuCgpOZXcgZmVhdHVyZXMKLS0tLS0tLS0tLS0tCgoqICAgICAgICAgICBBZGRpbmcgdGhlIENpcmN1bGFyQnVmZmVySW5wdXRTdHJlYW0sIGFuZCB0aGUgUGVla2FibGVJbnB1dFN0cmVhbS4gCiogSU8tNTUzOiAgQWRkIG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlbmFtZVV0aWxzLmlzSWxsZWdhbFdpbmRvd3NGaWxlTmFtZShjaGFyKS4gCiogSU8tNTc3OiAgQWRkIHJlYWRlcnMgdG8gZmlsdGVyIG91dCBnaXZlbiBjaGFyYWN0ZXJzOiBDaGFyYWN0ZXJTZXRGaWx0ZXJSZWFkZXIgYW5kIENoYXJhY3RlckZpbHRlclJlYWRlci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNTk0OiAgQWRkIElPVXRpbHMgY29weSBtZXRob2RzIHdpdGggamF2YS5sYW5nLkFwcGVuZGFibGUgYXMgdGhlIHRhcmdldC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjA1OiAgQWRkIGNsYXNzIENhbkV4ZWN1dGVGaWxlRmlsdGVyLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy01Nzg6ICBTdXBwb3J0IGphdmEubmlvLlBhdGggYW5kIG5vbi1kZWZhdWx0IGZpbGUgc3lzdGVtcyBmb3IgUmV2ZXJzZWRMaW5lc0ZpbGVSZWFkZXIgKCM2MikuIFRoYW5rcyB0byBNYXJrIENoZXNuZXkuIAoqIElPLTYwODogIEFkZCBhIGNvbnZlbmllbmNlIE51bGxQcmludFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjEyOiAgQWRkIGNsYXNzIFRlZVJlYWRlci4gVGhhbmtzIHRvIFJvYiBTcG9vciwgR2FyeSBHcmVnb3J5LiAKKiBJTy02MTM6ICBBZGQgY2xhc3NlcyBDbG9zZWRSZWFkZXIgYW5kIENsb3NlU2hpZWxkUmVhZGVyLiAjODQuIFRoYW5rcyB0byBSb2IgU3Bvb3IsIEdhcnkgR3JlZ29yeS4gCiogSU8tNjE0OiAgQWRkIGNsYXNzZXMgVGFnZ2VkV3JpdGVyLCBDbG9zZWRXcml0ZXIgYW5kIEJyb2tlbldyaXRlci4gIzg2LiBUaGFua3MgdG8gUm9iIFNwb29yLiAKKiBJTy02MTU6ICBBZGQgY2xhc3NlcyBUZWVXcml0ZXIsIEZpbHRlckNvbGxlY3Rpb25Xcml0ZXIsIFByb3h5Q29sbGVjdGlvbldyaXRlciwgSU9FeGNlcHRpb25MaXN0LCBJT0luZGV4ZWRFeGNlcHRpb24uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnksIFJvYiBTcG9vci4gCiogSU8tNjE2OiAgQWRkIGNsYXNzIEFwcGVuZGFibGVXcml0ZXIuICM4Ny4gVGhhbmtzIHRvIFJvYiBTcG9vci4gCiogSU8tNjE3OiAgQWRkIGNsYXNzIENsb3NlU2hpZWxkV3JpdGVyLiAjODMuIFRoYW5rcyB0byBSb2IgU3Bvb3IsIEdhcnkgR3JlZ29yeS4gCiogSU8tNjE4OiAgQWRkIGNsYXNzZXMgQWRkZWQgVGFnZ2VkUmVhZGVyLCBDbG9zZWRSZWFkZXIgYW5kIEJyb2tlblJlYWRlci4gIzg1LiBUaGFua3MgdG8gUm9iIFNwb29yLiAKKiBJTy02MTk6ICBTdXBwb3J0IHN1YiBzZXF1ZW5jZXMgaW4gQ2hhclNlcXVlbmNlUmVhZGVyLiAjOTEuIFRoYW5rcyB0byBSb2IgU3Bvb3IuIAoqIElPLTYzMTogIEFkZCBhIENvdW50aW5nRmlsZVZpc2l0b3IgKGFzIHRoZSBiYXNpcyBmb3IgYSBmb3J0aGNvbWluZyBEZWxldGluZ0ZpbGVWaXNpdG9yKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjMyOiAgQWRkIFBhdGhVdGlscyBmb3Igb3BlcmF0aW9ucyBvbiBOSU8gUGF0aC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjMzOiAgQWRkIERlbGV0aW5nRmlsZVZpc2l0b3IuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTYzNTogIEFkZCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlscy5jbG9zZShDbG9zZWFibGUpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02MzY6ICBBZGQgYW5kIHJldXNlIG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzLmNsb3NlUXVpdGVseShDbG9zZWFibGUsIENvbnN1bWVyPElPRXhjZXB0aW9uPikuCiAgICAgICAgICAgQWRkIGFuZCByZXVzZSBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlscy5jbG9zZShDbG9zZWFibGUsIElPQ29uc3VtZXI8SU9FeGNlcHRpb24+KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjQ1OiAgQWRkIG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlLlBhdGhVdGlscy5maWxlQ29udGVudEVxdWFscyhQYXRoLCBQYXRoLCBPcGVuT3B0aW9uLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNDU4OiAgQWRkIGEgU2VxdWVuY2VSZWFkZXIgc2ltaWxhciB0byBqYXZhLmlvLlNlcXVlbmNlSW5wdXRTdHJlYW0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnksIEpvc2h1YSBHaXRsaW4uIAoqIElPLTY0ODogIEltcGxlbWVudCBkaXJlY3RvcnkgY29udGVudCBlcXVhbGl0eS4gMTAwIy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjQ4OiAgUmVmYWN0b3IgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGludG8gc3luY2hyb25pemVkIGFuZCB1bnN5bmNocm9uaXplZCB2ZXJzaW9ucyAjMTA4LiBUaGFua3MgdG8gQWRhbSBSZXR0ZXIsIEFsZXggSGVyYmVydCwgR2FyeSBHcmVnb3J5LiAKKiBJTy02NjI6ICBSZWZhY3RvciBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gaW50byBzeW5jaHJvbml6ZWQgYW5kIHVuc3luY2hyb25pemVkIHZlcnNpb25zICMxMDguIFRoYW5rcyB0byBBZGFtIFJldHRlciwgR2FyeSBHcmVnb3J5LiAKCkZpeGVkIEJ1Z3MKLS0tLS0tLS0tLQoKKiBJTy01ODk6ICBTb21lIHRlc3RzIGZhaWwgaWYgdGhlIGJhc2UgcGF0aCBjb250YWlucyBhIHNwYWNlLiAKKiBJTy01ODI6ICBNYWtlIG1ldGhvZHMgaW4gT2JzZXJ2YWJsZUlucHV0U3RyZWFtLk9ic2VydmVyIHB1YmxpYy4gVGhhbmtzIHRvIEJydW5vIFBhbG9zLgoqIElPLTUzNTogIFRocmVhZCBidWcgaW4gRmlsZUFsdGVyYXRpb25Nb25pdG9yLnN0b3AoaW50KS4gVGhhbmtzIHRvIFN2ZXRsaW4gWmFyZXYsIEFudGhvbnkgUmF5bW9uZC4gCiogSU8tNTU3OiAgUGVyZm9ybSBsb2NhbGUgaW5kZXBlbmRlbnQgdXBwZXIgY2FzZSBjb252ZXJzaW9ucy4gVGhhbmtzIHRvIGx1Y2Npb21hbi4gCiogSU8tNTcwOiAgTWlzc2luZyBKYXZhZG9jIGluIEZpbGVuYW1lVXRpbHMgY2F1c2luZyBUcmF2aXMtQ0kgYnVpbGQgdG8gZmFpbC4gVGhhbmtzIHRvIFByYW5ldCBWZXJtYS4gCiogSU8tNTcxOiAgUmVtb3ZlIHJlZHVuZGFudCBpc0RpcmVjdG9yeSgpIGNoZWNrIGluIG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHMubGlzdEZpbGVzQW5kRGlycyhGaWxlLCBJT0ZpbGVGaWx0ZXIsIElPRmlsZUZpbHRlcikuIFRoYW5rcyB0byBwcmFuZXQuIAoqIElPLTU1OTogIEZpbGVuYW1lVXRpbHMubm9ybWFsaXplIG5vdyB2ZXJpZmllcyBob3N0bmFtZSBzeW50YXggaW4gVU5DIHBhdGguIAoqIElPLTU1NDogIEZpbGVVdGlscy5jb3B5VG9GaWxlKElucHV0U3RyZWFtIHNvdXJjZSwgRmlsZSBkZXN0aW5hdGlvbikgc2hvdWxkIG5vdCBjbG9zZSBpbnB1dCBzdHJlYW0uIFRoYW5rcyB0byBNaWNoZWxlIE1hcmlvdHRpLiAKKiBJTy02MDQ6ICBGaWxlVXRpbHMuZG9Db3B5RmlsZShGaWxlLCBGaWxlLCBib29sZWFuKSBjYW4gdGhyb3cgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTYyNTogIENvcnJlY3RlZCBtaXNsZWFkaW5nIGV4Y2VwdGlvbiBtZXNzYWdlIGZvciBGaWxlVXRpbHMuY29weURpcmVjdG9yeVRvRGlyZWN0b3J5LiBUaGFua3MgdG8gTWlra28gTWF1bnUuIAoqIElPLTYyNjogIEEgbWlzdGFrZSBpbiB0aGUgRmlsZW5hbWVVdGlscy5jb25jYXQoKSdzIEphdmFkb2MgYWJvdXQgYW4gYWJzb2x1dGUgcGF0aC4gVGhhbmtzIHRvIFl1amkgS29uaXNoaS4gCiogSU8tNjQwOiAgTlBFIGluIG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzLmNvbnRlbnRFcXVhbHMoSW5wdXRTdHJlYW0sIElucHV0U3RyZWFtKSB3aGVuIG9ubHkgb25lIGlucHV0IGlzIG51bGwuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTY0MTogIE5QRSBpbiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlscy5jb250ZW50RXF1YWxzKFJlYWRlciwgUmVhZGVyKSB3aGVuIG9ubHkgb25lIGlucHV0IGlzIG51bGwuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTY0MzogIE5QRSBpbiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlscy5jb250ZW50RXF1YWxzSWdub3JlRU9MKFJlYWRlciwgUmVhZGVyKSB3aGVuIG9ubHkgb25lIGlucHV0IGlzIG51bGwuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTY0NDogIE5QRSBpbiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzLmNvbnRlbnRFcXVhbHNJZ25vcmVFT0woRmlsZSwgRmlsZSkgd2hlbiBvbmx5IG9uZSBpbnB1dCBpcyBudWxsLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02NjQ6ICBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzLmNvcHlVUkxUb0ZpbGUoKikgb3BlbiBidXQgZG8gbm90IGNsb3NlIHN0cmVhbXMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKQ2hhbmdlcwotLS0tLS0tCgoqIElPLTU3MjogIFJlZmFjdG9yIGR1cGxpY2F0ZSBjb2RlIGluIG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHMuIFRoYW5rcyB0byBQcmFuZXQgVmVybWEuIAoqIElPLTU4MDogIFVwZGF0ZSBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZW5hbWVVdGlscy5pc0V4dGVuc2lvbihTdHJpbmcsIFN0cmluZ1tdKSB0byB1c2UgdmFyIGFyZ3MuIAoqIElPLTcwMTogIE1ha2UgYXJyYXkgZGVjbGFyYXRpb24gaW4gVGhyZXNob2xkaW5nT3V0cHV0U3RyZWFtIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBhcnJheSBkZWNsYXJhdGlvbnMgaW4gdGhlIGxpYnJhcnkgIzc3LiBUaGFua3MgdG8gUmF5bW9uZCBUYW4uIAoqIElPLTYwNzogIFVwZGF0ZSBmcm9tIEphdmEgNyB0byBKYXZhIDguIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTYxMDogIFJlbW92ZSB0aHJvd3MgSU9FeGNlcHRpb24gaW4gbWV0aG9kIGlzU3ltbGluaygpICM4MC4gVGhhbmtzIHRvIFNlYmFzdGlhbi4gCiogSU8tNjI4OiAgTWlncmF0aW9uIHRvIEpVbml0IEp1cGl0ZXIgIzk3LiBUaGFua3MgdG8gQWxsb24gTXVyZWluaWsuIAoqIElPLTYzMDogIERlcHJlY2F0ZSBvcmcuYXBhY2hlLmNvbW1vbnMuaW8ub3V0cHV0Lk51bGxPdXRwdXRTdHJlYW0uTnVsbE91dHB1dFN0cmVhbSgpIGluIGZhdm9yIG9mIG9yZy5hcGFjaGUuY29tbW9ucy5pby5vdXRwdXQuTnVsbE91dHB1dFN0cmVhbS5OVUxMX09VVFBVVF9TVFJFQU0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTYyOTogIEZpbGVVdGlscyNmb3JjZURlbGV0ZSBzaG91bGQgdXNlIEZpbGVzI2RlbGV0ZSByYXRoZXIgdGhhbiBGaWxlI2RlbGV0ZSBzbyBleGNlcHRpb24gbWVzc2FnZXMgaW5jbHVkZXMgcmVhc29uIGZvciBmYWlsdXJlLiBUaGFua3MgdG8gSWFuIFNwcmluZ2VyLCBJYW4gU3ByaW5nZXIsIEdhcnkgR3JlZ29yeS4gCiogSU8tNjM0OiAgTWFrZSBnZXRDYXVzZSBzeW5jaHJvbml6ZWQgYW5kIHVzZSBhIERlcXVlIGluc3RlYWQgb2YgYSBTdGFjayAjNjQuIFRoYW5rcyB0byBW4WNsYXYgSGFpc21hbiwgQnJ1bm8gUC4gS2lub3NoaXRhLCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICAgVXBkYXRlIHRlc3RzIGZyb20gQXBhY2hlIENvbW1vbnMgTGFuZyAzLjkgdG8gMy4xMC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgICBVcGRhdGUgdGVzdHMgb3JnLmp1bml0LXBpb25lZXI6anVuaXQtcGlvbmVlciAwLjMuMCAtPiAwLjYuMC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgICBVcGRhdGUgdGVzdHMgb3JnLmp1bml0Lmp1cGl0ZXI6anVuaXQtanVwaXRlciA1LjUuMiAtPiA1LjYuMi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgICBVcGRhdGUgdGVzdHMgb3JnLm1vY2tpdG86bW9ja2l0by1jb3JlIDMuMC4wIC0+IDMuMy4zLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02NjY6ICBOb3JtYWxpemUgaW50ZXJuYWwgYnVmZmVycyB0byA4MTkyIGJ5dGVzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02NjU6ICBFbnN1cmUgdGhhdCBwYXNzaW5nIGEgbnVsbCBJbnB1dFN0cmVhbSByZXN1bHRzIGluIE5QRSB3aXRoIHRlc3RzICMxMTIuIFRoYW5rcyB0byBPdHRvIEZvd2xlciwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgIGNvbW1vbnMuamFjb2NvLnZlcnNpb24gMC44LjQgLT4gMC44LjUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICAgY29tLmdpdGh1Yi5zaW9tNzkuamFwaWNtcDpqYXBpY21wLW1hdmVuLXBsdWdpbiAwLjE0LjEgLT4gMC4xNC4zLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02Njc6ICBBZGQgZnVuY3Rpb25hbCBpbnRlcmZhY2VzIElPRnVuY3Rpb24gYW5kIElPU3VwcGxpZXIgIzExMC4gVGhhbmtzIHRvIEFkYW0gUmV0dGVyLCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICAgU3VwcG9ydCBzdWIgc2VxdWVuY2VzIGluIENoYXJTZXF1ZW5jZVJlYWRlciAjOTEuIFRoYW5rcyB0byBSb2IgU3Bvb3IsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgICBSZW1vdmUgZGVwcmVjYXRlZCBzdWRvIHNldHRpbmcuICMxMTMuIFRoYW5rcyB0byBkZW5nbGltaW5nLiAKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjY6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBZZXMuClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKSGlzdG9yaWNhbCBsaXN0IG9mIGNoYW5nZXM6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2NoYW5nZXMtcmVwb3J0Lmh0bWwKCkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQ29tbW9ucyBJTywgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLApwYXRjaGVzLCBvciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQsIHNlZSB0aGUgQXBhY2hlIENvbW1vbnMgSU8gd2Vic2l0ZToKCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvLwoKRG93bmxvYWQgcGFnZTogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vZG93bmxvYWRfaW8uY2dpCgpIYXZlIGZ1biEKLUFwYWNoZSBDb21tb25zIFRlYW0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAyLjYKCkludHJvZHVjdGlvbgotLS0tLS0tLS0tLS0KCkFwYWNoZSBDb21tb25zIElPIGlzIGEgcGFja2FnZSBvZiBKYXZhIHV0aWxpdHkgY2xhc3NlcyBsaWtlIGphdmEuaW8uCkNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNvIHN0YW5kYXJkIGFuZCBvZiBzdWNoIGhpZ2gKcmV1c2UgYXMgdG8ganVzdGlmeSBleGlzdGVuY2UgaW4gamF2YS5pby4KClRoZSBBcGFjaGUgQ29tbW9ucyBJTyBsaWJyYXJ5IGNvbnRhaW5zIHV0aWxpdHkgY2xhc3Nlcywgc3RyZWFtIGltcGxlbWVudGF0aW9ucywKZmlsZSBmaWx0ZXJzLCBmaWxlIGNvbXBhcmF0b3JzLCBlbmRpYW4gdHJhbnNmb3JtYXRpb24gY2xhc3NlcywgYW5kIG11Y2ggbW9yZS4KCkFwYWNoZSBDb21tb25zIElPIDIuNiByZXF1aXJlcyBhdCBsZWFzdCBKYXZhIDcgdG8gYnVpbGQgYW5kIHJ1bi4KCkRFUFJFQ0FUSU9OUwo9PT09PT09PT09PT0KCkFsbCBjbG9zZVF1aWV0bHkgb3ZlcmxvYWRzIGluIG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzIGhhdmUgYmVlbgpkZXByZWNhdGVkLiBVc2UgdGhlIHRyeS13aXRoLXJlc291cmNlcyBzdGF0ZW1lbnQgb3IgaGFuZGxlIHN1cHByZXNzZWQKZXhjZXB0aW9ucyBtYW51YWxseS4KClRoZSBjbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVN5c3RlbVV0aWxzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuClVzZSBlcXVpdmFsZW50IG1ldGhvZHMgaW4gamF2YS5uaW8uZmlsZS5GaWxlU3RvcmUgaW5zdGVhZCwgZS5nLgpGaWxlcy5nZXRGaWxlU3RvcmUoUGF0aHMuZ2V0KCIvaG9tZSIpKS5nZXRVc2FibGVTcGFjZSgpIG9yIGl0ZXJhdGUgb3ZlcgpGaWxlU3lzdGVtcy5nZXREZWZhdWx0KCkuZ2V0RmlsZVN0b3JlcygpLgoKQ09NUEFUSUJJTElUWSBXSVRIIEpBVkEgOQo9PT09PT09PT09PT09PT09PT0KClRoZSBNQU5JRkVTVC5NRiBub3cgY29udGFpbnMgYW4gYWRkaXRpb25hbCBlbnRyeToKCiAgQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8KClRoaXMgc2hvdWxkIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIENvbW1vbnMgSU8gMi42IGFzIGEgbW9kdWxlIGluIHRoZSBKYXZhIDkKbW9kdWxlIHN5c3RlbS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBjb3JyZXNwb25kaW5nIGlzc3VlOgoKICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSU8tNTUxCgpCdWlsZGluZyBDb21tb25zIElPIDIuNiBzaG91bGQgd29yayBvdXQgb2YgdGhlIGJveCB3aXRoIHRoZSBsYXRlc3QgSmF2YSA5CnJlbGVhc2UuIFBsZWFzZSByZXBvcnQgYW55IEphdmEgOSByZWxhdGVkIGlzc3VlcyBhdDoKCiAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPCgpORVcgRkVBVFVSRVMKPT09PT09PT09PT09CgoqIElPLTU1MTogQWRkIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZSBNQU5JRkVTVCBlbnRyeSBmb3IgSmF2YSA5IGNvbXBhdGliaWxpdHkuCiogSU8tMzY3OiBBZGQgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY29weVRvRGlyZWN0b3J5LiBUaGFua3MgdG8gSmFtZXMgU2F3bGUuCiogSU8tNDkzOiBBZGQgaW5maW5pdGUgY2lyY3VsYXIgaW5wdXQgc3RyZWFtLiBUaGFua3MgdG8gUGlvdHIgVHVyc2tpLgoqIElPLTUwNzogQWRkIGEgQnl0ZU9yZGVyVXRpbHMgY2xhc3MuCiogSU8tNTE4OiBBZGQgT2JzZXJ2YWJsZUlucHV0U3RyZWFtLgoqIElPLTUxOTogQWRkIE1lc3NhZ2VEaWdlc3RDYWxjdWxhdGluZ0lucHV0U3RyZWFtLgoqIElPLTUxMzogQWRkIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIHJlYWRpbmcgY2xhc3MgcGF0aCByZXNvdXJjZXMuCiAgICAgICAgICBUaGFua3MgdG8gQmVocmFuZyBTYWVlZHphZGVoLgoKRklYRUQgQlVHUwo9PT09PT09PT09CgoqIElPLTU0NjogQ2xvc2VkT3V0cHV0U3RyZWFtI2ZsdXNoIHNob3VsZCB0aHJvdy4gVGhhbmtzIHRvIFRvbWFzIENlbGF5YS4KKiBJTy01NTA6IERvY3VtZW50YXRpb24gaXNzdWUsIGZpeCA0MDQgSmF2YWRvYyBpc3N1ZXMgaW4gdGhlIGRlc2NyaXB0aW9uIHBhZ2UuCiAgICAgICAgICBUaGFua3MgdG8gSmltaSBBZHJpYW4uCiogSU8tNDQyOiBKYXZhZG9jIGNvbnRyYWRpY3RvcnkgZm9yIEZpbGVGaWx0ZXJVdGlscy5hZ2VGaWxlRmlsdGVyKGN1dG9mZikgYW5kCiAgICAgICAgICB0aGUgZmlsdGVyIGl0IGNvbnN0cnVjdHM6IEFnZUZpbGVGaWx0ZXIoY3V0b2ZmKS4KICAgICAgICAgIFRoYW5rcyB0byBTaW1vbiBSb2JpbnNvbi4KKiBJTy01MzQ6IEZpbGVVdGlsVGVzdENhc2UudGVzdEZvcmNlRGVsZXRlRGlyKCkgc2hvdWxkIG5vdCBkZWxldGUgdGVzdERpcmVjdG9yeQogICAgICAgICAgcGFyZW50LgoqIElPLTUyODogRml4IFRhaWxlci5ydW4gcmFjZSBjb25kaXRpb24gcnVuYXdheSBsb2dnaW5nLiBUaGFua3MgdG8gRGF2ZSBNb3Rlbi4KKiBJTy00ODM6IGdldFByZWZpeExlbmd0aCByZXR1cm4gLTEgaWYgVW5peCBmaWxlIGNvbnRhaW5zIGNvbG9uLgogICAgICAgICAgVGhhbmtzIHRvIE1hcmtvIFZhc2ljLgoqIElPLTUyMDogRmlsZVV0aWxzVGVzdENhc2UjdGVzdENvbnRlbnRFcXVhbHNJZ25vcmVFT0wgZmFpbHMgb24gV2luZG93cy4KKiBJTy01MTY6IC5naXRhdHRyaWJ1dGVzIG5vdCBjb3JyZWN0bHkgYXBwbGllZC4gVGhhbmtzIHRvIEphc29uIFB5ZXJvbi4KKiBJTy01MTU6IEFsbG93IFNwZWNpZnlpbmcgSW5pdGlhbCBCdWZmZXIgU2l6ZSBvZiBEZWZlcnJlZEZpbGVPdXRwdXRTdHJlYW0uCiAgICAgICAgICBUaGFua3MgdG8gQnJldHQgTG91bnNidXJ5LCBHYXJ5IEdyZWdvcnkuCiogSU8tNTEyOiBUaHJlc2hvbGRpbmdPdXRwdXRTdHJlYW0udGhyZXNob2xkUmVhY2hlZCgpIHJlc3VsdHMgaW4KICAgICAgICAgIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbi4gVGhhbmtzIHRvIFJhbGYgSGF1c2VyLgoqIElPLTUxMTogQWZ0ZXIgYSBmZXcgdW5pdCB0ZXN0cywgYSBmZXcgbmV3bHkgY3JlYXRlZCBkaXJlY3RvcmllcyBub3QgY2xlYW5lZAogICAgICAgICAgY29tcGxldGVseS4gVGhhbmtzIHRvIEFobWV0IENlbGlrLgoqIElPLTUwMjogRXhjZXB0aW9ucyBhcmUgc3VwcHJlc3NlZCBpbmNvcnJlY3RseSB3aGVuIGNvcHlpbmcgZmlsZXMuCiAgICAgICAgICBUaGFua3MgdG8gQ2hyaXN0aWFuIFNjaHVsdGUuCiogSU8tNTAzOiBVcGRhdGUgcGxhdGZvcm0gcmVxdWlyZW1lbnQgdG8gSmF2YSA3LgoqIElPLTUzNzogQk9NSW5wdXRTdHJlYW0gc2hvdWxkbid0IHNvcnQgYXJyYXkgb2YgQk9NcyBpbi1wbGFjZS4KICAgICAgICAgIFRoYW5rcyB0byBCb3J5cyBaaWJyb3YuCgpDSEFOR0VTCj09PT09PT0KCiogSU8tNTUzOiBNYWtlIGNvZGUgc3R5bGUgb2YgaGFzQk9NKCkgY29uc2lzdGVudCB3aXRoIGdldEJPTUNoYXJzZXROYW1lKCkuCiAgICAgICAgICBUaGFua3MgdG8gTWljaGFlbCBFcm5zdC4KKiBJTy01NDI6IEZpbGVVdGlscyNyZWFkRmlsZVRvQnl0ZUFycmF5OiBvcHRpbWl6ZSByZWFkaW5nIG9mIGZpbGVzIHdpdGgga25vd24KICAgICAgICAgIHNpemUuIFRoYW5rcyB0byBJbG1hcnMgUG9pa2Fucy4KKiBJTy01NDc6IFRocm93IGEgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluc3RlYWQgb2YgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4KICAgICAgICAgIEZpbGVTeXN0ZW1VdGlscy5mcmVlU3BhY2VXaW5kb3dzKCkuIFRoYW5rcyB0byBOaWtoaWwgU2hpbmRlLAogICAgICAgICAgTWljaGFlbCBFcm5zdCwgR2FyeSBHcmVvcnkuCiogSU8tNTA2OiBEZXByZWNhdGUgbWV0aG9kcyBGaWxlU3lzdGVtVXRpbHMuZnJlZVNwYWNlS2IoKS4KICAgICAgICAgIFRoYW5rcyB0byBDaHJpc3RpYW4gU2NodWx0ZS4KKiBJTy01MDU6IE1ha2UgTGluZUl0ZXJhdG9yIGltcGxlbWVudCBDbG9zZWFibGUgdG8gc3VwcG9ydCB0cnktd2l0aC1yZXNvdXJjZXMKICAgICAgICAgIHN0YXRlbWVudHMuIFRoYW5rcyB0byBDaHJpc3RpYW4gU2NodWx0ZS4KKiBJTy01MDQ6IERlcHJlY2F0ZWQgb2YgYWxsIElPVXRpbHMuY2xvc2VRdWlldGx5KCkgbWV0aG9kcyBhbmQgdXNlCiAgICAgICAgICB0cnktd2l0aC1yZXNvdXJjZXMgaW50ZXJuYWxseS4gVGhhbmtzIHRvIENocmlzdGlhbiBTY2h1bHRlLgoKUkVNT1ZFRAo9PT09PT09CgoqIElPLTUxNDogUmVtb3ZlIG9yZy5hcGFjaGUuY29tbW9ucy5pby5KYXZhN1N1cHBvcnQuCgpDT01QQVRJQklMSVRZIFdJVEggT0xERVIgVkVSU0lPTlMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb21wYXRpYmlsaXR5IHdpdGggMi41OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21wYXRpYmlsaXR5IHdpdGggMi42IGFuZCAxLjQ6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBObywgc2VlIHRoZSByYXJlIGNhc2UgaW4KICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPLTMxOC4KU2VtYW50aWMgY29tcGF0aWJsZTogTm8sIHNlZSB0aGUgcmFyZSBjYXNlIGluCiAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAyLjUKCk5ldyBmZWF0dXJlcyBhbmQgYnVnIGZpeGVzLgoKTmV3IGZlYXR1cmVzCi0tLS0tLS0tLS0tLQoKKiBJTy00ODc6ICBBZGQgVmFsaWRhdGluZ09iamVjdElucHV0U3RyZWFtIGZvciBjb250cm9sbGVkIGRlc2VyaWFsaXphdGlvbiAKKiBJTy00NzE6ICBTdXBwb3J0IGZvciBhZGRpdGlvbmFsIGVuY29kaW5ncyBpbiBSZXZlcnNlZExpbmVzRmlsZVJlYWRlciBUaGFua3MgdG8gTGVhbmRybyBSZWlzLiAKKiBJTy00MjU6ICBTZXR0ZXIgbWV0aG9kIGZvciB0aHJlc2hvbGQgb24gVGhyZXNob2xkaW5nT3V0cHV0U3RyZWFtIFRoYW5rcyB0byBDcmFpZyBTd2Fuay4gCiogSU8tNDA2OiAgSW50cm9kdWNlIG5ldyBjbGFzcyBBcHBlbmRhYmxlT3V0cHV0U3RyZWFtIFRoYW5rcyB0byBOaWFsbCBQZW1iZXJ0b24uIAoqIElPLTQ1OTogIEFkZCBXaW5kb3dzTGluZUVuZGluZ0lucHV0U3RyZWFtIGFuZCBVbml4TGluZUVuZGluZ0lucHV0U3RyZWFtLiBUaGFua3MgdG8gS3Jpc3RpYW4gUm9zZW52b2xkLiAKKiBJTy00NTc6ICBBZGQgYSBCb3VuZGVkUmVhZGVyLCBhIHdyYXBwZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25zdHJhaW4gYWNjZXNzCiAgICAgICAgdG8gYW4gdW5kZXJseWluZyBzdHJlYW0gd2hlbiB1c2VkIHdpdGggbWFyay9yZXNldCAtCiAgICAgICAgdG8gYXZvaWQgb3ZlcmZsb3dpbmcgdGhlIG1hcmsgbGltaXQgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyLiBUaGFua3MgdG8gS3Jpc3RpYW4gUm9zZW52b2xkLiAKKiBJTy00MjY6ICBBZGQgQVBJIElPVXRpbHMuY2xvc2VRdWlldGx5KENsb3NlYWJsZS4uLikgCiogSU8tNDEwOiAgUmVhZGZ1bGx5KCkgVGhhdCBSZXR1cm5zIEEgQnl0ZSBBcnJheSBUaGFua3MgdG8gQmVsdWdhIEJlaHIuIAoqIElPLTM5NTogIE92ZXJsb2FkIElPVXRpbHMgYnVmZmVyIG1ldGhvZHMgdG8gYWNjZXB0IGJ1ZmZlciBzaXplIFRoYW5rcyB0byBCZWx1Z2EgQmVoci4gCiogSU8tMzgyOiAgQ2h1bmtlZCBJTyBmb3IgbGFyZ2UgYXJyYXlzLgogICAgICAgICBBZGRlZCB3cml0ZUNodW5rZWQoYnl0ZVtdLCBPdXRwdXRTdHJlYW0pIGFuZCB3cml0ZUNodW5rZWQoY2hhcltdIFdyaXRlcikKICAgICAgICAgQWRkZWQgQ2h1bmtlZE91dHB1dFN0cmVhbSwgQ2h1bmtlZFdyaXRlciAKKiBJTy0yMzM6ICBBZGQgTWV0aG9kcyBmb3IgQnVmZmVyaW5nIFN0cmVhbXMvV3JpdGVycyBUbyBJT1V0aWxzCiAgICAgICAgIEFkZGVkIG92ZXJsb2FkZWQgYnVmZmVyKCkgbWV0aG9kcyAtIHNlZSBhbHNvIElPLTMzMCAKKiBJTy0zMzA6ICBJT1V0aWxzI3RvQnVmZmVyZWRPdXRwdXRTdHJlYW0vdG9CdWZmZXJlZFdyaXRlciB0byBjb25kaXRpb25hbGx5IHdyYXAgdGhlIG91dHB1dAogICAgICAgICBBZGRlZCBvdmVybG9hZGVkIGJ1ZmZlcigpIG1ldGhvZHMgLSBzZWUgYWxzbyBJTy0yMzMgCiogSU8tMzgxOiAgQWRkIEZpbGVVdGlscy5jb3B5SW5wdXRTdHJlYW1Ub0ZpbGUgQVBJIHdpdGggb3B0aW9uIHRvIGxlYXZlIHRoZSBzb3VyY2Ugb3Blbi4KICAgICAgICBTZWUgY29weUlucHV0U3RyZWFtVG9GaWxlKGZpbmFsIElucHV0U3RyZWFtIHNvdXJjZSwgZmluYWwgRmlsZSBkZXN0aW5hdGlvbiwgYm9vbGVhbiBjbG9zZVNvdXJjZSkgCiogSU8tMzc5OiAgQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0gLSBhZGQgdGVzdHMgZm9yIGF2YWlsYWJsZSgpCiAgICAgICAgIEZpeCBjb2RlIHNvIGl0IHJlYWxseSBkb2VzIHJlZmxlY3QgYSBtaW5pbXVtIGF2YWlsYWJsZS4gCiogSU8tMzQ2OiAgQWRkIEJ5dGVBcnJheU91dHB1dFN0cmVhbS50b0lucHV0U3RyZWFtKCkgCiogSU8tMzQxOiAgQSBjb25zdGFudCBmb3IgaG9sZGluZyB0aGUgQk9NIGNoYXJhY3RlciAoVStGRUZGKSAKKiBJTy0zNjE6ICBBZGQgQVBJIEZpbGVVdGlscy5mb3JjZU1rZGlyc1BhcmVudCgpLiAKKiBJTy0zNjA6ICBBZGQgQVBJIENoYXJzZXRzLnJlcXVpcmVkQ2hhcnNldHMoKS4gCiogSU8tMzU5OiAgQWRkIElPVXRpbHMuc2tpcCBhbmQgc2tpcEZ1bGx5KFJlYWRhYmxlQnl0ZUNoYW5uZWwsIGxvbmcpLiBUaGFua3MgdG8geXVrb2JhLiAKKiBJTy0zNTg6ICBBZGQgSU9VdGlscy5yZWFkIGFuZCByZWFkRnVsbHkoUmVhZGFibGVCeXRlQ2hhbm5lbCwgQnl0ZUJ1ZmZlciBidWZmZXIpLiBUaGFua3MgdG8geXVrb2JhLiAKKiBJTy0zNTM6ICBBZGQgQVBJIElPVXRpbHMuY29weShJbnB1dFN0cmVhbSwgT3V0cHV0U3RyZWFtLCBpbnQpIFRoYW5rcyB0byBnZ3JlZ29yeS4gCiogSU8tMzQ5OiAgQWRkIEFQSSB3aXRoIGFycmF5IG9mZnNldCBhbmQgbGVuZ3RoIGFyZ3VtZW50IHRvIEZpbGVVdGlscy53cml0ZUJ5dGVBcnJheVRvRmlsZS4gVGhhbmtzIHRvIHNjb3AuIAoqIElPLTM0ODogIE1pc3NpbmcgaW5mb3JtYXRpb24gaW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHRocm93biBieSBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzI3ZhbGlkYXRlTGlzdEZpbGVzUGFyYW1ldGVycy4gVGhhbmtzIHRvIHBsY3N0cGllcnJlLiAKKiBJTy0zNDU6ICBTdXBwbHkgYSBob29rIG1ldGhvZCBhbGxvd2luZyBUYWlsZXIgYWN0aXZlbHkgZGV0ZXJtaW5pbmcgc3RvcCBjb25kaXRpb24uIFRoYW5rcyB0byBta3Jlc3NlLiAKKiBJTy00Mzc6ICBNYWtlIElPVXRpbHMuRU9GIHB1YmxpYyBhbmQgcmV1c2UgaXQgaW4gdmFyaW91cyBjbGFzc2VzLiAKCkZpeGVkIEJ1Z3MKLS0tLS0tLS0tLQoKKiBJTy00NDY6ICBhZGRzIGFuIGVuZE9mRmlsZVJlYWNoZWQgbWV0aG9kIHRvIHRoZSBUYWlsZXJMaXN0ZW5lciBUaGFua3MgdG8gSmVmZnJleSBCYXJydXMuIAoqIElPLTQ4NDogIEZpbGVuYW1lVXRpbHMgc2hvdWxkIGhhbmRsZSBlbWJlZGRlZCBudWxsIGJ5dGVzIFRoYW5rcyB0byBQaGlsaXBwZSBBcnRlYXUuIAoqIElPLTQ4MTogIENoYW5nZWQvQ29ycmVjdGVkIGFsZ29yaXRobSBmb3Igd2FpdEZvciAKKiBJTy00Mjg6ICBCT01JbnB1dFN0cmVhbS5za2lwIHJldHVybnMgd3JvbmcgY291bnQgaWYgc3RyZWFtIGNvbnRhaW5zIG5vIEJPTSBUaGFua3MgdG8gU3RlZmFuIEdtZWluZXIuIAoqIElPLTQ4ODogIEZpbGVVdGlscy53YWl0Rm9yKC4uLikgc3dhbGxvd3MgdGhyZWFkIGludGVycnVwdGVkIHN0YXR1cyBUaGFua3MgdG8gQmr2cm4gQnVjaG5lci4gCiogSU8tNDUyOiAgU3VwcG9ydCBmb3Igc3ltbGlua3Mgd2l0aCBtaXNzaW5nIHRhcmdldC4gQWRkZWQgc3VwcG9ydCBmb3IgSkRLNyBzeW1saW5rIGZlYXR1cmVzIHdoZW4gcHJlc2VudCBUaGFua3MgdG8gRGF2aWQgU3RhbmRpc2guIAoqIElPLTQ1MzogIFJlZ3Jlc3Npb24gaW4gRmlsZVV0aWxzLnJlYWRGaWxlVG9TdHJpbmcgZnJvbSAyLjAuMSBUaGFua3MgdG8gU3RldmVuIENocmlzdG91LiAKKiBJTy00NTE6ICBhbnQgdGVzdCBmYWlscyAtIHJlc291cmNlcyBtaXNzaW5nIGZyb20gdGVzdCBjbGFzc3BhdGggVGhhbmtzIHRvIERhdmlkIFN0YW5kaXNoLiAKKiBJTy00MzU6ICBEb2N1bWVudCB0aGF0IEZpbGVVdGlscy5kZWxldGVEaXJlY3RvcnksIGRpcmVjdG9yeUNvbnRhaW5zIGFuZCBjbGVhbkRpcmVjdG9yeQogICAgICAgICBtYXkgdGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgdGhlIHBhc3NlZCBkaXJlY3RvcnkgZG9lcyBub3QKICAgICAgICAgZXhpc3Qgb3IgaXMgbm90IGEgZGlyZWN0b3J5LiBUaGFua3MgdG8gRG9taW5payBTdGFkbGVyLiAKKiBJTy00MjQ6ICBKYXZhZG9jIGZpeGVzLCBtb3N0bHkgdG8gYXBwZWFzZSAxLjguMCBUaGFua3MgdG8gVmlsbGUgU2t5dHTkLiAKKiBJTy0zODk6ICBGaWxlVXRpbHMuc2l6ZU9mRGlyZWN0b3J5IGNhbiB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhhbmtzIHRvIEF1c3RpbiBEb3VwbmlrLiAKKiBJTy0zOTA6ICBGaWxlVXRpbHMuc2l6ZU9mRGlyZWN0b3J5QXNCaWdJbnRlZ2VyIGNhbiBvdmVyZmxvdy4KICAgICAgICAgRW5zdXJlIHRoYXQgcmVjdXJzaXZlIGNhbGxzIGFsbCB1c2UgQmlnSW50ZWdlciAKKiBJTy0zODU6ICBGaWxlVXRpbHMuZG9Db3B5RmlsZSBjYW4gcG90ZW50aWFsbHkgbG9vcCBmb3IgZXZlcgogICAgICAgICBFeGl0IGxvb3AgaWYgbm8gZGF0YSB0byBjb3B5IAoqIElPLTM4MzogIEZpbGVVdGlscy5kb0NvcHlGaWxlIGNhY2hlcyB0aGUgZmlsZSBzaXplOyBuZWVkcyB0byBiZSBkb2N1bWVudGVkCiAgICAgICAgIEFkZGVkIEphdmFkb2M7IHNob3cgZmlsZSBsZW5ndGhzIGluIGV4Y2VwdGlvbiBtZXNzYWdlIAoqIElPLTM4MDogIEZpbGVVdGlscy5jb3B5SW5wdXRTdHJlYW1Ub0ZpbGUgc2hvdWxkIGRvY3VtZW50IGl0IGNsb3NlcyB0aGUgaW5wdXQgc291cmNlIFRoYW5rcyB0byBjbGF1ZGlvX2NoLiAKKiBJTy0yNzk6ICBUYWlsZXIgZXJyb25lb3VzbHkgY29uc2lkZXJzIGZpbGUgYXMgbmV3LgogICAgICAgIEZpeCB0byB1c2UgZmlsZS5sYXN0TW9kaWZpZWQoKSByYXRoZXIgdGhhbiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAKKiBJTy0zNTY6ICBDaGFyU2VxdWVuY2VJbnB1dFN0cmVhbSNyZXNldCgpIGJlaGF2ZXMgaW5jb3JyZWN0bHkgaW4gY2FzZSB3aGVuIGJ1ZmZlciBzaXplIGlzIG5vdCBkaXZpZGFibGUgYnkgZGF0YSBzaXplLgogICAgICAgICBGaXggY29kZSBzbyBza2lwIHJlbGF0ZXMgdG8gdGhlIGVuY29kZWQgYnl0ZXM7IHJlc2V0IG5vdyByZS1lbmNvZGVzIHRoZSBkYXRhIHVwIHRvIHRoZSBwb2ludCBvZiB0aGUgbWFyayAKKiBJTy0zNjg6ICBDbGFzc0xvYWRlck9iamVjdElucHV0U3RyZWFtIGRvZXMgbm90IGhhbmRsZSBwcmltaXRpdmUgdHlwZWQgbWVtYmVycyAKKiBJTy0zMTQ6ICBEZXByZWNhdGUgYWxsIG1ldGhvZHMgdGhhdCB1c2UgdGhlIGRlZmF1bHQgZW5jb2RpbmcgCiogSU8tMzM4OiAgV2hlbiBhIGZpbGUgaXMgcm90YXRlZCwgZmluaXNoIHJlYWRpbmcgcHJldmlvdXMgZmlsZSBwcmlvciB0byBzdGFydGluZyBuZXcgb25lIAoqIElPLTM1NDogIENvbW1vbnMgSU8gVGFpbGVyIGRvZXMgbm90IHJlc3BlY3QgVVRGLTggQ2hhcnNldC4gCiogSU8tMzIzOiAgV2hhdCBzaG91bGQgaGFwcGVuIGluIEZpbGVVdGlscy5zaXplT2ZbRGlyZWN0b3J5XSB3aGVuIGFuIG92ZXJmbG93IHRha2VzIHBsYWNlPwogICAgICAgIEFkZGVkIEphdmFkb2MuIAoqIElPLTM3MjogIEZpbGVVdGlscy5tb3ZlRGlyZWN0b3J5IGNhbiBwcm9kdWNlIG1pc2xlYWRpbmcgZXJyb3IgbWVzc2FnZSBvbiBmYWlsdXJlCiogSU8tMzYyOiAgSU9VdGlscy5jb250ZW50RXF1YWxzKiBtZXRob2RzIHJldHVybnMgZmFsc2UgaWYgaW5wdXQxID09IGlucHV0Miwgc2hvdWxkIHJldHVybiB0cnVlLiBUaGFua3MgdG8gbW1hZHNvbiwgZ2dyZWdvcnkuIAoqIElPLTM1NzogIFtUYWlsZXJdIEludGVycnVwdGVkRXhjZXB0aW9uIHdoaWxlIHRoZSB0aHJlYWQgaXMgc2xlZXBpbmcgaXMgc2lsZW50bHkgaWdub3JlZCBUaGFua3MgdG8gbW9ydGVuaC4gCiogSU8tMzUyOiAgU3BlbGxpbmcgZml4ZXMuIFRoYW5rcyB0byBzY29wLiAKKiBJTy00MzY6ICBJbXByb3BlciBKYXZhZG9jIGNvbW1lbnQgZm9yIEZpbGVuYW1lVXRpbHMuaW5kZXhPZkV4dGVuc2lvbi4gVGhhbmtzIHRvIGNocmlzdG9waC5zY2huZWVnYW5zLiAKCkNoYW5nZXMKLS0tLS0tLQoKKiBJTy00MzM6ICBDb252ZXJ0ZWQgYWxsIHRlc3RjYXNlcyB0byBKVW5pdCA0IAoqIElPLTQ2NjogIEFkZGVkIHRlc3RjYXNlIHRvIHNob3cgdGhpcyB3YXMgZml4ZWQgd2l0aCBJTy00MjMgCiogSU8tNDc5OiAgQ29ycmVjdCBleGNlcHRpb24gbWVzc2FnZSBpbiBGaWxlVXRpbHMuZ2V0RmlsZShGaWxlLCBTdHJpbmcuLi4pIFRoYW5rcyB0byBaaG91Y2UgQ2hlbi4gCiogSU8tNDY1OiAgVXBkYXRlIHRvIEpVbml0IDQuMTIgVGhhbmtzIHRvIGJhc2VkMi4gCiogSU8tNDYyOiAgSU9FeGNlcHRpb25XaXRoQ2F1c2Ugbm8gbG9uZ2VyIG5lZWRlZCAKKiBJTy00MjI6ICBEZXByZWNhdGUgQ2hhcnNldHMgQ2hhcnNldCBjb25zdGFudHMgaW4gZmF2b3Igb2YgSmF2YSA3J3MgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzIAoqIElPLTIzOTogIENvbnZlcnQgSU9DYXNlIHRvIGEgSmF2YSAxLjUrIEVudW1lcmF0aW9uCiAgICAgICAgIFtOLkIuIHRoaXMgaXMgYmluYXJ5IGNvbXBhdGlibGVdIAoqIElPLTMyODogIGdldFByZWZpeExlbmd0aCByZXR1cm5zIG51bGwgaWYgZmlsZW5hbWUgaGFzIGxlYWRpbmcgc2xhc2hlcwogICAgICAgIEphdmFkb2M6IGFkZCBleGFtcGxlcyB0byBzaG93IGNvcnJlY3QgYmVoYXZpb3I7IGFkZCB1bml0IHRlc3RzIAoqIElPLTI5OTogIEZpbGVVdGlscy5saXN0RmlsZXNBbmREaXJzIGluY2x1ZGVzIG9yaWdpbmFsIGRpciBpbiByZXN1bHRzIGV2ZW4gd2hlbiBpdCBkb2Vzbid0IG1hdGNoIGZpbHRlcgogICAgICAgIEphdmFkb2M6IGNsYXJpZnkgdGhhdCBvcmlnaW5hbCBkaXIgaXMgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMgCiogSU8tMzc1OiAgRmlsZW5hbWVVdGlscy5zcGxpdE9uVG9rZW5zKFN0cmluZyB0ZXh0KSBjaGVjayBmb3IgJyoqJyBjb3VsZCBiZSBzaW1wbGlmaWVkIAoqIElPLTM3NDogIFdpbGRjYXJkRmlsZUZpbHRlciBjdG9ycyBzaG91bGQgbm90IHVzZSBudWxsIHRvIG1lYW4gSU9DYXNlLlNFTlNJVElWRSB3aGVuIGRlbGVnYXRpbmcgdG8gb3RoZXIgY3RvcnMgCgpDb21wYXRpYmlsaXR5IHdpdGggMi40OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21wYXRpYmlsaXR5IHdpdGggMi4yIGFuZCAxLjQ6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBObywgc2VlIHRoZSByYXJlIGNhc2UgaW4gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguClNlbWFudGljIGNvbXBhdGlibGU6IE5vLCBzZWUgdGhlIHJhcmUgY2FzZSBpbiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPLTMxOC4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyBWZXJzaW9uIDIuNAoKTmV3IGZlYXR1cmVzCi0tLS0tLS0tLS0tLQoKKiBJTy0yNjk6ICBUYWlsZXIgbG9ja3MgZmlsZSBmcm9tIGRlbGV0aW9uL3JlbmFtZSBvbiBXaW5kb3dzLiBUaGFua3MgdG8Kc2ViYi4KKiBJTy0zMzM6ICBFeHBvcnQgT1NHaSBwYWNrYWdlcyBhdCB2ZXJzaW9uIDEueCBpbiBhZGRpdGlvbiB0byAyLnguIFRoYW5rcwp0byBmbWVzY2hiZS4KKiBJTy0zMjA6ICBBZGQgWG1sU3RyZWFtUmVhZGVyIHN1cHBvcnQgZm9yIFVURi0zMi4gVGhhbmtzIHRvIGdncmVnb3J5LgoqIElPLTMzMTogIEJPTUlucHV0U3RyZWFtIHdyb25nbHkgZGV0ZWN0cyBVVEYtMzJMRV9CT00gZmlsZXMgYXMKVVRGLTE2TEVfQk9NIGZpbGVzIGluIG1ldGhvZCBnZXRCT00oKS4gVGhhbmtzIHRvIGdncmVnb3J5LgoqIElPLTMyNzogIEFkZCBieXRlQ291bnRUb0Rpc3BsYXlTaXplKEJpZ0ludGVnZXIpLiBUaGFua3MgdG8gZ2dyZWdvcnkuCiogSU8tMzI2OiAgQWRkIG5ldyBGaWxlVXRpbHMuc2l6ZU9mW0RpcmVjdG9yeV0gQVBJcyB0byByZXR1cm4gQmlnSW50ZWdlci4KVGhhbmtzIHRvIGdncmVnb3J5LgoqIElPLTMyNTogIEFkZCBJT1V0aWxzLnRvQnl0ZUFycmF5IG1ldGhvZHMgdG8gd29yayB3aXRoIFVSTCBhbmQgVVJJLiBUaGFua3MKdG8gcmF2aXByYWsuCiogSU8tMzI0OiAgQWRkIG1pc3NpbmcgQ2hhcnNldCBzaXN0ZXIgQVBJcyB0byBtZXRob2QgdGhhdCB0YWtlIGEgU3RyaW5nCmNoYXJzZXQgbmFtZS4gVGhhbmtzIHRvIHJhdmlwcmFrLgoKRml4ZWQgQnVncwotLS0tLS0tLS0tCgoqIElPLTMzNjogIFlvdHRhYnl0ZSAoWUIpIGluY29ycmVjdGx5IGRlZmluZWQgaW4gRmlsZVV0aWxzLiBUaGFua3MgdG8KcmxlYXZlbGxlLgoqIElPLTI3OTogIFRhaWxlciBlcnJvbmVvdXNseSBjb25zaWRlcnMgZmlsZSBhcyBuZXcuIFRoYW5rcyB0byBTZXJnaW8KQm9zc2EsIENocmlzIEJhcm9uLgoqIElPLTMzNTogIFRhaWxlciNyZWFkTGluZXMgLSBpbmNvcnJlY3QgQ1IgaGFuZGxpbmcuCiogSU8tMzM0OiAgRmlsZVV0aWxzLnRvVVJMcyB0aHJvd3MgTlBFIGZvciBudWxsIHBhcmFtZXRlcjsgZG9jdW1lbnQgdGhlCmJlaGF2aW9yLgoqIElPLTMzMjogIEltcHJvdmUgdGFpbGVyJ3MgcmVhZGluZyBwZXJmb3JtYW5jZS4gVGhhbmtzIHRvIGxpYW5nbHkuCiogSU8tMjc5OiAgSW1wcm92ZSBUYWlsZXIgcGVyZm9ybWFuY2Ugd2l0aCBidWZmZXJlZCByZWFkcyAoc2VlIElPLTMzMikuCiogSU8tMzI5OiAgRmlsZVV0aWxzLndyaXRlTGluZXMgdXNlcyB1bmJ1ZmZlcmVkIElPLiBUaGFua3MgdG8gdGl2di4KKiBJTy0zMTk6ICBGaWxlVXRpbHMuc2l6ZU9mRGlyZWN0b3J5IGZvbGxvd3Mgc3ltYm9saWMgbGlua3MuIFRoYW5rcyB0bwpyYXZpcHJhay4KCkNvbXBhdGliaWxpdHkgd2l0aCAyLjM6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBZZXMuClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4KCkNvbXBhdGliaWxpdHkgd2l0aCAyLjIgYW5kIDEuNDoKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IE5vLCBzZWUgdGhlIHJhcmUgY2FzZSBpbiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPLTMxOC4KU2VtYW50aWMgY29tcGF0aWJsZTogTm8sIHNlZSB0aGUgcmFyZSBjYXNlIGluIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSU8tMzE4LgoKQ29tbW9ucyBJTyAyLjcgYW5kIHVwIHJlcXVpcmVzIEphdmEgOCBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgSmF2YSA3IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMyB0aHJvdWdoIDIuNSByZXF1aXJlcyBKYXZhIDYgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEphdmEgNSBvciBhYm92ZS4KQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMi4zCgpOZXcgZmVhdHVyZXMKLS0tLS0tLS0tLS0tCgoqIElPLTMyMjogIEFkZCBhbmQgdXNlIGNsYXNzIENoYXJzZXRzLiBUaGFua3MgdG8gZ2dyZWdvcnkuIAoqIElPLTMyMTogIEJ5dGVPcmRlck1hcmsgVVRGXzMyTEUgaXMgaW5jb3JyZWN0LiBUaGFua3MgdG8gZ2dyZWdvcnkuIAoqIElPLTMxODogIEFkZCBDaGFyc2V0IHNpc3RlciBBUElzIHRvIG1ldGhvZCB0aGF0IHRha2UgYSBTdHJpbmcgY2hhcnNldCBuYW1lLiBUaGFua3MgdG8gZ2dyZWdvcnkuIAoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuMiBhbmQgMS40OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogTm8sIHNlZSB0aGUgcmFyZSBjYXNlIGluIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSU8tMzE4LgpTZW1hbnRpYyBjb21wYXRpYmxlOiBObywgc2VlIHRoZSByYXJlIGNhc2UgaW4gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAyLjIKCk5ldyBmZWF0dXJlcwotLS0tLS0tLS0tLS0KCiogQWRkIElPVXRpbHMudG9CdWZmZXJlZFJlYWRlcihSZWFkZXIpICBJc3N1ZTogSU8tMzEzLiBUaGFua3MgdG8gZ2dyZWdvcnkuCiogQWxsb3cgYXBwbGljYXRpb25zIHRvIHByb3ZpZGUgYnVmZmVyIChvciBzaXplKSBmb3IgY29weUxhcmdlIG1ldGhvZHMuICBJc3N1ZTogSU8tMzA4LiBUaGFua3MgdG8gTWFub2ogTW9rYXNoaS4gCiogTmV3IGNvcHlMYXJnZSgpIG1ldGhvZCBpbiBJT1V0aWxzIHRoYXQgdGFrZXMgYWRkaXRpb25hbCBvZmZzZXQsIGxlbmd0aCBhcmd1bWVudHMgIElzc3VlOiBJTy0zMDUuIFRoYW5rcyB0byBNYW5vaiBNb2thc2hpLiAKKiBVc2UgdGVyYWJ5dGUgKFRCKSwgcGV0YWJ5dGUgKFBCKSBhbmQgZXhhYnl0ZSAoRUIpIGluIEZpbGVVdGlscy5ieXRlQ291bnRUb0Rpc3BsYXlTaXplKGxvbmcgc2l6ZSkgIElzc3VlOiBJTy0yODcuIFRoYW5rcyB0byBSb24gS3VyaXMsIEdhcnkgR3JlZ29yeS4gCiogRmlsZVV0aWxzLmxpc3RGaWxlcygpIGRvZXNuJ3QgcmV0dXJuIGRpcmVjdG9yaWVzICBJc3N1ZTogSU8tMTczLiBUaGFua3MgdG8gTWFyY29zIFZpbu1jaXVzIGRhIFNpbHZhLiAKKiBDaGFyU2VxdWVuY2VJbnB1dFN0cmVhbSB0byBlZmZpY2llbnRseSBzdHJlYW0gY29udGVudCBvZiBhIENoYXJTZXF1ZW5jZSAgSXNzdWU6IElPLTI5Ny4gVGhhbmtzIHRvIE9sZWcgS2FsbmljaGV2c2tpLiAKKiBUaGUgc2Vjb25kIGNvbnN0cnVjdG9yIG9mIFRhaWxlciBjbGFzcyBkb2VzIG5vdCBwYXNzICdkZWxheScgdG8gdGhlIHRoaXJkIG9uZSAgSXNzdWU6IElPLTMwNC4gVGhhbmtzIHRvIGxpYW5nbHkuIAoqIFRlZU91dHB1dFN0cmVhbSBkb2VzIG5vdCBjYWxsIGJyYW5jaC5jbG9zZSgpIHdoZW4gbWFpbi5jbG9zZSgpIHRocm93cyBhbiBleGNlcHRpb24gIElzc3VlOiBJTy0zMDMuIFRoYW5rcyB0byBmYWJpYW4uYmFybmV5LiAKKiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gQk9NSW5wdXRTdHJlYW0gd2hlbiByZWFkaW5nIGEgZmlsZSB3aXRob3V0IEJPTSBtdWx0aXBsZSB0aW1lcyAgSXNzdWU6IElPLTMwMi4gVGhhbmtzIHRvIGpzdGV1ZXJ3YWxkLCBkZXRpbmhvLiAKKiBBZGQgSU9VdGlscy5jbG9zZVF1aWV0bHkoU2VsZWN0b3IpIG5lY2Vzc2FyeSAgSXNzdWU6IElPLTMwMS4gVGhhbmtzIHRvIGtheWtheS51bmlxdWUuIAoqIElPVXRpbHMuY2xvc2VRdWlldGx5KCkgc2hvdWxkIHRha2UgYSBTZXJ2ZXJTb2NrZXQgYXMgYSBwYXJhbWV0ZXIgIElzc3VlOiBJTy0yOTIuIFRoYW5rcyB0byBzZWJiLiAKKiBBZGQgcmVhZC9yZWFkRnVsbHkgbWV0aG9kcyB0byBJT1V0aWxzICBJc3N1ZTogSU8tMjkwLiBUaGFua3MgdG8gc2ViYi4gCiogU3VwcGx5IGEgUmV2ZXJzZWRMaW5lc0ZpbGVSZWFkZXIgIElzc3VlOiBJTy0yODguIFRoYW5rcyB0byBHZW9yZyBIZW56bGVyLiAKKiBBZGQgbmV3IGZ1bmN0aW9uIEZpbGVVdGlscy5kaXJlY3RvcnlDb250YWlucy4gIElzc3VlOiBJTy0yOTEuIFRoYW5rcyB0byBnZ3JlZ29yeS4gCiogRmlsZVV0aWxzLmNvbnRlbnRFcXVhbHMgYW5kIElPVXRpbHMuY29udGVudEVxdWFscyAtIEFkZCBvcHRpb24gdG8gaWdub3JlICJsaW5lIGVuZGluZ3MiCiAgICAgICAgQWRkZWQgY29udGVudEVxdWFsc0lnbm9yZUVPTCBtZXRob2RzIHRvIGJvdGggY2xhc3NlcyAgSXNzdWU6IElPLTI3NS4gVGhhbmtzIHRvIENKIEFzcHJvbWdvcy4gCgpGaXhlZCBCdWdzCi0tLS0tLS0tLS0KCiogSU9VdGlscy5yZWFkKElucHV0U3RyZWFtL1JlYWRlcikgaWdub3JlcyB0aGUgb2Zmc2V0IHBhcmFtZXRlciAgSXNzdWU6IElPLTMxMS4gVGhhbmtzIHRvIFJvYmVydCBNdWlyLiAKKiBDaGFyU2VxdWVuY2VJbnB1dFN0cmVhbShDaGFyU2VxdWVuY2UgcywgQ2hhcnNldCBjaGFyc2V0LCBpbnQgYnVmZmVyU2l6ZSkgaWdub3JlcyBidWZmZXJTaXplICBJc3N1ZTogSU8tMzEyLiAKKiBGaWxlVXRpbHMubW92ZURpcmVjdG9yeVRvRGlyZWN0b3J5IHJlbW92ZXMgc291cmNlIGRpcmVjdG9yeSBpZiBkZXN0aW5hdGlvbiBpcyBhIHN1YmRpcmVjdG9yeSAgSXNzdWU6IElPLTMwMC4gCiogUmVhZGVySW5wdXRTdHJlYW0jcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgc2hvdWxkIGNoZWNrIGZvciB2YWxpZCBwYXJhbWV0ZXJzICBJc3N1ZTogSU8tMzA3LiAKKiBSZWFkZXJJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSBzaG91bGQgYWx3YXlzIHJldHVybiAwIGZvciBsZW5ndGggPT0gMCAgSXNzdWU6IElPLTMwNi4gCiogIkZpbGVVdGlscyNkZWxldGVEaXJlY3RvcnlPbkV4aXQoRmlsZSkiIGRvZXMgbm90IHdvcmsgIElzc3VlOiBJTy0yNzYuIFRoYW5rcyB0byBua2FtaS4gCiogQm91bmRlZElucHV0U3RyZWFtLnJlYWQoKSB0cmVhdHMgbWF4IGRpZmZlcmVudGx5IGZyb20gQm91bmRlZElucHV0U3RyZWFtLnJlYWQoYnl0ZVtdLi4uKSAgSXNzdWU6IElPLTI3My4gVGhhbmtzIHRvIHNlYmIuIAoqIFZhcmlvdXMgbWV0aG9kcyBvZiBjbGFzcyAnb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlscycgaW5jb3JyZWN0bHkgc3VwcHJlc3MgJ2phdmEuaW8uSU9FeGNlcHRpb24nICBJc3N1ZTogSU8tMjk4LiBUaGFua3MgdG8gQ2hyaXN0aWFuIFNjaHVsdGUuIAoKQ2hhbmdlcwotLS0tLS0tCgoqIFJlYWRlcklucHV0U3RyZWFtIG9wdGltaXphdGlvbjogbW9yZSBlZmZpY2llbnQgcmVhZGluZyBvZiBzbWFsbCBjaHVua3Mgb2YgZGF0YSAgSXNzdWU6IElPLTI5Ni4gVGhhbmtzIHRvIE9sZWcgS2FsbmljaGV2c2tpLiAKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjEgYW5kIDEuNDoKQmluYXJ5IGNvbXBhdGlibGU6IFllcwpTb3VyY2UgY29tcGF0aWJsZTogWWVzClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4gQ2hlY2sgdGhlIGJ1ZyBmaXhlcyBzZWN0aW9uIGZvciBzZW1hbnRpYyBidWcgZml4ZXMKCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyBWZXJzaW9uIDIuMQoKTmV3IGZlYXR1cmVzCi0tLS0tLS0tLS0tLQoKKiBVc2Ugc3RhbmRhcmQgTWF2ZW4gZGlyZWN0b3J5IGxheW91dCAgSXNzdWU6IElPLTI4NS4gVGhhbmtzIHRvIGdncmVnb3J5LiAKKiBBZGQgSU9VdGlscyBBUEkgdG9TdHJpbmcgZm9yIFVSTCBhbmQgVVJJIHRvIGdldCBjb250ZW50cyAgSXNzdWU6IElPLTI4NC4gVGhhbmtzIHRvIGdncmVnb3J5LiAKKiBBZGQgQVBJIEZpbGVVdGlscy5jb3B5RmlsZShGaWxlIGlucHV0LCBPdXRwdXRTdHJlYW0gb3V0cHV0KSAgSXNzdWU6IElPLTI4Mi4gVGhhbmtzIHRvIGdncmVnb3J5LiAKKiBGaWxlQWx0ZXJhdGlvbk9ic2VydmVyIGhhcyBubyBnZXR0ZXIgZm9yIEZpbGVGaWx0ZXIgIElzc3VlOiBJTy0yNjIuIAoqIEFkZCBGaWxlVXRpbHMuZ2V0RmlsZSBBUEkgd2l0aCB2YXJhcmdzIHBhcmFtZXRlciAgSXNzdWU6IElPLTI2MS4gCiogQWRkIG5ldyBBUFBFTkQgcGFyYW1ldGVyIGZvciB3cml0aW5nIHN0cmluZyBpbnRvIGZpbGVzICBJc3N1ZTogSU8tMTgyLiAKKiBBZGQgbmV3IHJlYWQgbWV0aG9kICJ0b0J5dGVBcnJheSIgdG8gaGFuZGxlIElucHV0U3RyZWFtIHdpdGgga25vd24gc2l6ZS4gIElzc3VlOiBJTy0yNTEuIFRoYW5rcyB0byBNYXJjbyBBbGJpbmkuIAoKRml4ZWQgQnVncwotLS0tLS0tLS0tCgoqIER1YmlvdXMgdXNlIG9mIG1rZGlycygpIHJldHVybiBjb2RlICBJc3N1ZTogSU8tMjgwLiBUaGFua3MgdG8gc2ViYi4gCiogUmVhZGVySW5wdXRTdHJlYW0gZW50ZXJzIGluZmluaXRlIGxvb3Agd2hlbiBpdCBlbmNvdW50ZXJzIGFuIHVubWFwcGFibGUgY2hhcmFjdGVyICBJc3N1ZTogSU8tMjc3LiAKKiBGaWxlVXRpbHMubW92ZUZpbGUoKSBKYXZhZG9jIHNob3VsZCBzcGVjaWZ5IEZpbGVFeGlzdHNFeGNlcHRpb24gdGhyb3duICBJc3N1ZTogSU8tMjY0LiAKKiBDbGFzc0xvYWRlck9iamVjdElucHV0U3RyZWFtIGRvZXMgbm90IGhhbmRsZSBQcm94eSBjbGFzc2VzICBJc3N1ZTogSU8tMjYwLiAKKiBUYWlsZXIgcmV0dXJuaW5nIHBhcnRpYWwgbGluZXMgd2hlbiByZWFjaGluZyBFT0YgYmVmb3JlIEVPTCAgSXNzdWU6IElPLTI3NC4gVGhhbmtzIHRvIEZyYW5rIEdyaW1lcy4gCiogRmlsZVV0aWxzLmNvcHlGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gY29weWluZyBsYXJnZSBmaWxlcyB0byBhIHNoYXJlZCBkaXJlY3RvcnkgKG9uIFdpbmRvd3MpICBJc3N1ZTogSU8tMjY2LiBUaGFua3MgdG8gSWdvciBTbWVyZWthLiAKKiBGaWxlU3lzdGVtVXRpbHMuZnJlZVNwYWNlS2IgdGhyb3dzIGV4Y2VwdGlvbiBmb3IgV2luZG93cyB2b2x1bWVzIHdpdGggbm8gdmlzaWJsZSBmaWxlcy4KICAgICAgICBJbXByb3ZlIGNvdmVyYWdlIGJ5IGFsc28gbG9va2luZyBmb3IgaGlkZGVuIGZpbGVzLiAgSXNzdWU6IElPLTI2My4gVGhhbmtzIHRvIEdpbCBBZGFtLiAKCkNoYW5nZXMKLS0tLS0tLQoKKiBGaWxlQWx0ZXJhdGlvbk1vbml0b3Iuc3RvcChib29sZWFuIGFsbG93SW50ZXJ2YWxUb0ZpbmlzaCkgIElzc3VlOiBJTy0yNTkuIAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gUGFja2FnZSAyLjAuMQoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuMCBhbmQgMS40Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaW5hcnkgY29tcGF0aWJsZSAtIFllcwoKU291cmNlIGNvbXBhdGlibGUgLSBZZXMKClNlbWFudGljIGNvbXBhdGlibGUgLSBZZXMKICBDaGVjayB0aGUgYnVnIGZpeGVzIHNlY3Rpb24gZm9yIHNlbWFudGljIGJ1ZyBmaXhlcwoKQ29tbW9ucyBJTyAyLjAuMSByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUKIChDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZSkgCgpFbmhhbmNlbWVudHMgZnJvbSAyLjAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAqIFtJTy0yNTZdIC0gUHJvdmlkZSB0aHJlYWQgZmFjdG9yeSBmb3IgRmlsZUFsdGVybmF0aW9uTW9uaXRvcgoKQnVnIGZpeGVzIGZyb20gMi4wCi0tLS0tLS0tLS0tLS0tLS0tLQoKICAgKiBbSU8tMjU3XSAtIEJPTUlucHV0U3RyZWFtLnJlYWQoYnl0ZVtdKSBjYW4gcmV0dXJuIDAgd2hpY2ggaXQgc2hvdWxkIG5vdAogICAqIFtJTy0yNThdIC0gWG1sU3RyZWFtUmVhZGVyIGNvbnN1bWVzIHRoZSBzdHJlYW0gZHVyaW5nIGVuY29kaW5nIGRldGVjdGlvbgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyBQYWNrYWdlIDIuMAoKQ29tcGF0aWJpbGl0eSB3aXRoIDEuNAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpbmFyeSBjb21wYXRpYmxlIC0gWWVzCgpTb3VyY2UgY29tcGF0aWJsZSAtIFllcwoKU2VtYW50aWMgY29tcGF0aWJsZSAtIFllcwogIENoZWNrIHRoZSBidWcgZml4ZXMgc2VjdGlvbiBmb3Igc2VtYW50aWMgYnVnIGZpeGVzCgpDb21tb25zIElPIDIuMCByZXF1aXJlcyBKYXZhIDUgb3IgYWJvYmUKIChDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZSkgCgpEZXByZWNhdGlvbnMgZnJvbSAxLjQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotIElPVXRpbHMKICAtIHdyaXRlKFN0cmluZ0J1ZmZlciwgV3JpdGVyKSBpbiBmYXZvdXIgb2Ygd3JpdGUoQ2hhclNlcXVlbmNlLCBXcml0ZXIpCiAgLSB3cml0ZShTdHJpbmdCdWZmZXIsIE91dHB1dFN0cmVhbSkgIGluIGZhdm91ciBvZiB3cml0ZShDaGFyU2VxdWVuY2UsIE91dHB1dFN0cmVhbSkKICAtIHdyaXRlKFN0cmluZ0J1ZmZlciwgT3V0cHV0U3RyZWFtLCBTdHJpbmcpIGluIGZhdm91ciBvZiB3cml0ZShDaGFyU2VxdWVuY2UsIE91dHB1dFN0cmVhbSwgU3RyaW5nKQoKLSBGaWxlRmlsdGVyVXRpbHMKICAtIGFuZEZpbGVGaWx0ZXIoSU9GaWxlRmlsdGVyLCBJT0ZpbGVGaWx0ZXIpIGluIGZhdm91ciBvZiBhbmQoSU9GaWxlRmlsdGVyLi4uKSAKICAtIG9yRmlsZUZpbHRlcihJT0ZpbGVGaWx0ZXIsIElPRmlsZUZpbHRlcikgIGluIGZhdm91ciBvZiBvcihJT0ZpbGVGaWx0ZXIuLi4pCgpFbmhhbmNlbWVudHMgZnJvbSAxLjQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICogW0lPLTE0MF0gTW92ZSBtaW5pbXVtIEphdmEgcmVxdWlyZW1lbnQgZnJvbSBKYXZhIDEuMyB0byBKYXZhIDUKICAgICAgICAgICAgIC0gdXNlIEdlbmVyaWNzCiAgICAgICAgICAgICAtIGFkZCBuZXcgQ2hhclNlcXVlbmNlIHdyaXRlKCkgZmxhdm91ciBtZXRob2RzIHRvIElPVXRpbHMgYW5kIEZpbGVVdGlscwogICAgICAgICAgICAgLSByZXBsYWNlIFN0cmluZ0J1ZmZlciB3aXRoIFN0cmluZ0J1aWxkZXIsIHdoZXJlIGFwcHJvcHJpYXRlCiAgICAgICAgICAgICAtIGFkZCBuZXcgUmVhZGVyL1dyaXRlciBtZXRob2RzIHRvIFByb3h5UmVhZGVyIGFuZCBQcm94eVdyaXRlcgogICAgICAgICAgICAgLSBBbm5vdGF0ZSB3aXRoIEBPdmVycmlkZSBhbmQgQERlcHJlY2F0ZWQKCiAgKiBbSU8tMTc4XSBOZXcgQk9NSW5wdXRTdHJlYW0gYW5kIEJ5dGVPcmRlck1hcmsgaW1wbGVtZW50YXRpb25zIC0gdG8gZGV0ZWN0IGFuZCBvcHRpb25hbGx5IGV4Y2x1ZGUgYW4gaW5pdGlhbCBCeXRlIE9yZGVyIG1hcmsgKEJPTSkKICAqIFtJTy0xOTddIE5ldyBCb3VuZGVkSW5wdXRTdHJlYW0gKGNvcGllZCBmcm9tIEFwYWNoZSBKYWNrUmFiYml0KQogICogW0lPLTE5M10gTmV3IEJyb2tlbiBJbnB1dCBhbmQgT3V0cHV0IHN0cmVhbXMKICAqIFtJTy0xMzJdIE5ldyBGaWxlIExpc3RlbmVyL01vbml0b3IgZmFjaWxpdHkKICAqIFtJTy0xNThdIE5ldyBSZWFkZXJJbnB1dFN0cmVhbSBhbmQgV3JpdGVyT3V0cHV0U3RyZWFtIGltcGxlbWVudGF0aW9ucwogICogW0lPLTEzOV0gTmV3IFN0cmluZ0J1aWxkZXIgV3JpdGVyIGltcGxlbWVudGF0aW9uCiAgKiBbSU8tMTkyXSBOZXcgVGFnZ2VkIElucHV0IGFuZCBPdXRwdXQgc3RyZWFtcwogICogW0lPLTE3N10gTmV3IFRhaWxlciBjbGFzcyAtIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVW5peCAidGFpbCAtZiIgZnVuY3Rpb25hbGl0eQogICogW0lPLTE2Ml0gTmV3IFhNTCBTdHJlYW0gUmVhZGVyL1dyaXRlciBpbXBsZW1lbnRhdGlvbnMgKGZyb20gUk9NRSB2aWEgcGxleHVzLXV0aWxzKQoKICAqIFtJTy0xNDJdIENvbXBhcmF0b3JzIC0gYWRkIGZhY2lsaXR5IHRvIHNvcnQgZmlsZSBsaXN0cy9hcnJheXMKICAqIFtJTy0xODZdIENvbXBhcmF0b3JzIC0gbmV3IENvbXBvc2l0ZSBhbmQgRGlyZWN0b3J5IEZpbGUgQ29tcGFyYXRvciBpbXBsZW1lbnRhdGlvbnMKICAqIFtJTy0xNzZdIERpcmVjdG9yeVdhbGtlciAtIGFkZCBmaWx0ZXJEaXJlY3RvcnlDb250ZW50cygpIGNhbGxiYWNrIG1ldGhvZCBmb3IgZmlsdGVyaW5nIGRpcmVjdG9yeSBjb250ZW50cwogICogW0lPLTIxMF0gRmlsZUZpbHRlciAtIG5ldyBNYWdpYyBOdW1iZXIgRmlsZUZpbHRlcgogICogW0lPLTIyMV0gRmlsZUZpbHRlclV0aWxzIC0gYWRkIG1ldGhvZHMgZm9yIHN1ZmZpeCBhbmQgcHJlZml4IGZpbHRlcnMgd2hpY2ggdGFrZSBhbiBJT0Nhc2Ugb2JqZWN0CiAgKiBbSU8tMjMyXSBGaWxlRmlsdGVyVXRpbHMgLSBhZGQgbWV0aG9kIGZvciBuYW1lIGZpbHRlcnMgd2hpY2ggdGFrZSBhbiBJT0Nhc2Ugb2JqZWN0CiAgKiBbSU8tMjI5XSBGaWxlRmlsdGVyVXRpbHMgLSBhZGQgdmFyYXJncyBhbmQoKSBhbmQgb3IoKSBtZXRob2RzCiAgKiBbSU8tMTk4XSBGaWxlRmlsdGVyVXRpbHMgLSBhZGQgYWJpbGl0eSB0byBhcHBseSBmaWxlIGZpbHRlcnMgdG8gY29sbGVjdGlvbnMgYW5kIGFycmF5cwogICogW0lPLTE1Nl0gRmlsZW5hbWVVdGlscyAtIGFkZCBub3JtYWxpemUoKSBhbmQgbm9ybWFsaXplTm9FbmRTZXBhcmF0b3IoKSBtZXRob2RzIHdoaWNoIGFsbG93IHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIHRvIGJlIHNwZWNpZmllZAogICogW0lPLTE5NF0gRmlsZVN5c3RlbVV0aWxzIC0gYWRkIGZyZWVTcGFjZUtiKCkgbWV0aG9kIHdpdGggbm8gaW5wdXQgYXJndW1lbnRzCiAgKiBbSU8tMTg1XSBGaWxlU3lzdGVtVXRpbHMgLSBhZGQgZnJlZVNwYWNlS2IoKSBtZXRob2RzIHRoYXQgdGFrZSBhIHRpbWVvdXQgcGFyYW1ldGVyIC0gZml4ZXMgZnJlZVNwYWNlV2luZG93cygpIGJsb2NrcwogICogW0lPLTE1NV0gRmlsZVV0aWxzIC0gdXNlIE5JTyB0byBjb3B5IGZpbGVzCiAgKiBbSU8tMTY4XSBGaWxlVXRpbHMgLSBhZGQgbmV3IGlzU3ltbGluaygpIG1ldGhvZAogICogW0lPLTIxOV0gRmlsZVV0aWxzIC0gdGhyb3cgRmlsZUV4aXN0c0V4Y2VwdGlvbiB3aGVuIG1vdmluZyBhIGZpbGUgb3IgZGlyZWN0b3J5IGlmIHRoZSBkZXN0aW5hdGlvbiBhbHJlYWR5IGV4aXN0cwogICogW0lPLTIzNF0gRmlsZVV0aWxzIC0gYWRkIE1ldGhvZHMgZm9yIHJldHJpZXZpbmcgU3lzdGVtIFVzZXIvVGVtcCBkaXJlY3Rvcmllcy9wYXRocwogICogW0lPLTIwOF0gRmlsZVV0aWxzIC0gYWRkIHRpbWVvdXQgKGNvbm5lY3Rpb24gYW5kIHJlYWQpIHN1cHBvcnQgZm9yIGNvcHlVUkxUb0ZpbGUoKSBtZXRob2QgCiAgKiBbSU8tMjM4XSBGaWxlVXRpbHMgLSBhZGQgc2l6ZU9mKEZpbGUpIG1ldGhvZAogICogW0lPLTE4MV0gTGluZUl0ZXJhdG9yIG5vdyBpbXBsZW1lbnRzIEl0ZXJhYmxlCiAgKiBbSU8tMjI0XSBJT1V0aWxzIC0gYWRkIGNsb3NlUXVpZXRseShDbG9zZWFibGUpIGFuZCBjbG9zZVF1aWV0bHkoU29ja2V0KSBtZXRob2RzCiAgKiBbSU8tMjAzXSBJT1V0aWxzIC0gYWRkIHNraXBGdWxseSgpIG1ldGhvZCBmb3IgSW5wdXRTdHJlYW1zCiAgKiBbSU8tMTM3XSBJT1V0aWxzIGFuZCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gLSBhZGQgdG9CdWZmZXJlZElucHV0U3RyZWFtKCkgbWV0aG9kIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGFycmF5IGFsbG9jYXRpb24vY29weQogICogW0lPLTE5NV0gUHJveHkgc3RyZWFtcy9SZWFkZXIvV3JpdGVyIC0gcHJvdmlkZSBleGNlcHRpb24gaGFuZGxpbmcgbWV0aG9kcwogICogW0lPLTIxMV0gUHJveHkgSW5wdXQvT3V0cHV0IHN0cmVhbXMgLSBhZGQgcHJlL3Bvc3QgcHJvY2Vzc2luZyBzdXBwb3J0CiAgKiBbSU8tMjQyXSBQcm94eSBSZWFkZXIvV3JpdGVyIC0gYWRkIHByZS9wb3N0IHByb2Nlc3Npbmcgc3VwcG9ydAoKQnVnIGZpeGVzIGZyb20gMS40Ci0tLS0tLS0tLS0tLS0tLS0tLQogICogW0lPLTIxNF0gQnl0ZUFycmF5T3V0cHV0U3RyZWFtIC0gZml4IGluY29uc2lzdGVudCBzeW5jaHJvbml6YXRpb24gb2YgZmllbGRzCiAgKiBbSU8tMjAxXSBDb3VudGluZyBJbnB1dC9PdXRwdXQgc3RyZWFtcyAtIGZpeCBpbmNvbnNpc3RlbnQgc3luY2hyb25pemF0aW9uCiAgKiBbSU8tMTU5XSBGaWxlQ2xlYW5pbmdUcmFja2VyIC0gZml4IHJlbW92ZSgpIG5ldmVyIHJldHVybnMgbnVsbAogICogW0lPLTIyMF0gRmlsZUNsZWFuaW5nVHJhY2tlciAtIGZpeCBWZWN0b3IgcGVyZm9ybXMgYmFkbHkgdW5kZXIgbG9hZAogICogW0lPLTE2N10gRmlsZW5hbWVVdGlscyAtIGZpeCBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZyBoYW5kbGluZyBpbiBGaWxlbmFtZVV0aWxzIGFuZCBGaWxlc3lzdGVtVXRpbHMKICAqIFtJTy0xNzldIEZpbGVuYW1lVXRpbHMgLSBmaXggU3RyaW5nSW5kZXhPdXRPZkJvdW5kcyBleGNlcHRpb24gaW4gZ2V0UGF0aE5vRW5kU2VwYXJhdG9yKCkKICAqIFtJTy0yNDhdIEZpbGVuYW1lVXRpbHMgLSBmaXggZ2V0RnVsbFBhdGhOb0VuZFNlcGFyYXRvcigpIHJldHVybnMgZW1wdHkgd2hpbGUgcGF0aCBpcyBhIG9uZSBsZXZlbCBkaXJlY3RvcnkKICAqIFtJTy0yNDZdIEZpbGVuYW1lVXRpbHMgLSBmaXggd2lsZGNhcmRNYXRjaCBnaXZlcyBpbmNvcnJlY3QgcmVzdWx0cyAKICAqIFtJTy0xODddIEZpbGVTeXN0ZW1VdGlscyAtIGZpeCBmcmVlU3BhY2VLYigpIGRvZXNuJ3Qgd29yayB3aXRoIHJlbGF0aXZlIHBhdGhzIG9uIExpbnV4CiAgKiBbSU8tMTYwXSBGaWxlU3lzdGVtVXRpbHMgLSBmaXggZnJlZVNwYWNlKCkgZmFpbHMgb24gc29sYXJpcwogICogW0lPLTIwOV0gRmlsZVN5c3RlbVV0aWxzIC0gZml4IGZyZWVTcGFjZUtiKCkgZmFpbHMgdG8gcmV0dXJuIGNvcnJlY3Qgc2l6ZSBmb3IgYSB3aW5kb3dzIG1vdW50IHBvaW50CiAgKiBbSU8tMTYzXSBGaWxlVXRpbHMgLSBmaXggdG9VUkxzKCkgdXNpbmcgZGVwcmVjYXRlZCBtZXRob2Qgb2YgY29udmVyc2lvbiB0byBVUkwKICAqIFtJTy0xNjhdIEZpbGVVdGlscyAtIGZpeCBTeW1ib2xpYyBsaW5rcyBmb2xsb3dlZCB3aGVuIGRlbGV0aW5nIGRpcmVjdG9yeQogICogW0lPLTIzMV0gRmlsZVV0aWxzIC0gZml4IHdyb25nIGV4Y2VwdGlvbiBtZXNzYWdlIGdlbmVyYXRlZCBpbiBpc0ZpbGVOZXdlcigpIG1ldGhvZAogICogW0lPLTIwN10gRmlsZVV0aWxzIC0gZml4IHJhY2UgY29uZGl0aW9uIGluIGZvcmNlTWtkaXIoKSBtZXRob2QKICAqIFtJTy0yMTddIEZpbGVVdGlscyAtIGZpeCBjb3B5RGlyZWN0b3J5VG9EaXJlY3RvcnkoKSBtYWtlcyBpbmZpbml0ZSBsb29wcwogICogW0lPLTE2Nl0gRmlsZVV0aWxzIC0gZml4IFVSTCBkZWNvZGluZyBpbiB0b0ZpbGUoVVJMKQogICogW0lPLTE5MF0gRmlsZVV0aWxzIC0gZml4IGNvcHlEaXJlY3Rvcnkgbm90IHByZXNlcnZpbmcgbGFzdG1vZGlmaWVkIGRhdGUgb24gc3ViZGlyZWN0b3JpZXMKICAqIFtJTy0yNDBdIEZpbGVGaWx0ZXJVdGlscyAtIGVuc3VyZSBjdnNGaWx0ZXIgYW5kIHN2bkZpbHRlciBhcmUgb25seSBjcmVhdGVkIG9uY2UuCiAgKiBbSU8tMTc1XSBJT1V0aWxzIC0gZml4IGNvcHlGaWxlKCkgaXNzdWVzIHdpdGggdmVyeSBsYXJnZSBmaWxlcwogICogW0lPLTE5MV0gSW1wcm92ZW1lbnRzIGZyb20gc3RhdGljIGFuYWx5c2lzCiAgKiBbSU8tMjE2XSBMb2NrYWJsZUZpbGVXcml0ZXIgLSBkZWxldGUgZmlsZXMgcXVpZXRseSB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIGluaXRpYWxpemF0aW9uCiAgKiBbSU8tMjQzXSBTd2FwcGVkRGF0YUlucHV0U3RyZWFtIC0gZml4IHJlYWRCb29sZWFuIGlzIGludmVydGVkCiAgKiBbSU8tMjM1XSBUZXN0cyAtIHJlbW92ZSB1bnVzZWQgWWVsbE9uRmx1c2hBbmRDbG9zZU91dHB1dFN0cmVhbSBmcm9tIENvcHlVdGlsc1Rlc3QKICAqIFtJTy0xNjFdIFRlc3RzIC0gZml4IEZpbGVDbGVhbmluZ1RyYWNrZXJUZXN0Q2FzZSBoYW5naW5nCgpEb2N1bWVudGF0aW9uIGNoYW5nZXMgZnJvbSAxLjQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBbSU8tMTgzIEZpbGVuYW1lVXRpbHMuZ2V0RXh0ZW5zaW9uKCkgbWV0aG9kIGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzCiAgKiBbSU8tMjI2IEZpbGVVdGlscy5ieXRlQ291bnRUb0Rpc3BsYXlTaXplKCkgZG9jdW1lbnRhdGlvbiBjb3JyZWN0aW9ucwogICogW0lPLTIwNSBGaWxlVXRpbHMuZm9yY2VNa2RpcigpIGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzCiAgKiBbSU8tMjE1IEZpbGVVdGlscyBjb3B5IGZpbGUvZGlyZWN0b3J5IGltcHJvdmUgZG9jdW1lbnRhdGlvbiByZWdhcmRpbmcgcHJlc2VydmluZyB0aGUgbGFzdCBtb2RpZmllZCBkYXRlCiAgKiBbSU8tMTg5IEhleER1bXAuZHVtcCgpIG1ldGhvZCBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cwogICogW0lPLTE3MSBJT0Nhc2UgZG9jdW1lbnQgdGhhdCBpdCBhc3N1bWVzIHRoZXJlIGFyZSBvbmx5IHR3byBPU2VzOiBXaW5kb3dzIGFuZCBVbml4CiAgKiBbSU8tMjIzIElPVXRpbHMuY29weSgpIGRvY3VtZW50YXRpb24gY29ycmVjdGlvbnMKICAqIFtJTy0yNDcgSU9VdGlscy5jbG9zZVF1aWV0bHkoKSBpbXByb3ZlIGRvY3VtZW50YXRpb24gd2l0aCBleGFtcGxlcwogICogW0lPLTIwMiBOb3RGaWxlRmlsdGVyIGRvY3VtZW50YXRpb24gY29ycmVjdGlvbnMKICAqIFtJTy0yMDYgUHJveHlJbnB1dFN0cmVhbSAtIGZpeCBtaXNsZWFkaW5nIHBhcmFtZXRlciBuYW1lcwogICogW0lPLTIxMiBQcm94eUlucHV0U3RyZWFtLnNraXAoKSBkb2N1bWVudGF0aW9uIGNvcnJlY3Rpb25zCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMS40CgpDb21wYXRpYmlsaXR5IHdpdGggMS4zLjIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpbmFyeSBjb21wYXRpYmxlIC0gWWVzCgpTb3VyY2UgY29tcGF0aWJsZSAtIFllcwoKU2VtYW50aWMgY29tcGF0aWJsZSAtIFllcwogIENoZWNrIHRoZSBidWcgZml4ZXMgc2VjdGlvbiBmb3Igc2VtYW50aWMgYnVnIGZpeGVzCgpDb21tb25zIElPIDEuNCBpbnRyb2R1Y2VzIGZvdXIgbmV3IGltcGxlbWVudGF0aW9ucyB3aGljaCBkZXBlbmQgb24gSmF2YSA0IGZlYXR1cmVzCihDaGFyU2VxdWVuY2VSZWFkZXIsIEZpbGVXcml0ZXJXaXRoRW5jb2RpbmcsIElPRXhjZXB0aW9uV2l0aENhdXNlIGFuZCBSZWdleEZpbGVGaWx0ZXIpLgpJdCBoYXMgYmVlbiBidWlsdCB3aXRoIHRoZSBKREsgc291cmNlIGFuZCB0YXJnZXQgb3B0aW9ucyBzZXQgdG8gSmF2YSAxLjMgYW5kLCBleGNlcHQgZm9yCnRob3NlIGltcGxlbWVudGF0aW9ucywgY2FuIGJlIHVzZWQgd2l0aCBKYXZhIDEuMyAoc2VlIElPLTEyNykuCgpEZXByZWNhdGlvbnMgZnJvbSAxLjMuMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZpbGVDbGVhbmVyIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIEZpbGVDbGVhbmluZ1RyYWNrZXIgW3NlZSBJTy0xMTZdCgpCdWcgZml4ZXMgZnJvbSAxLjMuMgotLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZpbGVVdGlscwogIC0gZm9yY2VEZWxldGUgb2Ygb3JwaGFuZWQgU29mdGxpbmtzIGRvZXMgbm90IHdvcmsgW0lPLTE0N10KICAtIEluZmluaXRlIGxvb3Agb24gRmlsZVV0aWxzLmNvcHlEaXJlY3Rvcnkgd2hlbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGlzIHdpdGhpbgogICAgdGhlIHNvdXJjZSBkaXJlY3RvcnkgW0lPLTE0MV0KICAtIEFkZCBhIGNvcHlEaXJlY3RvcnkoKSBtZXRob2QgdGhhdCBtYWtlcyB1c2Ugb2YgRmlsZUZpbHRlciBbSU8tMTA1XQogIC0gQWRkIG1vdmVEaXJlY3RvcnkoKSBhbmQgbW92ZUZpbGUoKSBtZXRob2RzIFtJTy03N10KCi0gSGV4RHVtcAogIC0gSGV4RHVtcCdzIHVzZSBvZiBzdGF0aWMgU3RyaW5nQnVmZmVycyBpc24ndCB0aHJlYWQtc2FmZSBbSU8tMTM2XQoKRW5oYW5jZW1lbnRzIGZyb20gMS4zLjIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGaWxlVXRpbHMKICAtIEFkZCBhIGRlbGV0ZVF1aWV0bHkgbWV0aG9kIFtJTy0xMzVdCgotIEZpbGVuYW1lVXRpbHMKICAtIEFkZCBmaWxlIG5hbWUgZXh0ZW5zaW9uIHNlcGFyYXRvciBjb25zdGFudHNbSU8tMTQ5XQoKLSBJT0V4Y2VwdGlvbldpdGhDYXVzZSBbSU8tMTQ4XQogIC0gQWRkIGEgbmV3IElPRXhjZXB0aW9uIGltcGxlbWVudGF0aW9uIHdpdGggY29uc3RydWN0b3JzIHdoaWNoIHRha2UgYSBjYXVzZQoKLSBUZWVJbnB1dFN0cmVhbSBbSU8tMTI5XQogIC0gQWRkIG5ldyBUZWUgaW5wdXQgc3RyZWFtIGltcGxlbWVudGF0aW9uCgotIEZpbGVXcml0ZXJXaXRoRW5jb2RpbmcgW0lPLTE1M10KICAtIEFkZCBuZXcgRmlsZSBXcml0ZXIgaW1wbGVtZW50YXRpb24gdGhhdCBhY2NlcHRzIGFuIGVuY29kaW5nCgotIENoYXJTZXF1ZW5jZVJlYWRlciBbSU8tMTM4XQogIC0gQWRkIG5ldyBSZWFkZXIgaW1wbGVtZW50YXRpb24gdGhhdCBoYW5kbGVzIGFueSBDaGFyU2VxdWVuY2UgKFN0cmluZywKICAgIFN0cmluZ0J1ZmZlciwgU3RyaW5nQnVpbGRlciBvciBDaGFyQnVmZmVyKSAKCi0gVGhyZXNob2xkaW5nT3V0cHV0U3RyZWFtIFtJTy0xMjFdCiAgLSBBZGQgYSByZXNldCgpIG1ldGhvZCB3aGljaCBzZXRzIHRoZSBjb3VudCBvZiB0aGUgYnl0ZXMgd3JpdHRlbiBiYWNrIHRvIHplcm8uCgotIERlZmVycmVkRmlsZU91dHB1dFN0cmVhbSBbSU8tMTMwXQogIC0gQWRkIHN1cHBvcnQgZm9yIHRlbXBvcmFyeSBmaWxlcwoKLSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0KICAtIEFkZCBhIG5ldyB3cml0ZShJbnB1dFN0cmVhbSkgbWV0aG9kIFtJTy0xNTJdCgotIE5ldyBDbG9zZWQgSW5wdXQvT3V0cHV0IHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMgW0lPLTEyMl0KICAtIEF1dG9DbG9zZUlucHV0U3RyZWFtIC0gYXV0b21hdGljYWxseSBjbG9zZXMgYW5kIGRpc2NhcmRzIHRoZSB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbQogIC0gQ2xvc2VkSW5wdXRTdHJlYW0gLSByZXR1cm5zIC0xIGZvciBhbnkgcmVhZCBhdHRlbXB0cwogIC0gQ2xvc2VkT3V0cHV0U3RyZWFtIC0gdGhyb3dzIGFuIElPRXhjZXB0aW9uIGZvciBhbnkgd3JpdGUgYXR0ZW1wdHMKICAtIENsb3NlU2hpZWxkSW5wdXRTdHJlYW0gLSBwcmV2ZW50cyB0aGUgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0gZnJvbSBiZWluZyBjbG9zZWQuCiAgLSBDbG9zZVNoaWVsZE91dHB1dFN0cmVhbSAtIHByZXZlbnRzIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gZnJvbSBiZWluZyBjbG9zZWQuCgotIEFkZCBTaW5nbGV0b24gQ29uc3RhbnRzIHRvIHNldmVyYWwgc3RyZWFtIGNsYXNzZXMgW0lPLTE0M10KCi0gUHJlZml4RmlsZUZpbHRlciBbSU8tMTI2XQogIC0gQWRkIGZhY2lsaXR5IHRvIHNwZWNpZnkgY2FzZSBzZW5zaXRpdml0eSBvbiBwcmVmaXggbWF0Y2hpbmcKCi0gU3VmZml4RmlsZUZpbHRlciBbSU8tMTI2XQogIC0gQWRkIGZhY2lsaXR5IHRvIHNwZWNpZnkgY2FzZSBzZW5zaXRpdml0eSBvbiBzdWZmaXggbWF0Y2hpbmcKCi0gUmVnZXhGaWxlRmlsdGVyIFtJTy03NF0KICAtIEFkZCBuZXcgcmVndWxhciBleHByZXNzaW9uIGZpbGUgZmlsdGVyIGltcGxlbWVudGF0aW9uCgotIE1ha2UgSU9GaWxlRmlsdGVyIGltcGxlbWVudGF0aW9ucyBTZXJpYWxpemFibGUgW0lPLTEzMV0KCi0gSW1wcm92ZSBJT0ZpbGVGaWx0ZXIgdG9TdHJpbmcoKSBtZXRob2RzIFtJTy0xMjBdCgotIE1ha2UgZmllbGRzIGZpbmFsIHNvIGNsYXNzZXMgYXJlIGltbXV0YWJsZS90aHJlYWRzYWZlIFtJTy0xMzNdCiAgLSBjaGFuZ2VzIHRvIEFnZSwgRGVsZWdhdGUsIE5hbWUsIE5vdCwgUHJlZml4LCBSZWdleCwgU2l6ZSwgU3VmZml4IGFuZCBXaWxkY2FyZCBJT0ZpbGVGaWx0ZXIKICAgIGltcGxlbWVudGF0aW9ucy4KCi0gSU9DYXNlCiAgLSBBZGQgYSBjb21wYXJlIG1ldGhvZCB0byBJT0Nhc2UgW0lPLTE0NF0KCi0gQWRkIGEgcGFja2FnZSBvZiBqYXZhLnV0aWwuQ29tcGFyYXRvciBpbXBsZW1lbnRhdGlvbnMgZm9yIGZpbGVzIFtJTy0xNDVdCiAgLSBEZWZhdWx0RmlsZUNvbXBhcmF0b3IgLSBjb21wYXJlIGZpbGVzIHVzaW5nIHRoZSBkZWZhdWx0IEZpbGUuY29tcGFyZVRvKEZpbGUpIG1ldGhvZC4KICAtIEV4dGVuc2lvbkZpbGVDb21wYXJhdG9yIC0gY29tcGFyZXMgZmlsZXMgdXNpbmcgZmlsZSBuYW1lIGV4dGVuc2lvbnMuCiAgLSBMYXN0TW9kaWZpZWRGaWxlQ29tcGFyYXRvciAtIGNvbXBhcmVzIGZpbGVzIHVzaW5nIHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUvdGltZS4KICAtIE5hbWVGaWxlQ29tcGFyYXRvciAtIGNvbXBhcmVzIGZpbGVzIHVzaW5nIGZpbGUgbmFtZXMuCiAgLSBQYXRoRmlsZUNvbXBhcmF0b3IgLSBjb21wYXJlcyBmaWxlcyB1c2luZyBmaWxlIHBhdGhzLgogIC0gU2l6ZUZpbGVDb21wYXJhdG9yIC0gY29tcGFyZXMgZmlsZXMgdXNpbmcgZmlsZSBzaXplcy4KICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyBWZXJzaW9uIDEuMy4yCgpDb21wYXRpYmlsaXR5IHdpdGggMS4zLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaW5hcnkgY29tcGF0aWJsZSAtIFllcwoKU291cmNlIGNvbXBhdGlibGUgLSBZZXMKClNlbWFudGljIGNvbXBhdGlibGUgLSBZZXMKCkNvbXBhdGliaWxpdHkgd2l0aCAxLjMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaW5hcnkgY29tcGF0aWJsZSAtIE5vCiAgU2VlIFtJTy0xMTNdCgpTb3VyY2UgY29tcGF0aWJsZSAtIE5vCiAgU2VlIFtJTy0xMTNdCgpTZW1hbnRpYyBjb21wYXRpYmxlIC0gWWVzCgpFbmhhbmNlbWVudHMgc2luY2UgMS4zLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotIENyZWF0ZWQgdGhlIEZpbGVDbGVhbmluZ1RyYWNrZXIsIGJhc2ljYWxseSBhIG5vbi1zdGF0aWMgdmVyc2lvbiBvZiB0aGUKICBGaWxlQ2xlYW5lciwgd2hpY2ggY2FuIGJlIGNvbnRyb2xsZWQgYnkgdGhlIHVzZXIuIFtJTy0xMTZdCi0gVGhlIEZpbGVDbGVhbmVyIGlzIGRlcHJlY2F0ZWQuCgpCdWcgZml4ZXMgZnJvbSAxLjMuMQotLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBTb21lIHRlc3RzLCB3aGljaCBhcmUgaW1wbGljaXRseSBhc3N1bWluZyBhIFVuaXgtbGlrZSBmaWxlIHN5c3RlbSwgYXJlCiAgbm93IHNraXBwZWQgb24gV2luZG93cy4gW0lPLTExNV0KLSBFbmRpYW5VdGlscwogIC0gQm90aCByZWFkU3dhcHBlZFVuc2lnbmVkSW50ZWdlciguLi4pIG1ldGhvZHMgY291bGQgcmV0dXJuIG5lZ2F0aXZlIAogICAgbnVtYmVycyBkdWUgdG8gaW50L2xvbmcgY2FzdGluZy4gW0lPLTExN10KCkJ1ZyBmaXhlcyBmcm9tIDEuMwotLS0tLS0tLS0tLS0tLS0tLS0KCi0gRmlsZVV0aWxzCiAgLSBOUEUgaW4gb3Blbk91dHB1dFN0cmVhbShGaWxlKSB3aGVuIGZpbGUgaGFzIG5vIHBhcmVudCBpbiBwYXRoIFtJTy0xMTJdCiAgLSByZWFkRmlsZVRvU3RyaW5nKEZpbGUpIGlzIG5vdCBzdGF0aWMgW0lPLTExM10KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAxLjMuMQoKQ29tcGF0aWJpbGl0eSB3aXRoIDEuMwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpbmFyeSBjb21wYXRpYmxlIC0gTm8KICBTZWUgW0lPLTExM10KClNvdXJjZSBjb21wYXRpYmxlIC0gTm8KICBTZWUgW0lPLTExM10KClNlbWFudGljIGNvbXBhdGlibGUgLSBZZXMKCkJ1ZyBmaXhlcyBmcm9tIDEuMwotLS0tLS0tLS0tLS0tLS0tLS0KCi0gRmlsZVV0aWxzCiAgLSBOUEUgaW4gb3Blbk91dHB1dFN0cmVhbShGaWxlKSB3aGVuIGZpbGUgaGFzIG5vIHBhcmVudCBpbiBwYXRoIFtJTy0xMTJdCiAgLSByZWFkRmlsZVRvU3RyaW5nKEZpbGUpIGlzIG5vdCBzdGF0aWMgW0lPLTExM10KICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyBWZXJzaW9uIDEuMwoKQ29tcGF0aWJpbGl0eSB3aXRoIDEuMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpbmFyeSBjb21wYXRpYmxlIC0gWWVzCgpTb3VyY2UgY29tcGF0aWJsZSAtIFllcwoKU2VtYW50aWMgY29tcGF0aWJsZSAtIFllcwogIENoZWNrIHRoZSBidWcgZml4ZXMgc2VjdGlvbiBmb3Igc2VtYW50aWMgYnVnIGZpeGVzCgpEZXByZWNhdGlvbnMgZnJvbSAxLjIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gV2lsZGNhcmRGaWx0ZXIgZGVwcmVjYXRlZCwgcmVwbGFjZWQgYnkgV2lsZGNhcmRGaWxlRmlsdGVyCiAgLSBvbGQgY2xhc3Mgb25seSBhY2NlcHRlZCBmaWxlcywgdGh1cyBoYWQgYSBjb25mdXNpbmcgZHVhbCBwdXJwb3NlCgotIEZpbGVTeXN0ZW1VdGlscy5mcmVlU3BhY2UgZGVwcmVjYXRlZCwgcmVwbGFjZWQgYnkgZnJlZVNwYWNlS2IKICAtIGZyZWVTcGFjZSByZXR1cm5zIGEgcmVzdWx0IHRoYXQgdmFyaWVzIGJ5IG9wZXJhdGluZyBzeXN0ZW0gYW5kCiAgICB0aHVzIGlzbid0IHRoYXQgdXNlZnVsCiAgLSBmcmVlU3BhY2VLYiByZXR1cm5zIG11Y2ggYmV0dGVyIGFuZCBtb3JlIGNvbnNpc3RlbnQgcmVzdWx0cwogIC0gZnJlZVNwYWNlS2IgZXhpc3RlZCBpbiB2MS4yLCBzbyB0aGlzIGlzIGEgZ2VudGxlIGN1dG92ZXIKCkJ1ZyBmaXhlcyBmcm9tIDEuMgotLS0tLS0tLS0tLS0tLS0tLS0KLSBMaW5lSXRlcmF0b3Igbm93IGltcGxlbWVudHMgSXRlcmF0b3IKICAtIEl0IHdhcyBhbHdheXMgc3VwcG9zZWQgdG8uLi4KCi0gRmlsZVN5c3RlbVV0aWxzLmZyZWVTcGFjZS9mcmVlU3BhY2VLYiBbSU8tODNdCiAgLSBUaGVzZSBzaG91bGQgbm93IHdvcmsgb24gQUlYIGFuZCBIUC1VWAoKLSBGaWxlU3lzdGVtVXRpbHMuZnJlZVNwYWNlL2ZyZWVTcGFjZUtiIFtJTy05MF0KICAtIEF2b2lkIGluZmluaXRlIGxvb3BpbmcgaW4gV2luZG93cwogIC0gQ2F0Y2ggbW9yZSBlcnJvcnMgd2l0aCBuaWNlIG1lc3NhZ2VzCgotIEZpbGVTeXN0ZW1VdGlscy5mcmVlU3BhY2UgW0lPLTkxXQogIC0gVGhpcyBpcyBub3cgZG9jdW1lbnRlZCBub3QgdG8gd29yayBvbiBTdW5PUyA1CgotIEZpbGVTeXN0ZW1VdGlscyBbSU8tOTNdCiAgLSBGaXhlZCByZXNvdXJjZSBsZWFrIGxlYWRpbmcgdG8gJ1RvbyBtYW55IG9wZW4gZmlsZXMnIGVycm9yCiAgLSBQcmV2aW91c2x5IGRpZCBub3QgZGVzdHJveSBQcm9jZXNzIGluc3RhbmNlcyAoYXMgSkRLIEphdmFkb2MgaXMgc28gcG9vcikKICAtIGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTQ4MDEwMjcKCi0gRmlsZVV0aWxzLnRvdWNoIFtJTy0xMDBdCiAgLSBUaGUgdG91Y2ggbWV0aG9kIHByZXZpb3VzbHkgZ2F2ZSBubyBpbmRpY2F0aW9uIHdoZW4gdGhlIGZpbGUgY291bGQgbm90CiAgICBiZSB0b3VjaGVkIHN1Y2Nlc3NmdWxseSAoc3VjaCBhcyBkdWUgdG8gYWNjZXNzIHJlc3RyaWN0aW9ucykgLSBpdCBub3cKICAgIHRocm93cyBhbiBJT0V4Y2VwdGlvbiBpZiB0aGUgbGFzdCBtb2RpZmllZCBkYXRlIGNhbm5vdCBiZSBjaGFuZ2VkCgotIEZpbGVDbGVhbmVyCiAgLSBUaGlzIG5vdyBoYW5kbGVzIHRoZSBzaXR1YXRpb24gd2hlcmUgYW4gZXJyb3Igb2NjdXJzIHdoZW4gZGVsZXRpbmcgdGhlIGZpbGUKCi0gSU9VdGlscy5jb3B5IFtJTy04NF0KICAtIENvcHkgbWV0aG9kcyBjb3VsZCByZXR1cm4gaW5hY2N1cmF0ZSBieXRlL2NoYXIgY291bnQgZm9yIGxhcmdlIHN0cmVhbXMKICAtIFRoZSBjb3B5KElucHV0U3RyZWFtLCBPdXRwdXRTdHJlYW0pIG1ldGhvZCBub3cgcmV0dXJucyAtMSBpZiB0aGUgY291bnQgaXMgZ3JlYXRlciB0aGFuIGFuIGludAogIC0gVGhlIGNvcHkoUmVhZGVyLCBXcml0ZXIpIG1ldGhvZCBub3cgdGhyb3dzIG5vdyByZXR1cm5zIC0xIGlmIHRoZSBjb3VudCBpcyBncmVhdGVyIHRoYW4gYW4gaW50CiAgLSBBZGRlZCBhIG5ldyBjb3B5TGFyZ2UoSW5wdXRTdHJlYW0sIE91dHB1dFN0cmVhbSkgbWV0aG9kIHRoYXQgcmV0dXJucyBhIGxvbmcKICAtIEFkZGVkIGEgbmV3IGNvcHlMYXJnZShSZWFkZXIsIFdyaXRlcikgbWV0aG9kIHRoYXQgcmV0dXJucyBhIGxvbmcKCi0gQ291bnRpbmdJbnB1dFN0cmVhbS9Db3VudGluZ091dHB1dFN0cmVhbSBbSU8tODRdCiAgLSBNZXRob2RzIHdlcmUgZGVjbGFyZWQgYXMgaW50IHRodXMgdGhlIGNvdW50IHdhcyBpbmFjY3VyYXRlIGZvciBsYXJnZSBzdHJlYW1zCiAgLSBuZXcgbG9uZyBiYXNlZCBtZXRob2RzIGdldEJ5dGVDb3VudCgpL3Jlc2V0Qnl0ZUNvdW50KCkgYWRkZWQKICAtIGV4aXN0aW5nIG1ldGhvZHMgY2hhbmdlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiBhbiBpbnQKCi0gRmlsZUJhc2VkVGVzdENhc2UKICAtIEZpeGVkIGJ1ZyBpbiBjb21wYXJlIGNvbnRlbnQgbWV0aG9kcyBpZGVudGlmaWVkIGJ5IEdOVSBjbGFzc3BhdGgKCi0gRW5kaWFuVXRpbHMud3JpdGVTd2FwcGVkTG9uZyhieXRlW10sIGludCkgW0lPLTEwMV0KICAtIEFuIGludCBvdmVycnVuIGluIHRoZSBiaXQgc2hpZnRpbmcgd2hlbiBpdCBzaG91bGQgaGF2ZSBiZWVuIGEgbG9uZwoKLSBFbmRpYW5VdGlscy53cml0ZVN3YXBwZWRMb25nKElucHV0U3RyZWFtKSBbSU8tMTAyXQogIC0gVGhlIHJldHVybiBvZiBpbnB1dC5yZWFkKGJ5dGVbXSkgd2FzIG5vdCBiZWluZyBjaGVja2VkIHRvIGVuc3VyZSBhbGwgOCBieXRlcyB3ZXJlIHJlYWQKCkVuaGFuY2VtZW50cyBmcm9tIDEuMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBEaXJlY3RvcnlXYWxrZXIgW0lPLTg2XQogIC0gTmV3IGNsYXNzIGRlc2lnbmVkIGZvciBzdWJjbGFzc2luZyB0byB3YWxrIHRocm91Z2ggYSBzZXQgb2YgZmlsZXMuCiAgICBEaXJlY3RvcnlXYWxrZXIgcHJvdmlkZXMgdGhlIHdhbGsgb2YgdGhlIGRpcmVjdG9yaWVzLCBmaWx0ZXJpbmcgb2YKICAgIGRpcmVjdG9yaWVzIGFuZCBmaWxlcywgYW5kIGNhbmNlbGxhdGlvbiBzdXBwb3J0LiBUaGUgc3ViY2xhc3MgbXVzdCBwcm92aWRlCiAgICB0aGUgc3BlY2lmaWMgYmVoYXZpb3IsIHN1Y2ggYXMgdGV4dCBzZWFyY2hpbmcgb3IgaW1hZ2UgcHJvY2Vzc2luZy4KCi0gSU9DYXNlCiAgLSBOZXcgY2xhc3MvZW51bWVyYXRpb24gZm9yIGNhc2Utc2Vuc2l0aXZpdHkgY29udHJvbAoKLSBGaWxlbmFtZVV0aWxzCiAgLSBOZXcgbWV0aG9kcyB0byBoYW5kbGUgY2FzZS1zZW5zaXRpdml0eQogIC0gd2lsZGNhcmRNYXRjaCAtIG5ldyBtZXRob2QgdGhhdCBoYXMgSU9DYXNlIGFzIGEgcGFyYW1ldGVyCiAgLSBlcXVhbHMgLSBuZXcgbWV0aG9kIHRoYXQgaGFzIElPQ2FzZSBhcyBhIHBhcmFtZXRlcgoKLSBGaWxlVXRpbHMgW0lPLTEwOF0gLSBuZXcgZGVmYXVsdCBlbmNvZGluZyBtZXRob2RzIGZvcjoKICAtIHJlYWRGaWxlVG9TdHJpbmcoRmlsZSkKICAtIHJlYWRMaW5lcyhGaWxlKQogIC0gbGluZUl0ZXJhdG9yKEZpbGUpCiAgLSB3cml0ZVN0cmluZ1RvRmlsZShGaWxlLCBTdHJpbmcpCiAgLSB3cml0ZUxpbmVzKEZpbGUsIENvbGxlY3Rpb24pCiAgLSB3cml0ZUxpbmVzKEZpbGUsIENvbGxlY3Rpb24sIFN0cmluZykKCi0gRmlsZVV0aWxzLm9wZW5PdXRwdXRTdHJlYW0gIFtJTy0xMDddCiAgLSBuZXcgbWV0aG9kIHRvIG9wZW4gYSBGaWxlT3V0cHV0U3RyZWFtLCBjcmVhdGluZyBwYXJlbnQgZGlyZWN0b3JpZXMgaWYgcmVxdWlyZWQKLSBGaWxlVXRpbHMudG91Y2gKLSBGaWxlVXRpbHMuY29weVVSTFRvRmlsZQotIEZpbGVVdGlscy53cml0ZVN0cmluZ1RvRmlsZQotIEZpbGVVdGlscy53cml0ZUJ5dGVBcnJheVRvRmlsZQotIEZpbGVVdGlscy53cml0ZUxpbmVzCiAgLSBlbmhhbmNlZCB0byBjcmVhdGUgcGFyZW50IGRpcmVjdG9yaWVzIGlmIHJlcXVpcmVkCi0gRmlsZVV0aWxzLm9wZW5JbnB1dFN0cmVhbSAgW0lPLTEwN10KICAtIG5ldyBtZXRob2QgdG8gb3BlbiBhIEZpbGVJbnB1dFN0cmVhbSwgcHJvdmlkaW5nIGJldHRlciBlcnJvciBtZXNzYWdlcyB0aGFuIHRoZSBKREsKCi0gRmlsZVV0aWxzLmlzRmlsZU9sZGVyCiAgLSBuZXcgbWV0aG9kcyB0byBjaGVjayBpZiBhIGZpbGUgaXMgb2xkZXIgKGkuZS4gaXNGaWxlT2xkZXIoKSkgLSBjb3VudGVycGFydHMKICAgIHRvIHRoZSBleGlzdGluZyBpc0ZpbGVOZXdlcigpIG1ldGhvZHMuCgotIEZpbGVVdGlscy5jaGVja3N1bSwgRmlsZVV0aWxzLmNoZWNrc3VtQ1JDMzIKICAtIG5ldyBtZXRob2RzIHRvIGNyZWF0ZSBhIGNoZWNrc3VtIG9mIGEgZmlsZQoKLSBGaWxlVXRpbHMuY29weUZpbGVUb0RpcmVjdG9yeSAgW0lPLTEwNF0KICAtIG5ldyB2YXJpYW50IHRoYXQgb3B0aW9uYWxseSByZXRhaW5zIHRoZSBmaWxlIGRhdGUKCi0gRmlsZURlbGV0ZVN0cmF0ZWd5Ci0gRmlsZUNsZWFuZXIgICAgW0lPLTU2LElPLTcwXQogIC0gRmlsZURlbGV0ZVN0cmF0ZWd5IGlzIGEgc3RyYXRlZ3kgZm9yIGhhbmRsaW5nIGZpbGUgZGVsZXRpb24KICAtIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBjYWxsYmFjayBpbiBGaWxlQ2xlYW5lcgogIC0gVG9nZXRoZXIgdGhlc2UgYWxsb3cgRmlsZUNsZWFuZXIgdG8gZG8gYSBmb3JjZURlbGV0ZSB0byBraWxsIGRpcmVjdG9yaWVzCgotIEZpbGVDbGVhbmVyLmV4aXRXaGVuRmluaXNoZWQgW0lPLTk5XQogIC0gQSBuZXcgbWV0aG9kIHRoYXQgYWxsb3dzIHRoZSBpbnRlcm5hbCBjbGVhbmVyIHRocmVhZCB0byBiZSBjbGVhbmx5IHRlcm1pbmF0ZWQKCi0gV2lsZGNhcmRGaWxlRmlsdGVyCiAgLSBSZXBsYWNlbWVudCBmb3IgV2lsZGNhcmRGaWx0ZXIKICAtIEFjY2VwdHMgYm90aCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKICAtIEFiaWxpdHkgdG8gY29udHJvbCBjYXNlLXNlbnNpdGl2aXR5CgotIE5hbWVGaWxlRmlsdGVyCiAgLSBBYmlsaXR5IHRvIGNvbnRyb2wgY2FzZS1zZW5zaXRpdml0eQoKLSBGaWxlRmlsZUZpbHRlcgogIC0gTmV3IElPRmlsZUZpbHRlciBpbXBsZW1lbnRhdGlvbgogIC0gQWNjZXB0cyBmaWxlcyB3aGVyZSBGaWxlLmlzRmlsZSgpIGlzIHRydWUKICAtIEluIG90aGVyIHdvcmRzIGl0IGZpbHRlcnMgb3V0IGRpcmVjdG9yaWVzCiAgLSBTaW5nbGV0b24gaW5zdGFuY2UgcHJvdmlkZWQgKEZJTEUpCgotIENhblJlYWRGaWxlRmlsdGVyCiAgLSBOZXcgSU9GaWxlRmlsdGVyIGltcGxlbWVudGF0aW9uCiAgLSBBY2NlcHRzIGZpbGVzIHdoZXJlIEZpbGUuY2FuUmVhZCgpIGlzIHRydWUKICAtIFNpbmdsZXRvbiBpbnN0YW5jZXMgcHJvdmlkZWQgKENBTl9SRUFEL0NBTk5PVF9SRUFEL1JFQURfT05MWSkKCi0gQ2FuV3JpdGVGaWxlRmlsdGVyCiAgLSBOZXcgSU9GaWxlRmlsdGVyIGltcGxlbWVudGF0aW9uCiAgLSBBY2NlcHRzIGZpbGVzIHdoZXJlIEZpbGUuY2FuV3JpdGUoKSBpcyB0cnVlCiAgLSBTaW5nbGV0b24gaW5zdGFuY2VzIHByb3ZpZGVkIChDQU5fV1JJVEUvQ0FOTk9UX1dSSVRFKQoKLSBIaWRkZW5GaWxlRmlsdGVyCiAgLSBOZXcgSU9GaWxlRmlsdGVyIGltcGxlbWVudGF0aW9uCiAgLSBBY2NlcHRzIGZpbGVzIHdoZXJlIEZpbGUuaXNIaWRkZW4oKSBpcyB0cnVlCiAgLSBTaW5nbGV0b24gaW5zdGFuY2VzIHByb3ZpZGVkIChISURERU4vVklTSUJMRSkKCi0gRW1wdHlGaWxlRmlsdGVyCiAgLSBOZXcgSU9GaWxlRmlsdGVyIGltcGxlbWVudGF0aW9uCiAgLSBBY2NlcHRzIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGVtcHR5CiAgLSBTaW5nbGV0b24gaW5zdGFuY2VzIHByb3ZpZGVkIChFTVBUWS9OT1RfRU1QVFkpCgotIFRydWVGaWxlRmlsdGVyL0ZhbHNlRmlsZUZpbHRlci9EaXJlY3RvcnlGaWxlRmlsdGVyCiAgLSBOZXcgc2luZ2xldG9uIGluc3RhbmNlIGNvbnN0YW50cyAoVFJVRS9GQUxTRS9ESVJFQ1RPUlkpCiAgLSBUaGUgbmV3IGNvbnN0YW50cyBhcmUgbW9yZSBKYXZhIDUgZnJpZW5kbHkgd2l0aCByZWdhcmRzIHRvIHN0YXRpYyBpbXBvcnRzCiAgICAod2hlcmVhcyBpZiBldmVyeXRoaW5nIHVzZXMgSU5TVEFOQ0UsIHRoZW4gdGhleSBqdXN0IGNsYXNoKQogIC0gVGhlIG9sZCBJTlNUQU5DRSBjb25zdGFudHMgYXJlIHN0aWxsIHByZXNlbnQgYW5kIGhhdmUgbm90IGJlZW4gZGVwcmVjYXRlZAoKLSBGaWxlRmlsdGVyVXRpbHMuc2l6ZVJhbmdlRmlsZUZpbHRlcgogIC0gbmV3IHNpemVSYW5nZUZpbGVGaWx0ZXIobG9uZyBtaW5pbXVtU2l6ZSwgbG9uZyBtYXhpbXVtU2l6ZSkgbWV0aG9kIHdoaWNoIAogICAgY3JlYXRlcyBhIGZpbHRlciB0aGF0IGFjY2VwdHMgZmlsZXMgd2l0aGluIHRoZSBzcGVjaWZpZWQgc2l6ZSByYW5nZS4KCi0gRmlsZUZpbHRlclV0aWxzLm1ha2VEaXJlY3RvcnlPbmx5L21ha2VGaWxlT25seQogIC0gdHdvIG5ldyBtZXRob2RzIHRoYXQgZGVjb3JhdGUgYSBmaWxlIGZpbHRlciB0byBtYWtlIGl0IGFwcGx5IHRvCiAgICBkaXJlY3RvcmllcyBvbmx5IG9yIGZpbGVzIG9ubHkKCi0gTnVsbFdyaXRlcgogIC0gTmV3IHdyaXRlciB0aGF0IGFjdHMgYXMgYSBzaW5rIGZvciBhbGwgZGF0YSwgYXMgcGVyIC9kZXYvbnVsbAoKLSBOdWxsSW5wdXRTdHJlYW0KICAtIE5ldyBpbnB1dCBzdHJlYW0gdGhhdCBlbXVsYXRlcyBhIHN0cmVhbSBvZiBhIHNwZWNpZmllZCBzaXplCgotIE51bGxSZWFkZXIKICAtIE5ldyByZWFkZXIgdGhhdCBlbXVsYXRlcyBhIHJlYWRlciBvZiBhIHNwZWNpZmllZCBzaXplCgotIEJ5dGVBcnJheU91dHB1dFN0cmVhbSAgW0lPLTk3XQogIC0gUGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMS4yCgpDb21wYXRpYmlsaXR5IHdpdGggMS4xCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQmluYXJ5IGNvbXBhdGlibGUgLSBZZXMKClNvdXJjZSBjb21wYXRpYmxlIC0gWWVzCgpTZW1hbnRpYyBjb21wYXRpYmxlIC0gWWVzCgpEZXByZWNhdGlvbnMgZnJvbSAxLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpCdWcgZml4ZXMgZnJvbSAxLjEKLS0tLS0tLS0tLS0tLS0tLS0tCi0gRmlsZVN5c3RlbVV0aWxzLmZyZWVTcGFjZShkcml2ZSkKICBGaXggdG8gYWxsb3cgV2luZG93cyBiYXNlZCBjb21tYW5kIHRvIGZ1bmN0aW9uIGluIEZyZW5jaCBsb2NhbGUKCi0gRmlsZVV0aWxzLnJlYWQqCiAgSW5jcmVhc2UgY2VydGFpbnR5IHRoYXQgZmlsZXMgYXJlIGNsb3NlZCBpbiBjYXNlIG9mIGVycm9yCgotIExvY2thYmxlRmlsZVdyaXRlcgogIExvY2tpbmcgbWVjaGFuaXNtIHdhcyBicm9rZW4gYW5kIG9ubHkgcHJvdmlkZWQgbGltaXRlZCBwcm90ZWN0aW9uIFszODk0Ml0KICBGaWxlIGRlbGV0aW9uIGFuZCBsb2NraW5nIGluIGNhc2Ugb2YgY29uc3RydWN0b3IgZXJyb3Igd2FzIGJyb2tlbgoKRW5oYW5jZW1lbnRzIGZyb20gMS4xCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEFnZUZpbGVGaWx0ZXIvU2l6ZUZpbGVGaWx0ZXIKICBOZXcgZmlsZSBmaWx0ZXJzIHRoYXQgY29tcGFyZXMgYWdhaW5zdCB0aGUgYWdlIGFuZCBzaXplIG9mIHRoZSBmaWxlCgotIEZpbGVTeXN0ZW1VdGlscy5mcmVlU3BhY2VLYihkcml2ZSkKICBOZXcgbWV0aG9kIHRoYXQgdW5pZmllcyByZXN1bHQgdG8gYmUgaW4ga2lsb2J5dGVzIFszODU3NF0KCi0gRmlsZVV0aWxzLmNvbnRlbnRFcXVhbHMoRmlsZSxGaWxlKQogIFBlcmZvcm1hbmNlIGltcHJvdmVkIGJ5IGFkZGluZyBsZW5ndGggYW5kIGZpbGUgbG9jYXRpb24gY2hlY2tpbmcKCi0gRmlsZVV0aWxzLml0ZXJhdGVGaWxlcwogIFR3byBuZXcgbWV0aG9kIHRvIHByb3ZpZGUgZGlyZWN0IGFjY2VzcyB0byBpdGVyYXRvcnMgb3ZlciBmaWxlcwoKLSBGaWxlVXRpbHMubGluZUl0ZXJhdG9yCiAgSU9VdGlscy5saW5lSXRlcmF0b3IKICBOZXcgbWV0aG9kcyB0byBwcm92aWRlIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGxpbmVzIGluIGEgZmlsZSBbMzgwODNdCgotIEZpbGVVdGlscy5jb3B5RGlyZWN0b3J5VG9EaXJlY3RvcnkKICBOZXcgbWV0aG9kIHRvIGNvcHkgYSBkaXJlY3RvcnkgdG8gd2l0aGluIGFub3RoZXIgZGlyZWN0b3J5IFszNjMxNV0KICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyBWZXJzaW9uIDEuMQoKSW5jb21wYXRpYmxlIGNoYW5nZXMgZnJvbSAxLjAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQmluYXJ5IGNvbXBhdGlibGUgLSBZZXMKClNvdXJjZSBjb21wYXRpYmxlIC0gWWVzCgpTZW1hbnRpYyBjb21wYXRpYmxlIC0gWWVzLCBleGNlcHQ6Ci0gRmlsZVV0aWxzLndyaXRlU3RyaW5nVG9GaWxlKCkKICAgIEEgbnVsbCBlbmNvZGluZyBwcmV2aW91c2x5IHVzZWQgJ0lTTy04ODU5LTEnLCBub3cgaXQgdXNlcyB0aGUgcGxhdGZvcm0gZGVmYXVsdAogICAgR2VuZXJhbGx5IHRoaXMgd2lsbCBtYWtlIG5vIGRpZmZlcmVuY2UKCi0gTG9ja2FibGVGaWxlV3JpdGVyCiAgICBJbXByb3ZlZCB2YWxpZGF0aW9uIGFuZCBub3cgY3JlYXRlIGRpcmVjdG9yaWVzIGlmIG5lY2Vzc2FyeQoKcGx1cyB0aGVzZSBidWcgZml4ZXMgbWF5IGFmZmVjdCB5b3Ugc2VtYW50aWNhbGx5OgotIEZpbGVVdGlscy50b3VjaCgpICAoQnVnIGZpeCAyOTgyMSkKICAgIE5vdyBjcmVhdGVzIHRoZSBmaWxlIGlmIGl0IGRpZCBub3QgcHJldmlvdXNseSBleGlzdAoKLSBGaWxlVXRpbHMudG9GaWxlKFVSTCkgKEJ1ZyBmaXggMzI1NzUpCiAgICBOb3cgaGFuZGxlcyBlc2NhcGUgc3ludGF4IHN1Y2ggYXMgJTIwCgotIEZpbGVVdGlscy5zaXplT2ZEaXJlY3RvcnkoKSAgKEJ1ZyBmaXggMzY4MDEpCiAgICBNYXkgbm93IHJldHVybiBhIHNpemUgb2YgMCBpZiB0aGUgZGlyZWN0b3J5IGlzIHNlY3VyaXR5IHJlc3RyaWN0ZWQKCkRlcHJlY2F0aW9ucyBmcm9tIDEuMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBDb3B5VXRpbHMgaGFzIGJlZW4gZGVwcmVjYXRlZC4KICAgIEl0cyBtZXRob2RzIGhhdmUgYmVlbiBtb3ZlZCB0byBJT1V0aWxzLgogICAgVGhlIG5ldyBJT1V0aWxzIG1ldGhvZHMgaGFuZGxlIG51bGxzIGJldHRlciwgYW5kIGhhdmUgY2xlYXJlciBuYW1lcy4KCi0gSU9VdGlscy50b0J5dGVBcnJheShTdHJpbmcpIC0gVXNlIHtAbGluayBTdHJpbmcjZ2V0Qnl0ZXMoKX0KLSBJT1V0aWxzLnRvU3RyaW5nKGJ5dGVbXSkgLSBVc2Uge0BsaW5rIFN0cmluZyNTdHJpbmcoYnl0ZVtdKX0KLSBJT1V0aWxzLnRvU3RyaW5nKGJ5dGVbXSxTdHJpbmcpIC0gVXNlIHtAbGluayBTdHJpbmcjU3RyaW5nKGJ5dGVbXSxTdHJpbmcpfQoKQnVnIGZpeGVzIGZyb20gMS4wCi0tLS0tLS0tLS0tLS0tLS0tLQotIEZpbGVVdGlscyAtIHRvdWNoKCkgIFsyOTgyMV0KICAgIE5vdyBjcmVhdGVzIHRoZSBmaWxlIGlmIGl0IGRpZCBub3QgcHJldmlvdXNseSBleGlzdAoKLSBGaWxlVXRpbHMgLSB0b0ZpbGUoVVJMKSAgWzMyNTc1XQogICAgTm93IGhhbmRsZXMgZXNjYXBlIHN5bnRheCBzdWNoIGFzICUyMAoKLSBGaWxlRmlsdGVyVXRpbHMgLSBtYWtlQ1ZTQXdhcmUoSU9GaWxlRmlsdGVyKSAgWzMzMDIzXQogICAgRml4ZWQgYnVnIHRoYXQgY2F1c2VkIG1ldGhvZCB0byBiZSBjb21wbGV0ZWx5IGJyb2tlbgoKLSBDb3VudGluZ0lucHV0U3RyZWFtICBbMzMzMzZdCiAgICBGaXhlZCBidWcgdGhhdCBjYXVzZWQgdGhlIGNvdW50IHRvIHJlZHVjZSBieSBvbmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCgotIENvdW50aW5nSW5wdXRTdHJlYW0gLSBza2lwKGxvbmcpICBbMzQzMTFdCiAgICBCeXRlcyBmcm9tIGNhbGxzIHRvIHRoaXMgbWV0aG9kIHdlcmUgbm90IHByZXZpb3VzbHkgY291bnRlZAoKLSBOdWxsT3V0cHV0U3RyZWFtICBbMzM0ODFdCiAgICBSZW1vdmUgdW5uZWNlc3Nhcnkgc3luY2hyb25pemF0aW9uCgotIEFic3RyYWN0RmlsZUZpbHRlciAtIGFjY2VwdChGaWxlLCBTdHJpbmcpICBbMzA5OTJdCiAgICBGaXhlZCBicm9rZW4gaW1wbGVtZW50YXRpb24KCi0gRmlsZVV0aWxzICBbMzY4MDFdCiAgICBQcmV2aW91c2x5IHRocmV3IE5QRSB3aGVuIGxpc3RpbmcgZmlsZXMgaW4gYSBzZWN1cml0eSByZXN0cmljdGVkIGRpcmVjdG9yeQogICAgTm93IHRocm93IElPRXhjZXB0aW9uIHdpdGggYSBiZXR0ZXIgbWVzc2FnZQoKLSBGaWxlVXRpbHMgLSB3cml0ZVN0cmluZ1RvRmlsZSgpCiAgICBOdWxsIGVuY29kaW5nIG5vdyBjb3JyZWN0bHkgdXNlcyB0aGUgcGxhdGZvcm0gZGVmYXVsdAoKRW5oYW5jZW1lbnRzIGZyb20gMS4wCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZpbGVuYW1lVXRpbHMgLSBuZXcgY2xhc3MgIFszMzMwMywyOTM1MV0KICAgIEEgc3RhdGljIHV0aWxpdHkgY2xhc3MgZm9yIHdvcmtpbmcgd2l0aCBmaWxlbmFtZXMKICAgIFNlZWtzIHRvIGVhc2UgdGhlIHBhaW4gb2YgZGV2ZWxvcGluZyBvbiBXaW5kb3dzIGFuZCBkZXBsb3lpbmcgb24gVW5peAoKLSBGaWxlU3lzdGVtVXRpbHMgLSBuZXcgY2xhc3MgIFszMjk4MiwzNjMyNV0KICAgIEEgc3RhdGljIHV0aWxpdHkgY2xhc3MgZm9yIHdvcmtpbmcgd2l0aCBmaWxlIHN5c3RlbXMKICAgIFByb3ZpZGVzIG9uZSBtZXRob2QgYXQgcHJlc2VudCwgdG8gZ2V0IHRoZSBmcmVlIHNwYWNlIG9uIHRoZSBmaWxpbmcgc3lzdGVtCgotIElPVXRpbHMgLSBuZXcgcHVibGljIGNvbnN0YW50cwogICAgQ29uc3RhbnRzIGZvciBkaXJlY3RvcnkgYW5kIGxpbmUgc2VwYXJhdG9ycyBvbiBXaW5kb3dzIGFuZCBVbml4CgotIElPVXRpbHMgLSB0b0J5dGVBcnJheShSZWFkZXIsZW5jb2RpbmcpCiAgICBIYW5kbGVzIGVuY29kaW5ncyB3aGVuIHJlYWRpbmcgdG8gYSBieXRlIGFycmF5CgotIElPVXRpbHMgLSB0b0NoYXJBcnJheShJbnB1dFN0cmVhbSkgIFsyODk3OV0KICAgICAgICAgIC0gdG9DaGFyQXJyYXkoSW5wdXRTdHJlYW0sZW5jb2RpbmcpCiAgICAgICAgICAtIHRvQ2hhckFycmF5KFJlYWRlcikKICAgIFJlYWRzIGEgc3RyZWFtL3JlYWRlciBpbnRvIGEgY2hhcmFjdGVyIGFycmF5CgotIElPVXRpbHMgLSByZWFkTGluZXMoSW5wdXRTdHJlYW0pICBbMzYyMTRdCiAgICAgICAgICAtIHJlYWRMaW5lcyhJbnB1dFN0cmVhbSxlbmNvZGluZykKICAgICAgICAgIC0gcmVhZExpbmVzKFJlYWRlcikKICAgIFJlYWRzIGEgc3RyZWFtL3JlYWRlciBsaW5lIGJ5IGxpbmUgaW50byBhIExpc3Qgb2YgU3RyaW5ncwoKLSBJT1V0aWxzIC0gdG9JbnB1dFN0cmVhbShTdHJpbmcpICBbMzI5NThdCiAgICAgICAgICAtIHRvSW5wdXRTdHJlYW0oU3RyaW5nLGVuY29kaW5nKQogICAgQ3JlYXRlcyBhbiBpbnB1dCBzdHJlYW0gdGhhdCB1c2VzIHRoZSBzdHJpbmcgYXMgYSBzb3VyY2Ugb2YgZGF0YQoKLSBJT1V0aWxzIC0gd3JpdGVMaW5lcyhDb2xsZWN0aW9uLGxpbmVFbmRpbmcsT3V0cHV0U3RyZWFtKSAgWzM2MjE0XQogICAgICAgICAgLSB3cml0ZUxpbmVzKENvbGxlY3Rpb24sbGluZUVuZGluZyxPdXRwdXRTdHJlYW0sZW5jb2RpbmcpCiAgICAgICAgICAtIHdyaXRlTGluZXMoQ29sbGVjdGlvbixsaW5lRW5kaW5nLFdyaXRlcikKICAgIFdyaXRlcyBhIGNvbGxlY3Rpb24gdG8gYSBzdHJlYW0vd3JpdGVyIGxpbmUgYnkgbGluZQoKLSBJT1V0aWxzIC0gd3JpdGUoLi4uKQogICAgV3JpdGUgZGF0YSB0byBhIHN0cmVhbS93cml0ZXIgKG1vdmVkIGZyb20gQ29weVV0aWxzIHdpdGggYmV0dGVyIG51bGwgaGFuZGxpbmcpCgotIElPVXRpbHMgLSBjb3B5KC4uLikKICAgIENvcHkgZGF0YSBiZXR3ZWVuIHN0cmVhbXMgKG1vdmVkIGZyb20gQ29weVV0aWxzIHdpdGggYmV0dGVyIG51bGwgaGFuZGxpbmcpCgotIElPVXRpbHMgLSBjb250ZW50RXF1YWxzKFJlYWRlcixSZWFkZXIpCiAgICBNZXRob2QgdG8gY29tcGFyZSB0aGUgY29udGVudHMgb2YgdHdvIHJlYWRlcnMKCi0gRmlsZVV0aWxzIC0gdG9GaWxlcyhVUkxbXSkKICAgIENvbnZlcnRzIGFuIGFycmF5IG9mIFVSTHMgdG8gYW4gYXJyYXkgb2YgRmlsZXMKCi0gRmlsZVV0aWxzIC0gY29weURpcmVjdG9yeSgpICBbMzI5NDRdCiAgICBOZXcgbWV0aG9kcyB0byBjb3B5IGEgZGlyZWN0b3J5CgotIEZpbGVVdGlscyAtIHJlYWRGaWxlVG9CeXRlQXJyYXkoRmlsZSkKICAgIFJlYWRzIGFuIGVudGlyZSBmaWxlIGludG8gYSBieXRlIGFycmF5CgotIEZpbGVVdGlscyAtIHdyaXRlQnl0ZUFycmF5VG9GaWxlKEZpbGUsYnl0ZVtdKQogICAgV3JpdGVzIGEgYnl0ZSBhcnJheSB0byBhIGZpbGUKCi0gRmlsZVV0aWxzIC0gcmVhZExpbmVzKEZpbGUsZW5jb2RpbmcpICBbMzYyMTRdCiAgICBSZWFkcyBhIGZpbGUgbGluZSBieSBsaW5lIGludG8gYSBMaXN0IG9mIFN0cmluZ3MKCi0gRmlsZVV0aWxzIC0gd3JpdGVMaW5lcyhGaWxlLGVuY29kaW5nLExpc3QpCiAgICAgICAgICAgICAgd3JpdGVMaW5lcyhGaWxlLGVuY29kaW5nLExpc3QsbGluZUVuZGluZykKICAgIFdyaXRlcyBhIGNvbGxlY3Rpb24gdG8gYSBmaWxlIGxpbmUgYnkgbGluZQoKLSBGaWxlVXRpbHMgLSBFTVBUWV9GSUxFX0FSUkFZCiAgICBDb25zdGFudCBmb3IgYW4gZW1wdHkgYXJyYXkgb2YgRmlsZSBvYmplY3RzCgotIENvbmRpdGlvbmFsRmlsZUZpbHRlciAtIG5ldyBpbnRlcmZhY2UgIFszMDcwNV0KICAgIERlZmluZXMgdGhlIGJlaGF2aW9yIG9mIGxpc3QgYmFzZWQgZmlsdGVycwoKLSBBbmRGaWxlRmlsdGVyLCBPckZpbGVGaWx0ZXIgIFszMDcwNV0KICAgIE5vdyBzdXBwb3J0IGEgbGlzdCBvZiBmaWx0ZXJzIHRvIGFuZC9vcgoKLSBXaWxkY2FyZEZpbHRlciAgWzMxMTE1XQogICAgTmV3IGZpbHRlciB0aGF0IGNhbiBtYXRjaCB1c2luZyB3aWxkY2FyZCBmaWxlIG5hbWVzCgotIEZpbGVGaWx0ZXJVdGlscyAtIG1ha2VTVk5Bd2FyZShJT0ZpbGVGaWx0ZXIpCiAgICBOZXcgbWV0aG9kLCBsaWtlIG1ha2VDVlNBd2FyZSwgdGhhdCBpZ25vcmVzIFN1YnZlcnNpb24gc291cmNlIGNvbnRyb2wgZGlyZWN0b3JpZXMKCi0gQ2xhc3NMb2FkZXJPYmplY3RJbnB1dFN0cmVhbQogICAgQW4gT2JqZWN0SW5wdXRTdHJlYW0gdGhhdCBzdXBwb3J0cyBhIENsYXNzTG9hZGVyCgotIENvdW50aW5nSW5wdXRTdHJlYW0sQ291bnRpbmdPdXRwdXRTdHJlYW0gLSByZXNldENvdW50KCkgIFsyODk3Nl0KICAgIEFkZHMgdGhlIGFiaWxpdHkgdG8gcmVzZXQgdGhlIGNvdW50IHBhcnQgd2F5IHRocm91Z2ggcmVhZGluZy93cml0aW5nIHRoZSBzdHJlYW0KCi0gRGVmZXJyZWRGaWxlT3V0cHV0U3RyZWFtIC0gd3JpdGVUbyhPdXRwdXRTdHJlYW0pICBbMzQxNzNdCiAgICBOZXcgbWV0aG9kIHRvIGFsbG93IGN1cnJlbnQgY29udGVudHMgdG8gYmUgd3JpdHRlbiB0byBhIHN0cmVhbQoKLSBEZWZlcnJlZEZpbGVPdXRwdXRTdHJlYW0gIFszNDE0Ml0KICAgIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgYXZvaWRpbmcgZG91YmxlIGJ1ZmZlcmluZwoKLSBMb2NrYWJsZUZpbGVXcml0ZXIgLSBlbmNvZGluZyBzdXBwb3J0IFszNjgyNV0KICAgIEFkZCBzdXBwb3J0IGZvciBjaGFyYWN0ZXIgZW5jb2RpbmdzIHRvIExvY2thYmxlRmlsZVdyaXRlcgogICAgSW1wcm92ZSB0aGUgdmFsaWRhdGlvbgogICAgQ3JlYXRlIGRpcmVjdG9yaWVzIGlmIG5lY2Vzc2FyeQoKLSBJT1V0aWxzIGFuZCBFbmRpYW5VdGlscyBhcmUgbm8gbG9uZ2VyIGZpbmFsICBbMjg5NzhdCiAgICBBbGxvd3MgZGV2ZWxvcGVycyB0byBoYXZlIHN1YmNsYXNzZXMgaWYgZGVzaXJlZCAgIAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkZlZWRiYWNrCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKT3BlbiBzb3VyY2Ugd29ya3MgYmVzdCB3aGVuIHlvdSBnaXZlIGZlZWRiYWNrOgpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9pby8KClBsZWFzZSBkaXJlY3QgYWxsIGJ1ZyByZXBvcnRzIHRvIEpJUkEKaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTwoKT3Igc3Vic2NyaWJlIHRvIHRoZSBjb21tb25zLXVzZXIgbWFpbGluZyBsaXN0IChwcmVmaXggZW1haWxzIGJ5IFtpb10pCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL21haWwtbGlzdHMuaHRtbAoKVGhlIENvbW1vbnMtSU8gVGVhbQo=