ZGlmZiAtLWdpdCBhL0tFWVMgYi9LRVlTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODY4M2M4Li4wMDAwMDAwCi0tLSBhL0tFWVMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi1UaGlzIGZpbGUgY29udGFpbnMgdGhlIFBHUCBrZXlzIG9mIHZhcmlvdXMgWGFsYW4gZGV2ZWxvcGVycy4KLVBsZWFzZSBkb24ndCB1c2UgdGhlbSBmb3IgZW1haWwgdW5sZXNzIHlvdSBoYXZlIHRvLiBUaGVpciBtYWluCi1wdXJwb3NlIGlzIGNvZGUgc2lnbmluZy4KLQotWGFsYW4gdXNlcnM6IHBncCA8IEtFWVMKLVhhbGFuIGRldmVsb3BlcnM6IHBncCAta3hhIDx5b3VyIG5hbWU+IGFuZCBhcHBlbmQgaXQgdG8gdGhpcyBmaWxlLgotCi0KLVR5cGUgQml0cy9LZXlJRCAgICBEYXRlICAgICAgIFVzZXIgSUQKLXB1YiAgMTAyNC8zMEEyMUQ1NSAxOTk5LzExLzA0IFNoYW5lIEN1cmN1cnUgPHNoYW5lX2N1cmN1cnVAbG90dXMuY29tPgotCi0tLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KLVZlcnNpb246IFBHUCBQZXJzb25hbCBQcml2YWN5IDYuNS4zCi0KLW1RR2lCRGdoak5JUkJBRFhCNFVZNFlmWjJEbWJTdXNobHpQWkNrWTAwaURQVUIrR2tXNkZRaGduR0NMWm92Z3kKLUZoQ25Dc0tkTjF4eUhGcS9OczNQVjNIUHJNR3hGS2dWT2ZSdXhSRWJGOENvWEFhL3UwcVIxV29BbStybHlDOWwKLU9Wc0hkWHh5T3BaOGU0U1BHbmU4TFFZWndyMnErTHNIaVhPWmt0a2FCbzh1YThGNEVKWWtCTUZoWlFDZy80SXcKLWpYbWZwdDY2MUVzc21mOGQwNWNNZEFjRUFMMHIrUHJGeENtclU4T2srcjc0K2VxeWNseFZiaURiT2Y3VWVmNk4KLWZFSm1DNWloWDdwOGs4ZUVmMlhlcGVBbzZOMGdkT3hZVlhWd2NvUkNtcVB5N1NTZzFqblhxS09uQTg3eWx2MTYKLWxPaUo1V1VraVZYOTZXT1dFc2JiWUt1Z2dtV2VETCs2aUZjOWhwNm9FUDJzZi9nZUM4QUVBRUhUUGZuZUp6cG8KLTN6MjhBLzlpWDQxcjRLMGlSeDVlSUp1MktVcmpkcFB4aG4wSlBlOWR6Mlh6V1pJY2lOZWtpK1RocmNhckVqOWgKLWxtZnZjR0xpZlhiUWZYdUZpZDNidE1zQlJJOGRxQWJiWG15ZnZDWVlTSERPa1hFbW9NVzY2QVdmZUY0aGdmSEYKLVNBNWxtY3BING10SFU2OXVDMCtjdllsUlJPUCtIYWVPZXBZYnJpQSs5QTlRcTRNQVc3UW5VMmhoYm1VZ1EzVnkKLVkzVnlkU0E4YzJoaGJtVmZZM1Z5WTNWeWRVQnNiM1IxY3k1amIyMCtpUUJPQkJBUkFnQU9CUUk0SVl6U0JBc0QKLUFnRUNHUUVBQ2drUU11d1hXVENpSFZYUUlRQ2cxUTFNS2tXeWdJc0RHQU9oaVBhTTA5cFRkbFVBbmlUZUNrb08KLUkwKzJJZ0QvTnRxbkdEYVN2TkRuaVFCR0JCQVJBZ0FHQlFJNHFaay9BQW9KRUZIclB2RlhkbHJ5VmJJQW9PL2UKLWd0aTFlc2dSSTZHRXJJaElDZzNJb2N0ZkFLRGxwdzZOV3EvV1R4azFBYTBwTi8xYjZmbUQ1TGtDRFFRNElZelMKLUVBZ0E5a0pYdHdoL0NCZHlvcnJXcVVMekJlajVVeEU1VDdieGJybExPQ0RhQWFkV294VHBqMEJWODlBSHhzdEQKLXFaU3Q5MHhraGtuNERJTzlaZWtYMUtIVFVQajFXVi9jZGxKUFBUMk4yODZaNFZlU1djMzl1SzUwVDhYOGRyeUQKLXhVY3dZYzU4eVdiL0ZmbTcvWkZleHdHcTAxdWVqYUNsY2pyVUd2Qy9SZ0JZSytYMGlQMVlUa25ielNDMG5lU1IKLUJ6WnJNMnc0RFVVZEQzeUlzeHg4V3kyTzl2UEpJOEJEOEtWYkdJMk91MVdNdUYwNDB6VDlmQmRYUTZNZEdHemUKLU15RXN0U3IvUE9HeEtVQVlFWTE4aEtjS2N0YUd4QU1aeUFjcGVzcVZETm1XbjZ2UUNsQ2JBa2JUQ0QxbXBGMUIKLW41eDh2WWxMSWhrbXVxdWlYc05WNlRJTE93QUNBZ2dBenUvUU9idXlrTEd3UExDb1NRRUtmZU5TR1BPcjd3SzIKLVhTcDhjOERTMUIyanJWTDRvSCtQWWI2d1ZoY05kMytYdDQrUC9CZmxsZW1SVTgwR0Q2dC9SSG9URVpoSWhwLzMKLThlckJMSmZMUHFGRFlkaktmMzBFTU1qRldJaGVjZzlRblpTWFUyZjdFSjI0TCsvdm5vdGpBejZoWmZKdmpiMWIKLTF0WDNQUTFXMmUrbFRGaFN6MVJZU0t4NG1zRWNlejNaMHdWYWxOcVdsZXQzdDc4Y0NaUlQ0ZlBPa3lNNEM3RmIKLXRLNmNzdkZVWGtJZnUzcWd4NGFWazhIVUl3WGtIWkQyVzdYaUZTUGhNdGdjUGVVQWIzQUllWUpzL2lxUDRINE4KLTRvSjhCNnRYeG1wRG0zUDg1UGhDNGdKT0ZVVGhuWktHa0x0V3dkVWFnbzhYU0tCNVZVQS9VSWtBUmdRWUVRSUEKLUJnVUNPQ0dNMGdBS0NSQXk3QmRaTUtJZFZYUytBS0RoeUp3eDA0OCtjN0FUSU5TR2Y2SXhpWFF5WVFDZzQ2cEoKLS9mYzBIVldVdkhmamlvRFJhTFFVSXY4PQotPXV0L00KLS0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KLQotLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi1WZXJzaW9uOiBQR1AgNi41LjgKLQotbVFHaUJEbmpUVU1SQkFER3ppN3kxWGlUdHkvSFoxUWhSUXhNa3lmN0pEL0U1ZEdYQ1ZMUm9TUVY5L2hkS1B0RgotT0d6alpRdDZEc3NQbmlzZ3JXNmhTTEVzOEdyWktIQ1pFNno4aDVZZWtnK1dKVHMzSzBMTkozWC90U3RWZS9mVQotRGFyTE03dTBxd3Rjc2FJU1dGTVJveTF4YnJ4QmtwRkJlTmtEK0ZSVWs4c1hUVlhvT0d2bTNGdy84d0NnLytwZwotWTdYRDZaSUEwbS9DeHJ4Uit4VEJyaThEL1JrNC81cnpzVDQyQUltSndBd2VKaWR6bG1tdldjREdqWm9sRHhySAotVGxWcElYRmpHRkpCajl0ZzFYeiszL3c5ekt5azkwMGdjd2xIVTd1ejI4eFB5bGlzaGdkOER5QWIvZW5TWHNFeQotTkMxRWFneXBBYk1wRWhUQWRCYVVOUGI2dDh5T1gzZEhVa2k1eXVaK1ByeU95S1dUYWlIeWhITHdKNXZaaTl4bQotbysvWkJBQ3FqVXFBTDI3Sk9DMXF3MXpyV0NRUXpFSkllSUlkR0ZFR29NQmlGQzQyNXZoLzFkSkExTFVJQ0hTWgotYlp2ZzdWbHZBTUVyblpiL0ljVng0TFg0UjhVZXJnaDBFLzRYaTZrclRZWnZEdUk0Um1QNUpuLzdJYUsyYzI3SQotbEN4N0kwaGo0Q1FJV1ZJRVZDREFHakprOUUzOFZhaEpZSHlTSHpqTWRoWFNqVGJxVzdRblRHOTBkWE40YzJ3ZwotVkdWaGJTQThURzkwZFhONGMyeGZWR1ZoYlVCc2IzUjFjeTVqYjIwK2lRQk9CQkFSQWdBT0JRSTU0MDFEQkFzRAotQWdFQ0dRRUFDZ2tRR2JuQmkyUkN3OXlWWndDZ2p4Qy9pZTUvR2hQTFp5UWhNU1F2SnVESlA4a0FuMTdVTmZOLwotdFJ0RmZjSkRyTmNDN1AyMXV0K1Z1UUlOQkRualRVTVFDQUQyUWxlM0NIOElGM0tpdXRhcFF2TUY2UGxURVRsUAotdHZGdXVVczRJTm9CcDFhakZPbVBRRlh6MEFmR3kwT3BsSzMzVEdTR1NmZ01nNzFsNlJmVW9kTlErUFZaWDl4MgotVWs4OVBZM2J6cG5oVjVKWnpmMjRyblJQeGZ4MnZJUEZSekJoem56Slp2OFYrYnY5a1Y3SEFhclRXNTZOb0tWeQotT3RRYThMOUdBRmdyNWZTSS9WaE9TZHZOSUxTZDVKRUhObXN6YkRnTlJSMFBmSWl6SEh4YkxZNzI4OGtqd0VQdwotcFZzWWpZNjdWWXk0WFRqVE5QMThGMWREb3gwWWJONHpJU3kxS3Y4ODRiRXBRQmdSalh5RXB3cHkxb2JFQXhuSQotQnlsNnlwVU0yWmFmcTlBS1VKc0NSdE1JUFdha1hVR2ZuSHk5aVVzaUdTYTZxNkpldzFYcE1nczdBQUlDQi85ZwotNWFSNm1XYnZhWkF3Ti9JRndJQzljZDU0Y0RBVzZwdm93bzYvZ2tnTGZ3VUxJN2lHUjhqckhIczlyU3U5NjhmVgotM0w3eXMzcEZMUjkzLzIybUpSMUluVHArcVFkVW50Y25oNWZ3YkFkOVo4Tm9NMlFFdVk0YzdjVmpvYmF6T2dQZgotQzZYWmtTMUMzdEhjdlVlZHpSOGttZjFoaVJ0SUxXVzJwRjdBOUpiSkIzUkhjdUJ1dDNjUzNlTUUyK3MrZENTbAotU3VnWkt5VkZ1aURvS081OVREN09Jbjlkd2lwVmhYN1VnRzB1TERsWnpDZDlkSExzcmxyNzVMRHhJWnlpaWZEQgotMW9hK3hNNXNtRllFcXV4KzNsZi9VTkdocHhjYUdESk0wOVVVcE9Wdjh5VnorRlpRaWxaN0J1MFhLdm5qMXA5MQotWUZWQWlRdlFIaWp5YStrTXk2TUNpUUJHQkJnUkFnQUdCUUk1NDAxREFBb0pFQm01d1l0a1FzUGNQbFVBb05rbQotZk1CMEhMNzFoNVFZZkIvTlJKdXBXc1dVQUtDaTJVRVRxOWN3QTdRdHVNeVExY2p2a0ExbW5RPT0KLT1sTloyCi0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi0KZGlmZiAtLWdpdCBhL0xpY2Vuc2UgYi9MaWNlbnNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTE1NmE2Li4wMDAwMDAwCi0tLSBhL0xpY2Vuc2UKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDdmMzY3Li4wMDAwMDAwCi0tLSBhL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTWFrZWZpbGUgZm9yIHhtbC14YWxhbiwgYW4gWFNMVCBQcm9jZXNzb3IKLSMKLSMgUGxlYXNlIG5vdGUgdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9ucyEKLSMgIC0gU2VlIG1ha2UuaW5jbHVkZSBmb3Igc3lzdGVtIHRvb2xzIGRlZmluaXRpb25zLiBXZSBhc3N1bWUKLSMgICAgdGhhdCBlYWNoIG9mIHRoZXNlIHRvb2xzIGFyZSBvbiB0aGUgcGF0aCBhbmQgcHJvcGVybHkgc2V0dXAuCi0jICAKLSMgIC0gVXNlIEdOVSBtYWtlIG9yIGFuIGVxdWl2YWxlbnQuICBPbiBXaW4zMiwgeW91IGNhbiBzZWUKLSMgICAgaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9jeWd3aW4gZm9yIGEgcG9ydC4gCi0jICAKLSMgIC0gV2l0aCBKREsgMS4xLjdCIG9yIGVhcmxpZXIsIGEgJ21ha2UgYWxsJyBtYXkgZmFpbCB0aGUgZmlyc3QKLSMgICAgdGltZS4gVHJ5IHJ1bm5pbmcgaXQgYWdhaW4gdHdpY2UsIGFuZCBldmVyeXRoaW5nIHNob3VsZCB3b3JrLgotIyAgICBOb3RlIHRoYXQgd2hlbiB1c2luZyBKREsgMS4yLngsIGl0IGFsbCB3b3JrcyBmaW5lLiBXZSdsbCB3b3JrIG9uIGl0LgotIyAgCi0jICAtIE5vdGUgdGhlIHNldmVyYWwgYXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIGlmIHdlJ3JlIG9uIFdpblhYIG9yIFVuaXg6Ci0jICAgIGlmZXEgKCwkKGZpbmRzdHJpbmcgdXNyLCQoUEFUSCkpKQotIyAgICBGZWVsIGZyZWUgdG8gbW9kaWZ5IHRvIHdvcmsgZm9yIHlvdXIgbWFjaGluZSwgYW5kIHN1Z2dlc3QgYSBiZXR0ZXIKLSMgICAgd2F5IHRvIGNyZWF0ZSBhIHBsYXRmb3JtLWluZGVwZW5kZW50IG1ha2VmaWxlLgotIyAgCi0jICAtIFRoZSBkb2NzIGRpcmVjdG9yeSBjdXJyZW50bHkgcmVxdWlyZXMgamF2YWRvYyBmcm9tIHRoZSBKREsgMS4yLngKLSMgICAgWW91IG1heSBuZWVkIHRvIGVkaXQgbWFrZS5pbmNsdWRlICdKQVZBRE9DMTInIGZvciB5b3VyIHN5c3RlbS4KLSMKLSMgIC0gWWVzLCB3ZSBwbGFuIHRvIG1vdmUgdG8gYW4gJ0FudCcgYmFzZWQgbWFrZSBzeXN0ZW0gc29vbgotIyAgICAoQW50IGlzIGZyb20gamFrYXJ0YS5hcGFjaGUub3JnIGFuZCBpcyBhIEphdmEtYmFzZWQgbWFrZSkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgbWFrZS5pbmNsdWRlCi0KLVNVQkRJUlMgPSBzcmMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTWFpbiB0YXJnZXRzIGRlZmluaXRpb25zCi0jCi0jIE5vdGUgdGhhdCBtYWtlLmluY2x1ZGUgYWxzbyBkZWZpbmVzIGNvbW1vbiB0YXJnZXRzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYWxsOiBtYWtlc3ViZGlycyBqYXJzIG1ha2VzYW1wbGVzIG1ha2Vkb2NzCi0KLWJ1aWxkOiBtYWtlc3ViZGlycyBqYXJzCi0jIFRvIGNoYW5nZSBkZWJ1Zy9yZWxlYXNlIG9wdGlvbnMsIHNlZSBtYWtlLmluY2x1ZGUgZm9yIEpBVkFERUJVRyBmbGFnCi0KLSMgQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIG1vZHVsZQotZGlzdDogbWFrZWRpc3QKLQotZG9jczogbWFrZWRvY3MKLQotc2FtcGxlczogbWFrZXNhbXBsZXMKLQotamFyczogbWFrZXN1YmRpcnMgJChKQVJOQU1FKQotCi1jb21wYXQ6IG1ha2Vjb21wYXQgY29tcGF0amFycwotCi1QUk9QUEFUSCA9IG9yZyQoUEFUSFNFUClhcGFjaGUkKFBBVEhTRVApeGFsYW4kKFBBVEhTRVApcmVzCi0kKEpBUk5BTUUpOjoKLQktbWtkaXIgc3JjLyQoQ0xBU1NfRElSKS9NRVRBLUlORjsKLQktbWtkaXIgc3JjLyQoQ0xBU1NfRElSKS9NRVRBLUlORi9zZXJ2aWNlczsKLQkkKENQKSBzcmMvJChQUk9QUEFUSCkvKi5wcm9wZXJ0aWVzIHNyYy8kKENMQVNTX0RJUikvJChQUk9QUEFUSCkvLjsgXAotCSQoQ1ApIHNyYy9vcmcvYXBhY2hlL3NlcmlhbGl6ZS8qLnByb3BlcnRpZXMgc3JjLyQoQ0xBU1NfRElSKS9vcmcvYXBhY2hlL3NlcmlhbGl6ZS8uOyBcCi0JJChDUFIpIHNyYy9NRVRBLUlORi8qIHNyYy8kKENMQVNTX0RJUikvTUVUQS1JTkYvLjsgXAotCWVjaG8gLW4gIkphcnJpbmcgLi4vYmluLyRAIC4uICI7IFwKLQljZCBzcmMvJChDTEFTU19ESVIpOyAkKEpBUikgJChKQVJGTEFHUykgLi4vLi4vYmluLyRAIE1FVEEtSU5GIGphdmF4IG9yZzsgXAotCWVjaG8gImRvbmUiCi0KLWNvbXBhdGphcnM6Ci0JZWNobyAtbiAiSmFycmluZyAuLi9iaW4vJEAgLi4gIjsgXAotCWNkIHNyYy8kKENMQVNTX0RJUik7ICQoSkFSKSAkKEpBUkZMQUdTKSAuLi8uLi9iaW4vJEAuamFyIG9yZy9hcGFjaGUveGFsYW4veHNsdCBvcmcvYXBhY2hlL3hhbGFuL3hwYXRoOyBcCi0JZWNobyAiZG9uZSIKLQotIyBOb3RlOiBXaGVuIG1ha2luZyBkaXN0LCBjb3B5IHRoZSBidWlsdCBkb2NzIHVwIG9uZSBsZXZlbAotIyBOb3RlOiBDcmVhdGUgYm90aCBhIHN1cGVyLWphciBhbmQgYSB0YXIuZ3ogYXJjaGl2ZQotRElTVERJUiAgPSAkKFBST0RVQ1RfTkFNRSkkKFZFUlNJT04pCi0uUEhPTlk6IG1ha2VkaXN0Ci1tYWtlZGlzdDoKLQllY2hvIFByZXBhcmUgY3JlYXRpbmcgJChESVNUX05BTUUpCi0JLW1rZGlyICQoRElTVERJUikKLQkkKENQKSAqICQoRElTVERJUik7XAotCSQoQ1BSKSB4ZG9jcyAkKERJU1RESVIpO1wKLQkkKENQUikgc2FtcGxlcyAkKERJU1RESVIpO1wKLQkkKENQUikgc3JjICQoRElTVERJUik7XAotCSQoQ1BSKSBidWlsZC9kb2NzICQoRElTVERJUik7XAotCWVjaG8gQ3JlYXRlICQoSkFSRElTVE5BTUUpO1wKLQkkKEpBUikgLWNmICQoSkFSRElTVE5BTUUpICQoRElTVERJUik7XAotCWVjaG8gQ3JlYXRlICQoVEFSRElTVE5BTUUpO1wKLQkkKFRBUkdaKSAkKFRBUkRJU1ROQU1FKSAkKERJU1RESVIpO1wKLQllY2hvIENyZWF0ZSAkKFpJUERJU1ROQU1FKTtcCi0JJChKQVIpIC1jTWYgJChaSVBESVNUTkFNRSkgJChESVNURElSKTtcCi0JZWNobyBEb25lIGNyZWF0aW5nICQoSkFSRElTVE5BTUUpIGV0Yy4sIHlvdSBzaG91bGQgc2lnbiB0aGlzIHdpdGggUEdQIGJlZm9yZSBwb3N0aW5nCi0KLSMgU3Vic2lkaWFyeSB0YXJnZXRzIGFyZSBkZWZpbmVkIGluIG1ha2UuaW5jbHVkZQotY2xlYW46OiBjbGVhbnN1YmRpcnMgY2xlYW5kb2NzIGNsZWFuc2FtcGxlcwotCi1jb21wYXRjbGVhbjo6IGNsZWFuY29tcGF0Ci0KZGlmZiAtLWdpdCBhL2Jpbi9hbnQuamFyIGIvYmluL2FudC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZWZhYjMuLjAwMDAwMDAKLS0tIGEvYmluL2FudC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4vYW50UnVuIGIvYmluL2FudFJ1bgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhMThmMS4uMDAwMDAwMAotLS0gYS9iaW4vYW50UnVuCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgQXJnczogRElSIGNvbW1hbmQKLWNkICIkMSIKLUNNRD0iJDIiCi1zaGlmdAotc2hpZnQKLQotZXhlYyAkQ01EICIkQCIKZGlmZiAtLWdpdCBhL2Jpbi9hbnRSdW4uYmF0IGIvYmluL2FudFJ1bi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxNmNiNjAuLjAwMDAwMDAKLS0tIGEvYmluL2FudFJ1bi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1AZWNobyBvZmYKLQotIyBDaGFuZ2UgZHJpdmUgYW5kIGRpcmVjdG9yeSB0byAlMSAoV2luOVggb25seSBmb3IgTlQvMksgdXNlICJjZCAvZCIpCi1jZCAlMQotJTFcCi1zZXQgQU5UX1JVTl9DTUQ9JTIKLXNoaWZ0Ci1zaGlmdAotCi1zZXQgUEFSQU1TPQotOmxvb3AKLWlmICIiJTEgPT0gIiIgZ290byBydW5Db21tYW5kCi1zZXQgUEFSQU1TPSVQQVJBTVMlICUxCi1zaGlmdAotZ290byBsb29wCi0KLTpydW5Db21tYW5kCi1yZW0gZWNobyAlQU5UX1JVTl9DTUQlICVQQVJBTVMlCi0lQU5UX1JVTl9DTUQlICVQQVJBTVMlCi0KZGlmZiAtLWdpdCBhL2Jpbi9ic2YuamFyIGIvYmluL2JzZi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MDM2YzEuLjAwMDAwMDAKLS0tIGEvYmluL2JzZi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4vc3R5bGVib29rLTEuMC1iM194YWxhbi0yLmphciBiL2Jpbi9zdHlsZWJvb2stMS4wLWIzX3hhbGFuLTIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjY0MGU5Li4wMDAwMDAwCi0tLSBhL2Jpbi9zdHlsZWJvb2stMS4wLWIzX3hhbGFuLTIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYmluL3hhbGFuMmpkb2MuamFyIGIvYmluL3hhbGFuMmpkb2MuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODRiNDdiLi4wMDAwMDAwCi0tLSBhL2Jpbi94YWxhbjJqZG9jLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ZXJjZXMuamFyIGIvYmluL3hlcmNlcy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjN2QxOGEuLjAwMDAwMDAKLS0tIGEvYmluL3hlcmNlcy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idWlsZC5iYXQgYi9idWlsZC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjOTFiOWQuLjAwMDAwMDAKLS0tIGEvYnVpbGQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotQGVjaG8gb2ZmCi1yZW0gUHJlcmVxdWlzaXRlczogdXNlciBtdXN0IHNldCBKQVZBX0hPTUUKLWlmICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBlcnJvcgotZWNoby4KLWVjaG8gWGFsYW4tSiAyLnggQnVpbGQKLWVjaG8gLS0tLS0tLS0tLS0tLQotCi1yZW0gRGVmYXVsdCBBTlRfSE9NRSBpZiBub3Qgc2V0Ci1zZXQgU0FWRUFOVEhPTUU9JUFOVF9IT01FJQotaWYgIiVBTlRfSE9NRSUiID09ICIiIHNldCBBTlRfSE9NRT0uCi0KLXJlbSBUaGlzIGF1dG9tYXRpY2FsbHkgYWRkcyBzeXN0ZW0gY2xhc3NlcyB0byBDTEFTU1BBVEgKLXNldCBTQVZFQ1A9JUNMQVNTUEFUSCUKLWlmIGV4aXN0ICIlSkFWQV9IT01FJVxsaWJcdG9vbHMuamFyIiBzZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOyVKQVZBX0hPTUUlXGxpYlx0b29scy5qYXIKLWlmIGV4aXN0ICIlSkFWQV9IT01FJVxsaWJcY2xhc3Nlcy56aXAiIHNldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7JUpBVkFfSE9NRSVcbGliXGNsYXNzZXMuemlwCi0KLXJlbSBEZWZhdWx0IGxvY2F0aW9ucyBvZiBqYXJzIHdlIGRlcGVuZCBvbiAKLXNldCBBTlQ9YmluXGFudC5qYXIKLXNldCBYRVJDRVM9YmluXHhlcmNlcy5qYXIKLXNldCBCU0Y9YmluXGJzZi5qYXIKLXNldCBCU0ZFTkdJTkVTPWJpblxic2ZlbmdpbmVzLmphcgotc2V0IERPQ0dFTkVSQVRPUj1iaW5cc3R5bGVib29rLTEuMC1iM194YWxhbi0yLmphcgotc2V0IERPQ0xFVD1iaW5ceGFsYW5qZG9jLmphcgotCi1yZW0gRE9DTEVUIG11c3QgYmUgb24gc3lzdGVtIENMQVNTUEFUSCBmb3IgamF2YWRvY3MgdGFzayB0byB3b3JrLiBKdXN0IGluY2x1ZGluZyBpdCBpbgotcmVtIC1jbGFzc3BhdGggYXJnIGZvciBqYXZhIG9yIGphdmFkb2MgY2FsbCBkb2Vzbid0IHdvcmsuLi4uCi1yZW0gc2V0IENMQVNTUEFUSD0lQU5UJTslWEVSQ0VTJTslQlNGJTslQlNGRU5HSU5FUyU7JURPQ0dFTkVSQVRPUiU7JURPQ0xFVCU7JUNMQVNTUEFUSCUKLXNldCBDTEFTU1BBVEg9JUFOVCU7JVhFUkNFUyU7JURPQ0dFTkVSQVRPUiU7JURPQ0xFVCU7JUNMQVNTUEFUSCUKLWVjaG8uCi1lY2hvIEJ1aWxkaW5nIHdpdGggY2xhc3NwYXRoICVDTEFTU1BBVEglCi1lY2hvIFN0YXJ0aW5nIEFudC4uLgotCi1yZW0gVGVtcG9yYXJpbHksIHVwIHRoZSAtbXggbWVtb3J5IHNpbmNlIHdlIGNvbXBpbGUgYSByZWFsbHkgYmlnIGdsb2Igb2YgZmlsZXMKLWVjaG8gJUpBVkFfSE9NRSVcYmluXGphdmEuZXhlIC1teDY0bSAtRGFudC5ob21lPSIlQU5UX0hPTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbiAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQotIiVKQVZBX0hPTUUlXGJpblxqYXZhLmV4ZSIgLW14NjRtIC1EYW50LmhvbWU9IiVBTlRfSE9NRSUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5Ci0KLWdvdG8gZW5kCi0KLTplcnJvcgotCi1lY2hvICJFUlJPUjogSkFWQV9IT01FIG5vdCBmb3VuZCBpbiB5b3VyIGVudmlyb25tZW50LiIKLWVjaG8uCi1lY2hvICJQbGVhc2UsIHNldCB0aGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG1hdGNoIHRoZSIKLWVjaG8gInJvb3QgZGlyZWN0b3J5IG9mIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSB5b3Ugd2FudCB0byB1c2UuIgotCi06ZW5kCi1yZW0gQ2xlYW51cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLXNldCBDTEFTU1BBVEg9JVNBVkVDUCUKLXNldCBTQVZFQ1A9Ci1zZXQgQU5UX0hPTUU9JVNBVkVBTlRIT01FJQotc2V0IFNBVkVBTlRIT01FPQotc2V0IFhFUkNFUz0KLXNldCBCU0Y9Ci1zZXQgQlNGRU5HSU5FUz0KLXNldCBET0NMRVQ9Ci1zZXQgQU5UPQpkaWZmIC0tZ2l0IGEvYnVpbGQuc2ggYi9idWlsZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzk0OTUwMS4uMDAwMDAwMAotLS0gYS9idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMhL2Jpbi9zaAotIwlOYW1lOiAgIGJ1aWxkLnNoCi0jCUF1dGhvcjogU2hhbmUgQ3VyY3VydQotCi1lY2hvICJidWlsZC5zaCBiZWdpbm5pbmcuLi4iCi0KLWlmIFsgIiRKQVZBX0hPTUUiID0gIiIgXSA7IHRoZW4KLSAgICBlY2hvICJZb3UgbXVzdCBzZXQgSkFWQV9IT01FLCBzb3JyeTsgYWxzbyBKREsgMS4xeCBhZGQgY2xhc3Nlcy56aXAgdG8gQ0xBU1NQQVRIISIKLSAgICBleGl0IDEKLWZpCi0KLSMgRGVmYXVsdCB0byBVTklYLXN0eWxlIHBhdGhpbmcKLUNMUEFUSFNFUD06Ci0jIGlmIHdlJ3JlIG9uIGEgV2luZG93cyBib3ggbWFrZSBpdCA7Ci11bmFtZSB8IGdyZXAgV0lOICYmIENMUEFUSFNFUD1cOwotCi0jIFVwZGF0ZSBTRVJWTEVUIHRvIHBvaW50IHRvIEpBUiBjb250YWluaW5nIGphdmF4LnNlcnZsZXQgYW5kIGphdmF4LnNlcnZsZXQuaHR0cAotIyAgICBwYWNrYWdlczsgYWx0ZXJuYXRlbHkgaW5jbHVkZSB0aGlzIGluIHRoZSBjbGFzc3BhdGggeW91cnNlbGYKLVNFUlZMRVQ9L2pzd2RrLTEuMC4xL2xpYi9zZXJ2bGV0LmphcgotCi0jIERlZmF1bHQgbG9jYXRpb25zIGZvciBlYWNoIG9mIG91ciBqYXJzOyBjaGFuZ2UgYXMgbmVlZGVkCi1CSU5ESVI9Li9iaW4KLUFOVD0kQklORElSL2FudC5qYXIKLVRPT0xTX0pBUj0kSkFWQV9IT01FL2xpYi90b29scy5qYXIKLVhFUkNFUz0kQklORElSL3hlcmNlcy5qYXIKLUJTRj0kQklORElSL2JzZi5qYXIKLUJTRkVOR0lORVM9JEJJTkRJUi9ic2ZlbmdpbmVzLmphcgotRE9DR0VORVJBVE9SPSRCSU5ESVIvc3R5bGVib29rLTEuMC1iM194YWxhbi0yLmphcgotRE9DTEVUPSRCSU5ESVIveGFsYW5qZG9jLmphcgotCi0jIE1ha2Ugc3VyZSB0aGlzIGNsYXNzcGF0aCBzY2hlbWUgd29ya3MuIEkuZS4sIGNhbiBqYXZhZG9jIGZpbmQgeGFsYW5qZG9jLlN0YW5kYXJkPwotVEVNUF9DUD0iJEFOVCR7Q0xQQVRIU0VQfSRUT09MU19KQVIke0NMUEFUSFNFUH0kWEVSQ0VTJHtDTFBBVEhTRVB9JEJTRiR7Q0xQQVRIU0VQfSRCU0ZFTkdJTkVTJHtDTFBBVEhTRVB9JERPQ0dFTkVSQVRPUiR7Q0xQQVRIU0VQfSRET0NMRVQke0NMUEFUSFNFUH0kQ0xBU1NQQVRIIgotCi1lY2hvICJTdGFydGluZyBBbnQgd2l0aCB0YXJnZXRzOiAkQCIKLWVjaG8gIiAgICAgICAgLi4ud2l0aCBjbGFzc3BhdGg6ICRURU1QX0NQIgotCi0iJEpBVkFfSE9NRSIvYmluL2phdmEgLURhbnQuaG9tZT0uIC1jbGFzc3BhdGggIiRURU1QX0NQIiBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluICRACi0KLWVjaG8gImJ1aWxkLnNoIGNvbXBsZXRlISIKLQotCi0KZGlmZiAtLWdpdCBhL2J1aWxkLnhtbCBiL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhMjM3YS4uMDAwMDAwMAotLS0gYS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICBCdWlsZCBmaWxlIGZvciBYYWxhbi1KIDIueCAtIGZvciB1c2Ugd2l0aCB0aGUgSmFrYXJ0YSBBbnQgamF2YSBidWlsZCB0b29sCi0gICAKLVNldHVwIGluc3RydWN0aW9uczogCi0gICBCZWZvcmUgcnVubmluZyBhbiBBbnQgYnVpbGQsIHlvdSBtdXN0Ci0gICAKLSAgICAgLSBzZXQgdGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgSkRLIHJvb3QgZGlyZWN0b3J5Ci0gICAgIC0gVG8gYnVpbGQgJ3NlcnZsZXQnIHNhbXBsZTogSW5jbHVkZSBTZXJ2bGV0IFNESyBpbiB5b3VyIGNsYXNzcGF0aAotICAgICAtIFRvIGJ1aWxkIGRvY3MvamF2YWRvY3M6IHVzZSBKREsgMS4yLnggb3IgaGlnaGVyCi0gICAgIAotICAgCi1CdWlsZCBJbnN0cnVjdGlvbnM6ICAgCi0gICBUbyBidWlsZCwgcnVuCi0gICAgIGJ1aWxkLmJhdCAod2luMzIpIG9yIGJ1aWxkLnNoICh1bml4KSAtIG9wdGlvbmFsbHkgd2l0aCBhIHRhcmdldCBhcmcgYXMgaW5kaWNhdGVkIGJlbG93IC0KLSAgIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhpcyBmaWxlIGlzIGxvY2F0ZWQuCi0gICAKLSAgIFRoZSBiYXRjaC9zaGVsbCBmaWxlIHNldHMgdXAgeW91ciBjbGFzc3BhdGggYW5kIGNhbGxzIGphdmEgb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbgotICAgCi1CdWlsZCB0YXJnZXRzCi0gICAgVGhpcyBidWlsZCBmaWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgdGFyZ2V0czoKLSAgICAtIGNvbXBpbGUgIGNvbXBpbGVzIFhhbGFuLUogaW4gLi9idWlsZC9jbGFzc2VzLgotICAgIC0gamFyICAgICAgY3JlYXRlcyAuL2J1aWxkL3hhbGFuLmphciBbdGhlIGRlZmF1bHQgdGFyZ2V0XQotICAgIC0gc2FtcGxlcyAgY29tcGlsZXMgc2FtcGxlcyBhbmQgcHV0cyBjbGFzc2VzIGluIC4vYnVpbGQveGFsYW54YW1wbGVzLmphcgotICAgIC0gc2VydmxldCBjb21waWxlcyBzYW1wbGUgc2VydmxldHMgYW5kIHB1dHMgY2xhc3NlcyBpbiAuL2J1aWxkL3hhbGFuc2VydmxldC5qYXIKLSAgICAtIGRvY3MgICAgIGdlbmVyYXRlcyB0aGUgaHVtYW4td3JpdHRlbiBkb2N1bWVudGF0aW9uIGluIC4vYnVpbGQvZG9jcwotICAgIC0gamF2YWRvY3MgW29yIGFwaWRvY3NdIGdlbmVyYXRlcyB0aGUgQVBJIGRvY3VtZW50YXRpb24gaW4gLi9idWlsZC9kb2NzL2FwaWRvY3MKLSAgICAtIGNvbXBhdC5qYXIgY29tcGlsZXMgY29tcGF0aWJpbGl0eSB0cmVlIGFuZCBjcmVhdGVzIC4vYnVpbGQveGFsYW5qMWNvbXBhdC5qYXIKLSAgICAtIGNvbXBhdC5hcGlkb2NzIGdlbmVyYXRlcyBqYXZhZG9jIGZvciB0aGUgY29tcGF0aWJpbGl0eSBqYXIKLSAgICAtIGNsZWFuICAgIHB1cmdlcyB0aGUgYnVpbGQgdHJlZS4KLSAgICAtIGRpc3QgICAgIGNyZWF0ZXMgYSBjb21wbGV0ZSBkaXN0cmlidXRpb24gaW4gLi94YWxhbi1qX3hfeF94Ci0gICAgLSBhdXRvKiAgICB0YXJnZXRzIHVzZWQgYnkgYXV0b21hdGVkIGJ1aWxkIHByb2dyYW1zLCB3aXRob3V0IGRlcGVuZGVuY2llcwotICAgIC0gbWluaXRlc3QgY29tcGlsZSBhbmQgcnVuIHRoZSBtaW5pdGVzdCBpbiB4bWwteGFsYW5cdGVzdAotICAgIC0gY29uZnRlc3QgY29tcGlsZSBhbmQgcnVuIHRoZSBjb25mdGVzdCBpbiB4bWwteGFsYW5cdGVzdAotICAgIC0gc21va2V0ZXN0IHJ1biBhIHByZS1jaGVja2luIHNtb2tldGVzdCAoNSB0byAxMCBtaW51dGVzKS4KLSAgICAtIHByaW50LmRvY3MgY3JlYXRlIFBERiBkb2N1bWVudGF0aW9uIChyZXF1aXJlcyBmb3AuamFyIGFuZCB3M2MuamFyKS4KLSAgICAgICAgCi1JZiB5b3UgYnVpbGQgYSB0YXJnZXQgdGhhdCBkZXBlbmRzIG9uIG90aGVyIHRhcmdldHMsIHRob3NlIG90aGVyIHRhcmdldHMgYXJlIGNyZWF0ZWQgaW4gCi10aGUgY29ycmVjdCBvcmRlci4KLQotQXV0aG9yczoKLSAgU2hhbmUgQ3VyY3VydSA8c2hhbmVfY3VyY3VydUBsb3R1cy5jb20+Ci0gIERvbiBMZXNsaWUgPGRvbmFsZF9sZXNsaWVAbG90dXMuY29tPgotCi1Db3B5cmlnaHQ6Ci0gIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIC0gTXVjaCBvZiB0aGlzIGZpbGUgc3RvbGVuIGZyb20gU3RlZmFubydzIHhtbC14ZXJjZXMgYnVpbGQueG1sICAKLSAgCi0gICAkSWQkCi0gICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cHJvamVjdCBuYW1lPSJYYWxhbiIgZGVmYXVsdD0iamFyIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIERlZmluZXMgdmFyaWFibGVzIHVzZWQgYnkgdGhlIG90aGVyIHRhcmdldHMgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIyXzBfMSIvPgotICA8cHJvcGVydHkgbmFtZT0ibmFtZSIgdmFsdWU9InhhbGFuIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJOYW1lIiB2YWx1ZT0iWGFsYW4tSmF2YSIvPgotICA8cHJvcGVydHkgbmFtZT0ieWVhciIgdmFsdWU9IjIwMDAiLz4KLQotCi0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgdmFsdWU9ImNsYXNzaWMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImRlYnVnIiB2YWx1ZT0ib2ZmIi8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9Im1maW5mLmRpciIgdmFsdWU9Ii4vc3JjL01FVEEtSU5GIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iLi9zcmMiLz4KLSAgPHByb3BlcnR5IG5hbWU9InhwYXRoLnJlbGRpciIgdmFsdWU9Im9yZy9hcGFjaGUveHBhdGgiLz4KLSAgPHByb3BlcnR5IG5hbWU9InhhbGFuLnJlbGRpciIgdmFsdWU9Im9yZy9hcGFjaGUveGFsYW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRyYXgucmVsZGlyIiB2YWx1ZT0iamF2YXgveG1sL3RyYW5zZm9ybSIvPgotICA8cHJvcGVydHkgbmFtZT0ic2VyaWFsaXplLnJlbGRpciIgdmFsdWU9Im9yZy9hcGFjaGUvc2VyaWFsaXplIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzZXJpYWxpemVyLnJlbGRpciIgdmFsdWU9Im9yZy9hcGFjaGUveGFsYW4vc2VyaWFsaXplIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXhwLnJlbGRpciIgdmFsdWU9ImphdmF4L3htbC9wYXJzZXJzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzYXgucmVsZGlyIiB2YWx1ZT0ib3JnL3htbC9zYXgiLz4KLSAgPHByb3BlcnR5IG5hbWU9InczYy5yZWxkaXIiIHZhbHVlPSJvcmcvdzNjIi8+ICAgIAotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iLi9idWlsZCIvPgotICA8IS0tIFdoZXJlIHdlIHB1dCB0aGUgeGFsYW4uamFyIHdlIGNvbXBpbGUgYnkgZGVmYXVsdCAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnhhbGFuLmphciIgdmFsdWU9IiR7YnVpbGQuZGlyfS94YWxhbi5qYXIiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMiIHZhbHVlPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZG9jcyIgdmFsdWU9IiR7YnVpbGQuZGlyfS9kb2NzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5zYW1wbGVzIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L3NhbXBsZXMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmFwaWRvY3MiIHZhbHVlPSIke2J1aWxkLmRvY3N9L2FwaWRvY3MiLz4KLSAgCi0gIDwhLS0gWGFsYW4tSjEgY29tcGF0YWJpbGl0eSBzdHVmZi4gIC0tPgotICA8cHJvcGVydHkgbmFtZT0iY29tcGF0LmphciIgdmFsdWU9InhhbGFuajFjb21wYXQuamFyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJjb21wYXQuc3JjLmRpciIgdmFsdWU9Ii4vY29tcGF0X3NyYyIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGF0LmNsYXNzZXMiIHZhbHVlPSIke2J1aWxkLmRpcn0vY29tcGF0X2NsYXNzZXMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBhdC5qYXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vJHtjb21wYXQuamFyfSIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGF0LmFwaWRvY3MiIHZhbHVlPSIke2J1aWxkLmRvY3N9L2NvbXBhdF9hcGlkb2NzIi8+ICAgICAgICAKLQotICA8IS0tIFJlZmVyZW5jZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSB0ZXN0IHNvdXJjZSBjb2RlIGFyZWEuIC0tPgotICA8cHJvcGVydHkgbmFtZT0idGVzdHMuZGlyIiB2YWx1ZT0iLi4vdGVzdC9qYXZhLyIvPgotICA8cHJvcGVydHkgbmFtZT0ic2FtcGxlcy5kaXIiIHZhbHVlPSIuL3NhbXBsZXMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJpbi5kaXIiIHZhbHVlPSIuL2JpbiIvPgotICA8cHJvcGVydHkgbmFtZT0ieGVyY2VzLmphciIgdmFsdWU9IiR7YmluLmRpcn0veGVyY2VzLmphciIvPgotICA8cHJvcGVydHkgbmFtZT0iYnNmLmphciIgdmFsdWU9IiR7YmluLmRpcn0vYnNmLmphciIvPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmZpbGUiIHZhbHVlPSIke25hbWV9LWpfJHt2ZXJzaW9ufSIvPgotICA8cHJvcGVydHkgbmFtZT0iZGlzdC5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vJHtkaXN0LmZpbGV9Ii8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9Inhkb2NzLmRpciIgdmFsdWU9Ii4veGRvY3MiLz4KLSAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24uZmlsZSIgdmFsdWU9Im9yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yL1hTTFByb2Nlc3NvclZlcnNpb24uamF2YSIvPgotICA8cHJvcGVydHkgbmFtZT0ieGRvY3MuYm9vayIgdmFsdWU9IiR7eGRvY3MuZGlyfS9zb3VyY2VzL3hhbGFuLWpsb2NhbC54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9Inhkb2NzLnN0eWxlIiB2YWx1ZT0iJHt4ZG9jcy5kaXJ9L3N0eWxlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ4YWxhbm9ubHktc3R5bGVkb2NzIgotICAgICAgICAgICAgdmFsdWU9ImR0ZC94c2wtaHRtbDQwcy5kdGQsZHRkL3NwZWMuZHRkLHN0eWxlc2hlZXRzL3BhdHRlcm5zLnhzbCxzdHlsZXNoZWV0cy9ub3RpY2UueHNsLHN0eWxlc2hlZXRzL3NwZWMueHNsLHN0eWxlc2hlZXRzL2RvbmUueHNsLGxvYWRlcmRlc2lnbi54bWwsc3R5bGVzaGVldHMvZGVzaWduMnByb2plY3QueHNsLHN0eWxlc2hlZXRzL2Rlc2lnbmRvYzJodG1sLnhzbCxzdHlsZXNoZWV0cy94bWwyZm8ueHNsIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkb2MuZ2VuZXJhdG9yIiB2YWx1ZT0ib3JnLmFwYWNoZS5zdHlsZWJvb2suU3R5bGVCb29rIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkb2MuZ2VuZXJhdG9yLnN0eWxldGFyZ3oiIHZhbHVlPSIke3hkb2NzLmRpcn0veG1sLXNpdGUtc3R5bGUudGFyLmd6Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkb2MuZ2VuZXJhdG9yLnN0eWxldGFyIiB2YWx1ZT0iJHt4ZG9jcy5kaXJ9L3htbC1zaXRlLXN0eWxlLnRhciIvPgotICAKLSAgPHByb3BlcnR5IG5hbWU9InNpdGUucm9vdCIgdmFsdWU9Ii4veG1sLXNpdGUiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNpdGUuZGlyIiB2YWx1ZT0iJHtzaXRlLnJvb3R9L3RhcmdldC94YWxhbi1qIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzaXRlLmJvb2siIHZhbHVlPSIke3hkb2NzLmRpcn0vc291cmNlcy94YWxhbi1qc2l0ZS54bWwiLz4KLQotICA8cHJvcGVydHkgbmFtZT0idGVzdC5sb2dnaW5nTGV2ZWwiIHZhbHVlPSI1Ii8+Ci0gIDwhLS0gVGhlIGV4Y2x1ZGVkIGxyZSB0ZXN0cyBhcmUgYXQgaXNzdWUgb3IgYXJlIG5ldyBidWdzLCBhbmQgc2hvdWxkIGJlIAotICAgICAgIGluY2x1ZGVkIGFzIHNvb24gYXMgdGhleSBhcmUgcmVzb2x2ZWQuICAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QuZXhjbHVkZXMiIHZhbHVlPSJpbXBpbmNsMTIueHNsO2xyZTAyLnhzbDtscmUwMy54c2w7bHJlMDcueHNsO2xyZTEwLnhzbDtscmUxMi54c2w7bHJlMjEueHNsIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmVtYmVkZGVkIiB2YWx1ZT0iZW1iZWQwMS54c2w7ZW1iZWQwMi54c2w7ZW1iZWQwNy54c2wiLz4KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gUHJlcGFyZXMgdGhlIHhkb2NzL3N0eWxlIGFuZCB0aGUgYnVpbGQgZGlyZWN0b3JpZXMgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8dGFyZ2V0IG5hbWU9InByZXBhcmUiPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICA8IS0tIE5vdGUgdGhhdCBhbGwgdGVzdGluZy1yZWxhdGVkIHRhcmdldHMgKm11c3QqIGRlcGVuZCBvbiAKLSAgICAgICAgIHRoaXMgdGFyZ2V0LCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdG8gZ2V0IAotICAgICAgICAgdGhlIHRlc3RzLWF2YWlsYWJsZSBwcm9wZXJ0eSBzZXQgZm9yIHRoZW0uCi0gICAgLS0+Ci0gICAgPGF2YWlsYWJsZSBmaWxlPSIke3Rlc3RzLmRpcn0iIHByb3BlcnR5PSJ0ZXN0cy1hdmFpbGFibGUiIC8+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9InByZXBhcmUuZG9jcyIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgPGd1bnppcCBzcmM9IiR7ZG9jLmdlbmVyYXRvci5zdHlsZXRhcmd6fSIvPgotICAgIDx1bnRhciBzcmM9IiR7ZG9jLmdlbmVyYXRvci5zdHlsZXRhcn0iIGRlc3Q9IiR7eGRvY3MuZGlyfSIvPgotICAgICAgICA8ZGVsZXRlIGZpbGU9IiR7ZG9jLmdlbmVyYXRvci5zdHlsZXRhcn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRvY3N9Ii8+IDwhLS0gdHJhbnNmb3JtIHRvZG8ueG1sIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiBidWlsZC9kb2NzIC0tPgotICAgIDxqYXZhIGZvcms9InllcyIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhhbGFuLnhzbHQuUHJvY2VzcyIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC5kaXJ9LyR4YWxhbi5qYXIiPgotICAgICAgPGFyZyBsaW5lPSItaW4gdG9kby54bWwgLXhzbCB0b2RvLnhzbCAtb3V0ICR7YnVpbGQuZG9jc30vdG9kby5odG1sIi8+Ci0gICAgPC9qYXZhPiAKLSAgICA8IS0tIFdlIHVzZSBhIE5vdGVzIGFnZW50IHRvIGV4dHJhY3QgWGFsYW4tSmF2YSAyIGNvbW1pdHMgZnJvbSBvdXIgdGVhbSBkYXRhYmFzZSBpbnRvIGNvbW1pdHMueG1sLiAgVGhlIGZvbGxvd2luZyBvcGVyYXRpb24gCi0gICAgdHJhbnNmb3JtcyBjb21taXRzLnhtbCAoanVzdCBpbmNsdWRpbmcgc291cmNlIGNvZGUgY29tbWl0cykgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbiB4ZG9jcy9zb3VyY2VzL3hhbGFuIGZvciBpbmNsdXNpb24gaW4gdGhlIAotICAgIHJlYWRtZS54bWwgLS0+ICAgICAgCi0gICAgPGphdmEgZm9yaz0ieWVzIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIiBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLmRpcn0vJHhhbGFuLmphciI+Ci0gICAgICA8YXJnIGxpbmU9Ii1pbiBjb21taXRzLnhtbCAteHNsICR7eGRvY3Muc3R5bGV9L3N0eWxlc2hlZXRzL2RvbmUueHNsIC1vdXQgJHt4ZG9jcy5kaXJ9L3NvdXJjZXMveGFsYW4vRE9ORSIvPgotICAgIDwvamF2YT4KLSAgICA8IS0tIEdlbmVyYXRlIHRoZSBYYWxhbi1KMiBkZXNpZ24gZG9jdW1lbnQgLS0+Ci0gICAgPGphdmEgZm9yaz0ieWVzIiBjbGFzc25hbWU9IiR7ZG9jLmdlbmVyYXRvcn0iCi0gICAgICAgICAgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC5kaXJ9L3hhbGFuLmphciI+IAotICAgICAgICAgIDxhcmcgbGluZT0ibG9hZGVyQ29uZmlnPXNiazovc3R5bGUvbG9hZGVyZGVzaWduLnhtbCB0YXJnZXREaXJlY3Rvcnk9Li9idWlsZC9kb2NzL2Rlc2lnbi8KLSAgICAgICAgICAgICAgICAgICAgIC4veGRvY3Mvc291cmNlcy94YWxhbmRlc2lnbi54bWwgLi94ZG9jcy9zdHlsZSIvPgotICAgIDwvamF2YT4KLSAgICAgICAgICAgCi0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5hcGlkb2NzfSIvPgotICA8L3RhcmdldD4KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ29weSBvdmVyIHRoZSBzb3VyY2UgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSBXZSdyZSBjdXJyZW50bHkgc2tpcHBpbmcgdGhpcyBzdGVwLCBzaW5jZSBpdCBzZWVtcyBleHRyYW5lb3VzIGlmCi0gICAgICAgeW91J3JlIG5vdCBnb2luZyB0byBiZSB1c2luZyB0aGUgZmlsdGVyaW5nIHN0dWZmLiAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBDb21waWxlcyB0aGUgc291cmNlIHRyZWUgLSB4cGF0aCAoaW5kZXBlbmRlbnQgeHBhdGggZW5naW5lKSAgICAgICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gTm90ZTogU3RpbGwgdG9vIG1hbnkgY3Jvc3MtZGVwZW5kZW5jaWVzIHRvIGRvIHRoaXMgc2VwYXJhdGVseSAtLT4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLnhwYXRoIiBkZXBlbmRzPSJwcmVwYXJlIj4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9LyR7eHBhdGgucmVsZGlyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENvbXBpbGVzIHRoZSBzb3VyY2UgdHJlZSAtIHhhbGFuICh0aGUgcHJvY2Vzc29yKSAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBOb3RlOiBTdGlsbCB0b28gbWFueSBjcm9zcy1kZXBlbmRlbmNpZXMgdG8gZG8gdGhpcyBzZXBhcmF0ZWx5IC0tPgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUueGFsYW4iIGRlcGVuZHM9ImNvbXBpbGUueHBhdGgiPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0vJHt4YWxhbi5yZWxkaXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICA8L3RhcmdldD4KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ29tcGlsZSBlbnRpcmUgc291cmNlIHRyZWUgLSBleGNlcHQgWGFsYW4tSiAxIGNvbXBhdGFiaWxpdHkgY2xhc3NlcyAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9InByZXBhcmUiCi0gICAgZGVzY3JpcHRpb249IkNvbXBpbGUgWGFsYW4gdGhlIG5vcm1hbCB3YXkiID4KLSAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlIGVudGlyZSBzb3VyY2UgdHJlZSBhbmQgY29weSAucHJvcGVydGllcyBhbmQgLnJlcyBmaWxlcyB0byBidWlsZCB0cmVlLiIvPgotICAgIDwhLS0gTm90ZTogc3BsaXQgY29tcGlsZSBpbnRvIHNlcGFyYXRlIGphdmFjIHN0ZXBzIHRvIGF2b2lkIEpESyAxLjEuOCBidWcgcmVwb3J0ZWQgYXQ6Ci0gICAgICAgICBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDA0MzUwOC5odG1sCi0gICAgICAgICB3aGljaCBjYXVzZXMgYW4gZXJyb3IgbGlrZToKLSAgICAgICAgIFtqYXZhY10gRTpcYnVpbGRzXHhtbC14YWxhblxqYXZhXHNyY1xvcmdcYXBhY2hlXHhhbGFuXHRlbXBsYXRlc1xFbGVtVGVtcGxhdGUuamF2YToxMDg6IEN5Y2xpYyBjbGFzcyBpbmhlcml0YW5jZSBvciBzY29waW5nLgotICAgIC0tPiAKLSAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIKLSAgICAgICAgICAgaW5jbHVkZXM9ImphdmF4LyoqLyouamF2YSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCi0gICAgICAgICAgIGluY2x1ZGVzPSJvcmcvdzNjLyoqLyouamF2YSxvcmcvdzNjLyoqLyouamF2YSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCi0gICAgICAgICAgIGluY2x1ZGVzPSJvcmcvYXBhY2hlL3htbC8qKi8qLmphdmEsb3JnL2FwYWNoZS94cGF0aC8qKi8qLmphdmEiCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IgotICAgICAgICAgICBpbmNsdWRlcz0ib3JnL2FwYWNoZS94YWxhbi8qKi8qLmphdmEiCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqKi8qLnByb3BlcnRpZXMsKiovKi5yZXMsKiovamF2YXgueG1sLnBhcnNlcnMuKiwqKi9qYXZheC54bWwudHJhbnNmb3JtLioiLz4KLSAgICAgICAgPC9jb3B5PiAgCi0gIDwvdGFyZ2V0PgotICAgIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ29tcGlsZXMgb3RoZXIgc291cmNlIHRyZWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUudHJheCIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgCi0gICAgICAgICAgIGluY2x1ZGVzPSIke3RyYXgucmVsZGlyfS8qKiIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuc2VyaWFsaXplIiBkZXBlbmRzPSJwcmVwYXJlIj4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIKLSAgICAgICAgICAgaW5jbHVkZXM9IiR7c2VyaWFsaXplLnJlbGRpcn0vKioiIAotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5zYXgiIGRlcGVuZHM9InByZXBhcmUiPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0vJHtzYXgucmVsZGlyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIAotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlLnczYyIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfS8ke3czYy5yZWxkaXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuamF4cCIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfS8ke2pheHAucmVsZGlyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIAotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ3JlYXRlcyB0aGUgeGFsYW4gSkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSIKLSAgICBkZXNjcmlwdGlvbj0iSmFyIHVwIHhhbGFuLmphciIgPgotICAgIDxqYXIgamFyZmlsZT0iJHtidWlsZC54YWxhbi5qYXJ9IiBtYW5pZmVzdD0ic3JjXE1BTklGRVNULk1GIiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ii8+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9InBhY2thZ2UiIGRlcGVuZHM9ImphciI+Ci0gICAgPCEtLSBPSywgd2hhdCBhcmUgdGhlICdBcGFjaGUtc3RhbmRhcmQnIG5hbWVzIGZvciB2YXJpb3VzIHRhcmdldHM/IC0tPgotICAgIDxlY2hvIG1lc3NhZ2U9InBhY2thZ2UgaXMgYW4gYWxpYXMgZm9yIGphciIvPiAgCi0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENyZWF0ZXMgdGhlIFhhbGFuLUoxIGNvbXBhdGFiaWxpdHkgSkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJjb21wYXQuamFyIiBkZXBlbmRzPSJqYXIiPgotICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUgYW5kIEpBUiBYYWxhbi1KIDEgY29tcGFiaWxpdHkgQVBJLiIvPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY29tcGF0LmNsYXNzZXN9Ii8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtjb21wYXQuc3JjLmRpcn0iIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQueGFsYW4uamFyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY29tcGF0LmNsYXNzZXN9IgotICAgICAgICAgICBpbmNsdWRlcz0iKiovKi5qYXZhIgotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jb21wYXQuY2xhc3Nlc30iPgotICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb21wYXQuc3JjLmRpcn0iIGluY2x1ZGVzPSIqKi8qLnByb3BlcnRpZXMsKiovKi5yZXMiLz4KLSAgICA8L2NvcHk+ICAKLSAgICA8amFyIGphcmZpbGU9IiR7YnVpbGQuY29tcGF0Lmphcn0iIG1hbmlmZXN0PSJzcmNcTUFOSUZFU1QuTUYiIGJhc2VkaXI9IiR7YnVpbGQuY29tcGF0LmNsYXNzZXN9Ii8+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBhdC5wYWNrYWdlIiBkZXBlbmRzPSJjb21wYXQuamFyIj4KLSAgICA8ZWNobyBtZXNzYWdlPSJjb21wYXQucGFja2FnZSBpcyBhbiBhbGlhcyBmb3IgY29tcGF0LmphciIvPiAgCi0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENyZWF0ZXMgdGhlIFhhbGFuLUoxIGNvbXBhdGFiaWxpdHkgamF2YWRvYyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJjb21wYXQuamF2YWRvY3MiIGRlcGVuZHM9ImphciI+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5jb21wYXQuYXBpZG9jc30iLz4KLSAgICA8amF2YWRvYwotICAgICAgICAgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iCi0gICAgICAgICBwdWJsaWM9InRydWUiCi0gICAgICAgICBzb3VyY2VwYXRoPSIke2NvbXBhdC5zcmMuZGlyfSIKLSAgICAgICAgIG92ZXJ2aWV3PSIke2NvbXBhdC5zcmMuZGlyfS9jb21wYXRPdmVydmlldy5odG1sIiAgICAgICAgIAotICAgICAgICAgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLnhhbGFuLnhzbHQsb3JnLmFwYWNoZS54YWxhbi54cGF0aCxvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbCIKLSAgICAgICAgIGF1dGhvcj0idHJ1ZSIKLSAgICAgICAgIHZlcnNpb249InRydWUiCi0gICAgICAgICB1c2U9InRydWUiCi0gICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNvbXBhdC5hcGlkb2NzfSIKLSAgICAgICAgIHdpbmRvd3RpdGxlPSJYYWxhbi1KYXZhIDEgQ29tcGF0YWJpbGl0eSIgCi0gICAgICAgICBkb2N0aXRsZT0iWGFsYW4tSmF2YSAxIENvbXBhdGFiaWxpdHkiCi0gICAgICAgICBib3R0b209IkNvcHlyaWdodCAmIzE2OTsgJHt5ZWFyfSBBcGFjaGUgWE1MIFByb2plY3QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIj4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iY29tcGF0LmFwaWRvY3MiIGRlcGVuZHM9ImNvbXBhdC5qYXZhZG9jcyI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iY29tcGF0LmFwaWRvY3MgaXMgYW4gYWxpYXMgZm9yIGNvbXBhdC5qYXZhZG9jcyIvPiAgCi0gIDwvdGFyZ2V0PgotICAgIAotCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBDb21waWxlcyB0aGUgc2FtcGxlcyAoc2VydmxldCBleGNsdWRlZCkgYW5kIGphcnMgdGhlIGNsYXNzIGZpbGVzICAgIC0tPiAgCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJzYW1wbGVzIiBkZXBlbmRzPSJqYXIiCi0gICAgZGVzY3JpcHRpb249IkNvbXBpbGUgYW5kIGphciB0aGUgc2FtcGxlcyAoZXhjZXB0IHNlcnZsZXQpIiA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImV4Y2x1ZGUiIHZhbHVlPSIqLnhtbCwqLnhzbCwqLnR4dCwqLmh0bWwsKi5wcm9wZXJ0aWVzLCoub3V0Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5zYW1wbGVzfSIvPgotICAgIDwhLS0gU2luY2UgdGhlIHNhbXBsZXMgYXJlIHBhY2thZ2VsZXNzLCB0aGV5IG11c3QgYmUgY29tcGlsZWQgc2VwYXJhdGVseS4gLS0+ICAgCi0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzLmRpcn0vU2ltcGxlVHJhbnNmb3JtIiBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLnhhbGFuLmphcn0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLnNhbXBsZXN9IiAgZXhjbHVkZXM9IiR7ZXhjbHVkZX0iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c2FtcGxlcy5kaXJ9L1VzZVN0eWxlc2hlZXRQSSIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9IiAgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuc2FtcGxlc30iICBleGNsdWRlcz0iJHtleGNsdWRlfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzLmRpcn0vVXNlU3R5bGVzaGVldFBhcmFtIiBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLnhhbGFuLmphcn0iCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuc2FtcGxlc30iICBleGNsdWRlcz0iJHtleGNsdWRlfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+ICAgICAgICAgICAKLSAgICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXMuZGlyfS9TQVgyU0FYIiBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLnhhbGFuLmphcn0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLnNhbXBsZXN9IiAgZXhjbHVkZXM9IiR7ZXhjbHVkZX0iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPiAgICAgICAgICAgCi0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzLmRpcn0vRE9NMkRPTSIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5zYW1wbGVzfSIgIGV4Y2x1ZGVzPSIke2V4Y2x1ZGV9IgotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXMuZGlyfS9QaXBlIiBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLnhhbGFuLmphcn0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLnNhbXBsZXN9IiAgZXhjbHVkZXM9IiR7ZXhjbHVkZX0iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPiAgICAgICAgICAgCi0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzLmRpcn0vVXNlWE1MRmlsdGVycyIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5zYW1wbGVzfSIgIGV4Y2x1ZGVzPSIke2V4Y2x1ZGV9IgotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXMuZGlyfS9UcmFjZSIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9IiAgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuc2FtcGxlc30iICBleGNsdWRlcz0iJHtleGNsdWRlfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXMuZGlyfS9BcHBseVhQYXRoIiBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLnhhbGFuLmphcn0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLnNhbXBsZXN9IiBleGNsdWRlcz0iJHtleGNsdWRlfSIgCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzLmRpcn0vdHJheCIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5zYW1wbGVzfSIgZXhjbHVkZXM9IiR7ZXhjbHVkZX0iIAotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgIDxqYXZhYyBzcmNkaXI9IiR7c2FtcGxlcy5kaXJ9L2V4dGVuc2lvbnMiIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQueGFsYW4uamFyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuc2FtcGxlc30iIGV4Y2x1ZGVzPSIke2V4Y2x1ZGV9IiAKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+IAotICAgIDxqYXIgamFyZmlsZT0iJHtidWlsZC5kaXJ9L3hhbGFuc2FtcGxlcy5qYXIiIGJhc2VkaXI9IiR7YnVpbGQuc2FtcGxlc30iCi0gICAgICAgICBpbmNsdWRlcz0iKi5jbGFzcyIvPgotICAgICAgICAgICAgICAgICAgIAotICA8L3RhcmdldD4KLSAgCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBDb21waWxlcyB0aGUgc2FtcGxlIHNlcnZsZXQgYW5kIGphcnMgdGhlIGNsYXNzIGZpbGVzLiAgICAgICAgICAgICAgICAtLT4gIAotICA8IS0tIFRoZSBqYXZheC5zZXJ2bGV0IGFuZCBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZXMgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tIG11c3QgYmUgb24gdGhlIGNsYXNzcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gPHRhcmdldCBuYW1lPSJzZXJ2bGV0IiBkZXBlbmRzPSJqYXIiCi0gICAgZGVzY3JpcHRpb249IkNvbXBpbGUgYW5kIGphciB0aGUgc2VydmxldCBzYW1wbGVzIiA+Ci0gICAgIDxlY2hvIG1lc3NhZ2U9IlRvIGNvbXBpbGUgdGhlIHNhbXBsZSBzZXJ2bGV0cywgamF2YXguc2VydmxldCBhbmQgamF2YXguc2VydmxldC5odHRwIG11c3QgYmUgb24gdGhlIGNsYXNzcGF0aCIvPiAgIAotICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnNhbXBsZXN9L3NlcnZsZXQiLz4KLSAgICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzLmRpcn0vc2VydmxldCIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5zYW1wbGVzfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5zYW1wbGVzfS9zZXJ2bGV0Ij4KLSAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c2FtcGxlcy5kaXJ9L3NlcnZsZXQiIAotICAgICAgICAgICAgICAgIGluY2x1ZGVzPSJtZWRpYS5wcm9wZXJ0aWVzLGRlZmF1bHQueHNsLGRlZmF1bHQyLnhzbCIvPgotICAgICAgICA8L2NvcHk+ICAJCSAgICAgICAgIAotICAgIDxqYXIgamFyZmlsZT0iJHtidWlsZC5kaXJ9L3hhbGFuc2VydmxldC5qYXIiIAotICAgICAgICAgYmFzZWRpcj0iJHtidWlsZC5zYW1wbGVzfSIgCi0gICAgICAgICBpbmNsdWRlcz0ic2VydmxldC8qKiIvPgotIDwvdGFyZ2V0PgotIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gR2VuZXJhdGUgSFRNTCBkb2NzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8dGFyZ2V0IG5hbWU9ImRvY3MiIGRlcGVuZHM9ImphcixwcmVwYXJlLmRvY3MsYXV0b2RvY3MiCi0gICAgZGVzY3JpcHRpb249IkJ1aWxkIHRoZSBmcmFtZXdvcmsgZG9jdW1lbnRhdGlvbiAob3ZlcnZpZXcsIHJlYWRtZSwgZXRjLikiID4KLSAgICA8ZWNobyBtZXNzYWdlPSJkb2NzIGlzIGh1bWFuLXVzYWJsZSB0YXJnZXQgd2l0aCBkZXBlbmRlbmNpZXMiLz4gIAotICA8L3RhcmdldD4KLSAgCi0gIDx0YXJnZXQgbmFtZT0iYXV0b2RvY3MiPgotICAgIDxlY2hvIG1lc3NhZ2U9ImF1dG9kb2NzIGlzIGZvciBhdXRvbWF0ZWQgYnVpbGQgcHJvY2Vzcywgd2l0aG91dCBkZXBlbmRlbmNpZXMiLz4gICAKLSAgICA8amF2YSBmb3JrPSJ5ZXMiIGNsYXNzbmFtZT0iJHtkb2MuZ2VuZXJhdG9yfSIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9Ij4KLSAgICAgICA8YXJnIGxpbmU9InRhcmdldERpcmVjdG9yeT0ke2J1aWxkLmRvY3N9ICR7eGRvY3MuYm9va30gJHt4ZG9jcy5zdHlsZX0iLz4KLSAgICAgICAgPC9qYXZhPgkgCi0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENyZWF0ZXMgdGhlIEFQSSBkb2N1bWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jcyIgZGVwZW5kcz0icHJlcGFyZS5kb2NzLGF1dG9qYXZhZG9jcyIKLSAgICBkZXNjcmlwdGlvbj0iQnVpbGQgdGhlIEphdmFkb2NzIGZvciBYYWxhbiBzb3VyY2VzIiA+Ci0gICAgPGVjaG8gbWVzc2FnZT0iamF2YWRvY3MgaXMgaHVtYW4tdXNhYmxlIHRhcmdldCB3aXRoIGRlcGVuZGVuY2llcyIvPiAgCi0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iYXV0b2phdmFkb2NzIj4KLSAgICA8ZWNobyBtZXNzYWdlPSJhdXRvamF2YWRvY3MgaXMgZm9yIGF1dG9tYXRlZCBidWlsZCBwcm9jZXNzLCB3aXRob3V0IGRlcGVuZGVuY2llcyIvPgotICAgIAotICAgIDwhLS0gZ2VuZXJhdGUgdHJheC5odG1sLCBhIFRSYVggb3ZlcnZpZXcgZG9jdW1lbnQsIGFuZCBhIHBhY2thZ2UuaHRtbCBmb3IgZWFjaCB0cmF4IHBhY2thZ2UKLSAgICAgICAgICh0aGUgbGF0dGVyIGFyZSBnZW5lcmF0ZWQgd2l0aCB0aGUgdGhlIFJlZGlyZWN0IGV4dGVuc2lvbiAtLT4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmFwaWRvY3N9L2phdmF4L3htbC90cmFuc2Zvcm0iLz4gICAgICAgICAKLSAgICA8amF2YSBmb3JrPSJ5ZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MiIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQueGFsYW4uamFyfSI+Ci0gICAgICA8YXJnIGxpbmU9Ii1pbiAke3hkb2NzLmRpcn0vc291cmNlcy90cmF4L3RyYXgueG1sCi0gICAgICAgICAgICAgICAgIC1wYXJhbSBwYWNrYWdlLXJvb3QgJy4uLy4uLy4uL3NyYy8nCi0gICAgICAgICAgICAgICAgIC14c2wgJHt4ZG9jcy5zdHlsZX0vc3R5bGVzaGVldHMvc3BlYy54c2wgCi0gICAgICAgICAgICAgICAgIC1vdXQgJHtidWlsZC5hcGlkb2NzfS9qYXZheC94bWwvdHJhbnNmb3JtL3RyYXguaHRtbCIvPgotICAgIDwvamF2YT4gICAKLSAgICAKLSAgICA8IS0tIEFudCAxLjIgaWdub3JlcyBkZXN0ZGlyIGFyZyBpZiBkb2NsZXQgaXMgc2V0LCBzbyBtdXN0IHNlbmQgdG8gZG9jbGV0IGluIGRvY2xldCBzdWJlbGVtZW50LS0+Ci0gICAgPGphdmFkb2MKLSAgICAgICAgIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IgotICAgICAgICAgcHVibGljPSJ0cnVlIgotICAgICAgICAgc291cmNlcGF0aD0iJHtzcmMuZGlyfSIKLSAgICAgICAgIG92ZXJ2aWV3PSIke3NyYy5kaXJ9L2phdmFkb2NPdmVydmlldy5odG1sIgotICAgICAgICAgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLiosb3JnLnhtbC4qLG9yZy53M2MuKixqYXZheC54bWwuKiIKLSAgICAgICAgIGF1dGhvcj0idHJ1ZSIKLSAgICAgICAgIHZlcnNpb249InRydWUiCi0gICAgICAgICB1c2U9InRydWUiCi0gICAgICAgICB3aW5kb3d0aXRsZT0iJHtOYW1lfSAyIiAKLSAgICAgICAgIGRvY3RpdGxlPSIke05hbWV9IDIiCi0gICAgICAgICBib3R0b209IkNvcHlyaWdodCAmIzE2OTsgJHt5ZWFyfSBBcGFjaGUgWE1MIFByb2plY3QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIj4KLSAgICAgICAgICA8ZG9jbGV0IG5hbWU9InhhbGFuamRvYy5TdGFuZGFyZCIgcGF0aD0iJHtiaW4uZGlyfS94YWxhbjJqZG9jLmphciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iLWQiIHZhbHVlPSIke2J1aWxkLmFwaWRvY3N9Ii8+Ci0gICAgICAgICAgPC9kb2NsZXQ+Ci0gICAgICAgICAgPGdyb3VwIHRpdGxlPSJUcmFuc2Zvcm1hdGlvbnMgQVBJIGZvciBYTUwgKFRyQVgpIiBwYWNrYWdlcz0iamF2YXgueG1sLnRyYW5zZm9ybSoiLz4KLSAgICAgICAgICA8Z3JvdXAgdGl0bGU9IkphdmEgQVBJIGZvciBYTUwgUGFyc2luZyIgcGFja2FnZXM9ImphdmF4LnhtbC5wYXJzZXJzIi8+Ci0gICAgICAgICAgPGdyb3VwIHRpdGxlPSJYYWxhbiBDb3JlIgotICAgICAgICAgICAgICAgICBwYWNrYWdlcz0ib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3I6b3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXM6b3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lciIvPgotICAgICAgICAgIDxncm91cCB0aXRsZT0iWFBhdGgiIHBhY2thZ2VzPSJvcmcuYXBhY2hlLnhwYXRoKiIvPgotICAgICAgICAgIDxncm91cCB0aXRsZT0iVXRpbGl0aWVzIiBwYWNrYWdlcz0ib3JnLmFwYWNoZS54bWwudXRpbHMqIi8+Ci0gICAgICAgICAgPGdyb3VwIHRpdGxlPSJYYWxhbiBPdGhlciIgcGFja2FnZXM9Im9yZy5hcGFjaGUueGFsYW4uY2xpZW50Om9yZzpvcmcuYXBhY2hlLnhhbGFuLmV4dGVuc2lvbnM6b3JnLmFwYWNoZS54YWxhbi5yZXM6b3JnLmFwYWNoZS54YWxhbi5zdHJlZTpvcmcuYXBhY2hlLnhhbGFuLnRyYWNlOm9yZy5hcGFjaGUueGFsYW4ueHNsdCIvPgotICAgICAgICAgIDxncm91cCB0aXRsZT0iWGFsYW4gRXh0ZW5zaW9ucyIgcGFja2FnZXM9Im9yZy5hcGFjaGUueGFsYW4ubGliKiIvPgotICAgICAgICAgIDxncm91cCB0aXRsZT0iU2VyaWFsaXplcnMiIHBhY2thZ2VzPSJvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZSIvPgotICAgICAgICAgIDxncm91cCB0aXRsZT0iU0FYIDIiIHBhY2thZ2VzPSJvcmcueG1sLnNheCoiLz4KLSAgICAgICAgICA8Z3JvdXAgdGl0bGU9IkRPTSAyIiBwYWNrYWdlcz0ib3JnLnczYy5kb20qIi8+Ci0gICAgPC9qYXZhZG9jPgotICAgIAotICA8L3RhcmdldD4KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ2xlYW5zIGV2ZXJ5dGhpbmc6IGJ1aWxkIHRyZWUsIHNpdGUgdHJlZSwgc3R5bGUgZG9jcyBpbiAgICAgICAgICAgICAtLT4KLSAgPCEtLSAgICAgICAgIC0gYnVpbGQgdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tICAgICAgICAgLSBkaXN0cmlidXRpb24gdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gICAgICAgICAtIHNpdGUgdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSAgICAgICAgIC0gc3R5bGUgZG9jcyBleHBhbmRlZCBmcm9tIHhtbC1zaXRlLXN0eWxlLnRhci5nei4gICAgICAgICAgIC0tPgotICA8IS0tICAgICAgICAgICAoTVVTVCB1cGRhdGUgY29udGVudHMgb2YgJHt4YWxhbm9ubHktc3R5bGVkb2NzfSAgICAgICAgICAgLS0+Ci0gIDwhLS0gICAgICAgICAgICBpZiBjaGFuZ2UgY29udGVudHMgb2YgeG1sLXNpdGUtc3R5bGUudGFyLmd6KSAgICAgICAgICAgICAtLT4KLSAgPCEtLSAgICAgICAgIC0gSmF2YWRvYyBvdmVydmlldyBhbmQgcGFja3FhZ2UtbGV2ZWwgaHRtbCBkb2NzIHBsYWNlZCAgICAgIC0tPgotICA8IS0tICAgICAgICAgICBpbiB0aGUgc291cmNlIHRyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIKLSAgICBkZXNjcmlwdGlvbj0iQ2xlYW4gdXAgdGhlIGJ1aWxkIiA+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgIDxkZWxldGUgZGlyPSIke3NpdGUucm9vdH0iLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3hkb2NzLnN0eWxlfSIgZXhjbHVkZXM9IiR7eGFsYW5vbmx5LXN0eWxlZG9jc30iLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBDcmVhdGVzIHRoZSBkaXN0cmlidXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iamFyLGRvY3MsamF2YWRvY3Msc2FtcGxlcyxzZXJ2bGV0LGNvbXBhdC5qYXIsY29tcGF0LmphdmFkb2NzLGF1dG9kaXN0IgotICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSAuemlwLy50YXIuZ3ogZGlzdHJpYnV0aW9uIG1vZHVsZSIgPgotICAgIDxlY2hvIG1lc3NhZ2U9ImRpc3QgaXMgaHVtYW4tdXNlYWJsZSB0YXJnZXQgZm9yIGRpc3RyaWJ1dGlvbiwgd2l0aCBhbGwgZGVwZW5kZW5jaWVzIi8+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImF1dG9kaXN0Ij4KLSAgICA8ZWNobyBtZXNzYWdlPSJhdXRvZGlzdCBpcyBmb3IgYXV0b21hdGVkIGJ1aWxkIHByb2Nlc3Nlcywgd2l0aG91dCBkZXBlbmRlbmNpZXMiLz4KLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZGlyfSIvPgotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5kaXJ9L2JpbiIvPiAgICAKLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZGlyfS9zcmMiLz4KLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZGlyfS9jb21wYXRfc3JjIi8+ICAgIAotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5kaXJ9L3hkb2NzIi8+Ci0gICAgPG1rZGlyIGRpcj0iJHtkaXN0LmRpcn0vZG9jcyIvPgotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5kaXJ9L2RvY3MvYXBpZG9jcyIvPgotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5kaXJ9L2RvY3MvY29tcGF0X2FwaWRvY3MiLz4gICAgCi0gICAgPG1rZGlyIGRpcj0iJHtkaXN0LmRpcn0vc2FtcGxlcyIvPgotICAgICAgICAKLSAgICAgICAgPCEtLSBDb3B5IGJpbiBkaXJlY3RvcnkgLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC5kaXJ9L2JpbiI+Ci0gICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jpbi5kaXJ9Ii8+Ci0gICAgICAgIDwvY29weT4gIAotCi0gICAgPCEtLSBDb3B5IHNvdXJjZXMgYW5kIHNvdXJjZSBkb2N1bWVudGF0aW9uIC0tPgotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuZGlyfS9zcmMiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ii8+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuZGlyfS9jb21wYXRfc3JjIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb21wYXQuc3JjLmRpcn0iLz4KLSAgICA8L2NvcHk+ICAgIAotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuZGlyfS94ZG9jcyI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7eGRvY3MuZGlyfSIvPgotICAgIDwvY29weT4KLSAgICAKLSAgICA8IS0tIENvcHkgYnVpbHQgZG9jdW1lbnRhdGlvbiBhbmQgamF2YWRvYywgYW5kIHNhbXBsZXMgc3JjIGFuZCBqYXJzIC0tPgotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuZGlyfS9kb2NzIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kb2NzfSIvPgotICAgIDwvY29weT4gIAotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuZGlyfS9zYW1wbGVzIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtzYW1wbGVzLmRpcn0iLz4KLSAgICA8L2NvcHk+ICAgCi0gICAgPGNvcHkgZmlsZT0iJHtidWlsZC5kaXJ9L3hhbGFuc2FtcGxlcy5qYXIiIHRvZGlyPSIke2Rpc3QuZGlyfS9iaW4iLz4KLSAgICA8Y29weSBmaWxlPSIke2J1aWxkLmRpcn0veGFsYW5zZXJ2bGV0LmphciIgdG9kaXI9IiR7ZGlzdC5kaXJ9L2JpbiIvPgotCi0gICAgPCEtLSBDb3B5IHhhbGFuIGphciBhbmQgY29tcGFiaWxpdHkgaW50byB0aGUgYmluIGRpcmVjdG9yeSAoc3ViamVjdCB0byBjaGFuZ2UpIC0tPgotICAgIDxjb3B5IGZpbGU9IiR7YnVpbGQueGFsYW4uamFyfSIgdG9kaXI9IiR7ZGlzdC5kaXJ9L2JpbiIvPgotICAgIDxjb3B5IGZpbGU9IiR7YnVpbGQuY29tcGF0Lmphcn0iIHRvZGlyPSIke2Rpc3QuZGlyfS9iaW4iLz4gICAgCi0KLSAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LmRpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0icmVhZG1lLmh0bWwsS0VZUyxMaWNlbnNlLGJ1aWxkLnhtbCxidWlsZC5zaCxidWlsZC5iYXQsdG9kby54bWwsdG9kby54c2wsY29tbWl0cy54bWwiLz4KLSAgICA8L2NvcHk+Ci0gICAgICAgICAgCi0gICAgPHppcCB6aXBmaWxlPSIke2J1aWxkLmRpcn0vJHtkaXN0LmZpbGV9LnppcCIgYmFzZWRpcj0iJHtidWlsZC5kaXJ9IiBpbmNsdWRlcz0iJHtkaXN0LmZpbGV9LyoqIi8+Ci0gICAgPHRhciB0YXJmaWxlPSIke2J1aWxkLmRpcn0vJHtkaXN0LmZpbGV9LnRhciIgYmFzZWRpcj0iJHtidWlsZC5kaXJ9IiBpbmNsdWRlcz0iJHtkaXN0LmZpbGV9LyoqIi8+Ci0gICAgPGd6aXAgc3JjPSIke2J1aWxkLmRpcn0vJHtkaXN0LmZpbGV9LnRhciIgemlwZmlsZT0iJHtidWlsZC5kaXJ9LyR7ZGlzdC5maWxlfS50YXIuZ3oiLz4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ3JlYXRlcyB0aGUgZG9jdW1lbnRhdGlvbiB0cmVlIGZvciB0aGUgb3JnLmFwYWNoZS54bWwgd2Vic2l0ZSAgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8dGFyZ2V0IG5hbWU9InNpdGUiIGRlcGVuZHM9InByZXBhcmUuZG9jcyI+Ci0gCi0gICAgPG1rZGlyIGRpcj0iJHtzaXRlLmRpcn0vYXBpZG9jcyIvPgotICAgIDxta2RpciBkaXI9IiR7c2l0ZS5kaXJ9L2NvbXBhdF9hcGlkb2NzIi8+Ci0gICAgPG1rZGlyIGRpcj0iJHtzaXRlLmRpcn0vZGVzaWduIi8+Ci0gICAgPGphdmEgZm9yaz0ieWVzIiBjbGFzc25hbWU9IiR7ZG9jLmdlbmVyYXRvcn0iIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQuZGlyfS8keGFsYW4uamFyIj4gCi0gICAgICAgPGFyZyBsaW5lPSJ0YXJnZXREaXJlY3Rvcnk9JHtzaXRlLmRpcn0gJHtzaXRlLmJvb2t9ICR7eGRvY3Muc3R5bGV9Ii8+Ci0gICAgICAgIDwvamF2YT4KLQotICAgICAgICA8IS0tIHB1dCB0b2RvLmh0bWwgaW4gdGhlIHNpdGUgZGlyZWN0b3J5IC0tPiAgICAgCi0gICAgPGNvcHkgZmlsZT0iJHtidWlsZC5kb2NzfS90b2RvLmh0bWwiIHRvZGlyPSIke3NpdGUuZGlyfSIvPgotICAgICA8IS0tIHB1dCB4YWxhbiBkZXNpZ24gZG9jIGluIHRoZSBzaXRlIGRlc2lnbiBzdWJkaXIgLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7c2l0ZS5kaXJ9L2Rlc2lnbiI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZG9jc30vZGVzaWduIi8+Ci0gICAgPC9jb3B5PiAgCi0gICAgPCEtLSBwdXQgaW4gdGhlIGphdmFkb2MgLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7c2l0ZS5kaXJ9L2FwaWRvY3MiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmFwaWRvY3N9Ii8+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke3NpdGUuZGlyfS9jb21wYXRfYXBpZG9jcyI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuY29tcGF0LmFwaWRvY3N9Ii8+Ci0gICAgPC9jb3B5PiAgCi0gICAgICAKLSAgPC90YXJnZXQ+Ci0gICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENvbXBpbGVzIGFuZCBydW5zIHRoZSBtaW5pdGVzdCBmcm9tIHhtbC14YWxhblx0ZXN0LCBpZiBwcmVzZW50ICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHBhdGggaWQ9Im1pbml0ZXN0LmNsYXNzLnBhdGgiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4ZXJjZXMuamFyfSIgLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQueGFsYW4uamFyfSIgLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnNmLmphcn0iIC8+Ci0gICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KLSAgPC9wYXRoPgotCi0gIDwhLS0gUmVmZXJlbmNlIGZyb20gdGhlIHRlc3RpbmcgZGlyZWN0b3J5IGJhY2sgdG8gb3VyIGRpcmVjdG9yeSwgCi0gICAgICAgdXNlZCB3aGVuIGNhbGxpbmcgdGVzdGluZyB0YXJnZXRzIHRvIHNldCB0aGUgY2xhc3NwYXRoIGZvciAKLSAgICAgICB0aGUgdGVzdHMgdG8gaW5jbHVkZSBqYXJzIHdlIGp1c3QgY29tcGlsZWQuCi0gIC0tPgotICA8cHJvcGVydHkgbmFtZT0idGVzdHMuYmFja3JlZiIgdmFsdWU9Ii4uLy4uL2phdmEvIi8+Ci0KLSAgPHRhcmdldCBuYW1lPSJtaW5pdGVzdCIgZGVwZW5kcz0icHJlcGFyZSxqYXIsbWluaXRlc3QtcnVuLHRlc3RzLW5vdC1hdmFpbGFibGUiIAotICAgIGRlc2NyaXB0aW9uPSJSdW4gdGhlIE1pbml0ZXN0IGZyb20geG1sLXhhbGFuL3Rlc3QvamF2YSIgPgotICAgIDwhLS0gVGhpcyB0YXJnZXQgZXhwbGljaXRseSBkZXBlbmRzIG9uIHRoZSBqYXIgdGFyZ2V0LCBzaW5jZSAKLSAgICAgICAgIHdpdGhvdXQgeGFsYW4uamFyIHRoZSB0ZXN0cyB3b24ndCBjb21waWxlL3J1bi4KLSAgICAgICAgIFdlIHRoZW4gY2FsbCB0aGUgd29ya2VyIHRhcmdldCBtaW5pdGVzdC1ydW4gdG8gZG8gCi0gICAgICAgICB0aGUgd29yayBvZiBydW5uaW5nIHRoZSBtaW5pdGVzdC4KLSAgICAgICAgIFdlIGZpbmFsbHkgY2FsbCBhIGhlbHBlciB0YXJnZXQgdGVzdHMtbm90LWF2YWlsYWJsZSAKLSAgICAgICAgIHRvIG5vdGlmeSB1c2VycyB0aGF0IHRoZXkgbmVlZCB0byBjaGVja291dCB0aGUgdGVzdHMgCi0gICAgICAgICBleHBsaWNpdGx5IGZyb20gQ1ZTIC0gYnV0IHRoaXMgb25seSBydW5zIGlmIG5lZWRlZC4KLSAgICAtLT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0ibWluaXRlc3QtcnVuIiBpZj0idGVzdHMtYXZhaWxhYmxlIiBkZXBlbmRzPSJwcmVwYXJlIiA+Ci0gICAgPGVjaG8gbWVzc2FnZT0iIFttaW5pdGVzdF0gQ2FsbGluZyAke3Rlc3RzLmRpcn1idWlsZC54bWwgbm93IHRvIHJ1biBtaW5pdGVzdC54YWxhbjIiIC8+Ci0gICAgPGFudCBkaXI9IiR7dGVzdHMuZGlyfSIgYW50ZmlsZT0iYnVpbGQueG1sIiB0YXJnZXQ9Im1pbml0ZXN0LnhhbGFuMiIgPgotICAgICAgPCEtLSBTZXQgdGhlIGJlbG93IHRlc3R4c2wuamFyLm5hbWUgc28gdGhhdCBpdCB3aWxsIGNyZWF0ZSAKLSAgICAgICAgICAgbWluaXRlc3QuamFyIGluc3RlYWQgb2YgdGVzdHhzbC5qYXI7IHdlIG9ubHkgZG8gdGhpcyBoZXJlIAotICAgICAgICAgICBzaW5jZSB0aGlzIGlzIGEgY29tbW9ubHktY2FsbGVkIGRldmVsb3BlciB0YXJnZXQsIGFuZCBpdCdzIAotICAgICAgICAgICBnb29kIHRvIGRpZmZlcmVudGlhdGUgdGhpcyBqYXIgZnJvbSB0aGUgcmVndWxhciB0ZXN0aW5nIGphciAKLSAgICAgICAgICAgKHdoaWNoIGhhcyBtYW55IG1vcmUgdGVzdCBjbGFzc2VzIGluIGl0KS4KLSAgICAgIC0tPgotICAgICAgPHByb3BlcnR5IG5hbWU9InRlc3R4c2wuamFyLm5hbWUiIHZhbHVlPSJtaW5pdGVzdC5qYXIiIC8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icHJlcGVuZC5jbGFzcy5wYXRoIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3Rlc3RzLmJhY2tyZWZ9JHt4ZXJjZXMuamFyfToke3Rlc3RzLmJhY2tyZWZ9JHtidWlsZC54YWxhbi5qYXJ9OiR7dGVzdHMuYmFja3JlZn0ke2JzZi5qYXJ9IiAvPgotICAgIDwhLS0gV2h5IGRvZXNuJ3QgdGhlIGZvbGxvd2luZyByZWZpZCB3b3JrPyBJIGdldCBhbiBlcnJvciByZWZlcmVuY2luZyBpdC4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcmVwZW5kLmNsYXNzLnBhdGgiIHJlZmlkPSJtaW5pdGVzdC5jbGFzcy5wYXRoIiAvPgotICAgIC0tPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIENhbGxlZCBmcm9tIHZhcmlvdXMgdGVzdGluZyB0YXJnZXRzIGlmIHRoZSB0ZXN0IGRpciBkb2Vzbid0IGV4aXN0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0cy1ub3QtYXZhaWxhYmxlIiB1bmxlc3M9InRlc3RzLWF2YWlsYWJsZSIgPgotICAgIDxlY2hvIG1lc3NhZ2U9IiBbdGVzdHNdIFRoZSB0ZXN0cyBkbyBub3Qgc2VlbSB0byBiZSBwcmVzZW50ISIgLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIgW3Rlc3RzXSBZb3UgbXVzdCBoYXZlIGNoZWNrZWQgb3V0IGZyb20gQ1ZTIHRvIHJ1biB0aGUgdGVzdHMsIiAvPgotICAgIDxlY2hvIG1lc3NhZ2U9IiBbdGVzdHNdICAgaXQgaXMgbm90IGluY2x1ZGVkIGluIGJpbmFyeSBkaXN0cmlidXRpb25zLiIgLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIgW3Rlc3RzXSBTZWUgaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuLWovdGVzdC8gZm9yIG1vcmUgaW5mby4iIC8+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENvbXBpbGVzIGFuZCBydW5zIHRoZSBjb25mb3JtYW5jZSB0ZXN0IGZyb20geG1sLXhhbGFuXHRlc3QsIGlmIHByZXNlbnQgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIFdlIHNob3VsZCBoYXZlIGEgZHVwbGljYXRlIG9mIG1pbml0ZXN0LmNsYXNzLnBhdGggdGhhdAotICAgICAgIGluIHRoZSBmdXR1cmUgdGhpcyBtYXkgbmVlZCB0byBpbmNsdWRlIHJlZmVyZW5jZXMgdG8gZGlycyAKLSAgICAgICB3aGVyZSBKYXZhLWJhc2VkIGV4dGVuc2lvbiB0ZXN0cyBrZWVwIHRoZWlyIC5jbGFzc2VzLgotICAtLT4KLQotICA8dGFyZ2V0IG5hbWU9ImNvbmZ0ZXN0IiBkZXBlbmRzPSJwcmVwYXJlLGphcixjb25mdGVzdC1ydW4sdGVzdHMtbm90LWF2YWlsYWJsZSIgCi0gICAgZGVzY3JpcHRpb249IlJ1biB0aGUgQ29uZm9ybWFuY2VUZXN0IGZyb20geG1sLXhhbGFuL3Rlc3QvamF2YSIgPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb25mdGVzdC1ydW4iIGlmPSJ0ZXN0cy1hdmFpbGFibGUiIGRlcGVuZHM9InByZXBhcmUiID4KLSAgICA8ZWNobyBtZXNzYWdlPSIgW2NvbmZ0ZXN0XSBDYWxsaW5nICR7dGVzdHMuZGlyfWJ1aWxkLnhtbCBub3cgdG8gcnVuIGNvbmZ0ZXN0LnhhbGFuMiIgLz4KLSAgICA8YW50IGRpcj0iJHt0ZXN0cy5kaXJ9IiBhbnRmaWxlPSJidWlsZC54bWwiIHRhcmdldD0iY29uZnRlc3QueGFsYW4yIiA+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0idGVzdHhzbC5qYXIubmFtZSIgdmFsdWU9ImNvbmZ0ZXN0LmphciIgLz4gCi0gICAgICA8IS0tIFNldCBuYW1lIGFib3ZlIHNvIHRoYXQgaXQgd2lsbCBjcmVhdGUgY29uZnRlc3QuamFyIGluc3RlYWQgCi0gICAgICAgICAgIG9mIHRlc3R4c2wuamFyIC0gYnV0LCBzaW5jZSB0aGUgIkNvbmZvcm1hbmNlVGVzdCIgZGVwZW5kcyAKLSAgICAgICAgICAgb24gc28gbWFueSB0ZXN0aW5nIGNsYXNzZXMsIGl0IG1heSBub3QgYmUgd29ydGggY2FsbGluZyAKLSAgICAgICAgICAgdGhpcyBhIGRpZmZlcmVudCBuYW1lIGZyb20gdGhlIGRlZmF1bHQgJ3Rlc3R4c2wuamFyJy4gIEl0IAotICAgICAgICAgICBkb2VzIHJlZHVjZSBjb25mdXNpb24sIGhvd2V2ZXIsIGZvciBwZW9wbGUgd2hvIGJ1aWxkIGFuZCAKLSAgICAgICAgICAgcnVuIHRoZSB0ZXN0cyBkaXJlY3RseSBmcm9tIHRoZSB0ZXN0aW5nIGRpcmVjdG9yeSwgaW5zdGVhZCAKLSAgICAgICAgICAgb2YgZG9pbmcgaXQgZnJvbSB0aGlzIGRpcmVjdG9yeS4KLSAgICAgIC0tPgotICAgICAgPHByb3BlcnR5IG5hbWU9InByZXBlbmQuY2xhc3MucGF0aCIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHt0ZXN0cy5iYWNrcmVmfSR7eGVyY2VzLmphcn06JHt0ZXN0cy5iYWNrcmVmfSR7YnVpbGQueGFsYW4uamFyfToke3Rlc3RzLmJhY2tyZWZ9JHtic2YuamFyfSIgLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ29tcGlsZXMgYW5kIHJ1bnMgdGhlIHNtb2tlIHRlc3QgZnJvbSB4bWwteGFsYW5cdGVzdCwgaWYgcHJlc2VudCAgICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic21va2V0ZXN0IiBkZXBlbmRzPSJwcmVwYXJlLGphcixzbW9rZXRlc3QtcnVuLHRlc3RzLW5vdC1hdmFpbGFibGUiIAotICAgIGRlc2NyaXB0aW9uPSJSdW4gdGhlIHNtb2tlIHRlc3QgLSB0byBiZSBkZWZpbmVkLiIgPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJzbW9rZXRlc3QtcnVuIiBpZj0idGVzdHMtYXZhaWxhYmxlIiBkZXBlbmRzPSJwcmVwYXJlIiA+Ci0gICAgPGFudCBkaXI9IiR7dGVzdHMuZGlyfSIgYW50ZmlsZT0iYnVpbGQueG1sIiB0YXJnZXQ9InNtb2tldGVzdC14YWxhbjIiID4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcmVwZW5kLmNsYXNzLnBhdGgiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7dGVzdHMuYmFja3JlZn0ke3hlcmNlcy5qYXJ9OiR7dGVzdHMuYmFja3JlZn0ke2J1aWxkLnhhbGFuLmphcn06JHt0ZXN0cy5iYWNrcmVmfSR7YnNmLmphcn0iIC8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENyZWF0ZXMgdGhlIHRvZG8gbGlzdCBmb3IgdGhlIG9yZy5hcGFjaGUueG1sIHdlYnNpdGUgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJ0b2RvIj4KLSAgICA8amF2YSBmb3JrPSJ5ZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MiIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQuZGlyfS8keGFsYW4uamFyIj4KLSAgICAgIDxhcmcgbGluZT0iLWluIHRvZG8ueG1sIC14c2wgdG9kby54c2wgLW91dCB0b2RvLmh0bWwiLz4KLSAgICA8L2phdmE+ICAgCi0gIDwvdGFyZ2V0PiAgCi0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENyZWF0ZXMgdGhlIHhhbGFuIGRlc2lnbiBkb2N1bWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9InhhbGFuLWoyLWRlc2lnbiI+Ci0gICAgPGphdmEgZm9yaz0ieWVzIiBjbGFzc25hbWU9IiR7ZG9jLmdlbmVyYXRvcn0iIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQuZGlyfS94YWxhbi5qYXIiPiAKLSAgICAgIDxhcmcgbGluZT0ibG9hZGVyQ29uZmlnPXNiazovc3R5bGUvbG9hZGVyZGVzaWduLnhtbCB0YXJnZXREaXJlY3Rvcnk9JHtidWlsZC5kaXJ9L2RvY3MvZGVzaWduLwotICAgICAgJHt4ZG9jcy5kaXJ9L3NvdXJjZXMveGFsYW5kZXNpZ24ueG1sICR7eGRvY3Muc3R5bGV9Ii8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLSAgCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBVc2UgRk9QIHRvIGNyZWF0ZSBwcmVsaW1pbmFyeSBwcmludCAocGRmKSBkb2MgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tIE5vdGU6IGZvcC5qYXIgYW5kIHhtbC5qYXIgKGZyb20geG1sLWZvcCkgbXVzdCBiZSBvbiBjbGFzc3BhdGggICAgICAgLS0+Ci0KLSAgPCEtLSBUaGlzIGlzIFZFUlkgcHJlbGltaW5hcnksIG5vdCB5ZXQgZm9yIGluY2x1c2lvbiBpbiBkaXN0cmlidXRpb24gICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPCEtLUNvbGxhdGUgdGhlIHhtbCBzb3VyY2VzIGludG8gYSBzaW5nbGUgeG1sIHNvdXJjZSB3aXRoIGEgbGl0bGUgZXh0cmEgc3RydWN0dXJlIC0tPgotICA8dGFyZ2V0IG5hbWU9InByaW50LmRvY3MiIGRlcGVuZHM9InByZXBhcmUuZG9jcyI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iZm9wLmphciBhbmQgeG1sLmphciBtdXN0IGJlIG9uIHRoZSBjbGFzc3BhdGgiLz4KLSAgICA8amF2YSBmb3JrPSJ5ZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MiCi0gICAgICBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLmRpcn0veGFsYW4uamFyIj4KLSAgICAgIDxhcmcgbGluZT0iLXhzbCAke3hkb2NzLmRpcn0vc291cmNlcy94YWxhbi1jb2xsYXRlLnhzbCAKLSAgICAgICAgICAgICAgICAgLW91dCAke3hkb2NzLmRpcn0vc291cmNlcy94YWxhbi94YWxhbi1jb2xsYXRlLnhtbCIvPgotICAgIDwvamF2YT4KLSAgICAKLSAgICA8IS0tIFRyYW5zZm9ybSBjb2xsYXRpb24gaW50byBGb3JtYXR0aW5nIE9iamVjdHMgCi0gICAgICAgICAod2l0aCBhIGxpdHRsZSB3b3JrIG9uIGxpbmtzIGFsb25nIHRoZSB3YXkpIC0tPiAgICAKLSAgICA8amF2YSBmb3JrPSJ5ZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MiCi0gICAgICBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLmRpcn0veGFsYW4uamFyIj4KLSAgICAgIDxhcmcgbGluZT0iLWluICAke3hkb2NzLmRpcn0vc291cmNlcy94YWxhbi94YWxhbi1jb2xsYXRlLnhtbAotICAgICAgICAgICAgICAgICAtcGFyYW0gcmVzb3VyY2VGaWxlICcuLi8uLi9zb3VyY2VzL3hhbGFuL3Jlc291cmNlcy54bWwnCi0gICAgICAgICAgICAgICAgIC1wYXJhbSBwcm9qZWN0ICR7TmFtZX0gICAgICAKLSAgICAgICAgICAgICAgICAgLXhzbCAke3hkb2NzLnN0eWxlfS9zdHlsZXNoZWV0cy94bWwyZm8ueHNsIAotICAgICAgICAgICAgICAgICAtb3V0ICR7YnVpbGQuZG9jc30veGFsYW4tY29sbGF0ZS5mbyIvPgotICAgIDwvamF2YT4KLSAgICAKLSAgICA8IS0tIFVzZSBGT1AgdG8gZ2VuZXJhdGUgYSBwZGYgZmlsZSAtLT4KLSAgICA8amF2YSBmb3JrPSJ5ZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5mb3AuYXBwcy5Db21tYW5kTGluZSIKLSAgICAgIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQuZGlyfS94YWxhbi5qYXI6JHtiaW4uZGlyfS9mb3AuamFyOiR7YmluLmRpcn0vdzNjLmphciI+Ci0gICAgICA8YXJnIGxpbmU9IiR7YnVpbGQuZG9jc30veGFsYW4tY29sbGF0ZS5mbyBidWlsZC9kb2NzL3hhbGFuLnBkZiIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPiAgCi0gICA8IS0tIGZvciBkZXZlbG9wZXJzIG9ubHk7IGNvbXBpbGVzIHhhbGFuLWoxIHNhbXBsZXMgd2l0aCBjb21wYXQgamFyIGFuZCB4YWxhbi1qMiB4YWxhbi5qYXItLT4KLSAgIDx0YXJnZXQgbmFtZT0iY29tcGF0LnNhbXBsZXMiIGRlc2NyaXB0aW9uPSJDb21waWxlIFhhbGFuSjEgc2FtcGxlcyIgPgotICAgICA8cHJvcGVydHkgbmFtZT0iZXhjbHVkZSIgdmFsdWU9IioueG1sLCoueHNsLCoudHh0LCouaHRtbC4qLnByb3BlcnRpZXMiLz4KLSAgICAgPHByb3BlcnR5IG5hbWU9InNhbXBsZXNqMS5kaXIiIHZhbHVlPSIveG1sLXhhbGFuL3NhbXBsZXMiLz4KLSAgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBhdC5zYW1wbGVzIiB2YWx1ZT0iLi9idWlsZC9jb21wYXRfc2FtcGxlcyIvPgotICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNvbXBhdC5zYW1wbGVzfSIvPiAgICAgCi0KLSAgICA8IS0tbmVlZCB0byB1c2UgdGhlIFhhbGFuSjIgWFBhdGhBUEksIHNvIGNhbm5vdCBjb21waWxlIEFwcGx5WFBhdGggYXMgaXMgLS0+ICAgCi0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzajEuZGlyfS9QaXBlIiBjbGFzc3BhdGg9IiR7YnVpbGQuY29tcGF0Lmphcn06JHtidWlsZC54YWxhbi5qYXJ9OiR7amF2YS5jbGFzcy5wYXRofSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9IiAgZXhjbHVkZXM9IiR7ZXhjbHVkZX0iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPiAKLSAgICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXNqMS5kaXJ9L1NpbXBsZVRyYW5zZm9ybSIgY2xhc3NwYXRoPSIke2J1aWxkLmNvbXBhdC5qYXJ9OiR7YnVpbGQueGFsYW4uamFyfToke2phdmEuY2xhc3MucGF0aH0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNvbXBhdC5zYW1wbGVzfSIgIGV4Y2x1ZGVzPSIke2V4Y2x1ZGV9IgotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXNqMS5kaXJ9L1RyYW5zZm9ybVRvRG9tIiBjbGFzc3BhdGg9IiR7YnVpbGQuY29tcGF0Lmphcn06JHtidWlsZC54YWxhbi5qYXJ9OiR7amF2YS5jbGFzcy5wYXRofSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9IiAgZXhjbHVkZXM9IiR7ZXhjbHVkZX0iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c2FtcGxlc2oxLmRpcn0vUHVyZVNBWCIgY2xhc3NwYXRoPSIke2J1aWxkLmNvbXBhdC5qYXJ9OiR7YnVpbGQueGFsYW4uamFyfToke2phdmEuY2xhc3MucGF0aH0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNvbXBhdC5zYW1wbGVzfSIgIGV4Y2x1ZGVzPSIke2V4Y2x1ZGV9IgotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4gICAgICAgICAgCi0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzajEuZGlyfS9Vc2VTdHlsZXNoZWV0UGFyYW0iIGNsYXNzcGF0aD0iJHtidWlsZC5jb21wYXQuamFyfToke2J1aWxkLnhhbGFuLmphcn06JHtqYXZhLmNsYXNzLnBhdGh9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jb21wYXQuc2FtcGxlc30iICBleGNsdWRlcz0iJHtleGNsdWRlfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzajEuZGlyfS9TZXJ2bGV0IiBjbGFzc3BhdGg9IiR7YnVpbGQuY29tcGF0Lmphcn06JHtidWlsZC54YWxhbi5qYXJ9OiR7amF2YS5jbGFzcy5wYXRofSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9IiBleGNsdWRlcz0iJHtleGNsdWRlfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICAgPGphciAgIGphcmZpbGU9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9L3hhbGFuamNvbXBhdHNhbXBsZXMuamFyIiBiYXNlZGlyPSIke2J1aWxkLmNvbXBhdC5zYW1wbGVzfSIKLSAgICAgICAgICAgIGluY2x1ZGVzPSIqLmNsYXNzIi8+IAotICAgICA8IS0tcHV0IHRoZSBzZXJ2bGV0IGluIGEgc2VwYXJhdGUgamFyIC0tPgotICAgICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXNqMS5kaXJ9L1NlcnZsZXQiIGNsYXNzcGF0aD0iJHtidWlsZC5jb21wYXQuamFyfToke2J1aWxkLnhhbGFuLmphcn06JHtqYXZhLmNsYXNzLnBhdGh9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jb21wYXQuc2FtcGxlc30iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICAgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9L3NlcnZsZXQiPgotICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzYW1wbGVzajEuZGlyfS9TZXJ2bGV0IiAKLSAgICAgICAgICAgICAgICBpbmNsdWRlcz0ibWVkaWEucHJvcGVydGllcyxkZWZhdWx0LnhzbCxkZWZhdWx0Mi54c2wiLz4KLSAgICAgICAgPC9jb3B5PiAgCQkgICAgICAgICAKLSAgICA8amFyIGphcmZpbGU9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9L3hhbGFuY29tcGF0c2VydmxldC5qYXIiIGJhc2VkaXI9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9IgotICAgICAgICAgaW5jbHVkZXM9InNlcnZsZXQvKioiLz4KLSA8L3RhcmdldD4KLSAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbW1pdHMueG1sIGIvY29tbWl0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0M2U4ZjQuLjAwMDAwMDAKLS0tIGEvY29tbWl0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxDb21taXRzPgotPENvbW1pdCBjYXRlZ29yeT0iY29yZSI+Ci08V2hvPmNvc3RpbkBhcGFjaGUub3JnPC9XaG8+Ci08RGF0ZUNvbW1pdHRlZD4wMy8xNi8yMDAxPC9EYXRlQ29tbWl0dGVkPgotPE1vZGlmaWVkPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yIFN0eWxlc2hlZXRIYW5kbGVyLmphdmEKLSBqYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoIEV4cHJlc3Npb24uamF2YSBYUGF0aC5qYXZhCi0gWFBhdGhDb250ZXh0LmphdmEKLSBqYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2NvbXBpbGVyIENvbXBpbGVyLmphdmEKLSBYUGF0aFBhcnNlci5qYXZhPC9Nb2RpZmllZD4KLTxMb2c+UmVuYW1lZCAiYXNzZXJ0KCkiIHRvICJhc3NlcnRpb24oKSIuCi0KLSBBc3NlcnQgY2FuIGJlIGEga2V5d29yZCwgYW5kIGJyYWtlIHRoZSBjb21waWxhdGlvbi48L0xvZz4KLTwvQ29tbWl0PgotPENvbW1pdCBjYXRlZ29yeT0iY29yZSI+Ci08V2hvPm1taWR5QGFwYWNoZS5vcmc8L1dobz4KLTxEYXRlQ29tbWl0dGVkPjAzLzE5LzIwMDE8L0RhdGVDb21taXR0ZWQ+Ci08TW9kaWZpZWQ+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lciBLZXlXYWxrZXIuamF2YTwvTW9kaWZpZWQ+Ci08TG9nPlRocm93IGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGtleSBuYW1lIGluIGEga2V5IGZ1bmN0aW9uIHdhcyBub3QgZGVmaW5lZDwvTG9nPgotPC9Db21taXQ+Ci08Q29tbWl0IGNhdGVnb3J5PSJjb3JlIj4KLTxXaG8+amtlc3NlbG1AYXBhY2hlLm9yZzwvV2hvPgotPERhdGVDb21taXR0ZWQ+MDMvMjAvMjAwMTwvRGF0ZUNvbW1pdHRlZD4KLTxNb2RpZmllZD5qYXZhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscyBGYXN0U3RyaW5nQnVmZmVyLmphdmE8L01vZGlmaWVkPgotPExvZz5SZXdvcmtlZCAiY2h1bmsgZ3Jvd3RoIiBhbGdvcml0aG0gYWdhaW4uIEdyb3dpbmcgbW9kZSBub3QKLSB5ZXQgYWRlcXVhdGVseSB0ZXN0ZWQsIGJ1dCBmaXhlZC1zaXplIG1vZGUgKHdoaWNoIGlzIHdoYXQgWGFsYW4KLSBpcyBjdXJyZW50bHkgdXNpbmcpIGlzIHNpbXBsZXIgY29kZSBhbmQgc2hvd3MgaW1wcm92ZWQgcGVyZm9ybWFuY2UuPC9Mb2c+Ci08L0NvbW1pdD4KLTxDb21taXQgY2F0ZWdvcnk9ImNvcmUiPgotPFdobz5jdXJjdXJ1QGFwYWNoZS5vcmc8L1dobz4KLTxEYXRlQ29tbWl0dGVkPjAzLzIwLzIwMDE8L0RhdGVDb21taXR0ZWQ+Ci08QWRkZWQ+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IEVudmlyb25tZW50Q2hlY2suamF2YTwvQWRkZWQ+Ci08TG9nPlV0aWxpdHkgY2xhc3MgdG8gY2hlY2sgeW91ciBKVk0gZW52aXJvbm1lbnQgZm9yIGNvbW1vbiBwcm9ibGVtczwvTG9nPgotPC9Db21taXQ+Ci08Q29tbWl0IGNhdGVnb3J5PSJjb21wYXQiPgotPFdobz5qa2Vzc2VsbUBhcGFjaGUub3JnPC9XaG8+Ci08RGF0ZUNvbW1pdHRlZD4wMy8yMC8yMDAxPC9EYXRlQ29tbWl0dGVkPgotPE1vZGlmaWVkPmphdmEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoIFhOdW1iZXIuamF2YTwvTW9kaWZpZWQ+Ci08TG9nPkRvdWJsZS1zZW1pY29sb24gZml4ZWQgc28gSGVucmkncyBjb21waWxlciBzdG9wcyBjb21wbGFpbmluZyBhYm91dCBhbiAKLXVucmVhY2hhYmxlIHN0YXRlbWVudC4gJmx0O2dyaW4vJmd0OzwvTG9nPgotPC9Db21taXQ+Ci08L0NvbW1pdHM+CmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL2NvbXBhdE92ZXJ2aWV3Lmh0bWwgYi9jb21wYXRfc3JjL2NvbXBhdE92ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNjQ4MTcuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9jb21wYXRPdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPEhUTUw+PEhFQUQ+PC9IRUFEPjxCT0RZPgotICAgIDxQPlRoaXMgY29tcGF0aWJpbGl0eSBBUEkgc3VwcG9ydHMgbGltaXRlZCB1c2Ugb2YgdGhlIFhhbGFuLUphdmEgMSBBUEkgaW4gdGhlIFhhbGFuLUphdmEgMiBlbnZpcm9ubWVudC4gRm9yIHRoZSBYYWxhbi1KYXZhIDIgQVBJLCBzZWUgPEEgaHJlZj0iLi4vYXBpZG9jcy9pbmRleC5odG1sIiB0YXJnZXQ9Il90b3AiPlhhbGFuLUphdmEgMiBBUEk8L0E+LjwvUD4KLSAgCi0gICAgIDxQPjxCPkJhc2ljIHByb2NlZHVyZSBmb3IgcGVyZm9ybWluZyB0cmFuc2Zvcm1hdGlvbnM6PC9CPjwvUD4KLSAgICA8T0w+Ci0gICAgICA8TEk+VXNlIG9uZSBvZiB0aGUge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUHJvY2Vzc29yRmFjdG9yeX0gc3RhdGljIGdldFByb2Nlc3NvciBtZXRob2RzIHRvCi0gICAgICBpbnN0YW50aWF0ZSBhbiB7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRQcm9jZXNzb3J9LjxCUj48QlI+Ci0gICAgICAgVGhlIFhTTFQgYW5kIFhQYXRoIGVuZ2luZXMgYXJlIGluZGVwZW5kZW50IGZyb20gYW55IGdpdmVuIERPTSBvciBYTUwgaW1wbGVtZW50YXRpb24uIEFsbCBwYXJzZXItZGVwZW5kZW50Ci0gICAgICAgY2FsbHMgYXJlIGZ1bm5lbGVkIHRocm91Z2ggdGhlIHtAbGluayBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5YTUxQYXJzZXJMaWFpc29ufS48QlI+PEJSPjwvTEk+ICAgICAKLSAgICAgICA8TEk+U2V0IHVwIHtAbGluayBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVElucHV0U291cmNlfSBvYmplY3RzIGZvciB0aGUgWE1MIGlucHV0IGFuZCBYU0wgc3R5bGVzaGVldC4gCi0gICAgICAgWW91IGNhbiB1c2UgYSBmaWxlIG5hbWUgb3IgVVJMLCBjaGFyYWN0ZXIgc3RyZWFtLCBieXRlIHN0cmVhbSwgb3IgU0FYIGlucHV0IHN0cmVhbSB0byBpbnN0YW50aWF0ZSBhbgotICAgICAgIFhTTFRJbnB1dFNvdXJjZSBvYmplY3QuPEJSPjxCUj4KLSAgICAgICBJZiB0aGUgWE1MIGRvY3VtZW50IGNvbnRhaW5zIGEgc3R5bGVzaGVldCBQcm9jZXNzaW5nIEluc3RydWN0aW9uIChQSSksIHlvdSBkbyBub3QgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZQotICAgICAgIFhTTFRJbnB1dFNvdXJjZSBvYmplY3QgZm9yIGFuIFhTTCBzdHlsZXNoZWV0LjxCUj48QlI+Ci0gICAgICAgPEI+Tm90ZTo8L0I+IEZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSB3aXRoIGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9ucywgdXNlIHRoZSBYU0xUUHJvY2Vzc29yCi0gICAgICAgcHJvY2Vzc1N0eWxlc2hlZXQgbWV0aG9kIHRvIGNvbXBpbGUgdGhlIFhTTCBzdHlsZXNoZWV0LiBUaGUgcmVzdWx0IGlzIGEgCi0gICAgICAge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5TdHlsZXNoZWV0Um9vdH0gb2JqZWN0IHdpdGggaXRzIG93biBwcm9jZXNzKCkgbWV0aG9kIGZvciBwZXJmb3JtaW5nIHRyYW5zZm9ybWF0aW9ucy4KLSAgICAgICAgQ29tcGlsaW5nIHRoZSBzdHlsZXNoZWV0IGlzIGFsc28gdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20gdGhlCi0gICAgICAgc3R5bGVzaGVldCBiZWZvcmUgdGhlIHRyYW5zZm9ybWF0aW9uIG9jY3Vycy4gWW91IGFsc28gbXVzdCBjb21waWxlIHRoZSBzdHlsZXNoZWV0IGlmIHlvdSBhcmUgdXNpbmcgdGhlCi0gICAgICAgIFhTTFRQcm9jZXNzb3IgYXMgYSBTQVggZG9jdW1lbnQgaGFuZGxlci48QlI+PEJSPjwvTEk+Ci0gICAgICAgPExJPlNldCB1cCBhbiB7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRSZXN1bHRUYXJnZXR9IGZvciB0aGUgdHJhbnNmb3JtYXRpb24gb3V0cHV0LiBZb3UgY2FuIHVzZSBhCi0gICAgICAgZmlsZSBuYW1lIG9yIFVSTCwgY2hhcmFjdGVyIHN0cmVhbSwgYnl0ZSBzdHJlYW0sIG9yIFNBWCBkb2N1bWVudCBoYW5kbGVyIHRvIGluc3RhbnRpYXRlIGFuIFhTTFRSZXN1bHRUYXJnZXQKLSAgICAgICBvYmplY3QuPEJSPjxCUj48L0xJPgotICAgICAgIDxMST5Vc2UgdGhlIFhTTFRQcm9jZXNzb3Igb3IgKGlmIHlvdSBoYXZlIGNvbXBpbGVkIHRoZSBzdHlsZXNoZWV0KSB0aGUoQGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlN0eWxlc2hlZXRSb290fQotICAgICAgIHByb2Nlc3MgbWV0aG9kIHRvIHBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uLjxCUj48QlI+Ci0gICAgICAgIFhhbGFuLUphdmEgaXMgdGhyZWFkLXNhZmUgZm9yIG9uZSBpbnN0YW5jZSBwZXIgdGhyZWFkLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBzYW1lIGluc3RhbmNlIG9mIFhTTFRQcm9jZXNzb3IgdG8KLSAgICAgICAgIHBlcmZvcm0gbW9yZSB0aGFuIG9uZSB0cmFuc2Zvcm1hdGlvbiwgY2FsbCB0aGUgcmVzZXQgbWV0aG9kIGJldHdlZW4gdHJhbnNmb3JtYXRpb25zLjwvTEk+Ci0gICAgPC9PTD4KLSAgPC9CT0RZPjwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWEJvb2xlYW4uamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YQm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTM5NWJiLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YQm9vbGVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHBhdGg7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJhZHZhbmNlZCIvPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIFhQYXRoIGJvb2xlYW4gb2JqZWN0LCBhbmQgaXMgY2FwYWJsZSBvZiAKLSAqIGNvbnZlcnRpbmcgdGhlIGJvb2xlYW4gdG8gb3RoZXIgdHlwZXMsIHN1Y2ggYXMgYSBzdHJpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBYQm9vbGVhbiBleHRlbmRzIFhPYmplY3QKLXsKLSAgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhCb29sZWFuIG1feGJvb2xlYW47Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0IGEgWEJvb2xlYW4gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhCb29sZWFuKGJvb2xlYW4gYikKLSAgewotICAgIHN1cGVyKCk7IAotICAgICBtX3hib29sZWFuID0gbmV3IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YQm9vbGVhbihiKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlbGwgdGhhdCB0aGlzIGlzIGEgQ0xBU1NfQk9PTEVBTi4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gbV94Ym9vbGVhbi5nZXRUeXBlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHaXZlbiBhIHJlcXVlc3QgdHlwZSwgcmV0dXJuIHRoZSBlcXVpdmFsZW50IHN0cmluZy4gCi0gICAqIEZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKCkgLy8gUFI6RE1BTjRNQko0RCBTdWJtaXR0ZWQgYnk6PGdhcnlwQGZpcnN0ZWNoLmNvbT4gY2hhbmdlIHRvIHByb3RlY3RlZAotICB7Ci0gICAgcmV0dXJuIG1feGJvb2xlYW4uZ2V0VHlwZVN0cmluZygpOwotICB9Ci0gIAotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBudW0oKQotICB7Ci0gICAgcmV0dXJuIG1feGJvb2xlYW4ubnVtKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgYm9vbGVhbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGJvb2woKQotICB7Ci0gICAgcmV0dXJuIG1feGJvb2xlYW4uYm9vbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgc3RyKCkKLSAgewotICAgIHJldHVybiBtX3hib29sZWFuLnN0cigpOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIGEgamF2YSBvYmplY3QgdGhhdCdzIGNsb3NlcyB0byB0aGUgcmVwcmVzZW5hdGlvbiAKLSAgICogdGhhdCBzaG91bGQgYmUgaGFuZGVkIHRvIGFuIGV4dGVuc2lvbi4KLSAgICovCi0gIHB1YmxpYyBPYmplY3Qgb2JqZWN0KCkKLSAgewotICAgIHJldHVybiBtX3hib29sZWFuLm9iamVjdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlbGwgaWYgdHdvIG9iamVjdHMgYXJlIGZ1bmN0aW9uYWxseSBlcXVhbC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhYT2JqZWN0IG9iajIpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiwgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7ICAgIAotICAgIHJldHVybiBtX3hib29sZWFuLmVxdWFscyhvYmoyKTsKLSAgfQotICAKLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YQm9vbGVhblN0YXRpYy5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL1hCb29sZWFuU3RhdGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Mzk2ODcuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL1hCb29sZWFuU3RhdGljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAqIFRoaXMgY2xhc3MgZG9lc24ndCBoYXZlIGFueSBYUGF0aFN1cHBvcnQsIHNvIG92ZXJyaWRlIAotICogd2hhdGV2ZXIgdG8gZW5zdXJlIGl0IHdvcmtzIE9LLgotICovCi1wdWJsaWMgY2xhc3MgWEJvb2xlYW5TdGF0aWMgZXh0ZW5kcyBYQm9vbGVhbgotewotICBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWEJvb2xlYW5TdGF0aWMgbV94Ym9vbGVhbjsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBYTm9kZVNldCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgWEJvb2xlYW5TdGF0aWMoYm9vbGVhbiBiKQotICB7Ci0gICAgc3VwZXIoYik7IAotICAgIG1feGJvb2xlYW4gPSBuZXcgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhCb29sZWFuU3RhdGljKGIpOwotICB9IAotICAKLSAgLyoqCi0gICAqIFRlbGwgaWYgdHdvIG9iamVjdHMgYXJlIGZ1bmN0aW9uYWxseSBlcXVhbC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhYT2JqZWN0IG9iajIpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiwgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG1feGJvb2xlYW4uZXF1YWxzKG9iajIpOwotICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL1hOb2RlU2V0LmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWE5vZGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5ZmZlZS4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWE5vZGVTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOwotaW1wb3J0IGphdmEudGV4dC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5Ob2RlU2V0OwotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gWFBhdGggbm9kZXNldCBvYmplY3QsIGFuZCBpcyBjYXBhYmxlIG9mIAotICogY29udmVydGluZyB0aGUgbm9kZXNldCB0byBvdGhlciB0eXBlcywgc3VjaCBhcyBhIHN0cmluZy4KLSAqLwotcHVibGljIGNsYXNzIFhOb2RlU2V0IGV4dGVuZHMgWE9iamVjdCAgCi17Ci0gIG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YTm9kZVNldCBtX3hub2Rlc2V0OwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIFhOb2RlU2V0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYTm9kZVNldChOb2RlTGlzdCB2YWwpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIG1feG5vZGVzZXQgPSBuZXcgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOb2RlU2V0KG5ldyBOb2RlSXRlcmF0b3JXcmFwcGVyKHZhbCkpIDsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhbiBlbXB0eSBYTm9kZVNldCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgWE5vZGVTZXQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBtX3hub2Rlc2V0ID0gbmV3IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YTm9kZVNldCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIFhOb2RlU2V0IG9iamVjdCBmb3Igb25lIG5vZGUuCi0gICAqLwotICBwdWJsaWMgWE5vZGVTZXQoTm9kZSBuKQotICB7Ci0gICAgc3VwZXIobik7IAotICAgIG1feG5vZGVzZXQgPSBuZXcgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOb2RlU2V0KG4pOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIFRlbGwgdGhhdCB0aGlzIGlzIGEgQ0xBU1NfTk9ERVNFVC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gbV94bm9kZXNldC5nZXRUeXBlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHaXZlbiBhIHJlcXVlc3QgdHlwZSwgcmV0dXJuIHRoZSBlcXVpdmFsZW50IHN0cmluZy4gCi0gICAqIEZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKCkgLy8gUFI6RE1BTjRNQko0RCBTdWJtaXR0ZWQgYnk6PGdhcnlwQGZpcnN0ZWNoLmNvbT4gY2hhbmdlIHRvIHByb3RlY3RlZAotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQuZ2V0VHlwZVN0cmluZygpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBzdHJpbmcgY29udmVyc2lvbiBmcm9tIGEgc2luZ2xlIG5vZGUuCi0gICAqLwotICBkb3VibGUgZ2V0TnVtYmVyRnJvbU5vZGUoTm9kZSBuKQotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQuZ2V0TnVtYmVyRnJvbU5vZGUobik7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBudW0oKQotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQubnVtKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgYm9vbGVhbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGJvb2woKQotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQuYm9vbCgpOwotICB9Ci0gIAotCi0gIC8qKgotICAgKiBHZXQgdGhlIHN0cmluZyBjb252ZXJzaW9uIGZyb20gYSBzaW5nbGUgbm9kZS4KLSAgICovCi0gIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nRnJvbU5vZGUoTm9kZSBuKQotICB7Ci0gICAgcmV0dXJuIG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YTm9kZVNldC5nZXRTdHJpbmdGcm9tTm9kZShuKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cigpCi0gIHsKLSAgICByZXR1cm4gbV94bm9kZXNldC5zdHIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoWFBhdGhTdXBwb3J0IHN1cHBvcnQpCi0gIHsgICAgCi0gICAgcmV0dXJuIG1feG5vZGVzZXQucnRyZWUoKFhQYXRoQ29udGV4dCkgc3VwcG9ydCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSByZXN1bHQgdHJlZSBmcmFnbWVudC4KLSAgICoKLSAgICogQHBhcmFtIHN1cHBvcnQgVGhlIFhQYXRoIGNvbnRleHQgdG8gdXNlIGZvciB0aGUgY29udmVyc2lvbiAKLSAgICoKLSAgICogQHJldHVybiB0aGUgbm9kZXNldCBhcyBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoWFBhdGhDb250ZXh0IHN1cHBvcnQpCi0gIHsKLSAgICByZXR1cm4gbV94bm9kZXNldC5ydHJlZShzdXBwb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBub2RlbGlzdC4KLSAgICovCi0gIHB1YmxpYyBOb2RlSXRlcmF0b3Igbm9kZXNldCgpCi0gIHsKLSAgICByZXR1cm4gbV94bm9kZXNldC5ub2Rlc2V0KCk7Ci0gIH0gIAotCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBub2RlbGlzdC4KLSAgICovCi0gIHB1YmxpYyBOb2RlU2V0IG11dGFibGVOb2Rlc2V0KCkKLSAgewotICAgcmV0dXJuIG1feG5vZGVzZXQubXV0YWJsZU5vZGVzZXQoKTsKLSAgfSAgCi0gIAotICAvKioKLSAgICogVGVsbCBpZiBvbmUgb2JqZWN0IGlzIGxlc3MgdGhhbiB0aGUgb3RoZXIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBsZXNzVGhhbihYT2JqZWN0IG9iajIpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiwgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQubGVzc1RoYW4ob2JqMik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZWxsIGlmIG9uZSBvYmplY3QgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBvdGhlci4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGxlc3NUaGFuT3JFcXVhbChYT2JqZWN0IG9iajIpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiwgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQubGVzc1RoYW5PckVxdWFsKG9iajIpOwotICB9Ci0gIAotICAvKioKLSAgICogVGVsbCBpZiBvbmUgb2JqZWN0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgb3RoZXIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBncmVhdGVyVGhhbihYT2JqZWN0IG9iajIpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiwgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQuZ3JlYXRlclRoYW4ob2JqMik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZWxsIGlmIG9uZSBvYmplY3QgaXMgZ3JlYXRlciB0aGFuIHRoZSBvdGhlci4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdyZWF0ZXJUaGFuT3JFcXVhbChYT2JqZWN0IG9iajIpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiwgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQuZ3JlYXRlclRoYW5PckVxdWFsKG9iajIpOwotICB9ICAgCi0gIAotICAvKioKLSAgICogVGVsbCBpZiB0d28gb2JqZWN0cyBhcmUgZnVuY3Rpb25hbGx5IGVxdWFsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFhPYmplY3Qgb2JqMikKLSAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uLCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbV94bm9kZXNldC5lcXVhbHMob2JqMik7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIFRlbGwgaWYgdHdvIG9iamVjdHMgYXJlIGZ1bmN0aW9uYWxseSBub3QgZXF1YWwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBub3RFcXVhbHMoWE9iamVjdCBvYmoyKQotICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24sIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBtX3hub2Rlc2V0Lm5vdEVxdWFscyhvYmoyKTsKLSAgfSAgCi0gCi0gc3RhdGljIGNsYXNzIE5vZGVJdGVyYXRvcldyYXBwZXIgaW1wbGVtZW50cyBOb2RlSXRlcmF0b3IKLSAgewotCi0gICAgLyoqIFBvc2l0aW9uIG9mIG5leHQgbm9kZSAgICAgICAgICAqLwotICAgIHByaXZhdGUgaW50IG1fcG9zID0gMDsKLQotICAgIC8qKiBEb2N1bWVudCBmcmFnbWVudCBpbnN0YW5jZSB0aGlzIHdpbGwgd3JhcCAgICAgICAgICovCi0gICAgcHJpdmF0ZSBOb2RlTGlzdCBtX2xpc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBOb2RlSXRlcmF0b3JXcmFwcGVyCi0gICAgICoKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZiBEb2N1bWVudCBmcmFnbWVudCBpbnN0YW5jZSB0aGlzIHdpbGwgd3JhcAotICAgICAqLwotICAgIE5vZGVJdGVyYXRvcldyYXBwZXIoTm9kZUxpc3QgbGlzdCkKLSAgICB7Ci0gICAgICBtX2xpc3QgPSBsaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBUaGUgcm9vdCBub2RlIG9mIHRoZSBJdGVyYXRvciwgYXMgc3BlY2lmaWVkIHdoZW4gaXQgd2FzIGNyZWF0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZSBnZXRSb290KCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVGhpcyBhdHRyaWJ1dGUgZGV0ZXJtaW5lcyB3aGljaCBub2RlIHR5cGVzIGFyZSBwcmVzZW50ZWQgdmlhIHRoZQotICAgICAqIGl0ZXJhdG9yLiBUaGUgYXZhaWxhYmxlIHNldCBvZiBjb25zdGFudHMgaXMgZGVmaW5lZCBpbiB0aGUKLSAgICAgKiA8Y29kZT5Ob2RlRmlsdGVyPC9jb2RlPiBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEFsbCBub2RlIHR5cGVzCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRXaGF0VG9TaG93KCkKLSAgICB7Ci0gICAgICByZXR1cm4gTm9kZUZpbHRlci5TSE9XX0FMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGZpbHRlciB1c2VkIHRvIHNjcmVlbiBub2Rlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBOb2RlRmlsdGVyIGdldEZpbHRlcigpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFRoZSB2YWx1ZSBvZiB0aGlzIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjaGlsZHJlbiBvZiBlbnRpdHkKLSAgICAgKiByZWZlcmVuY2Ugbm9kZXMgYXJlIHZpc2libGUgdG8gdGhlIGl0ZXJhdG9yLiBJZiBmYWxzZSwgdGhleSB3aWxsIGJlCi0gICAgICogc2tpcHBlZCBvdmVyLgotICAgICAqIDxicj4gVG8gcHJvZHVjZSBhIHZpZXcgb2YgdGhlIGRvY3VtZW50IHRoYXQgaGFzIGVudGl0eSByZWZlcmVuY2VzCi0gICAgICogZXhwYW5kZWQgYW5kIGRvZXMgbm90IGV4cG9zZSB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGl0c2VsZiwgdXNlIHRoZQotICAgICAqIHdoYXRUb1Nob3cgZmxhZ3MgdG8gaGlkZSB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGFuZCBzZXQKLSAgICAgKiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzIHRvIHRydWUgd2hlbiBjcmVhdGluZyB0aGUgaXRlcmF0b3IuIFRvIHByb2R1Y2UKLSAgICAgKiBhIHZpZXcgb2YgdGhlIGRvY3VtZW50IHRoYXQgaGFzIGVudGl0eSByZWZlcmVuY2Ugbm9kZXMgYnV0IG5vIGVudGl0eQotICAgICAqIGV4cGFuc2lvbiwgdXNlIHRoZSB3aGF0VG9TaG93IGZsYWdzIHRvIHNob3cgdGhlIGVudGl0eSByZWZlcmVuY2Ugbm9kZQotICAgICAqIGFuZCBzZXQgZXhwYW5kRW50aXR5UmVmZXJlbmNlcyB0byBmYWxzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBuZXh0IG5vZGUgaW4gdGhlIHNldCBhbmQgYWR2YW5jZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotICAgICAqIGl0ZXJhdG9yIGluIHRoZSBzZXQuIEFmdGVyIGEgTm9kZUl0ZXJhdG9yIGlzIGNyZWF0ZWQsIHRoZSBmaXJzdCBjYWxsCi0gICAgICogdG8gbmV4dE5vZGUoKSByZXR1cm5zIHRoZSBmaXJzdCBub2RlIGluIHRoZSBzZXQuCi0gICAgICogQHJldHVybiAgVGhlIG5leHQgPGNvZGU+Tm9kZTwvY29kZT4gaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZCBvdmVyLCBvcgotICAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbiB0aGF0IHNldC4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgotICAgICAqICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZQotICAgICAqICAgPGNvZGU+ZGV0YWNoPC9jb2RlPiBtZXRob2Qgd2FzIGludm9rZWQuCi0gICAgICovCi0gICAgcHVibGljIE5vZGUgbmV4dE5vZGUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uCi0gICAgewotCi0gICAgICBpZiAobV9wb3MgPCBtX2xpc3QuZ2V0TGVuZ3RoKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBtX2xpc3QuaXRlbShtX3BvcysrKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHByZXZpb3VzIG5vZGUgaW4gdGhlIHNldCBhbmQgbW92ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotICAgICAqIGl0ZXJhdG9yIGJhY2t3YXJkcyBpbiB0aGUgc2V0LgotICAgICAqIEByZXR1cm4gIFRoZSBwcmV2aW91cyA8Y29kZT5Ob2RlPC9jb2RlPiBpbiB0aGUgc2V0IGJlaW5nIGl0ZXJhdGVkIG92ZXIsCi0gICAgICogICBvcjxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBtb3JlIG1lbWJlcnMgaW4gdGhhdCBzZXQuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24KLSAgICAgKiAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUKLSAgICAgKiAgIDxjb2RlPmRldGFjaDwvY29kZT4gbWV0aG9kIHdhcyBpbnZva2VkLgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIHByZXZpb3VzTm9kZSgpIHRocm93cyBET01FeGNlcHRpb24KLSAgICB7Ci0KLSAgICAgIGlmIChtX3BvcyA+MCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbGlzdC5pdGVtKG1fcG9zLTEpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRGV0YWNoZXMgdGhlIGl0ZXJhdG9yIGZyb20gdGhlIHNldCB3aGljaCBpdCBpdGVyYXRlZCBvdmVyLCByZWxlYXNpbmcKLSAgICAgKiBhbnkgY29tcHV0YXRpb25hbCByZXNvdXJjZXMgYW5kIHBsYWNpbmcgdGhlIGl0ZXJhdG9yIGluIHRoZSBJTlZBTElECi0gICAgICogc3RhdGUuIEFmdGVyPGNvZGU+ZGV0YWNoPC9jb2RlPiBoYXMgYmVlbiBpbnZva2VkLCBjYWxscyB0bwotICAgICAqIDxjb2RlPm5leHROb2RlPC9jb2RlPiBvcjxjb2RlPnByZXZpb3VzTm9kZTwvY29kZT4gd2lsbCByYWlzZSB0aGUKLSAgICAgKiBleGNlcHRpb24gSU5WQUxJRF9TVEFURV9FUlIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGV0YWNoKCl7fQotICB9Ci0gIAotCi19CmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWE51bGwuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YTnVsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzNhNjU4Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YTnVsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHBhdGg7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIFhQYXRoIG51bGwgb2JqZWN0LCBhbmQgaXMgY2FwYWJsZSBvZiAKLSAqIGNvbnZlcnRpbmcgdGhlIG51bGwgdG8gb3RoZXIgdHlwZXMsIHN1Y2ggYXMgYSBzdHJpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTnVsbCBleHRlbmRzIFhPYmplY3QKLXsKLSAgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOdWxsIG1feG51bGw7Ci0gIC8qKgotICAgKiBDcmVhdGUgYW4gWE9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYTnVsbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIG1feG51bGwgPSBuZXcgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOdWxsKCkgOwotICB9Ci0gIAotICAvKioKLSAgICogVGVsbCB3aGF0IGtpbmQgb2YgY2xhc3MgdGhpcyBpcy4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gbV94bnVsbC5nZXRUeXBlKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSByZXF1ZXN0IHR5cGUsIHJldHVybiB0aGUgZXF1aXZhbGVudCBzdHJpbmcuIAotICAgKiBGb3IgZGlhZ25vc3RpYyBwdXJwb3Nlcy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZygpIC8vIFBSOkRNQU40TUJKNEQgU3VibWl0dGVkIGJ5OjxnYXJ5cEBmaXJzdGVjaC5jb20+IGNoYW5nZSB0byBwcm90ZWN0ZWQKLSAgewotICAgIHJldHVybiBtX3hudWxsLmdldFR5cGVTdHJpbmcoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgbnVtKCkKLSAgewotICAgIHJldHVybiBtX3hudWxsLm51bSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIGJvb2xlYW4uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBib29sKCkKLSAgewotICAgIHJldHVybiBtX3hudWxsLmJvb2woKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cigpCi0gIHsKLSAgICByZXR1cm4gbV94bnVsbC5zdHIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoWFBhdGhTdXBwb3J0IHN1cHBvcnQpCi0gIHsKLSAgICByZXR1cm4gbV94bnVsbC5ydHJlZSgoWFBhdGhDb250ZXh0KXN1cHBvcnQpOwotICB9Ci0gIAotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgcmVzdWx0IHRyZWUgZnJhZ21lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBzdXBwb3J0IFhQYXRoIGNvbnRleHQgdG8gdXNlIGZvciB0aGUgY29udmVyc2lvbgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgYXMgYSByZXN1bHQgdHJlZSBmcmFnbWVudC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudEZyYWdtZW50IHJ0cmVlKFhQYXRoQ29udGV4dCBzdXBwb3J0KQotICB7Ci0gICAgcmV0dXJuIG1feG51bGwucnRyZWUoc3VwcG9ydCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBub2RlbGlzdC4KLSAgICovCi0gIHB1YmxpYyBOb2RlSXRlcmF0b3Igbm9kZXNldCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi0gICAKLSAgLyoqCi0gICAqIFRlbGwgaWYgdHdvIG9iamVjdHMgYXJlIGZ1bmN0aW9uYWxseSBlcXVhbC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhYT2JqZWN0IG9iajIpCi0gIHsKLSAgICByZXR1cm4gbV94bnVsbC5lcXVhbHMob2JqMik7Ci0gIH0KLQotICAKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YTnVtYmVyLmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWE51bWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjhlMjg2Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YTnVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7Ci0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBYUGF0aCBudW1iZXIsIGFuZCBpcyBjYXBhYmxlIG9mIAotICogY29udmVydGluZyB0aGUgbnVtYmVyIHRvIG90aGVyIHR5cGVzLCBzdWNoIGFzIGEgc3RyaW5nLgotICovCi1wdWJsaWMgY2xhc3MgWE51bWJlciBleHRlbmRzIFhPYmplY3QKLXsKLSAgCi0gIG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YTnVtYmVyIG1feG51bWJlcjsKLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIFhOb2RlU2V0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYTnVtYmVyKGRvdWJsZSBkKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBtX3hudW1iZXIgPSBuZXcgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOdW1iZXIoZCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZWxsIHRoYXQgdGhpcyBpcyBhIENMQVNTX05VTUJFUi4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gbV94bnVtYmVyLmdldFR5cGUoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdpdmVuIGEgcmVxdWVzdCB0eXBlLCByZXR1cm4gdGhlIGVxdWl2YWxlbnQgc3RyaW5nLiAKLSAgICogRm9yIGRpYWdub3N0aWMgcHVycG9zZXMuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVTdHJpbmcoKSAvLyBQUjpETUFONE1CSjREIFN1Ym1pdHRlZCBieTo8Z2FyeXBAZmlyc3RlY2guY29tPiBjaGFuZ2UgdG8gcHJvdGVjdGVkCi0gIHsKLSAgICByZXR1cm4gbV94bnVtYmVyLmdldFR5cGVTdHJpbmcoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgbnVtKCkKLSAgewotICAgIHJldHVybiBtX3hudW1iZXIubnVtKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgYm9vbGVhbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGJvb2woKQotICB7Ci0gICAgcmV0dXJuIG1feG51bWJlci5ib29sKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cigpCi0gIHsKLSAgICByZXR1cm4gbV94bnVtYmVyLnN0cigpOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIGEgamF2YSBvYmplY3QgdGhhdCdzIGNsb3NlcyB0byB0aGUgcmVwcmVzZW5hdGlvbiAKLSAgICogdGhhdCBzaG91bGQgYmUgaGFuZGVkIHRvIGFuIGV4dGVuc2lvbi4KLSAgICovCi0gIHB1YmxpYyBPYmplY3Qgb2JqZWN0KCkKLSAgewotICAgIHJldHVybiBtX3hudW1iZXIub2JqZWN0KCk7Ci0gIH0KLQotICAvKioKLSAgICogVGVsbCBpZiB0d28gb2JqZWN0cyBhcmUgZnVuY3Rpb25hbGx5IGVxdWFsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFhPYmplY3Qgb2JqMikKLSAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uLCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbV94bnVtYmVyLmVxdWFscyhvYmoyKTsKLSAgfQotICAKLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YT2JqZWN0LmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGNiMzNlLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHBhdGg7Ci0KLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIFhQYXRoIG9iamVjdCwgYW5kIGlzIGNhcGFibGUgb2YgCi0gKiBjb252ZXJ0aW5nIHRoZSBvYmplY3QgdG8gdmFyaW91cyB0eXBlcywgc3VjaCBhcyBhIHN0cmluZy4KLSAqIFRoaXMgY2xhc3MgYWN0cyBhcyB0aGUgYmFzZSBjbGFzcyB0byBvdGhlciBYUGF0aCB0eXBlIG9iamVjdHMsIAotICogc3VjaCBhcyBYU3RyaW5nLCBhbmQgcHJvdmlkZXMgcG9seW1vcnBoaWMgY2FzdGluZyBjYXBhYmlsaXRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYT2JqZWN0IGV4dGVuZHMgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhPYmplY3QKLXsKLSAgCi0gIAotICAvKioKLSAgICogQ3JlYXRlIGFuIFhPYmplY3QuCi0gICAqLwotICBwdWJsaWMgWE9iamVjdCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBYT2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhPYmplY3QoT2JqZWN0IG9iaikKLSAgewotICAgIHN1cGVyKG9iaik7Ci0gIH0gICAKLQotfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL1hQYXRoU3VwcG9ydC5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL1hQYXRoU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTk4NzA4Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YUGF0aFN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotCi0KLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KLSAqIFByb3ZpZGVzIGJhc2ljIHN1cHBvcnQgZm9yIGluZGVwZW5kZW50IHVzZSBvZiBYUGF0aC4gIFRoaXMgaW50ZXJmYWNlIAotICogaXMgdXNlZCBpbiBvcmRlciB0aGF0IHRoZXJlIG1heSBiZSBsb29zZSBjb3VwbGluZyBiZXR3ZWVuIHRoZSAKLSAqIFhQYXRoIHBhY2thZ2UgYW5kIHRoZSBzdXBwb3J0IHNlcnZpY2VzLCBzdWNoIGFzIHRoZSB2YXJpYWJsZSBzdG9yZSwgCi0gKiBwYXJzZXIgc2VydmljZXMsIERPTSBpbXBsZW1lbnRhdGlvbiwgZXRjLiAgTW9zdCBpZiBhbGwgaW1wbGVtZW50YXRpb25zCi0gKiBvZiB0aGlzIHNob3VsZCBkZXJpdmUgZnJvbSBYUGF0aFN1cHBvcnREZWZhdWx0IChoZW5jZSwgaXQgc2hvdWxkIAotICogcHJvYmFibHkgYmUgYW4gYWJzdHJhY3QgY2xhc3MgaW5zdGVhZCBvZiBhbiBpbnRlcmZhY2UpLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhQYXRoU3VwcG9ydCBleHRlbmRzIG9yZy5hcGFjaGUueGFsYW4uZXh0ZW5zaW9ucy5FeHByZXNzaW9uQ29udGV4dAotewotICAKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YUGF0aFN1cHBvcnREZWZhdWx0LmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWFBhdGhTdXBwb3J0RGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjkxZDE5Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YUGF0aFN1cHBvcnREZWZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotCi0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImFkdmFuY2VkIi8+Ci0gKiBEZWZhdWx0IGNsYXNzIGZvciBleGVjdXRpb24gY29udGV4dCB3aGVuIFhQYXRoIGlzIHVzZWQgYnkgaXRzZWxmLiBNYW55IAotICogb2YgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGNsYXNzIG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpbiBvcmRlciB0byAKLSAqIHBlcmZvcm0gY29ycmVjdCBleGVjdXRpb24gb2YgdGhlIFhQYXRoIChmb3IgaW5zdGFuY2UsIHZhcmlhYmxlIAotICogZXhlY3V0aW9uKS4gIFRoaXMgY2xhc3Mgd2lsbCBsaWtlbHkgZXZlbnR1YWxseSByZXBsYWNlIFhNTFBhcnNlckxpYWlzb25zLgotICovCi1wdWJsaWMgY2xhc3MgWFBhdGhTdXBwb3J0RGVmYXVsdCBleHRlbmRzIG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0IGltcGxlbWVudHMgWFBhdGhTdXBwb3J0IAotewotICAKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YUlRyZWVGcmFnLmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWFJUcmVlRnJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDhjZjE4Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YUlRyZWVGcmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBYUGF0aCByZXN1bHQgdHJlZSBmcmFnbWVudCBvYmplY3QsIGFuZCBpcyBjYXBhYmxlIG9mIAotICogY29udmVydGluZyB0aGUgUlRGIHRvIG90aGVyIHR5cGVzLCBzdWNoIGFzIGEgc3RyaW5nLgotICovCi1wdWJsaWMgY2xhc3MgWFJUcmVlRnJhZyBleHRlbmRzIFhPYmplY3QgCi17IAotICAKLSAgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhSVHJlZUZyYWcgbV94cnRyZWVmcmFnOwotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBYT2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhSVHJlZUZyYWcoRG9jdW1lbnRGcmFnbWVudCBmcmFnKQotICB7Ci0gICAgc3VwZXIoZnJhZyk7Ci0gICAgbV94cnRyZWVmcmFnID0gbmV3IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YUlRyZWVGcmFnKGZyYWcpOyAKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlbGwgd2hhdCBraW5kIG9mIGNsYXNzIHRoaXMgaXMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIG1feHJ0cmVlZnJhZy5nZXRUeXBlKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSByZXF1ZXN0IHR5cGUsIHJldHVybiB0aGUgZXF1aXZhbGVudCBzdHJpbmcuIAotICAgKiBGb3IgZGlhZ25vc3RpYyBwdXJwb3Nlcy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZygpIC8vIFBSOkRNQU40TUJKNEQgU3VibWl0dGVkIGJ5OjxnYXJ5cEBmaXJzdGVjaC5jb20+IGNoYW5nZSB0byBwcm90ZWN0ZWQKLSAgewotICAgIHJldHVybiBtX3hydHJlZWZyYWcuZ2V0VHlwZVN0cmluZygpOwotICB9Ci0gIAotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBudW0oKQotICB7ICAgIAotICAgIHJldHVybiBtX3hydHJlZWZyYWcubnVtKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgYm9vbGVhbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGJvb2woKQotICB7Ci0gICAgcmV0dXJuIG1feHJ0cmVlZnJhZy5ib29sKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBzdHIoKQotICB7Ci0gICAgcmV0dXJuIG1feHJ0cmVlZnJhZy5zdHIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoKQotICB7Ci0gICAgcmV0dXJuIG1feHJ0cmVlZnJhZy5ydHJlZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgbm9kZWxpc3QuIChzcGVjaWFsIGZ1bmN0aW9uKS4KLSAgICovCi0gIHB1YmxpYyBOb2RlTGlzdCBjb252ZXJ0VG9Ob2Rlc2V0KCkKLSAgewotICAgIHJldHVybiBtX3hydHJlZWZyYWcuY29udmVydFRvTm9kZXNldCgpOwotICB9ICAKLSAgCi0gIC8qKgotICAgKiBUZWxsIGlmIHR3byBvYmplY3RzIGFyZSBmdW5jdGlvbmFsbHkgZXF1YWwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWE9iamVjdCBvYmoyKQotICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24sIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgeyAgIAotICAgICAgcmV0dXJuIG1feHJ0cmVlZnJhZy5lcXVhbHMob2JqMik7ICAgIAotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YU3RyaW5nLmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWFN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDJkYzZlLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgIAotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoOwotCi0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7Ci0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gWFBhdGggc3RyaW5nIG9iamVjdCwgYW5kIGlzIGNhcGFibGUgb2YgCi0gKiBjb252ZXJ0aW5nIHRoZSBzdHJpbmcgdG8gb3RoZXIgdHlwZXMsIHN1Y2ggYXMgYSBudW1iZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU3RyaW5nIGV4dGVuZHMgWE9iamVjdAotewotICAKLSAgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhTdHJpbmcgbV94c3RyaW5nOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIFhTdHJpbmcgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhTdHJpbmcoU3RyaW5nIHZhbCkKLSAgewotICAgIHN1cGVyKHZhbCk7Ci0gICAgbV94c3RyaW5nID0gbmV3IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YU3RyaW5nKHZhbCk7Ci0gIH0KLSAgCi0gICAvKioKLSAgICogVGVsbCB0aGF0IHRoaXMgaXMgYSBDTEFTU19TVFJJTkcuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIG1feHN0cmluZy5nZXRUeXBlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHaXZlbiBhIHJlcXVlc3QgdHlwZSwgcmV0dXJuIHRoZSBlcXVpdmFsZW50IHN0cmluZy4gCi0gICAqIEZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKCkgLy8gUFI6RE1BTjRNQko0RCBTdWJtaXR0ZWQgYnk6PGdhcnlwQGZpcnN0ZWNoLmNvbT4gY2hhbmdlIHRvIHByb3RlY3RlZAotICB7Ci0gICAgcmV0dXJuIG1feHN0cmluZy5nZXRUeXBlU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDYXN0IGEgc3RyaW5nIHRvIGEgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBkb3VibGUgY2FzdFRvTnVtKFN0cmluZyBzKQotICB7ICAKLSAgICByZXR1cm4gb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhTdHJpbmcuY2FzdFRvTnVtKHMpOyAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgbnVtKCkKLSAgewotICAgIHJldHVybiBtX3hzdHJpbmcubnVtKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgYm9vbGVhbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGJvb2woKQotICB7Ci0gICAgcmV0dXJuIG1feHN0cmluZy5ib29sKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBzdHIoKQotICB7Ci0gICAgcmV0dXJuIG1feHN0cmluZy5zdHIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoWFBhdGhTdXBwb3J0IHN1cHBvcnQpCi0gIHsgICAgCi0gICAgcmV0dXJuIG1feHN0cmluZy5ydHJlZSgoWFBhdGhDb250ZXh0KXN1cHBvcnQpOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgotICAgKgotICAgKiBAcGFyYW0gc3VwcG9ydCBYcGF0aCBjb250ZXh0IHRvIHVzZSBmb3IgdGhlIGNvbnZlcnNpb24gCi0gICAqCi0gICAqIEByZXR1cm4gQSBkb2N1bWVudCBmcmFnbWVudCB3aXRoIHRoaXMgc3RyaW5nIGFzIGEgY2hpbGQgbm9kZQotICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoWFBhdGhDb250ZXh0IHN1cHBvcnQpCi0gIHsgICAgICAKLSAgICByZXR1cm4gbV94c3RyaW5nLnJ0cmVlKHN1cHBvcnQpOwotICB9Ci0gIAotICAvKioKLSAgICogVGVsbCBpZiB0d28gb2JqZWN0cyBhcmUgZnVuY3Rpb25hbGx5IGVxdWFsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFhPYmplY3Qgb2JqMikKLSAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uLCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbV94c3RyaW5nLmVxdWFscyhvYmoyKTsKLSAgfQotCi0gIAotfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3BhY2thZ2UuaHRtbCBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTU1ZGEuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPEhUTUw+PEhFQUQ+PC9IRUFEPjxCT0RZPgotICAgICA8UD5JbmZyYXN0cnVjdHVyZSBmb3IgcHJvY2Vzc2luZyBYUEFUSCBleHByZXNzaW9uczwvUD4KLSAgIAotICAgICA8UD48L1A+Ci0gICA8L0JPRFk+PC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94ZG9tL1hlcmNlc0xpYWlzb24uamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94ZG9tL1hlcmNlc0xpYWlzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyMjc5Ni4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveGRvbS9YZXJjZXNMaWFpc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueGRvbTsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS4qOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5yZXMuWFBBVEhFcnJvclJlc291cmNlczsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnJlcy5YU0xNZXNzYWdlczsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLQotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+Ci0gKiBQcm92aWRlcyBYU0xUUHJvY2Vzc29yIGFuIGludGVyZmFjZSB0byB0aGUgWGVyY2VzIFhNTCBwYXJzZXIuICBUaGlzIAotICogbGlhaXNvbiBzaG91bGQgYmUgdXNlZCBpZiBYZXJjZXMgRE9NIG5vZGVzIGFyZSBiZWluZyBwcm9jZXNzIGFzIAotICogdGhlIHNvdXJjZSB0cmVlIG9yIGFzIHRoZSByZXN1bHQgdHJlZS4KLSAqIEBzZWUgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRQcm9jZXNzb3IKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWwucGFyc2VycwotICovCi1wdWJsaWMgY2xhc3MgWGVyY2VzTGlhaXNvbiBleHRlbmRzIFhNTFBhcnNlckxpYWlzb25EZWZhdWx0IC8vaW1wbGVtZW50cyBYUGF0aFN1cHBvcnQKLXsKLSAgLyoqCi0gICAqIFJldHVybiBhIHN0cmluZyBzdWl0aWJsZSBmb3IgdGVsbGluZyB0aGUgdXNlciB3aGF0IHBhcnNlciBpcyBiZWluZyB1c2VkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXJzZXJEZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIlhNTDRKIFZlcnNpb24gIisgZ2V0WE1MNEpWZXJzaW9uU3RyaW5nKCk7Ci0gIH0KLQotCXByaXZhdGUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyIG1fZXJyb3JIYW5kbGVyOwotICAvKioKLSAgICogQ29uc3RydWN0b3IgdGhhdCB0YWtlcyBTQVggRXJyb3JIYW5kbGVyIGFzIGFuIGFyZ3VtZW50LiBUaGUgZXJyb3IgaGFuZGxlcgotICAgKiBpcyByZWdpc3RlcmVkIHdpdGggdGhlIFhNTCBQYXJzZXIuIEFueSBYTUwtcmVsYXRlZCBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZAotICAgKiB0byB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiB1c2luZyB0aGlzIGVycm9yIGhhbmRsZXIuCi0gICAqCi0gICAqIEBwYXJhbQllcnJvckhhbmRsZXIgU0FYIEVycm9ySGFuZGxlciBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBYZXJjZXNMaWFpc29uKG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpCi0gIHsKLSAgICBtX2Vycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2UuCi0gICAqCi0gIHB1YmxpYyBYZXJjZXNMaWFpc29uKFhQYXRoRW52U3VwcG9ydCBlbnZTdXBwb3J0KQotICB7Ci0gICAgbV9lbnZTdXBwb3J0ID0gZW52U3VwcG9ydDsKLSAgfSovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBYZXJjZXNMaWFpc29uKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBDaGVjayBub2RlIHRvIHNlZSBpZiBpdCBtYXRjaGVzIHRoaXMgbGlhaXNvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNoZWNrTm9kZShOb2RlIG5vZGUpCi0gICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gIHsKLSAgICBpZighKG5vZGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnhlcmNlcy5kb20uTm9kZUltcGwpKQotICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKFhTTE1lc3NhZ2VzLmNyZWF0ZVhQQVRITWVzc2FnZShYUEFUSEVycm9yUmVzb3VyY2VzLkVSX1hFUkNFU19DQU5OT1RfSEFORExFX05PREVTLCBuZXcgT2JqZWN0W117KChPYmplY3Qpbm9kZSkuZ2V0Q2xhc3MoKX0pKTsgLy8iWGVyY2VzTGlhaXNvbiBjYW4gbm90IGhhbmRsZSBub2RlcyBvZiB0eXBlIgotICAgICAgICAvLysoKE9iamVjdClub2RlKS5nZXRDbGFzcygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgc3VwcG9ydAotICAgKiB0aGUgU0FYIERvY3VtZW50SGFuZGxlciBpbnRlcmZhY2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NBWCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgICogR2V0IFhlcmNlcyB2ZXJzaW9uIGZpZWxkLi4uIHdlIGhhdmUgdG8gZG8gdGhpcyAnY2F1c2UKLSAgICogdGhlICJwdWJsaWMgc3RhdGljIGZpbmFsIiBmaWVsZHMgc2VlbSB0byBnZXQgYm91bmQKLSAgICogYXQgY29tcGlsZSB0aW1lIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldFhNTDRKVmVyc2lvblN0cmluZygpCi0gIHsKLSAgICAvLyByZXR1cm4gVmVyc2lvbi5mVmVyc2lvbjsKLSAgICBTdHJpbmcgdmVyc2lvbiA9ICIiOwotICAgIHRyeQotICAgIHsKLSAgICAgIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIHZlcnNpb25GaWVsZCA9IFZlcnNpb24uY2xhc3MuZ2V0RmllbGQoImZWZXJzaW9uIik7Ci0gICAgICB2ZXJzaW9uID0gKFN0cmluZyl2ZXJzaW9uRmllbGQuZ2V0KG51bGwpOwotICAgIH0KLSAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiB2ZXJzaW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBHZXQgb25lIG9mIHRoZSBYZXJjZXMgdmVyc2lvbiBudW1iZXJzLi4uCi0gICAqIHdlIGhhdmUgdG8gZG8gdGhpcyAnY2F1c2UgdGhlICJwdWJsaWMgc3RhdGljIGZpbmFsIgotICAgKiBmaWVsZHMgc2VlbSB0byBnZXQgYm91bmQgYXQgY29tcGlsZSB0aW1lIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgaW50IGdldFhNTDRKVmVyc2lvbk51bShpbnQgZmllbGQpCi0gIHsKLSAgICBpbnQgdmVyc2lvbk51bSA9IDA7Ci0gICAgU3RyaW5nIHZlciA9IGdldFhNTDRKVmVyc2lvblN0cmluZygpOwotICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZlciwgIiAuIik7Ci0gICAgZm9yKGludCBpID0gMDsgdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyB0b2sgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICBpZihmaWVsZCA9PSBpKQotICAgICAgewotICAgICAgICB2ZXJzaW9uTnVtID0gSW50ZWdlci5wYXJzZUludCh0b2spOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdmVyc2lvbk51bTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBvb2wgdGhlIERPTSBwYXJzZXJzIGZvciByZXVzZS4KLSAgICoKLSAgcHJpdmF0ZSBPYmplY3RQb29sIG1fZG9tUGFyc2VyUG9vbCA9IG5ldyBPYmplY3RQb29sKERPTVBhcnNlci5jbGFzcyk7Ci0gIAotICAvKioKLSAgICogUG9vbCB0aGUgU0FYIHBhcnNlcnMgZm9yIHJldXNlLgotICAgKgotICBwcml2YXRlIE9iamVjdFBvb2wgbV9zYXhQYXJzZXJQb29sID0gbmV3IE9iamVjdFBvb2woU0FYUGFyc2VyLmNsYXNzKTsKLSAKLSAgLyoqCi0gICAqIENvdW50IHRoZSBwYXJzZXMgc2luY2UgdGhlIGxhc3QgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgR0MgZXZlcnkgCi0gICAqIDEwIHBhcnNlcyBvciBzby4gIChUaGlzIG1pZ2h0IGJlIGEgYmFkIGlkZWEsIGJ1dCBpdCBzZWVtcyB0byAKLSAgICogaGVscC4uLikKLSAgICoKLSAgcHJvdGVjdGVkIGludCBtX3BhcnNlQ291bnRTaW5jZUdDID0gMDsKLSovCi0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBQYXJzZSBhbiBYTUwgZG9jdW1lbnQuCi0gICAqCi0gICAqIDxwPlRoZSBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGluc3RydWN0IHRoZSBTQVggcGFyc2VyCi0gICAqIHRvIGJlZ2luIHBhcnNpbmcgYW4gWE1MIGRvY3VtZW50IGZyb20gYW55IHZhbGlkIGlucHV0Ci0gICAqIHNvdXJjZSAoYSBjaGFyYWN0ZXIgc3RyZWFtLCBhIGJ5dGUgc3RyZWFtLCBvciBhIFVSSSkuPC9wPgotICAgKgotICAgKiA8cD5BcHBsaWNhdGlvbnMgbWF5IG5vdCBpbnZva2UgdGhpcyBtZXRob2Qgd2hpbGUgYSBwYXJzZSBpcyBpbgotICAgKiBwcm9ncmVzcyAodGhleSBzaG91bGQgY3JlYXRlIGEgbmV3IFBhcnNlciBpbnN0ZWFkIGZvciBlYWNoCi0gICAqIGFkZGl0aW9uYWwgWE1MIGRvY3VtZW50KS4gIE9uY2UgYSBwYXJzZSBpcyBjb21wbGV0ZSwgYW4KLSAgICogYXBwbGljYXRpb24gbWF5IHJldXNlIHRoZSBzYW1lIFBhcnNlciBvYmplY3QsIHBvc3NpYmx5IHdpdGggYQotICAgKiBkaWZmZXJlbnQgaW5wdXQgc291cmNlLjwvcD4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZSBUaGUgaW5wdXQgc291cmNlIGZvciB0aGUgdG9wLWxldmVsIG9mIHRoZQotICAgKiAgICAgICAgWE1MIGRvY3VtZW50LgotICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKLSAgICogICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KLSAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uIEFuIElPIGV4Y2VwdGlvbiBmcm9tIHRoZSBwYXJzZXIsCi0gICAqICAgICAgICAgICAgcG9zc2libHkgZnJvbSBhIGJ5dGUgc3RyZWFtIG9yIGNoYXJhY3RlciBzdHJlYW0KLSAgICogICAgICAgICAgICBzdXBwbGllZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICAqIEBzZWUgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UKLSAgICogQHNlZSAjcGFyc2UoamF2YS5sYW5nLlN0cmluZykKLSAgICogQHNlZSAjc2V0RW50aXR5UmVzb2x2ZXIKLSAgICogQHNlZSAjc2V0RFRESGFuZGxlcgotICAgKiBAc2VlICNzZXREb2N1bWVudEhhbmRsZXIKLSAgICogQHNlZSAjc2V0RXJyb3JIYW5kbGVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZSAoSW5wdXRTb3VyY2Ugc291cmNlKQotICAgIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gIHsKLSAgIHRyeQotICAgIHsKLQotICAgICAgLy8gSSBndWVzcyBJIHNob3VsZCB1c2UgSkFYUCBmYWN0b3J5IGhlcmUuLi4gd2hlbiBpdCdzIGxlZ2FsLgotICAgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5ET01QYXJzZXIgcGFyc2VyIAotICAgICAgLy8gID0gbmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRE9NUGFyc2VyKCk7Ci0gICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJ1aWxkZXJGYWN0b3J5ID0KLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICBidWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsgICAgICAKLQotICAgICAgRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJaWYgKG1fZXJyb3JIYW5kbGVyID09IG51bGwpCi0JCQkJcGFyc2VyLnNldEVycm9ySGFuZGxlcihuZXcgb3JnLmFwYWNoZS54bWwudXRpbHMuRGVmYXVsdEVycm9ySGFuZGxlcigpKTsKLQkJCWVsc2UKLQkJCQlwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKG1fZXJyb3JIYW5kbGVyKTsKLQotICAgICAgLy8gaWYobnVsbCAhPSBtX2VudGl0eVJlc29sdmVyKQotICAgICAgLy8gewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJTZXR0aW5nIHRoZSBlbnRpdHkgcmVzb2x2ZXIuIik7Ci0gICAgICAvLyAgcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKG1fZW50aXR5UmVzb2x2ZXIpOwotICAgICAgLy8gfQotICAgICAgc2V0RG9jdW1lbnQocGFyc2VyLnBhcnNlKHNvdXJjZSkpOwotICAgIH0KLSAgICBjYXRjaCAob3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHNlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihzZSk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24ocGNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oaW9lKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNvcHlGcm9tT3RoZXJMaWFpc29uKFhNTFBhcnNlckxpYWlzb25EZWZhdWx0IGZyb20pCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgLy9zdXBlci5jb3B5RnJvbU90aGVyTGlhaXNvbihmcm9tKTsKLSAgICBpZihudWxsICE9IGZyb20pIC8vIGRlZmVuc2l2ZQotICAgIHsKLSAgICAgIGlmKGZyb20gaW5zdGFuY2VvZiBYZXJjZXNMaWFpc29uKQotICAgICAgICB0aGlzLm1fdXNlRE9NMmdldE5hbWVzcGFjZVVSSSA9ICgoWGVyY2VzTGlhaXNvbilmcm9tKS5tX3VzZURPTTJnZXROYW1lc3BhY2VVUkk7Ci0gICAgfQotIH0KLQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gZW1wdHkgRE9NIERvY3VtZW50LiAgTWFpbmx5IHVzZWQgZm9yIGNyZWF0aW5nIGFuCi0gICAqIG91dHB1dCBkb2N1bWVudC4gIEltcGxlbWVudGF0aW9uIG9mIFhNTFBhcnNlckxpYWlzb24KLSAgICogaW50ZXJmYWNlIG1ldGhvZC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpCi0gIHsKLSAgICBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsIGRvYyA9IG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsKCk7Ci0gICAgcmV0dXJuIGRvYzsKLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhbiBJRCwgcmV0dXJuIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEJ5SUQoU3RyaW5nIGlkLCBEb2N1bWVudCBkb2MpCi0gIHsKLSAgICByZXR1cm4gKChEb2N1bWVudEltcGwpZG9jKS5nZXRJZGVudGlmaWVyKGlkKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZWxsIGlmIHRoZSBub2RlIGlzIGlnbm9yYWJsZSB3aGl0ZXNwYWNlLgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGVXaGl0ZXNwYWNlKFRleHQgbm9kZSkKLSAgewotICAgIGJvb2xlYW4gaXNJZ25vcmFibGU7Ci0gICAgaWYoIG5vZGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnhlcmNlcy5kb20uVGV4dEltcGwpCi0gICAgewotICAgICAgaXNJZ25vcmFibGUgPSAoKG9yZy5hcGFjaGUueGVyY2VzLmRvbS5UZXh0SW1wbClub2RlKS5pc0lnbm9yYWJsZVdoaXRlc3BhY2UoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlzSWdub3JhYmxlID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBpc0lnbm9yYWJsZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gbV91c2VET00yZ2V0TmFtZXNwYWNlVVJJID0gdHJ1ZTsKLSAgCi0gIC8qKgotICAgKiBTZXQgd2hldGhlciBvciBub3QgZ2V0TmFtZXNwYWNlT2ZOb2RlIHNob3VsZCB1c2UgdGhlIFhlcmNlcy9ET00yCi0gICAqIGdldE5hbWVzcGFjZVVSSS4gIFRoaXMgaGFzIHRvIGJlIHNldCB0byB0cnVlIGlmIHRoZSAKLSAgICogaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMgaXMgc2V0IHRvIGZhbHNlLCBvciBpZiAKLSAgICogdGhlIHRyZWUgaXMgbXV0YXRlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVzZURPTTJnZXROYW1lc3BhY2VVUkkoYm9vbGVhbiBiKQotICB7Ci0gICAgbV91c2VET00yZ2V0TmFtZXNwYWNlVVJJID0gYjsKLSAgfQotCi0gIAotICAvKioKLSAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG5vZGUuICBDYWxscyBvcmcuYXBhY2hlLnhlcmNlcy5kb20uTm9kZUltcGwncwotICAgKiBnZXROYW1lc3BhY2VVUkkoKSBpZiBzZXRVc2VET00yZ2V0TmFtZXNwYWNlVVJJKHRydWUpIGhhcyBiZWVuIGNhbGxlZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlT2ZOb2RlKE5vZGUgbikKLSAgewotICAgIHJldHVybihtX3VzZURPTTJnZXROYW1lc3BhY2VVUkkpID8KLSAgICAgICAgICAoKG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Ob2RlSW1wbCluKS5nZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgIDogc3VwZXIuZ2V0TmFtZXNwYWNlT2ZOb2RlKG4pOwotICB9Ci0gIAotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsIG5hbWUgb2YgdGhlIGdpdmVuIG5vZGUuCi0gICovCi0gIC8vIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lT2ZOb2RlKE5vZGUgbikKLSAgLy8gewotICAvLyAgIHJldHVybiAoKG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Ob2RlSW1wbCluKS5nZXRMb2NhbE5hbWUoKTsKLSAgLy8gfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGVsZW1lbnQgbmFtZSB3aXRoIHRoZSBuYW1lc3BhY2UgZXhwYW5kZWQuCi0gICovCi0gIC8vIHB1YmxpYyBTdHJpbmcgZ2V0RXhwYW5kZWRFbGVtZW50TmFtZShFbGVtZW50IGVsZW0pCi0gIC8vIHsKLSAgLy8gIFN0cmluZyBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2VPZk5vZGUoZWxlbSk7Ci0gIC8vICAgcmV0dXJuIChudWxsICE9IG5hbWVzcGFjZSkgPyBuYW1lc3BhY2UrIjoiKyBnZXRMb2NhbE5hbWVPZk5vZGUoZWxlbSkKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0TG9jYWxOYW1lT2ZOb2RlKGVsZW0pOwotICAvLyB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG5hbWUgd2l0aCB0aGUgbmFtZXNwYWNlIGV4cGFuZGVkLgotICAqLwotICAvLyBwdWJsaWMgU3RyaW5nIGdldEV4cGFuZGVkQXR0cmlidXRlTmFtZShBdHRyIGF0dHIpCi0gIC8vIHsKLSAgLy8gIFN0cmluZyBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2VPZk5vZGUoYXR0cik7Ci0gIC8vICAgcmV0dXJuIChudWxsICE9IG5hbWVzcGFjZSkgPyBuYW1lc3BhY2UrIjoiKyBnZXRMb2NhbE5hbWVPZk5vZGUoYXR0cikKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRMb2NhbE5hbWVPZk5vZGUoYXR0cik7Ci0gIC8vIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBwYXJlbnQgb2YgYSBub2RlLgotICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0UGFyZW50T2ZOb2RlKE5vZGUgbm9kZSkKLSAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIChOb2RlLkFUVFJJQlVURV9OT0RFID09IG5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgICAgICAgPyAoKEF0dHIpbm9kZSkuZ2V0T3duZXJFbGVtZW50KCkgOiBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9Gb3JtYXR0ZXJUb0RPTS5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9Gb3JtYXR0ZXJUb0RPTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzFlMjVhLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvRm9ybWF0dGVyVG9ET00uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSAgCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZS5TZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXJGYWN0b3J5OwotLy9pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLkJhc2VNYXJrdXBTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLkRPTVNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplclRvWE1MOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuUGFyc2VyQWRhcHRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogVGhpcyBjbGFzcyB0YWtlcyBTQVggZXZlbnRzIChpbiBhZGRpdGlvbiB0byBzb21lIGV4dHJhIGV2ZW50cyAKLSAqIHRoYXQgU0FYIGRvZXNuJ3QgaGFuZGxlIHlldCkgYW5kIGFkZHMgdGhlIHJlc3VsdCB0byBhIGRvY3VtZW50IAotICogb3IgZG9jdW1lbnQgZnJhZ21lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtYXR0ZXJUb0RPTSBleHRlbmRzIFBhcnNlckFkYXB0ZXIKLXsgCi0gIERPTVNlcmlhbGl6ZXIgbV9zZXJpYWxpemVyOwotICAgIAotICAvKioKLSAgICogRm9ybWF0dGVyVG9ET00gaW5zdGFuY2UgY29uc3RydWN0b3IuLi4gaXQgd2lsbCBhZGQgdGhlIERPTSBub2RlcyAKLSAgICogdG8gdGhlIGRvY3VtZW50IGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIEZvcm1hdHRlclRvRE9NKERvY3VtZW50IGRvYywgRWxlbWVudCBlbGVtKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlcihuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKSk7Ci0gICAgdHJ5ewotICAgICAgbV9zZXJpYWxpemVyID0gKG5ldyBTZXJpYWxpemVyVG9YTUwoKSkuYXNET01TZXJpYWxpemVyKCk7Ci0gICAgICB0aGlzLnNldENvbnRlbnRIYW5kbGVyKChTZXJpYWxpemVyVG9YTUwpbV9zZXJpYWxpemVyKTsKLSAgICB9Ci0gICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gaW9lKQotICAgIHt9Ci0gIH0KLQotICAvKioKLSAgICogRm9ybWF0dGVyVG9ET00gaW5zdGFuY2UgY29uc3RydWN0b3IuLi4gaXQgd2lsbCBhZGQgdGhlIERPTSBub2RlcyAKLSAgICogdG8gdGhlIGRvY3VtZW50IGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIEZvcm1hdHRlclRvRE9NKERvY3VtZW50IGRvYywgRG9jdW1lbnRGcmFnbWVudCBkb2NGcmFnKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlcihuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKSk7IAotICAgIHRyeXsKLSAgICAgIG1fc2VyaWFsaXplciA9IChuZXcgU2VyaWFsaXplclRvWE1MKCkpLmFzRE9NU2VyaWFsaXplcigpOwotICAgICAgdGhpcy5zZXRDb250ZW50SGFuZGxlcigoU2VyaWFsaXplclRvWE1MKW1fc2VyaWFsaXplcik7Ci0gICAgfQotICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGlvZSkKLSAgICB7fQotICB9Ci0KLSAgLyoqCi0gICAqIEZvcm1hdHRlclRvRE9NIGluc3RhbmNlIGNvbnN0cnVjdG9yLi4uIGl0IHdpbGwgYWRkIHRoZSBET00gbm9kZXMgCi0gICAqIHRvIHRoZSBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyBGb3JtYXR0ZXJUb0RPTShEb2N1bWVudCBkb2MpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICB0cnl7Ci0gICAgICBtX3NlcmlhbGl6ZXIgPSAobmV3IFNlcmlhbGl6ZXJUb1hNTCgpKS5hc0RPTVNlcmlhbGl6ZXIoKTsKLSAgICAgIHRoaXMuc2V0Q29udGVudEhhbmRsZXIoKFNlcmlhbGl6ZXJUb1hNTCltX3NlcmlhbGl6ZXIpOwotICAgIH0KLSAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBpb2UpCi0gICAge30KLSAgfQotICAKLSAgcHVibGljIFNlcmlhbGl6ZXJUb1hNTCBnZXRTZXJpYWxpemVyT2JqZWN0KCkKLSAgewotICAgIHJldHVybiAoU2VyaWFsaXplclRvWE1MKW1fc2VyaWFsaXplcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL0Zvcm1hdHRlclRvSFRNTC5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9Gb3JtYXR0ZXJUb0hUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2MjFiMi4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL0Zvcm1hdHRlclRvSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZS5TZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXJUb0hUTUw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5QYXJzZXJBZGFwdGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLS8vaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5PdXRwdXRGb3JtYXQ7Ci0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KLSAqIEZvcm1hdHRlclRvSFRNTCBmb3JtYXRzIFNBWC1zdHlsZSBldmVudHMgaW50byBYTUwuCi0gKiBXYXJuaW5nOiB0aGlzIGNsYXNzIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIFhlcmNlcyBTZXJpYWxpemVyIGNsYXNzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtYXR0ZXJUb0hUTUwgZXh0ZW5kcyBQYXJzZXJBZGFwdGVyCi17IAotICAKLSAgU2VyaWFsaXplclRvSFRNTCBtX3NlcmlhbGl6ZXI7Ci0gIAotICBwdWJsaWMgRm9ybWF0dGVyVG9IVE1MKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKLSAgewotICAgIHN1cGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICBtX3NlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplclRvSFRNTCgpOwotICAgIHRoaXMuc2V0Q29udGVudEhhbmRsZXIobV9zZXJpYWxpemVyKTsgIAotICB9Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IgdXNpbmcgYSB3cml0ZXIuCi0gICAqIEBwYXJhbSB3cml0ZXIgICAgICAgIFRoZSBjaGFyYWN0ZXIgb3V0cHV0IHN0cmVhbSB0byB1c2UuCi0gICAqLwotICBwdWJsaWMgRm9ybWF0dGVyVG9IVE1MKFdyaXRlciB3cml0ZXIpIHRocm93cyBTQVhFeGNlcHRpb24gIAotICB7Ci0gICAgc3VwZXIobmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCkpOwotICAgIG1fc2VyaWFsaXplciA9IG5ldyBTZXJpYWxpemVyVG9IVE1MKCk7Ci0gICAgbV9zZXJpYWxpemVyLnNldFdyaXRlcih3cml0ZXIpOwotICAgIHRoaXMuc2V0Q29udGVudEhhbmRsZXIobV9zZXJpYWxpemVyKTsgICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciB1c2luZyBhbiBvdXRwdXQgc3RyZWFtLCBhbmQgYSBzaW1wbGUgT3V0cHV0Rm9ybWF0LgotICAgKiBAcGFyYW0gd3JpdGVyICAgICAgICBUaGUgY2hhcmFjdGVyIG91dHB1dCBzdHJlYW0gdG8gdXNlLgotICAgKi8KLSAgcHVibGljIEZvcm1hdHRlclRvSFRNTChqYXZhLmlvLk91dHB1dFN0cmVhbSBvcykgIAotICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlcihuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKSk7Ci0gICAgbV9zZXJpYWxpemVyID0gbmV3IFNlcmlhbGl6ZXJUb0hUTUwoKTsKLSAgICBtX3NlcmlhbGl6ZXIuc2V0T3V0cHV0U3RyZWFtKG9zKTsKLSAgICB0aGlzLnNldENvbnRlbnRIYW5kbGVyKG1fc2VyaWFsaXplcik7Ci0gICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciB1c2luZyBhIHdyaXRlci4KLSAgICogQHBhcmFtIHdyaXRlciAgICAgICAgVGhlIGNoYXJhY3RlciBvdXRwdXQgc3RyZWFtIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyBGb3JtYXR0ZXJUb0hUTUwoRm9ybWF0dGVyVG9YTUwgeG1sTGlzdGVuZXIpIHRocm93cyBTQVhFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlcihuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKSk7Ci0gICAgbV9zZXJpYWxpemVyID0gbmV3IFNlcmlhbGl6ZXJUb0hUTUwoKTsKLSAgICBtX3NlcmlhbGl6ZXIuQ29weUZyb20oeG1sTGlzdGVuZXIubV9zZXJpYWxpemVyKTsKLSAgICB0aGlzLnNldENvbnRlbnRIYW5kbGVyKG1fc2VyaWFsaXplcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZXJpYWxpemVyVG9IVE1MIGdldFNlcmlhbGl6ZXJPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG1fc2VyaWFsaXplcjsKLSAgfQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9Gb3JtYXR0ZXJUb1RleHQuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvRm9ybWF0dGVyVG9UZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOTI2NzkuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9Gb3JtYXR0ZXJUb1RleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplclRvVGV4dDsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlBhcnNlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+Ci0gKiBUaGlzIGNsYXNzIHRha2VzIFNBWCBldmVudHMgKGluIGFkZGl0aW9uIHRvIHNvbWUgZXh0cmEgZXZlbnRzIAotICogdGhhdCBTQVggZG9lc24ndCBoYW5kbGUgeWV0KSBhbmQgcHJvZHVjZXMgc2ltcGxlIHRleHQgb25seS4KLSAqIFdhcm5pbmc6IHRoaXMgY2xhc3Mgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgWGVyY2VzIFNlcmlhbGl6ZXIgY2xhc3Nlcy4KLSAqLwotcHVibGljIGNsYXNzIEZvcm1hdHRlclRvVGV4dCBleHRlbmRzIFBhcnNlckFkYXB0ZXIKLXsKLSAgCi0gIHByaXZhdGUgU2VyaWFsaXplclRvVGV4dCBtX3NlcmlhbGl6ZXI7Ci0gIC8qKgotICAgKiBGb3JtYXR0ZXJUb1RleHQgaW5zdGFuY2UgY29uc3RydWN0b3IuLi4gaXQgd2lsbCBhZGQgdGhlIERPTSBub2RlcyAKLSAgICogdG8gdGhlIGRvY3VtZW50IGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIEZvcm1hdHRlclRvVGV4dChXcml0ZXIgcHcpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICBtX3NlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplclRvVGV4dCgpOyAKLSAgICBtX3NlcmlhbGl6ZXIuc2V0V3JpdGVyKHB3KTsKLSAgICB0aGlzLnNldENvbnRlbnRIYW5kbGVyKG1fc2VyaWFsaXplcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZXJpYWxpemVyVG9UZXh0IGdldFNlcmlhbGl6ZXJPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG1fc2VyaWFsaXplcjsKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvRm9ybWF0dGVyVG9YTUwuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvRm9ybWF0dGVyVG9YTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwZDAzMi4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL0Zvcm1hdHRlclRvWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgIAotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplclRvWE1MOwotLy9pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLkJhc2VNYXJrdXBTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLk1ldGhvZDsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlBhcnNlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KLSAqIEZvcm1hdHRlclRvWE1MIGZvcm1hdHMgU0FYLXN0eWxlIGV2ZW50cyBpbnRvIFhNTC4KLSAqIFdhcm5pbmc6IHRoaXMgY2xhc3Mgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgWGVyY2VzIFNlcmlhbGl6ZXIgY2xhc3Nlcy4KLSAqLwotcHVibGljIGNsYXNzIEZvcm1hdHRlclRvWE1MIGV4dGVuZHMgUGFyc2VyQWRhcHRlcgotewotICBTZXJpYWxpemVyVG9YTUwgbV9zZXJpYWxpemVyOwotICAKLSAgcHVibGljIEZvcm1hdHRlclRvWE1MKCkKLSAgewotICAgIHN1cGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICBtX3NlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplclRvWE1MKCk7Ci0gICAgdGhpcy5zZXRDb250ZW50SGFuZGxlcihtX3NlcmlhbGl6ZXIpOwotICAgIC8vc3VwZXIoIG5ldyBPdXRwdXRGb3JtYXQoIE1ldGhvZC5YTUwsIG51bGwsIGZhbHNlICkgKTsgICAgIAotICB9Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IgdXNpbmcgYSB3cml0ZXIuCi0gICAqIEBwYXJhbSB3cml0ZXIgICAgICAgIFRoZSBjaGFyYWN0ZXIgb3V0cHV0IHN0cmVhbSB0byB1c2UuCi0gICAqLwotICBwdWJsaWMgRm9ybWF0dGVyVG9YTUwoV3JpdGVyIHdyaXRlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKLSAgewotICAgIHN1cGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICBtX3NlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplclRvWE1MKCk7Ci0gICAvLyBzdXBlciggZm9ybWF0ICE9IG51bGwgPyBmb3JtYXQgOiBuZXcgT3V0cHV0Rm9ybWF0KCBNZXRob2QuWE1MLCBudWxsLCBmYWxzZSApICk7Ci0gICAgLy9fZm9ybWF0LnNldE1ldGhvZCggTWV0aG9kLlhNTCApOwotICAgIG1fc2VyaWFsaXplci5zZXRXcml0ZXIoIHdyaXRlciApOwotICAgIHRoaXMuc2V0Q29udGVudEhhbmRsZXIobV9zZXJpYWxpemVyKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIHVzaW5nIGFuIG91dHB1dCBzdHJlYW0sIGFuZCBhIHNpbXBsZSBPdXRwdXRGb3JtYXQuCi0gICAqIEBwYXJhbSB3cml0ZXIgICAgICAgIFRoZSBjaGFyYWN0ZXIgb3V0cHV0IHN0cmVhbSB0byB1c2UuCi0gICAqLwotICBwdWJsaWMgRm9ybWF0dGVyVG9YTUwoamF2YS5pby5PdXRwdXRTdHJlYW0gb3MpIAotICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uICwgU0FYRXhjZXB0aW9uIAotICB7Ci0gICAgc3VwZXIobmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCkpOwotICAgIG1fc2VyaWFsaXplciA9IG5ldyBTZXJpYWxpemVyVG9YTUwoKTsKLSAgICAvL3N1cGVyKCBmb3JtYXQgIT0gbnVsbCA/IGZvcm1hdCA6IG5ldyBPdXRwdXRGb3JtYXQoIE1ldGhvZC5YTUwsIG51bGwsIGZhbHNlICkgKTsKLSAgICAvL19mb3JtYXQuc2V0TWV0aG9kKCBNZXRob2QuWE1MICk7Ci0gICAgbV9zZXJpYWxpemVyLnNldE91dHB1dFN0cmVhbSggb3MgKTsKLSAgICB0aGlzLnNldENvbnRlbnRIYW5kbGVyKG1fc2VyaWFsaXplcik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciB1c2luZyBhIHdyaXRlci4KLSAgICogQHBhcmFtIHdyaXRlciAgICAgICAgVGhlIGNoYXJhY3RlciBvdXRwdXQgc3RyZWFtIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyBGb3JtYXR0ZXJUb1hNTChGb3JtYXR0ZXJUb1hNTCB4bWxMaXN0ZW5lcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKLSAgewotICAgIHN1cGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICBtX3NlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplclRvWE1MKCk7Ci0gICAgbV9zZXJpYWxpemVyLkNvcHlGcm9tKHhtbExpc3RlbmVyLm1fc2VyaWFsaXplcik7Ci0gICAgLy9zdXBlciggbmV3IE91dHB1dEZvcm1hdCggTWV0aG9kLlhNTCwgbnVsbCwgZmFsc2UgKSApOwotICAgIHRoaXMuc2V0Q29udGVudEhhbmRsZXIobV9zZXJpYWxpemVyKTsKLSAgfQotICAKLSAgcHVibGljIFNlcmlhbGl6ZXJUb1hNTCBnZXRTZXJpYWxpemVyT2JqZWN0KCkKLSAgewotICAgIHJldHVybiBtX3NlcmlhbGl6ZXI7Ci0gIH0KLSAgCi0KLX0gIC8vVG9YTUxTdHJpbmdWaXNpdG9yCmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL1Byb2JsZW1MaXN0ZW5lci5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9Qcm9ibGVtTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmNDEzNy4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL1Byb2JsZW1MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+Ci0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdGhhdCB0aGUgWFNMIHByb2Nlc3NvciBjYWxscyB3aGVuIGl0IAotICogaGFzIGEgcHJvYmxlbSBvZiBzb21lIGtpbmQsIGVpdGhlciBhbiBlcnJvciBvciBhIHdhcm5pbmcuCi0gKiBVc2VycyBzaG91bGQgYXNzIHRoZSBYU0xURW5naW5lSW1wbCBjbGFzcyB0byBzZXRQcm9ibGVtTGlzdGVuZXIKLSAqIGlmIHRoZXkgd2lzaCBhbiBvYmplY3QgaW5zdGFuY2UgdG8gYmUgY2FsbGVkIHdoZW4gYSBwcm9ibGVtCi0gKiBldmVudCBvY2N1cnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvYmxlbUxpc3RlbmVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgICAgV0FSTklORyAgICAgICAgID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCAgICBFUlJPUiAgICAgICAgICAgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0ICAgIE1FU1NBR0UgICAgICAgICA9IDM7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCAgICBYTUxQQVJTRVIgICAgICAgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0ICAgIFhTTFBST0NFU1NPUiAgICA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgICAgUVVFUllFTkdJTkUgICAgID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCAgICBYUEFUSFBST0NFU1NPUiAgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0ICAgIFhQQVRIUEFSU0VSICA9IDU7Ci0KLSAgLyoqCi0gICAqIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBwcm9ibGVtIGV2ZW50IG9jY3Vycy4KLSAgICogCi0gICAqIEBwYXJhbSAgIHdoZXJlICAgICAgICAgICAgIEVpdGhlciBhbmQgWE1MUEFSU0VSLCBYU0xQUk9DRVNTT1IsIG9yIFFVRVJZRU5HSU5FLgotICAgKiBAcGFyYW0gICBjbGFzc2lmaWNhdGlvbiAgICBFaXRoZXIgRVJST1Igb3IgV0FSTklORy4KLSAgICogQHBhcmFtICAgc3R5bGVOb2RlICAgICAgICAgVGhlIHN0eWxlIHRyZWUgbm9kZSB3aGVyZSB0aGUgcHJvYmxlbQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZC4gIE1heSBiZSBudWxsLgotICAgKiBAcGFyYW0gICBzb3VyY2VOb2RlICAgICAgICBUaGUgc291cmNlIHRyZWUgbm9kZSB3aGVyZSB0aGUgcHJvYmxlbQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZC4gIE1heSBiZSBudWxsLgotICAgKiBAcGFyYW0gICBtc2cgICAgICAgICAgICAgICBBIHN0cmluZyBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlIHByb2JsZW0uCi0gICAqIEBwYXJhbSAgIGxpbmVObyAgICAgICAgICAgIFRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgcHJvYmxlbSBvY2N1cnJlZCwgIAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBrbm93bi4gTWF5IGJlIHplcm8uCi0gICAqIEBwYXJhbSAgIGNoYXJPZmZzZXQgICAgICAgIFRoZSBjaGFyYWN0ZXIgb2Zmc2V0IHdoZXJlIHRoZSBwcm9ibGVtLCAgCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkIGlmIGl0IGlzIGtub3duLiBNYXkgYmUgemVyby4KLSAgICogCi0gICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIHJldHVybiBpcyBhbiBFUlJPUiwgaW4gd2hpY2ggY2FzZQotICAgKiAgICAgICAgICBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uICBPdGhlcndpc2UgdGhlIHByb2Nlc3NvciB3aWxsIAotICAgKiAgICAgICAgICBjb250aW51ZSB0byBwcm9jZXNzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvYmxlbShzaG9ydCB3aGVyZSwgc2hvcnQgY2xhc3NpZmljYXRpb24sIAotICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc3R5bGVOb2RlLCBOb2RlIHNvdXJjZU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2csIFN0cmluZyBpZCwgaW50IGxpbmVObywgaW50IGNoYXJPZmZzZXQpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiAgOwotICAKLSAgLyoqCi0gICAqIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIGlzc3VlIGEgbWVzc2FnZS4KLSAgICogQHBhcmFtICAgbXNnICAgICAgICAgICAgICAgQSBzdHJpbmcgbWVzc2FnZSB0byBvdXRwdXQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBtZXNzYWdlKFN0cmluZyBtc2cpOwotCi19CmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL1Byb2JsZW1MaXN0ZW5lckRlZmF1bHQuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvUHJvYmxlbUxpc3RlbmVyRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmMzOTI3Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvUHJvYmxlbUxpc3RlbmVyRGVmYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRoYXQgdGhlIFhTTCBwcm9jZXNzb3IgY2FsbHMgd2hlbiBpdCAKLSAqIGhhcyBhIHByb2JsZW0gb2Ygc29tZSBraW5kLCBlaXRoZXIgYW4gZXJyb3Igb3IgYSB3YXJuaW5nLgotICogVXNlcnMgc2hvdWxkIGFzcyB0aGUgWFNMVEVuZ2luZUltcGwgY2xhc3MgdG8gc2V0UHJvYmxlbUxpc3RlbmVyCi0gKiBpZiB0aGV5IHdpc2ggYW4gb2JqZWN0IGluc3RhbmNlIHRvIGJlIGNhbGxlZCB3aGVuIGEgcHJvYmxlbQotICogZXZlbnQgb2NjdXJzLgotICovCi1wdWJsaWMgY2xhc3MgUHJvYmxlbUxpc3RlbmVyRGVmYXVsdCBleHRlbmRzIG9yZy5hcGFjaGUueG1sLnV0aWxzLkRlZmF1bHRFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBQcm9ibGVtTGlzdGVuZXIgCi17Ci0gIC8vRXJyb3JIYW5kbGVyIG1fZXJyb3JIYW5kbGVyID0gbnVsbDsKLSAgUHJvYmxlbUxpc3RlbmVyIG1fcHJvYmxlbUxpc3RlbmVyID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBQcm9ibGVtTGlzdGVuZXJEZWZhdWx0KCkKLSAgewotICAgIHN1cGVyKCk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgUHJvYmxlbUxpc3RlbmVyRGVmYXVsdChQcm9ibGVtTGlzdGVuZXIgbCkKLSAgeyAKLSAgICAvL21fZXJyb3JIYW5kbGVyID0gaGFuZGxlcjsKLSAgICBtX3Byb2JsZW1MaXN0ZW5lciA9IGw7Ci0gIH0KLSAgLyoKLSAgcHVibGljIHZvaWQgc2V0RXJyb3JIYW5kbGVyIChFcnJvckhhbmRsZXIgaGFuZGxlcikKLSAgewotICAgIG1fZXJyb3JIYW5kbGVyID0gaGFuZGxlcjsKLSAgfQotICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9ibGVtTGlzdGVuZXIgKFByb2JsZW1MaXN0ZW5lciBsKQotICB7Ci0gICAgbV9wcm9ibGVtTGlzdGVuZXIgPSBsOwotICB9Ci0gIAotICBwdWJsaWMgRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlciAoKQotICB7Ci0gICAgcmV0dXJuIHRoaXM7IC8vIG1fZXJyb3JIYW5kbGVyOwotICB9Ci0gIAotICBwdWJsaWMgUHJvYmxlbUxpc3RlbmVyIGdldFByb2JsZW1MaXN0ZW5lciAoKQotICB7Ci0gICAgaWYgKG1fcHJvYmxlbUxpc3RlbmVyICE9IG51bGwpCi0gICAgICByZXR1cm4gbV9wcm9ibGVtTGlzdGVuZXI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBGdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBpc3N1ZSBhIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSAgIG1zZyAgICAgICAgICAgICAgIEEgc3RyaW5nIG1lc3NhZ2UgdG8gb3V0cHV0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gbWVzc2FnZShTdHJpbmcgbXNnKQotICB7Ci0gICAgICBpZiAobV9wcm9ibGVtTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgbV9wcm9ibGVtTGlzdGVuZXIubWVzc2FnZShtc2cpOwotICAgICAgc3luY2hyb25pemVkICh0aGlzKQotICAgICAgeyAgCi0gICAgICAgIG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKCAgU3lzdGVtLmVyciwgdHJ1ZSApLnByaW50bG4oIG1zZyApOwotICAgICAgfSAKLSAgIAotICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGtub3cgdGhpcyBpcyBhbiBlcnJvciAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcHJvYmxlbShzaG9ydCB3aGVyZSwgc2hvcnQgY2xhc3NpZmljYXRpb24sIAotICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc3R5bGVOb2RlLCBOb2RlIHNvdXJjZU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2csIFN0cmluZyBpZCwgaW50IGxpbmVObywgaW50IGNoYXJPZmZzZXQpCi0gIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gICAKLSAgewotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciAhPSBudWxsKQotICAgICAgcmV0dXJuIG1fcHJvYmxlbUxpc3RlbmVyLnByb2JsZW0od2hlcmUsIGNsYXNzaWZpY2F0aW9uLCBzdHlsZU5vZGUsIHNvdXJjZU5vZGUsIG1zZywgaWQsIGxpbmVObywgY2hhck9mZnNldCk7Ci0gICAgZWxzZQotICAgIHsgIAotICAgICAgdGhpcy5lcnJvcihuZXcgU0FYUGFyc2VFeGNlcHRpb24obXNnLCBudWxsLCBpZCwgbGluZU5vLCBjaGFyT2Zmc2V0KSk7Ci0gICAgICByZXR1cm4gZmFsc2U7ICAgCi0gICAgfQotICB9IAotICAKLSAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciA9PSBudWxsKQotICAgIHsKLSAgICAgIHN1cGVyLndhcm5pbmcoZXhjZXB0aW9uKTsgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIHNob3VsZHRocm93ID0gbV9wcm9ibGVtTGlzdGVuZXIucHJvYmxlbShYU0xQUk9DRVNTT1IsIFdBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRDb2x1bW5OdW1iZXIoKSk7IAotICAgICAgaWYgKHNob3VsZHRocm93KQotICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciA9PSBudWxsKQotICAgIHsKLSAgICAgIHN1cGVyLmVycm9yKGV4Y2VwdGlvbik7ICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYm9vbGVhbiBzaG91bGR0aHJvdyA9IG1fcHJvYmxlbUxpc3RlbmVyLnByb2JsZW0oWFNMUFJPQ0VTU09SLCBFUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldFN5c3RlbUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCksICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpKTsgCi0gICAgICBpZiAoc2hvdWxkdGhyb3cpCi0gICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAobV9wcm9ibGVtTGlzdGVuZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdXBlci5mYXRhbEVycm9yKGV4Y2VwdGlvbik7ICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYm9vbGVhbiBzaG91bGR0aHJvdyA9IG1fcHJvYmxlbUxpc3RlbmVyLnByb2JsZW0oWFNMUFJPQ0VTU09SLCBFUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldFN5c3RlbUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCksICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpKTsgCi0gICAgICBpZiAoc2hvdWxkdGhyb3cpCi0gICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHdhcm5pbmcoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgewotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciA9PSBudWxsKQotICAgIHsKLSAgICAgIHN1cGVyLndhcm5pbmcoZXhjZXB0aW9uKTsgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIHNob3VsZHRocm93ID0gdHJ1ZTsKLSAgICAgIHRyeXsKLSAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBleGNlcHRpb24uZ2V0TG9jYXRvcigpOwotICAgICAgICBpZiAobG9jYXRvciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2hvdWxkdGhyb3cgPSBtX3Byb2JsZW1MaXN0ZW5lci5wcm9ibGVtKFhTTFBST0NFU1NPUiwgV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRTeXN0ZW1JZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yLmdldExpbmVOdW1iZXIoKSwgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIAotICAgICAgICB7Ci0gICAgICAgICAgc2hvdWxkdGhyb3cgPSBtX3Byb2JsZW1MaXN0ZW5lci5wcm9ibGVtKFhTTFBST0NFU1NPUiwgTUVTU0FHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKHNlKTsKLSAgICAgIH0KLSAgICAgIGlmIChzaG91bGR0aHJvdykKLSAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlcnJvcihUcmFuc2Zvcm1lckV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKG1fcHJvYmxlbUxpc3RlbmVyID09IG51bGwpCi0gICAgewotICAgICAgc3VwZXIuZXJyb3IoZXhjZXB0aW9uKTsgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIHNob3VsZHRocm93ID0gdHJ1ZTsKLSAgICAgIHRyeXsKLSAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBleGNlcHRpb24uZ2V0TG9jYXRvcigpOwotICAgICAgICBpZiAobG9jYXRvciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2hvdWxkdGhyb3cgPSBtX3Byb2JsZW1MaXN0ZW5lci5wcm9ibGVtKFhTTFBST0NFU1NPUiwgRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IuZ2V0U3lzdGVtSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCksICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgIHNob3VsZHRocm93ID0gbV9wcm9ibGVtTGlzdGVuZXIucHJvYmxlbShYU0xQUk9DRVNTT1IsIEVSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oc2UpOwotICAgICAgfQotICAgICAgaWYgKHNob3VsZHRocm93KQotICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgewotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciA9PSBudWxsKQotICAgIHsKLSAgICAgIHN1cGVyLmZhdGFsRXJyb3IoZXhjZXB0aW9uKTsgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIHNob3VsZHRocm93ID0gdHJ1ZTsKLSAgICAgIHRyeXsKLSAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBleGNlcHRpb24uZ2V0TG9jYXRvcigpOwotICAgICAgICBpZiAobG9jYXRvciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2hvdWxkdGhyb3cgPSBtX3Byb2JsZW1MaXN0ZW5lci5wcm9ibGVtKFhTTFBST0NFU1NPUiwgRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IuZ2V0U3lzdGVtSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCksICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgIHNob3VsZHRocm93ID0gbV9wcm9ibGVtTGlzdGVuZXIucHJvYmxlbShYU0xQUk9DRVNTT1IsIEVSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oc2UpOwotICAgICAgfQotICAgICAgaWYgKHNob3VsZHRocm93KQotICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLSAgLyoKLSAgcHJpdmF0ZSBjbGFzcyBNZXNzYWdlTWdyIGV4dGVuZHMgb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5Nc2dNZ3IgCi0gIHsKLSAgICB2b2lkIE1lc3NhZ2VNZ3IoKQotICAgIHt9Ci0gIH0qLwotCi19CmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL1RyZWVXYWxrZXIuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvVHJlZVdhbGtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGNiZmI2Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvVHJlZVdhbGtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xIAotICogCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuQXR0TGlzdDsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KLSAqIFRoaXMgY2xhc3MgZG9lcyBhIHByZS1vcmRlciB3YWxrIG9mIHRoZSBET00gdHJlZSwgY2FsbGluZyB0aGUgRm9ybWF0dGVyTGlzdGVuZXIKLSAqIGludGVyZmFjZSBhcyBpdCBnb2VzLgotICovCi1wdWJsaWMgY2xhc3MgVHJlZVdhbGtlciAvL2V4dGVuZHMgb3JnLmFwYWNoZS54bWwudXRpbHMuVHJlZVdhbGtlcgotewotICAKLSAgb3JnLmFwYWNoZS54bWwudXRpbHMuVHJlZVdhbGtlciBtX3dhbGtlcjsgCi0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSAgIGZvcm1hdHRlckxpc3RlbmVyIFRoZSBpbXBsZW1lbnRpb24gb2YgdGhlIAotICAgKiBGb3JtYXR0ZXJMaXN0ZW5lciBvcGVyYXRpb24gKHRvWE1MU3RyaW5nLCBkaWdlc3QsIC4uLikKLSAgICovCi0gIHB1YmxpYyBUcmVlV2Fsa2VyKERvY3VtZW50SGFuZGxlciBmb3JtYXR0ZXJMaXN0ZW5lcikgCi0gIHsKLSAgICBpZihmb3JtYXR0ZXJMaXN0ZW5lciBpbnN0YW5jZW9mIEZvcm1hdHRlclRvWE1MKQotICAgICAgbV93YWxrZXIgPSBuZXcgb3JnLmFwYWNoZS54bWwudXRpbHMuVHJlZVdhbGtlcigoKEZvcm1hdHRlclRvWE1MKWZvcm1hdHRlckxpc3RlbmVyKS5nZXRTZXJpYWxpemVyT2JqZWN0KCksIG5ldyBvcmcuYXBhY2hlLnhwYXRoLkRPTTJIZWxwZXIoKSk7Ci0gICAgLy9zdXBlcihmb3JtYXR0ZXJMaXN0ZW5lcik7Ci0gIH0gCi0gCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgcHJlLW9yZGVyIHRyYXZlcnNhbCBub24tcmVjdXJzaXZlIHN0eWxlLgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoTm9kZSBwb3MpIHRocm93cyBTQVhFeGNlcHRpb24gCi0gIHsKLSAgICBtX3dhbGtlci50cmF2ZXJzZShwb3MpOwotICB9Ci0gIAotICAvKioKLSAgICogUGVyZm9ybSBhIHByZS1vcmRlciB0cmF2ZXJzYWwgbm9uLXJlY3Vyc2l2ZSBzdHlsZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKE5vZGUgcG9zLCBOb2RlIHRvcCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKLSAgewotICAgIG1fd2Fsa2VyLnRyYXZlcnNlKHBvcywgdG9wKTsKLSAgfQotICAKLSAgCi0gIAotfSAgLy9UcmVlV2Fsa2VyCmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL1hNTFBhcnNlckxpYWlzb24uamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvWE1MUGFyc2VyTGlhaXNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTI3MDhmLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvWE1MUGFyc2VyTGlhaXNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgIAotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5ET00ySGVscGVyOwotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+Ci0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdGhhdCB0aGUgWFNMIHByb2Nlc3NvciBjYWxscyB3aGVuIGl0IAotICogaGFzIGEgcHJvYmxlbSBvZiBzb21lIGtpbmQsIGVpdGhlciBhbiBlcnJvciBvciBhIHdhcm5pbmcuCi0gKiBVc2VycyBzaG91bGQgYXNzIHRoZSBYU0xURW5naW5lSW1wbCBjbGFzcyB0byBzZXRQcm9ibGVtTGlzdGVuZXIKLSAqIGlmIHRoZXkgd2lzaCBhbiBvYmplY3QgaW5zdGFuY2UgdG8gYmUgY2FsbGVkIHdoZW4gYSBwcm9ibGVtCi0gKiBldmVudCBvY2N1cnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxQYXJzZXJMaWFpc29uIGV4dGVuZHMgRE9NMkhlbHBlcgotewotICAKLQotfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9YTUxQYXJzZXJMaWFpc29uRGVmYXVsdC5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9YTUxQYXJzZXJMaWFpc29uRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2EyMzlmLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvWE1MUGFyc2VyTGlhaXNvbkRlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWw7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC4qOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5YTUxQYXJzZXJMaWFpc29uOwotCi0vKioKLSAqIEEgY2xhc3MgdGhhdCBoYW5kbGVzIGludGVyZmFjaW5nIElCTSdzIFhNTDRKMiB0byB0aGUgCi0gKiBMb3R1cyBYU0wgUHJvY2Vzc29yLgotICovCi1wdWJsaWMgY2xhc3MgWE1MUGFyc2VyTGlhaXNvbkRlZmF1bHQgZXh0ZW5kcyBYTUxQYXJzZXJMaWFpc29uIAotewotICAKLX0KLQotCmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL3BhY2thZ2UuaHRtbCBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2VlN2QxLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPEhUTUw+PEhFQUQ+PC9IRUFEPjxCT0RZPgotICAgICA8UD5JbmZyYXN0cnVjdHVyZSBmb3Igd29ya2luZyB3aXRoIGFuIFhNTCBwYXJzZXIuPC9QPgotICAgCi0gICAgICA8UD5BbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLlhNTFBhcnNlckxpYWlzb259IGludGVyZmFjZSBwcm92aWRlcyBhIGxpYWlzb24KLSAgICAgYmV0d2VlbiB0aGUgWFNMVCBwcm9jZXNzb3IgYW5kIGFuIFhNTCBwYXJzZXIuIFVubGVzcyB5b3Ugc3BlY2lmeSBhbiBYTUwgcGFyc2VyIGFuZCB5b3VyIG93biBpbXBsZW1lbnRhdGlvbiBvZiAKLSAgICAgdGhlIFhNTFBhcnNlckxpYWlzb24gaW50ZXJmYWNlLCBYYWxhbi1KYXZhIHVzZXMgdGhlIAotICAgICB7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuWE1MUGFyc2VyTGlhaXNvbkRlZmF1bHR9OjwvUD4KLSAgICAgPFA+VGhpcyBwYWNrYWdlIGFsc28gaW5jbHVkZXMgZm91ciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIDxBIGhyZWY9Imh0dHA6Ly93d3cubWVnZ2luc29uLmNvbS9TQVgvc2F4Lmh0bWwiIHRhcmdldD0iX3RvcCI+U0FYPC9BPiA8QSBocmVmPSJodHRwOi8vd3d3Lm1lZ2dpbnNvbi5jb20vU0FYL2phdmFkb2Mvb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyLmh0bWwjX3RvcCIgdGFyZ2V0PSJfdG9wIj5vcmcueG1sLnNheC5Eb2N1bWVudEhhbmRsZXI8L0E+IGludGVyZmFjZTo8L1A+Ci0gICAgIDxVTD4KLSAgICAgPExJPntAbGluayBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5Gb3JtYXR0ZXJUb0RPTX08L0xJPgotICAgICA8TEk+e0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLkZvcm1hdHRlclRvWE1MfTwvTEk+Ci0gICAgIDxMST57QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuRm9ybWF0dGVyVG9IVE1MfSAoYW4gZXh0ZW5zaW9uIG9mIEZvcm1hdHRlclRvWE1MKTwvTEk+Ci0gICAgIDxMST57QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuRm9ybWF0dGVyVG9UZXh0fTwvTEk+Ci0gICAgIDwvVUw+Ci0gICA8L0JPRFk+PC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXQuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5ODQ2NC4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9TdHlsZXNoZWV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54c2x0OwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIGJhc2Ugc3R5bGVzaGVldCBvciBhbgotICogImltcG9ydCIgc3R5bGVzaGVldDsgImluY2x1ZGUiIHN0eWxlc2hlZXRzIGFyZQotICogY29tYmluZWQgd2l0aCB0aGUgaW5jbHVkaW5nIHN0eWxlc2hlZXQuCi0gKiBBdCB0aGUgbW9tZW50IHRoZXNlIHN0eWxlc2hlZXRzIGNhbiBub3QgYmUgcmV1c2VkIHdpdGhpbiB0aGUKLSAqIHN0eWxlc2hlZXQgdHJlZSBvciBiZXR3ZWVuIHRyZWVzLiAgVGhpcyBuZWVkcyB0byBiZSBmaXhlZAotICogaW4gdGhlIGZ1dHVyZS4KLSAqLwotcHVibGljIGNsYXNzIFN0eWxlc2hlZXQgIGV4dGVuZHMgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldAoteyAKLQkKLQkgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBhIFN0eWxlc2hlZXQgbmVlZHMgYSBEb2N1bWVudC4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXQoU3R5bGVzaGVldFJvb3Qgcm9vdCwKLSAgICAgICAgICAgICAgICAgICAgWFNMVEVuZ2luZUltcGwgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZUlkZW50aWZpZXIpCi0gICAgdGhyb3dzIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAotICAgICAgICAgICBGaWxlTm90Rm91bmRFeGNlcHRpb24sCi0gICAgICAgICAgIElPRXhjZXB0aW9uLAotICAgICAgICAgICBTQVhFeGNlcHRpb24KLSAgewotCQlzdXBlcihyb290LmdldE9iamVjdCgpKTsgICAgCi0gIH0KLQkKLQkvKioKLSAgICogQ29uc3RydWN0b3IgdXNpbmcgYW4gb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3QuCi0gICAqIAotICAgKiBAcGFyYW0gcyBhbiBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0IG9iamVjdAotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXQob3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldCBzKSAgICAKLSAgeyAKLQkJc3VwZXIocyk7Ci0gICAgICAgCi0gIH0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXRIYW5kbGVyLmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9TdHlsZXNoZWV0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDBmYjM1Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgIAotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54c2x0OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuUGFyc2VyQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0OyAKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KLSAqIEluaXRpYWxpemVzIGFuZCBwcm9jZXNzZXMgYSBzdHlsZXNoZWV0IHZpYSBTQVggZXZlbnRzLgotICogSWYgeW91IG5lZWQgdG8gYWx0ZXIgdGhlIGNvZGUgaW4gaGVyZSwKLSAqIGl0IGlzIG5vdCBmb3IgdGhlIGZhaW50LW9mLWhlYXJ0LCBkdWUgdG8gdGhlIHN0YXRlIHRyYWNraW5nCi0gKiB0aGF0IGhhcyB0byBiZSBkb25lIGR1ZSB0byB0aGUgU0FYIGV2ZW50IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVzaGVldEhhbmRsZXIgZXh0ZW5kcyBQYXJzZXJBZGFwdGVyCi0gIAotewotICAKLSAgLyoqCi0gICAqIEluc3RhbmNlIGNvbnN0cnVjdG9yLi4uIAotICAgKiBAcGFyYW0gcHJvY2Vzc29yICBUaGUgWFNMVFByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbi4KLSAgICogQHBhcmFtIHN0eWxlc2hlZXQgVGhlIHJvb3Qgc3R5bGVzaGVldC4KLSAgICogICAgCi0gICAqLwotICBwdWJsaWMgU3R5bGVzaGVldEhhbmRsZXIoWFNMVEVuZ2luZUltcGwgcHJvY2Vzc29yLCBTdHlsZXNoZWV0IHN0eWxlc2hlZXRUcmVlKSAgICAKLSAgICB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiAKLSAgewotICAgIAotICAgICAgc3VwZXIobmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCkpOwotICAgICAgLy90cnl7Ci0gICAgICBvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5TdHlsZXNoZWV0SGFuZGxlciBoYW5kbGVyID0gCi0gICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuU3R5bGVzaGVldEhhbmRsZXIocHJvY2Vzc29yLmdldFRyYW5zZm9ybWVyRmFjdG9yeSgpKTsKLSAgICAgIGhhbmRsZXIucHVzaFN0eWxlc2hlZXQoc3R5bGVzaGVldFRyZWUpOwotICAgICAgdGhpcy5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKLSAgICAvL30KLSAgICAvL2NhdGNoIChqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpCi0gICAgLy97fQotICB9IAotICAKLSAgLyoqCi0gICAqIEluc3RhbmNlIGNvbnN0cnVjdG9yLi4uIAotICAgKiBAcGFyYW0gcHJvY2Vzc29yICBUaGUgWFNMVFByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbi4KLSAgICogQHBhcmFtIHN0eWxlc2hlZXQgVGhlIHJvb3Qgc3R5bGVzaGVldC4gCi0gICAqIEBleGNlcHRpb24gVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uICAKLSAgICovCi0gIHB1YmxpYyBTdHlsZXNoZWV0SGFuZGxlcihYU0xURW5naW5lSW1wbCBwcm9jZXNzb3IsIFN0eWxlc2hlZXRSb290IHN0eWxlc2hlZXRUcmVlKSAgICAKLSAgICB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiAKLSAgewotICAgIC8vdHJ5ewotICAgICAgc3VwZXIobmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCkpOwotICAgICAgb3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuU3R5bGVzaGVldEhhbmRsZXIgaGFuZGxlciA9IAotICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlN0eWxlc2hlZXRIYW5kbGVyKHByb2Nlc3Nvci5nZXRUcmFuc2Zvcm1lckZhY3RvcnkoKSk7Ci0gICAgICBoYW5kbGVyLnB1c2hTdHlsZXNoZWV0KHN0eWxlc2hlZXRUcmVlLmdldE9iamVjdCgpKTsKLSAgICAgIHRoaXMuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgLy99Ci0gICAgLy9jYXRjaCAoamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgIC8ve30KLSAgfSAKLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvU3R5bGVzaGVldFJvb3QuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXRSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MmMzMWEuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvU3R5bGVzaGVldFJvb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSAgCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuT3V0cHV0UHJvcGVydGllczsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuRm9ybWF0dGVyVG9YTUw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuRm9ybWF0dGVyVG9IVE1MOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLkZvcm1hdHRlclRvVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5Gb3JtYXR0ZXJUb0RPTTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnJlcy5YU0xURXJyb3JSZXNvdXJjZXM7Ci0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4gCi0gKiBCaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgYSBzdHlsZXNoZWV0IC0tIHVzZSB0aGUge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUHJvY2Vzc29yfSBQcm9jZXNzU3R5bGVzaGVldAotICogbWV0aG9kIHRvIGNyZWF0ZSBhIFN0eWxlc2hlZXRSb290IGFuZCBpbXByb3ZlIHBlcmZvcm1hbmNlIGZvciBhIHN0eWxlc2hlZXQgcGVyZm9ybWluZyBtdWx0aXBsZSB0cmFuc2Zvcm1hdGlvbnMuCi0gKiBBbHNvIHJlcXVpcmVkIGZvciBYU0xUUHJvY2Vzc29yIHRvIGZ1bmN0aW9uIGFzIFNBWCBEb2N1bWVudEhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZXNoZWV0Um9vdCBleHRlbmRzIFN0eWxlc2hlZXQKLXsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIG1fbGlhaXNvbkNsYXNzVXNlZFRvQ3JlYXRlID0gbnVsbDsKLSAgcHJpdmF0ZSBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0Um9vdCBtX3NSb290T2JqZWN0OwotICAKLSAgLyoqCi0gICAqIFVzZXMgYW4gWFNMIHN0eWxlc2hlZXQgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBwcm9jZXNzb3IgIFRoZSBYU0xUUHJvY2Vzc29yIGltcGxlbWVudGF0aW9uLgotICAgKiBAcGFyYW0gYmFzZUlkZW50aWZpZXIgVGhlIGZpbGUgbmFtZSBvciBVUkwgZm9yIHRoZSBYU0wgc3R5bGVzaGVldC4KLSAgICogQGV4Y2VwdGlvbiBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGhyb3duIAotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXRSb290KFhTTFRFbmdpbmVJbXBsIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlSWRlbnRpZmllcikKLSAgICB0aHJvd3MgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsgCi0JCXN1cGVyKG51bGwpOwotICAgIG1fc1Jvb3RPYmplY3QgPSBuZXcgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3QocHJvY2Vzc29yLmdldFRyYW5zZm9ybWVyRmFjdG9yeSgpLmdldEVycm9yTGlzdGVuZXIoKSk7IAotICAgIGlmIChwcm9jZXNzb3IuZ2V0WE1MUHJvY2Vzc29yTGlhaXNvbigpIT0gbnVsbCkKLSAgICAgIG1fbGlhaXNvbkNsYXNzVXNlZFRvQ3JlYXRlID0gKChPYmplY3QpcHJvY2Vzc29yLmdldFhNTFByb2Nlc3NvckxpYWlzb24oKSkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgCi0gIH0gIAotCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIHVzaW5nIGFuIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXRSb290LgotICAgKiAKLSAgICogQHBhcmFtIHMgYW4gb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3Qgb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgU3R5bGVzaGVldFJvb3Qob3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3QgcykgICAgCi0gIHsgCi0JCXN1cGVyKG51bGwpOwotICAgIG1fc1Jvb3RPYmplY3QgPSBzOyAgICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXRSb290IG9iamVjdAotICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdHlsZXNoZWV0IHJvb3QuCi0gICAqICAKLSAgICogQHJldHVybiBhbiBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0Um9vdCBvYmplY3QKLSAgICovCi0gIHB1YmxpYyBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0Um9vdCBnZXRPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG1fc1Jvb3RPYmplY3Q7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIFRyYW5zZm9ybSB0aGUgWE1MIHNvdXJjZSB0cmVlIGFuZCBwbGFjZSB0aGUgb3V0cHV0IGluIHRoZSByZXN1bHQgdHJlZSB0YXJnZXQuCi0gICAqIFRoaXMgbWV0aG9kIHVzZXMgYSBuZXcgWFNMVFByb2Nlc3NvciBpbnN0YW5jZSB0byB0cmFjayB0aGUgcnVubmluZyBzdGF0ZS4KLSAgICogQHBhcmFtIHhtbFNvdXJjZSAgVGhlIFhNTCBpbnB1dCBzb3VyY2UgdHJlZS4KLSAgICogQHBhcmFtIG91dHB1dFRhcmdldCBUaGUgb3V0cHV0IHJlc3VsdCB0cmVlLgotICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUHJvY2Vzc29yI3Byb2Nlc3Mob3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZSwgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZSwgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRSZXN1bHRUYXJnZXQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcm9jZXNzKCBYU0xUSW5wdXRTb3VyY2UgeG1sU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBYU0xUUmVzdWx0VGFyZ2V0IG91dHB1dFRhcmdldCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLAotICAgICAgICAgICBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgICAgICAgIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgSU9FeGNlcHRpb24KLSAgewotICAgIFhTTFRQcm9jZXNzb3IgaXByb2Nlc3NvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCAhPSBtX2xpYWlzb25DbGFzc1VzZWRUb0NyZWF0ZSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhTTFRQcm9jZXNzb3JGYWN0b3J5KCkuZ2V0UHJvY2Vzc29yVXNpbmdMaWFpc29uTmFtZShtX2xpYWlzb25DbGFzc1VzZWRUb0NyZWF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFhTTFRQcm9jZXNzb3JGYWN0b3J5KCkuZ2V0UHJvY2Vzc29yKCk7Ci0gICAgcHJvY2VzcyhpcHJvY2Vzc29yLCBpcHJvY2Vzc29yLmdldFNvdXJjZVRyZWVGcm9tSW5wdXQoeG1sU291cmNlKSwgb3V0cHV0VGFyZ2V0KTsKLSAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBjb3VudGVycyBtYWRlOiAiKwotICAgIC8vICAgICAgICAgICAgICAgICAgICgoWFNMVEVuZ2luZUltcGwpaXByb2Nlc3NvcikuZ2V0Q291bnRlcnNUYWJsZSgpLm1fY291bnRlcnNNYWRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFuc2Zvcm0gdGhlIFhNTCBzb3VyY2UgdHJlZSBhbmQgcGxhY2UgdGhlIG91dHB1dCBpbiB0aGUgcmVzdWx0IHRyZWUgdGFyZ2V0LgotICAgKiBVc2UgdGhpcyB2ZXJzaW9uIG9mIHRoZSBTdHlsZXNoZWV0Um9vdCBwcm9jZXNzKCkgbWV0aG9kIGlmIHlvdSBoYXZlIHVzZWQgYW4KLSAgICogWFNMVFByb2Nlc3NvciBvYmplY3QgdG8gc2V0IGEgc3R5bGVzaGVldCBwYXJhbWV0ZXIuIFRoYXQgb2JqZWN0IGlzIG5vdyB0aGUgaXByb2Nlc3NvciBwYXJhbWV0ZXIuCi0gICAqIEBwYXJhbSBpcHJvY2Vzc29yICBUaGUgWFNMVFByb2Nlc3NvciB0aGF0IHdpbGwgdHJhY2sgdGhlIHJ1bm5pbmcgc3RhdGUuCi0gICAqIEBwYXJhbSB4bWxTb3VyY2UgIFRoZSBYTUwgaW5wdXQgc291cmNlIHRyZWUuCi0gICAqIEBwYXJhbSBvdXRwdXRUYXJnZXQgVGhlIG91dHB1dCByZXN1bHQgdHJlZS4KLSAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24KLSAgICogQHNlZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVFByb2Nlc3NvciNwcm9jZXNzKG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUSW5wdXRTb3VyY2UsIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUSW5wdXRTb3VyY2UsIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUmVzdWx0VGFyZ2V0KQotICAgKi8KLSAgcHVibGljIHZvaWQgcHJvY2VzcyggWFNMVFByb2Nlc3NvciBpcHJvY2Vzc29yLCBYU0xUSW5wdXRTb3VyY2UgeG1sU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBYU0xUUmVzdWx0VGFyZ2V0IG91dHB1dFRhcmdldCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLAotICAgICAgICAgICBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgICAgICAgIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgSU9FeGNlcHRpb24KLSAgewotICAgIHByb2Nlc3MoaXByb2Nlc3NvciwgaXByb2Nlc3Nvci5nZXRTb3VyY2VUcmVlRnJvbUlucHV0KHhtbFNvdXJjZSksIG91dHB1dFRhcmdldCk7Ci0gIH0KLQotICAvKioKLSAgICogVHJhbnNmb3JtIHRoZSBYTUwgc291cmNlIHRyZWUgKGEgRE9NIE5vZGUpIGFuZCBwbGFjZSB0aGUgb3V0cHV0IGluIHRoZSByZXN1bHQgdHJlZSB0YXJnZXQuCi0gICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QuIFlvdSBjYW4gYWxzbyB1c2UgYSBET00gTm9kZSB0byBpbnN0YW50aWF0ZSBhbiBYU0xUSW5wdXRTb3VyY2Ugb2JqZWN0LAotICAgKiBhbmQgY2FsbCB7QGxpbmsgI3Byb2Nlc3Mob3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRQcm9jZXNzb3IsIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUSW5wdXRTb3VyY2UsIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUmVzdWx0VGFyZ2V0KX0gb3IKLSAgICoge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUHJvY2Vzc29yI3Byb2Nlc3Mob3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZSwgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZSwgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRSZXN1bHRUYXJnZXQpfS4KLSAgICogQHBhcmFtIGlwcm9jZXNzb3IgIFRoZSBwcm9jZXNzb3IgdGhhdCB3aWxsIHRyYWNrIHRoZSBydW5uaW5nIHN0YXRlLgotICAgKiBAcGFyYW0gc291cmNlVHJlZSAgVGhlIGlucHV0IHNvdXJjZSB0cmVlIGluIHRoZSBmb3JtIG9mIGEgRE9NIE5vZGUuCi0gICAqIEBwYXJhbSBvdXRwdXRUYXJnZXQgVGhlIG91dHB1dCByZXN1bHQgdHJlZS4KLSAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3MoIFhTTFRQcm9jZXNzb3IgaXByb2Nlc3NvciwgTm9kZSBzb3VyY2VUcmVlLAotICAgICAgICAgICAgICAgICAgICAgICBYU0xUUmVzdWx0VGFyZ2V0IG91dHB1dFRhcmdldCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLAotICAgICAgICAgICBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgICAgICAgIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgSU9FeGNlcHRpb24KLSAgewotICAgIFhTTFRFbmdpbmVJbXBsIHByb2Nlc3NvciA9IChYU0xURW5naW5lSW1wbClpcHJvY2Vzc29yOyAvLyBUT0RPOiBDaGVjayBmb3IgY2xhc3MgY2FzdCBleGNlcHRpb24KLQkJLy9jaGVja0luaXQocHJvY2Vzc29yKTsKLSAgICBzeW5jaHJvbml6ZWQocHJvY2Vzc29yKQotICAgIHsKLSAgICAgIC8vcHJvY2Vzc29yLnN3aXRjaExpYWlzb25zSWZOZWVkZWQoc291cmNlVHJlZSwgb3V0cHV0VGFyZ2V0LmdldE5vZGUoKSk7Ci0KLSAgICAgIHByb2Nlc3Nvci5zZXRTdHlsZXNoZWV0KHRoaXMpOwotCi0gICAgICBPdXRwdXRTdHJlYW0gb3N0cmVhbSA9IG51bGw7Ci0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBEb3VibGUtY2hlY2sgdGhlIG5vZGUgdG8gbWFrZSBzdXJlIGl0IG1hdGNoZXMgdGhlIHByb2Nlc3NvciBsaWFpc29uLgotICAgICAgICAvL3Byb2Nlc3Nvci5nZXRYTUxQcm9jZXNzb3JMaWFpc29uKCkuY2hlY2tOb2RlKHNvdXJjZVRyZWUpOwotCi0gICAgICAgIC8vIE5lZWRzIHdvcms6IFdlIGhhdmUgdG8gcHV0IHRoZSBleHRlbnNpb24gbmFtZXNwYWNlcwotICAgICAgICAvLyBpbnRvIHRoZSBsaWFpc29uJ3MgdGFibGUuICBXZSB3b3VsZG4ndCBoYXZlIHRvIGRvIHRoaXMKLSAgICAgICAgLy8gaWYgdGhlIHN0eWxlc2hlZXQgaGFuZGxlZCBpdCdzIG93biBleHRlbnNpb25zLCB3aGljaAotICAgICAgICAvLyBJJ2xsIGZpeCBvbiBhIGxhdGVyIGRhdGUuCi0gIC8qICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1fZXh0ZW5zaW9uTmFtZXNwYWNlcy5rZXlzKCk7Ci0gICAgICAgIHdoaWxlKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHV0dGluZyBleHQgbmFtZXNwYWNlOiAiK2tleSk7Ci0gICAgICAgICAgcHJvY2Vzc29yLmdldEV4ZWNDb250ZXh0KCkuYWRkRXh0ZW5zaW9uTmFtZXNwYWNlICgoU3RyaW5nKWtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFeHRlbnNpb25GdW5jdGlvbkhhbmRsZXIpbV9leHRlbnNpb25OYW1lc3BhY2VzLmdldChrZXkpKTsKLSAgICAgICAgfSovCi0KLSAgICAgICAgLy8gRmluZCB0aGUgcm9vdCBwYXR0ZXJuIGluIHRoZSBYU0wuCi0gICAgICAgIEVsZW1UZW1wbGF0ZSByb290UnVsZSA9IG1fc1Jvb3RPYmplY3QuZ2V0VGVtcGxhdGVDb21wb3NlZChwcm9jZXNzb3IuZ2V0VHJhbnNmb3JtZXIoKS5nZXRYUGF0aENvbnRleHQoKSwgc291cmNlVHJlZSwgbnVsbCwgLTEsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZmluZFRlbXBsYXRlKHByb2Nlc3Nvciwgc291cmNlVHJlZSwgc291cmNlVHJlZSk7Ci0KLSAgICAgICAgaWYobnVsbCA9PSByb290UnVsZSkKLSAgICAgICAgewotICAgICAgICAgIHJvb3RSdWxlID0gbV9zUm9vdE9iamVjdC5nZXREZWZhdWx0Um9vdFJ1bGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIERvY3VtZW50SGFuZGxlciBkb2NIYW5kbGVyID0gb3V0cHV0VGFyZ2V0LmdldERvY3VtZW50SGFuZGxlcigpOwotCi0gICAgICAgIE91dHB1dEZvcm1hdCBmb3JtYXR0ZXIgPSBnZXRPdXRwdXRGb3JtYXQoKTsKLQotICAgICAgICBpZihudWxsICE9IG91dHB1dFRhcmdldC5nZXRFbmNvZGluZygpKQotICAgICAgICAgIGZvcm1hdHRlci5zZXRFbmNvZGluZyhvdXRwdXRUYXJnZXQuZ2V0RW5jb2RpbmcoKSk7Ci0KLSAgICAgICAgaWYobnVsbCAhPSBkb2NIYW5kbGVyKQotICAgICAgICB7Ci0gICAgICAgICAgcHJvY2Vzc29yLnNldERvY3VtZW50SGFuZGxlcihkb2NIYW5kbGVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG51bGwgIT0gb3V0cHV0VGFyZ2V0LmdldEJ5dGVTdHJlYW0oKSkKLSAgICAgICAgewotICAgICAgICAgLyogaWYgKCEocHJvY2Vzc29yLmdldFhNTFByb2Nlc3NvckxpYWlzb24oKS4uZ2V0SW5kZW50KCkgPCAwKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIHRvIGdldCBhcm91bmQgZGlmZmVyZW5jZXMgYmV0d2VlbiBYYWxhbiBhbmQgWGVyY2VzLgotICAgICAgICAgICAgLy8gWGFsYW4gdXNlcyAtMSBhcyBkZWZhdWx0IGZvciBubyBpbmRlbnRpbmcsIFhlcmNlcyB1c2VzIDAuCi0gICAgICAgICAgICAvLyBTbyB3ZSBqdXN0IGJ1bXAgdXAgdGhlIGluZGVudCB2YWx1ZSBoZXJlIGJlY2F1c2Ugd2Ugd2lsbAotICAgICAgICAgICAgLy8gc3VidHJhY3QgZnJvbSBpdCBhdCBvdXRwdXQgdGltZSAoRm9ybWF0dGVyVG9YTUwuaW5pdCgpKTsKLSAgICAgICAgICAgIGZvcm1hdHRlci5zZXRJbmRlbnQocHJvY2Vzc29yLm1fcGFyc2VyTGlhaXNvbi5nZXRJbmRlbnQoKSArIDEpOwotICAgICAgICAgIH0qLwotICAgICAgICAgIHByb2Nlc3Nvci5zZXREb2N1bWVudEhhbmRsZXIobWFrZVNBWFNlcmlhbGl6ZXIob3V0cHV0VGFyZ2V0LmdldEJ5dGVTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobnVsbCAhPSBvdXRwdXRUYXJnZXQuZ2V0Q2hhcmFjdGVyU3RyZWFtKCkpCi0gICAgICAgIHsKLSAgICAgICAgLyogIGlmICghKHByb2Nlc3Nvci5tX3BhcnNlckxpYWlzb24uZ2V0SW5kZW50KCkgPCAwKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3JtYXR0ZXIuc2V0SW5kZW50KHByb2Nlc3Nvci5tX3BhcnNlckxpYWlzb24uZ2V0SW5kZW50KCkgKyAxKTsKLSAgICAgICAgICB9Ki8KLSAgICAgICAgICBwcm9jZXNzb3Iuc2V0RG9jdW1lbnRIYW5kbGVyKG1ha2VTQVhTZXJpYWxpemVyKG91dHB1dFRhcmdldC5nZXRDaGFyYWN0ZXJTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobnVsbCAhPSBvdXRwdXRUYXJnZXQuZ2V0RmlsZU5hbWUoKSkKLSAgICAgICAgewotICAgICAgICAgIC8qaWYgKCEocHJvY2Vzc29yLm1fcGFyc2VyTGlhaXNvbi5nZXRJbmRlbnQoKSA8IDApKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvcm1hdHRlci5zZXRJbmRlbnQocHJvY2Vzc29yLm1fcGFyc2VyTGlhaXNvbi5nZXRJbmRlbnQoKSArIDEpOwotICAgICAgICAgIH0qLwotICAgICAgICAgIG9zdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRUYXJnZXQuZ2V0RmlsZU5hbWUoKSk7Ci0gICAgICAgICAgcHJvY2Vzc29yLnNldERvY3VtZW50SGFuZGxlciggbWFrZVNBWFNlcmlhbGl6ZXIob3N0cmVhbSwgZm9ybWF0dGVyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihudWxsICE9IG91dHB1dFRhcmdldC5nZXROb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBQYXJzZXJBZGFwdGVyIGhhbmRsZXIgPSBuZXcgUGFyc2VyQWRhcHRlcihuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKSk7Ci0gICAgICAgICAgLy8gUGF0Y2ggZnJvbSBDb3N0aW4gTWFub2xhY2hlCi0vLyAgICAgICAgICBpZiggIm9yZy5hcGFjaGUueGFsYW4ueHBhdGguZHRtLkRUTUxpYWlzb24iLmVxdWFscyggcHJvY2Vzc29yLmdldFhNTFByb2Nlc3NvckxpYWlzb24oKS5nZXRDbGFzcygpLmdldE5hbWUoKSkpCi0vLyAgICAgICAgICAgIHByb2Nlc3Nvci5lcnJvcihYU0xURXJyb3JSZXNvdXJjZXMuRVJfQ0FOVF9VU0VfRFRNX0ZPUl9PVVRQVVQpOyAvL0Nhbid0IHVzZSBhIERUTUxpYWlzb24gZm9yIGFuIG91dHB1dCBET00gbm9kZS4uLiBwYXNzIGEgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54ZG9tLlhlcmNlc0xpYWlzb24gaW5zdGVhZCEiKTsKLSAgICAgICAgICAKLSAgICAgICAgICBzd2l0Y2gob3V0cHV0VGFyZ2V0LmdldE5vZGUoKS5nZXROb2RlVHlwZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERTogICAgICAgICAgICAKLSAgICAgICAgICAgIGhhbmRsZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IEZvcm1hdHRlclRvRE9NKChEb2N1bWVudClvdXRwdXRUYXJnZXQuZ2V0Tm9kZSgpKS5nZXRTZXJpYWxpemVyT2JqZWN0KCkpOwotICAgICAgICAgICAgcHJvY2Vzc29yLnNldERvY3VtZW50SGFuZGxlcihoYW5kbGVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgotICAgICAgICAgICAgaGFuZGxlci5zZXRDb250ZW50SGFuZGxlcihuZXcgRm9ybWF0dGVyVG9ET00ob3V0cHV0VGFyZ2V0LmdldE5vZGUoKS5nZXRPd25lckRvY3VtZW50KCksIC8vIFBSOkRNQU40TTZQSzUgU3VibWl0dGVkIGJ5Ojxia0B2aWFlLmRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEb2N1bWVudEZyYWdtZW50KW91dHB1dFRhcmdldC5nZXROb2RlKCkpLmdldFNlcmlhbGl6ZXJPYmplY3QoKSk7Ci0gICAgICAgICAgICBwcm9jZXNzb3Iuc2V0RG9jdW1lbnRIYW5kbGVyKGhhbmRsZXIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLSAgICAgICAgICAgIGhhbmRsZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IEZvcm1hdHRlclRvRE9NKG91dHB1dFRhcmdldC5nZXROb2RlKCkuZ2V0T3duZXJEb2N1bWVudCgpLCAvLyBQUjpETUFONE02UEs1IFN1Ym1pdHRlZCBieTo8YmtAdmlhZS5kZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRWxlbWVudClvdXRwdXRUYXJnZXQuZ2V0Tm9kZSgpKS5nZXRTZXJpYWxpemVyT2JqZWN0KCkpOwotICAgICAgICAgICAgcHJvY2Vzc29yLnNldERvY3VtZW50SGFuZGxlcihoYW5kbGVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtX3NSb290T2JqZWN0LmVycm9yKFhTTFRFcnJvclJlc291cmNlcy5FUl9DQU5fT05MWV9PVVRQVVRfVE9fRUxFTUVOVCk7IC8vIkNhbiBvbmx5IG91dHB1dCB0byBhbiBFbGVtZW50LCBEb2N1bWVudEZyYWdtZW50LCBEb2N1bWVudCwgb3IgUHJpbnRXcml0ZXIuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFBhcnNlckFkYXB0ZXIgaGFuZGxlciA9IG5ldyBQYXJzZXJBZGFwdGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICAgICAgICBvdXRwdXRUYXJnZXQuc2V0Tm9kZShwcm9jZXNzb3IuZ2V0WE1MUHJvY2Vzc29yTGlhaXNvbigpLmNyZWF0ZURvY3VtZW50KCkpOwotICAgICAgICAgIGhhbmRsZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IEZvcm1hdHRlclRvRE9NKChEb2N1bWVudClvdXRwdXRUYXJnZXQuZ2V0Tm9kZSgpKS5nZXRTZXJpYWxpemVyT2JqZWN0KCkpOwotICAgICAgICAgIHByb2Nlc3Nvci5zZXREb2N1bWVudEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgICAgIH0KLQotICAgICAgIC8vIHByb2Nlc3Nvci5yZXNldEN1cnJlbnRTdGF0ZShzb3VyY2VUcmVlKTsKLSAgICAgICAvLyBwcm9jZXNzb3IubV9yb290RG9jID0gc291cmNlVHJlZTsKLQotICAgICAgICBpZihudWxsICE9IHByb2Nlc3Nvci5tX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBwcm9jZXNzb3IuZGlhZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICBwcm9jZXNzb3IuZGlhZygiVHJhbnNmb3JtaW5nLi4uIik7Ci0gICAgICAgICAgcHJvY2Vzc29yLnB1c2hUaW1lKHNvdXJjZVRyZWUpOwotICAgICAgICB9Ci0KLSAgICAgICAvLyBwcm9jZXNzb3IuZ2V0VmFyU3RhY2soKS5wdXNoQ29udGV4dE1hcmtlcigpOwotICAgICAgLy8gIHRyeQotICAgICAgLy8gIHsKLSAgICAgIC8vICAgIHByb2Nlc3Nvci5yZXNvbHZlVG9wTGV2ZWxQYXJhbXMoKTsKLSAgICAgIC8vICB9Ci0gICAgICAvLyAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAvLyAgewotICAgICAgLy8gICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihYU0xNZXNzYWdlcy5jcmVhdGVNZXNzYWdlKFhTTFRFcnJvclJlc291cmNlcy5FUl9QUk9DRVNTX0VSUk9SLCBudWxsKSwgZSk7IC8vIlN0eWxlc2hlZXRSb290LnByb2Nlc3MgZXJyb3IiLCBlKTsKLSAgICAgIC8vICB9Ci0KLSAgICAgICAgcHJvY2Vzc29yLmdldFRyYW5zZm9ybWVyKCkuZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKS5zdGFydERvY3VtZW50KCk7Ci0KLSAgICAgICAgLy8gT3V0cHV0IHRoZSBhY3Rpb24gb2YgdGhlIGZvdW5kIHJvb3QgcnVsZS4gIEFsbCBwcm9jZXNzaW5nCi0gICAgICAgIC8vIG9jY3VycyBmcm9tIGhlcmUuICBidWlsZFJlc3VsdEZyb21UZW1wbGF0ZSBpcyBoaWdobHkgcmVjdXJzaXZlLgotICAgICAgICByb290UnVsZS5leGVjdXRlKHByb2Nlc3Nvci5nZXRUcmFuc2Zvcm1lcigpLCBzb3VyY2VUcmVlLCBudWxsKTsKLQotICAgICAgICAgcHJvY2Vzc29yLmdldFRyYW5zZm9ybWVyKCkuZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKS5lbmREb2N1bWVudCgpOwotCi0gICAgICAgIC8vIFJlc2V0IHRoZSB0b3AtbGV2ZWwgcGFyYW1zIGZvciB0aGUgbmV4dCByb3VuZC4KLSAgICAgICAgLy8gcHJvY2Vzc29yLm1fdG9wTGV2ZWxQYXJhbXMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAgICAgaWYobnVsbCAhPSBwcm9jZXNzb3IubV9kaWFnbm9zdGljc1ByaW50V3JpdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgcHJvY2Vzc29yLmRpc3BsYXlEdXJhdGlvbigidHJhbnNmb3JtIiwgc291cmNlVHJlZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKHRlKTsKLSAgICAgIH0gIAotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBpZiAobnVsbCAhPSBvc3RyZWFtKQotICAgICAgICB7Ci0gICAgICAgICAgb3N0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgY29tcGF0aWJsZSBTQVggc2VyaWFsaXplciBmb3IgdGhlIHNwZWNpZmllZCB3cml0ZXIKLSAgICogYW5kIG91dHB1dCBmb3JtYXQuIElmIHRoZSBvdXRwdXQgZm9ybWF0IGlzIG1pc3NpbmcsIHRoZSBkZWZhdWx0Ci0gICAqIGlzIGFuIFhNTCBmb3JtYXQgd2l0aCBVVEY4IGVuY29kaW5nLgotICAgKgotICAgKiBAcGFyYW0gd3JpdGVyIFRoZSB3cml0ZXIKLSAgICogQHBhcmFtIGZvcm1hdCBUaGUgb3V0cHV0IGZvcm1hdAotICAgKiBAcmV0dXJuIEEgY29tcGF0aWJsZSBTQVggc2VyaWFsaXplcgotICAgKi8KLSAgcHVibGljIERvY3VtZW50SGFuZGxlciBtYWtlU0FYU2VyaWFsaXplciggV3JpdGVyIHdyaXRlciwgT3V0cHV0Rm9ybWF0IGZvcm1hdCApCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gCi0gIHsKLSAgICBEb2N1bWVudEhhbmRsZXIgaGFuZGxlcjsKLSAgICBpZiAoIGZvcm1hdCA9PSBudWxsICkKLSAgICB7Ci0gICAgICBmb3JtYXQgPSBuZXcgT3V0cHV0Rm9ybWF0KCAieG1sIiwgIlVURi04IiwgZmFsc2UgKTsKLSAgICAgIGhhbmRsZXIgPSBudWxsOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIGhhbmRsZXIgPSBuZXcgUGFyc2VyQWRhcHRlcihuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKSk7Ci0gICAgICBPdXRwdXRQcm9wZXJ0aWVzIHByb3BzID0gbV9zUm9vdE9iamVjdC5nZXRPdXRwdXRDb21wb3NlZCgpOwotICAgICAgCi0gICAgICBpZiAoIGZvcm1hdC5nZXRNZXRob2QoKS5lcXVhbHNJZ25vcmVDYXNlKCAiaHRtbCIgKSApCi0gICAgICB7Ci0gICAgICAgIEZvcm1hdHRlclRvSFRNTCBzZXJpYWxpemVyID0gbmV3IEZvcm1hdHRlclRvSFRNTCh3cml0ZXIpOwotICAgICAgICBzZXJpYWxpemVyLmdldFNlcmlhbGl6ZXJPYmplY3QoKS5zZXRPdXRwdXRGb3JtYXQocHJvcHMuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgKChQYXJzZXJBZGFwdGVyKWhhbmRsZXIpLnNldENvbnRlbnRIYW5kbGVyKHNlcmlhbGl6ZXIuZ2V0U2VyaWFsaXplck9iamVjdCgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBmb3JtYXQuZ2V0TWV0aG9kKCkuZXF1YWxzSWdub3JlQ2FzZSggInhtbCIgKSApCi0gICAgICB7Ci0gICAgICAgIEZvcm1hdHRlclRvWE1MIHNlcmlhbGl6ZXIgPSBuZXcgRm9ybWF0dGVyVG9YTUwod3JpdGVyKTsKLSAgICAgICAgc2VyaWFsaXplci5nZXRTZXJpYWxpemVyT2JqZWN0KCkuc2V0T3V0cHV0Rm9ybWF0KHByb3BzLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgICgoUGFyc2VyQWRhcHRlciloYW5kbGVyKS5zZXRDb250ZW50SGFuZGxlcihzZXJpYWxpemVyLmdldFNlcmlhbGl6ZXJPYmplY3QoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggZm9ybWF0LmdldE1ldGhvZCgpLmVxdWFsc0lnbm9yZUNhc2UoICJ0ZXh0IiApICkKLSAgICAgIHsKLSAgICAgICAgRm9ybWF0dGVyVG9UZXh0IHNlcmlhbGl6ZXIgPSBuZXcgRm9ybWF0dGVyVG9UZXh0KHdyaXRlcik7IAotICAgICAgICAoKFBhcnNlckFkYXB0ZXIpaGFuZGxlcikuc2V0Q29udGVudEhhbmRsZXIoc2VyaWFsaXplci5nZXRTZXJpYWxpemVyT2JqZWN0KCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBoYW5kbGVyID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYobnVsbCA9PSBoYW5kbGVyKQotICAgIHsKLSAgICAgIFN0cmluZyBtZXRob2QgPSBmb3JtYXQuZ2V0TWV0aG9kKCk7Ci0gICAgICBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuU2VyaWFsaXplckZhY3RvcnkgZmFjdG9yeSA9IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5TZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyRmFjdG9yeShtZXRob2QpOwotICAgICAgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLlNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IGZhY3RvcnkubWFrZVNlcmlhbGl6ZXIod3JpdGVyLCBmb3JtYXQpOwotICAgICAgaGFuZGxlciA9IHNlcmlhbGl6ZXIuYXNEb2N1bWVudEhhbmRsZXIoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaGFuZGxlcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBjb21wYXRpYmxlIFNBWCBzZXJpYWxpemVyIGZvciB0aGUgc3BlY2lmaWVkIG91dHB1dCBzdHJlYW0KLSAgICogYW5kIG91dHB1dCBmb3JtYXQuIElmIHRoZSBvdXRwdXQgZm9ybWF0IGlzIG1pc3NpbmcsIHRoZSBkZWZhdWx0Ci0gICAqIGlzIGFuIFhNTCBmb3JtYXQgd2l0aCBVVEY4IGVuY29kaW5nLgotICAgKgotICAgKiBAcGFyYW0gb3N0cmVhbSBUaGUgb3V0cHV0IHN0cmVhbS4KLSAgICogQHBhcmFtIGZvcm1hdCBUaGUgb3V0cHV0IGZvcm1hdAotICAgKiBAcmV0dXJuIEEgY29tcGF0aWJsZSBTQVggc2VyaWFsaXplcgotICAgKi8KLSAgcHVibGljIERvY3VtZW50SGFuZGxlciBtYWtlU0FYU2VyaWFsaXplciggT3V0cHV0U3RyZWFtIG9zdHJlYW0sIE91dHB1dEZvcm1hdCBmb3JtYXQgKQotICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBEb2N1bWVudEhhbmRsZXIgaGFuZGxlcjsKLSAgICBPdXRwdXRQcm9wZXJ0aWVzIHByb3BzOwotICAgICAgICAKLSAgICBpZiAoIGZvcm1hdCA9PSBudWxsICkKLSAgICB7Ci0gICAgICBwcm9wcyA9IG5ldyBPdXRwdXRQcm9wZXJ0aWVzKCk7Ci0gICAgICBoYW5kbGVyID0gbnVsbDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgCi0gICAgICBoYW5kbGVyID0gbmV3IFBhcnNlckFkYXB0ZXIobmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCkpOwotICAgICAgcHJvcHMgPSBtX3NSb290T2JqZWN0LmdldE91dHB1dENvbXBvc2VkKCk7Ci0gICAgICBpZiAoIGZvcm1hdC5nZXRNZXRob2QoKS5lcXVhbHNJZ25vcmVDYXNlKCAiaHRtbCIgKSApCi0gICAgICB7Ci0gICAgICAgIEZvcm1hdHRlclRvSFRNTCBzZXJpYWxpemVyID0gbmV3IEZvcm1hdHRlclRvSFRNTChvc3RyZWFtKTsKLSAgICAgICAgc2VyaWFsaXplci5nZXRTZXJpYWxpemVyT2JqZWN0KCkuc2V0T3V0cHV0Rm9ybWF0KHByb3BzLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgICgoUGFyc2VyQWRhcHRlciloYW5kbGVyKS5zZXRDb250ZW50SGFuZGxlcihzZXJpYWxpemVyLmdldFNlcmlhbGl6ZXJPYmplY3QoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggZm9ybWF0LmdldE1ldGhvZCgpLmVxdWFsc0lnbm9yZUNhc2UoICJ4bWwiICkgKQotICAgICAgewotICAgICAgICBGb3JtYXR0ZXJUb1hNTCBzZXJpYWxpemVyID0gbmV3IEZvcm1hdHRlclRvWE1MKG9zdHJlYW0pOwotICAgICAgICBzZXJpYWxpemVyLmdldFNlcmlhbGl6ZXJPYmplY3QoKS5zZXRPdXRwdXRGb3JtYXQocHJvcHMuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgKChQYXJzZXJBZGFwdGVyKWhhbmRsZXIpLnNldENvbnRlbnRIYW5kbGVyKHNlcmlhbGl6ZXIuZ2V0U2VyaWFsaXplck9iamVjdCgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBmb3JtYXQuZ2V0TWV0aG9kKCkuZXF1YWxzSWdub3JlQ2FzZSggInRleHQiICkgKQotICAgICAgewotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBmb3JtYXQuZ2V0RW5jb2RpbmcoKTsKLSAgICAgICAgaWYobnVsbCA9PSBlbmNvZGluZykKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IChudWxsICE9IGVuY29kaW5nKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLkVuY29kaW5ncy5jb252ZXJ0SmF2YTJNaW1lRW5jb2RpbmcoIGVuY29kaW5nICkgOiAiQVNDSUkiOwotICAgICAgICAgICAgaWYobnVsbCA9PSBlbmNvZGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZW5jb2RpbmcgPSAiQVNDSUkiOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBzZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9ICJBU0NJSSI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy90aGlzLm1fZW5jb2RpbmcgPSAgIGVuY29kaW5nOwotCi0gICAgICAgIFN0cmluZyBqYXZhRW5jb2RpbmcgPSBvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZS5FbmNvZGluZ3MuY29udmVydE1pbWUySmF2YUVuY29kaW5nKGVuY29kaW5nKTsKLQotICAgICAgICBXcml0ZXIgdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG9zdHJlYW0sIGphdmFFbmNvZGluZyApOwotICAgICAgICAoKFBhcnNlckFkYXB0ZXIpaGFuZGxlcikuc2V0Q29udGVudEhhbmRsZXIobmV3IEZvcm1hdHRlclRvVGV4dCh3KS5nZXRTZXJpYWxpemVyT2JqZWN0KCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGZvcm1hdC5nZXRNZXRob2QoKS5lcXVhbHNJZ25vcmVDYXNlKCAieGh0bWwiICkgKQotICAgICAgewotICAgICAgICBoYW5kbGVyID0gbmV3IFhNTFNlcmlhbGl6ZXIob3N0cmVhbSwgZm9ybWF0KTsKLSAgICAgICAgLy9oYW5kbGVyID0gU2VyaWFsaXplci5tYWtlU0FYU2VyaWFsaXplcihvc3RyZWFtLCBmb3JtYXQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBoYW5kbGVyID0gbmV3IFhNTFNlcmlhbGl6ZXIob3N0cmVhbSwgZm9ybWF0KTsKLSAgICAgICAgLy9oYW5kbGVyID0gU2VyaWFsaXplci5tYWtlU0FYU2VyaWFsaXplcihvc3RyZWFtLCBmb3JtYXQpOwotICAgICAgfQotICAgIH0KLSAgICBpZihudWxsID09IGhhbmRsZXIpCi0gICAgewotICAgICAgU3RyaW5nIG1ldGhvZCA9IHByb3BzLmdldFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9EKTsKLSAgICAgIG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5TZXJpYWxpemVyRmFjdG9yeSBmYWN0b3J5ID0gb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLlNlcmlhbGl6ZXJGYWN0b3J5LmdldFNlcmlhbGl6ZXJGYWN0b3J5KG1ldGhvZCk7Ci0gICAgICBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuU2VyaWFsaXplciBzZXJpYWxpemVyID0gZmFjdG9yeS5tYWtlU2VyaWFsaXplcihvc3RyZWFtLCBmb3JtYXQpOwotICAgICAgaGFuZGxlciA9IHNlcmlhbGl6ZXIuYXNEb2N1bWVudEhhbmRsZXIoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaGFuZGxlcjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgY29tcGF0aWJsZSBTQVggc2VyaWFsaXplciBmb3IgdGhlIHNwZWNpZmllZCBvdXRwdXQgc3RyZWFtCi0gICAqIGFuZCBvdXRwdXQgZm9ybWF0LiBJZiB0aGUgb3V0cHV0IGZvcm1hdCBpcyBtaXNzaW5nLCB0aGUgZGVmYXVsdAotICAgKiBpcyBhbiBYTUwgZm9ybWF0IHdpdGggVVRGOCBlbmNvZGluZy4KLSAgICoKLSAgICogQHBhcmFtIG9zdHJlYW0gVGhlIG91dHB1dCBzdHJlYW0uCi0gICAqIEByZXR1cm4gQSBjb21wYXRpYmxlIFNBWCBzZXJpYWxpemVyCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnRIYW5kbGVyIGdldFNBWFNlcmlhbGl6ZXIoIE91dHB1dFN0cmVhbSBvc3RyZWFtICkKLSAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbgotICB7Ci0gICByZXR1cm4gbWFrZVNBWFNlcmlhbGl6ZXIob3N0cmVhbSwgZ2V0T3V0cHV0Rm9ybWF0KCkpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IGEgbmV3IE91dHB1dEZvcm1hdCBvYmplY3QgYWNjb3JkaW5nIHRvIHRoZSB4c2w6b3V0cHV0IGF0dHJpYnV0ZXMuCi0gICAqLwotICBwdWJsaWMgT3V0cHV0Rm9ybWF0IGdldE91dHB1dEZvcm1hdCgpCi0gIHsKLSAgICBPdXRwdXRQcm9wZXJ0aWVzIG91dHB1dEZvcm1hdCA9IG1fc1Jvb3RPYmplY3QuZ2V0T3V0cHV0Q29tcG9zZWQoKTsKLSAgICBpZiAob3V0cHV0Rm9ybWF0ID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBPdXRwdXRGb3JtYXQgZm9ybWF0dGVyID0gbmV3IE91dHB1dEZvcm1hdChvdXRwdXRGb3JtYXQuZ2V0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdC5nZXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRQcm9wZXJ0aWVzLmdldEJvb2xlYW5Qcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgb3V0cHV0Rm9ybWF0LmdldFByb3BlcnRpZXMoKSkpOwotICAgIGZvcm1hdHRlci5zZXREb2N0eXBlKG91dHB1dEZvcm1hdC5nZXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfUFVCTElDKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LmdldFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9TWVNURU0pKTsKLSAgICBmb3JtYXR0ZXIuc2V0T21pdFhNTERlY2xhcmF0aW9uKE91dHB1dFByb3BlcnRpZXMuZ2V0Qm9vbGVhblByb3BlcnR5KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sIG91dHB1dEZvcm1hdC5nZXRQcm9wZXJ0aWVzKCkpKTsKLSAgICBmb3JtYXR0ZXIuc2V0U3RhbmRhbG9uZShPdXRwdXRQcm9wZXJ0aWVzLmdldEJvb2xlYW5Qcm9wZXJ0eShPdXRwdXRLZXlzLlNUQU5EQUxPTkUsIG91dHB1dEZvcm1hdC5nZXRQcm9wZXJ0aWVzKCkpKTsKLSAgICBmb3JtYXR0ZXIuc2V0TWVkaWFUeXBlKG91dHB1dEZvcm1hdC5nZXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FRElBX1RZUEUpKTsKLSAgICBmb3JtYXR0ZXIuc2V0VmVyc2lvbihvdXRwdXRGb3JtYXQuZ2V0UHJvcGVydHkoT3V0cHV0S2V5cy5WRVJTSU9OKSk7Ci0gICAgLy8gVGhpcyBpcyB0byBnZXQgYXJvdW5kIGRpZmZlcmVuY2VzIGJldHdlZW4gWGFsYW4gYW5kIFhlcmNlcy4KLSAgICAvLyBYYWxhbiB1c2VzIC0xIGFzIGRlZmF1bHQgZm9yIG5vIGluZGVudGluZywgWGVyY2VzIHVzZXMgMC4KLSAgICAvLyBTbyB3ZSBqdXN0IGJ1bXAgdXAgdGhlIGluZGVudCB2YWx1ZSBoZXJlIGJlY2F1c2Ugd2Ugd2lsbAotICAgIC8vIHN1YnRyYWN0IGZyb20gaXQgYXQgb3V0cHV0IHRpbWUgKEZvcm1hdHRlclRvWE1MLmluaXQoKSk7Ci0gICAvLyBpZiAoZ2V0T3V0cHV0SW5kZW50KCkpCi0gICAvLyAgIGZvcm1hdHRlci5zZXRJbmRlbnQoZm9ybWF0dGVyLmdldEluZGVudCgpKzEpOwotCi0gICAgCi0gICAgcmV0dXJuIGZvcm1hdHRlcjsKLSAgfQotICAKLSAgLyoqIAotICAgKiBHZXQgdGhlIGVuY29kaW5nIHN0cmluZyB0aGF0IHdhcyBzcGVjaWZpZWQgaW4gdGhlIHN0eWxlc2hlZXQuIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRPdXRwdXRFbmNvZGluZygpCi0gIHsKLSAgICByZXR1cm4gbV9zUm9vdE9iamVjdC5nZXRPdXRwdXRDb21wb3NlZCgpLmdldFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcpOwotICB9Ci0KLSAgLyoqIAotICAgKiBHZXQgdGhlIG1lZGlhLXR5cGUgc3RyaW5nIHRoYXQgd2FzIHNwZWNpZmllZCBpbiB0aGUgc3R5bGVzaGVldC4gCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dE1lZGlhVHlwZSgpIAotICB7IAotICAgIHJldHVybiBtX3NSb290T2JqZWN0LmdldE91dHB1dENvbXBvc2VkKCkuZ2V0UHJvcGVydHkoT3V0cHV0S2V5cy5NRURJQV9UWVBFKTsgCi0gIH0KLSAgCi0gIC8qKiAKLSAgICogR2V0IHRoZSBvdXRwdXQgbWV0aG9kIHRoYXQgd2FzIHNwZWNpZmllZCBpbiB0aGUgc3R5bGVzaGVldC4gCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dE1ldGhvZCgpIAotICB7IAotICAgIHJldHVybiBtX3NSb290T2JqZWN0LmdldE91dHB1dENvbXBvc2VkKCkuZ2V0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QpOyAKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgYmFzZSBpZGVudGlmaWVyIHdpdGggd2hpY2ggdGhpcyBzdHlsZXNoZWV0IGlzIGFzc29jaWF0ZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEJhc2VJZGVudGlmaWVyKCkKLSAgewotICAgIHJldHVybiBtX3NSb290T2JqZWN0LmdldEJhc2VJZGVudGlmaWVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBiYXNlIGlkZW50aWZpZXIgd2l0aCB3aGljaCB0aGlzIHN0eWxlc2hlZXQgaXMgYXNzb2NpYXRlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEJhc2VJZGVudGlmaWVyKFN0cmluZyBiYXNlSWRlbnQpCi0gIHsKLSAgICBtX3NSb290T2JqZWN0LnNldEhyZWYoYmFzZUlkZW50KTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXRTcGVjLmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9TdHlsZXNoZWV0U3BlYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTVkODM3Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXRTcGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHNsdDsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhIHN0eWxlc2hlZXQgCi0gKiBzcGVjaWZpY2F0aW9uIHZpYSB4bWwtc3R5bGVzaGVldCBpbiBhbiBYTUwgZG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZXNoZWV0U3BlYyBleHRlbmRzIFN0cmVhbVNvdXJjZQotewotICBTdHJpbmcgdHlwZTsgLy8gQ0RBVEEgI1JFUVVJUkVECi0gIFN0cmluZyB0aXRsZTsgLy8gQ0RBVEEgI0lNUExJRUQKLSAgU3RyaW5nIG1lZGlhOyAvLyBDREFUQSAjSU1QTElFRAotICBTdHJpbmcgZW5jb2Rpbmc7IC8vIENEQVRBICNJTVBMSUVECi0gIGJvb2xlYW4gYWx0ZXJuYXRlOyAvLyAoeWVzfG5vKSAibm8iCi0gIAotICAvKioKLSAgICogQ3JlYXRlIGEgU3R5bGVzaGVldFNwZWMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXRTcGVjKFN0cmluZyBocmVmLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHRpdGxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZWRpYSwgYm9vbGVhbiBhbHRlcm5hdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcpCi0gIHsKLSAgICB0aGlzLnNldFN5c3RlbUlkKGhyZWYpOwotICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICB0aGlzLm1lZGlhID0gbWVkaWE7Ci0gICAgdGhpcy5hbHRlcm5hdGUgPSBhbHRlcm5hdGU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGVuY29kaW5nIG9mIHRoZSBzdHlsZXNoZWV0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyAgICAgICBnZXRFbmNvZGluZygpCi0gIHsKLSAgICByZXR1cm4gZW5jb2Rpbmc7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB0eXBlIG9mIHRoZSBzdHlsZXNoZWV0LCBpLmUuICJ0ZXh0L3hzbCIuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nICAgICAgIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHRpdGxlIG9mIHRoZSBlbGVtZW50IChpbiBvdGhlciB3b3JkcywgdGhlIAotICAgKiBpdGVtIHRvIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBhZ2VudCkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nICAgICAgIGdldFRpdGxlKCkKLSAgewotICAgIHJldHVybiB0aXRsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbWVkaWEgYXR0cmlidXRlIG9mIHRoZSBzdHlsZXNoZWV0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyAgICAgICBnZXRNZWRpYSgpCi0gIHsKLSAgICByZXR1cm4gbWVkaWE7Ci0gIH0KLSAgLyoqCi0gICAqIEdldCB3aGV0aGVyIG9yIG5vdCB0aGUgc3R5bGVzaGVldCBpcyBzcGVjaWZpZWQgYXMgCi0gICAqIGFuIGFsdGVybmF0ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuICAgIGdldElzQWx0ZXJuYXRlKCkKLSAgewotICAgIHJldHVybiBhbHRlcm5hdGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFByb2Nlc3NvckNvbnRleHQuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFByb2Nlc3NvckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhMjI5NC4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9YU0xQcm9jZXNzb3JDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSAgCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGw7Ci0KLS8vIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuKjsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogQ2FwdHVyZXMgcHJvY2Vzc29yIGNvbnRleHQgdG8gYmUKLSAqIHBhc3NlZCB0byBhbiBleHRlbnNpb24gZWxlbWVudC4KLSAqCi0gKiBAYXV0aG9yIFNhbmppdmEgV2VlcmF3YXJhbmEgKHNhbmppdmFAd2F0c29uLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xQcm9jZXNzb3JDb250ZXh0IGV4dGVuZHMgb3JnLmFwYWNoZS54YWxhbi5leHRlbnNpb25zLlhTTFByb2Nlc3NvckNvbnRleHQKLXsgCi0gIHB1YmxpYyBYU0xQcm9jZXNzb3JDb250ZXh0IChYU0xURW5naW5lSW1wbCBwcm9jZXNzb3IsCi0JCQkgICAgICBTdHlsZXNoZWV0IHN0eWxlc2hlZXRUcmVlLAotCQkJICAgICAgTm9kZSBzb3VyY2VUcmVlLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpIAotICAgIAotICB7Ci0gICAgc3VwZXIoKFRyYW5zZm9ybWVySW1wbCkocHJvY2Vzc29yLmdldFRyYW5zZm9ybWVyKCkpLAotICAgICAgICAgIHN0eWxlc2hlZXRUcmVlLCAKLSAgICAgICAgICBzb3VyY2VUcmVlLCBzb3VyY2VOb2RlLCBtb2RlKTsKLSAgfQotCi0gIAotfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvWFNMUHJvY2Vzc29yRXhjZXB0aW9uLmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9YU0xQcm9jZXNzb3JFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyYjM1Mi4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9YU0xQcm9jZXNzb3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQ7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5yZXMuWFNMVEVycm9yUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ucmVzLlhTTE1lc3NhZ2VzOwotCi0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KLSAqIFRoZSBleGNlcHRpb24gdXNlZCBmb3IgbW9zdCBYU0xUIGVycm9ycy4KLSAqLwotcHVibGljIGNsYXNzIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiBleHRlbmRzIFNBWEV4Y2VwdGlvbgotewotICBwcml2YXRlIEV4Y2VwdGlvbiBtX2V4Y2VwdGlvbjsKLSAgCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIG9iamVjdCB0aGF0IGhvbGRzIAotICAgKiBhbiBlcnJvciBtZXNzYWdlLgotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBYU0xQcm9jZXNzb3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIAotICB7Ci0gICAgIHN1cGVyKChudWxsID09IG1lc3NhZ2UpID8gWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZShYU0xURXJyb3JSZXNvdXJjZXMuRVJfWFNMVF9FUlJPUiwgbnVsbCkgOiBtZXNzYWdlKTsKLSAgICAgbV9leGNlcHRpb24gPSBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGFuIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiBvYmplY3QgdGhhdCBob2xkcyAKLSAgICogYW4gZXJyb3IgbWVzc2FnZSwgYW5kIGFub3RoZXIgZXhjZXB0aW9uIAotICAgKiB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbi4KLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBlIFRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgWFNMUHJvY2Vzc29yRXhjZXB0aW9uIChTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUpCi0gIHsKLSAgICBzdXBlcigobnVsbCA9PSBtZXNzYWdlKSA/IFhTTE1lc3NhZ2VzLmNyZWF0ZU1lc3NhZ2UoWFNMVEVycm9yUmVzb3VyY2VzLkVSX1hTTFRfRVJST1IsIG51bGwpIDogbWVzc2FnZSk7Ci0gICAgdGhpcy5tX2V4Y2VwdGlvbiA9IGU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIG9iamVjdCB0aGF0IGhvbGRzIAotICAgKiBhbm90aGVyIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbi4KLSAgICogQHBhcmFtIGUgVGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBYU0xQcm9jZXNzb3JFeGNlcHRpb24gKEV4Y2VwdGlvbiBlKQotICB7Ci0gICAgc3VwZXIoKG51bGwgPT0gZS5nZXRNZXNzYWdlKCkpID8gWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZShYU0xURXJyb3JSZXNvdXJjZXMuRVJfWFNMVF9FUlJPUiwgbnVsbCkgOiBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgdGhpcy5tX2V4Y2VwdGlvbiA9IGU7Ci0gIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFRFbmdpbmVJbXBsLmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9YU0xURW5naW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjAwNTExLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFRFbmdpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDI2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHNsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLmNvbXBpbGVyLlhQYXRoUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguY29tcGlsZXIuQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC5YT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGguWFN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLlhOb2RlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGguWEJvb2xlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC5YTnVtYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGguWE51bGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5QYXJzZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5YTUxTZXJpYWxpemVyOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVGVtcGxhdGVzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlTG9jYXRvcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5FcnJvckxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXQ7Ci0vL2ltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0Um9vdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5YTUxQYXJzZXJMaWFpc29uOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLlByb2JsZW1MaXN0ZW5lckRlZmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuUHJvYmxlbUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXRDb21wb3NlZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlRyYW5zZm9ybWVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5TdHlsZXNoZWV0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsOwotLy9pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuUHJvY2Vzc29yU3R5bGVzaGVldDsKLS8vaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHNsdC5TdHlsZXNoZWV0U3BlYzsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5yZXMuWFNMVEVycm9yUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ucmVzLlhTTE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlByZWZpeFJlc29sdmVyRGVmYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5UcmVlV2Fsa2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLkRlZmF1bHRFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zdHJlZS5Tb3VyY2VUcmVlSGFuZGxlcjsKLQotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJhZHZhbmNlZCIvPgotICogVGhlIFhhbGFuIHdvcmtob3JzZSAtLSBDb2xsYWJvcmF0ZXMgd2l0aCB0aGUgWE1MIHBhcnNlciBsaWFpc29uLCB0aGUgRE9NLAotICogYW5kIHRoZSBYUGF0aCBlbmdpbmUsIHRvIHRyYW5zZm9ybSBhIHNvdXJjZSB0cmVlIG9mIG5vZGVzIGludG8gYSByZXN1bHQgdHJlZQotICogYWNjb3JkaW5nIHRvIGluc3RydWN0aW9ucyBhbmQgdGVtcGxhdGVzIHNwZWNpZmllZCBieSBhIHN0eWxlc2hlZXQgdHJlZS4KLSAqIFdlIHN1Z2dlc3QgeW91IHVzZSBvbmUgb2YgdGhlCi0gKiBzdGF0aWMgWFNMVFByb2Nlc3NvckZhY3RvcnkgZ2V0UHJvY2Vzc29yKCkgbWV0aG9kcyB0byBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yCi0gKiBhbmQgcmV0dXJuIGFuIGludGVyZmFjZSB0aGF0IGdyZWF0bHkgc2ltcGxpZmllcyB0aGUgcHJvY2VzcyBvZiBtYW5pcHVsYXRpbmcKLSAqIFhTTFRFbmdpbmVJbXBsLgotICoKLSAqIDxwPlRoZSBtZXRob2RzIDxjb2RlPnByb2Nlc3MoLi4uKTwvY29kZT4gYXJlIHRoZSBwcmltYXJ5IHB1YmxpYyBlbnRyeSBwb2ludHMuCi0gKiBUaGUgYmVzdCB3YXkgdG8gcGVyZm9ybSB0cmFuc2Zvcm1hdGlvbnMgaXMgdG8gdXNlIHRoZQotICoge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUHJvY2Vzc29yI3Byb2Nlc3Mob3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZSwgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZSwgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRSZXN1bHRUYXJnZXQpfSBtZXRob2QsCi0gKiBidXQgeW91IG1heSB1c2UgYW55IG9mIHByb2Nlc3MgbWV0aG9kcyBkZWZpbmVkIGluIFhTTFRFbmdpbmVJbXBsLjwvcD4KLSAqIAotICogPHA+UGxlYXNlIG5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIG5vdCBzYWZlIHBlciBpbnN0YW5jZSBvdmVyIG11bHRpcGxlIAotICogdGhyZWFkcy4gIElmIHlvdSBhcmUgaW4gYSBtdWx0aXRocmVhZGVkIGVudmlyb25tZW50LCB5b3Ugc2hvdWxkIAotICoga2VlcCBhIHBvb2wgb2YgdGhlc2Ugb2JqZWN0cywgb3IgY3JlYXRlIGEgbmV3IG9uZSBlYWNoIHRpbWUuICBJbiBhIAotICogbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudCwgdGhlIHJpZ2h0IHdheSB0byBkbyB0aGluZ3MgaXMgdG8gY3JlYXRlIGEgCi0gKiBTdHlsZXNoZWV0Um9vdCB2aWEgcHJvY2Vzc1N0eWxlc2hlZXQsIGFuZCB0aGVuIHJldXNlIHRoaXMgb2JqZWN0IAotICogb3ZlciBtdWx0aXBsZSB0aHJlYWRzLjwvcD4KLSAqCi0gKiA8cD5JZiB5b3UgcmV1c2UgdGhlIHByb2Nlc3NvciBpbnN0YW5jZSwgeW91IHNob3VsZCBjYWxsIHJlc2V0KCkgYmV0d2VlbiB0cmFuc2Zvcm1hdGlvbnMuPC9wPgotICogQHNlZSBYU0xUUHJvY2Vzc29yRmFjdG9yeQotICogQHNlZSBYU0xUUHJvY2Vzc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xURW5naW5lSW1wbCBpbXBsZW1lbnRzICBYU0xUUHJvY2Vzc29yCi17Ci0gIC8vcHJpdmF0ZSBQcm9jZXNzb3IgbV9wcm9jZXNzb3I7Ci0gIHByaXZhdGUgVHJhbnNmb3JtZXJGYWN0b3J5IG1fdGZhY3Rvcnk7Ci0gIHByaXZhdGUgVHJhbnNmb3JtZXJJbXBsIG1fdHJhbnNmb3JtZXJJbXBsOwotICBwcml2YXRlIERPTTJIZWxwZXIgbV9saWFpc29uOwotICBwcml2YXRlIFN0cmluZyBtX291dHB1dEZpbGVOYW1lOwotICBwcml2YXRlIERvY3VtZW50SGFuZGxlciBtX2RvY3VtZW50SGFuZGxlciA9IG51bGw7Ci0gIHByaXZhdGUgUHJvYmxlbUxpc3RlbmVyRGVmYXVsdCBtX3Byb2JsZW1MaXN0ZW5lcjsKLSAgcHJpdmF0ZSBIYXNodGFibGUgbV9zdHlsZXNoZWV0UGFyYW1zOwotICBTdHlsZXNoZWV0Um9vdCBtX3N0eWxlc2hlZXRSb290ID0gbnVsbDsKLSAgCi0gIFZlY3RvciBtX2V2YWxMaXN0ID0gbnVsbDsKLSAgYm9vbGVhbiBtX25lZWRUb0V2YWwgPSBmYWxzZTsKLSAgCi0gIC8qCi0gICogSWYgdGhpcyBpcyB0cnVlLCB0aGVuIHRoZSBkaWFnIGZ1bmN0aW9uIHdpbGwKLSAgKiBiZSBjYWxsZWQuCi0gICovCi0gIHByaXZhdGUgYm9vbGVhbiBtX3RyYWNlVGVtcGxhdGVDaGlsZHJlbiA9IGZhbHNlOwotCi0gIC8qCi0gICogSWYgdGhpcyBpcyB0cnVlLCB0aGVuIHRoZSBzaW1wbGUgdHJhY2luZyBvZiB0ZW1wbGF0ZXMKLSAgKiB3aWxsIGJlIHBlcmZvcm1lZC4KLSAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIG1fdHJhY2VUZW1wbGF0ZXMgPSBmYWxzZTsKLSAgCi0gIC8qCi0gICogSWYgdGhpcyBpcyB0cnVlLCB0aGVuIGRpYWdub3N0aWNzIG9mIGVhY2ggc2VsZWN0Ci0gICogd2lsbCBiZSBwZXJmb3JtZWQuCi0gICovCi0gIGJvb2xlYW4gbV90cmFjZVNlbGVjdHMgPSBmYWxzZTsKLQotICAvKgotICAqIEEgc3RyZWFtIHRvIHByaW50IGRpYWdub3N0aWNzIHRvLgotICAqLwotICBqYXZhLmlvLlByaW50V3JpdGVyIG1fZGlhZ25vc3RpY3NQcmludFdyaXRlciA9IG51bGw7Ci0KLSAgLyogRm9yIGRpYWdub3N0aWNzICovCi0gIEhhc2h0YWJsZSBtX2R1cmF0aW9uc1RhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAKLSAgLyoqCi0gICAqIEEgWFNMTWVzc2FnZXMgaW5zdGFuY2UgY2FwYWJsZSBvZiBwcm9kdWNpbmcgdXNlciBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIFhTTE1lc3NhZ2VzIG1fWFNMTWVzc2FnZXMgPSBuZXcgWFNMTWVzc2FnZXMoKTsKLSAgCi0gICAgCi0gLyoqCi0gICAqIENvbnN0cnVjdCBhbiBYU0xUIHByb2Nlc3NvciB0aGF0IHVzZXMgdGhlIGRlZmF1bHQgRFRNIChEb2N1bWVudCBUYWJsZSBNb2RlbCkgbGlhaXNvbgotICAgKiBhbmQgWE1MIHBhcnNlci4gQXMgYSBnZW5lcmFsIHJ1bGUsIHlvdSBzaG91bGQgdXNlIFhTTFRQcm9jZXNzb3JGYWN0b3J5IHRvIGNyZWF0ZSBhbgotICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGFjY2VzcyB0byB0aGUgaW5zdGFuY2UgdmlhIHRoZSBYU0xUUHJvY2Vzc29yIGludGVyZmFjZS4KLSAgICoKLSAgICogQHNlZSBYU0xUUHJvY2Vzc29yRmFjdG9yeQotICAgKiBAc2VlIFhTTFRQcm9jZXNzb3IKLSAgICovCi0gIHByb3RlY3RlZCBYU0xURW5naW5lSW1wbCgpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgotICB7ICAgIAotICAgIG1fdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBtX3Byb2JsZW1MaXN0ZW5lciA9IG5ldyBQcm9ibGVtTGlzdGVuZXJEZWZhdWx0KCk7Ci0gICAgLy9tX2xpYWlzb24gPSAgKERPTTJIZWxwZXIpY3JlYXRlTGlhaXNvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhbiBYU0xUIHByb2Nlc3NvciB0aGF0IHVzZXMgdGhlIHRoZSBnaXZlbiBwYXJzZXIgbGlhaXNvbi4KLSAgICogQXMgYSBnZW5lcmFsIHJ1bGUsIHlvdSBzaG91bGQgdXNlIFhTTFRQcm9jZXNzb3JGYWN0b3J5IHRvIGNyZWF0ZSBhbgotICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGFjY2VzcyB0byB0aGUgaW5zdGFuY2UgdmlhIHRoZSBYU0xUUHJvY2Vzc29yIGludGVyZmFjZS4KLSAgICoKLSAgICogQHNlZSBYU0xUUHJvY2Vzc29yRmFjdG9yeQotICAgKiBAc2VlIFhTTFRQcm9jZXNzb3IKLSAgICovCi0gIHB1YmxpYyBYU0xURW5naW5lSW1wbChTdHJpbmcgbGlhaXNvbkNsYXNzTmFtZSkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIAotICB7ICAgCi0gICAgbV90ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIG1fcHJvYmxlbUxpc3RlbmVyID0gbmV3IFByb2JsZW1MaXN0ZW5lckRlZmF1bHQoKTsKLSAgICAKLSAgICB0cnkgCi0gICAgICB7Ci0gICAgICAgIG1fbGlhaXNvbiA9ICAoRE9NMkhlbHBlcikoQ2xhc3MuZm9yTmFtZShsaWFpc29uQ2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpKTsKLSAgICAgICAgLy9vcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dCB4Y3R4dCA9IHRoaXMuZ2V0VHJhbnNmb3JtZXIoKS5nZXRYUGF0aENvbnRleHQoKTsKLQotICAgICAgICAvL3hjdHh0LnNldERPTUhlbHBlcihtX2xpYWlzb24pOyAgICAgICAgCi0gICAgICB9IAotICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZTEpIAotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJYTUwgTGlhaXNvbiBjbGFzcyAiICsgbGlhaXNvbkNsYXNzTmFtZSArCi0gICAgICAgICAgIiBzcGVjaWZpZWQgYnV0IG5vdCBmb3VuZCIsIGUxKTsKLSAgICAgIH0gCi0gICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlMikgCi0gICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiWE1MIExpYWlzb24gY2xhc3MgIiArIGxpYWlzb25DbGFzc05hbWUgKwotICAgICAgICAgICAgIiBmb3VuZCBidXQgY2Fubm90IGJlIGxvYWRlZCIsIGUyKTsKLSAgICAgIH0gCi0gICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlMykgCi0gICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiWE1MIExpYWlzb24gY2xhc3MgIiArIGxpYWlzb25DbGFzc05hbWUgKwotICAgICAgICAgICAgIiBsb2FkZWQgYnV0IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgKG5vIGVtcHR5IHB1YmxpYyBjb25zdHJ1Y3Rvcj8pIiwKLSAgICAgICAgICAgIGUzKTsKLSAgICAgIH0gCi0gICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGU0KSAKLSAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJYTUwgTGlhaXNvbiBjbGFzcyAiICsgbGlhaXNvbkNsYXNzTmFtZSArCi0gICAgICAgICAgICAiIGRvZXMgbm90IGltcGxlbWVudCBET00ySGVscGVyIiwgZTQpOwotICAgICAgfQotICAgCi0gIH0KLSAgICAKLSAgICAKLQotICAvKioKLSAgICogQ29uc3RydWN0IGFuIFhTTCBwcm9jZXNzb3IgdGhhdCB1c2VzIHRoZSB0aGUgZ2l2ZW4gcGFyc2VyIGxpYWlzb24uCi0gICAqIEFzIGEgZ2VuZXJhbCBydWxlLCB5b3Ugc2hvdWxkIHVzZSBYU0xUUHJvY2Vzc29yRmFjdG9yeSB0byBjcmVhdGUgYW4KLSAgICogaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbmQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGluc3RhbmNlIHZpYSB0aGUgWFNMVFByb2Nlc3NvciBpbnRlcmZhY2UuCi0gICAqCi0gICAqIEBwYXJhbSBYTUxQYXJzZXJMaWFpc29uIEEgbGlhaXNvbiB0byBhbiBYTUwgcGFyc2VyLgotICAgKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLlhNTFBhcnNlckxpYWlzb24KLSAgICogQHNlZSBYU0xUUHJvY2Vzc29yRmFjdG9yeQotICAgKiBAc2VlIFhTTFRQcm9jZXNzb3IKLSAgICovCi0gIHB1YmxpYyBYU0xURW5naW5lSW1wbChYTUxQYXJzZXJMaWFpc29uIHBhcnNlckxpYWlzb24pCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgotICB7Ci0gICAgbV90ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIG1fcHJvYmxlbUxpc3RlbmVyID0gbmV3IFByb2JsZW1MaXN0ZW5lckRlZmF1bHQoKTsKLSAgICAKLSAgICBtX2xpYWlzb24gPSAgKERPTTJIZWxwZXIpcGFyc2VyTGlhaXNvbjsKLSAgIC8vIG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0IHhjdHh0ID0gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLmdldFhQYXRoQ29udGV4dCgpOwotCi0gICAgLy94Y3R4dC5zZXRET01IZWxwZXIobV9saWFpc29uKTsgICAgCi0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0IGFuIFhTTFQgcHJvY2Vzc29yIHRoYXQgY2FuIGNhbGwgYmFjayB0byB0aGUgWE1MIHBhcnNlciwgaW4gb3JkZXIgdG8gaGFuZGxlCi0gICAqIGluY2x1ZGVkIGZpbGVzIGFuZCB0aGUgbGlrZS4KLSAgICoKLSAgICogQHBhcmFtIFhNTFBhcnNlckxpYWlzb24gQSBsaWFpc29uIHRvIGFuIFhNTCBwYXJzZXIuCi0gICAqCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuWE1MUGFyc2VyTGlhaXNvbgotICAgKiBAc2VlIFhTTFRQcm9jZXNzb3JGYWN0b3J5Ci0gICAqIEBzZWUgWFNMVFByb2Nlc3NvcgotICAgKi8KLSAgWFNMVEVuZ2luZUltcGwoWE1MUGFyc2VyTGlhaXNvbiBwYXJzZXJMaWFpc29uLCBYUGF0aEZhY3RvcnkgeHBhdGhGYWN0b3J5KSAgICAKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsgICAKLSAgICBtX3RmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgbV9wcm9ibGVtTGlzdGVuZXIgPSBuZXcgUHJvYmxlbUxpc3RlbmVyRGVmYXVsdCgpOwotICAgIAotICAgIG1fbGlhaXNvbiA9ICAoRE9NMkhlbHBlcilwYXJzZXJMaWFpc29uOwotICAgLy8gb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQgeGN0eHQgPSB0aGlzLmdldFRyYW5zZm9ybWVyKCkuZ2V0WFBhdGhDb250ZXh0KCk7Ci0KLSAgICAvL3hjdHh0LnNldERPTUhlbHBlcihtX2xpYWlzb24pOyAgICAKLSAgfQotICAKLSAgLyoqIAotICAgKiBHZXQgYSBMaWFpc29uIGNsYXNzCi0gICAqLwotICBwdWJsaWMgWE1MUGFyc2VyTGlhaXNvbiBjcmVhdGVMaWFpc29uKCkKLSAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLlhNTFBhcnNlckxpYWlzb25EZWZhdWx0KCk7ICAgIAotICB9Ci0gCi0gIC8qKgotICAgKiBSZXNldCB0aGUgc3RhdGUuICBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciBhIHByb2Nlc3MoKSBjYWxsCi0gICAqIGlzIGludm9rZWQsIGlmIHRoZSBwcm9jZXNzb3IgaXMgdG8gYmUgdXNlZCBhZ2Fpbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkKLSAgewotICAgIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsKQotICAgICAgbV90cmFuc2Zvcm1lckltcGwucmVzZXQoKTsgCi0gICAgbV9zdHlsZXNoZWV0UGFyYW1zID0gbnVsbDsKLSAgfQotICAKLSAKLQotICAvKioKLSAgICogVHJhbnNmb3JtIHRoZSBzb3VyY2UgdHJlZSB0byB0aGUgb3V0cHV0IGluIHRoZSBnaXZlbgotICAgKiByZXN1bHQgdHJlZSB0YXJnZXQuIEFzIGEgZ2VuZXJhbCBydWxlLCB3ZSByZWNvbW1lbmQgeW91IHVzZSB0aGUKLSAgICoge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUHJvY2Vzc29yI3Byb2Nlc3Mob3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZSwgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZSwgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRSZXN1bHRUYXJnZXQpfSBtZXRob2QuCi0gICAqIEBwYXJhbSBpbnB1dFNvdXJjZSAgVGhlIGlucHV0IHNvdXJjZS4KLSAgICogQHBhcmFtIHN0eWxlc2hlZXRTb3VyY2UgIFRoZSBzdHlsZXNoZWV0IHNvdXJjZS4gIE1heSBiZSBudWxsIGlmIHNvdXJjZSBoYXMgYSB4bWwtc3R5bGVzaGVldCBQSS4KLSAgICogQHBhcmFtIG91dHB1dFRhcmdldCBUaGUgb3V0cHV0IHNvdXJjZSB0cmVlLgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhNTFBhcnNlckxpYWlzb24gZGVjaWRlCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcm9jZXNzKCBYU0xUSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIFhTTFRJbnB1dFNvdXJjZSBzdHlsZXNoZWV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBYU0xUUmVzdWx0VGFyZ2V0IG91dHB1dFRhcmdldCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBCb29sZWFuIHRvdGFsVGltZUlEID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0gICAgICBwdXNoVGltZSh0b3RhbFRpbWVJRCk7Ci0gICAgICBOb2RlIHNvdXJjZVRyZWUgPSBudWxsOwotICAgICAgCi0gICAgICBUZW1wbGF0ZXMgdGVtcGxhdGVzID0gbnVsbDsKLSAgICAgIGlmIChtX25lZWRUb0V2YWwpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG51bGw7Ci0gICAgICAgIGlmIChudWxsICE9IHN0eWxlc2hlZXRTb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgICBTb3VyY2Ugc3NTb3VyY2UgPSBzdHlsZXNoZWV0U291cmNlLmdldFNvdXJjZU9iamVjdCgpOwotICAgICAgICAgIGlmKHNzU291cmNlIGluc3RhbmNlb2YgRE9NU291cmNlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5vZGUgPSAoKERPTVNvdXJjZSlzc1NvdXJjZSkuZ2V0Tm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobnVsbCA9PSBub2RlKQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZSA9IG5ldyBET00ySGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoKSA7IAotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTwgbV9ldmFsTGlzdC5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyltX2V2YWxMaXN0LmVsZW1lbnRBdChpKTsKLSAgICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9IChTdHJpbmcpbV9zdHlsZXNoZWV0UGFyYW1zLmdldChuYW1lKTsKLSAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE9iamVjdCB2YWwgPSBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQVBJLmV2YWwobm9kZSwgZXhwcmVzc2lvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1fc3R5bGVzaGVldFBhcmFtcy5wdXQobmFtZSwgdmFsKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2goVHJhbnNmb3JtZXJFeGNlcHRpb24gdGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fbmVlZFRvRXZhbCA9IGZhbHNlOwotICAgICAgICBtX2V2YWxMaXN0ID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgc291cmNlVHJlZSA9IGdldFNvdXJjZVRyZWVGcm9tSW5wdXQoaW5wdXRTb3VyY2UpOwotICAgICAgCi0gICAgICBpZihudWxsICE9IHN0eWxlc2hlZXRTb3VyY2UpCi0gICAgICB7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgdGVtcGxhdGVzID0gbV90ZmFjdG9yeS5uZXdUZW1wbGF0ZXMoc3R5bGVzaGVldFNvdXJjZS5nZXRTb3VyY2VPYmplY3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKHRjZSk7Ci0gICAgICAgIH0gIAotICAgICAgICAKLSAgICAgIH0gICAgICAKLSAgICAgIGVsc2UgaWYoIG51bGwgIT0gaW5wdXRTb3VyY2UpCi0gICAgICB7IAotICAgICAgICBpZihudWxsICE9IHNvdXJjZVRyZWUpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgc3R5bGVzaGVldFVSSSA9IG51bGw7Ci0gICAgICAgICAgU3RhY2sgaHJlZnMgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgICBmb3IoTm9kZSBjaGlsZD1zb3VyY2VUcmVlLmdldEZpcnN0Q2hpbGQoKTsgbnVsbCAhPSBjaGlsZDsgY2hpbGQ9Y2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZihOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA9PSBjaGlsZC5nZXROb2RlVHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKWNoaWxkOwotICAgICAgICAgICAgICBpZihwaS5nZXROb2RlTmFtZSgpLmVxdWFscygieG1sLXN0eWxlc2hlZXQiKQotICAgICAgICAgICAgICAgICB8fCBwaS5nZXROb2RlTmFtZSgpLmVxdWFscygieG1sOnN0eWxlc2hlZXQiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPSyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGkuZ2V0Tm9kZVZhbHVlKCksICIgXHQ9Iik7Ci0gICAgICAgICAgICAgICAgd2hpbGUodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZih0b2tlbml6ZXIubmV4dFRva2VuKCkuZXF1YWxzKCJ0eXBlIikpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlVmFsID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICB0eXBlVmFsID0gdHlwZVZhbC5zdWJzdHJpbmcoMSwgdHlwZVZhbC5sZW5ndGgoKS0xKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIXR5cGVWYWwuZXF1YWxzKCJ0ZXh0L3hzbCIpICYmICF0eXBlVmFsLmVxdWFscygidGV4dC94bWwiKSAmJiAhdHlwZVZhbC5lcXVhbHMoImFwcGxpY2F0aW9uL3htbCt4c2x0IikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBpc09LID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihpc09LKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGkuZ2V0Tm9kZVZhbHVlKCksICIgXHQ9Iik7Ci0gICAgICAgICAgICAgICAgICB3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZih0b2tlbml6ZXIubmV4dFRva2VuKCkuZXF1YWxzKCJocmVmIikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBzdHlsZXNoZWV0VVJJID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAgIHN0eWxlc2hlZXRVUkkgPSBzdHlsZXNoZWV0VVJJLnN1YnN0cmluZygxLCBzdHlsZXNoZWV0VVJJLmxlbmd0aCgpLTEpOwotICAgICAgICAgICAgICAgICAgICAgIGhyZWZzLnB1c2goc3R5bGVzaGVldFVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAvLyBlbmQgZm9yKGludCBpID0gMDsgaSA8IG5Ob2RlczsgaSsrKQotICAgICAgICAgIGJvb2xlYW4gaXNSb290ID0gdHJ1ZTsKLSAgICAgICAgICBTdHlsZXNoZWV0IHByZXZTdHlsZXNoZWV0ID0gbnVsbDsKLSAgICAgICAgICB3aGlsZSghaHJlZnMuaXNFbXB0eSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0eWxlc2hlZXQgc3R5bGVzaGVldCA9IGdldFN0eWxlc2hlZXRGcm9tUElVUkwoKFN0cmluZylocmVmcy5wb3AoKSwgc291cmNlVHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgIT0gaW5wdXRTb3VyY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW5wdXRTb3VyY2UuZ2V0U3lzdGVtSWQoKSA6IG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUm9vdCk7Ci0gICAgICAgICAgICBpZihmYWxzZSA9PSBpc1Jvb3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHByZXZTdHlsZXNoZWV0LnNldEltcG9ydCgoU3R5bGVzaGVldENvbXBvc2VkKXN0eWxlc2hlZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldlN0eWxlc2hlZXQgPSBzdHlsZXNoZWV0OwotICAgICAgICAgICAgaXNSb290ID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZXJyb3IoWFNMVEVycm9yUmVzb3VyY2VzLkVSX05PX0lOUFVUX1NUWUxFU0hFRVQpOyAvLyJTdHlsZXNoZWV0IGlucHV0IHdhcyBub3Qgc3BlY2lmaWVkISIpOwotICAgICAgfQotICAgICAgCi0gICAgIAotICAgICAgaWYobnVsbCA9PSB0ZW1wbGF0ZXMpCi0gICAgICB7Ci0gICAgICAgIGlmIChtX3N0eWxlc2hlZXRSb290ICE9IG51bGwpCi0gICAgICAgICAgdGVtcGxhdGVzID0gbV9zdHlsZXNoZWV0Um9vdC5nZXRPYmplY3QoKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7ICAKLSAgICAgICAgICBlcnJvcihYU0xURXJyb3JSZXNvdXJjZXMuRVJfRkFJTEVEX1BST0NFU1NfU1RZTEVTSEVFVCk7IC8vIkZhaWxlZCB0byBwcm9jZXNzIHN0eWxlc2hlZXQhIik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9ICAKLSAgICAgIH0KLQotICAgICAgaWYobnVsbCAhPSB0ZW1wbGF0ZXMpCi0gICAgICB7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICBtX3RyYW5zZm9ybWVySW1wbCA9IChUcmFuc2Zvcm1lckltcGwpdGVtcGxhdGVzLm5ld1RyYW5zZm9ybWVyKCk7IAotICAgICAgICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgICAgbV90cmFuc2Zvcm1lckltcGwuc2V0RXJyb3JMaXN0ZW5lcihtX3Byb2JsZW1MaXN0ZW5lcik7Ci0gICAgICAgICAgaWYgKG1fbGlhaXNvbiAhPSBudWxsKQotICAgICAgICAgICAgbV90cmFuc2Zvcm1lckltcGwuZ2V0WFBhdGhDb250ZXh0KCkuc2V0RE9NSGVscGVyKG1fbGlhaXNvbik7Ci0gICAKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHRjZSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGNlKTsKLSAgICAgICAgfSAgCi0gICAgICAgIAotICAgICAgICBpZiAobV9zdHlsZXNoZWV0UGFyYW1zICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBFbnVtZXJhdGlvbiBrZXlzID0gbV9zdHlsZXNoZWV0UGFyYW1zLmtleXMoKTsKLSAgICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbV9zdHlsZXNoZWV0UGFyYW1zLmdldChuYW1lKTsgCi0gICAgICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5zZXRQYXJhbWV0ZXIobmFtZSwgbnVsbCwgdmFsdWUpOwotICAgICAgICAgIH0gCi0gICAgICAgIH0gIAotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKHNvdXJjZVRyZWUpLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXRUYXJnZXQuZ2V0UmVzdWx0T2JqZWN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiB0ZSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGUpOwotICAgICAgICB9ICAKLSAgICAgICAgaWYobnVsbCAhPSBtX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBkaXNwbGF5RHVyYXRpb24oIlRvdGFsIHRpbWUiLCB0b3RhbFRpbWVJRCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkKLSAgICB7Ci0gICAgICBlcnJvcihYU0xURXJyb3JSZXNvdXJjZXMuRVJST1IwMDAwLCBuZXcgT2JqZWN0W10ge211ZS5nZXRNZXNzYWdlKCl9LCBtdWUpOwotICAgICAgLy8gdGhyb3cgc2U7Ci0gICAgfQotICAgIGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKQotICAgIHsKLSAgICAgIGVycm9yKFhTTFRFcnJvclJlc291cmNlcy5FUlJPUjAwMDAsIG5ldyBPYmplY3RbXSB7Zm5mZS5nZXRNZXNzYWdlKCl9LCBmbmZlKTsKLSAgICAgIC8vIHRocm93IHNlOwotICAgIH0KLSAgICBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgZXJyb3IoWFNMVEVycm9yUmVzb3VyY2VzLkVSUk9SMDAwMCwgbmV3IE9iamVjdFtdIHtpb2UuZ2V0TWVzc2FnZSgpfSwgaW9lKTsKLSAgICAgIC8vIHRocm93IHNlOwotICAgIH0KLSAgICBjYXRjaChTQVhFeGNlcHRpb24gc2UpCi0gICAgewotICAgICAgZXJyb3IoWFNMVEVycm9yUmVzb3VyY2VzLkVSX1NBWF9FWENFUFRJT04sIHNlKTsgLy8iU0FYIEV4Y2VwdGlvbiIsIHNlKTsKLSAgICAgIC8vIHRocm93IHNlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBCb3R0bGVuZWNrIHRoZSBjcmVhdGlvbiBvZiB0aGUgc3R5bGVzaGVldCBmb3IgZGVyaXZhdGlvbiBwdXJwb3Nlcy4KLSAgICovCi0gIHB1YmxpYyBTdHlsZXNoZWV0Um9vdCBjcmVhdGVTdHlsZXNoZWV0Um9vdChTdHJpbmcgYmFzZUlkZW50aWZpZXIpCi0gICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLAotICAgICAgICAgICBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICB0cnl7Ci0gICAgICBpZiAoYmFzZUlkZW50aWZpZXIgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIG5ldyBTdHlsZXNoZWV0Um9vdCh0aGlzLCBiYXNlSWRlbnRpZmllcik7IAotICAgICAgCi0gICAgICBTb3VyY2UgaW5Tb3VyY2UgPSBuZXcgWFNMVElucHV0U291cmNlKGJhc2VJZGVudGlmaWVyKS5nZXRTb3VyY2VPYmplY3QoKTsKLSAgICAgIFRlbXBsYXRlcyB0ZW1wbGF0ZXMgPSBtX3RmYWN0b3J5Lm5ld1RlbXBsYXRlcyhpblNvdXJjZSk7Ci0gICAgICBTdHlsZXNoZWV0Um9vdCBzdHlsZXNoZWV0ID0gbmV3IFN0eWxlc2hlZXRSb290KChvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0Um9vdCl0ZW1wbGF0ZXMpOyAgICAgIAotICAgICAgcmV0dXJuIHN0eWxlc2hlZXQ7ICAgICAgCi0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGNlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBCb3R0bGVuZWNrIHRoZSBjcmVhdGlvbiBvZiB0aGUgc3R5bGVzaGVldCBmb3IgZGVyaXZhdGlvbiBwdXJwb3Nlcy4KLSAgICovCi0gIFN0eWxlc2hlZXRSb290IGNyZWF0ZVN0eWxlc2hlZXRSb290KFN0cmluZyBiYXNlSWRlbnRpZmllciwgWFNMVElucHV0U291cmNlIHNvdXJjZSkKLSAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sCi0gICAgICAgICAgIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24KLSAgewotICAgIHRyeXsKLSAgICAgIFNvdXJjZSBpblNvdXJjZSA9IHNvdXJjZS5nZXRTb3VyY2VPYmplY3QoKTsKLSAgICAgIFRlbXBsYXRlcyB0ZW1wbGF0ZXMgPSBtX3RmYWN0b3J5Lm5ld1RlbXBsYXRlcyhpblNvdXJjZSk7Ci0gICAgICBTdHlsZXNoZWV0Um9vdCBzdHlsZXNoZWV0ID0gbmV3IFN0eWxlc2hlZXRSb290KChvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0Um9vdCl0ZW1wbGF0ZXMpOyAgICAgIAotICAgICAgcmV0dXJuIHN0eWxlc2hlZXQ7ICAgICAgCi0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGNlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSBVUkkgdG8gYW4gWFNMIHN0eWxlc2hlZXQsCi0gICAqIENvbXBpbGUgdGhlIHN0eWxlc2hlZXQgaW50byBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KLSAgICogVGhpcyBjYWxscyByZXNldCgpIGJlZm9yZSBwcm9jZXNzaW5nIGlmIHRoZSBzdHlsZXNoZWV0IHJvb3QgaGFzIGJlZW4gc2V0Ci0gICAqIHRvIG5vbi1udWxsLgotICAgKiBAcGFyYW0geG1sZG9jVVJMU3RyaW5nICBUaGUgVVJMIHRvIHRoZSBpbnB1dCBYTUwgZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gVGhlIGNvbXBpbGVkIHN0eWxlc2hlZXQgb2JqZWN0LgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhNTFBhcnNlckxpYWlzb24gZGVjaWRlCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgU3R5bGVzaGVldFJvb3QgcHJvY2Vzc1N0eWxlc2hlZXQoWFNMVElucHV0U291cmNlIHN0eWxlc2hlZXRTb3VyY2UpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5ewotICAgICAgaWYobnVsbCAhPSAoKFRyYW5zZm9ybWVyRmFjdG9yeUltcGwpbV90ZmFjdG9yeSkubmV3VGVtcGxhdGVzSGFuZGxlcigpLmdldFRlbXBsYXRlcygpKQotICAgICAgICByZXNldCgpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHRjZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKHRjZSk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHhzbElkZW50aWZpZXIgPSAoKG51bGwgPT0gc3R5bGVzaGVldFNvdXJjZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBzdHlsZXNoZWV0U291cmNlLmdldFN5c3RlbUlkKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiSW5wdXQgWFNMIiA6IHN0eWxlc2hlZXRTb3VyY2UuZ2V0U3lzdGVtSWQoKTsKLQotICAgIC8vIEluIGNhc2Ugd2UgaGF2ZSBhIGZyYWdtZW50IGlkZW50aWZpZXIsIGdvIGFoZWFkIGFuZAotICAgIC8vIHRyeSBhbmQgcGFyc2UgdGhlIFhNTCBoZXJlLgotICAgIG1fc3R5bGVzaGVldFJvb3QgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFN0eWxlc2hlZXRIYW5kbGVyIHN0eWxlc2hlZXRQcm9jZXNzb3IKLSAgICAgICAgICA9IG5ldyBTdHlsZXNoZWV0SGFuZGxlcigoVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCltX3RmYWN0b3J5KTsgLy90aGlzLCBtX3N0eWxlc2hlZXRSb290KTsgCi0gICAgICAgIAotICAgICAgU291cmNlIHNzU291cmNlID0gc3R5bGVzaGVldFNvdXJjZS5nZXRTb3VyY2VPYmplY3QoKTsKLSAgICAgIGlmKHNzU291cmNlIGluc3RhbmNlb2YgRE9NU291cmNlKQotICAgICAgewotICAgICAgICBpZigoKERPTVNvdXJjZSlzc1NvdXJjZSkuZ2V0Tm9kZSgpIGluc3RhbmNlb2YgU3R5bGVzaGVldFJvb3QpCi0gICAgICAgIHsKLSAgICAgICAgICBtX3N0eWxlc2hlZXRSb290ID0gKFN0eWxlc2hlZXRSb290KSgoRE9NU291cmNlKXNzU291cmNlKS5nZXROb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3R5bGVzaGVldFByb2Nlc3Nvci5zZXRTeXN0ZW1JZChzdHlsZXNoZWV0U291cmNlLmdldFN5c3RlbUlkKCkpOwotICAgICAgICAgIFRyZWVXYWxrZXIgdHcgPSBuZXcgVHJlZVdhbGtlcihzdHlsZXNoZWV0UHJvY2Vzc29yLCBuZXcgb3JnLmFwYWNoZS54cGF0aC5ET00ySGVscGVyKCkpOwotICAgICAgICAgIHR3LnRyYXZlcnNlKCgoRE9NU291cmNlKXNzU291cmNlKS5nZXROb2RlKCkpOwotICAgICAgICAgIG1fc3R5bGVzaGVldFJvb3QgPSBuZXcgU3R5bGVzaGVldFJvb3Qoc3R5bGVzaGVldFByb2Nlc3Nvci5nZXRTdHlsZXNoZWV0Um9vdCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotCQkJCWlmKG51bGwgIT0gbV9saWFpc29uKQotICAgICAgICB7Ci0gICAgICAgICAvLyBET00ySGVscGVyIGxpYWlzb24gPSAgKERPTTJIZWxwZXIpKENsYXNzLmZvck5hbWUobGlhaXNvbkNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKSk7Ci0gICAgICAgICAgbV9saWFpc29uLnBhcnNlKFNBWFNvdXJjZS5zb3VyY2VUb0lucHV0U291cmNlKHNzU291cmNlKSk7Ci0JCQkJCURPTVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKG1fbGlhaXNvbi5nZXREb2N1bWVudCgpKTsKLQkJCQkJVGVtcGxhdGVzIHRlbXBsYXRlcyA9IG1fdGZhY3RvcnkubmV3VGVtcGxhdGVzKHNvdXJjZSk7Ci0JCQkJCW1fc3R5bGVzaGVldFJvb3QgPSBuZXcgU3R5bGVzaGVldFJvb3QoCi0JCQkJCQkJCQkJCQkJCQkJKG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXRSb290KXRlbXBsYXRlcyk7CQkJCQkJCQkJCQkJCQkJCSAKLSAgICAgICAgfSAgCi0JCQkJZWxzZQotCQkJCXsKLQkJCQkJbV9zdHlsZXNoZWV0Um9vdCA9IGNyZWF0ZVN0eWxlc2hlZXRSb290KHN0eWxlc2hlZXRTb3VyY2UuZ2V0U3lzdGVtSWQoKSwgc3R5bGVzaGVldFNvdXJjZSk7Ci0JCQkJfQotICAgICAgICBhZGRUcmFjZUxpc3RlbmVyc1RvU3R5bGVzaGVldCgpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHN0eWxlc2hlZXRQcm9jZXNzb3IucHVzaFN0eWxlc2hlZXQobV9zdHlsZXNoZWV0Um9vdC5nZXRPYmplY3QoKSk7ICAgICAgCi0gICAgICAgIGRpYWcoIj09PT09PT09PSBQYXJzaW5nICIreHNsSWRlbnRpZmllcisiID09PT09PT09PT0iKTsKLSAgICAgICAgcHVzaFRpbWUoeHNsSWRlbnRpZmllcik7Ci0gICAgICAgIC8vU3RyaW5nIGxpYWlzb25DbGFzc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUueGFsYW4uc291cmNlLmxpYWlzb24iKTsKLQotICAgICAgICAKLSAgICAgICAgaWYobnVsbCAhPSBtX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIpCi0gICAgICAgICAgZGlzcGxheUR1cmF0aW9uKCJQYXJzZSBvZiAiK3hzbElkZW50aWZpZXIsIHhzbElkZW50aWZpZXIpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlcnJvcihYU0xURXJyb3JSZXNvdXJjZXMuRVJfQ09VTEROVF9QQVJTRV9ET0MsIG5ldyBPYmplY3RbXSB7eHNsSWRlbnRpZmllcn0sIGUpOyAvLyJDb3VsZCBub3QgcGFyc2UgIit4c2xJZGVudGlmaWVyKyIgZG9jdW1lbnQhIiwgZSk7Ci0gICAgfQotICAgIHJldHVybiBtX3N0eWxlc2hlZXRSb290OwotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgVVJJIHRvIGFuIFhTTCBzdHlsZXNoZWV0LAotICAgKiBDb21waWxlIHRoZSBzdHlsZXNoZWV0IGludG8gYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uCi0gICAqIFRoaXMgY2FsbHMgcmVzZXQoKSBiZWZvcmUgcHJvY2Vzc2luZyBpZiB0aGUgc3R5bGVzaGVldCByb290IGhhcyBiZWVuIHNldAotICAgKiB0byBub24tbnVsbC4KLSAgICogQHBhcmFtIHhtbGRvY1VSTFN0cmluZyAgVGhlIFVSTCB0byB0aGUgaW5wdXQgWE1MIGRvY3VtZW50LgotICAgKiBAcmV0dXJuIFRoZSBjb21waWxlZCBzdHlsZXNoZWV0IG9iamVjdC4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXRSb290IHByb2Nlc3NTdHlsZXNoZWV0KFN0cmluZyB4c2xkb2NVUkxTdHJpbmcpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgWFNMVElucHV0U291cmNlIGlucHV0ID0gbmV3IFhTTFRJbnB1dFNvdXJjZShnZXRVUkxGcm9tU3RyaW5nKHhzbGRvY1VSTFN0cmluZywgbnVsbCkudG9TdHJpbmcoKSk7Ci0gICAgICByZXR1cm4gcHJvY2Vzc1N0eWxlc2hlZXQoaW5wdXQpOwotICAgIH0KLSAgICBjYXRjaChTQVhFeGNlcHRpb24gc2UpCi0gICAgewotICAgICAgZXJyb3IoWFNMVEVycm9yUmVzb3VyY2VzLkVSX1BST0NFU1NTVFlMRVNIRUVUX05PVF9TVUNDRVNTRlVMLCBzZSk7IC8vInByb2Nlc3NTdHlsZXNoZWV0IG5vdCBzdWNjZXNmdWxsISIsIHNlKTsKLSAgICAgIHJldHVybiBudWxsOyAvLyBzaHV0IHVwIGNvbXBpbGVyCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgc3R5bGVzaGVldCBmb3IgdGhpcyBwcm9jZXNzb3IuICBJZiB0aGlzIGlzIHNldCwgdGhlbiB0aGUKLSAgICogcHJvY2VzcyBjYWxscyB0aGF0IHRha2Ugb25seSB0aGUgaW5wdXQgLnhtbCB3aWxsIHVzZQotICAgKiB0aGlzIGluc3RlYWQgb2YgbG9va2luZyBmb3IgYSBzdHlsZXNoZWV0IFBJLiAgQWxzbywKLSAgICogc2V0dGluZyB0aGUgc3R5bGVzaGVldCBpcyBuZWVkZWQgaWYgeW91IGFyZSBnb2luZwotICAgKiB0byB1c2UgdGhlIHByb2Nlc3NvciBhcyBhIFNBWCBEb2N1bWVudEhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdHlsZXNoZWV0KFN0eWxlc2hlZXRSb290IHN0eWxlc2hlZXRSb290KQotICB7Ci0gICAgbV9zdHlsZXNoZWV0Um9vdCA9IHN0eWxlc2hlZXRSb290OwotICAgIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXRSb290IHNyID0gc3R5bGVzaGVldFJvb3QuZ2V0T2JqZWN0KCk7Ci0gICAgaWYgKG1fdHJhbnNmb3JtZXJJbXBsID09IG51bGwpCi0gICAgICBtX3RyYW5zZm9ybWVySW1wbCA9IChUcmFuc2Zvcm1lckltcGwpc3IubmV3VHJhbnNmb3JtZXIoKTsKLSAgICBtX3RyYW5zZm9ybWVySW1wbC5zZXRTdHlsZXNoZWV0KHNyKTsKLSAgICBpZiAobV9wcm9ibGVtTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLnNldEVycm9yTGlzdGVuZXIobV9wcm9ibGVtTGlzdGVuZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBzdHlsZXNoZWV0IGZvciB0aGlzIHByb2Nlc3Nvci4KLSAgICovCi0gIHB1YmxpYyBTdHlsZXNoZWV0Um9vdCBnZXRTdHlsZXNoZWV0KCkgICAgCi0gIHsKLSAgICByZXR1cm4gbV9zdHlsZXNoZWV0Um9vdDsKLSAgfQotCi0gIC8qKgotICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgICogR2V0IHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGRvY3VtZW50LCBpZiBpdCB3YXMgc2V0LgotICAgKiBUaGlzIGlzIGZvciB1c2UgYnkgbXVsdGlwbGUgb3V0cHV0IGRvY3VtZW50cywgdG8gZGV0ZXJtaW5lCi0gICAqIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIG91dHB1dCBkb2N1bWVudC4gIEl0IG5lZWRzIHRvCi0gICAqIGJlIHNldCBieSB0aGUgY2FsbGVyLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRPdXRwdXRGaWxlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbV9vdXRwdXRGaWxlTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgICogU2V0IHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGRvY3VtZW50LgotICAgKiBUaGlzIGlzIGZvciB1c2UgYnkgbXVsdGlwbGUgb3V0cHV0IGRvY3VtZW50cywgdG8gZGV0ZXJtaW5lCi0gICAqIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIG91dHB1dCBkb2N1bWVudC4gIEl0IG5lZWRzIHRvCi0gICAqIGJlIHNldCBieSB0aGUgY2FsbGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T3V0cHV0RmlsZU5hbWUoU3RyaW5nIGZpbGVuYW1lKQotICB7Ci0gICAgbV9vdXRwdXRGaWxlTmFtZSA9IGZpbGVuYW1lOwotICB9Ci0KLSAgCi0KLSAgLyoqCi0gICAqIEdpdmVuIGFuIGlucHV0IHNvdXJjZSwgZ2V0IHRoZSBzb3VyY2UgdHJlZS4KLSAgICovCi0gIHB1YmxpYyBOb2RlIGdldFNvdXJjZVRyZWVGcm9tSW5wdXQoWFNMVElucHV0U291cmNlIGlucHV0U291cmNlKQotICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KLSAgewotICAgIE5vZGUgc291cmNlVHJlZSA9IG51bGw7Ci0gICAgU3RyaW5nIHhtbElkZW50aWZpZXIgPSAoKG51bGwgPT0gaW5wdXRTb3VyY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gaW5wdXRTb3VyY2UuZ2V0U3lzdGVtSWQoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJJbnB1dCBYTUwiIDogaW5wdXRTb3VyY2UuZ2V0U3lzdGVtSWQoKTsKLSAgICAKLSAgICBTb3VyY2UgaVNvdXJjZSA9IGlucHV0U291cmNlLmdldFNvdXJjZU9iamVjdCgpOyAKLQotICAgIGlmKGlTb3VyY2UgaW5zdGFuY2VvZiBET01Tb3VyY2UpCi0gICAgewotICAgICAgLy9pZihnZXRYTUxQcm9jZXNzb3JMaWFpc29uKCkgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLmR0bS5EVE1MaWFpc29uKQotICAgICAgIC8vIGVycm9yKFhTTFRFcnJvclJlc291cmNlcy5FUl9DQU5UX1VTRV9EVE1fRk9SX0lOUFVUKTsKLQotICAgICAgc291cmNlVHJlZSA9ICgoRE9NU291cmNlKWlTb3VyY2UpLmdldE5vZGUoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIEluIGNhc2Ugd2UgaGF2ZSBhIGZyYWdtZW50IGlkZW50aWZpZXIsIGdvIGFoZWFkIGFuZAotICAgICAgLy8gdHJ5IGFuZCBwYXJzZSB0aGUgWE1MIGhlcmUuCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZGlhZygiPT09PT09PT09IFBhcnNpbmcgIit4bWxJZGVudGlmaWVyKyIgPT09PT09PT09PSIpOwotICAgICAgICBwdXNoVGltZSh4bWxJZGVudGlmaWVyKTsKLSAgICAgICAgCi0gICAgICAgIC8vU3RyaW5nIGxpYWlzb25DbGFzc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUueGFsYW4uc291cmNlLmxpYWlzb24iKTsKLQotICAgICAgICBpZihudWxsICE9IG1fbGlhaXNvbikKLSAgICAgICAgewotICAgICAgICAgIC8vRE9NMkhlbHBlciBsaWFpc29uID0gIChET00ySGVscGVyKShDbGFzcy5mb3JOYW1lKGxpYWlzb25DbGFzc05hbWUpLm5ld0luc3RhbmNlKCkpOwotICAgICAgICAgIG1fbGlhaXNvbi5wYXJzZShTQVhTb3VyY2Uuc291cmNlVG9JbnB1dFNvdXJjZShpU291cmNlKSk7Ci0gICAgICAgICAgaWYobnVsbCAhPSBtX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIpCi0gICAgICAgICAgICBkaXNwbGF5RHVyYXRpb24oIlBhcnNlIG9mICIreG1sSWRlbnRpZmllciwgeG1sSWRlbnRpZmllcik7Ci0gICAgICAgICAgc291cmNlVHJlZSA9IG1fbGlhaXNvbi5nZXREb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAgICAgIAotICAgICAgICAgIFhNTFJlYWRlciByZWFkZXIgPSBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigpOyAgICAgICAgCi0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2goU0FYRXhjZXB0aW9uIHNlKQotICAgICAgICAgIHsKLSAgICAgICAgICAvLyBXaGF0IGNhbiB3ZSBkbz8KLSAgICAgICAgICAvLyBUT0RPOiBVc2VyIGRpYWdub3N0aWNzLgotICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgLy8gR2V0IHRoZSBpbnB1dCBjb250ZW50IGhhbmRsZXIsIHdoaWNoIHdpbGwgaGFuZGxlIHRoZSAKLSAgICAgICAgICAvLyBwYXJzZSBldmVudHMgYW5kIGNyZWF0ZSB0aGUgc291cmNlIHRyZWUuICAgICAgICAgIAotICAgICAgICAgIC8vU3R5bGVzaGVldEhhbmRsZXIgaW5wdXRIYW5kbGVyID0gKFN0eWxlc2hlZXRIYW5kbGVyKW1fcHJvY2Vzc29yLmdldFRlbXBsYXRlc0J1aWxkZXIoKTsKLSAgICAgICAgICAvL3JlYWRlci5zZXRDb250ZW50SGFuZGxlciggaW5wdXRIYW5kbGVyICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgU291cmNlVHJlZUhhbmRsZXIgaGFuZGxlciA9IG5ldyBTb3VyY2VUcmVlSGFuZGxlcigpOwotICAgICAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKLSAgICAgICAgICByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIGhhbmRsZXIpOwotICAgICAgICAKLSAgICAgICAgICAvLyBLaWNrIG9mZiB0aGUgcGFyc2UuICBXaGVuIHRoZSBDb250ZW50SGFuZGxlciBnZXRzIAotICAgICAgICAgIC8vIHRoZSBzdGFydERvY3VtZW50IGV2ZW50LCBpdCB3aWxsIGNhbGwgdHJhbnNmb3JtTm9kZSggbm9kZSApLgotICAgICAgICAgIHJlYWRlci5wYXJzZSggU0FYU291cmNlLnNvdXJjZVRvSW5wdXRTb3VyY2UoaVNvdXJjZSkpOwotICAgICAgICAgIHNvdXJjZVRyZWUgPSBoYW5kbGVyLmdldFJvb3QoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIFVud3JhcCBleGNlcHRpb24KLSAgICAgICAgaWYoKGUgaW5zdGFuY2VvZiBTQVhFeGNlcHRpb24pICYmIChudWxsICE9ICgoU0FYRXhjZXB0aW9uKWUpLmdldEV4Y2VwdGlvbigpKSkKLSAgICAgICAgewotICAgICAgICAgIC8vICgoU0FYRXhjZXB0aW9uKWUpLmdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgIGUgPSAoKFNBWEV4Y2VwdGlvbillKS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBzb3VyY2VUcmVlID0gbnVsbDsgLy8gc2h1dHVwIGNvbXBpbGVyCi0gICAgICAgIGVycm9yKFhTTFRFcnJvclJlc291cmNlcy5FUl9DT1VMRE5UX1BBUlNFX0RPQywgbmV3IE9iamVjdFtdIHt4bWxJZGVudGlmaWVyfSwgZSk7IC8vIkNvdWxkIG5vdCBwYXJzZSAiK3htbElkZW50aWZpZXIrIiBkb2N1bWVudCEiLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc291cmNlVHJlZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgU3R5bGVzaGVldCBmcm9tIFBJIFVSTAotICAgKiAKLSAgICogQHBhcmFtIHhzbFVSTFN0cmluZyBhIHZhbGlkIFVSSSB0byBhbiBYU0wgc3R5bGVzaGVldC4KLSAgICogQHBhcmFtIGZyYWdiYXNlIERvY3VtZW50IGZyYWdtZW50IE5vZGUuCi0gICAqIEBwYXJhbSB4bWxCYXNlSWRlbnQgQmFzZSBVUkkgdG8gcmVzb2x2ZSBzdHlsZXNoZWV0IFVSTCAKLSAgICogQHBhcmFtIGlzUm9vdCBGbGFnIGluZGljYXRpbmcgaWYgcm9vdCBub2RlCi0gICAqLwotICBTdHlsZXNoZWV0IGdldFN0eWxlc2hlZXRGcm9tUElVUkwoU3RyaW5nIHhzbFVSTFN0cmluZywgTm9kZSBmcmFnQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB4bWxCYXNlSWRlbnQsIGJvb2xlYW4gaXNSb290KQotICAgIHRocm93cyBTQVhFeGNlcHRpb24sCi0gICAgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAotICAgIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3R5bGVzaGVldCBzdHlsZXNoZWV0ID0gbnVsbDsKLSAgICBTdHJpbmdbXSBzdHJpbmdIb2xkZXIgPQotICAgIHsKLSAgICAgIG51bGx9OwotICAgIHhzbFVSTFN0cmluZyA9IHhzbFVSTFN0cmluZy50cmltKCk7Ci0gICAgaW50IGZyYWdJbmRleCA9IHhzbFVSTFN0cmluZy5pbmRleE9mKCcjJyk7Ci0gICAgU3RyaW5nIGZyYWdJRCA9IG51bGw7Ci0gICAgRG9jdW1lbnQgc3R5bGVzaGVldERvYzsKLSAgICBpZihmcmFnSW5kZXggPT0gMCkKLSAgICB7Ci0gICAgICBkaWFnKCJMb2NhdGluZyBzdHlsZXNoZWV0IGZyb20gZnJhZ21lbnQgaWRlbnRpZmllci4uLiIpOwotICAgICAgZnJhZ0lEID0geHNsVVJMU3RyaW5nLnN1YnN0cmluZygxKTsKLSAgICAgIAotICAgICAgLy8gVHJ5IGEgYnVuY2ggb2YgcmVhbGx5IHVnbHkgc3R1ZmYgdG8gZmluZCB0aGUgZnJhZ21lbnQuCi0gICAgICAvLyBXaGF0J3MgdGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzPwotCi0gICAgICAvLyBDcmVhdGUgYSBYUGF0aCBwYXJzZXIuCi0gICAgICBYUGF0aFBhcnNlciBwYXJzZXIgPSBuZXcgWFBhdGhQYXJzZXIoKEVycm9yTGlzdGVuZXIpbV9wcm9ibGVtTGlzdGVuZXIuZ2V0RXJyb3JIYW5kbGVyKCksIG51bGwpOwotICAgICAgWFBhdGhDb250ZXh0IHhwYXRoQ29udGV4dCA9IG5ldyBYUGF0aENvbnRleHQoKTsKLSAgICAgIFByZWZpeFJlc29sdmVyRGVmYXVsdCBuc05vZGUgPSBuZXcgUHJlZml4UmVzb2x2ZXJEZWZhdWx0KGZyYWdCYXNlKTsgLy94cGF0aENvbnRleHQuZ2V0TmFtZXNwYWNlQ29udGV4dCgpOwotCi0gICAgICBOb2RlSXRlcmF0b3IgbmwgPSBudWxsOwotICAgICAgLy8gQ3JlYXRlIHRoZSBYUGF0aCBvYmplY3QuCi0gICAgICB0cnl7Ci0gICAgICBYUGF0aCB4cGF0aCA9IG5ldyBYUGF0aChmcmFnSUQsIG51bGwsIG5zTm9kZSwgWFBhdGguTUFUQ0gpOwotICAgICAgQ29tcGlsZXIgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoKTsKLSAgICAgIC8vIFBhcnNlIHRoZSB4cGF0aAotICAgICAgcGFyc2VyLmluaXRYUGF0aChjb21waWxlciwgImlkKCIrZnJhZ0lEKyIpIiwgbnNOb2RlKTsKLSAgICAgIG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YT2JqZWN0IHhvYmogPSB4cGF0aC5leGVjdXRlKHhwYXRoQ29udGV4dCwgZnJhZ0Jhc2UsIG5zTm9kZSk7Ci0KLSAgICAgIG5sID0geG9iai5ub2Rlc2V0KCk7Ci0gICAgICBpZihubC5uZXh0Tm9kZSgpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIHhvYmogPSBTdHlsZXNoZWV0LmV2YWxYUGF0aFN0cihnZXRFeGVjQ29udGV4dCgpLCAiLy8qW0BpZD0nIitmcmFnSUQrIiddIiwgZnJhZ0Jhc2UsIG5zTm9kZSk7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgWFBhdGggb2JqZWN0LgotICAgICAgICB4cGF0aCA9IG5ldyBYUGF0aChmcmFnSUQsIG51bGwsIG5zTm9kZSwgWFBhdGguTUFUQ0gpOwotCi0gICAgICAgIC8vIFBhcnNlIHRoZSB4cGF0aAotICAgICAgICBwYXJzZXIuaW5pdFhQYXRoKGNvbXBpbGVyLCAiLy8qW0BpZD0nIitmcmFnSUQrIiddIiwgbnNOb2RlKTsKLSAgICAgICAgeG9iaiA9IHhwYXRoLmV4ZWN1dGUoeHBhdGhDb250ZXh0LCBmcmFnQmFzZSwgbnNOb2RlKTsKLQotICAgICAgICBubCA9IHhvYmoubm9kZXNldCgpOwotICAgICAgICBpZihubC5uZXh0Tm9kZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB4b2JqID0gU3R5bGVzaGVldC5ldmFsWFBhdGhTdHIoZ2V0RXhlY0NvbnRleHQoKSwgIi8vKltAbmFtZT0nIitmcmFnSUQrIiddIiwgZnJhZ0Jhc2UsIG5zTm9kZSk7Ci0gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBYUGF0aCBvYmplY3QuCi0gICAgICAgICAgeHBhdGggPSBuZXcgWFBhdGgoZnJhZ0lELCBudWxsLCBuc05vZGUsIFhQYXRoLk1BVENIKTsKLQotICAgICAgICAgIC8vIFBhcnNlIHRoZSB4cGF0aAotICAgICAgICAgIHBhcnNlci5pbml0WFBhdGgoY29tcGlsZXIsICIvLypbQG5hbWU9JyIrZnJhZ0lEKyInXSIsIG5zTm9kZSk7Ci0gICAgICAgICAgeG9iaiA9IHhwYXRoLmV4ZWN1dGUoeHBhdGhDb250ZXh0LCBmcmFnQmFzZSwgbnNOb2RlKTsKLSAgICAgICAgICBubCA9IHhvYmoubm9kZXNldCgpOwotICAgICAgICAgIGlmKG5sLm5leHROb2RlKCkgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBXZWxsLCBoZWxsLCBtYXliZSBpdCdzIGFuIFhQYXRoLi4uCi0gICAgICAgICAgICAvLyB4b2JqID0gU3R5bGVzaGVldC5ldmFsWFBhdGhTdHIoZ2V0RXhlY0NvbnRleHQoKSwgZnJhZ0lELCBmcmFnQmFzZSwgbnNOb2RlKTsKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgWFBhdGggb2JqZWN0LgotICAgICAgICAgICAgLy8oKFN0eWxlc2hlZXRIYW5kbGVyKSggbV9wcm9jZXNzb3IuZ2V0VGVtcGxhdGVzQnVpbGRlcigpKSkuZ2V0TG9jYXRvcigpCi0gICAgICAgICAgICB4cGF0aCA9IG5ldyBYUGF0aChmcmFnSUQsIG51bGwsIG5zTm9kZSwgWFBhdGguTUFUQ0gpOwotCi0gICAgICAgICAgICAvLyBQYXJzZSB0aGUgeHBhdGgKLSAgICAgICAgICAgIHBhcnNlci5pbml0WFBhdGgoY29tcGlsZXIsIGZyYWdJRCwgbnNOb2RlKTsKLSAgICAgICAgICAgIHhvYmogPSB4cGF0aC5leGVjdXRlKHhwYXRoQ29udGV4dCwgZnJhZ0Jhc2UsIG5zTm9kZSk7Ci0gICAgICAgICAgICBubCA9IHhvYmoubm9kZXNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKHRlKTsKLSAgICAgIH0KLSAgICAgIGlmKG5sLm5leHROb2RlKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IoWFNMVEVycm9yUmVzb3VyY2VzLkVSX0NPVUxETlRfRklORF9GUkFHTUVOVCwgbmV3IE9iamVjdFtdIHtmcmFnSUR9KTsgLy8iQ291bGQgbm90IGZpbmQgZnJhZ21lbnQ6ICIrZnJhZ0lEKTsKLSAgICAgIH0KLSAgICAgIC8vIFVzZSBwcmV2aW91cyBiZWNhdXNlIHRoZSBwcmV2aW91cyBjYWxsIG1vdmVkIHRoZSBwb2ludGVyLgotICAgICAgLy8gb3Igc2hvdWxkIHdlIHVzZSBnZXRSb290Pz8KLSAgICAgIE5vZGUgZnJhZyA9IG5sLnByZXZpb3VzTm9kZSgpOyAvLy5pdGVtKDApOwotCi0gICAgICBpZihOb2RlLkVMRU1FTlRfTk9ERSA9PSBmcmFnLmdldE5vZGVUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIHB1c2hUaW1lKGZyYWcpOwotICAgICAgICBpZihpc1Jvb3QpCi0gICAgICAgIHsKLSAgICAgICAgICBtX3N0eWxlc2hlZXRSb290ID0gY3JlYXRlU3R5bGVzaGVldFJvb3Qoc3RyaW5nSG9sZGVyWzBdKTsKLSAgICAgICAgICBzdHlsZXNoZWV0ID0gbV9zdHlsZXNoZWV0Um9vdC5nZXRPYmplY3QoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvL3N0eWxlc2hlZXQgPSBuZXcgU3R5bGVzaGVldChtX3N0eWxlc2hlZXRSb290KTsKLSAgICAgICAgICAvLyBzdHlsZXNoZWV0ID0gKChTdHlsZXNoZWV0SGFuZGxlcikobV9wcm9jZXNzb3IuZ2V0VGVtcGxhdGVzQnVpbGRlcigpKSkuZ2V0U3R5bGVzaGVldFJvb3QoKTsKLSAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IFhTTFRJbnB1dFNvdXJjZShmcmFnSUQpLmdldFNvdXJjZU9iamVjdCgpOyAKLSAgICAgICAgICAgIFRlbXBsYXRlcyB0ZW1wbGF0ZXMgPSBtX3RmYWN0b3J5Lm5ld1RlbXBsYXRlcyhzb3VyY2UpOwotICAgICAgICAgICAgc3R5bGVzaGVldCA9IChvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0Um9vdCl0ZW1wbGF0ZXM7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYWRkVHJhY2VMaXN0ZW5lcnNUb1N0eWxlc2hlZXQoKTsKLQotICAgICAgICB0cnl7Ci0gICAgICAgIFN0eWxlc2hlZXRIYW5kbGVyIHN0eWxlc2hlZXRQcm9jZXNzb3IKLSAgICAgICAgICA9IG5ldyBTdHlsZXNoZWV0SGFuZGxlcigoVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCltX3RmYWN0b3J5KTsKLSAgICAgICAgICAgCi0gICAgICAgIHN0eWxlc2hlZXRQcm9jZXNzb3IucHVzaFN0eWxlc2hlZXQoc3R5bGVzaGVldCk7Ci0gICAgICAgIFRyZWVXYWxrZXIgdHcgPSBuZXcgVHJlZVdhbGtlcihzdHlsZXNoZWV0UHJvY2Vzc29yLCBuZXcgb3JnLmFwYWNoZS54cGF0aC5ET00ySGVscGVyKCkpOwotICAgICAgICB0dy50cmF2ZXJzZShmcmFnKTsKLQotICAgICAgICBkaXNwbGF5RHVyYXRpb24oIlNldHVwIG9mICIreHNsVVJMU3RyaW5nLCBmcmFnKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHRjZSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdHlsZXNoZWV0RG9jID0gbnVsbDsKLSAgICAgICAgZXJyb3IoWFNMVEVycm9yUmVzb3VyY2VzLkVSX05PREVfTk9UX0VMRU1FTlQsIG5ldyBPYmplY3RbXSB7ZnJhZ0lEfSk7IC8vIk5vZGUgcG9pbnRlZCB0byBieSBmcmFnbWVudCBpZGVudGlmaWVyIHdhcyBub3QgYW4gZWxlbWVudDogIitmcmFnSUQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gVE9ETzogVXNlIFJlYWRlciBoZXJlPz8KLSAgICAgIC8vIGhtbW0uLiBmb3Igbm93IEknbGwgcmVseSBvbiB0aGUgWE1MIHBhcnNlciB0byBoYW5kbGUKLSAgICAgIC8vIGZyYWdtZW50IFVSTHMuCi0gICAgICBkaWFnKFhTTE1lc3NhZ2VzLmNyZWF0ZU1lc3NhZ2UoWFNMVEVycm9yUmVzb3VyY2VzLldHX1BBUlNJTkdfQU5EX1BSRVBBUklORywgbmV3IE9iamVjdFtdIHt4c2xVUkxTdHJpbmd9KSk7IC8vIj09PT09PT09PSBQYXJzaW5nIGFuZCBwcmVwYXJpbmcgIit4c2xVUkxTdHJpbmcrIiA9PT09PT09PT09Iik7Ci0gICAgICBwdXNoVGltZSh4c2xVUkxTdHJpbmcpOwotCi0JCQlVUkwgeHNsVVJMID0gZ2V0VVJMRnJvbVN0cmluZyh4c2xVUkxTdHJpbmcsIHhtbEJhc2VJZGVudCk7Ci0KLSAgICAgIFhTTFRJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBYU0xUSW5wdXRTb3VyY2UoeHNsVVJMLnRvU3RyaW5nKCkpOwotICAgICAgCi0JCQlpZihpc1Jvb3QpCi0JCQl7CQkJCQotCQkJCWlmKG51bGwgIT0gbV9saWFpc29uKQotCQkJCXsKLQkJCQkJdHJ5ewotCQkJCQkJbV9saWFpc29uLnBhcnNlKFNBWFNvdXJjZS5zb3VyY2VUb0lucHV0U291cmNlKGlucHV0U291cmNlLmdldFNvdXJjZU9iamVjdCgpKSk7Ci0JCQkJCQlET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShtX2xpYWlzb24uZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJCQlUZW1wbGF0ZXMgdGVtcGxhdGVzID0gbV90ZmFjdG9yeS5uZXdUZW1wbGF0ZXMoc291cmNlKTsKLQkJCQkJCW1fc3R5bGVzaGVldFJvb3QgPSBuZXcgU3R5bGVzaGVldFJvb3QoCi0JCQkJCQkJCQkJCQkJCQkJCQkob3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3QpdGVtcGxhdGVzKTsKLQkJCQkJfQkJCQkJCi0JCQkJCWNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiB0Y2UpCi0JCQkJCXsKLQkJCQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24odGNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQltX3N0eWxlc2hlZXRSb290ID0gY3JlYXRlU3R5bGVzaGVldFJvb3QoeHNsVVJMU3RyaW5nKTsKLQkJCQl9Ci0JCQkJc3R5bGVzaGVldCA9IG1fc3R5bGVzaGVldFJvb3QuZ2V0T2JqZWN0KCk7Ci0JCQl9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHN0eWxlc2hlZXQgPSBuZXcgU3R5bGVzaGVldChtX3N0eWxlc2hlZXRSb290LmdldE9iamVjdCgpKTsKLSAgICAgIH0KLSAgICAgIGFkZFRyYWNlTGlzdGVuZXJzVG9TdHlsZXNoZWV0KCk7Ci0KLSAgICAgIHRyeXsKLSAgICAgIG9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlN0eWxlc2hlZXRIYW5kbGVyIHN0eWxlc2hlZXRQcm9jZXNzb3IKLSAgICAgICAgPSBuZXcgU3R5bGVzaGVldEhhbmRsZXIoKFRyYW5zZm9ybWVyRmFjdG9yeUltcGwpbV90ZmFjdG9yeSk7IC8vdGhpcywgc3R5bGVzaGVldCk7IAotICAgICAgc3R5bGVzaGVldFByb2Nlc3Nvci5wdXNoU3R5bGVzaGVldChzdHlsZXNoZWV0KTsKLSAgICAgICAgIC8vIG5ldyBTdHlsZXNoZWV0SGFuZGxlcih0aGlzLCBzdHlsZXNoZWV0KTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKHRjZSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgICAKLSAgICAgIC8vbV9wYXJzZXJMaWFpc29uLnNldERvY3VtZW50SGFuZGxlcihzdHlsZXNoZWV0UHJvY2Vzc29yKTsKLSAgICAgIC8vbV9wYXJzZXJMaWFpc29uLnBhcnNlKGlucHV0U291cmNlKTsKLQotICAgICAgZGlzcGxheUR1cmF0aW9uKCJQYXJzaW5nIGFuZCBpbml0IG9mICIreHNsVVJMU3RyaW5nLCB4c2xVUkxTdHJpbmcpOwotICAgIH0KLSAgICByZXR1cm4gc3R5bGVzaGVldDsKLSAgfQotCi0gICAgICAgIAotICAvKioKLSAgICogVGFrZSBhIHVzZXIgc3RyaW5nIGFuZCB0cnkgYW5kIHBhcnNlIFhNTCwgYW5kIGFsc28gcmV0dXJuIAotICAgKiB0aGUgdXJsLgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhQYXRoQ29udGV4dCBkZWNpZGUgCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSTCBnZXRVUkxGcm9tU3RyaW5nKFN0cmluZyB1cmxTdHJpbmcsIFN0cmluZyBiYXNlKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24gCi0gIHsKLSAgICBTdHJpbmcgb3JpZ1VSTFN0cmluZyA9IHVybFN0cmluZzsKLSAgICBTdHJpbmcgb3JpZ0Jhc2UgPSBiYXNlOwotICAgIAotICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0VVJMRnJvbVN0cmluZyAtIHVybFN0cmluZzogIit1cmxTdHJpbmcrIiwgYmFzZTogIitiYXNlKTsKLSAgICBPYmplY3QgZG9jOwotICAgIFVSTCB1cmwgPSBudWxsOwotICAgIGludCBmaWxlU3RhcnRUeXBlID0gMDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAKLSAgICAgIGlmKG51bGwgIT0gYmFzZSkKLSAgICAgIHsKLSAgICAgICAgaWYoYmFzZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImZpbGU6LyIpKQotICAgICAgICB7Ci0gICAgICAgICAgZmlsZVN0YXJ0VHlwZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihiYXNlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiZmlsZToiKSkKLSAgICAgICAgewotICAgICAgICAgIGZpbGVTdGFydFR5cGUgPSAyOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGJvb2xlYW4gaXNBYnNvbHV0ZVVSTDsKLSAgICAgIAotICAgICAgLy8gRnJvbSBodHRwOi8vd3d3Lmljcy51Y2kuZWR1L3B1Yi9pZXRmL3VyaS9yZmMxNjMwLnR4dAotICAgICAgLy8gQSBwYXJ0aWFsIGZvcm0gY2FuIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBhbiBhYnNvbHV0ZSBmb3JtIGluIHRoYXQgdGhlCi0gICAgICAvLyBsYXR0ZXIgbXVzdCBoYXZlIGEgY29sb24gYW5kIHRoYXQgY29sb24gbXVzdCBvY2N1ciBiZWZvcmUgYW55IHNsYXNoCi0gICAgICAvLyBjaGFyYWN0ZXJzLiBTeXN0ZW1zIG5vdCByZXF1aXJpbmcgcGFydGlhbCBmb3JtcyBzaG91bGQgbm90IHVzZSBhbnkKLSAgICAgIC8vIHVuZW5jb2RlZCBzbGFzaGVzIGluIHRoZWlyIG5hbWluZyBzY2hlbWVzLiAgSWYgdGhleSBkbywgYWJzb2x1dGUgVVJJcwotICAgICAgLy8gd2lsbCBzdGlsbCB3b3JrLCBidXQgY29uZnVzaW9uIG1heSByZXN1bHQuCi0gICAgICBpbnQgaW5kZXhPZkNvbG9uID0gdXJsU3RyaW5nLmluZGV4T2YoJzonKTsKLSAgICAgIGludCBpbmRleE9mU2xhc2ggPSB1cmxTdHJpbmcuaW5kZXhPZignLycpOwotICAgICAgaWYoKGluZGV4T2ZDb2xvbiAhPSAtMSkgJiYgKGluZGV4T2ZTbGFzaCAhPSAtMSkgJiYgKGluZGV4T2ZDb2xvbiA8IGluZGV4T2ZTbGFzaCkpCi0gICAgICB7Ci0gICAgICAgIC8vIFRoZSB1cmwgKG9yIGZpbGVuYW1lLCBmb3IgdGhhdCBtYXR0ZXIpIGlzIGFic29sdXRlLgotICAgICAgICBpc0Fic29sdXRlVVJMID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaXNBYnNvbHV0ZVVSTCA9IGZhbHNlOwotICAgICAgfQotICAgICAgCi0gICAgICBpZihpc0Fic29sdXRlVVJMIHx8IChudWxsID09IGJhc2UpIHx8IChiYXNlLmxlbmd0aCgpID09IDApKQotICAgICAgewotICAgICAgICB0cnkgCi0gICAgICAgIHsKLSAgICAgICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7fQotICAgICAgfQotICAgICAgLy8gVGhlIEphdmEgVVJMIGhhbmRsaW5nIGRvZXNuJ3Qgc2VlbSB0byBoYW5kbGUgcmVsYXRpdmUgZmlsZSBuYW1lcy4KLSAgICAgIGVsc2UgaWYoISgodXJsU3RyaW5nLmNoYXJBdCgwKSA9PSAnLicpIHx8IChmaWxlU3RhcnRUeXBlID4gMCkpKQotICAgICAgewotICAgICAgICB0cnkgCi0gICAgICAgIHsKLSAgICAgICAgICBVUkwgYmFzZVVybCA9IG5ldyBVUkwoYmFzZSk7Ci0gICAgICAgICAgdXJsID0gbmV3IFVSTChiYXNlVXJsLCB1cmxTdHJpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBpZihudWxsID09IHVybCkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlbiB3ZSdyZSBnb2luZyB0byB0cnkgYW5kIG1ha2UgYSBmaWxlIFVSTCBiZWxvdywgc28gc3RyaXAgCi0gICAgICAgIC8vIG9mZiB0aGUgcHJvdG9jb2wgaGVhZGVyLgotICAgICAgICBpZih1cmxTdHJpbmcudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJmaWxlOi8iKSkKLSAgICAgICAgewotICAgICAgICAgIHVybFN0cmluZyA9IHVybFN0cmluZy5zdWJzdHJpbmcoNik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih1cmxTdHJpbmcudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJmaWxlOiIpKQotICAgICAgICB7Ci0gICAgICAgICAgdXJsU3RyaW5nID0gdXJsU3RyaW5nLnN1YnN0cmluZyg1KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBpZigobnVsbCA9PSB1cmwpICYmICgobnVsbCA9PSBiYXNlKSB8fCAoZmlsZVN0YXJ0VHlwZSA+IDApKSkKLSAgICAgIHsKLSAgICAgICAgaWYoMSA9PSBmaWxlU3RhcnRUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYobnVsbCAhPSBiYXNlKQotICAgICAgICAgICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKDYpOwotICAgICAgICAgIGZpbGVTdGFydFR5cGUgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoMiA9PSBmaWxlU3RhcnRUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYobnVsbCAhPSBiYXNlKQotICAgICAgICAgICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKDUpOwotICAgICAgICAgIGZpbGVTdGFydFR5cGUgPSAyOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSh1cmxTdHJpbmcpOwotICAgICAgICAKLSAgICAgICAgaWYoIWYuaXNBYnNvbHV0ZSgpICYmIChudWxsICE9IGJhc2UpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gU3RyaW5nIGRpciA9IGYuaXNEaXJlY3RvcnkoKSA/IGYuZ2V0QWJzb2x1dGVQYXRoKCkgOiBmLmdldFBhcmVudCgpOwotICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicHJlYnVpbHRVcmxTdHJpbmcgKDEpOiAiK2Jhc2UpOwotICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJhc2UsICJcXC8iKTsKLSAgICAgICAgICBTdHJpbmcgZml4ZWRCYXNlID0gbnVsbDsKLSAgICAgICAgICB3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IGZpeGVkQmFzZSkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFRoYW5rcyB0byBSaWNrIE1hZGR5IGZvciB0aGUgYnVnIGZpeCBmb3IgVU5JWCBoZXJlLgotICAgICAgICAgICAgICBpZiAoYmFzZS5jaGFyQXQoMCkgPT0gJ1xcJyB8fCBiYXNlLmNoYXJBdCgwKSA9PSAnLycpIAotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZml4ZWRCYXNlID0gRmlsZS5zZXBhcmF0b3IgKyB0b2tlbjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZml4ZWRCYXNlID0gdG9rZW47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZpeGVkQmFzZSs9IEZpbGUuc2VwYXJhdG9yICsgdG9rZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVidWlsdFVybFN0cmluZyAoMSk6ICIrZml4ZWRCYXNlKTsKLSAgICAgICAgICBmID0gbmV3IEZpbGUoZml4ZWRCYXNlKTsKLSAgICAgICAgICBTdHJpbmcgZGlyID0gZi5pc0RpcmVjdG9yeSgpID8gZi5nZXRBYnNvbHV0ZVBhdGgoKSA6IGYuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJkaXI6ICIrZGlyKTsKLSAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInVybFN0cmluZzogIit1cmxTdHJpbmcpOwotICAgICAgICAgIC8vIGYgPSBuZXcgRmlsZShkaXIsIHVybFN0cmluZyk7Ci0gICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJmICgxKTogIitmLnRvU3RyaW5nKCkpOwotICAgICAgICAgIC8vIHVybFN0cmluZyA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgZiA9IG5ldyBGaWxlKHVybFN0cmluZyk7IAotICAgICAgICAgIGJvb2xlYW4gaXNBYnNvbHV0ZSA9ICBmLmlzQWJzb2x1dGUoKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHVybFN0cmluZy5jaGFyQXQoIDAgKSA9PSAnXFwnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAodXJsU3RyaW5nLmNoYXJBdCggMCApID09ICcvJyk7Ci0gICAgICAgICAgaWYoIWlzQWJzb2x1dGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gR2V0dGluZyBtb3JlIGFuZCBtb3JlIHVnbHkuLi4KLSAgICAgICAgICAgIGlmKGRpci5jaGFyQXQoIGRpci5sZW5ndGgoKS0xICkgIT0gRmlsZS5zZXBhcmF0b3IuY2hhckF0KDApICYmIAotICAgICAgICAgICAgICAgdXJsU3RyaW5nLmNoYXJBdCggMCApICE9IEZpbGUuc2VwYXJhdG9yLmNoYXJBdCgwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdXJsU3RyaW5nID0gZGlyICsgRmlsZS5zZXBhcmF0b3IgKyB1cmxTdHJpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVybFN0cmluZyA9IGRpciArIHVybFN0cmluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJwcmVidWlsdFVybFN0cmluZyAoMik6ICIrdXJsU3RyaW5nKTsKLSAgICAgICAgICAgIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodXJsU3RyaW5nLCAiXFwvIik7Ci0gICAgICAgICAgICBTdHJpbmcgcmVidWlsdFVybFN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICB3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgIGlmIChudWxsID09IHJlYnVpbHRVcmxTdHJpbmcpIAotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVGhhbmtzIHRvIFJpY2sgTWFkZHkgZm9yIHRoZSBidWcgZml4IGZvciBVTklYIGhlcmUuCi0gICAgICAgICAgICAgICAgaWYgKHVybFN0cmluZy5jaGFyQXQoMCkgPT0gJ1xcJyB8fCB1cmxTdHJpbmcuY2hhckF0KDApID09ICcvJykgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVidWlsdFVybFN0cmluZyA9IEZpbGUuc2VwYXJhdG9yICsgdG9rZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVidWlsdFVybFN0cmluZyA9IHRva2VuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVidWlsdFVybFN0cmluZys9IEZpbGUuc2VwYXJhdG9yICsgdG9rZW47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVidWlsdFVybFN0cmluZyAoMik6ICIrcmVidWlsdFVybFN0cmluZyk7Ci0gICAgICAgICAgICBpZihudWxsICE9IHJlYnVpbHRVcmxTdHJpbmcpCi0gICAgICAgICAgICAgIHVybFN0cmluZyA9IHJlYnVpbHRVcmxTdHJpbmc7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiZmlsZVN0YXJ0VHlwZTogIitmaWxlU3RhcnRUeXBlKTsKLSAgICAgICAgICBpZigxID09IGZpbGVTdGFydFR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHVybFN0cmluZy5jaGFyQXQoMCkgPT0gJy8nKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdXJsU3RyaW5nID0gImZpbGU6Ly8iK3VybFN0cmluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdXJsU3RyaW5nID0gImZpbGU6LyIrdXJsU3RyaW5nOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmKDIgPT0gZmlsZVN0YXJ0VHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cmxTdHJpbmcgPSAiZmlsZToiK3VybFN0cmluZzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdHJ5IAotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRmluYWwgYmVmb3JlIHRyeTogIit1cmxTdHJpbmcpOwotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgdHJ5aW5nIHRvIG1ha2UgVVJMIGZyb20gIit1cmxTdHJpbmcpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYobnVsbCA9PSB1cmwpCi0gICAgICB7Ci0gICAgICAgIC8vIFRoZSBzdW4gamF2YSBWTSBkb2Vzbid0IGRvIHRoaXMgY29ycmVjdGx5LCBidXQgSSdsbCAKLSAgICAgICAgLy8gdHJ5IGl0IGhlcmUgYXMgYSBzZWNvbmQtdG8tbGFzdCByZXNvcnQuCi0gICAgICAgIGlmKChudWxsICE9IG9yaWdCYXNlKSAmJiAob3JpZ0Jhc2UubGVuZ3RoKCkgPiAwKSkKLSAgICAgICAgewotICAgICAgICAgIHRyeSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBVUkwgYmFzZVVSTCA9IG5ldyBVUkwob3JpZ0Jhc2UpOwotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJUcnlpbmcgdG8gbWFrZSBVUkwgZnJvbSAiK29yaWdCYXNlKyIgYW5kICIrb3JpZ1VSTFN0cmluZyk7Ci0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKGJhc2VVUkwsIG9yaWdVUkxTdHJpbmcpOwotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdWNjZXNzISBOZXcgVVJMIGlzOiAiK3VybC50b1N0cmluZygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHRyeWluZyB0byBtYWtlIFVSTCBmcm9tICIrb3JpZ0Jhc2UrIiBhbmQgIitvcmlnVVJMU3RyaW5nKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKG51bGwgPT0gdXJsKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5IAotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBsYXN0UGFydDsKLSAgICAgICAgICAgIGlmKG51bGwgIT0gb3JpZ0Jhc2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZpbGUgYmFzZUZpbGUgPSBuZXcgRmlsZShvcmlnQmFzZSk7Ci0gICAgICAgICAgICAgIGlmKGJhc2VGaWxlLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsYXN0UGFydCA9IG5ldyBGaWxlKGJhc2VGaWxlLCB1cmxTdHJpbmcpLmdldEFic29sdXRlUGF0aCAoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50RGlyID0gYmFzZUZpbGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgbGFzdFBhcnQgPSBuZXcgRmlsZShwYXJlbnREaXIsIHVybFN0cmluZykuZ2V0QWJzb2x1dGVQYXRoICgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxhc3RQYXJ0ID0gbmV3IEZpbGUgKHVybFN0cmluZykuZ2V0QWJzb2x1dGVQYXRoICgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSGFjawotICAgICAgICAgICAgLy8gaWYoKGxhc3RQYXJ0LmNoYXJBdCgwKSA9PSAnLycpICYmIChsYXN0UGFydC5jaGFyQXQoMikgPT0gJzonKSkKLSAgICAgICAgICAgIC8vICAgbGFzdFBhcnQgPSBsYXN0UGFydC5zdWJzdHJpbmcoMSwgbGFzdFBhcnQubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGZ1bGxwYXRoOwotICAgICAgICAgICAgaWYgKGxhc3RQYXJ0LmNoYXJBdCgwKSA9PSAnXFwnIHx8IGxhc3RQYXJ0LmNoYXJBdCgwKSA9PSAnLycpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmdWxscGF0aCA9ICJmaWxlOi8vIiArIGxhc3RQYXJ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmdWxscGF0aCA9ICJmaWxlOiIgKyBsYXN0UGFydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoZnVsbHBhdGgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgdXJsIGZvcjogIiArIHVybFN0cmluZywgZTIgKTsgCi0gICAgICAgICAgICAgIC8vWFNMTWVzc2FnZXMuY3JlYXRlWFBBVEhNZXNzYWdlKFhQQVRIRXJyb3JSZXNvdXJjZXMuRVJfQ0FOTk9UX0NSRUFURV9VUkwsIG5ldyBPYmplY3RbXXt1cmxTdHJpbmd9KSxlMik7IC8vIkNhbm5vdCBjcmVhdGUgdXJsIGZvcjogIiArIHVybFN0cmluZywgZTIgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gc2UpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHVybCA9IG5ldyBVUkwoImh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0LyIramF2YS5sYW5nLk1hdGgucmFuZG9tKCkpOyAvLyBkdW1teQotICAgICAgfQotICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMikKLSAgICAgIHsKLSAgICAgICAgLy8gSSBnaXZlIHVwCi0gICAgICB9Ci0gICAgfQotICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigidXJsOiAiK3VybC50b1N0cmluZygpKTsKLSAgICByZXR1cm4gdXJsOwotICB9Ci0KLSAgIC8qKgotICAgKiBBZGQgYSB0cmFjZSBsaXN0ZW5lciBmb3IgdGhlIHB1cnBvc2VzIG9mIGRlYnVnZ2luZyBhbmQgZGlhZ25vc2lzLgotICAgKiBAcGFyYW0gdGwgVHJhY2UgbGlzdGVuZXIgdG8gYmUgYWRkZWQuCi0gICAqLwotICB2b2lkIGFkZFRyYWNlTGlzdGVuZXJzVG9TdHlsZXNoZWV0KCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICAvKnRyeQotICAgIHsKLSAgICAgIFRyYWNlTWFuYWdlciB0bSA9IG1fdHJhbnNmb3JtZXJJbXBsLmdldFRyYWNlTWFuYWdlcigpOwotICAgICAgaWYodG0uaGFzVHJhY2VMaXN0ZW5lcnMpCi0gICAgICB7Ci0gICAgICAgIGludCBuTGlzdGVuZXJzID0gdG0uc2l6ZSgpOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbkxpc3RlbmVyczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgVHJhY2VMaXN0ZW5lciB0bCA9IChUcmFjZUxpc3RlbmVyKW1fdHJhY2VMaXN0ZW5lcnMuZWxlbWVudEF0KGkpOwotICAgICAgICAgIGlmKG51bGwgIT0gbV9zdHlsZXNoZWV0Um9vdCkKLSAgICAgICAgICAgIG1fc3R5bGVzaGVldFJvb3QuYWRkVHJhY2VMaXN0ZW5lcih0bCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbiB0bWxlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZShYU0xURXJyb3JSZXNvdXJjZXMuRVJfVE9PX01BTllfTElTVEVORVJTLCBudWxsKSx0bWxlICk7IC8vImFkZFRyYWNlTGlzdGVuZXJzVG9TdHlsZXNoZWV0IC0gVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbiIsIHRtbGUpOwotICAgIH0qLwotICB9Ci0gIAotICAvKioKLSAgICogV2FybiB0aGUgdXNlciBvZiBhbiBwcm9ibGVtLgotICAgKiBUaGlzIGlzIHB1YmxpYyBmb3IgYWNjZXNzIGJ5IGV4dGVuc2lvbnMuCi0gICAqIEBleGNlcHRpb24gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWN0aXZlIFByb2JsZW1MaXN0ZW5lciBhbmQgWE1MUGFyc2VyTGlhaXNvbiBkZWNpZGUKLSAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIG1lc3NhZ2UoU3RyaW5nIG1zZykKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBtZXNzYWdlKG51bGwsIG51bGwsIG1zZyk7Ci0gIH0KLQotCi0KLSAgLyoqCi0gICAqIFdhcm4gdGhlIHVzZXIgb2YgYW4gcHJvYmxlbS4KLSAgICogVGhpcyBpcyBwdWJsaWMgZm9yIGFjY2VzcyBieSBleHRlbnNpb25zLgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhNTFBhcnNlckxpYWlzb24gZGVjaWRlCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBtZXNzYWdlKE5vZGUgc3R5bGVOb2RlLCBOb2RlIHNvdXJjZU5vZGUsIFN0cmluZyBtc2cpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgbV9wcm9ibGVtTGlzdGVuZXIubWVzc2FnZShtc2cpOwotICB9Ci0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBXYXJuIHRoZSB1c2VyIG9mIGFuIHByb2JsZW0uCi0gICAqIEBleGNlcHRpb24gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWN0aXZlIFByb2JsZW1MaXN0ZW5lciBhbmQgWE1MUGFyc2VyTGlhaXNvbiBkZWNpZGUKLSAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdhcm4oaW50IG1zZykKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICB3YXJuKG51bGwsIG51bGwsIG1zZywgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImludGVybmFsIi8+Ci0gICAqIFdhcm4gdGhlIHVzZXIgb2YgYW4gcHJvYmxlbS4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgd2FybihpbnQgbXNnLCBPYmplY3RbXSBhcmdzKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIHdhcm4obnVsbCwgbnVsbCwgbXNnLCBhcmdzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgICogV2FybiB0aGUgdXNlciBvZiBhbiBwcm9ibGVtLgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhNTFBhcnNlckxpYWlzb24gZGVjaWRlCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3YXJuKE5vZGUgc3R5bGVOb2RlLCBOb2RlIHNvdXJjZU5vZGUsIGludCBtc2cpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgd2FybihzdHlsZU5vZGUsIHNvdXJjZU5vZGUsIG1zZywgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImludGVybmFsIi8+Ci0gICAqIFdhcm4gdGhlIHVzZXIgb2YgYW4gcHJvYmxlbS4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgd2FybihOb2RlIHN0eWxlTm9kZSwgTm9kZSBzb3VyY2VOb2RlLCBpbnQgbXNnLCBPYmplY3QgYXJnc1tdKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIEV4Y2VwdGlvbiBlID0gbnVsbDsKLSAgICBTdHJpbmcgZm1zZyA9IG1fWFNMTWVzc2FnZXMuY3JlYXRlV2FybmluZyhtc2csIGFyZ3MpOwotICAgIFNvdXJjZUxvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0gICAgdHJ5ewotICAgICBsb2NhdG9yID0gKChTdHlsZXNoZWV0SGFuZGxlcikoKChUcmFuc2Zvcm1lckZhY3RvcnlJbXBsKXRoaXMubV90ZmFjdG9yeSkubmV3VGVtcGxhdGVzSGFuZGxlcigpKSkuZ2V0TG9jYXRvcigpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHRjZSkKLSAgICB7Ci0gICAgfQotICAgIAotICAgIERlZmF1bHRFcnJvckhhbmRsZXIgaGFuZGxlcjsKLSAgICBpZiAobV9wcm9ibGVtTGlzdGVuZXIgPT0gbnVsbCkKLSAgICAgIGhhbmRsZXIgPSAoRGVmYXVsdEVycm9ySGFuZGxlciltX3RmYWN0b3J5LmdldEVycm9yTGlzdGVuZXIoKTsKLSAgICBlbHNlCi0gICAgICBoYW5kbGVyID0gKERlZmF1bHRFcnJvckhhbmRsZXIpbV9wcm9ibGVtTGlzdGVuZXIuZ2V0RXJyb3JIYW5kbGVyKCk7Ci0gICAgVHJhbnNmb3JtZXJFeGNlcHRpb24gdGUgPSAobnVsbCA9PSBlKSA/IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihmbXNnLCBsb2NhdG9yKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oZm1zZywgbG9jYXRvciwgZSk7Ci0gICAgaWYobnVsbCAhPSBoYW5kbGVyKQotICAgIHsKLSAgICAgIHRyeXsKLSAgICAgIGhhbmRsZXIud2FybmluZyh0ZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gdGUyKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKHRlMik7Ci0gICAgICB9IAotICAgIH0KLSAgICBlbHNlCi0gICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKHRlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgICogVGVsbCB0aGUgdXNlciBvZiBhbiBlcnJvciwgYW5kIHByb2JhYmx5IHRocm93IGFuCi0gICAqIGV4Y2VwdGlvbi4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIG1zZykKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgU291cmNlTG9jYXRvciBsb2NhdG9yID0gbnVsbDsKLSAgICB0cnl7Ci0gICAgbG9jYXRvciA9ICgoU3R5bGVzaGVldEhhbmRsZXIpKCgoVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCl0aGlzLm1fdGZhY3RvcnkpLm5ld1RlbXBsYXRlc0hhbmRsZXIoKSkpLmdldExvY2F0b3IoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpCi0gICAgewotICAgIH0KLSAgICBEZWZhdWx0RXJyb3JIYW5kbGVyIGhhbmRsZXI7Ci0gICAgaWYgKG1fcHJvYmxlbUxpc3RlbmVyID09IG51bGwpCi0gICAgICBoYW5kbGVyID0gKERlZmF1bHRFcnJvckhhbmRsZXIpbV90ZmFjdG9yeS5nZXRFcnJvckxpc3RlbmVyKCk7Ci0gICAgZWxzZQotICAgICAgaGFuZGxlciA9IChEZWZhdWx0RXJyb3JIYW5kbGVyKW1fcHJvYmxlbUxpc3RlbmVyLmdldEVycm9ySGFuZGxlcigpOwotICAgIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlID0gKG51bGwgPT0gZSkgPyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24obXNnLCBsb2NhdG9yKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24obXNnLCBsb2NhdG9yLCBlKTsKLSAgICBpZihudWxsICE9IGhhbmRsZXIpCi0gICAgeyAgCi0gICAgICB0cnl7Ci0gICAgICBoYW5kbGVyLmZhdGFsRXJyb3IodGUpOwotICAgIH0KLSAgICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiB0ZTIpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGUyKTsKLSAgICAgIH0gCi0gICAgfQotICAgIGVsc2UKLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBUZWxsIHRoZSB1c2VyIG9mIGFuIGVycm9yLCBhbmQgcHJvYmFibHkgdGhyb3cgYW4KLSAgICogZXhjZXB0aW9uLgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhNTFBhcnNlckxpYWlzb24gZGVjaWRlCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcnJvcihpbnQgbXNnKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIGVycm9yKG51bGwsIG51bGwsIG1zZywgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImludGVybmFsIi8+Ci0gICAqIFRlbGwgdGhlIHVzZXIgb2YgYW4gZXJyb3IsIGFuZCBwcm9iYWJseSB0aHJvdyBhbgotICAgKiBleGNlcHRpb24uCi0gICAqIEBleGNlcHRpb24gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWN0aXZlIFByb2JsZW1MaXN0ZW5lciBhbmQgWE1MUGFyc2VyTGlhaXNvbiBkZWNpZGUKLSAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVycm9yKGludCBtc2csIE9iamVjdFtdIGFyZ3MpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgZXJyb3IobnVsbCwgbnVsbCwgbXNnLCBhcmdzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgICogVGVsbCB0aGUgdXNlciBvZiBhbiBlcnJvciwgYW5kIHByb2JhYmx5IHRocm93IGFuCi0gICAqIGV4Y2VwdGlvbi4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXJyb3IoaW50IG1zZywgRXhjZXB0aW9uIGUpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgZXJyb3IobXNnLCBudWxsLCBlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgICogVGVsbCB0aGUgdXNlciBvZiBhbiBlcnJvciwgYW5kIHByb2JhYmx5IHRocm93IGFuCi0gICAqIGV4Y2VwdGlvbi4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXJyb3IoaW50IG1zZywgT2JqZWN0IGFyZ3NbXSwgRXhjZXB0aW9uIGUpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGZtc2cgPSBtX1hTTE1lc3NhZ2VzLmNyZWF0ZU1lc3NhZ2UobXNnLCBhcmdzKTsKLSAgICBTb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotICAgIHRyeXsKLSAgICAgIGxvY2F0b3IgPSAoKFN0eWxlc2hlZXRIYW5kbGVyKSgoKFRyYW5zZm9ybWVyRmFjdG9yeUltcGwpdGhpcy5tX3RmYWN0b3J5KS5uZXdUZW1wbGF0ZXNIYW5kbGVyKCkpKS5nZXRMb2NhdG9yKCk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgIHsKLSAgICB9Ci0gICAgRGVmYXVsdEVycm9ySGFuZGxlciBoYW5kbGVyOwotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciA9PSBudWxsKQotICAgICAgaGFuZGxlciA9IChEZWZhdWx0RXJyb3JIYW5kbGVyKW1fdGZhY3RvcnkuZ2V0RXJyb3JMaXN0ZW5lcigpOwotICAgIGVsc2UKLSAgICAgIGhhbmRsZXIgPSAoRGVmYXVsdEVycm9ySGFuZGxlciltX3Byb2JsZW1MaXN0ZW5lci5nZXRFcnJvckhhbmRsZXIoKTsKLSAgICBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB0ZSA9IChudWxsID09IGUpID8gbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGZtc2csIGxvY2F0b3IpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihmbXNnLCBsb2NhdG9yLCBlKTsKLSAgICBpZihudWxsICE9IGhhbmRsZXIpCi0gICAgewotICAgICAgdHJ5ewotICAgICAgaGFuZGxlci5mYXRhbEVycm9yKHRlKTsKLSAgICB9Ci0gICAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gdGUyKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKHRlMik7Ci0gICAgICB9IAotICAgIH0KLSAgICBlbHNlCi0gICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKHRlKTsKLSAgfQotCi0gIC8qKgotICAgICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImludGVybmFsIi8+Ci0gICogVGVsbCB0aGUgdXNlciBvZiBhbiBlcnJvciwgYW5kIHByb2JhYmx5IHRocm93IGFuCi0gICAqIGV4Y2VwdGlvbi4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXJyb3IoTm9kZSBzdHlsZU5vZGUsIE5vZGUgc291cmNlTm9kZSwgaW50IG1zZykKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBlcnJvcihzdHlsZU5vZGUsIHNvdXJjZU5vZGUsIG1zZywgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImludGVybmFsIi8+Ci0gICAqIFRlbGwgdGhlIHVzZXIgb2YgYW4gZXJyb3IsIGFuZCBwcm9iYWJseSB0aHJvdyBhbgotICAgKiBleGNlcHRpb24uCi0gICAqIEBleGNlcHRpb24gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWN0aXZlIFByb2JsZW1MaXN0ZW5lciBhbmQgWE1MUGFyc2VyTGlhaXNvbiBkZWNpZGUKLSAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVycm9yKE5vZGUgc3R5bGVOb2RlLCBOb2RlIHNvdXJjZU5vZGUsIGludCBtc2csIE9iamVjdCBhcmdzW10pCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgRXhjZXB0aW9uIGUgPSBudWxsOwotICAgIFN0cmluZyBmbXNnID0gbV9YU0xNZXNzYWdlcy5jcmVhdGVNZXNzYWdlKG1zZywgYXJncyk7Ci0gICAgU291cmNlTG9jYXRvciBsb2NhdG9yID0gbnVsbDsKLSAgICB0cnl7Ci0gICAgIGxvY2F0b3IgPSAoKFN0eWxlc2hlZXRIYW5kbGVyKSgoKFRyYW5zZm9ybWVyRmFjdG9yeUltcGwpdGhpcy5tX3RmYWN0b3J5KS5uZXdUZW1wbGF0ZXNIYW5kbGVyKCkpKS5nZXRMb2NhdG9yKCk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgIHsKLSAgICB9Ci0gICAgRGVmYXVsdEVycm9ySGFuZGxlciBoYW5kbGVyOwotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciA9PSBudWxsKQotICAgICAgaGFuZGxlciA9IChEZWZhdWx0RXJyb3JIYW5kbGVyKW1fdGZhY3RvcnkuZ2V0RXJyb3JMaXN0ZW5lcigpOwotICAgIGVsc2UKLSAgICAgIGhhbmRsZXIgPSAoRGVmYXVsdEVycm9ySGFuZGxlciltX3Byb2JsZW1MaXN0ZW5lci5nZXRFcnJvckhhbmRsZXIoKTsKLSAgICBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB0ZSA9IChudWxsID09IGUpID8gbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGZtc2csIGxvY2F0b3IpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihmbXNnLCBsb2NhdG9yLCBlKTsKLSAgICBpZihudWxsICE9IGhhbmRsZXIpCi0gICAgeyAgCi0gICAgICB0cnl7Ci0gICAgICAgaGFuZGxlci5mYXRhbEVycm9yKHRlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiB0ZTIpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGUyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0ZSk7Ci0gICAgCi0gICAKLSAgfQotICAKLSAgLyoqCi0gICAqIE1hcmsgdGhlIHRpbWUsIHNvIHRoYXQgZGlzcGxheUR1cmF0aW9uIGNhbiBsYXRlcgotICAgKiBkaXNwbGF5IHRoZSBlbGFwc2UuCi0gICAqLwotICB2b2lkIHB1c2hUaW1lKE9iamVjdCBrZXkpCi0gIHsKLSAgICBpZihudWxsICE9IGtleSkKLSAgICB7Ci0gICAgICBtX2R1cmF0aW9uc1RhYmxlLnB1dChrZXksIG5ldyBMb25nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGR1cmF0aW9uIHNpbmNlIHB1c2hUaW1lIHdhcyBjYWxsZWQsCi0gICAqIGluIG1pbGxpc2Vjb25kcy4KLSAgICovCi0gIGxvbmcgcG9wRHVyYXRpb24oT2JqZWN0IGtleSkKLSAgewotICAgIGxvbmcgbWlsbGlzZWNvbmRzRHVyYXRpb24gPSAwOwotICAgIGlmKG51bGwgIT0ga2V5KQotICAgIHsKLSAgICAgIGxvbmcgc3RhcnQgPSAoKExvbmcpbV9kdXJhdGlvbnNUYWJsZS5nZXQoa2V5KSkubG9uZ1ZhbHVlKCk7Ci0gICAgICBsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIG1pbGxpc2Vjb25kc0R1cmF0aW9uID0gc3RvcCAtIHN0YXJ0OwotICAgICAgbV9kdXJhdGlvbnNUYWJsZS5yZW1vdmUoa2V5KTsKLSAgICB9Ci0gICAgcmV0dXJuIG1pbGxpc2Vjb25kc0R1cmF0aW9uOwotICB9Ci0gIAotICAgLyoqCi0gICAqIERpc3BsYXkgdGhlIGR1cmF0aW9uIHNpbmNlIHB1c2hUaW1lIHdhcyBjYWxsZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5RHVyYXRpb24oU3RyaW5nIGluZm8sIE9iamVjdCBrZXkpCi0gIHsKLSAgICBsb25nIG1pbGxpc2Vjb25kc0R1cmF0aW9uID0gMDsKLSAgICBpZihudWxsICE9IGtleSkKLSAgICB7Ci0gICAgICBsb25nIHN0YXJ0ID0gKChMb25nKW1fZHVyYXRpb25zVGFibGUuZ2V0KGtleSkpLmxvbmdWYWx1ZSgpOwotICAgICAgbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBtaWxsaXNlY29uZHNEdXJhdGlvbiA9IHN0b3AgLSBzdGFydDsKLSAgICAgIGlmKG51bGwgIT0gbV9kaWFnbm9zdGljc1ByaW50V3JpdGVyKQotICAgICAgewotICAgICAgICBtX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIucHJpbnRsbihpbmZvICsgIiB0b29rICIgKyBtaWxsaXNlY29uZHNEdXJhdGlvbiArICIgbWlsbGlzZWNvbmRzIik7Ci0gICAgICB9Ci0gICAgICBtX2R1cmF0aW9uc1RhYmxlLnJlbW92ZShrZXkpOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgc2V0LCBkaWFnbm9zdGljcyB3aWxsIGJlCi0gICAqIHdyaXR0ZW4gdG8gdGhlIG1fZGlhZ25vc3RpY3NQcmludFdyaXRlciBzdHJlYW0uIElmCi0gICAqIHRoZSB2YWx1ZSBpcyBudWxsLCB0aGVuIGRpYWdub3N0aWNzIHdpbGwgYmUgdHVybmVkCi0gICAqIG9mZi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERpYWdub3N0aWNzT3V0cHV0KGphdmEuaW8uT3V0cHV0U3RyZWFtIG91dCkKLSAgewotICAgIHNldERpYWdub3N0aWNzT3V0cHV0KG5ldyBQcmludFdyaXRlcihvdXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIHNldCwgZGlhZ25vc3RpY3Mgd2lsbCBiZQotICAgKiB3cml0dGVuIHRvIHRoZSBtX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIgc3RyZWFtLiBJZgotICAgKiB0aGUgdmFsdWUgaXMgbnVsbCwgdGhlbiBkaWFnbm9zdGljcyB3aWxsIGJlIHR1cm5lZAotICAgKiBvZmYuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREaWFnbm9zdGljc091dHB1dChqYXZhLmlvLlByaW50V3JpdGVyIHB3KQotICB7Ci0gICAgbV9kaWFnbm9zdGljc1ByaW50V3JpdGVyID0gcHc7Ci0gICAvKiBpZihnZXRQcm9ibGVtTGlzdGVuZXIoKSBpbnN0YW5jZW9mIFByb2JsZW1MaXN0ZW5lckRlZmF1bHQpCi0gICAgewotICAgICAgKChQcm9ibGVtTGlzdGVuZXJEZWZhdWx0KWdldFByb2JsZW1MaXN0ZW5lcigpKS5zZXREaWFnbm9zdGljc091dHB1dChwdyk7Ci0gICAgfSovCi0gIH0KLQotICAvKioKLSAgICogQm90dGxlbmVjayBvdXRwdXQgb2YgZGlhZ25vc3RpY3MuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkaWFnKFN0cmluZyBzKQotICB7Ci0gICAgaWYobnVsbCAhPSBtX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIpCi0gICAgewotICAgICAgbV9kaWFnbm9zdGljc1ByaW50V3JpdGVyLnByaW50bG4ocyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsIHNpbXBsZSB0cmFjZXMgb2YKLSAgICogdGVtcGxhdGUgY2FsbHMgYXJlIG1hZGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUcmFjZVRlbXBsYXRlcyhib29sZWFuIGIpCi0gIHsKLSAgICBtX3RyYWNlVGVtcGxhdGVzID0gYjsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCBzaW1wbGUgdHJhY2VzIG9mCi0gICAqIHRlbXBsYXRlIGNhbGxzIGFyZSBtYWRlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHJhY2VTZWxlY3QoYm9vbGVhbiBiKQotICB7Ci0gICAgbV90cmFjZVNlbGVjdHMgPSBiOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsIGRlYnVnIGRpYWdub3N0aWNzIGFib3V0Ci0gICAqIHRlbXBsYXRlIGNoaWxkcmVuIGFzIHRoZXkgYXJlIGJlaW5nIGNvbnN0cnVjdGVkCi0gICAqIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbV9kaWFnbm9zdGljc1ByaW50V3JpdGVyCi0gICAqIHN0cmVhbS4gIGRpYWdub3NlVGVtcGxhdGVDaGlsZHJlbiBpcyBmYWxzZSBieQotICAgKiBkZWZhdWx0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHJhY2VUZW1wbGF0ZUNoaWxkcmVuKGJvb2xlYW4gYikKLSAgewotICAgIG1fdHJhY2VUZW1wbGF0ZUNoaWxkcmVuID0gYjsKLSAgfQotICAKLSAgLy8KLSAgLy8gTGV4aWNhbCBoYW5kbGVyIGludGVyZmFjZQotICAvLwotCi0gICAgLyoqCi0gICAgICogUmVwb3J0IHRoZSBzdGFydCBvZiBEVEQgZGVjbGFyYXRpb25zLCBpZiBhbnkuCi0gICAgICoKLSAgICAgKiA8cD5BbnkgZGVjbGFyYXRpb25zIGFyZSBhc3N1bWVkIHRvIGJlIGluIHRoZSBpbnRlcm5hbCBzdWJzZXQKLSAgICAgKiB1bmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBieSBhIHtAbGluayAjc3RhcnRFbnRpdHkgc3RhcnRFbnRpdHl9Ci0gICAgICogZXZlbnQuPC9wPgotICAgICAqCi0gICAgICogPHA+Tm90ZSB0aGF0IHRoZSBzdGFydC9lbmREVEQgZXZlbnRzIHdpbGwgYXBwZWFyIHdpdGhpbgotICAgICAqIHRoZSBzdGFydC9lbmREb2N1bWVudCBldmVudHMgZnJvbSBDb250ZW50SGFuZGxlciBhbmQKLSAgICAgKiBiZWZvcmUgdGhlIGZpcnN0IHN0YXJ0RWxlbWVudCBldmVudC48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZG9jdW1lbnQgdHlwZSBuYW1lLgotICAgICAqIEBwYXJhbSBwdWJsaWNJZCBUaGUgZGVjbGFyZWQgcHVibGljIGlkZW50aWZpZXIgZm9yIHRoZQotICAgICAqICAgICAgICBleHRlcm5hbCBEVEQgc3Vic2V0LCBvciBudWxsIGlmIG5vbmUgd2FzIGRlY2xhcmVkLgotICAgICAqIEBwYXJhbSBzeXN0ZW1JZCBUaGUgZGVjbGFyZWQgc3lzdGVtIGlkZW50aWZpZXIgZm9yIHRoZQotICAgICAqICAgICAgICBleHRlcm5hbCBEVEQgc3Vic2V0LCBvciBudWxsIGlmIG5vbmUgd2FzIGRlY2xhcmVkLgotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4KLSAgICAgKiAgICAgICAgICAgIGV4Y2VwdGlvbi4KLSAgICAgKiBAc2VlICNlbmREVEQKLSAgICAgKiBAc2VlICNzdGFydEVudGl0eQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RFREIChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0JdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsICYmIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0TGV4aWNhbEhhbmRsZXIoKSAhPSBudWxsKQotICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dExleGljYWxIYW5kbGVyKCkuc3RhcnREVEQobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCB0aGUgZW5kIG9mIERURCBkZWNsYXJhdGlvbnMuCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICAgKiBAc2VlICNzdGFydERURAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZERURCAoKQotCXRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAobV90cmFuc2Zvcm1lckltcGwgIT0gbnVsbCAmJiBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dExleGljYWxIYW5kbGVyKCkgIT0gbnVsbCkKLSAgICAgICAgbV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRMZXhpY2FsSGFuZGxlcigpLmVuZERURCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudGl0eSAoU3RyaW5nIG5hbWUpCi0JdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsICYmIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0TGV4aWNhbEhhbmRsZXIoKSAhPSBudWxsKQotICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dExleGljYWxIYW5kbGVyKCkuc3RhcnRFbnRpdHkgKG5hbWUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVwb3J0IHRoZSBlbmQgb2YgYW4gZW50aXR5LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGVuZGluZy4KLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICAgKiBAc2VlICNzdGFydEVudGl0eQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZEVudGl0eSAoU3RyaW5nIG5hbWUpCi0JdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwgJiYgbV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRMZXhpY2FsSGFuZGxlcigpICE9IG51bGwpCi0gICAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0TGV4aWNhbEhhbmRsZXIoKS5lbmRFbnRpdHkgKG5hbWUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVwb3J0IHRoZSBzdGFydCBvZiBhIENEQVRBIHNlY3Rpb24uCi0gICAgICoKLSAgICAgKiA8cD5UaGUgY29udGVudHMgb2YgdGhlIENEQVRBIHNlY3Rpb24gd2lsbCBiZSByZXBvcnRlZCB0aHJvdWdoCi0gICAgICogdGhlIHJlZ3VsYXIge0BsaW5rIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2NoYXJhY3RlcnMKLSAgICAgKiBjaGFyYWN0ZXJzfSBldmVudC48L3A+Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICAgKiBAc2VlICNlbmRDREFUQQotICAgICAqLwotICAgIHB1YmxpYyAgdm9pZCBzdGFydENEQVRBICgpCi0JdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsgCi0gICAgICBpZiAobV90cmFuc2Zvcm1lckltcGwgIT0gbnVsbCAmJiBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dExleGljYWxIYW5kbGVyKCkgIT0gbnVsbCkKLSAgICAgICAgbV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRMZXhpY2FsSGFuZGxlcigpLnN0YXJ0Q0RBVEEoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCB0aGUgZW5kIG9mIGEgQ0RBVEEgc2VjdGlvbi4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotICAgICAqIEBzZWUgI3N0YXJ0Q0RBVEEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSAoKQotCXRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAobV90cmFuc2Zvcm1lckltcGwgIT0gbnVsbCAmJiBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dExleGljYWxIYW5kbGVyKCkgIT0gbnVsbCkKLSAgICAgICAgbV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRMZXhpY2FsSGFuZGxlcigpLmVuZENEQVRBKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgYW4gWE1MIGNvbW1lbnQgYW55d2hlcmUgaW4gdGhlIGRvY3VtZW50LgotICAgICAqCi0gICAgICogPHA+VGhpcyBjYWxsYmFjayB3aWxsIGJlIHVzZWQgZm9yIGNvbW1lbnRzIGluc2lkZSBvciBvdXRzaWRlIHRoZQotICAgICAqIGRvY3VtZW50IGVsZW1lbnQsIGluY2x1ZGluZyBjb21tZW50cyBpbiB0aGUgZXh0ZXJuYWwgRFRECi0gICAgICogc3Vic2V0IChpZiByZWFkKS48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY2ggQW4gYXJyYXkgaG9sZGluZyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgY29tbWVudC4KLSAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UgZnJvbSB0aGUgYXJyYXkuCi0gICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljICB2b2lkIGNvbW1lbnQgKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotCXRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsICYmIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0TGV4aWNhbEhhbmRsZXIoKSAhPSBudWxsKQotICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dExleGljYWxIYW5kbGVyKCkuY29tbWVudCAoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgIH0KLSAgICAKLSAgICAvLyBEb2N1bWVudEhhbmRsZXIgaW50ZXJmYWNlCi0gICAgCi0gICAgICAgIC8qKgotICAgICAqIFJlY2VpdmUgYW4gb2JqZWN0IGZvciBsb2NhdGluZyB0aGUgb3JpZ2luIG9mIFNBWCBkb2N1bWVudCBldmVudHMuCi0gICAgICoKLSAgICAgKiA8cD5TQVggcGFyc2VycyBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCAodGhvdWdoIG5vdCBhYnNvbHV0ZWx5Ci0gICAgICogcmVxdWlyZWQpIHRvIHN1cHBseSBhIGxvY2F0b3I6IGlmIGl0IGRvZXMgc28sIGl0IG11c3Qgc3VwcGx5Ci0gICAgICogdGhlIGxvY2F0b3IgdG8gdGhlIGFwcGxpY2F0aW9uIGJ5IGludm9raW5nIHRoaXMgbWV0aG9kIGJlZm9yZQotICAgICAqIGludm9raW5nIGFueSBvZiB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGUgRG9jdW1lbnRIYW5kbGVyCi0gICAgICogaW50ZXJmYWNlLjwvcD4KLSAgICAgKgotICAgICAqIDxwPlRoZSBsb2NhdG9yIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBlbmQKLSAgICAgKiBwb3NpdGlvbiBvZiBhbnkgZG9jdW1lbnQtcmVsYXRlZCBldmVudCwgZXZlbiBpZiB0aGUgcGFyc2VyIGlzCi0gICAgICogbm90IHJlcG9ydGluZyBhbiBlcnJvci4gIFR5cGljYWxseSwgdGhlIGFwcGxpY2F0aW9uIHdpbGwKLSAgICAgKiB1c2UgdGhpcyBpbmZvcm1hdGlvbiBmb3IgcmVwb3J0aW5nIGl0cyBvd24gZXJyb3JzIChzdWNoIGFzCi0gICAgICogY2hhcmFjdGVyIGNvbnRlbnQgdGhhdCBkb2VzIG5vdCBtYXRjaCBhbiBhcHBsaWNhdGlvbidzCi0gICAgICogYnVzaW5lc3MgcnVsZXMpLiAgVGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoZSBsb2NhdG9yCi0gICAgICogaXMgcHJvYmFibHkgbm90IHN1ZmZpY2llbnQgZm9yIHVzZSB3aXRoIGEgc2VhcmNoIGVuZ2luZS48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIGxvY2F0b3Igd2lsbCByZXR1cm4gY29ycmVjdCBpbmZvcm1hdGlvbiBvbmx5Ci0gICAgICogZHVyaW5nIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBldmVudHMgaW4gdGhpcyBpbnRlcmZhY2UuICBUaGUKLSAgICAgKiBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGF0IGFueSBvdGhlciB0aW1lLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhdG9yIEFuIG9iamVjdCB0aGF0IGNhbiByZXR1cm4gdGhlIGxvY2F0aW9uIG9mCi0gICAgICogICAgICAgICAgICAgICAgYW55IFNBWCBkb2N1bWVudCBldmVudC4KLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkxvY2F0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IgKExvY2F0b3IgbG9jYXRvcikKLSAgICB7fQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgYSBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIDxwPlRoZSBTQVggcGFyc2VyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIG9ubHkgb25jZSwgYmVmb3JlIGFueQotICAgICAqIG90aGVyIG1ldGhvZHMgaW4gdGhpcyBpbnRlcmZhY2Ugb3IgaW4gRFRESGFuZGxlciAoZXhjZXB0IGZvcgotICAgICAqIHNldERvY3VtZW50TG9jYXRvcikuPC9wPgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gQW55IFNBWCBleGNlcHRpb24sIHBvc3NpYmx5Ci0gICAgICogICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50ICgpCi0JdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChtX2RvY3VtZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBtX2RvY3VtZW50SGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0gICAgICBlbHNlIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsKQotICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dENvbnRlbnRIYW5kbGVyKCkuc3RhcnREb2N1bWVudCgpOwotICAgICAgLy9tX3RyYW5zZm9ybWVySW1wbC5nZXRSZXN1bHRUcmVlSGFuZGxlcigpLnN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgIAotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiB0aGUgZW5kIG9mIGEgZG9jdW1lbnQuCi0gICAgICoKLSAgICAgKiA8cD5UaGUgU0FYIHBhcnNlciB3aWxsIGludm9rZSB0aGlzIG1ldGhvZCBvbmx5IG9uY2UsIGFuZCBpdCB3aWxsCi0gICAgICogYmUgdGhlIGxhc3QgbWV0aG9kIGludm9rZWQgZHVyaW5nIHRoZSBwYXJzZS4gIFRoZSBwYXJzZXIgc2hhbGwKLSAgICAgKiBub3QgaW52b2tlIHRoaXMgbWV0aG9kIHVudGlsIGl0IGhhcyBlaXRoZXIgYWJhbmRvbmVkIHBhcnNpbmcKLSAgICAgKiAoYmVjYXVzZSBvZiBhbiB1bnJlY292ZXJhYmxlIGVycm9yKSBvciByZWFjaGVkIHRoZSBlbmQgb2YKLSAgICAgKiBpbnB1dC48L3A+Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKLSAgICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50ICgpCi0JdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChtX2RvY3VtZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBtX2RvY3VtZW50SGFuZGxlci5lbmREb2N1bWVudCgpOwotICAgICAgZWxzZSBpZiAobV90cmFuc2Zvcm1lckltcGwgIT0gbnVsbCkKLSAgICAgICAgbV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRDb250ZW50SGFuZGxlcigpLmVuZERvY3VtZW50KCk7Ci0gICAgICAvL21fdHJhbnNmb3JtZXJJbXBsLmdldFJlc3VsdFRyZWVIYW5kbGVyKCkuZW5kRG9jdW1lbnQoKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiBhbiBlbGVtZW50LgotICAgICAqCi0gICAgICogPHA+VGhlIFBhcnNlciB3aWxsIGludm9rZSB0aGlzIG1ldGhvZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5Ci0gICAgICogZWxlbWVudCBpbiB0aGUgWE1MIGRvY3VtZW50OyB0aGVyZSB3aWxsIGJlIGEgY29ycmVzcG9uZGluZwotICAgICAqIGVuZEVsZW1lbnQoKSBldmVudCBmb3IgZXZlcnkgc3RhcnRFbGVtZW50KCkgZXZlbnQgKGV2ZW4gd2hlbiB0aGUKLSAgICAgKiBlbGVtZW50IGlzIGVtcHR5KS4gQWxsIG9mIHRoZSBlbGVtZW50J3MgY29udGVudCB3aWxsIGJlCi0gICAgICogcmVwb3J0ZWQsIGluIG9yZGVyLCBiZWZvcmUgdGhlIGNvcnJlc3BvbmRpbmcgZW5kRWxlbWVudCgpCi0gICAgICogZXZlbnQuPC9wPgotICAgICAqCi0gICAgICogPHA+SWYgdGhlIGVsZW1lbnQgbmFtZSBoYXMgYSBuYW1lc3BhY2UgcHJlZml4LCB0aGUgcHJlZml4IHdpbGwKLSAgICAgKiBzdGlsbCBiZSBhdHRhY2hlZC4gIE5vdGUgdGhhdCB0aGUgYXR0cmlidXRlIGxpc3QgcHJvdmlkZWQgd2lsbAotICAgICAqIGNvbnRhaW4gb25seSBhdHRyaWJ1dGVzIHdpdGggZXhwbGljaXQgdmFsdWVzIChzcGVjaWZpZWQgb3IKLSAgICAgKiBkZWZhdWx0ZWQpOiAjSU1QTElFRCBhdHRyaWJ1dGVzIHdpbGwgYmUgb21pdHRlZC48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZWxlbWVudCB0eXBlIG5hbWUuCi0gICAgICogQHBhcmFtIGF0dHMgVGhlIGF0dHJpYnV0ZXMgYXR0YWNoZWQgdG8gdGhlIGVsZW1lbnQsIGlmIGFueS4KLSAgICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKLSAgICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgotICAgICAqIEBzZWUgI2VuZEVsZW1lbnQKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3QgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50IChTdHJpbmcgbmFtZSwgQXR0cmlidXRlTGlzdCBhdHRzKQotCXRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAobV9kb2N1bWVudEhhbmRsZXIgPT0gbnVsbCkgICAgICAgCi0gICAgICB7IAotICAgICAgICBtX2RvY3VtZW50SGFuZGxlciA9IG5ldyBQYXJzZXJBZGFwdGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICAgICAgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgICgoUGFyc2VyQWRhcHRlciltX2RvY3VtZW50SGFuZGxlcikuc2V0Q29udGVudEhhbmRsZXIobV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRDb250ZW50SGFuZGxlcigpKTsKLSAgICAgICAgfQotICAgICAgICAvKiBlbHNlIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZigiOiIpOwotICAgICAgICBpZiAoaW5kZXggPCAwICkKLSAgICAgICAgbV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRDb250ZW50SGFuZGxlcigpLnN0YXJ0RWxlbWVudChudWxsLCBuYW1lLCBuYW1lLCAoQXR0cmlidXRlcylhdHRzKTsKLSAgICAgICAgLy9nZXRSZXN1bHRUcmVlSGFuZGxlcigpLnN0YXJ0RWxlbWVudChudWxsLCBuYW1lLCBuYW1lLCAoQXR0cmlidXRlcylhdHRzKTsKLSAgICAgICAgZWxzZQotICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dENvbnRlbnRIYW5kbGVyKCkuc3RhcnRFbGVtZW50KG5hbWUuc3Vic3RyaW5nKDAsaW5kZXgpLCBuYW1lLnN1YnN0cmluZyhpbmRleCsxKSwgbmFtZSwgKEF0dHJpYnV0ZXMpYXR0cyk7ICAgICAgICAKLSAgICAgICAgLy9tX3RyYW5zZm9ybWVySW1wbC5nZXRSZXN1bHRUcmVlSGFuZGxlcigpLnN0YXJ0RWxlbWVudChuYW1lLnN1YnN0cmluZygwLGluZGV4KSwgbmFtZS5zdWJzdHJpbmcoaW5kZXgrMSksIG5hbWUsIChBdHRyaWJ1dGVzKWF0dHMpOwotICAgICAgICAqLyAKLSAgICAgIH0gCi0gICAgICBtX2RvY3VtZW50SGFuZGxlci5zdGFydEVsZW1lbnQobmFtZSwgYXR0cyk7Ci0gICAgfSAgIAotICAgIAotICAgIC8qKgotICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBlbmQgb2YgYW4gZWxlbWVudC4KLSAgICAgKgotICAgICAqIDxwPlRoZSBTQVggcGFyc2VyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIGF0IHRoZSBlbmQgb2YgZXZlcnkKLSAgICAgKiBlbGVtZW50IGluIHRoZSBYTUwgZG9jdW1lbnQ7IHRoZXJlIHdpbGwgYmUgYSBjb3JyZXNwb25kaW5nCi0gICAgICogc3RhcnRFbGVtZW50KCkgZXZlbnQgZm9yIGV2ZXJ5IGVuZEVsZW1lbnQoKSBldmVudCAoZXZlbiB3aGVuIHRoZQotICAgICAqIGVsZW1lbnQgaXMgZW1wdHkpLjwvcD4KLSAgICAgKgotICAgICAqIDxwPklmIHRoZSBlbGVtZW50IG5hbWUgaGFzIGEgbmFtZXNwYWNlIHByZWZpeCwgdGhlIHByZWZpeCB3aWxsCi0gICAgICogc3RpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIG5hbWUuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIGVsZW1lbnQgdHlwZSBuYW1lCi0gICAgICogQGV4Y2VwdGlvbiBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gQW55IFNBWCBleGNlcHRpb24sIHBvc3NpYmx5Ci0gICAgICogICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50IChTdHJpbmcgbmFtZSkKLQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgaWYgKG1fZG9jdW1lbnRIYW5kbGVyID09IG51bGwpICAgICAgICAKLSAgICAgIHsgICAgICAgICAKLSAgICAgICAgbV9kb2N1bWVudEhhbmRsZXIgPSBuZXcgUGFyc2VyQWRhcHRlcihuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKSk7Ci0gICAgICAgIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgKChQYXJzZXJBZGFwdGVyKW1fZG9jdW1lbnRIYW5kbGVyKS5zZXRDb250ZW50SGFuZGxlcihtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dENvbnRlbnRIYW5kbGVyKCkpOwotICAgICAgICB9Ci0gICAgIC8qIGVsc2UgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZigiOiIpOwotICAgICAgICBpZiAoaW5kZXggPCAwICkKLSAgICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dENvbnRlbnRIYW5kbGVyKCkuZW5kRWxlbWVudChudWxsLCBuYW1lLCBuYW1lKTsKLSAgICAgICAgICAvL21fdHJhbnNmb3JtZXJJbXBsLmdldFJlc3VsdFRyZWVIYW5kbGVyKCkuZW5kRWxlbWVudChudWxsLCBuYW1lLCBuYW1lKTsgICAgICAgIAotICAgICAgICBlbHNlCi0gICAgICAgICAgbV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRDb250ZW50SGFuZGxlcigpLmVuZEVsZW1lbnQobmFtZS5zdWJzdHJpbmcoMCxpbmRleCksIG5hbWUuc3Vic3RyaW5nKGluZGV4KzEpLCBuYW1lKTsKLSAgICAgICAgICAvL21fdHJhbnNmb3JtZXJJbXBsLmdldFJlc3VsdFRyZWVIYW5kbGVyKCkuZW5kRWxlbWVudChuYW1lLnN1YnN0cmluZygwLGluZGV4KSwgbmFtZS5zdWJzdHJpbmcoaW5kZXgrMSksIG5hbWUpOwotICAgICAgICAqLwotICAgICAgfSAKLSAgICAgIG1fZG9jdW1lbnRIYW5kbGVyLmVuZEVsZW1lbnQobmFtZSk7ICAgICAgCi0gICAgfSAgICAgCi0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgY2hhcmFjdGVyIGRhdGEuCi0gICAgICoKLSAgICAgKiA8cD5UaGUgUGFyc2VyIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCB0byByZXBvcnQgZWFjaCBjaHVuayBvZgotICAgICAqIGNoYXJhY3RlciBkYXRhLiAgU0FYIHBhcnNlcnMgbWF5IHJldHVybiBhbGwgY29udGlndW91cyBjaGFyYWN0ZXIKLSAgICAgKiBkYXRhIGluIGEgc2luZ2xlIGNodW5rLCBvciB0aGV5IG1heSBzcGxpdCBpdCBpbnRvIHNldmVyYWwKLSAgICAgKiBjaHVua3M7IGhvd2V2ZXIsIGFsbCBvZiB0aGUgY2hhcmFjdGVycyBpbiBhbnkgc2luZ2xlIGV2ZW50Ci0gICAgICogbXVzdCBjb21lIGZyb20gdGhlIHNhbWUgZXh0ZXJuYWwgZW50aXR5LCBzbyB0aGF0IHRoZSBMb2NhdG9yCi0gICAgICogcHJvdmlkZXMgdXNlZnVsIGluZm9ybWF0aW9uLjwvcD4KLSAgICAgKgotICAgICAqIDxwPlRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdCBhdHRlbXB0IHRvIHJlYWQgZnJvbSB0aGUgYXJyYXkKLSAgICAgKiBvdXRzaWRlIG9mIHRoZSBzcGVjaWZpZWQgcmFuZ2UuPC9wPgotICAgICAqCi0gICAgICogPHA+Tm90ZSB0aGF0IHNvbWUgcGFyc2VycyB3aWxsIHJlcG9ydCB3aGl0ZXNwYWNlIHVzaW5nIHRoZQotICAgICAqIGlnbm9yYWJsZVdoaXRlc3BhY2UoKSBtZXRob2QgcmF0aGVyIHRoYW4gdGhpcyBvbmUgKHZhbGlkYXRpbmcKLSAgICAgKiBwYXJzZXJzIG11c3QgZG8gc28pLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjaCBUaGUgY2hhcmFjdGVycyBmcm9tIHRoZSBYTUwgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCi0gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZSBhcnJheS4KLSAgICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKLSAgICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgotICAgICAqIEBzZWUgI2lnbm9yYWJsZVdoaXRlc3BhY2UgCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5Mb2NhdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyAoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0JdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChtX2RvY3VtZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBtX2RvY3VtZW50SGFuZGxlci5jaGFyYWN0ZXJzKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgIGVsc2UgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwpCi0gICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dENvbnRlbnRIYW5kbGVyKCkuY2hhcmFjdGVycyhjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICAvL21fdHJhbnNmb3JtZXJJbXBsLmdldFJlc3VsdFRyZWVIYW5kbGVyKCkuY2hhcmFjdGVycyhjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgfSAgCi0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgaWdub3JhYmxlIHdoaXRlc3BhY2UgaW4gZWxlbWVudCBjb250ZW50LgotICAgICAqCi0gICAgICogPHA+VmFsaWRhdGluZyBQYXJzZXJzIG11c3QgdXNlIHRoaXMgbWV0aG9kIHRvIHJlcG9ydCBlYWNoIGNodW5rCi0gICAgICogb2YgaWdub3JhYmxlIHdoaXRlc3BhY2UgKHNlZSB0aGUgVzNDIFhNTCAxLjAgcmVjb21tZW5kYXRpb24sCi0gICAgICogc2VjdGlvbiAyLjEwKTogbm9uLXZhbGlkYXRpbmcgcGFyc2VycyBtYXkgYWxzbyB1c2UgdGhpcyBtZXRob2QKLSAgICAgKiBpZiB0aGV5IGFyZSBjYXBhYmxlIG9mIHBhcnNpbmcgYW5kIHVzaW5nIGNvbnRlbnQgbW9kZWxzLjwvcD4KLSAgICAgKgotICAgICAqIDxwPlNBWCBwYXJzZXJzIG1heSByZXR1cm4gYWxsIGNvbnRpZ3VvdXMgd2hpdGVzcGFjZSBpbiBhIHNpbmdsZQotICAgICAqIGNodW5rLCBvciB0aGV5IG1heSBzcGxpdCBpdCBpbnRvIHNldmVyYWwgY2h1bmtzOyBob3dldmVyLCBhbGwgb2YKLSAgICAgKiB0aGUgY2hhcmFjdGVycyBpbiBhbnkgc2luZ2xlIGV2ZW50IG11c3QgY29tZSBmcm9tIHRoZSBzYW1lCi0gICAgICogZXh0ZXJuYWwgZW50aXR5LCBzbyB0aGF0IHRoZSBMb2NhdG9yIHByb3ZpZGVzIHVzZWZ1bAotICAgICAqIGluZm9ybWF0aW9uLjwvcD4KLSAgICAgKgotICAgICAqIDxwPlRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdCBhdHRlbXB0IHRvIHJlYWQgZnJvbSB0aGUgYXJyYXkKLSAgICAgKiBvdXRzaWRlIG9mIHRoZSBzcGVjaWZpZWQgcmFuZ2UuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNoIFRoZSBjaGFyYWN0ZXJzIGZyb20gdGhlIFhNTCBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkIGZyb20gdGhlIGFycmF5LgotICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQotICAgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCi0gICAgICogQHNlZSAjY2hhcmFjdGVycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UgKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotCXRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAobV9kb2N1bWVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgbV9kb2N1bWVudEhhbmRsZXIuaWdub3JhYmxlV2hpdGVzcGFjZShjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICBlbHNlIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsKQotICAgICAgbV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRDb250ZW50SGFuZGxlcigpLmlnbm9yYWJsZVdoaXRlc3BhY2UoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgLy9tX3RyYW5zZm9ybWVySW1wbC5nZXRSZXN1bHRUcmVlSGFuZGxlcigpLmlnbm9yYWJsZVdoaXRlc3BhY2UoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0gICAgICoKLSAgICAgKiA8cD5UaGUgUGFyc2VyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIG9uY2UgZm9yIGVhY2ggcHJvY2Vzc2luZwotICAgICAqIGluc3RydWN0aW9uIGZvdW5kOiBub3RlIHRoYXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgbWF5IG9jY3VyCi0gICAgICogYmVmb3JlIG9yIGFmdGVyIHRoZSBtYWluIGRvY3VtZW50IGVsZW1lbnQuPC9wPgotICAgICAqCi0gICAgICogPHA+QSBTQVggcGFyc2VyIHNob3VsZCBuZXZlciByZXBvcnQgYW4gWE1MIGRlY2xhcmF0aW9uIChYTUwgMS4wLAotICAgICAqIHNlY3Rpb24gMi44KSBvciBhIHRleHQgZGVjbGFyYXRpb24gKFhNTCAxLjAsIHNlY3Rpb24gNC4zLjEpCi0gICAgICogdXNpbmcgdGhpcyBtZXRob2QuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldCBUaGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQuCi0gICAgICogQHBhcmFtIGRhdGEgVGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZGF0YSwgb3IgbnVsbCBpZgotICAgICAqICAgICAgICBub25lIHdhcyBzdXBwbGllZC4KLSAgICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKLSAgICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyAgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKQotCXRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAobV9kb2N1bWVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgbV9kb2N1bWVudEhhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSk7Ci0gICAgICBlbHNlIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsKQotICAgICAgbV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRDb250ZW50SGFuZGxlcigpLnByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpOwotICAgICAgLy9tX3RyYW5zZm9ybWVySW1wbC5nZXRSZXN1bHRUcmVlSGFuZGxlcigpLnByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpOwotICAgIH0KLSAgICAKLSAgICAvLyBJbXBsZW1lbnQgWFNMVFByb2Nlc3NvcgotICAgIAotICAgIC8qKgotICAgKiBTZXQgdGhlIG91dHB1dCBzdHJlYW0uIFJlcXVpcmVkIHdoZW4gdGhlIFhTTFRQcm9jZXNzb3IgaXMgYmVpbmcgdXNlZAotICAgKiBhcyBhIFNBWCBEb2N1bWVudEhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0gb3MpCi0gIHsKLSAgICBTb3VyY2VUcmVlSGFuZGxlciBoYW5kbGVyID0gbmV3IFNvdXJjZVRyZWVIYW5kbGVyKG1fdHJhbnNmb3JtZXJJbXBsKTsKLSAgICBoYW5kbGVyLnNldFJlc3VsdChuZXcgU3RyZWFtUmVzdWx0KG9zKSk7ICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gWFN0cmluZy4KLSAgICogQHBhcmFtIHMgQSB2YWxpZCBzdHJpbmcuCi0gICAqIEByZXR1cm4gQW4gWFN0cmluZyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgWFN0cmluZyBjcmVhdGVYU3RyaW5nKFN0cmluZyBzKQotICB7Ci0gICAgcmV0dXJuIG5ldyBYU3RyaW5nKHMpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBYT2JqZWN0LgotICAgKiBAcGFyYW0gbyBBbnkgamF2YSBvYmplY3QuCi0gICAqIEByZXR1cm4gQW4gWE9iamVjdCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgWE9iamVjdCBjcmVhdGVYT2JqZWN0KE9iamVjdCBvKQotICB7Ci0gICAgcmV0dXJuIG5ldyBYT2JqZWN0KG8pOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBYTnVtYmVyLgotICAgKiBAcGFyYW0gZCBBbnkgZG91YmxlIG51bWJlci4KLSAgICogQHJldHVybiBBbiBYTnVtYmVyIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYTnVtYmVyIGNyZWF0ZVhOdW1iZXIoZG91YmxlIGQpCi0gIHsKLSAgICByZXR1cm4gbmV3IFhOdW1iZXIoZCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIFhCb29sZWFuLgotICAgKiBAcGFyYW0gYiBib29sZWFuIHZhbHVlLgotICAgKiBAcmV0dXJuIEFuIFhCb29sZWFuIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYQm9vbGVhbiBjcmVhdGVYQm9vbGVhbihib29sZWFuIGIpCi0gIHsKLSAgICByZXR1cm4gbmV3IFhCb29sZWFuKGIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBYTm9kZVNldC4KLSAgICogQHBhcmFtIG5sIEEgTm9kZUxpc3Qgb2JqZWN0LgotICAgKiBAcmV0dXJuIEFuIFhOb2RlU2V0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYTm9kZVNldCBjcmVhdGVYTm9kZVNldChOb2RlTGlzdCBubCkKLSAgewotICAgIHJldHVybiBuZXcgWE5vZGVTZXQobmwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBYTm9kZVNldCBmcm9tIGEgbm9kZS4KLSAgICogQHBhcmFtIG4gQSBET00gbm9kZS4KLSAgICogQHJldHVybiBBbiBYTm9kZVNldCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgWE5vZGVTZXQgY3JlYXRlWE5vZGVTZXQoTm9kZSBuKQotICB7Ci0gICAgcmV0dXJuIG5ldyBYTm9kZVNldChuKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gWE51bGwuCi0gICAqIEByZXR1cm4gQW4gWE51bGwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhOdWxsIGNyZWF0ZVhOdWxsKCkKLSAgewotICAgIHJldHVybiBuZXcgWE51bGwoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgWE1MUGFyc2VyTGlhaXNvbiB0aGF0IHRoaXMgcHJvY2Vzc29yIHVzZXMuCi0gICAqLwotICBwdWJsaWMgWE1MUGFyc2VyTGlhaXNvbiBnZXRYTUxQcm9jZXNzb3JMaWFpc29uKCkKLSAgewotICAgIHJldHVybiAoWE1MUGFyc2VyTGlhaXNvbiltX2xpYWlzb247Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBwcmVmZXJyZWQgc3R5bGVzaGVldCBmb3IgdGhlIFhTTFRJbnB1dFNvdXJjZSBYTUwgZG9jdW1lbnQsCi0gICAqIGFzIGlkZW50aWZpZWQgYnkgdGhlIHhtbC1zdHlsZXNoZWV0IFBJLCBhbmQgbWF0Y2hpbmcgdGhlIG1lZGlhIGFuZAotICAgKiBjaGFyc2V0IGNyaXRlcmlhLiBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQvIj4KLSAgICogQXNzb2NpYXRpbmcgU3R5bGUgU2hlZXRzIHdpdGggWE1MIGRvY3VtZW50czwvYT4uCi0gICAqIERvZXMgbm90IHlldCBoYW5kbGUgdGhlIExJTksgUkVMPSJzdHlsZXNoZWV0IiBzeW50YXguCi0gICAqCi0gICAqIEBwYXJhbSBtZWRpYSBUaGUgbWVkaWEgYXR0cmlidXRlIHRvIGJlIG1hdGNoZWQuICBNYXkgYmUgbnVsbCwgaW4gd2hpY2gKLSAgICogICAgICAgICAgICAgIGNhc2UgdGhlIHByZWZlcmVkIHN0eWxlc2hlZXQgd2lsbCBiZSB1c2VkIChpLmUuLCBhbHRlcm5hdGUgPSBubykuCi0gICAqIEBwYXJhbSB0aXRsZSBUaGUgdmFsdWUgb2YgdGhlIHRpdGxlIGF0dHJpYnV0ZSB0byBtYXRjaC4gIE1heSBiZSBudWxsLgotICAgKiBAcGFyYW0gY2hhcnNldCBUaGUgdmFsdWUgb2YgdGhlIGNoYXJzZXQgYXR0cmlidXRlIHRvIG1hdGNoLiAgTWF5IGJlIG51bGwuCi0gICAqIEByZXR1cm5zIFN0eWxlc2hlZXRTcGVjIGV4dGVuZHMgWFNMVElucHV0U291cmNlIGV4dGVkbnMgU0FYIElucHV0U291cmNlOyB0aGUgcmV0dXJuIHZhbHVlCi0gICAqIGNhbiBiZSBwYXNzZWQgdG8gdGhlIHByb2Nlc3NTdHlsZXNoZWV0IG1ldGhvZC4KLSAgICovCi0gIHB1YmxpYyBTdHlsZXNoZWV0U3BlYyBnZXRBc3NvY2lhdGVkU3R5bGVzaGVldChYU0xUSW5wdXRTb3VyY2Ugc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lZGlhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgLypJbnB1dFNvdXJjZVtdaW4gPSBtX3Byb2Nlc3Nvci5nZXRBc3NvY2lhdGVkU3R5bGVzaGVldHMoc291cmNlLCBtZWRpYSwgbnVsbCwgY2hhcnNldCk7Ci0gICAgaWYgKGluLmxlbmd0aCA+MCkKLSAgICAgIHJldHVybiAoU3R5bGVzaGVldFNwZWMpaW5bMF07Ci0gICAgZWxzZSAKLSAgICAgIHJldHVybiBudWxsOyAqLwotICAgIHRyeXsKLSAgICBTb3VyY2UgcyA9IG1fdGZhY3RvcnkuZ2V0QXNzb2NpYXRlZFN0eWxlc2hlZXQoc291cmNlLmdldFNvdXJjZU9iamVjdCgpLCBtZWRpYSwgbnVsbCwgY2hhcnNldCk7Ci0gICAgcmV0dXJuIChTdHlsZXNoZWV0U3BlYylzOyAKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpIAotICAgIHsKLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGNlKTsgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIGxpc3Qgb2Ygc3R5bGVzaGVldCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIFhTTFRJbnB1dFNvdXJjZSBYTUwgZG9jdW1lbnQsCi0gICAqIGFzIGlkZW50aWZpZWQgYnkgdGhlIHhtbC1zdHlsZXNoZWV0IFBJLCBhbmQgbWF0Y2hpbmcgdGhlIG1lZGlhIGFuZAotICAgKiBjaGFyc2V0IGNyaXRlcmlhLiBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQvIj4KLSAgICogQXNzb2NpYXRpbmcgU3R5bGUgU2hlZXRzIHdpdGggWE1MIGRvY3VtZW50czwvYT4uCi0gICAqIERvZXMgbm90IHlldCBoYW5kbGUgdGhlIExJTksgUkVMPSJzdHlsZXNoZWV0IiBzeW50YXguCi0gICAqCi0gICAqIEBwYXJhbSBtZWRpYSBUaGUgbWVkaWEgYXR0cmlidXRlIHRvIGJlIG1hdGNoZWQuICBNYXkgYmUgbnVsbCwgaW4gd2hpY2gKLSAgICogICAgICAgICAgICAgIGNhc2UgdGhlIHByZWZlcmVkIHN0eWxlc2hlZXQgd2lsbCBiZSB1c2VkIChpLmUuLCBhbHRlcm5hdGUgPSBubykuCi0gICAqIEBwYXJhbSB0aXRsZSBUaGUgdmFsdWUgb2YgdGhlIHRpdGxlIGF0dHJpYnV0ZSB0byBtYXRjaC4gIE1heSBiZSBudWxsLgotICAgKiBAcGFyYW0gY2hhcnNldCBUaGUgdmFsdWUgb2YgdGhlIGNoYXJzZXQgYXR0cmlidXRlIHRvIG1hdGNoLiAgTWF5IGJlIG51bGwuCi0gICAqIEByZXR1cm5zIGxpc3Qgb2YgU3R5bGVzaGVldFNwZWNzIChleHRlbmQgWFNMVElucHV0U291cmNlcyBleHRlbmQgU0FYIElucHV0U291cmNlczsgYQotICAgKiBsaXN0IG1lbWJlciBtYXkgYmUgcGFzc3NlZCB0byB0aGUgcHJvY2Vzc1N0eWxlc2hlZXQgbWV0aG9kLgotICAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRBc3NvY2lhdGVkU3R5bGVzaGVldHMoWFNMVElucHV0U291cmNlIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZWRpYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGFyc2V0KQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIHRyeXsKLSAgICAgIFNvdXJjZSBzID0gbV90ZmFjdG9yeS5nZXRBc3NvY2lhdGVkU3R5bGVzaGVldChzb3VyY2UuZ2V0U291cmNlT2JqZWN0KCksIG1lZGlhLCBudWxsLCBjaGFyc2V0KTsKLSAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgLy9mb3IgKGludCBpID0gMDsgaTwgaW4ubGVuZ3RoOyBpKyspCi0gICAgICB2LmFkZEVsZW1lbnQoKFN0eWxlc2hlZXRTcGVjKXMpOwotICAgICAgcmV0dXJuIHY7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGNlKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0gIAotICAvKioKLSAgICogU3VibWl0IGEgdG9wLWxldmVsIHN0eWxlc2hlZXQgcGFyYW1ldGVyLiAgVGhpcyB2YWx1ZSBjYW4KLSAgICogYmUgZXZhbHVhdGVkIGluIHRoZSBzdHlsZXNoZWV0IHZpYSB4c2w6cGFyYW0tdmFyaWFibGUuCi0gICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHBhcmFtLgotICAgKiBAcGFyYW0gdmFsdWUgQW4gWE9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0eWxlc2hlZXRQYXJhbShTdHJpbmcga2V5LCBYT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgc2V0UGFyYW1ldGVyKGtleSwgdmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBhIHRvcC1sZXZlbCBzdHlsZXNoZWV0IHBhcmFtZXRlci4gIFRoaXMgdmFsdWUgY2FuCi0gICAqIGJlIGV2YWx1YXRlZCB2aWEgeHNsOnBhcmFtLXZhcmlhYmxlLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZQotICAgKiBwYXNzZWQgaXMgYW4gZXhwcmVzc2lvbiwgYW5kIG5vdCBhIHN0cmluZy4gIFRoaXMgbWVhbnMgdGhhdAotICAgKiBzZXRTdHlsZXNoZWV0UGFyYW0oImZvbyIsICJoZWxsbyIpOyB3aWxsIGxvb2sgZm9yIHRoZQotICAgKiBlbGVtZW50ICJoZWxsbyIuICBJZiB5b3Ugd2FudCB0byBwYXNzIGEgc3RyaW5nLCB5b3UnbGwKLSAgICogbmVlZCB0byBwdXQgcXVvdGVzIGFyb3VuZCBpdDoKLSAgICogc2V0U3R5bGVzaGVldFBhcmFtKCJmb28iLCAiJ2hlbGxvJyIpOyB3aWxsIGxvb2sgZm9yIHRoZQotICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBwYXJhbS4KLSAgICogQHBhcmFtIGV4cHJlc3Npb24gQW4gZXhwcmVzc2lvbiB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3R5bGVzaGVldFBhcmFtKFN0cmluZyBrZXksIFN0cmluZyBleHByZXNzaW9uKQotICB7ICAgIAotICAgIGlmIChtX2V2YWxMaXN0ID09IG51bGwpCi0gICAgICBtX2V2YWxMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIGlmICghbV9ldmFsTGlzdC5jb250YWlucyhrZXkpKQotICAgICAgbV9ldmFsTGlzdC5hZGRFbGVtZW50KGtleSk7Ci0gICAgc2V0UGFyYW1ldGVyKGtleSwgZXhwcmVzc2lvbik7Ci0gICAgbV9uZWVkVG9FdmFsID0gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCBhIHRvcC1sZXZlbCBzdHlsZXNoZWV0IHBhcmFtZXRlci4gIFRoaXMgdmFsdWUgY2FuCi0gICAqIGJlIGV2YWx1YXRlZCB2aWEgeHNsOnBhcmFtLXZhcmlhYmxlLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZQotICAgKiBwYXNzZWQgaXMgYW4gZXhwcmVzc2lvbiwgYW5kIG5vdCBhIHN0cmluZy4gIFRoaXMgbWVhbnMgdGhhdAotICAgKiBzZXRTdHlsZXNoZWV0UGFyYW0oImZvbyIsICJoZWxsbyIpOyB3aWxsIGxvb2sgZm9yIHRoZQotICAgKiBlbGVtZW50ICJoZWxsbyIuICBJZiB5b3Ugd2FudCB0byBwYXNzIGEgc3RyaW5nLCB5b3UnbGwKLSAgICogbmVlZCB0byBwdXQgcXVvdGVzIGFyb3VuZCBpdDoKLSAgICogc2V0U3R5bGVzaGVldFBhcmFtKCJmb28iLCAiJ2hlbGxvJyIpOyB3aWxsIGxvb2sgZm9yIHRoZQotICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBwYXJhbS4KLSAgICogQHBhcmFtIGV4cHJlc3Npb24gQW4gZXhwcmVzc2lvbiB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKFN0cmluZyBrZXksICBPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBpZiAobV9zdHlsZXNoZWV0UGFyYW1zID09IG51bGwpCi0gICAgICBtX3N0eWxlc2hlZXRQYXJhbXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgbV9zdHlsZXNoZWV0UGFyYW1zLnB1dChrZXksIHZhbHVlKTsgCi0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IEZvcm1hdHRlckxpc3RlbmVyIChTQVggRG9jdW1lbnRIYW5kbGVyKSwgb3IgbnVsbCBpZiBub25lIGhhcyBiZWVuIHNldC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudEhhbmRsZXIgZ2V0Rm9ybWF0dGVyTGlzdGVuZXIoKQotICB7Ci0gICAgcmV0dXJuIG1fZG9jdW1lbnRIYW5kbGVyOwotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgRm9ybWF0dGVyTGlzdGVuZXIgKHRoZSBTQVggRG9jdW1lbnRIYW5kbGVyKS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZvcm1hdHRlckxpc3RlbmVyKERvY3VtZW50SGFuZGxlciBmbGlzdGVuZXIpCi0gIHsKLSAgICBtX2RvY3VtZW50SGFuZGxlciA9IGZsaXN0ZW5lcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgU0FYIERvY3VtZW50SGFuZGxlciAodGhlIHNhbWUgb2JqZWN0IGFzIHRoZSBGb3JtYXR0ZXJMaXN0ZW5lciksIG9yIG51bGwgaWYgbm9uZSBoYXMgYmVlbiBzZXQuCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnRIYW5kbGVyIGdldERvY3VtZW50SGFuZGxlcigpCi0gIHsKLSAgICByZXR1cm4gbV9kb2N1bWVudEhhbmRsZXI7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBjdXJyZW50IFNBWCBEb2N1bWVudEhhbmRsZXIgKHRoZSBzYW1lCi0gICAqIG9iamVjdCBhcyB0aGUgRm9ybWF0dGVyTGlzdGVuZXIpLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRIYW5kbGVyKERvY3VtZW50SGFuZGxlciBsaXN0ZW5lcikKLSAgewotICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFBhcnNlckFkYXB0ZXIpICAgICAgCi0gICAgICBtX3RyYW5zZm9ybWVySW1wbC5zZXRDb250ZW50SGFuZGxlcigoKFBhcnNlckFkYXB0ZXIpbGlzdGVuZXIpLmdldENvbnRlbnRIYW5kbGVyKCkpOwotICAgIGVsc2UgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgWFNMVEVuZ2luZUltcGwpCi0gICAgICBtX3RyYW5zZm9ybWVySW1wbC5zZXRDb250ZW50SGFuZGxlcigoKFhTTFRFbmdpbmVJbXBsKWxpc3RlbmVyKS5nZXRUcmFuc2Zvcm1lcigpLmdldENvbnRlbnRIYW5kbGVyKCkpOwotICAgIGVsc2UgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgWE1MU2VyaWFsaXplcikKLSAgICB7Ci0gICAgICB0cnl7Ci0gICAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLnNldENvbnRlbnRIYW5kbGVyKCgoWE1MU2VyaWFsaXplcilsaXN0ZW5lcikuYXNDb250ZW50SGFuZGxlcigpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgICB7fQotICAgIH0KLSAgICBtX2RvY3VtZW50SGFuZGxlciA9IGxpc3RlbmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHRyYWNlIGxpc3RlbmVyIGZvciB0aGUgcHVycG9zZXMgb2YgZGVidWdnaW5nIGFuZCBkaWFnbm9zaXMuCi0gICAqIEBwYXJhbSB0bCBUcmFjZSBsaXN0ZW5lciB0byBiZSBhZGRlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFRyYWNlTGlzdGVuZXIoVHJhY2VMaXN0ZW5lciB0bCkKLSAgICB0aHJvd3MgVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbgotICB7Ci0gICAgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwpCi0gICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRUcmFjZU1hbmFnZXIoKS5hZGRUcmFjZUxpc3RlbmVyKHRsKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIElmIHNldCB0byB0cnVlICh0aGUgZGVmYXVsdCksIHBhdHRlcm4gY29uZmxpY3Qgd2FybmluZ3MgYXJlIG5vdCBwcmludGVkIHRvIHRoZSBkaWFnbm9zdGljcyBzdHJlYW0uCi0gICAqIEBwYXJhbSBiIHRydWUgaWYgY29uZmxpY3Qgd2FybmluZ3Mgc2hvdWxkIGJlIHN1cHByZXNzZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRRdWlldENvbmZsaWN0V2FybmluZ3MoYm9vbGVhbiBiKQotICB7Ci0gICAgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwpCi0gICAgICBtX3RyYW5zZm9ybWVySW1wbC5zZXRRdWlldENvbmZsaWN0V2FybmluZ3MoYik7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlIGEgdHJhY2UgbGlzdGVuZXIuCi0gICAqIEBwYXJhbSB0bCBUcmFjZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlVHJhY2VMaXN0ZW5lcihUcmFjZUxpc3RlbmVyIHRsKQotICB7Ci0gICAgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwpCi0gICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRUcmFjZU1hbmFnZXIoKS5yZW1vdmVUcmFjZUxpc3RlbmVyKHRsKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgcHJvYmxlbSBsaXN0ZW5lciBwcm9wZXJ0eS4KLSAgICogVGhlIFhTTCBjbGFzcyBjYW4gaGF2ZSBhIHNpbmdsZSBsaXN0ZW5lciB0byBiZSBpbmZvcm1lZAotICAgKiBvZiBlcnJvcnMgYW5kIHdhcm5pbmdzLiBUaGUgcHJvYmxlbSBsaXN0ZW5lciBub3JtYWxseSBjb250cm9scyB3aGV0aGVyIGFuIGV4Y2VwdGlvbgotICAgKiBpcyB0aHJvd24gb3Igbm90IChvciB0aGUgcHJvYmxlbSBsaXN0ZW5lcnMgY2FuIHRocm93IGl0cyBvd24gUnVudGltZUV4Y2VwdGlvbikuCi0gICAqIEBwYXJhbSBsIEEgUHJvYmxlbUxpc3RlbmVyIGludGVyZmFjZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2JsZW1MaXN0ZW5lcihQcm9ibGVtTGlzdGVuZXIgbCkKLSAgewotICAgIGlmIChsIGluc3RhbmNlb2YgUHJvYmxlbUxpc3RlbmVyRGVmYXVsdCkKLSAgICAgIG1fcHJvYmxlbUxpc3RlbmVyID0gKFByb2JsZW1MaXN0ZW5lckRlZmF1bHQpbDsKLSAgICBlbHNlCi0gICAgICBtX3Byb2JsZW1MaXN0ZW5lciA9IG5ldyBQcm9ibGVtTGlzdGVuZXJEZWZhdWx0KGwpOyAKLSAgICBpZiAobV90cmFuc2Zvcm1lckltcGwgIT0gbnVsbCkKLSAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLnNldEVycm9yTGlzdGVuZXIobV9wcm9ibGVtTGlzdGVuZXIpOwotICAgIG1fdGZhY3Rvcnkuc2V0RXJyb3JMaXN0ZW5lcihtX3Byb2JsZW1MaXN0ZW5lcik7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBwcm9ibGVtIGxpc3RlbmVyIHByb3BlcnR5LgotICAgKiBUaGUgWFNMIGNsYXNzIGNhbiBoYXZlIGEgc2luZ2xlIGxpc3RlbmVyIHRvIGJlIGluZm9ybWVkCi0gICAqIG9mIGVycm9ycyBhbmQgd2FybmluZ3MuIFRoZSBwcm9ibGVtIGxpc3RlbmVyIG5vcm1hbGx5IGNvbnRyb2xzIHdoZXRoZXIgYW4gZXhjZXB0aW9uCi0gICAqIGlzIHRocm93biBvciBub3QgKG9yIHRoZSBwcm9ibGVtIGxpc3RlbmVyIGNhbiB0aHJvdyBpdHMgb3duIFJ1bnRpbWVFeGNlcHRpb24pLgotICAgKiBAcmV0dXJuIEEgUHJvYmxlbUxpc3RlbmVyIGludGVyZmFjZS4KLSAgICovCi0gIHB1YmxpYyBQcm9ibGVtTGlzdGVuZXIgZ2V0UHJvYmxlbUxpc3RlbmVyKCkKLSAgewotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lci5nZXRQcm9ibGVtTGlzdGVuZXIoKSAhPSBudWxsKQotICAgICAgcmV0dXJuIG1fcHJvYmxlbUxpc3RlbmVyLmdldFByb2JsZW1MaXN0ZW5lcigpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBtX3Byb2JsZW1MaXN0ZW5lcjsKLSAgfQotICAKLSAgcHVibGljIFRyYW5zZm9ybWVySW1wbCBnZXRUcmFuc2Zvcm1lcigpCi0gIHsKLSAgICByZXR1cm4gbV90cmFuc2Zvcm1lckltcGw7ICAKLSAgICAvL3JldHVybiAoU3R5bGVzaGVldFByb2Nlc3NvciltX3Byb2Nlc3NvcjsKLSAgfSAgCi0KLSAgcHVibGljIFRyYW5zZm9ybWVyRmFjdG9yeUltcGwgZ2V0VHJhbnNmb3JtZXJGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiAoVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCltX3RmYWN0b3J5OyAgICAKLSAgfSAKLQotICAKLX0gLy8gZW5kIFhTTFRFbmdpbmVJbXBsIGNsYXNzCmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9YU0xUSW5wdXRTb3VyY2UuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFRJbnB1dFNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmU0N2NiLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFRJbnB1dFNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHNsdDsKLQotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KLSAqIFJlcHJlc2VudHMgYW4gWE1MIHNvdXJjZSBkb2N1bWVudCBvciBYU0wgc3R5bGVzaGVldC4KLSAqIFVzZSBYU0xUSW5wdXRTb3VyY2Ugb2JqZWN0cyB0byBwcm92aWRlIGlucHV0IHRvIHRoZSBYU0xUUHJvY2Vzc29yIHByb2Nlc3MoKSBtZXRob2QKLSAqIGZvciBhIHRyYW5zZm9ybWF0aW9uLiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIFNBWCBpbnB1dCBzb3VyY2UgdG8gaGFuZGxlCi0gKiBET00gbm9kZXMgYXMgaW5wdXQgYXMgd2VsbCBhcyBmaWxlcywgY2hhcmFjdGVyIHN0cmVhbXMsIGJ5dGUgc3RyZWFtcyBhbmQgU0FYIERvY3VtZW50SGFuZGxlcnMuCi0gKgotICogQHNlZSBYU0xUUHJvY2Vzc29yI3Byb2Nlc3MoWFNMVElucHV0U291cmNlLCBYU0xUSW5wdXRTb3VyY2UsIFhTTFRSZXN1bHRUYXJnZXQpCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xUSW5wdXRTb3VyY2UgLy9leHRlbmRzIFNBWFNvdXJjZSAKLXsKLSAgCi0gIHByaXZhdGUgU3RyZWFtU291cmNlIHN0cmVhbVNvdXJjZSA9IG51bGw7Ci0gIHByaXZhdGUgU0FYU291cmNlIHNheFNvdXJjZSA9IG51bGw7Ci0gIHByaXZhdGUgRE9NU291cmNlIGRvbVNvdXJjZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICAqIFplcm8tYXJndW1lbnQgZGVmYXVsdCBjb25zdHJ1Y3RvciAtLSBCZWZvcmUgeW91IGNhbiB1c2UgdGhlIG5ldyBYU0xUSW5wdXRTb3VyY2Ugb2JqZWN0IGluIGEgdHJhbnNmb3JtYXRpb24sCi0gICAgKiB5b3UgbXVzdCBkZWZpbmUgdGhlIGRvY3VtZW50IHNvdXJjZSB3aXRoIHNldFN5c3RlbUlkKCksIHNldE5vZGUoKSwgc2V0SW5wdXRTdHJlYW0oKSwgb3Igc2V0Q2hhcmFjdGVyU3RyZWFtKCkuCi0gICAgKgotICAgICogQHNlZSAjc2V0U3lzdGVtSWQoU3RyaW5nKQotICAgICogQHNlZSAjc2V0Tm9kZShOb2RlKQotICAgICogQHNlZSAjc2V0SW5wdXRTdHJlYW0KLSAgICAqIEBzZWUgI3NldENoYXJhY3RlclN0cmVhbQotICAgICogQHNlZSAjc2V0RW5jb2RpbmcoU3RyaW5nKQotICAgICovCi0gIHB1YmxpYyBYU0xUSW5wdXRTb3VyY2UgKCkKLSAgewotICAgIHNheFNvdXJjZSA9IG5ldyBTQVhTb3VyY2UoKTsKLSAgfQotCi0gIC8qKgotICAgICogQ3JlYXRlIGEgbmV3IGlucHV0IHNvdXJjZSB3aXRoIGEgc3lzdGVtIGlkZW50aWZpZXIgKGZvciBhIFVSTCBvciBmaWxlIG5hbWUpIC0tCi0gICAgKiB0aGUgZXF1aXZhbGVudCBvZiBjcmVhdGluZyBhbiBpbnB1dCBzb3VyY2Ugd2l0aCB0aGUgemVyby1hcmd1bWVudAotICAgICogY29uc3RydWN0b3IgYW5kIHNldHRpbmcgdGhlIG5ldyBvYmplY3QncyBTeXN0ZW1JZCBwcm9wZXJ0eS4KLQotICAgICogSWYgdGhlIHN5c3RlbSBpZGVudGlmaWVyIGlzIGEgVVJMLCBpdCBtdXN0IGJlIGZ1bGx5IHJlc29sdmVkLgotICAgICoKLSAgICAqIElmIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBpcyBhIFVSTCwgaXQgbXVzdCBiZSBmdWxseSByZXNvbHZlZC4KLSAgICAqCi0gICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIHN5c3RlbSBpZGVudGlmaWVyIChVUkkpLgotICAgICogQHNlZSAjc2V0U3lzdGVtSWQoU3RyaW5nKQotICAgICogQHNlZSAjc2V0Tm9kZShOb2RlKQotICAgICogQHNlZSAjc2V0SW5wdXRTdHJlYW0KLSAgICAqIEBzZWUgI3NldEVuY29kaW5nKFN0cmluZykKLSAgICAqIEBzZWUgI3NldENoYXJhY3RlclN0cmVhbQotICAgICovCi0gIHB1YmxpYyBYU0xUSW5wdXRTb3VyY2UgKFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAgIHNheFNvdXJjZSA9IG5ldyBTQVhTb3VyY2UoKTsKLSAgICB0aGlzLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLSAgfQotCi0KLSAgLyoqCi0gICAgKiBDcmVhdGUgYSBuZXcgaW5wdXQgc291cmNlIHdpdGggYSBieXRlIHN0cmVhbSAtLSB0aGUgZXF1aXZhbGVudCBvZiBjcmVhdGluZyBhbiBpbnB1dCBzb3VyY2UKLSAgICAqIHdpdGggdGhlIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IgYW5kIHNldHRpbmcgdGhlIG5ldyBvYmplY3QncyBCeXRlU3RyZWFtIHByb3BlcnR5LgotICAgICoKLSAgICAqIEBwYXJhbSBieXRlU3RyZWFtIFRoZSByYXcgYnl0ZSBzdHJlYW0gY29udGFpbmluZyB0aGUgZG9jdW1lbnQuCi0gICAgKiBAc2VlICNzZXRJbnB1dFN0cmVhbQotICAgICogQHNlZSAjc2V0U3lzdGVtSWQoU3RyaW5nKQotICAgICogQHNlZSAjc2V0Tm9kZShOb2RlKQotICAgICogQHNlZSAjc2V0RW5jb2RpbmcoU3RyaW5nKQotICAgICogQHNlZSAjc2V0Q2hhcmFjdGVyU3RyZWFtCi0gICAgKi8KLSAgcHVibGljIFhTTFRJbnB1dFNvdXJjZSAoSW5wdXRTdHJlYW0gYnl0ZVN0cmVhbSkKLSAgewotICAgIHN0cmVhbVNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoKTsKLSAgICBzdHJlYW1Tb3VyY2Uuc2V0SW5wdXRTdHJlYW0oYnl0ZVN0cmVhbSk7Ci0gIH0KLQotICAvKioKLSAgICAqIENyZWF0ZSBhIG5ldyBpbnB1dCBzb3VyY2Ugd2l0aCBhIGNoYXJhY3RlciBzdHJlYW0gLS0gdGhlIGVxdWl2YWxlbnQgb2YgY3JlYXRpbmcgYW4gaW5wdXQgc291cmNlCi0gICAgKiB3aXRoIHRoZSB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yIGFuZCBzZXR0aW5nIHRoZSBuZXcgb2JqZWN0J3MgQ2hhcmFjdGVyU3RyZWFtIHByb3BlcnR5LgotICAgICogPHA+VGhlIGNoYXJhY3RlciBzdHJlYW0gc2hhbGwgbm90IGluY2x1ZGUgYSBieXRlIG9yZGVyIG1hcmsuPC9wPgotICAgICoKLSAgICAqIEBwYXJhbSBjaGFyYWN0ZXJTdHJlYW0gVGhlIGNoYXJhY3RlciBzdHJlYW0gY29udGFpbmluZyB0aGUgZG9jdW1lbnQuCi0gICAgKiBAc2VlICNzZXRDaGFyYWN0ZXJTdHJlYW0KLSAgICAqIEBzZWUgI3NldElucHV0U3RyZWFtCi0gICAgKiBAc2VlICNzZXRTeXN0ZW1JZChTdHJpbmcpCi0gICAgKiBAc2VlICNzZXROb2RlKE5vZGUpCi0gICAgKiBAc2VlICNzZXRFbmNvZGluZyhTdHJpbmcpCi0gICAgKi8KLSAgcHVibGljIFhTTFRJbnB1dFNvdXJjZSAoUmVhZGVyIGNoYXJhY3RlclN0cmVhbSkKLSAgewotICAgIHN0cmVhbVNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoKTsKLSAgICBzdHJlYW1Tb3VyY2Uuc2V0UmVhZGVyKGNoYXJhY3RlclN0cmVhbSk7Ci0gIH0KLQotICAvKioKLSAgICAqIENyZWF0ZSBhIG5ldyBpbnB1dCBzb3VyY2Ugd2l0aCBhIERPTSBOb2RlIC0tIHRoZSBlcXVpdmFsZW50IG9mIGNyZWF0aW5nIGFuIGlucHV0IHNvdXJjZQotICAgICogd2l0aCB0aGUgemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvciBhbmQgc2V0dGluZyB0aGUgbmV3IG9iamVjdCdzIE5vZGUgcHJvcGVydHkuCi0gICAgKgotICAgICogQHBhcmFtIG5vZGUgVGhlIERPTSBOb2RlIGNvbnRhaW5pbmcgdGhlIGRvY3VtZW50LgotICAgICogQHNlZSAjc2V0Tm9kZShOb2RlKQotICAgICogQHNlZSAjc2V0Q2hhcmFjdGVyU3RyZWFtCi0gICAgKiBAc2VlICNzZXRJbnB1dFN0cmVhbQotICAgICogQHNlZSAjc2V0U3lzdGVtSWQoU3RyaW5nKQotICAgICogQHNlZSAjc2V0RW5jb2RpbmcoU3RyaW5nKQotICAgICovCi0gIHB1YmxpYyBYU0xUSW5wdXRTb3VyY2UgKE5vZGUgbm9kZSkKLSAgewotICAgIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoKTsKLSAgICBkb21Tb3VyY2Uuc2V0Tm9kZShub2RlKTsKLSAgfQotCi0gIC8qKgotICAgICogQ3JlYXRlIGEgbmV3IFhTTFRJbnB1dFNvdXJjZSBzb3VyY2UgZnJvbSBhIFNBWCBpbnB1dCBzb3VyY2UuCi0gICAgKiBUaGlzIG9wZXJhdGlvbiBzZXRzIHRoZSBCeXRlU3RyZWFtLCBDaGFyYWN0ZXJTdHJlYW0sIFN5c3RlbUlkLCBQdWJsaWNJRCwgYW5kIEVuY29kaW5nIHByb3BlcnRpZXMuCi0gICAgKgotICAgKiBAcGFyYW0gaXNvdXJjZSBUaGUgU0FYIGlucHV0IHNvdXJjZS4KLSAgICAqIEBzZWUgI3NldENoYXJhY3RlclN0cmVhbQotICAgICogQHNlZSAjc2V0SW5wdXRTdHJlYW0KLSAgICAqIEBzZWUgI3NldFN5c3RlbUlkKFN0cmluZykKLSAgICAqIEBzZWUgI3NldEVuY29kaW5nKFN0cmluZykKLSAgICAqIEBzZWUgI3NldE5vZGUoTm9kZSkKLSAgICAqLwotICBwdWJsaWMgWFNMVElucHV0U291cmNlIChJbnB1dFNvdXJjZSBpc291cmNlKQotICB7Ci0gICAgc2F4U291cmNlID0gbmV3IFNBWFNvdXJjZSgpOwotICAgIHNheFNvdXJjZS5zZXRJbnB1dFNvdXJjZShpc291cmNlKTsKLSAgICAvL3NheFNvdXJjZS5zZXRYTUxSZWFkZXIoaXNvdXJjZS5nZXRDaGFyYWN0ZXJTdHJlYW0oKSk7Ci0gICAgdGhpcy5zZXRFbmNvZGluZyhpc291cmNlLmdldEVuY29kaW5nKCkpOwotICAgIHRoaXMuc2V0U3lzdGVtSWQoaXNvdXJjZS5nZXRTeXN0ZW1JZCgpKTsKLSAgfQotCi0gIC8qKgotICAgICogU2V0IHRoZSBET00gTm9kZSBmb3IgdGhpcyBpbnB1dCBzb3VyY2UuCi0gICAgKgotICAgICogQHBhcmFtIG5vZGUgVGhlIERPTSBub2RlIGNvbnRhaW5pbmcgdGhlCi0gICAgKiAgICAgICAgWE1MIGRvY3VtZW50IG9yIFhTTCBzdHlsZXNoZWV0LgotICAgICogQHNlZSAjWFNMVElucHV0U291cmNlKE5vZGUpCi0gICAgKiBAc2VlICNnZXRDaGFyYWN0ZXJTdHJlYW0oKSAgICAqIAotICAgICogQHNlZSBqYXZhLmlvLlJlYWRlcgotICAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5vZGUgKE5vZGUgbm9kZSkKLSAgewotICAgIGlmIChkb21Tb3VyY2UgPT0gbnVsbCkKLSAgICAgIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoKTsKLSAgICBkb21Tb3VyY2Uuc2V0Tm9kZShub2RlKTsKLSAgfQotCi0gIC8qKgotICAgICogR2V0IHRoZSBET00gTm9kZSBmb3IgdGhpcyBpbnB1dCBzb3VyY2UuCi0gICAgKgotICAgICogQHJldHVybiBUaGUgRE9NIG5vZGUgY29udGFpbmluZyB0aGUgZG9jdW1lbnQsIG9yIG51bGwgaWYgbm9uZSB3YXMgc3VwcGxpZWQuCi0gICAgKiBAc2VlICNYU0xUSW5wdXRTb3VyY2UoTm9kZSkKLSAgICAqIEBzZWUgI3NldE5vZGUoTm9kZSkKLSAgICAqLwotICBwdWJsaWMgTm9kZSBnZXROb2RlICgpCi0gIHsKLSAgICBpZiAoZG9tU291cmNlICE9IG51bGwpCi0gICAgICByZXR1cm4gZG9tU291cmNlLmdldE5vZGUoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIAotICAKLSAgIC8qKiAKLSAgICAgKiBTZXQgdGhlIGNoYXJhY3RlciBlbmNvZGluZywgaWYga25vd24uCi0gICAgICoKLSAgICAgKiA8cD5UaGUgZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyBhY2NlcHRhYmxlIGZvciBhbgotICAgICAqIFhNTCBlbmNvZGluZyBkZWNsYXJhdGlvbiAoc2VlIHNlY3Rpb24gNC4zLjMgb2YgdGhlIFhNTCAxLjAKLSAgICAgKiByZWNvbW1lbmRhdGlvbikuPC9wPgotICAgICAqCi0gICAgICogPHA+VGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBwcm92aWRlcyBhCi0gICAgICogY2hhcmFjdGVyIHN0cmVhbS48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nLgotICAgICAqIEBzZWUgI3NldFN5c3RlbUlkCi0gICAgICogQHNlZSAjZ2V0RW5jb2RpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyAoU3RyaW5nIGVuY29kaW5nKQotICAgIHsKLQl0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGZvciBhIGJ5dGUgc3RyZWFtIG9yIFVSSS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGVuY29kaW5nLCBvciBudWxsIGlmIG5vbmUgd2FzIHN1cHBsaWVkLgotICAgICAqIEBzZWUgI2dldFN5c3RlbUlkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZyAoKQotICAgIHsKLQlyZXR1cm4gZW5jb2Rpbmc7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNoYXJhY3RlciBzdHJlYW0gZm9yIHRoaXMgaW5wdXQgc291cmNlLgotICAgICAqCi0gICAgICogPHA+SWYgdGhlcmUgaXMgYSBjaGFyYWN0ZXIgc3RyZWFtIHNwZWNpZmllZCwgdGhlIFNBWCBwYXJzZXIKLSAgICAgKiB3aWxsIGlnbm9yZSBhbnkgYnl0ZSBzdHJlYW0gYW5kIHdpbGwgbm90IGF0dGVtcHQgdG8gb3BlbgotICAgICAqIGEgVVJJIGNvbm5lY3Rpb24gdG8gdGhlIHN5c3RlbSBpZGVudGlmaWVyLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjaGFyYWN0ZXJTdHJlYW0gVGhlIGNoYXJhY3RlciBzdHJlYW0gY29udGFpbmluZyB0aGUKLSAgICAgKiAgICAgICAgWE1MIGRvY3VtZW50IG9yIG90aGVyIGVudGl0eS4KLSAgICAgKiBAc2VlIGphdmEuaW8uUmVhZGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyU3RyZWFtIChSZWFkZXIgY2hhcmFjdGVyU3RyZWFtKQotICAgIHsKLSAgICAgIGlmIChzdHJlYW1Tb3VyY2UgPT0gbnVsbCkKLQkgICAgICBzdHJlYW1Tb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKCk7Ci0gICAgICBzdHJlYW1Tb3VyY2Uuc2V0UmVhZGVyKGNoYXJhY3RlclN0cmVhbSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgY2hhcmFjdGVyIHN0cmVhbSBmb3IgdGhpcyBpbnB1dCBzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjaGFyYWN0ZXIgc3RyZWFtLCBvciBudWxsIGlmIG5vbmUgd2FzIHN1cHBsaWVkLgotICAgICAqLwotICAgIHB1YmxpYyBSZWFkZXIgZ2V0Q2hhcmFjdGVyU3RyZWFtICgpCi0gICAgewotICAgICAgaWYgKHN0cmVhbVNvdXJjZSAhPSBudWxsKQotICAgICAgICByZXR1cm4gc3RyZWFtU291cmNlLmdldFJlYWRlcigpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBiYXNlIElEIChVUkwgb3Igc3lzdGVtIElEKSBmcm9tIHdoZXJlIFVSTHMKLSAgICAgKiB3aWxsIGJlIHJlc29sdmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2VJRCBCYXNlIFVSTCBmb3IgdGhpcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgYmFzZUlEKSAKLSAgICB7Ci0gICAgICB0aGlzLmJhc2VJRCA9IGJhc2VJRDsKLSAgICAgIAotICAgICAgaWYgKHNheFNvdXJjZSAhPSBudWxsKQotICAgICAgICBzYXhTb3VyY2Uuc2V0U3lzdGVtSWQoYmFzZUlEKTsKLSAgICAgIGVsc2UgaWYgKGRvbVNvdXJjZSAhPSBudWxsKQotICAgICAgICBkb21Tb3VyY2Uuc2V0U3lzdGVtSWQoYmFzZUlEKTsKLSAgICAgIGVsc2UgaWYgKHN0cmVhbVNvdXJjZSAhPSBudWxsKQotICAgICAgICBzdHJlYW1Tb3VyY2Uuc2V0U3lzdGVtSWQoYmFzZUlEKTsgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGJhc2UgSUQgKFVSTCBvciBzeXN0ZW0gSUQpIGZyb20gd2hlcmUgVVJMcwotICAgICAqIHdpbGwgYmUgcmVzb2x2ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEJhc2UgVVJMIGZvciB0aGlzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJhc2VJRDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmFzZUlEID0gbnVsbDsKLQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgYnl0ZSBzdHJlYW0gdG8gYmUgdXNlZCBhcyBpbnB1dC4gIE5vcm1hbGx5LAotICAgICAqIGEgc3RyZWFtIHNob3VsZCBiZSB1c2VkIHJhdGhlciB0aGFuIGEgcmVhZGVyLCBzbyB0aGF0Ci0gICAgICogdGhlIFhNTCBwYXJzZXIgY2FuIHJlc29sdmUgY2hhcmFjdGVyIGVuY29kaW5nIHNwZWNpZmllZAotICAgICAqIGJ5IHRoZSBYTUwgZGVjbGFyYXRpb24uCi0gICAgICoKLSAgICAgKiA8cD5JZiB0aGlzIFNvdXJjZSBvYmplY3QgaXMgdXNlZCB0byBwcm9jZXNzIGEgc3R5bGVzaGVldCwgbm9ybWFsbHkKLSAgICAgKiBzZXRTeXN0ZW1JZCBzaG91bGQgYWxzbyBiZSBjYWxsZWQsIHNvIHRoYXQgcmVsYXRpdmUgVVJMIHJlZmVyZW5jZXMKLSAgICAgKiBjYW4gYmUgcmVzb2x2ZWQuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGlucHV0U3RyZWFtIEEgdmFsaWQgSW5wdXRTdHJlYW0gcmVmZXJlbmNlIHRvIGFuIFhNTCBzdHJlYW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIAotICAgIHsKLSAgICAgIGlmIChzdHJlYW1Tb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgc3RyZWFtU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSgpOwotICAgICAgc3RyZWFtU291cmNlLnNldElucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGJ5dGUgc3RyZWFtIHRoYXQgd2FzIHNldCB3aXRoIHNldElucHV0U3RyZWFtLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgYnl0ZSBzdHJlYW0gdGhhdCB3YXMgc2V0IHdpdGggc2V0SW5wdXRTdHJlYW0sIG9yIG51bGwKLSAgICAgKiBpZiBzZXRCeXRlU3RyZWFtIG9yIHRoZSBCeXRlU3RyZWFtIGNvbnN0cnVjdG9yIHdhcyBub3QgY2FsbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLSAgICAgIGlmIChzdHJlYW1Tb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHN0cmVhbVNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgIC8qKgotICAgICAqIEdldCB0aGUgUmVzdWx0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBYU0xUUmVzdWx0VGFyZ2V0IG9iamVjdCAuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBSZXN1bHQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFhTTFRSZXN1bHRUYXJnZXQgb2JqZWN0Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFNvdXJjZSBnZXRTb3VyY2VPYmplY3QoKSAKLSAgICB7Ci0gICAgICBpZiAoc3RyZWFtU291cmNlICE9IG51bGwpICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN0cmVhbVNvdXJjZTsKLSAgICAgIGVsc2UgaWYgKGRvbVNvdXJjZSAhPSBudWxsKQotICAgICAgICByZXR1cm4gZG9tU291cmNlOwotICAgICAgZWxzZSAKLSAgICAgICAgcmV0dXJuIHNheFNvdXJjZTsKLSAgICB9IAotfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvWFNMVFByb2Nlc3Nvci5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvWFNMVFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmU1Y2M1Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSAgCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC5YT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGguWE5vZGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC5YQm9vbGVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLlhOdW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC5YTnVsbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLlhTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuWE1MUGFyc2VyTGlhaXNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5Qcm9ibGVtTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0OwotLy9pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3Q7Ci0vL2ltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuU3R5bGVzaGVldFNwZWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS4qOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5Eb2N1bWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogVGhlIHRyYW5zZm9ybWF0aW9uIHByb2Nlc3NvciAtLSB1c2Uge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUHJvY2Vzc29yRmFjdG9yeX0gdG8gaW5zdGFudGlhdGUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UuCi0gKiBJdCdzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgaW1wbGVtZW50YXRpb24gKFhTTFRFbmdpbmVJbXBsKSwKLSAqIGNvbGxhYm9yYXRpbmcgd2l0aCBhIFhNTFBhcnNlckxpYWlzb24sIHRoZSBET00sCi0gKiBhbmQgdGhlIFhQYXRoIGVuZ2luZSwgdG8gdHJhbnNmb3JtIGEgc291cmNlIHRyZWUKLSAqIG9mIG5vZGVzIGludG8gYSByZXN1bHQgdHJlZSBhY2NvcmRpbmcgdG8gaW5zdHJ1Y3Rpb25zCi0gKiBhbmQgdGVtcGxhdGVzIHNwZWNpZmllZCBieSBhIHN0eWxlc2hlZXQgdHJlZS4KLSAqIFVzZSB0aGUgPGNvZGU+cHJvY2VzcyguLi4pPC9jb2RlPiBhcmUgdGhlIHByaW1hcnkKLSAqIHB1YmxpYyBlbnRyeSBwb2ludHMuCi0gKgotICogTG9vayBhdCB0aGUgUHJvY2VzcyBjbGFzcyBtYWluKCkgbWV0aG9kIGZvcgotICogZm9yIGFuIGFkdmFuY2VkIHVzYWdlIGV4YW1wbGUuCi0gKgotICogPHA+SWYgeW91IHJldXNlIHRoZSBwcm9jZXNzb3IgaW5zdGFuY2UsIHlvdSBzaG91bGQgY2FsbCByZXNldCgpIGJldHdlZW4gdHJhbnNmb3JtYXRpb25zLjwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBYU0xUUHJvY2Vzc29yIGV4dGVuZHMgRG9jdW1lbnRIYW5kbGVyLCBMZXhpY2FsSGFuZGxlcgotewotICAvKioKLSAgICogVXNlIHRoZSBYU0wgc3R5bGVzaGVldCB0byB0cmFuc2Zvcm0gdGhlIFhNTCBpbnB1dCwgcGxhY2luZyB0aGUgcmVzdWx0IGluIHRoZSByZXN1bHQgdHJlZS4KLSAgICogQHBhcmFtIHhtbFNvdXJjZSAgVGhlIFhNTCBpbnB1dCB0byBiZSB0cmFuc2Zvcm1lZC4KLSAgICogQHBhcmFtIHhzbFN0eWxlc2hlZXQgIFRoZSBYU0wgc3R5bGVzaGVldCB0byBiZSB1c2VkIGZvciB0aGUgdHJhbnNmb3JtYXRpb24uICBNYXkgYmUgbnVsbCBpZiBYTUwgaW5wdXQKLSAgICogaGFzIGFuIFhTTCBzdHlsZXNoZWV0IFBJLgotICAgKiBAcGFyYW0gcmVzdWx0VHJlZSBUaGUgdHJlZSB3aGVyZSB0aGUgcmVzdWx0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBwbGFjZWQuCi0gICAqIEBleGNlcHRpb24gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWN0aXZlIFByb2JsZW1MaXN0ZW5lciBhbmQgWE1MUGFyc2VyTGlhaXNvbiBkZWNpZGUKLSAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3MoIFhTTFRJbnB1dFNvdXJjZSB4bWxTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIFhTTFRJbnB1dFNvdXJjZSB4c2xTdHlsZXNoZWV0LAotICAgICAgICAgICAgICAgICAgICAgICBYU0xUUmVzdWx0VGFyZ2V0IHJlc3VsdFRyZWUpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQ29tcGlsZSB0aGUgWFNMIHN0eWxlc2hlZXQgcmVwcmVzZW50ZWQgYnkgYW4gWFNMVElucHV0U291cmNlIG9iamVjdCBpbnRvIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uLAotICAgKiBhbmQgdXNlIGl0IHRvIHNldCB0aGUgWFNMVFByb2Nlc3NvciBTdHlsZXNoZWV0IHByb3BlcnR5LgotICAgKiBUaGlzIG9wZXJhdGlvbiBpcyByZXF1aXJlZCBpZiB0aGUgWFNMVFByb2Nlc3NvciBpcyB0byBmdW5jdGlvbiBhcyBhCi0gICAqIFNBWCBEb2N1bWVudEhhbmRsZXIuCi0gICAqIElmIHRoZSBTdHlsZXNoZWV0IHByb3BlcnR5IGhhcyBhbHJlYWR5IGJlZW4gc2V0IHRvIG5vbi1udWxsLCB0aGlzIG9wZXJhdGlvbgotICAgKiBjYWxscyByZXNldCgpIGJlZm9yZSBhIHRyYW5zZm9ybWF0aW9uIGlzIHBlcmZvcm1lZC4KLSAgICoKLSAgICogQHBhcmFtIHN0eWxlc2hlZXRTb3VyY2UgIFRoZSBYU0wgc3R5bGVzaGVldC4KLSAgICogQHJldHVybiBUaGUgY29tcGlsZWQgc3R5bGVzaGVldCBvYmplY3QuCi0gICAqIEBleGNlcHRpb24gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWN0aXZlIFByb2JsZW1MaXN0ZW5lciBhbmQgWE1MUGFyc2VyTGlhaXNvbiBkZWNpZGUKLSAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyBTdHlsZXNoZWV0Um9vdCBwcm9jZXNzU3R5bGVzaGVldChYU0xUSW5wdXRTb3VyY2Ugc3R5bGVzaGVldFNvdXJjZSkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBHaXZlbiBhIFVSTCB0byAob3IgZmlsZSBuYW1lIG9mKSBhbiBYU0wgc3R5bGVzaGVldCwKLSAgICogQ29tcGlsZSB0aGUgc3R5bGVzaGVldCBpbnRvIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uLCBhbmQgdXNlIGl0IHRvCi0gICAqIHNldCB0aGUgWFNMVFByb2Nlc3NvciBTdHlsZXNoZWV0IHByb3BlcnR5LgotICAgKiBUaGlzIG9wZXJhdGlvbiBpcyByZXF1aXJlZCBpZiB0aGUgWFNMVFByb2Nlc3NvciBpcyB0byBmdW5jdGlvbiBhcyBhCi0gICAqIFNBWCBEb2N1bWVudEhhbmRsZXIuCi0gICAqIElmIHRoZSBTdHlsZXNoZWV0IHByb3BlcnR5IGhhcyBhbHJlYWR5IGJlZW4gc2V0IHRvIG5vbi1udWxsLCB0aGlzIG9wZXJhdGlvbgotICAgKiBjYWxscyByZXNldCgpIGJlZm9yZSBhIHRyYW5zZm9ybWF0aW9uIGlzIHBlcmZvcm1lZC4KLSAgICoKLSAgICogQHBhcmFtIHhzbGRvY1VSTFN0cmluZyAgVGhlIFVSTCB0byB0aGUgWFNMIHN0eWxlc2hlZXQuCi0gICAqIEByZXR1cm4gVGhlIGNvbXBpbGVkIHN0eWxlc2hlZXQgb2JqZWN0LgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhNTFBhcnNlckxpYWlzb24gZGVjaWRlCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgU3R5bGVzaGVldFJvb3QgcHJvY2Vzc1N0eWxlc2hlZXQoU3RyaW5nIHhzbGRvY1VSTFN0cmluZykKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIG91dHB1dCBzdHJlYW0uIFJlcXVpcmVkIHdoZW4gdGhlIFhTTFRQcm9jZXNzb3IgaXMgYmVpbmcgdXNlZAotICAgKiBhcyBhIFNBWCBEb2N1bWVudEhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0gb3MpOwotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgWFNMVFByb2Nlc3NvciBzdGF0ZS4gIE11c3QgYmUgdXNlZCBhZnRlciBhIHByb2Nlc3MoKSBjYWxsCi0gICAqIGlmIHRoZSBYU0xUUHJvY2Vzc29yIGluc3RhbmNlIGlzIHRvIGJlIHVzZWQgYWdhaW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldCgpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIERPTSBOb2RlIGZyb20gdGhlIFhTTFRJbnB1dFNvdXJjZSBvYmplY3QuIFJldHVybnMgbnVsbCBpZiB0aGUgWFNMVElucHV0U291cmNlCi0gICAqIG9iamVjdCBkb2VzIG5vdCBjb250YWluIGEgTm9kZSAoaXQgbWF5LCBmb3IgZXhhbXBsZSwgY29udGFpbiBhbiBpbnB1dCBzdHJlYW0pLgotICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0U291cmNlVHJlZUZyb21JbnB1dChYU0xUSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogVXNlIGEgY29tcGlsZWQgc3R5bGVzaGVldCB0byBzZXQgdGhlIFN0eWxlc2hlZXQgcHJvcGVydHkgZm9yIHRoaXMgcHJvY2Vzc29yLgotICAgKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0LCB0aGUgcHJvY2VzcyBtZXRob2QgdXNlcyB0aGlzIHN0eWxlc2hlZXQgcmF0aGVyIHRoYW4KLSAgICogbG9va2luZyBmb3IgYSBzdHlsZXNoZWV0IFBJIGlmIHRoZSBzdHlsZXNoZWV0IHBhcmFtZXRlciBpcyBudWxsLiAgQWxzbyByZXF1aXJlZAotICAgKiBpZiB5b3UgYXJlIGdvaW5nIHRvIHVzZSB0aGUgWFNMVFByb2Nlc3NvciBhcyBhIFNBWCBEb2N1bWVudEhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdHlsZXNoZWV0KFN0eWxlc2hlZXRSb290IHN0eWxlc2hlZXRSb290KTsKLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IFN0eWxlc2hlZXQgc2V0dGluZyBmb3IgdGhpcyBYU0xUUHJvY2Vzc29yLgotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXRSb290IGdldFN0eWxlc2hlZXQoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBYTUxQYXJzZXJMaWFpc29uIHRoYXQgdGhpcyBwcm9jZXNzb3IgdXNlcy4KLSAgICovCi0gIHB1YmxpYyBYTUxQYXJzZXJMaWFpc29uIGdldFhNTFByb2Nlc3NvckxpYWlzb24oKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBwcmVmZXJyZWQgc3R5bGVzaGVldCBmb3IgdGhlIFhTTFRJbnB1dFNvdXJjZSBYTUwgZG9jdW1lbnQsCi0gICAqIGFzIGlkZW50aWZpZWQgYnkgdGhlIHhtbC1zdHlsZXNoZWV0IFBJLCBhbmQgbWF0Y2hpbmcgdGhlIG1lZGlhIGFuZAotICAgKiBjaGFyc2V0IGNyaXRlcmlhLiBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQvIj4KLSAgICogQXNzb2NpYXRpbmcgU3R5bGUgU2hlZXRzIHdpdGggWE1MIGRvY3VtZW50czwvYT4uCi0gICAqIERvZXMgbm90IHlldCBoYW5kbGUgdGhlIExJTksgUkVMPSJzdHlsZXNoZWV0IiBzeW50YXguCi0gICAqCi0gICAqIEBwYXJhbSBtZWRpYSBUaGUgbWVkaWEgYXR0cmlidXRlIHRvIGJlIG1hdGNoZWQuICBNYXkgYmUgbnVsbCwgaW4gd2hpY2gKLSAgICogICAgICAgICAgICAgIGNhc2UgdGhlIHByZWZlcmVkIHN0eWxlc2hlZXQgd2lsbCBiZSB1c2VkIChpLmUuLCBhbHRlcm5hdGUgPSBubykuCi0gICAqIEBwYXJhbSB0aXRsZSBUaGUgdmFsdWUgb2YgdGhlIHRpdGxlIGF0dHJpYnV0ZSB0byBtYXRjaC4gIE1heSBiZSBudWxsLgotICAgKiBAcGFyYW0gY2hhcnNldCBUaGUgdmFsdWUgb2YgdGhlIGNoYXJzZXQgYXR0cmlidXRlIHRvIG1hdGNoLiAgTWF5IGJlIG51bGwuCi0gICAqIEByZXR1cm5zIFN0eWxlc2hlZXRTcGVjIGV4dGVuZHMgWFNMVElucHV0U291cmNlIGV4dGVuZHMgU0FYIElucHV0U291cmNlOyB0aGUgcmV0dXJuIHZhbHVlCi0gICAqIGNhbiBiZSBwYXNzZWQgdG8gdGhlIHByb2Nlc3NTdHlsZXNoZWV0IG1ldGhvZC4KLSAgICovCi0gIHB1YmxpYyBTdHlsZXNoZWV0U3BlYyBnZXRBc3NvY2lhdGVkU3R5bGVzaGVldChYU0xUSW5wdXRTb3VyY2Ugc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lZGlhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogR2V0IGEgbGlzdCBvZiBzdHlsZXNoZWV0IHNwZWNpZmljYXRpb25zIGZvciB0aGUgWFNMVElucHV0U291cmNlIFhNTCBkb2N1bWVudCwKLSAgICogYXMgaWRlbnRpZmllZCBieSB0aGUgeG1sLXN0eWxlc2hlZXQgUEksIGFuZCBtYXRjaGluZyB0aGUgbWVkaWEgYW5kCi0gICAqIGNoYXJzZXQgY3JpdGVyaWEuIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldC8iPgotICAgKiBBc3NvY2lhdGluZyBTdHlsZSBTaGVldHMgd2l0aCBYTUwgZG9jdW1lbnRzPC9hPi4KLSAgICogRG9lcyBub3QgeWV0IGhhbmRsZSB0aGUgTElOSyBSRUw9InN0eWxlc2hlZXQiIHN5bnRheC4KLSAgICoKLSAgICogQHBhcmFtIG1lZGlhIFRoZSBtZWRpYSBhdHRyaWJ1dGUgdG8gYmUgbWF0Y2hlZC4gIE1heSBiZSBudWxsLCBpbiB3aGljaAotICAgKiAgICAgICAgICAgICAgY2FzZSB0aGUgcHJlZmVyZWQgc3R5bGVzaGVldCB3aWxsIGJlIHVzZWQgKGkuZS4sIGFsdGVybmF0ZSA9IG5vKS4KLSAgICogQHBhcmFtIHRpdGxlIFRoZSB2YWx1ZSBvZiB0aGUgdGl0bGUgYXR0cmlidXRlIHRvIG1hdGNoLiAgTWF5IGJlIG51bGwuCi0gICAqIEBwYXJhbSBjaGFyc2V0IFRoZSB2YWx1ZSBvZiB0aGUgY2hhcnNldCBhdHRyaWJ1dGUgdG8gbWF0Y2guICBNYXkgYmUgbnVsbC4KLSAgICogQHJldHVybnMgbGlzdCBvZiBTdHlsZXNoZWV0U3BlY3MgKGV4dGVuZCBYU0xUSW5wdXRTb3VyY2VzIGV4dGVuZCBTQVggSW5wdXRTb3VyY2VzOyBhCi0gICAqIGxpc3QgbWVtYmVyIG1heSBiZSBwYXNzc2VkIHRvIHRoZSBwcm9jZXNzU3R5bGVzaGVldCBtZXRob2QuCi0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldEFzc29jaWF0ZWRTdHlsZXNoZWV0cyhYU0xUSW5wdXRTb3VyY2Ugc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lZGlhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbjsKLQotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gWFN0cmluZy4KLSAgICogQHBhcmFtIHMgQSB2YWxpZCBzdHJpbmcuCi0gICAqIEByZXR1cm4gQW4gWFN0cmluZyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgWFN0cmluZyBjcmVhdGVYU3RyaW5nKFN0cmluZyBzKTsKLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIFhPYmplY3QuCi0gICAqIEBwYXJhbSBvIEFueSBqYXZhIG9iamVjdC4KLSAgICogQHJldHVybiBBbiBYT2JqZWN0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYT2JqZWN0IGNyZWF0ZVhPYmplY3QoT2JqZWN0IG8pOwotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gWE51bWJlci4KLSAgICogQHBhcmFtIGQgQW55IGRvdWJsZSBudW1iZXIuCi0gICAqIEByZXR1cm4gQW4gWE51bWJlciBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgWE51bWJlciBjcmVhdGVYTnVtYmVyKGRvdWJsZSBkKTsKLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIFhCb29sZWFuLgotICAgKiBAcGFyYW0gYiBib29sZWFuIHZhbHVlLgotICAgKiBAcmV0dXJuIEFuIFhCb29sZWFuIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYQm9vbGVhbiBjcmVhdGVYQm9vbGVhbihib29sZWFuIGIpOwotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gWE5vZGVTZXQuCi0gICAqIEBwYXJhbSBubCBBIE5vZGVMaXN0IG9iamVjdC4KLSAgICogQHJldHVybiBBbiBYTm9kZVNldCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgWE5vZGVTZXQgY3JlYXRlWE5vZGVTZXQoTm9kZUxpc3QgbmwpOwotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gWE5vZGVTZXQgZnJvbSBhIG5vZGUuCi0gICAqIEBwYXJhbSBuIEEgRE9NIG5vZGUuCi0gICAqIEByZXR1cm4gQW4gWE5vZGVTZXQgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhOb2RlU2V0IGNyZWF0ZVhOb2RlU2V0KE5vZGUgbik7Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBYTnVsbC4KLSAgICogQHJldHVybiBBbiBYTnVsbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgWE51bGwgY3JlYXRlWE51bGwoKTsKLQotICAvKioKLSAgICogU3VibWl0IGEgdG9wLWxldmVsIHN0eWxlc2hlZXQgcGFyYW1ldGVyLiAgVGhpcyB2YWx1ZSBjYW4KLSAgICogYmUgZXZhbHVhdGVkIGluIHRoZSBzdHlsZXNoZWV0IHZpYSB4c2w6cGFyYW0tdmFyaWFibGUuCi0gICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHBhcmFtLgotICAgKiBAcGFyYW0gdmFsdWUgQW4gWE9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0eWxlc2hlZXRQYXJhbShTdHJpbmcga2V5LCBYT2JqZWN0IHZhbHVlKTsKLQotICAvKioKLSAgICogU2V0IGEgdG9wLWxldmVsIHN0eWxlc2hlZXQgcGFyYW1ldGVyLiAgVGhpcyB2YWx1ZSBjYW4KLSAgICogYmUgZXZhbHVhdGVkIHZpYSB4c2w6cGFyYW0tdmFyaWFibGUuICBOb3RlIHRoYXQgdGhlIHZhbHVlCi0gICAqIHBhc3NlZCBpcyBhbiBleHByZXNzaW9uLCBhbmQgbm90IGEgc3RyaW5nLiAgVGhpcyBtZWFucyB0aGF0Ci0gICAqIHNldFN0eWxlc2hlZXRQYXJhbSgiZm9vIiwgImhlbGxvIik7IHdpbGwgbG9vayBmb3IgdGhlCi0gICAqIGVsZW1lbnQgImhlbGxvIi4gIElmIHlvdSB3YW50IHRvIHBhc3MgYSBzdHJpbmcsIHlvdSdsbAotICAgKiBuZWVkIHRvIHB1dCBxdW90ZXMgYXJvdW5kIGl0OgotICAgKiBzZXRTdHlsZXNoZWV0UGFyYW0oImZvbyIsICInaGVsbG8nIik7IHdpbGwgbG9vayBmb3IgdGhlCi0gICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHBhcmFtLgotICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBBbiBleHByZXNzaW9uIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdHlsZXNoZWV0UGFyYW0oU3RyaW5nIGtleSwgU3RyaW5nIGV4cHJlc3Npb24pOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgRm9ybWF0dGVyTGlzdGVuZXIgKFNBWCBEb2N1bWVudEhhbmRsZXIpLCBvciBudWxsIGlmIG5vbmUgaGFzIGJlZW4gc2V0LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50SGFuZGxlciBnZXRGb3JtYXR0ZXJMaXN0ZW5lcigpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIEZvcm1hdHRlckxpc3RlbmVyICh0aGUgU0FYIERvY3VtZW50SGFuZGxlcikuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGb3JtYXR0ZXJMaXN0ZW5lcihEb2N1bWVudEhhbmRsZXIgZmxpc3RlbmVyKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IFNBWCBEb2N1bWVudEhhbmRsZXIgKHRoZSBzYW1lIG9iamVjdCBhcyB0aGUgRm9ybWF0dGVyTGlzdGVuZXIpLCBvciBudWxsIGlmIG5vbmUgaGFzIGJlZW4gc2V0LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50SGFuZGxlciBnZXREb2N1bWVudEhhbmRsZXIoKTsKLQotICAvKioKLSAgICogU2V0IHRoZSBjdXJyZW50IFNBWCBEb2N1bWVudEhhbmRsZXIgKHRoZSBzYW1lCi0gICAqIG9iamVjdCBhcyB0aGUgRm9ybWF0dGVyTGlzdGVuZXIpLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRIYW5kbGVyKERvY3VtZW50SGFuZGxlciBsaXN0ZW5lcik7Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHRyYWNlIGxpc3RlbmVyIGZvciB0aGUgcHVycG9zZXMgb2YgZGVidWdnaW5nIGFuZCBkaWFnbm9zaXMuCi0gICAqIEBwYXJhbSB0bCBUcmFjZSBsaXN0ZW5lciB0byBiZSBhZGRlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFRyYWNlTGlzdGVuZXIoVHJhY2VMaXN0ZW5lciB0bCkKLSAgICB0aHJvd3MgVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbjsKLQotICAvKioKLSAgICogSWYgc2V0IHRvIHRydWUsIHRlbXBsYXRlIGNhbGxzIGFyZSB0cmFjZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUcmFjZVRlbXBsYXRlcyhib29sZWFuIGIpOwotCi0gIC8qKgotICAgKiBJZiBzZXQgdG8gdHJ1ZSwgc2VsZWN0aW9uIGV2ZW50cyBhcmUgdHJhY2VkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHJhY2VTZWxlY3QoYm9vbGVhbiBiKTsKLQotICAvKioKLSAgICogSWYgc2V0IHRvIHRydWUgKHRoZSBkZWZhdWx0IGlzIGZhbHNlKSwgYXMgdGVtcGxhdGUgY2hpbGRyZW4gYXJlIGJlaW5nIGNvbnN0cnVjdGVkLCBkZWJ1ZyBkaWFnbm9zdGljcwotICAgKiBhcmUgd3JpdHRlbiB0byB0aGUgbV9kaWFnbm9zdGljc1ByaW50V3JpdGVyCi0gICAqIHN0cmVhbS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRyYWNlVGVtcGxhdGVDaGlsZHJlbihib29sZWFuIGIpOwotCi0gIC8qKgotICAgKiBJZiBzZXQgdG8gdHJ1ZSAodGhlIGRlZmF1bHQpLCBwYXR0ZXJuIGNvbmZsaWN0IHdhcm5pbmdzIGFyZSBub3QgcHJpbnRlZCB0byB0aGUgZGlhZ25vc3RpY3Mgc3RyZWFtLgotICAgKiBAcGFyYW0gYiB0cnVlIGlmIGNvbmZsaWN0IHdhcm5pbmdzIHNob3VsZCBiZSBzdXBwcmVzc2VkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UXVpZXRDb25mbGljdFdhcm5pbmdzKGJvb2xlYW4gYik7Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBhIHRyYWNlIGxpc3RlbmVyLgotICAgKiBAcGFyYW0gdGwgVHJhY2UgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVRyYWNlTGlzdGVuZXIoVHJhY2VMaXN0ZW5lciB0bCk7Ci0KLSAgLyoqCi0gICAqIElmIHNldCwgZGlhZ25vc3RpY3Mgd2lsbCBiZQotICAgKiB3cml0dGVuIHRvIHRoZSBtX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIgc3RyZWFtLiBJZgotICAgKiBudWxsLCBkaWFnbm9zdGljcyBhcmUgdHVybmVkIG9mZi4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2QgY2FsbHMKLSAgICoge0BsaW5rICNzZXREaWFnbm9zdGljc091dHB1dChqYXZhLmlvLlByaW50V3JpdGVyKX0uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREaWFnbm9zdGljc091dHB1dChqYXZhLmlvLk91dHB1dFN0cmVhbSBvdXQpOwotCi0gIC8qKgotICAgKiBJZiBzZXQsIGRpYWdub3N0aWNzIHdpbGwgYmUKLSAgICogd3JpdHRlbiB0byB0aGUgbV9kaWFnbm9zdGljc1ByaW50V3JpdGVyIHN0cmVhbS4gSWYKLSAgICogbnVsbCwgZGlhZ25vc3RpY3MgYXJlIHR1cm5lZCBvZmYuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREaWFnbm9zdGljc091dHB1dChqYXZhLmlvLlByaW50V3JpdGVyIHB3KTsKLQotICAvKioKLSAgICogU2V0IHRoZSBwcm9ibGVtIGxpc3RlbmVyIHByb3BlcnR5LgotICAgKiBUaGUgWFNMIGNsYXNzIGNhbiBoYXZlIGEgc2luZ2xlIGxpc3RlbmVyIHRvIGJlIGluZm9ybWVkCi0gICAqIG9mIGVycm9ycyBhbmQgd2FybmluZ3MuIFRoZSBwcm9ibGVtIGxpc3RlbmVyIG5vcm1hbGx5IGNvbnRyb2xzIHdoZXRoZXIgYW4gZXhjZXB0aW9uCi0gICAqIGlzIHRocm93biBvciBub3QgKG9yIHRoZSBwcm9ibGVtIGxpc3RlbmVycyBjYW4gdGhyb3cgaXRzIG93biBSdW50aW1lRXhjZXB0aW9uKS4KLSAgICogQHBhcmFtIGwgQSBQcm9ibGVtTGlzdGVuZXIgaW50ZXJmYWNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvYmxlbUxpc3RlbmVyKFByb2JsZW1MaXN0ZW5lciBsKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBwcm9ibGVtIGxpc3RlbmVyIHByb3BlcnR5LgotICAgKiBUaGUgWFNMIGNsYXNzIGNhbiBoYXZlIGEgc2luZ2xlIGxpc3RlbmVyIHRvIGJlIGluZm9ybWVkCi0gICAqIG9mIGVycm9ycyBhbmQgd2FybmluZ3MuIFRoZSBwcm9ibGVtIGxpc3RlbmVyIG5vcm1hbGx5IGNvbnRyb2xzIHdoZXRoZXIgYW4gZXhjZXB0aW9uCi0gICAqIGlzIHRocm93biBvciBub3QgKG9yIHRoZSBwcm9ibGVtIGxpc3RlbmVyIGNhbiB0aHJvdyBpdHMgb3duIFJ1bnRpbWVFeGNlcHRpb24pLgotICAgKiBAcmV0dXJuIEEgUHJvYmxlbUxpc3RlbmVyIGludGVyZmFjZS4KLSAgICovCi0gIHB1YmxpYyBQcm9ibGVtTGlzdGVuZXIgZ2V0UHJvYmxlbUxpc3RlbmVyKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFRQcm9jZXNzb3JGYWN0b3J5LmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9YU0xUUHJvY2Vzc29yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjk1MDI4Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFRQcm9jZXNzb3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgIAotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54c2x0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuWE1MUGFyc2VyTGlhaXNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoRmFjdG9yeTsKLS8vaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUHJvY2Vzc29yOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVGVtcGxhdGVzOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlRyZWVXYWxrZXI7Ci0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KLSAqIE1hbnVmYWN0dXJlcyB0aGUgcHJvY2Vzc29yIGZvciBwZXJmb3JtaW5nIHRyYW5zZm9ybWF0aW9ucy4gVXNlIG9uZSBvZiB0aGUgc3RhdGljIGdldFByb2Nlc3NvciBtZXRob2RzCi0gKiB0byBjcmVhdGUgYW4gWFNMVFByb2Nlc3NvciBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xUUHJvY2Vzc29yRmFjdG9yeQotewotICAvKioKLSAgICogR2V0IGEgbmV3IFhTTFRQcm9jZXNzb3IuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFhTTFRQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKCkKLSAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCi0gIHsKLSAgICAvL1Byb2Nlc3NvciBwcm9jZXNzb3IgPSBQcm9jZXNzb3IubmV3SW5zdGFuY2UoInhzbHQiKTsgCi0gICAgcmV0dXJuIG5ldyBYU0xURW5naW5lSW1wbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIG5ldyBYU0xUUHJvY2Vzc29yIChwYXJzZXJMaWFpc29uQ2xhc3NOYW1lIG5vIGxvbmdyZSB1c2VkKS4KLSAgICogKgotICAgKiBAc2VlICNnZXRQcm9jZXNzb3IoKQotICAgKiBAc2VlIG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLlhNTFBhcnNlckxpYWlzb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgWFNMVFByb2Nlc3NvciBnZXRQcm9jZXNzb3JVc2luZ0xpYWlzb25OYW1lKFN0cmluZyBwYXJzZXJMaWFpc29uQ2xhc3NOYW1lKQotICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KLSAgewotICAgIC8vcmV0dXJuIG5ldyBYU0xURW5naW5lSW1wbChwYXJzZXJMaWFpc29uQ2xhc3NOYW1lKTsKLSAgICAvL1Byb2Nlc3NvciBwcm9jZXNzb3IgPSBQcm9jZXNzb3IubmV3SW5zdGFuY2UoInhzbHQiKTsgCi0gICAgcmV0dXJuIG5ldyBYU0xURW5naW5lSW1wbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIG5ldyBYU0xUUHJvY2Vzc29yIChYTUxQYXJzZXJMaWFpc29uIG5vIGxvbmdlciB1c2VkKS4KLSAgICoKLSAgICogQHBhcmFtIHBhcnNlckxpYWlzb24gdGhlIFhNTFBhcnNlckxpYWlzb24gc2V0IHVwIHRvIGludGVyYWN0IHdpdGggYSBnaXZlbiBYTUwgcGFyc2VyLgotICAgKiBAcmV0dXJuIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBYU0xUUHJvY2Vzc29yIGludGVyZmFjZSB3aXRoIHdoaWNoIHlvdSBjYW4gcGVyZm9ybSB0cmFuc2Zvcm1hdGlvbnMuCi0gICAqCi0gICAqIEBzZWUgI2dldFByb2Nlc3NvcigpCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuWE1MUGFyc2VyTGlhaXNvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBYU0xUUHJvY2Vzc29yIGdldFByb2Nlc3NvcihYTUxQYXJzZXJMaWFpc29uIHBhcnNlckxpYWlzb24pCi0gIHsKLSAgICAvL3JldHVybiBuZXcgWFNMVEVuZ2luZUltcGwocGFyc2VyTGlhaXNvbik7Ci0gICAgdHJ5ewotICAgICAgLy9Qcm9jZXNzb3IgcHJvY2Vzc29yID0gUHJvY2Vzc29yLm5ld0luc3RhbmNlKCJ4c2x0Iik7IAotICAgICAgcmV0dXJuIG5ldyBYU0xURW5naW5lSW1wbCgpOwotICAgIH0KLSAgIC8qIGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0qLwotICAgIGNhdGNoIChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gIH0KLQotICAvKioKLSAgICogR2V0IGEgbmV3IFhTTFRQcm9jZXNzb3IgKFhNTFBhcnNlckxpYWlzb24gYW5kIFhQYXRoRmFjdG9yeSBubyBsb25nZXIgdXNlZCkuCi0gICAqCi0gICAqIEBwYXJhbSBwYXJzZXJMaWFpc29uIHRoZSBYTUxQYXJzZXJMaWFpc29uIHNldCB1cCB0byBpbnRlcmFjdCB3aXRoIGEgZ2l2ZW4gWE1MIHBhcnNlci4KLSAgICogQHBhcmFtIHhwYXRoRmFjdG9yeSBBIGN1c3RvbSBYUGF0aEZhY3RvcnkuCi0gICAqIEByZXR1cm4gQW4gaW1wbGVudGF0aW9uIG9mIHRoZSBYU0xUUHJvY2Vzc29yIGludGVyZmFjZSB3aXRoIHdoaWNoIHlvdQotICAgKiBjYW4gcGVyZm9ybSB0cmFuc2Zvcm1hdGlvbnMuCi0gICAqCi0gICAqIEBzZWUgI2dldFByb2Nlc3NvcigpCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuWE1MUGFyc2VyTGlhaXNvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBYU0xUUHJvY2Vzc29yIGdldFByb2Nlc3NvcihYTUxQYXJzZXJMaWFpc29uIHBhcnNlckxpYWlzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoRmFjdG9yeSB4cGF0aEZhY3RvcnkpCi0gIHsKLSAgICAvL3JldHVybiBuZXcgWFNMVEVuZ2luZUltcGwocGFyc2VyTGlhaXNvbiwgeHBhdGhGYWN0b3J5KTsKLSAgICB0cnl7Ci0gICAgICAvL1Byb2Nlc3NvciBwcm9jZXNzb3IgPSBQcm9jZXNzb3IubmV3SW5zdGFuY2UoInhzbHQiKTsgCi0gICAgICByZXR1cm4gbmV3IFhTTFRFbmdpbmVJbXBsKCk7Ci0gICAgfQotICAvKiAgY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ki8KLSAgICBjYXRjaCAob3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9YU0xUUmVzdWx0VGFyZ2V0LmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9YU0xUUmVzdWx0VGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOGUzOTguLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvWFNMVFJlc3VsdFRhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHNsdDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5QYXJzZXJBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYUmVzdWx0OwotCi0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KLSAqIENvbnRhaW5zIHRoZSByZXN1bHQgb2YgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IHlvdSBwZXJmb3JtIHdpdGggdGhlCi0gKiBYU0xUUHJvY2Vzc29yIHByb2Nlc3MoKSBtZXRob2Qgb3Igb25lIG9mIHRoZSBTdHlsZXNoZWV0Um9vdCBwcm9jZXNzKCkgbWV0aG9kcy4KLSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHRvIHByb3ZpZGUgdGhlIHByb2Nlc3MoKSBtZXRob2QgYSBjb250YWluZXIKLSAqIGZvciB0aGUgdHJhbnNmb3JtYXRpb24gcmVzdWx0IHRyZWUuCi0gKiBZb3UgY2FuIHVzZSBhIGZpbGUgbmFtZSBvciBVUkwsIGNoYXJhY3RlciBzdHJlYW0sIGJ5dGUgc3RyZWFtLCBET00gTm9kZSwgb3IgU0FYIERvY3VtZW50SGFuZGxlcgotICogdG8gaW5zdGFudGlhdGUgYW4gWFNMVFJlc3VsdFRhcmdldCBvYmplY3QuCi0gKgotICogQHNlZSBYU0xUUHJvY2Vzc29yI3Byb2Nlc3MoWFNMVElucHV0U291cmNlLCBYU0xUSW5wdXRTb3VyY2UsIFhTTFRSZXN1bHRUYXJnZXQpCi0gKiBAc2VlIFN0eWxlc2hlZXRSb290Ci0gKi8KLXB1YmxpYyBjbGFzcyBYU0xUUmVzdWx0VGFyZ2V0IC8vaW1wbGVtZW50cyBSZXN1bHQgLy9leHRlbmRzIFN0cmVhbVJlc3VsdAotewotICAKLSAgcHJpdmF0ZSBTdHJlYW1SZXN1bHQgc3IgPSBudWxsOwotICBwcml2YXRlIFNBWFJlc3VsdCBzYXhSZXN1bHQgPSBudWxsOwotICBwcml2YXRlIERPTVJlc3VsdCBkciA9IG51bGw7Ci0gIAotICAKLSAgLyoqCi0gICAgKiBaZXJvLWFyZ3VtZW50IGRlZmF1bHQgY29uc3RydWN0b3IgIC0tIEJlZm9yZSB5b3UgY2FuIHVzZSB0aGUgbmV3IFhTTFRSZXN1bHRUYXJnZXQgb2JqZWN0IGluIGEgdHJhbnNmb3JtYXRpb24sCi0gICAgKiB5b3UgbXVzdCBkZWZpbmUgdGhlIG91dHB1dCBjb250YWluZXIgYnkgc2V0dGluZyBpdHMgRmlsZU5hbWUsIENoYXJhY3RlclN0cmVhLCBCeXRlU3RyZWFtLCBvciBOb2RlIHByb3BlcnR5LgotICAgICoKLSAgICAqIEBzZWUgI3NldEZpbGVOYW1lKFN0cmluZykKLSAgICAqIEBzZWUgI3NldENoYXJhY3RlclN0cmVhbShXcml0ZXIpCi0gICAgKiBAc2VlICNzZXRCeXRlU3RyZWFtKE91dHB1dFN0cmVhbSkKLSAgICAqIEBzZWUgI3NldE5vZGUoTm9kZSkKLSAgICAqIEBzZWUgI3NldERvY3VtZW50SGFuZGxlcihEb2N1bWVudEhhbmRsZXIpCi0gICAgKiBAc2VlICNzZXRFbmNvZGluZyhTdHJpbmcpCi0gICAgKi8KLSAgcHVibGljIFhTTFRSZXN1bHRUYXJnZXQgKCkKLSAgewotICAgICBzciA9IG5ldyBTdHJlYW1SZXN1bHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgb3V0cHV0IHRhcmdldCB3aXRoIGEgZmlsZSBuYW1lIC0tIHRoZSBlcXVpdmFsZW50IG9mIGNyZWF0aW5nIGFuIG91dHB1dCB0YXJnZXQKLSAgICogd2l0aCB0aGUgemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvciBhbmQgc2V0dGluZyB0aGUgbmV3IG9iamVjdCdzIEZpbGVOYW1lIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gZmlsZU5hbWUgSWRlbnRpZmllcyB0aGUgZmlsZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgdHJhbnNmb3JtYXRpb24gcmVzdWx0IChtdXN0IGJlIGEgdmFsaWQgc3lzdGVtIGZpbGUgbmFtZSkuCi0gICAqCi0gICAqIEBzZWUgI3NldEZpbGVOYW1lKFN0cmluZykKLSAgICogQHNlZSAjc2V0Q2hhcmFjdGVyU3RyZWFtKFdyaXRlcikKLSAgICogQHNlZSAjc2V0Qnl0ZVN0cmVhbShPdXRwdXRTdHJlYW0pCi0gICAqIEBzZWUgI3NldE5vZGUoTm9kZSkKLSAgICogQHNlZSAjc2V0RG9jdW1lbnRIYW5kbGVyKERvY3VtZW50SGFuZGxlcikKLSAgICogQHNlZSAjc2V0RW5jb2RpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFhTTFRSZXN1bHRUYXJnZXQgKFN0cmluZyBmaWxlTmFtZSkgLy8gRmlsZT8KLSAgewotICAgIHNyID0gbmV3IFN0cmVhbVJlc3VsdCgpOwotICAgIHNyLnNldFN5c3RlbUlkKGZpbGVOYW1lKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBvdXRwdXQgdGFyZ2V0IHdpdGggYSBieXRlIHN0cmVhbSAtLSB0aGUgZXF1aXZhbGVudCBvZiBjcmVhdGluZyBhbiBvdXRwdXQgdGFyZ2V0Ci0gICAqIHdpdGggdGhlIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IgYW5kIHNldHRpbmcgdGhlIG5ldyBvYmplY3QncyBCeXRlU3RyZWFtIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gYnl0ZVN0cmVhbSBUaGUgcmF3IGJ5dGUgc3RyZWFtIHRoYXQgd2lsbCBjb250YWluIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQuCi0gICAqCi0gICAqIEBzZWUgI3NldEJ5dGVTdHJlYW0oT3V0cHV0U3RyZWFtKQotICAgKiBAc2VlICNzZXRGaWxlTmFtZShTdHJpbmcpCi0gICAqIEBzZWUgI3NldENoYXJhY3RlclN0cmVhbShXcml0ZXIpCi0gICAqIEBzZWUgI3NldE5vZGUoTm9kZSkKLSAgICogQHNlZSAjc2V0RG9jdW1lbnRIYW5kbGVyKERvY3VtZW50SGFuZGxlcikKLSAgICogQHNlZSAjc2V0RW5jb2RpbmcoU3RyaW5nKQotICAgKi8KLQotICBwdWJsaWMgWFNMVFJlc3VsdFRhcmdldCAoT3V0cHV0U3RyZWFtIGJ5dGVTdHJlYW0pCi0gIHsKLSAgICBzciA9IG5ldyBTdHJlYW1SZXN1bHQoKTsKLSAgICBzci5zZXRPdXRwdXRTdHJlYW0oYnl0ZVN0cmVhbSk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgb3V0cHV0IHRhcmdldCB3aXRoIGEgY2hhcmFjdGVyIHN0cmVhbSAtLSB0aGUgZXF1aXZhbGVudCBvZiBjcmVhdGluZyBhbiBvdXRwdXQgdGFyZ2V0Ci0gICAqIHdpdGggdGhlIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IgYW5kIHNldHRpbmcgdGhlIG5ldyBvYmplY3QncyBDaGFyYWN0ZXJTdHJlYW0gcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFyYWN0ZXJTdHJlYW0gVGhlIGNoYXJhY3RlciBzdHJlYW0gd2hlcmUgdGhlIHRyYW5zZm9ybWF0aW9uIHJlc3VsdCBpcyB3cml0dGVuLgotICAgKgotICAgKiBAc2VlICNzZXRDaGFyYWN0ZXJTdHJlYW0oV3JpdGVyKQotICAgKiBAc2VlICNzZXRCeXRlU3RyZWFtKE91dHB1dFN0cmVhbSkKLSAgICogQHNlZSAjc2V0RmlsZU5hbWUoU3RyaW5nKQotICAgKiBAc2VlICNzZXROb2RlKE5vZGUpCi0gICAqIEBzZWUgI3NldERvY3VtZW50SGFuZGxlcihEb2N1bWVudEhhbmRsZXIpCi0gICAqIEBzZWUgI3NldEVuY29kaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBYU0xUUmVzdWx0VGFyZ2V0IChXcml0ZXIgY2hhcmFjdGVyU3RyZWFtKQotICB7Ci0gICAgc3IgPSBuZXcgU3RyZWFtUmVzdWx0KCk7Ci0gICAgc3Iuc2V0V3JpdGVyKGNoYXJhY3RlclN0cmVhbSk7Ci0gIH0gICAgCi0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBvdXRwdXQgdGFyZ2V0IHdpdGggYSBET00gTm9kZSAtLSB0aGUgZXF1aXZhbGVudCBvZiBjcmVhdGluZyBhbiBvdXRwdXQgdGFyZ2V0Ci0gICAqIHdpdGggdGhlIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IgYW5kIHNldHRpbmcgdGhlIG5ldyBvYmplY3QncyBOb2RlIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gbm9kZSBUaGUgRE9NIE5vZGUgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHRyYW5zZm9ybWF0aW9uIHJlc3VsdC4KLSAgICoKLSAgKiBAc2VlICNzZXROb2RlKE5vZGUpCi0gICAqIEBzZWUgI3NldENoYXJhY3RlclN0cmVhbShXcml0ZXIpCi0gICAqIEBzZWUgI3NldEJ5dGVTdHJlYW0oT3V0cHV0U3RyZWFtKQotICAgKiBAc2VlICNzZXRGaWxlTmFtZShTdHJpbmcpCi0gICAqIEBzZWUgI3NldERvY3VtZW50SGFuZGxlcihEb2N1bWVudEhhbmRsZXIpCi0gICAqIEBzZWUgI3NldEVuY29kaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBYU0xUUmVzdWx0VGFyZ2V0IChOb2RlIG4pCi0gIHsKLSAgICBkciA9IG5ldyBET01SZXN1bHQoKTsKLSAgICBkci5zZXROb2RlKG4pOwotICB9ICAgIAotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgb3V0cHV0IHRhcmdldCB3aXRoIGEgU0FYIERvY3VtZW50IGhhbmRsZXIsIHdoaWNoCi0gICAqIHdpbGwgaGFuZGxlIHJlc3VsdCBldmVudHMgLS0gdGhlIGVxdWl2YWxlbnQgb2YgY3JlYXRpbmcgYW4gb3V0cHV0IHRhcmdldCB3aXRoIHRoZQotICAgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yIGFuZCBzZXR0aW5nIHRoZSBuZXcgb2JqZWN0J3MgRG9jeXVtZW50SGFuZGxlciBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIFNBWCBEb2N1bWVudCBoYW5kbGVyIHRvIHdoaWNoIHRoZSByZXN1bHQgaXMgd3JpdHRlbi4KLSAgICoKLSAgKiBAc2VlICNzZXREb2N1bWVudEhhbmRsZXIoRG9jdW1lbnRIYW5kbGVyKQotICAgKiBAc2VlICNzZXROb2RlKE5vZGUpCi0gICAqIEBzZWUgI3NldENoYXJhY3RlclN0cmVhbShXcml0ZXIpCi0gICAqIEBzZWUgI3NldEJ5dGVTdHJlYW0oT3V0cHV0U3RyZWFtKQotICAgKiBAc2VlICNzZXRGaWxlTmFtZShTdHJpbmcpCi0gICAqIEBzZWUgI3NldEVuY29kaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBYU0xUUmVzdWx0VGFyZ2V0KERvY3VtZW50SGFuZGxlciBoYW5kbGVyKQotICB7IAotICAgIFNBWFJlc3VsdCBzYXhSZXN1bHQgPSBuZXcgU0FYUmVzdWx0KCk7ICAgIAotICAgIHNldERvY3VtZW50SGFuZGxlcihoYW5kbGVyKTsKLSAgfQotICAgIAotCi0gIC8qKgotICAgKiBTZXQgdGhlIGZpbGUgbmFtZSBvciBVUkwgd2hlcmUgdGhlIHRyYW5zZm9ybWF0aW9uIHJlc3VsdCB3aWxsIGJlIHdyaXR0ZW4uCi0gICAqCi0gICAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgc3lzdGVtIGlkZW50aWZpZXIgYXMgYSBzdHJpbmcuCi0gICAqCi0gICAqIEBzZWUgI1hTTFRSZXN1bHRUYXJnZXQoU3RyaW5nKQotICAgKiBAc2VlICNnZXRGaWxlTmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWUgKFN0cmluZyBmaWxlTmFtZSkgLy8gRmlsZT8KLSAgewotICAgIGlmIChzciA9PSBudWxsKQotICAgICAgc3IgPSBuZXcgU3RyZWFtUmVzdWx0KCk7Ci0gICAgc3Iuc2V0U3lzdGVtSWQoZmlsZU5hbWUpOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0IHRoZSBmaWxlIG5hbWUgd2hlcmUgdGhlIHJlc3VsdHMgYXJlIG9yIHdpbGwgYmUgd3JpdHRlbiwgb3IgbnVsbCBpZiBub25lIHdhcyBzdXBwbGllZC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgZmlsZSBuYW1lIG9yIFVSTC4KLSAgICoKLSAgICogQHNlZSAjWFNMVFJlc3VsdFRhcmdldChTdHJpbmcpCi0gICAqIEBzZWUgI3NldEZpbGVOYW1lKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUgKCkKLSAgewotICAgIGlmIChzciAhPSBudWxsKQotICAgICAgcmV0dXJuIHNyLmdldFN5c3RlbUlkKCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0gCi0KLQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGNoYXJhY3RlciBlbmNvZGluZywgaWYga25vd24uCi0gICAqCi0gICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgY2hhcmFjdGVyIGVuY29kaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcgKFN0cmluZyBlbmNvZGluZykKLSAgewotICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHRoYXQgd2FzIHVzZWQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGVuY29kaW5nLCBvciBudWxsIGlmIG5vbmUgd2FzIHN1cHBsaWVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZyAoKQotICB7Ci0gICAgcmV0dXJuIGVuY29kaW5nOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKLQotCi0gIC8qKgotICAgKiBTZXQgYSBTQVggRG9jdW1lbnRIYW5kbGVyIHRvIHByb2Nlc3MgdGhlIHJlc3VsdCB0cmVlIGV2ZW50cy4KLSAgICogWW91IGNhbiBwcm9jZXNzIGV2ZW50cyBhcyB0aGV5IG9jY3VyCi0gICAqIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBiZSBjb21wbGV0ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBTQVggRG9jdW1lbnRIYW5kbGVyIHRvIHByb2Nlc3MgcmVzdWx0IHRyZWUgZXZlbnRzLgotICAgKgotICAgKiBAc2VlICNYU0xUUmVzdWx0VGFyZ2V0KERvY3VtZW50SGFuZGxlcikKLSAgICogQHNlZSAjZ2V0RG9jdW1lbnRIYW5kbGVyKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERvY3VtZW50SGFuZGxlciAoRG9jdW1lbnRIYW5kbGVyIGhhbmRsZXIpCi0gIHsKLSAgICB0aGlzLmZvcm1hdHRlckxpc3RlbmVyID0gaGFuZGxlcjsKLSAgICBpZiAoaGFuZGxlciBpbnN0YW5jZW9mIFBhcnNlckFkYXB0ZXIpCi0gICAgewotICAgICAgaWYgKHNheFJlc3VsdCA9PSBudWxsKQotICAgICAgICBzYXhSZXN1bHQgPSBuZXcgU0FYUmVzdWx0KCk7Ci0gICAgICBzYXhSZXN1bHQuc2V0SGFuZGxlcigoKFBhcnNlckFkYXB0ZXIpaGFuZGxlcikuZ2V0Q29udGVudEhhbmRsZXIoKSk7Ci0gICAgfSAgCi0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBTQVggRG9jdW1lbnRIYW5kbGVyIHRoYXQgcHJvY2Vzc2VzIHRoZSByZXN1bHQgdHJlZSBldmVudHMuCi0gICAqIFlvdSBjYW4gdXNlIHRoZSBEb2N1bWVudEhhbmRsZXIgdG8gcHJvY2VzcyBldmVudHMgYXMgdGhleSBvY2N1cgotICAgKiByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYmUgY29tcGxldGVkLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBTQVggRG9jdW1lbnRIYW5kbGVyIHRoYXQgcHJvY2Vzc2VzIHJlc3VsdCB0cmVlIGV2ZW50cy4KLSAgICoKLSAgICogQHNlZSAjWFNMVFJlc3VsdFRhcmdldChEb2N1bWVudEhhbmRsZXIpCi0gICAqIEBzZWUgI3NldERvY3VtZW50SGFuZGxlcihEb2N1bWVudEhhbmRsZXIpCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnRIYW5kbGVyIGdldERvY3VtZW50SGFuZGxlciAoKQotICB7Ci0gICAgcmV0dXJuIGZvcm1hdHRlckxpc3RlbmVyOwotICB9Ci0gIAotICBwcml2YXRlIERvY3VtZW50SGFuZGxlciBmb3JtYXR0ZXJMaXN0ZW5lciA9IG51bGw7Ci0gIAotICAvKioKLSAgICAgKiBTZXQgdGhlIG5vZGUgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHJlc3VsdCBET00gdHJlZS4gIEluIHByYWN0aWNlLAotICAgICAqIHRoZSBub2RlIHNob3VsZCBiZSBhIHtAbGluayBvcmcudzNjLmRvbS5Eb2N1bWVudH0gbm9kZSwKLSAgICAgKiBhIHtAbGluayBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50fSBub2RlLCBvciBhCi0gICAgICoge0BsaW5rIG9yZy53M2MuZG9tLkVsZW1lbnR9IG5vZGUuICBJbiBvdGhlciB3b3JkcywgYSBub2RlCi0gICAgICogdGhhdCBhY2NlcHRzIGNoaWxkcmVuLgotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gd2hpY2ggdGhlIHRyYW5zZm9ybWF0aW9uCi0gICAgICogd2lsbCBiZSBhcHBlbmRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkgewotICAgICAgaWYgKGRyID09IG51bGwpCi0gICAgICAgIGRyID0gbmV3IERPTVJlc3VsdCgpOwotICAgICAgZHIuc2V0Tm9kZShub2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5vZGUgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHJlc3VsdCBET00gdHJlZS4KLSAgICAgKiBJZiBubyBub2RlIHdhcyBzZXQgdmlhIHNldE5vZGUsIHRoZSBub2RlIHdpbGwgYmUKLSAgICAgKiBzZXQgYnkgdGhlIHRyYW5zZm9ybWF0aW9uLCBhbmQgbWF5IGJlIG9idGFpbmVkIGZyb20KLSAgICAgKiB0aGlzIG1ldGhvZCBvbmNlIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBjb21wbGV0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5vZGUgdG8gd2hpY2ggdGhlIHRyYW5zZm9ybWF0aW9uCi0gICAgICogd2lsbCBiZSBhcHBlbmRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotICAgICAgaWYgKGRyICE9IG51bGwpCi0gICAgICAgIHJldHVybiBkci5nZXROb2RlKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAvKioKLSAgICogU2V0IHRoZSBieXRlIHN0cmVhbSB0byBjb250YWluIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlU3RyZWFtIEEgYnl0ZSBzdHJlYW0gdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHRyYW5zZm9ybWF0aW9uIHJlc3VsdC4KLSAgICoKLSAgICogQHNlZSAjWFNMVFJlc3VsdFRhcmdldChPdXRwdXRTdHJlYW0pCi0gICAqIEBzZWUgI3NldEJ5dGVTdHJlYW0oT3V0cHV0U3RyZWFtKQotICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCeXRlU3RyZWFtKE91dHB1dFN0cmVhbSBieXRlU3RybSkgewotICAgICAgICBpZiAoc3IgPT0gbnVsbCkKLSAgICAgICAgICBzciA9IG5ldyBTdHJlYW1SZXN1bHQoKTsKLSAgICAgICAgc3Iuc2V0T3V0cHV0U3RyZWFtKGJ5dGVTdHJtKTsKLSAgICB9Ci0KLSAvKioKLSAgICogR2V0IHRoZSBieXRlIHN0cmVhbSB0aGF0IGNvbnRhaW5zIG9yIHdpbGwgY29udGFpbiB0aGUgdHJhbnNmb3JtYXRpb24gcmVzdWx0LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBieXRlIHN0cmVhbSwgb3IgbnVsbCBpZiBub25lIHdhcyBzdXBwbGllZC4KLSAgICoKLSAgICogQHNlZSAjWFNMVFJlc3VsdFRhcmdldChPdXRwdXRTdHJlYW0pCi0gICAqIEBzZWUgI3NldEJ5dGVTdHJlYW0oT3V0cHV0U3RyZWFtKQotICAgKi8KLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldEJ5dGVTdHJlYW0oKSB7Ci0gICAgICBpZiAoc3IgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHNyLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzeXN0ZW0gaWRlbnRpZmllciBmb3IgdGhpcyBSZXN1bHQuCi0gICAgICoKLSAgICAgKiA8cD5JZiB0aGUgUmVzdWx0IGlzIG5vdCB0byBiZSB3cml0dGVuIHRvIGEgZmlsZSwgdGhlIHN5c3RlbSBpZGVudGlmaWVyIGlzIG9wdGlvbmFsLgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtYXkgc3RpbGwgd2FudCB0byBwcm92aWRlIG9uZSwgaG93ZXZlciwgZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdlcwotICAgICAqIGFuZCB3YXJuaW5ncywgb3IgdG8gcmVzb2x2ZSByZWxhdGl2ZSBvdXRwdXQgaWRlbnRpZmllcnMuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHN5c3RlbUlkIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBhcyBhIFVSSSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIHN5c3RlbUlEKQotICAgIHsKLSAgICAgIGlmIChzciAhPSBudWxsKQotICAgICAgICBzci5zZXRTeXN0ZW1JZChzeXN0ZW1JRCk7Ci0gICAgICBlbHNlIGlmIChkciAhPSBudWxsKQotICAgICAgICBkci5zZXRTeXN0ZW1JZChzeXN0ZW1JRCk7Ci0gICAgICBlbHNlIGlmIChzYXhSZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgc2F4UmVzdWx0LnNldFN5c3RlbUlkKHN5c3RlbUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN5c3RlbSBpZGVudGlmaWVyIHRoYXQgd2FzIHNldCB3aXRoIHNldFN5c3RlbUlkLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc3lzdGVtIGlkZW50aWZpZXIgdGhhdCB3YXMgc2V0IHdpdGggc2V0U3lzdGVtSWQsCi0gICAgICogb3IgbnVsbCBpZiBzZXRTeXN0ZW1JZCB3YXMgbm90IGNhbGxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkKLSAgICB7Ci0gICAgICBpZiAoc3IgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHNyLmdldFN5c3RlbUlkKCk7Ci0gICAgICBlbHNlIGlmIChkciAhPSBudWxsKQotICAgICAgICBkci5nZXRTeXN0ZW1JZCgpOwotICAgICAgZWxzZSBpZiAoc2F4UmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHNheFJlc3VsdC5nZXRTeXN0ZW1JZCgpOwotICAgICAgCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgIC8qKgotICAgICAqIFNldCB0aGUgd3JpdGVyIHRoYXQgaXMgdG8gcmVjZWl2ZSB0aGUgcmVzdWx0LiAgTm9ybWFsbHksCi0gICAgICogYSBzdHJlYW0gc2hvdWxkIGJlIHVzZWQgcmF0aGVyIHRoYW4gYSB3cml0ZXIsIHNvIHRoYXQKLSAgICAgKiB0aGUgdHJhbnNmb3JtZXIgbWF5IHVzZSBpbnN0cnVjdGlvbnMgY29udGFpbmVkIGluIHRoZQotICAgICAqIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucyB0byBjb250cm9sIHRoZSBlbmNvZGluZy4gIEhvd2V2ZXIsCi0gICAgICogdGhlcmUgYXJlIHRpbWVzIHdoZW4gaXQgaXMgdXNlZnVsIHRvIHdyaXRlIHRvIGEgd3JpdGVyLAotICAgICAqIHN1Y2ggYXMgd2hlbiB1c2luZyBhIFN0cmluZ1dyaXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3cml0ZXIgIEEgdmFsaWQgV3JpdGVyIHJlZmVyZW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJTdHJlYW0oV3JpdGVyIHdyaXRlcikgeyAgICAgIAotICAgICAgaWYgKHNyID09IG51bGwpCi0gICAgICAgIHNyID0gbmV3IFN0cmVhbVJlc3VsdCgpOwotICAgICAgc3Iuc2V0V3JpdGVyKHdyaXRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgc3RyZWFtIHRoYXQgd2FzIHNldCB3aXRoIHNldFdyaXRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNoYXJhY3RlciBzdHJlYW0gdGhhdCB3YXMgc2V0IHdpdGggc2V0V3JpdGVyLCBvciBudWxsCi0gICAgICogaWYgc2V0V3JpdGVyIG9yIHRoZSBXcml0ZXIgY29uc3RydWN0b3Igd2FzIG5vdCBjYWxsZWQuCi0gICAgICovCi0gICAgcHVibGljIFdyaXRlciBnZXRDaGFyYWN0ZXJTdHJlYW0oKSB7Ci0gICAgICBpZiAoc3IgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHNyLmdldFdyaXRlcigpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIAotICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFJlc3VsdCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgWFNMVFJlc3VsdFRhcmdldCBvYmplY3QgLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgUmVzdWx0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBYU0xUUmVzdWx0VGFyZ2V0IG9iamVjdAotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBSZXN1bHQgZ2V0UmVzdWx0T2JqZWN0KCkgCi0gICAgewotICAgICAgaWYgKHNyICE9IG51bGwpICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNyOwotICAgICAgZWxzZSBpZiAoZHIgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIGRyOwotICAgICAgZWxzZSAKLSAgICAgICAgcmV0dXJuIHNheFJlc3VsdDsKLSAgICB9IAotICAgIAotfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvcGFja2FnZS5odG1sIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmUzOWYyLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTxIVE1MPjxIRUFEPjwvSEVBRD48Qk9EWT4KLSAgICAgPFA+PEI+VGhlIG1haW4gWGFsYW4tSmF2YSAxIGNvbXBhdGFiaWxpdHkgcGFja2FnZTwvQj4gLS0gZmFjaWxpdGllcyBmb3Igc2V0dGluZyB1cCBhbmQgcGVyZm9ybWluZyBYU0wgdHJhbnNmb3JtYXRpb25zLjwvUD4KLSAgIAotICAgICA8UD5Vc2Ugb25lIG9mIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRQcm9jZXNzb3JGYWN0b3J5fSBzdGF0aWMgZ2V0UHJvY2Vzc29yIG1ldGhvZHMgdG8KLSAgICAgIGluc3RhbnRpYXRlIGFuIHtAbGluayBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVFByb2Nlc3Nvcn0uIFRoZSBYU0xUUHJvY2Vzc29yIGludGVyZmFjZSBkZWZpbmVzIHRoZSAKLSAgICAgIFhTTFQgcHJvY2Vzc29yIEFQSS4gWW91IHNob3VsZCBuZXZlciBuZWVkIHRvIGNhbGwgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gCi0gICAgICAoe0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xURW5naW5lSW1wbH0pIGRpcmVjdGx5LjwvUD4KLSAgICAgIAotICAgICAgPFA+SW5zdGFudGlhdGUge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUSW5wdXRTb3VyY2V9IG9iamVjdHMgZm9yIHRoZSBYTUwgaW5wdXQgYW5kIHRoZSBYU0wKLSAgICAgIHN0eWxlc2hlZXQsIGFuZCBhbiB7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRSZXN1bHRUYXJnZXR9IG9iamVjdCBmb3IgdGhlIHRyYW5zZm9ybWF0aW9uIG91dHB1dC4gCi0gICAgICBZb3UgbWF5IGNvbnN0cnVjdCB0aGVzZSBvYmplY3RzIHdpdGggYSB2YXJpZXR5IG9mIGNvbnRhaW5lcnMvZm9ybWF0cywgaW5jbHVkaW5nIGZpbGVzIG9yIFVSTHMsIGNoYXJhY3RlcgotICAgICAgc3RyZWFtcyxieXRlIHN0cmVhbXMsIFNBWCBpbnB1dCBzdHJlYW1zIG9yIGRvY3VtZW50IGhhbmRsZXJzLCBhbmQgYSBET00gdHJlZS48L1A+Ci0gICAgICA8UD5BcyBhIGdlbmVyYWwgcnVsZSwgdXNlIHRoZSBYU0xUUHJvY2Vzc29yIHByb2Nlc3MgbWV0aG9kIHRvIHBlcmZvcm0gYSB0cmFuc2Zvcm1hdGlvbiwgdGhlcmVieSBmaWxsaW5nIHRoZQotICAgICAgWFNMVFJlc3VsdFRhcmdldCBvYmplY3QuIEZvciByZXBlYXRlZCB0cmFuc2Zvcm1hdGlvbnMsIHRvIGdhdGhlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdHlsZXNoZWV0IGJlZm9yZSB5b3UKLSAgICAgIHBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uLCBvciB0byBzZXQgdXAgdGhlIHByb2Nlc3NvciB0byBmdW5jdGlvbiBhcyBhIFNBWCBkb2N1bWVudCBoYW5kbGVyLCB1c2UgdGhlCi0gICAgICAgWFNMVFByb2Nlc3NvciBwcm9jZXNzU3R5bGVzaGVldCBtZXRob2QgdG8gY29tcGlsZSB0aGUgWFNMIHN0eWxlc2hlZXQsIHdoaWNoIHJldHVybnMgYSAKLSAgICAgICB7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlN0eWxlc2hlZXRSb290fSBvYmplY3Qgd2l0aCBpdHMgb3duIHByb2Nlc3MgbWV0aG9kLjwvUD4KLSAgIDwvQk9EWT48L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWFrZS5pbmNsdWRlIGIvbWFrZS5pbmNsdWRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTcxY2U5Li4wMDAwMDAwCi0tLSBhL21ha2UuaW5jbHVkZQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb21tb24gdmFyaWFibGVzIGFuZCB0YXJnZXRzIGZvciBYUGF0aCBhbmQgeHNsdDRqCi0jCi0jIFNlZSBNYWtlZmlsZSBmb3IgaW1wb3J0YW50IGVudmlyb25tZW50IG5vdGVzCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQcm9qZWN0LXNwZWNpZmljIHZhcmlhYmxlcyBhbmQgcnVsZXMKLSMKLSMgWW91IHNob3VsZCBub3QgbmVlZCB0byBlZGl0IHRoZXNlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSkFWQVggPSAuamF2YQotQ0xBU1NYID0gLmNsYXNzCi1KQVJYICA9IC5qYXIKLVRBUlggID0gLnRhci5negotWklQWCAgPSAuemlwCi1PQkpTICA9ICQoU1JDUzolLmphdmE9JS5jbGFzcykKLQotIyBBIHNpbXBsZSBtYXJrZXIgZmlsZSBjcmVhdGVkIHRvIHNob3cgbGFzdCBjb21waWxlIHRpbWUKLSMgTm90ZSBzdWJkaXJlY3RvcmllcyBtYXkgcmVzZXQgdGhlIG5hbWUhCi1TSU5DRV9GSUxFICAgICAgID0gc2luY2UubGFzdAotCi0jIFJlbGF0aXZlIGRpcmVjdG9yeSAodXN1YWxseSBmcm9tIC4vc3JjLy4pIHdoZXJlIGNsYXNzIGZpbGVzIGFyZSB0byBnbwotQ0xBU1NfRElSICAgICAgICA9IGNsYXNzZXMKLQotQ1VSUkVOVF9ESVIgICAgICA9IC4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQnVpbGQtc3BlY2lmaWMgdG9vbHMgYW5kIGZsYWdzIGRlZmluaXRpb25zCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUFJPRFVDVF9OQU1FIDo9IHhhbGFuCi1WRVJTSU9OICAgICAgPSBfMV8xX0QwMQotSkFSTkFNRSAgICAgID0gJChQUk9EVUNUX05BTUUpJChKQVJYKQotSkFSRElTVE5BTUUgID0gJChQUk9EVUNUX05BTUUpLWokKFZFUlNJT04pJChKQVJYKQotVEFSRElTVE5BTUUgID0gJChQUk9EVUNUX05BTUUpLWokKFZFUlNJT04pJChUQVJYKQotWklQRElTVE5BTUUgID0gJChQUk9EVUNUX05BTUUpLWokKFZFUlNJT04pJChaSVBYKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFbnZpcm9ubWVudC1zcGVjaWZpYyB0b29scyBhbmQgZmxhZ3MgZGVmaW5pdGlvbnMKLSMKLSMgWW91IG1heSBuZWVkIHRvIGVkaXQgdGhlc2UgaWYgeW91J3JlIG5vdCB1c2luZwotIyBhIHN0YW5kYXJkIEpESyBvciB0aGUgdG9vbHMgYXJlbid0IG9uIHRoZSBwYXRoLgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUmVmZXJlbmNlcyB0byBkZWZhdWx0IHRvb2xzCi1KQVZBICAgICAgID0gamF2YQotSkFWQUMgICAgICA9IGphdmFjCi1KQVZBRE9DICAgID0gamF2YWRvYwotSkFSICAgICAgICA9IGphcgotIyBSZWZlcmVuY2VzIHRvIEpESyAxLjItb25seSB0b29sczsgcmVxdWlyZWQgZm9yIHhkb2NzIGJ1aWxkCi0jIFdoaWxlIHRoZSBjb2RlIGNvbXBpbGVzIHVuZGVyIDEuMS44IG9yIDEuMi4yLCB0aGUgZG9jcyByZXF1aXJlIDEuMi4yCi0jIFRodXMsIHlvdSBjYW4gaW5zdGFsbCBib3RoIEpESydzLCBzZXQgMS4xLjggdXAgYXMgZGVmYXVsdCwKLSMgdGhlbiBjYWxsIHVzIGxpa2UgJ21ha2UgLWYgTWFrZWZpbGUgSkFWQUMxMj1jOi9qZGsxMjIvYmluL2phdmFjLmV4ZSAuLi4nCi0jICAgIFRoaXMgc2hvdWxkIGNvbXBpbGUgdGhlIHNvdXJjZXMgd2l0aCAxLjEuOCwgYnV0IHRoZSBkb2Mgd2l0aCAxLjIuMgotSkFWQTEyICAgICA9IGphdmEKLUpBVkFDMTIgICAgPSBqYXZhYwotSkFWQURPQzEyICA9IGphdmFkb2MKLQotIyBTZXR0aW5nIGZsYWdzIGZvciB2YXJpb3VzIHRvb2xzCi0jIFlvdSBjYW4gb3ZlcnJpZGUgdGhlc2Ugb24gdGhlIG1ha2UgY29tbWFuZCBsaW5lIGFzIHdlbGwKLSMgICAgQ2FsbCB1cyBsaWtlICdtYWtlIC1mIE1ha2VmaWxlIEpBVkFERUJVRz0tZzpub25lIC4uLicKLUpBVkFERUJVRyAgID0gLWcKLSMgSkFWQURFQlVHICAgPSAtZzpub25lIC1PCi1KQVZBREVTVERJUiA9IC1kICQoQ0xBU1NfRElSKQotSkFWQUNGTEFHUyAgPSAkKEpBVkFERUJVRykgJChKQVZBREVTVERJUikKLUpBUkZMQUdTICAgID0gTWNmMAotCi0jIFJlZmVyZW5jZXMgdG8gb3RoZXIgdG9vbHMKLVJNICAgICAgICAgPSBybSAtZgotUk0tUkYgICAgICA9IHJtIC1yZgotQ1AgICAgICAgICA9IGNwIC1mCi1DUFIgICAgICAgID0gY3AgLVJ2ZgotVVBESVIgICAgICA6PSAuLgotCi0jIFJlZmVyZW5jZXMgdG8gc3RhbmRhcmQgVU5JWCBvciBDeWd3aW4gdGFyIHV0aWxpdHksIGZpbHRlcmluZyB0aHJvdWdoIGd6aXAKLVRBUkdaICAgICAgPSB0YXIgY3Z6ZgotVU5UQVJHWiAgICAgID0gdGFyIHh2emYgCi0KLSMgRGVjaWRlIGlmIHdlJ3JlIG9uIHVuaXggb3IgRE9TCi1pZmVxICgsJChmaW5kc3RyaW5nIHVzciwkKFBBVEgpKSkKLSMgRE9TCi1QQVRIU0VQIDo9IFxcCi1DTFBBVEhTRVAgOj0gOwotZWxzZSAKLSMgVU5JWAotUEFUSFNFUCA6PSAvCi1DTFBBVEhTRVAgOj0gOgotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTWFpbiB0YXJnZXRzIGRlZmluaXRpb25zCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotLlBIT05ZOiBtYWtlYWxsCi1tYWtlYWxsOiBhbGwKLQotLlBIT05ZOiBjbGVhbgotY2xlYW46OgotCSQoUk0pICouY2xhc3MgJChKQVJOQU1FKSAqfiAqLmJhayAqLm8gKi5vYmogKi5kbGwgJChTSU5DRV9GSUxFKQotCi0uUEhPTlk6IG1ha2VzdWJkaXJzCi1tYWtlc3ViZGlyczoKLQlAZm9yIGkgaW4gJChTVUJESVJTKSA7IFwKLQlkbyBcCi0JKGNkICQkaTsgZWNobyBtYWtpbmcgeHBhdGggZW5naW5lIGluICIkKENVUlJFTlRfRElSKS8kJGkuLi4iOyBcCi0JJChNQUtFKSBDVVJSRU5UX0RJUj0kKENVUlJFTlRfRElSKS8kJGkgJChNRkxBR1MpIC1mIG1ha2V4cGF0aDRqIEpBVkFDRkxBR1M9IiQoSkFWQUNGTEFHUykiIGFsbCk7IFwKLQkoY2QgJCRpOyBlY2hvIG1ha2luZyB4c2x0IGVuZ2luZSBpbiAiJChDVVJSRU5UX0RJUikvJCRpLi4uIjsgXAotCSQoTUFLRSkgQ1VSUkVOVF9ESVI9JChDVVJSRU5UX0RJUikvJCRpICQoTUZMQUdTKSAtZiBtYWtleHNsdDRqIEpBVkFDRkxBR1M9IiQoSkFWQUNGTEFHUykiIGFsbCk7IFwKLQlkb25lCi0KLS5QSE9OWTogbWFrZWNvbXBhdAotbWFrZWNvbXBhdDoKLQlAZm9yIGkgaW4gJChTVUJESVJTKSA7IFwKLQlkbyBcCi0JKGNkICQkaTsgZWNobyBtYWtpbmcgY29tcGF0IGVuZ2luZSBpbiAiJChDVVJSRU5UX0RJUikvJCRpLi4uIjtwd2Q7IFwKLQkkKE1BS0UpIENVUlJFTlRfRElSPSQoQ1VSUkVOVF9ESVIpLyQkaSAkKE1GTEFHUykgLWYgbWFrZWNvbXBhdCBKQVZBQ0ZMQUdTPSIkKEpBVkFDRkxBR1MpIiBhbGwpOyBcCi0JZG9uZQotCi0uUEhPTlk6IG1ha2Vkb2NzCi1tYWtlZG9jczoKLQlAZm9yIGkgaW4geGRvY3MgOyBcCi0JZG8gXAotCShjZCAkJGk7IGVjaG8gbWFraW5nIHgtZG9jcyBpbiAiJChDVVJSRU5UX0RJUikvJCRpLi4uIjsgXAotCSQoTUFLRSkgQ1VSUkVOVF9ESVI9JChDVVJSRU5UX0RJUikvJCRpICQoTUZMQUdTKSAtZiBNYWtlZmlsZSBhbGwpOyBcCi0JZG9uZQotCi0uUEhPTlk6IG1ha2VzYW1wbGVzCi1tYWtlc2FtcGxlczoKLQlAZm9yIGkgaW4gc2FtcGxlcyA7IFwKLQlkbyBcCi0JKGNkICQkaTsgZWNobyBtYWtpbmcgc2FtcGxlcyBpbiAiJChDVVJSRU5UX0RJUikvJCRpLi4uIjsgXAotCSQoTUFLRSkgQ1VSUkVOVF9ESVI9JChDVVJSRU5UX0RJUikvJCRpICQoTUZMQUdTKSAtZiBNYWtlZmlsZSBhbGwpOyBcCi0JZG9uZQotCi0uUEhPTlk6IGNsZWFuc3ViZGlycyAKLWNsZWFuc3ViZGlyczoKLQktQGZvciBpIGluICQoU1VCRElSUykgOyBcCi0JZG8gXAotCShjZCAkJGk7IGVjaG8gY2xlYW5pbmcgaW4gIiQoQ1VSUkVOVF9ESVIpLyQkaS4uLiI7IFwKLQkkKE1BS0UpIENVUlJFTlRfRElSPSQoQ1VSUkVOVF9ESVIpLyQkaSAtZiBtYWtleHBhdGg0aiAkKE1GTEFHUykgY2xlYW4pOyBcCi0JKGNkICQkaTsgZWNobyBjbGVhbmluZyBpbiAiJChDVVJSRU5UX0RJUikvJCRpLi4uIjsgXAotCSQoTUFLRSkgQ1VSUkVOVF9ESVI9JChDVVJSRU5UX0RJUikvJCRpIC1mIG1ha2V4c2x0NGogJChNRkxBR1MpIGNsZWFuKTsgXAotCWRvbmUKLQotLlBIT05ZOiBjbGVhbmNvbXBhdAotY2xlYW5jb21wYXQ6Ci0JLUBmb3IgaSBpbiAkKFNVQkRJUlMpIDsgXAotCWRvIFwKLQkoY2QgJCRpOyBlY2hvIGNsZWFuaW5nIGluICIkKENVUlJFTlRfRElSKS8kJGkuLi4iOyBcCi0JJChNQUtFKSBDVVJSRU5UX0RJUj0kKENVUlJFTlRfRElSKS8kJGkgLWYgbWFrZWNvbXBhdCAkKE1GTEFHUykgY2xlYW4pOyBcCi0JZG9uZQotCi0uUEhPTlk6IGNsZWFuZG9jcwotY2xlYW5kb2NzOgotCUBmb3IgaSBpbiB4ZG9jcyA7IFwKLQlkbyBcCi0JKGNkICQkaTsgZWNobyBjbGVhbmluZyB1cCB4LWRvY3MgIiQoQ1VSUkVOVF9ESVIpLyQkaS4uLiI7IFwKLQkkKE1BS0UpIENVUlJFTlRfRElSPSQoQ1VSUkVOVF9ESVIpLyQkaSAkKE1GTEFHUykgLWYgTWFrZWZpbGUgY2xlYW4pOyBcCi0JZG9uZQotCi0uUEhPTlk6IGNsZWFuc2FtcGxlcwotY2xlYW5zYW1wbGVzOgotCUBmb3IgaSBpbiBzYW1wbGVzIDsgXAotCWRvIFwKLQkoY2QgJCRpOyBlY2hvIGNsZWFuaW5nIHVwIHNhbXBsZXMgIiQoQ1VSUkVOVF9ESVIpLyQkaS4uLiI7IFwKLQkkKE1BS0UpIENVUlJFTlRfRElSPSQoQ1VSUkVOVF9ESVIpLyQkaSAkKE1GTEFHUykgLWYgTWFrZWZpbGUgY2xlYW4pOyBcCi0JZG9uZQotCi0jIEVuZCBvZiBmaWxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWFrZS5pbmNsdWRlMiBiL21ha2UuaW5jbHVkZTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjg2NmYuLjAwMDAwMDAKLS0tIGEvbWFrZS5pbmNsdWRlMgorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvbW1vbiBkZWZpbml0aW9ucyBhbmQgbWFpbiAnY29tcGlsZScgcnVsZSBmb3IgeHBhdGggYW5kIHhzbHQuCi0jCi0jIFNlZSBNYWtlZmlsZSBmb3IgaW1wb3J0YW50IGVudmlyb25tZW50IG5vdGVzCi0jIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOb3RlIHRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGUgdmFyaWFibGUgaW4gbWFrZS5pbmNsdWRlCi1DTEFTU0VTRElSID0gY2xhc3NlcwotCi0jIEFkZCBvdGhlciByZXF1aXJlZCBkaXJzIHRvIHRoZSBjbGFzc3BhdGgKLVhNTDRKX0NMQVNTUEFUSCA6PSAuLiQoUEFUSFNFUCkuLiQoUEFUSFNFUCkuLiQoUEFUSFNFUCl4bWwteGVyY2VzJChQQVRIU0VQKWphdmEkKFBBVEhTRVApYmluJChQQVRIU0VQKXhlcmNlcy5qYXIKLUJTRl9DTEFTU1BBVEggOj0gLi4kKFBBVEhTRVApYmluJChQQVRIU0VQKWJzZi5qYXIKLSMgQWRkIC4gKGN1cnJlbnQgZGlyKSB0byBlbmQgb2YgY2xhc3NwYXRoIHRvIGhlbHAgMS4xLnggY29tcGlsZXJzIGZpbmQgYWxsIHRoZSBzb3VyY2UgZmlsZXMsIHRoYW5rcyB0byBTZWFuIFRpbW0KLUVYVFJBX0NMQVNTUEFUSCA6PSAkKFhNTDRKX0NMQVNTUEFUSCkkKENMUEFUSFNFUCkkKEJTRl9DTEFTU1BBVEgpJChDTFBBVEhTRVApJChDTEFTU0VTRElSKSQoQ0xQQVRIU0VQKSQoQ0xBU1NQQVRIKSQoQ0xQQVRIU0VQKS4KLQotc2luY2VsYXN0OiAkKFNJTkNFX0ZJTEUpCi0kKFNJTkNFX0ZJTEUpOiAkKFNSQ1MpCi0JLW1rZGlyICQoQ0xBU1NFU0RJUikKLQkkKEpBVkFDKSAkKEpBVkFDRkxBR1MpIC1jbGFzc3BhdGggIiQoRVhUUkFfQ0xBU1NQQVRIKSIgJD8KLQl0b3VjaCAkKFNJTkNFX0ZJTEUpCi0KLQpkaWZmIC0tZ2l0IGEvcmVhZG1lLmh0bWwgYi9yZWFkbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlNDhhZC4uMDAwMDAwMAotLS0gYS9yZWFkbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLQotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPgotPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPG1ldGEgY29udGVudD0iMDsgVVJMPWRvY3Mvd2hhdHNuZXcuaHRtbCIgaHR0cC1lcXVpdj0iUmVmcmVzaCI+Ci0gICAgICBSZWRpcmVjdGluZyB0byA8YSBocmVmPSJkb2NzL3doYXRzbmV3Lmh0bWwiPldoYXQncyBOZXcgaW4gWGFsYW5fSmF2YSAyPC9hPgotPC9ib2R5PgotPC9odG1sPgotCi0KLQotCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0KLQotCi0gICAgICAgICAgICAKLSAgIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvUkVBRE1FLmh0bWwgYi9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9SRUFETUUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBiNTg0ZC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9SRUFETUUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPjwvdGl0bGU+WGFsYW4gU2FtcGxlIEFwcGxldHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iIzgwODA4MCIgdGV4dD0iI2ZmZmZmZiI+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMCIgdnNwYWNlPSIwIiBhbGlnbj0ibGVmdCIgc3JjPSJyYWJiaXR3aG9ybi5qcGciPjwvdGQ+Ci0gICAgICA8dGQ+PGgyPiZuYnNwO1J1bm5pbmcgdGhlIFhhbGFuIHNhbXBsZSBhcHBsZXRzPC9oMj48L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDxocj4KLSAgPHVsPgotICA8bGk+YXBwbGV0WE1MdG9IVE1MLmh0bWwgdHJhbnNmb3JtcyBYTUwgaW50byBIVE1MLCBhbmQgZGlzcGxheXMgdGhlIFhNTCBkb2N1bWVudCBhbmQgWFNMIHN0eWxlc2hlZXQgYXMgd2VsbCBhcyB0aGUgSFRNTCB0cmFuc2Zvcm1hdGlvbiByZXN1bHQuPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5nZXQtdG9kby1saXN0Lmh0bWwgdXNlcyB0b2RvLnhzbCB0byB0cmFuc2Zvcm0gdG9kby54bWwgYW5kIGRpc3BsYXkgdGhlIHRyYW5zZm9ybWF0aW9uIHJlc3VsdC4gVGhlIFhNTCBzb3VyY2UgaXMgYSBzbmFwc2hvdCBvZiB0b2RvLnhtbCBpbiB0aGUgeG1sLXhhbGFuIENWUyByZXBvc2l0b3J5LCBhbiBvbmdvaW5nIGxpc3Qgb2YgdGFza3MgYW5kIHRhc2sgY29tcGxldGlvbnMgZm9yIHRoZSBYYWxhbi1KYXZhIDIgZGV2ZWxvcG1lbnQgcHJvamVjdC48L2xpPgotICA8cD5Cb3RoIGFwcGxldHMgbG9vayBmb3IgeGFsYW4uamFyIGFuZCB4ZXJjZXMuamFyIGluIHRoZSBiaW4gZGlyZWN0b3J5LiBJZiB0aGUgSkFSIGZpbGVzIGFyZSBlbHNld2hlcmUsIHlvdSBtdXN0IG1vdmUgdGhlbSBvciBhZGp1c3QgdGhlIGFwcGxldCBhcmNoaXZlIHNldHRpbmcgaW4gY2xpZW50Lmh0bWwgYW5kIGdldC10b2RvLWxpc3QuaHRtbC48L3A+Ci08L3VsPgotPHA+Rm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzICh3aGF0IHRoZXkgaWxsdXN0cmF0ZSBhbmQgaG93IHRvIHJ1biB0aGVtKSwgc2VlIDxhIGhyZWY9Ii4uLy4uL2RvY3Mvc2FtcGxlcy5odG1sIj5TYW1wbGVzPC9hPi48L3A+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvYXBwbGV0WE1MdG9IVE1MLmh0bWwgYi9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9hcHBsZXRYTUx0b0hUTUwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhYTkwMC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9hcHBsZXRYTUx0b0hUTUwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPlVzaW5nIGFuIGFwcGxldCB0byBwZXJmb3JtIFhTTCB0cmFuc2Zvcm1hdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotICA8RlJBTUVTRVQgUk9XUz0iMTI1LCoiID4KLSAgICA8RlJBTUUgTkFNRT0icHJvY2Vzc29yIiBTUkM9ImNsaWVudC5odG1sIiBTQ1JPTExJTkc9ImF1dG8iID4KLSAgICAgIDxmcmFtZXNldCBjb2xzPSIzMyUsIDMzJSwgKiI+Ci0gICAgICAgIDxGUkFNRSBOQU1FPSJ0YXJnZXRBcmVhMCIgU1JDPSJ0YXJnZXQuaHRtbCIgPgotICAgICAgICA8RlJBTUUgTkFNRT0idGFyZ2V0QXJlYTEiIFNSQz0idGFyZ2V0Lmh0bWwiID4KLSAgICAgICAgPEZSQU1FIE5BTUU9InRhcmdldEFyZWEyIiBTUkM9InRhcmdldC5odG1sIiA+ICAgICAgICAKLSAgICAgIDwvZnJhbWVzZXQ+Ci0gIDwvRlJBTUVTRVQ+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML2NsaWVudC5odG1sIGIvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvY2xpZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTQzODIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvY2xpZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotICA8aGVhZD4KLQkgIDx0aXRsZT5VbnRpdGxlZDwvdGl0bGU+Ci0gIDwvaGVhZD4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLSAgICAKLSAgICBmdW5jdGlvbiB3cml0ZVNvdXJjZShzb3VyY2VTdHJpbmcpCi0gICAgewotCi0gICAgICB2YXIgZXNjU3RyaW5nPWRvY3VtZW50LnhzbENvbnRyb2wuZXNjYXBlU3RyaW5nKHNvdXJjZVN0cmluZyk7Ci0gICAgICB2YXIgdGl0bGU9IlhNTCBTb3VyY2UgRG9jIjsKLSAgICAgIHZhciBkb2M9dG9wLmZyYW1lc1sxXS5kb2N1bWVudDsgICAgICAKLSAgICAgIGRvYy5vcGVuKCk7Ci0gICAgICBkb2Mud3JpdGUoIjxoMz4iICsgdGl0bGUgKyAiPC9oMz4iKTsKLSAgICAgIGRvYy53cml0ZSgiPFBSRT4iKTsKLSAgICAgIGRvYy53cml0ZShlc2NTdHJpbmcpOwotICAgICAgZG9jLndyaXRlKCI8L1BSRT4iKTsKLSAgICAgIGRvYy5jbG9zZSgpOyAgICAKLSAgICB9Ci0gIAotICAgIGZ1bmN0aW9uIHdyaXRlU3R5bGVzaGVldChzdHlsZVN0cmluZykKLSAgICB7Ci0gICAgICB2YXIgZXNjU3RyaW5nPWRvY3VtZW50LnhzbENvbnRyb2wuZXNjYXBlU3RyaW5nKHN0eWxlU3RyaW5nKTsKLSAgICAgIHZhciB0aXRsZT0iWFNMIFN0eWxlc2hlZXQiOwotICAgICAgdmFyIGRvYz10b3AuZnJhbWVzWzJdLmRvY3VtZW50OyAgICAgICAgICAKLSAgICAgIGRvYy5vcGVuKCk7Ci0gICAgICBkb2Mud3JpdGUoIjxoMz4iICsgdGl0bGUgKyAiPC9oMz4iKTsKLSAgICAgIGRvYy53cml0ZSgiPFBSRT4iKTsKLSAgICAgIGRvYy53cml0ZShlc2NTdHJpbmcpOwotICAgICAgZG9jLndyaXRlKCI8L1BSRT4iKTsKLSAgICAgIGRvYy5jbG9zZSgpOyAgICAgCi0gICAgfSAKLQotICAgIGZ1bmN0aW9uIHdyaXRlVGFyZ2V0KHRhcmdldFN0cmluZykKLSAgICB7Ci0gICAgICB2YXIgZG9jPXRvcC5mcmFtZXNbM10uZG9jdW1lbnQ7Ci0gICAgICBkb2Mub3BlbigpOwotICAgICAgdmFyIHRpdGxlPSJIVE1MIE91dHB1dCI7ICAgICAgCi0gICAgICBkb2Mud3JpdGUoIjxoMz4iICsgdGl0bGUgKyAiPC9oMz4iKTsKLSAgICAgIGlmIChkb2N1bWVudC54bWxUcmFuc2Zvcm0uZGlzcGxheU1vZGVbMF0uY2hlY2tlZCkgLy9kaXNwbGF5IEhUTUwKLSAgICAgIHsKLSAgICAgICAgZG9jLndyaXRlKHRhcmdldFN0cmluZyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vIGRpc3BsYXkgc291cmNlCi0gICAgICB7Ci0gICAgICAgIHZhciBlc2NTdHJpbmc9ZG9jdW1lbnQueHNsQ29udHJvbC5lc2NhcGVTdHJpbmcodGFyZ2V0U3RyaW5nKTsKLSAgICAgICAgZG9jLndyaXRlKCI8UFJFPiIpOwotICAgICAgICBkb2Mud3JpdGUoZXNjU3RyaW5nKTsKLSAgICAgICAgZG9jLndyaXRlKCI8L1BSRT4iKTsKLSAgICAgIH0KLSAgICAgIGRvYy5jbG9zZSgpOyAgICAKLSAgICB9Ci0gIAotICAgIGZ1bmN0aW9uIGNsZWFyRnJhbWVzKCkKLSAgICB7Ci0gICAgICBkb2N1bWVudC54c2xDb250cm9sLmZyZWVDYWNoZSgpOwotICAgICAgZm9yIChpPTE7IGk8NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgIHZhciBkb2M9dG9wLmZyYW1lc1tpXS5kb2N1bWVudDsKLSAgICAgICAgZG9jLm9wZW4oKTsKLSAgICAgICAgZG9jLmNsZWFyKCk7Ci0gICAgICAgIGRvYy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotICAKLSAgICBmdW5jdGlvbiB0cmFuc2Zvcm0oKQotICAgIHsgIAotICAgICAgY2xlYXJGcmFtZXMoKTsKLSAgICAgIHZhciB4bWxTb3VyY2U9ZG9jdW1lbnQueG1sVHJhbnNmb3JtLnhtbFNvdXJjZUxpc3Qub3B0aW9uc1tkb2N1bWVudC54bWxUcmFuc2Zvcm0ueG1sU291cmNlTGlzdC5zZWxlY3RlZEluZGV4XS52YWx1ZTsKLSAgICAgIGRvY3VtZW50LnhzbENvbnRyb2wuc2V0RG9jdW1lbnRVUkwoeG1sU291cmNlKTsKLSAgICAgIHZhciBzb3VyY2VTdHJpbmc9ZG9jdW1lbnQueHNsQ29udHJvbC5nZXRTb3VyY2VUcmVlQXNUZXh0KCk7Ci0gICAgICB2YXIgc3R5bGVTdHJpbmc9ZG9jdW1lbnQueHNsQ29udHJvbC5nZXRTdHlsZVRyZWVBc1RleHQoKTsKLSAgICAgIHZhciB0YXJnZXRTdHJpbmc9ZG9jdW1lbnQueHNsQ29udHJvbC5nZXRIdG1sVGV4dCgpOyAgICAgIAotICAgICAgd3JpdGVTb3VyY2Uoc291cmNlU3RyaW5nKTsKLSAgICAgIHdyaXRlU3R5bGVzaGVldChzdHlsZVN0cmluZyk7Ci0gICAgICB3cml0ZVRhcmdldCh0YXJnZXRTdHJpbmcpOwotICAgIH0KLSAgPC9zY3JpcHQ+Ci0gIDxib2R5IG9uTG9hZD0iY2xlYXJGcmFtZXMoKTsiIGJnY29sb3I9IiM4MDgwODAiIHRleHQ9IiNmZmZmZmYiPgotICAgIDxmb3JtIG5hbWU9InhtbFRyYW5zZm9ybSIgYWN0aW9uPSIiIG1ldGhvZD0iUE9TVCI+Ci0gICAgICA8aDI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMCIgdnNwYWNlPSIwIiBhbGlnbj0ibGVmdCIgc3JjPSJyYWJiaXR3aG9ybi5qcGciPiZuYnNwO1RyYW5zZm9ybSBYTUwgRG9jdW1lbnQ8L2gyPgotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIHdpZHRoPSI1MCI+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48aT5Eb2N1bWVudCB0byB0cmFuc2Zvcm08L2k+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48aT5EaXNwbGF5IG91dHB1dCBhczwvaT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4KLSAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0ieG1sU291cmNlTGlzdCI+Ci0gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InhhbGFuQXBwbGV0cy54bWwiIHNlbGVjdGVkPiZuYnNwO3hhbGFuQXBwbGV0cy54bWwmbmJzcDsKLSAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZm9vLXMxLnhtbCI+Jm5ic3A7Zm9vLXMxLnhtbCZuYnNwOwotICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImRpc3BsYXlNb2RlIiBjaGVja2VkPkhUTUwmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iZGlzcGxheU1vZGUiPkhUTUwgU291cmNlCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiBuYW1lPSJ0cmFuc2Zvcm1CdXR0b24iIHZhbHVlPSJUcmFuc2Zvcm0iIAotICAgICAgICAgICAgb25DbGljaz0idHJhbnNmb3JtKCk7Ij4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L2Zvcm0+Ci0gICAgPCEtLSBCZSBzdXJlIHlvdSBoYXZlIGFwcGxldCBhcmNoaXZlIGF0dHJpYnV0ZSBzZXQKLSAgICAgICAgIHNvIHRoZSBhcHBsZXQgY2FuIGZpbmQgeGFsYW4uamFyIGFuZCB4ZXJjZXMuamFyIC0tPiAgCi0gICAgPGFwcGxldCAgCi0gICAgICBuYW1lPSJ4c2xDb250cm9sIgotICAgICAgY29kZT0ib3JnLmFwYWNoZS54YWxhbi5jbGllbnQuWFNMVFByb2Nlc3NvckFwcGxldC5jbGFzcyIKLSAgICAgIGFyY2hpdmU9Ii4uLy4uL2Jpbi94YWxhbi5qYXIsLi4vLi4vYmluL3hlcmNlcy5qYXIiCi0gICAgICBoZWlnaHQ9IjAiCi0gICAgICB3aWR0aCIwIj4KLSAgICAgIDxwYXJhbSBuYW1lPSJkb2N1bWVudFVSTCIgdmFsdWU9InhhbGFuQXBwbGV0cy54bWwiLz4gIDwhLS1kZWZhdWx0IHNldHRpbmctLT4KLSAgICAgIDxwYXJhbSBuYW1lPSJzdHlsZVVSTCIgdmFsdWU9InMxVG9IVE1MLnhzbCIvPiA8IS0tZG9lc24ndCBjaGFuZ2UtLT4KLSAgICA8L2FwcGxldD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvZm9vLXMxLnhtbCBiL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML2Zvby1zMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4Y2UwMzMuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvZm9vLXMxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08czEgdGl0bGU9InMxIGZvbyI+Ci0gIDxzMiB0aXRsZT0iRm9vIj4KLSAgICA8cD5IZWxsbzwvcD4KLSAgPC9zMj4KLTwvczE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvZ2V0LXRvZG8tbGlzdC5odG1sIGIvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvZ2V0LXRvZG8tbGlzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQ5MDczLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML2dldC10b2RvLWxpc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLSAgPGhlYWQ+Ci0JPHRpdGxlPlhhbGFuLUphdmEgMiAidG8gZG8iIGxpc3Q8L3RpdGxlPgotICA8L2hlYWQ+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotIAotICAgIGZ1bmN0aW9uIHRyYW5zZm9ybSgpCi0gICAgeyAKLSAgICAgIHZhciB0b2RvbGlzdCA9IHhzbENvbnRyb2wuZ2V0SHRtbFRleHQoKTsKLSAgICAgIGRvY3VtZW50LndyaXRlKHRvZG9saXN0KTsKLSAgICB9Ci0gIDwvc2NyaXB0PgotICA8Ym9keSBvbkxvYWQ9InRyYW5zZm9ybSgpOyI+Ci0gICAgPGFwcGxldCAgCi0gICAgICBuYW1lPSJ4c2xDb250cm9sIgotICAgICAgY29kZT0ib3JnLmFwYWNoZS54YWxhbi5jbGllbnQuWFNMVFByb2Nlc3NvckFwcGxldC5jbGFzcyIKLSAgICAgIGFyY2hpdmU9Ii4uLy4uL2Jpbi94YWxhbi5qYXIsLi4vLi4vYmluL3hlcmNlcy5qYXIiCi0gICAgICBoZWlnaHQ9IjAiCi0gICAgICB3aWR0aD0iMCI+Ci0gICAgICA8cGFyYW0gbmFtZT0iZG9jdW1lbnRVUkwiIHZhbHVlPSIuLi8uLi90b2RvLnhtbCIvPiAKLSAgICAgIDxwYXJhbSBuYW1lPSJzdHlsZVVSTCIgdmFsdWU9Ii4uLy4uL3RvZG8ueHNsIi8+Ci0gICAgPC9hcHBsZXQ+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML2x0czM2MTFiZWFjLmpwZyBiL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML2x0czM2MTFiZWFjLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0OTE0OS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9sdHMzNjExYmVhYy5qcGcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9yYWJiaXR3aG9ybi5qcGcgYi9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9yYWJiaXR3aG9ybi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDRhMzguLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvcmFiYml0d2hvcm4uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvczFUb0hUTUwueHNsIGIvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvczFUb0hUTUwueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjA1ZTZmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML3MxVG9IVE1MLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotICA8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIi8+Ci0gICAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iczEiPgotICAgIDxodG1sPgotICAgICAgPGhlYWQ+PHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGl0bGUiLz48L3RpdGxlPjwvaGVhZD4KLSAgICAgIDxib2R5ICBiZ2NvbG9yPSIjZmZmZmZmIiB0ZXh0PSIjMDAwMDAwIj4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJzMiIvPgotICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iczIiPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgotICAgICAgPHRyPgotICAgICAgICA8dGQgYmdjb2xvcj0iIzAwNjY5OSI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIHNpemU9IisxIj4KLSAgICAgICAgICAgIDxiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGl0bGUiLz48L2I+Ci0gICAgICAgICAgPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8YnIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwIj4KLSAgICA8cD48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9wPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJub3RlIj4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB3aWR0aD0iMjAiPiYjMTYwOzwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjODhhYWNjIj4KLSAgICAgICAgICA8Zm9udCBzaXplPSItMSI+PGk+Tk9URTogPHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvaT48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB3aWR0aD0iMjAiPiYjMTYwOzwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idWwiPgotICAgIDx1bD48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC91bD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ib2wiPgotICAgIDxvbD48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9vbD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJnbG9zcyI+Ci0gICAgPGRsPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2RsPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgIDwhLS0gPHRlcm0+IGNvbnRhaW5zIGEgc2luZ2xlLXdvcmQsIG11bHRpLXdvcmQgb3Igc3ltYm9saWMgCi0gICAgICAgZGVzaWduYXRpb24gd2hpY2ggaXMgcmVnYXJkZWQgYXMgYSB0ZWNobmljYWwgdGVybS4gLS0+IAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXJtIj4KLSAgICA8ZGZuPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2Rmbj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibGFiZWwiIHByaW9yaXR5PSIxIj4KLSAgICA8ZHQ+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvZHQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Iml0ZW0iIHByaW9yaXR5PSIyIj4KLSAgICA8ZGQ+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC9kZD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGFibGUiPgotICAgIDxwIGFsaWduPSJjZW50ZXIiPjx0YWJsZSBib3JkZXI9IjAiPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L3RhYmxlPjwvcD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic291cmNlIj4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB3aWR0aD0iMjAiPiYjMTYwOzwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjODhhYWNjIj48cHJlPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L3ByZT48L3RkPgotICAgICAgICA8dGQgd2lkdGg9IjIwIj4mIzE2MDs8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJsaSI+Ci0gICAgPGxpPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2xpPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ciI+Ci0gICAgPHRyPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L3RyPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0aCI+Ci0gICAgPHRkIGJnY29sb3I9IiMwMDY2OTkiIGFsaWduPSJjZW50ZXIiPgotICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiPjxiPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2I+PC9mb250PgotICAgIDwvdGQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRkIj4KLSAgICA8dGQgYmdjb2xvcj0iIzg4YWFjYyI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPiYjMTYwOzwvdGQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRuIj4KLSAgICA8dGQ+JiMxNjA7PC90ZD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZW0iPgotICAgIDxiPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2I+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InJlZiI+Ci0gICAgPGk+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvaT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29kZSI+Ci0gICAgPGNvZGU+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvY29kZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYnIiPgotICAgIDxici8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ianVtcCI+Ci0gICAgPGEgaHJlZj0ie0BocmVmfSIgdGFyZ2V0PSJfdG9wIj48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9hPgotICA8L3hzbDp0ZW1wbGF0ZT4gIAotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImFuY2hvciI+Ci0gICAgPGEgbmFtZT0ie0BpZH0iPiA8L2E+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImltZyI+Ci0gICAgPGltZyBzcmM9IntAc3JjfSIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiIHZzcGFjZT0iNCIgaHNwYWNlPSI0Ii8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvdGFyZ2V0Lmh0bWwgYi9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC90YXJnZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4NTQ1Yy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC90YXJnZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotICA8aGVhZD4KLSAgICA8dGl0bGU+VW50aXRsZWQ8L3RpdGxlPgotICA8L2hlYWQ+Ci0gIDxib2R5PiZuYnNwOzwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML3hhbGFuQXBwbGV0cy54bWwgYi9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC94YWxhbkFwcGxldHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg2ZmMxLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML3hhbGFuQXBwbGV0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08czEgdGl0bGU9IkFib3V0IFhhbGFuIEFwcGxldHMiPgotICA8czIgdGl0bGU9IlRyYW5zZm9ybWluZyBYTUwgdG8gSFRNTCBpbiBhbiBBcHBsZXQiPgotICAgIDxvbD4gCi0gICAgICA8bGk+Ci0gICAgICAgIDxwPkluY2x1ZGUKLSAgICAgICAgb3JnLmFwYWNoZS54YWxhbi54c2x0LmNsaWVudC5YU0xUUHJvY2Vzc29yQXBwbGV0Ci0gICAgICAgIGluIGFuIEhUTUwgY2xpZW50LjwvcD4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIDxwPlNwZWNpZnkgdGhlIFhNTCBzb3VyY2UgZG9jdW1lbnQgYW5kIFhTTAotICAgICAgICBzdHlsZXNoZWV0LjwvcD4KLSAgICAgICAgPHA+WW91IGNhbiB1c2UgdGhlIERvY3VtZW50VVJMIGFuZCBTdHlsZVVSTCBQQVJBTSB0YWdzIAotICAgICAgICBvciB0aGUgc2V0RG9jdW1lbnRVUkwoKSBhbmQgc2V0U3R5bGVVUkwoKSBtZXRob2RzLiAKLSAgICAgICAgSWYgdGhlIFhNTCBkb2N1bWVudCBjb250YWlucyBhIHN0eWxlc2hlZXQgUHJvY2Vzc2luZwotICAgICAgICBJbnN0cnVjdGlvbiAoUEkpLCB5b3UgZG8gbm90IG5lZWQgdG8gc3BlY2lmeSBhbiBYU0wKLSAgICAgICAgc3R5bGVzaGVldC48L3A+Ci0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgICA8cD5DYWxsIHRoZSBnZXRIdG1sVGV4dCgpIG1ldGhvZCwgd2hpY2ggcGVyZm9ybXMKLSAgICAgICAgdGhlIHRyYW5zZm9ybWF0aW9uIGFuZCByZXR1cm5zIHRoZSBuZXcgZG9jdW1lbnQgYXMgYQotICAgICAgICBTdHJpbmcuPC9wPgotICAgICAgPC9saT4KLSAgICA8L29sPgotICA8L3MyPgotPC9zMT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwcGx5WFBhdGgvQXBwbHlYUGF0aC5qYXZhIGIvc2FtcGxlcy9BcHBseVhQYXRoL0FwcGx5WFBhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2MzVmMi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwcGx5WFBhdGgvQXBwbHlYUGF0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotLy8gVGhpcyBmaWxlIHVzZXMgNCBzcGFjZSBpbmRlbnRzLCBubyB0YWJzLgotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5ET01QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aEFQSTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5UcmVlV2Fsa2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLkRPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLS8vIEltcG9ydGVkIEpBVkEgQVBJIGZvciBYTUwgUGFyc2luZyAxLjAgY2xhc3NlcwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247IAotCi0vLyBJbXBvcnRlZCBTZXJpYWxpemVyIGNsYXNzZXMKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS4qOwotCi0vKioKLSAqICBWZXJ5IGJhc2ljIHV0aWxpdHkgZm9yIGFwcGx5aW5nIGFuIFhQYXRoIGVweHJlc3Npb24gdG8gYW4geG1sIGZpbGUgYW5kIHByaW50aW5nIGluZm9ybWF0aW9uCi0gLyAgYWJvdXQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgWFBhdGggb2JqZWN0IGFuZCB0aGUgbm9kZXMgaXQgZmluZHMuCi0gKiAgVGFrZXMgMiBhcmd1bWVudHM6Ci0gKiAgICAgKDEpIGFuIHhtbCBmaWxlbmFtZQotICogICAgICgyKSBhbiBYUGF0aCBleHByZXNzaW9uIHRvIGFwcGx5IHRvIHRoZSBmaWxlCi0gKiAgRXhhbXBsZXM6Ci0gKiAgICAgamF2YSBBcHBseVhQYXRoIGZvby54bWwgLwotICogICAgIGphdmEgQXBwbHlYUGF0aCBmb28ueG1sIC9kb2MvbmFtZVsxXS9AbGFzdAotICogQHNlZSBYUGF0aEFQSQotICovCi1wdWJsaWMgY2xhc3MgQXBwbHlYUGF0aAotewotICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsKLSAgcHJvdGVjdGVkIFN0cmluZyB4cGF0aCA9IG51bGw7Ci0KLSAgLyoqIFByb2Nlc3MgaW5wdXQgYXJncyBhbmQgZXhlY3V0ZSB0aGUgWFBhdGguICAqLwotICBwdWJsaWMgdm9pZCBkb01haW4oU3RyaW5nW10gYXJncykKLSAgICB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBmaWxlbmFtZSA9IGFyZ3NbMF07Ci0gICAgeHBhdGggPSBhcmdzWzFdOwotCi0gICAgaWYgKChmaWxlbmFtZSAhPSBudWxsKSAmJiAoZmlsZW5hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgICAmJiAoeHBhdGggIT0gbnVsbCkgJiYgKHhwYXRoLmxlbmd0aCgpID4gMCkpCi0gICAgewotICAgICAgLy8gVGVsbCB0aGF0IHdlJ3JlIGxvYWRpbmcgY2xhc3NlcyBhbmQgcGFyc2luZywgc28gdGhlIHRpbWUgaXQgCi0gICAgICAvLyB0YWtlcyB0byBkbyB0aGlzIGRvZXNuJ3QgZ2V0IGNvbmZ1c2VkIHdpdGggdGhlIHRpbWUgdG8gZG8gCi0gICAgICAvLyB0aGUgYWN0dWFsIHF1ZXJ5IGFuZCBzZXJpYWxpemF0aW9uLgotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIGNsYXNzZXMsIHBhcnNpbmcgIitmaWxlbmFtZSsiLCBhbmQgc2V0dGluZyB1cCBzZXJpYWxpemVyIik7Ci0gICAgICAKLSAgICAgIC8vIFNldCB1cCBhIERPTSB0cmVlIHRvIHF1ZXJ5LgotICAgICAgSW5wdXRTb3VyY2UgaW4gPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSkpOwotICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIERvY3VtZW50IGRvYyA9IGRmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKGluKTsKLSAgICAgIAotICAgICAgLy8gU2V0IHVwIGFuIGlkZW50aXR5IHRyYW5zZm9ybWVyIHRvIHVzZSBhcyBzZXJpYWxpemVyLgotICAgICAgVHJhbnNmb3JtZXIgc2VyaWFsaXplciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sICJ5ZXMiKTsKLQotICAgICAgLy8gVXNlIHRoZSBzaW1wbGUgWFBhdGggQVBJIHRvIHNlbGVjdCBhIG5vZGVJdGVyYXRvci4KLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUXVlcnlpbmcgRE9NIHVzaW5nICIreHBhdGgpOwotICAgICAgTm9kZUl0ZXJhdG9yIG5sID0gWFBhdGhBUEkuc2VsZWN0Tm9kZUl0ZXJhdG9yKGRvYywgeHBhdGgpOwotCi0gICAgICAvLyBTZXJpYWxpemUgdGhlIGZvdW5kIG5vZGVzIHRvIFN5c3RlbS5vdXQuCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjxvdXRwdXQ+Iik7Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgIE5vZGUgbjsKLSAgICAgIHdoaWxlICgobiA9IG5sLm5leHROb2RlKCkpIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAKLSAgICAgICAgc2VyaWFsaXplci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShuKSwgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgfQotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI8L291dHB1dD4iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQmFkIGlucHV0IGFyZ3M6ICIgKyBmaWxlbmFtZSArICIsICIgKyB4cGF0aCk7Ci0gICAgfQotICB9Ci0gIAotICAvKiogTWFpbiBtZXRob2QgdG8gcnVuIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpCi0gICAgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGFyZ3MubGVuZ3RoICE9IDIpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJqYXZhIEFwcGx5WFBhdGggZmlsZW5hbWUueG1sIHhwYXRoXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiUmVhZHMgZmlsZW5hbWUueG1sIGFuZCBhcHBsaWVzIHRoZSB4cGF0aDsgcHJpbnRzIHRoZSBub2RlbGlzdCBmb3VuZC4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAgIAotICAgIEFwcGx5WFBhdGggYXBwID0gbmV3IEFwcGx5WFBhdGgoKTsKLSAgICBhcHAuZG9NYWluKGFyZ3MpOwotICB9CQotICAKLX0gLy8gZW5kIG9mIGNsYXNzIEFwcGx5WFBhdGgKLQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcHBseVhQYXRoL2Zvby54bWwgYi9zYW1wbGVzL0FwcGx5WFBhdGgvZm9vLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyMzcwOC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwcGx5WFBhdGgvZm9vLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGRvYz4KLSAgPG5hbWUgZmlyc3Q9IkRhdmlkIiBsYXN0PSJNYXJzdG9uIi8+Ci0gIDxuYW1lIGZpcnN0PSJEYXZpZCIgbGFzdD0iQmVydG9uaSIvPgotICA8bmFtZSBmaXJzdD0iRG9uYWxkIiBsYXN0PSJMZXNsaWUiLz4KLSAgPG5hbWUgZmlyc3Q9IkVtaWx5IiBsYXN0PSJGYXJtZXIiLz4KLSAgPG5hbWUgZmlyc3Q9Ikpvc2VwaCIgbGFzdD0iS2Vzc2VsbWFuIi8+Ci0gIDxuYW1lIGZpcnN0PSJNeXJpYW0iIGxhc3Q9Ik1pZHkiLz4KLSAgPG5hbWUgZmlyc3Q9IlBhdWwiIGxhc3Q9IkRpY2siLz4KLSAgPG5hbWUgZmlyc3Q9IlN0ZXBoZW4iIGxhc3Q9IkF1cmllbW1hIi8+Ci0gIDxuYW1lIGZpcnN0PSJTY290dCIgbGFzdD0iQm9hZyIvPgotICA8bmFtZSBmaXJzdD0iU2hhbmUiIGxhc3Q9IkN1cmN1cnUiLz4KLTwvZG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBwbHlYUGF0aC9yZWFkbWUuaHRtbCBiL3NhbXBsZXMvQXBwbHlYUGF0aC9yZWFkbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4OTM2Zi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwcGx5WFBhdGgvcmVhZG1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT5YYWxhbiBTYW1wbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgyPlhhbGFuIFNhbXBsZXM8L2gyPgotPHA+Rm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzICh3aGF0IHRoZXkgaWxsdXN0cmF0ZSBhbmQgaG93IHRvIHJ1biB0aGVtKSwgc2VlIDxhIGhyZWY9Ii4uLy4uL2RvY3Mvc2FtcGxlcy5odG1sIj5TYW1wbGVzPC9hPi48L3A+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9ET00yRE9NL0RPTTJET00uamF2YSBiL3NhbXBsZXMvRE9NMkRPTS9ET00yRE9NLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YzMyNjkuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9ET00yRE9NL0RPTTJET00uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotLy8gSW1wb3J0ZWQgVHJhWCBjbGFzc2VzCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDsKLQotLy8gSW1wb3J0ZWQgamF2YS5pbyBjbGFzc2VzCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotLy8gSW1wb3J0ZWQgU0FYIGNsYXNzZXMKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8vIEltcG9ydGVkIERPTSBjbGFzc2VzCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy8gSW1wb3J0ZWQgU2VyaWFsaXplciBjbGFzc2VzCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZS5TZXJpYWxpemVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLk91dHB1dFByb3BlcnRpZXM7Ci0KLS8vIEltcG9ydGVkIEpBVkEgQVBJIGZvciBYTUwgUGFyc2luZyBjbGFzc2VzCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsgCi0KLSAgLyoqCi0gICAqIFNob3cgaG93IHRvIHRyYW5zZm9ybSBhIERPTSB0cmVlIGludG8gYW5vdGhlciBET00gdHJlZS4gIAotICAgKiBUaGlzIHVzZXMgdGhlIGphdmF4LnhtbC5wYXJzZXJzIHRvIHBhcnNlIGJvdGggYW4gWFNMIGZpbGUgCi0gICAqIGFuZCB0aGUgWE1MIGZpbGUgaW50byBhIERPTSwgYW5kIGNyZWF0ZSBhbiBvdXRwdXQgRE9NLgotICAgKi8KLXB1YmxpYyBjbGFzcyBET00yRE9NCi17Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLAotICAgICAgICAgICBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsgICAgCi0JICBUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgIGlmKHRGYWN0b3J5LmdldEZlYXR1cmUoRE9NU291cmNlLkZFQVRVUkUpICYmIHRGYWN0b3J5LmdldEZlYXR1cmUoRE9NUmVzdWx0LkZFQVRVUkUpKQotICAgIHsKLSAgICAgIC8vSW5zdGFudGlhdGUgYSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5LgotICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgICAgLy8gQW5kIHNldE5hbWVzcGFjZUF3YXJlLCB3aGljaCBpcyByZXF1aXJlZCB3aGVuIHBhcnNpbmcgeHNsIGZpbGVzCi0gICAgICBkRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgIAotICAgICAgLy9Vc2UgdGhlIERvY3VtZW50QnVpbGRlckZhY3RvcnkgdG8gY3JlYXRlIGEgRG9jdW1lbnRCdWlsZGVyLgotICAgICAgRG9jdW1lbnRCdWlsZGVyIGRCdWlsZGVyID0gZEZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAKLSAgICAgIC8vVXNlIHRoZSBEb2N1bWVudEJ1aWxkZXIgdG8gcGFyc2UgdGhlIFhTTCBzdHlsZXNoZWV0LgotICAgICAgRG9jdW1lbnQgeHNsRG9jID0gZEJ1aWxkZXIucGFyc2UoImJpcmRzLnhzbCIpOwotCi0gICAgICAvLyBVc2UgdGhlIERPTSBEb2N1bWVudCB0byBkZWZpbmUgYSBET01Tb3VyY2Ugb2JqZWN0LgotICAgICAgRE9NU291cmNlIHhzbERvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoeHNsRG9jKTsKLQotICAgICAgLy8gU2V0IHRoZSBzeXN0ZW1JZDogbm90ZSB0aGlzIGlzIGFjdHVhbGx5IGEgVVJMLCBub3QgYSBsb2NhbCBmaWxlbmFtZQotICAgICAgeHNsRG9tU291cmNlLnNldFN5c3RlbUlkKCJiaXJkcy54c2wiKTsKLQotICAgICAgLy8gUHJvY2VzcyB0aGUgc3R5bGVzaGVldCBET01Tb3VyY2UgYW5kIGdlbmVyYXRlIGEgVHJhbnNmb3JtZXIuCi0gICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHhzbERvbVNvdXJjZSk7Ci0KLSAgICAgIC8vVXNlIHRoZSBEb2N1bWVudEJ1aWxkZXIgdG8gcGFyc2UgdGhlIFhNTCBpbnB1dC4KLSAgICAgIERvY3VtZW50IHhtbERvYyA9IGRCdWlsZGVyLnBhcnNlKCJiaXJkcy54bWwiKTsKLSAgICAgIAotICAgICAgLy8gVXNlIHRoZSBET00gRG9jdW1lbnQgdG8gZGVmaW5lIGEgRE9NU291cmNlIG9iamVjdC4KLSAgICAgIERPTVNvdXJjZSB4bWxEb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKHhtbERvYyk7Ci0gICAgICAKLSAgICAgIC8vIFNldCB0aGUgYmFzZSBVUkkgZm9yIHRoZSBET01Tb3VyY2Ugc28gYW55IHJlbGF0aXZlIFVSSXMgaXQgY29udGFpbnMgY2FuCi0gICAgICAvLyBiZSByZXNvbHZlZC4KLSAgICAgIHhtbERvbVNvdXJjZS5zZXRTeXN0ZW1JZCgiYmlyZHMueG1sIik7Ci0gICAgICAKLSAgICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBET01SZXN1bHQgZm9yIHRoZSBSZXN1bHQuCi0gICAgICBET01SZXN1bHQgZG9tUmVzdWx0ID0gbmV3IERPTVJlc3VsdCgpOwotICAKLSAgCSAgLy8gUGVyZm9ybSB0aGUgdHJhbnNmb3JtYXRpb24sIHBsYWNpbmcgdGhlIG91dHB1dCBpbiB0aGUgRE9NUmVzdWx0LgotICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHhtbERvbVNvdXJjZSwgZG9tUmVzdWx0KTsKLQkgIAotCSAgICAvL0luc3RhbnRpYXRlIGFuIFhhbGFuIFhNTCBzZXJpYWxpemVyIGFuZCB1c2UgaXQgdG8gc2VyaWFsaXplIHRoZSBvdXRwdXQgRE9NIHRvIFN5c3RlbS5vdXQKLQkgICAgLy8gdXNpbmcgYSBkZWZhdWx0IG91dHB1dCBmb3JtYXQuCi0gICAgICBTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBTZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPdXRwdXRQcm9wZXJ0aWVzLmdldERlZmF1bHRNZXRob2RQcm9wZXJ0aWVzKCJ4bWwiKSk7Ci0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFN0cmVhbShTeXN0ZW0ub3V0KTsKLSAgICAgIHNlcmlhbGl6ZXIuYXNET01TZXJpYWxpemVyKCkuc2VyaWFsaXplKGRvbVJlc3VsdC5nZXROb2RlKCkpOwotCX0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhyb3cgbmV3IG9yZy54bWwuc2F4LlNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiRE9NIG5vZGUgcHJvY2Vzc2luZyBub3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9ET00yRE9NL2JpcmRzLnhtbCBiL3NhbXBsZXMvRE9NMkRPTS9iaXJkcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjc2NDIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9ET00yRE9NL2JpcmRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPENsYXNzPgotPE9yZGVyIE5hbWU9IlRJTkFNSUZPUk1FUyI+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iVElOQU1JREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iVGluYW11cyBtYWpvciI+ICBHcmVhdCBUaW5hbW91LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iTm90aG9jZXJjdXMiPkhpZ2hsYW5kIFRpbmFtb3UuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDcnlwdHVyZWxsdXMgc291aSI+TGl0dGxlIFRpbmFtb3UuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDcnlwdHVyZWxsdXMgY2lubmFtb21ldXMiPlRoaWNrZXQgVGluYW1vdS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkNyeXB0dXJlbGx1cyBib3VjYXJkaSI+U2xhdHktYnJlYXN0ZWQgVGluYW1vdS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkNyeXB0dXJlbGx1cyBrZXJyaWFlIj5DaG9jbyBUaW5hbW91LjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgPC9PcmRlcj4KLTxPcmRlciBOYW1lPSJHQVZJSUZPUk1FUyI+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iR0FWSUlEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBzdGVsbGF0YSI+UmVkLXRocm9hdGVkIExvb24uPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBhcmN0aWNhIj5BcmN0aWMgTG9vbi48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkdhdmlhIHBhY2lmaWNhIj5QYWNpZmljIExvb24uPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBpbW1lciI+Q29tbW9uIExvb24uPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBhZGFtc2lpIj5ZZWxsb3ctYmlsbGVkIExvb24uPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICA8L09yZGVyPgotCi0KLTxPcmRlciBOYW1lPSJQT0RJQ0lQRURJRk9STUVTIj4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJQT0RJQ0lQRURJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iVGFjaHliYXB0dXMgZG9taW5pY3VzIj5MZWFzdCBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBvZGlseW1idXMgcG9kaWNlcHMiPlBpZWQtYmlsbGVkIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5BdGl0bGFuIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5Ib3JuZWQgR3JlYmUuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSIiPlJlZC1uZWNrZWQgR3JlYmUuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSIiPkVhcmVkIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5XZXN0ZXJuIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5DbGFyaydzIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIi8+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgIDwvT3JkZXI+Ci0KLQotPE9yZGVyIE5hbWU9IlBST0NFTExBUklJRk9STUVTIj4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJESU9NRURFSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlRoYWxhc3NhcmNoZSBjaGxvcm9yaHluY2hvcyI+WWVsbG93LW5vc2VkIEFsYmF0cm9zcy4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJUaGFsYXNzYXJjaGUgY2F1dGEiPlNoeSBBbGJhdHJvc3MuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iVGhhbGFzc2FyY2hlIG1lbGFub3BocmlzIj5CbGFjay1icm93ZWQgQWxiYXRyb3NzLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBob2ViZXRyaWEgcGFscGVicmF0YSI+TGlnaHQtbWFudGxlZCBBbGJhdHJvc3MuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iRGlvbWVkZWEgZXh1bGFucyI+V2FuZGVyaW5nIEFsYmF0cm9zcy4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaG9lYmFzdHJpYSBpbW11dGFiaWxpcyI+TGF5c2FuIEFsYmF0cm9zcy48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBob2ViYXN0cmlhIG5pZ3JpcGVzIj5CbGFjay1mb290ZWQgQWxiYXRyb3NzLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhvZWJhc3RyaWEgYWxiYXRydXMiPlNob3J0LXRhaWxlZCBBbGJhdHJvc3MuIChOKTwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iUFJPQ0VMTEFSSUlEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJGdWxtYXJ1cyBnbGFjaWFsaXMiPk5vcnRoZXJuIEZ1bG1hci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgbmVnbGVjdGEiPktlcm1hZGVjIFBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGFybWluam9uaWFuYSI+SGVyYWxkIFBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIHVsdGltYSI+TXVycGh5J3MgUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgaW5leHBlY3RhdGEiPk1vdHRsZWQgUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgY2Fob3ciPkJlcm11ZGEgUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBoYXNpdGF0YSI+QmxhY2stY2FwcGVkIFBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgZXh0ZXJuYSI+SnVhbiBGZXJuYW5kZXogUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgcGhhZW9weWdpYSI+RGFyay1ydW1wZWQgUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBjZXJ2aWNhbGlzIj5XaGl0ZS1uZWNrZWQgUGV0cmVsLiAoSCk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgaHlwb2xldWNhIj5Cb25pbiBQZXRyZWwuIChIKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBuaWdyaXBlbm5pcyI+QmxhY2std2luZ2VkIFBldHJlbC4gKEgsIEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGNvb2tpaSI+Q29vaydzIFBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGxvbmdpcm9zdHJpcyI+U3Rlam5lZ2VyJ3MgUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkJ1bHdlcmlhIGJ1bHdlcmlpIj5CdWx3ZXIncyBQZXRyZWwuIChIKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQnVsd2VyaWEgZmFsbGF4Ij5Kb3VhbmluJ3MgUGV0cmVsLiAoSCwgQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlByb2NlbGxhcmlhIHBhcmtpbnNvbmkiPlBhcmtpbnNvbidzIFBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDYWxvbmVjdHJpcyBsZXVjb21lbGFzIj5TdHJlYWtlZCBTaGVhcndhdGVyLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkNhbG9uZWN0cmlzIGRpb21lZGVhIj5Db3J5J3MgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBjcmVhdG9wdXMiPlBpbmstZm9vdGVkIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgY2FybmVpcGVzIj5GbGVzaC1mb290ZWQgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBncmF2aXMiPkdyZWF0ZXIgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBwYWNpZmljdXMiPldlZGdlLXRhaWxlZCBTaGVhcndhdGVyLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgYnVsbGVyaSI+QnVsbGVyJ3MgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBncmlzZXVzIj5Tb290eSBTaGVhcndhdGVyLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIHRlbnVpcm9zdHJpcyI+U2hvcnQtdGFpbGVkIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgbmF0aXZpdGF0aXMiPkNocmlzdG1hcyBTaGVhcndhdGVyLiAoSCk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIHB1ZmZpbnVzIj5NYW54IFNoZWFyd2F0ZXIuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBhdXJpY3VsYXJpcyI+VG93bnNlbmQncyBTaGVhcndhdGVyLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgb3Bpc3Rob21lbGFzIj5CbGFjay12ZW50ZWQgU2hlYXJ3YXRlci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGxoZXJtaW5pZXJpIj5BdWR1Ym9uJ3MgU2hlYXJ3YXRlci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGFzc2ltaWxpcyI+TGl0dGxlIFNoZWFyd2F0ZXIuIChBKTwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iSFlEUk9CQVRJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5pdGVzIG9jZWFuaWN1cyI+V2lsc29uJ3MgU3Rvcm0tUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBlbGFnb2Ryb21hIG1hcmluYSI+V2hpdGUtZmFjZWQgU3Rvcm0tUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ikh5ZHJvYmF0ZXMgcGVsYWdpY3VzIj5FdXJvcGVhbiBTdG9ybS1QZXRyZWwuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgZnVyY2F0YSI+Rm9yay10YWlsZWQgU3Rvcm0tUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbGV1Y29yaG9hIj5MZWFjaCdzIFN0b3JtLVBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIGhvbW9jaHJvYSI+QXNoeSBTdG9ybS1QZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSBjYXN0cm8iPkJhbmQtcnVtcGVkIFN0b3JtLVBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSB0ZXRoeXMiPldlZGdlLXJ1bXBlZCBTdG9ybS1QZXRyZWwuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbWVsYW5pYSI+QmxhY2sgU3Rvcm0tUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbWFjcm9kYWN0eWxhIj5HdWFkYWx1cGUgU3Rvcm0tUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbWFya2hhbWkiPk1hcmtoYW0ncyBTdG9ybS1QZXRyZWwuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgdHJpc3RyYW1pIj5UcmlzdHJhbSdzIFN0b3JtLVBldHJlbC4gKEgpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSBtaWNyb3NvbWEiPkxlYXN0IFN0b3JtLVBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgIDwvT3JkZXI+Ci0KLTxPcmRlciBOYW1lPSJQRUxFQ0FOSUZPUk1FUyI+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iUEhBRVRIT05USURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWV0aG9uIGxlcHR1cnVzIj5XaGl0ZS10YWlsZWQgVHJvcGljYmlyZC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWV0aG9uIGFldGhlcmV1cyI+UmVkLWJpbGxlZCBUcm9waWNiaXJkLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhZXRob24gcnVicmljYXVkYSI+UmVkLXRhaWxlZCBUcm9waWNiaXJkLjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iU1VMSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlN1bGEgZGFjdHlsYXRyYSI+TWFza2VkIEJvb2J5LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iU3VsYSBuZWJvdXhpaSI+Qmx1ZS1mb290ZWQgQm9vYnkuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJTdWxhIHZhcmllZ2F0YSI+UGVydXZpYW4gQm9vYnkuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iU3VsYSBsZXVjb2dhc3RlciI+QnJvd24gQm9vYnkuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJTdWxhIHN1bGEiPlJlZC1mb290ZWQgQm9vYnkuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJNb3J1cyBiYXNzYW51cyI+Tm9ydGhlcm4gR2FubmV0LjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iUEVMRUNBTklEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQZWxlY2FudXMgZXJ5dGhyb3JoeW5jaG9zIj5BbWVyaWNhbiBXaGl0ZSBQZWxpY2FuLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGVsZWNhbnVzIG9jY2lkZW50YWxpcyI+QnJvd24gUGVsaWNhbi48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IlBIQUxBQ1JPQ09SQUNJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhbGFjcm9jb3JheCBwZW5pY2lsbGF0dXMiPkJyYW5kdCdzIENvcm1vcmFudC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWxhY3JvY29yYXggYnJhc2lsaWFudXMiPk5lb3Ryb3BpYyBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFsYWNyb2NvcmF4IGF1cml0dXMiPkRvdWJsZS1jcmVzdGVkIENvcm1vcmFudC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWxhY3JvY29yYXggY2FyYm8iPkdyZWF0IENvcm1vcmFudC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWxhY3JvY29yYXggdXJpbGUiPlJlZC1mYWNlZCBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFsYWNyb2NvcmF4IHBlbGFnaWN1cyI+UGVsYWdpYyBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJBTkhJTkdJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQW5oaW5nYSBhbmhpbmdhIj5BbmhpbmdhLjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iRlJFR0FUSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkZyZWdhdGEgbWFnbmlmaWNlbnMiPk1hZ25pZmljZW50IEZyaWdhdGViaXJkLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iRnJlZ2F0YSBtaW5vciI+R3JlYXQgRnJpZ2F0ZWJpcmQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJGcmVnYXRhIGFyaWVsIj5MZXNzZXIgRnJpZ2F0ZWJpcmQuIChBKTwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgPC9PcmRlcj4KLTwvQ2xhc3M+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0RPTTJET00vYmlyZHMueHNsIGIvc2FtcGxlcy9ET00yRE9NL2JpcmRzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ2ZjhlMS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0RPTTJET00vYmlyZHMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+IAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQ2xhc3MiPgotPEJpcmRJbmZvPgotCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iT3JkZXIiLz4KLTwvQmlyZEluZm8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iT3JkZXIiPgotT3JkZXIgaXM6ICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQE5hbWUiLz4KLQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkZhbWlseSIvPjx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iRmFtaWx5Ij4KLQlGYW1pbHkgaXM6ICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQE5hbWUiLz4KLQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IlNwZWNpZXMgfCBTdWJGYW1pbHkgfCB0ZXh0KCkiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJTdWJGYW1pbHkiPgotCQlTdWJGYW1pbHkgaXMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBOYW1lIi8+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJTcGVjaWVzIHwgdGV4dCgpIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iU3BlY2llcyI+Ci0JPHhzbDpjaG9vc2U+Ci0JICA8eHNsOndoZW4gdGVzdD0ibmFtZSguLik9J1N1YkZhbWlseSciPgotCQk8eHNsOnRleHQ+CTwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBTY2llbnRpZmljX05hbWUiLz4KLQkgIDwveHNsOndoZW4+Ci0JICA8eHNsOm90aGVyd2lzZT4KLQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBTY2llbnRpZmljX05hbWUiLz4KLQkgIDwveHNsOm90aGVyd2lzZT4KLQk8L3hzbDpjaG9vc2U+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvRE9NMkRPTS9yZWFkbWUuaHRtbCBiL3NhbXBsZXMvRE9NMkRPTS9yZWFkbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4OTM2Zi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0RPTTJET00vcmVhZG1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT5YYWxhbiBTYW1wbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgyPlhhbGFuIFNhbXBsZXM8L2gyPgotPHA+Rm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzICh3aGF0IHRoZXkgaWxsdXN0cmF0ZSBhbmQgaG93IHRvIHJ1biB0aGVtKSwgc2VlIDxhIGhyZWY9Ii4uLy4uL2RvY3Mvc2FtcGxlcy5odG1sIj5TYW1wbGVzPC9hPi48L3A+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9QaXBlL1BpcGUuamF2YSBiL3NhbXBsZXMvUGlwZS9QaXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZTI1ZGEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9QaXBlL1BpcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotLy8gSW1wb3J0ZWQgVHJhWCBjbGFzc2VzCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDsKLQotLy8gSW1wb3J0ZWQgU0FYIGNsYXNzZXMKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguUGFyc2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuUGFyc2VyQWRhcHRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTFJlYWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLQotLy8gSW1wb3J0ZWQgRE9NIGNsYXNzZXMKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vLyBJbXBvcnRlZCBTZXJpYWxpemVyIGNsYXNzZXMKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZS5TZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLk91dHB1dFByb3BlcnRpZXM7Ci0KLS8vIEltcG9ydGVkIEpBVkEgQVBJIGZvciBYTUwgUGFyc2luZyAxLjAgY2xhc3NlcwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247IAotCi0vLyBJbXBvcnRlZCBqYXZhLmlvIGNsYXNzZXMKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlRyYW5zZm9ybWVySW1wbDsKLQotICAvKioKLSAgICogVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBjaGFpbiBhIHNlcmllcyBvZiB0cmFuc2Zvcm1hdGlvbnMgYnkKLSAgICogcGlwaW5nIFNBWCBldmVudHMgZnJvbSBvbmUgVHJhbnNmb3JtZXIgdG8gYW5vdGhlci4gRWFjaCBUcmFuc2Zvcm1lcgotICAgKiBvcGVyYXRlcyBhcyBhIFNBWDIgWE1MRmlsdGVyL1hNTFJlYWRlci4KLSAgICovCi1wdWJsaWMgY2xhc3MgUGlwZQotewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0JdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIAotICAgICAgICAgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgkgICAKLQl7Ci0gICAgLy8gSW5zdGFudGlhdGUgIGEgVHJhbnNmb3JtZXJGYWN0b3J5LgotICAJVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSBzdXBwb3J0cyBUaGUgdXNlIHVmIFNBWFNvdXJjZSAKLSAgICAvLyBhbmQgU0FYUmVzdWx0Ci0gICAgaWYgKHRGYWN0b3J5LmdldEZlYXR1cmUoU0FYU291cmNlLkZFQVRVUkUpICYmIHRGYWN0b3J5LmdldEZlYXR1cmUoU0FYUmVzdWx0LkZFQVRVUkUpKQotICAgIHsgCi0gICAgICAvLyBDYXN0IHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgdG8gU0FYVHJhbnNmb3JtZXJGYWN0b3J5LgotICAgICAgU0FYVHJhbnNmb3JtZXJGYWN0b3J5IHNheFRGYWN0b3J5ID0gKChTQVhUcmFuc2Zvcm1lckZhY3RvcnkpIHRGYWN0b3J5KTsJICAKLSAgICAgIC8vIENyZWF0ZSBhIFRyYW5zZm9ybWVySGFuZGxlciBmb3IgZWFjaCBzdHlsZXNoZWV0LgotICAgICAgVHJhbnNmb3JtZXJIYW5kbGVyIHRIYW5kbGVyMSA9IHNheFRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVySGFuZGxlcihuZXcgU3RyZWFtU291cmNlKCJmb28xLnhzbCIpKTsKLSAgICAgIFRyYW5zZm9ybWVySGFuZGxlciB0SGFuZGxlcjIgPSBzYXhURmFjdG9yeS5uZXdUcmFuc2Zvcm1lckhhbmRsZXIobmV3IFN0cmVhbVNvdXJjZSgiZm9vMi54c2wiKSk7Ci0gICAgICBUcmFuc2Zvcm1lckhhbmRsZXIgdEhhbmRsZXIzID0gc2F4VEZhY3RvcnkubmV3VHJhbnNmb3JtZXJIYW5kbGVyKG5ldyBTdHJlYW1Tb3VyY2UoImZvbzMueHNsIikpOwotICAgIAotICAgICAgLy8gQ3JlYXRlIGFuIFhNTFJlYWRlci4KLQkgICAgWE1MUmVhZGVyIHJlYWRlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7Ci0gICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIodEhhbmRsZXIxKTsKLSAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgdEhhbmRsZXIxKTsKLQotICAgICAgdEhhbmRsZXIxLnNldFJlc3VsdChuZXcgU0FYUmVzdWx0KHRIYW5kbGVyMikpOwotICAgICAgdEhhbmRsZXIyLnNldFJlc3VsdChuZXcgU0FYUmVzdWx0KHRIYW5kbGVyMykpOwotCi0gICAgICAvLyB0cmFuc2Zvcm1lcjMgb3V0cHV0cyBTQVggZXZlbnRzIHRvIHRoZSBzZXJpYWxpemVyLgotICAgICAgU2VyaWFsaXplciBzZXJpYWxpemVyID0gU2VyaWFsaXplckZhY3RvcnkuZ2V0U2VyaWFsaXplcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT3V0cHV0UHJvcGVydGllcy5nZXREZWZhdWx0TWV0aG9kUHJvcGVydGllcygieG1sIikpOyAgICAgICAgCi0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFN0cmVhbShTeXN0ZW0ub3V0KTsKLSAgICAgIHRIYW5kbGVyMy5zZXRSZXN1bHQobmV3IFNBWFJlc3VsdChzZXJpYWxpemVyLmFzQ29udGVudEhhbmRsZXIoKSkpOwotCi0JICAgIC8vIFBhcnNlIHRoZSBYTUwgaW5wdXQgZG9jdW1lbnQuIFRoZSBpbnB1dCBDb250ZW50SGFuZGxlciBhbmQgb3V0cHV0IENvbnRlbnRIYW5kbGVyCi0gICAgICAvLyB3b3JrIGluIHNlcGFyYXRlIHRocmVhZHMgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuICAgCi0gICAgICByZWFkZXIucGFyc2UoImZvby54bWwiKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1BpcGUvZm9vLnhtbCBiL3NhbXBsZXMvUGlwZS9mb28ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTlmNzliLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvUGlwZS9mb28ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxkb2M+SGVsbG88L2RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1BpcGUvZm9vMS54c2wgYi9zYW1wbGVzL1BpcGUvZm9vMS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYThkNWUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9QaXBlL2ZvbzEueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+Ci0gICAgPG91dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvb3V0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1BpcGUvZm9vMi54c2wgYi9zYW1wbGVzL1BpcGUvZm9vMi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3Y2QxOTcuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9QaXBlL2ZvbzIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im91dCI+Ci0gICAgPG91dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPiAuLi5nb29kIHRvIHNlZSB5b3UgYWdhaW4hPC9vdXQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvUGlwZS9mb28zLnhzbCBiL3NhbXBsZXMvUGlwZS9mb28zLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjZmFhNi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1BpcGUvZm9vMy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ib3V0Ij4KLSAgICA8b3V0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+IC4uLmFuZCBnb29kYnkhPC9vdXQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvUGlwZS9yZWFkbWUuaHRtbCBiL3NhbXBsZXMvUGlwZS9yZWFkbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4OTM2Zi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1BpcGUvcmVhZG1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT5YYWxhbiBTYW1wbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgyPlhhbGFuIFNhbXBsZXM8L2gyPgotPHA+Rm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzICh3aGF0IHRoZXkgaWxsdXN0cmF0ZSBhbmQgaG93IHRvIHJ1biB0aGVtKSwgc2VlIDxhIGhyZWY9Ii4uLy4uL2RvY3Mvc2FtcGxlcy5odG1sIj5TYW1wbGVzPC9hPi48L3A+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TQVgyU0FYL1NBWDJTQVguamF2YSBiL3NhbXBsZXMvU0FYMlNBWC9TQVgyU0FYLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMjA4YWIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9TQVgyU0FYL1NBWDJTQVguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0KLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0vKioKLSAqICBSZXBsaWNhdGUgdGhlIFNpbXBsZVRyYW5zZm9ybSBzYW1wbGUsIGV4cGxpY2l0bHkgdXNpbmcgdGhlIFNBWCBtb2RlbCB0byBoYW5kbGUgdGhlCi0gKiAgc3R5bGVzaGVldCwgdGhlIFhNTCBpbnB1dCwgYW5kIHRoZSB0cmFuc2Zvcm1hdGlvbi4KLSAqLwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlczsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhUcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVGVtcGxhdGVzSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5UcmFuc2Zvcm1lckhhbmRsZXI7ICAgICAgICAgICAgICAKLQotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuT3V0cHV0UHJvcGVydGllczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBTQVgyU0FYCi17Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0JdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIAotICAgICAgICAgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgkgICAKLQl7Ci0KLSAgICAvLyBJbnN0YW50aWF0ZSBhIFRyYW5zZm9ybWVyRmFjdG9yeS4KLSAgCVRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSBUcmFuc2Zvcm1lckZhY3Rvcnkgc3VwcG9ydHMgVGhlIHVzZSBvZiBTQVhTb3VyY2UgCi0gICAgLy8gYW5kIFNBWFJlc3VsdAotICAgIGlmICh0RmFjdG9yeS5nZXRGZWF0dXJlKFNBWFNvdXJjZS5GRUFUVVJFKSAmJiB0RmFjdG9yeS5nZXRGZWF0dXJlKFNBWFJlc3VsdC5GRUFUVVJFKSkKLSAgICB7IAotICAgICAgLy8gQ2FzdCB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5LgotICAgICAgU0FYVHJhbnNmb3JtZXJGYWN0b3J5IHNheFRGYWN0b3J5ID0gKChTQVhUcmFuc2Zvcm1lckZhY3RvcnkpIHRGYWN0b3J5KTsKLSAgICAgIC8vIENyZWF0ZSBhIENvbnRlbnRIYW5kbGVyIHRvIGhhbmRsZSBwYXJzaW5nIG9mIHRoZSBzdHlsZXNoZWV0LgotICAgICAgVGVtcGxhdGVzSGFuZGxlciB0ZW1wbGF0ZXNIYW5kbGVyID0gc2F4VEZhY3RvcnkubmV3VGVtcGxhdGVzSGFuZGxlcigpOwotCi0gICAgICAvLyBDcmVhdGUgYW4gWE1MUmVhZGVyIGFuZCBzZXQgaXRzIENvbnRlbnRIYW5kbGVyLgotICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7Ci0gICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIodGVtcGxhdGVzSGFuZGxlcik7Ci0gICAgCi0gICAgICAvLyBQYXJzZSB0aGUgc3R5bGVzaGVldC4gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmVhZGVyLnBhcnNlKCJiaXJkcy54c2wiKTsKLQotICAgICAgLy9HZXQgdGhlIFRlbXBsYXRlcyBvYmplY3QgZnJvbSB0aGUgQ29udGVudEhhbmRsZXIuCi0gICAgICBUZW1wbGF0ZXMgdGVtcGxhdGVzID0gdGVtcGxhdGVzSGFuZGxlci5nZXRUZW1wbGF0ZXMoKTsKLSAgICAgIC8vIENyZWF0ZSBhIENvbnRlbnRIYW5kbGVyIHRvIGhhbmRsZSBwYXJzaW5nIG9mIHRoZSBYTUwgc291cmNlLiAgCi0gICAgICBUcmFuc2Zvcm1lckhhbmRsZXIgaGFuZGxlciAKLSAgICAgICAgPSBzYXhURmFjdG9yeS5uZXdUcmFuc2Zvcm1lckhhbmRsZXIodGVtcGxhdGVzKTsKLSAgICAgIC8vIFJlc2V0IHRoZSBYTUxSZWFkZXIncyBDb250ZW50SGFuZGxlci4KLSAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsgIAotCi0gICAgICAvLyBTZXQgdGhlIENvbnRlbnRIYW5kbGVyIHRvIGFsc28gZnVuY3Rpb24gYXMgYSBMZXhpY2FsSGFuZGxlciwgd2hpY2gKLSAgICAgIC8vIGluY2x1ZGVzICJsZXhpY2FsIiBldmVudHMgKGUuZy4sIGNvbW1lbnRzIGFuZCBDREFUQSkuIAotICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCBoYW5kbGVyKTsKLSAgICAgIAotICAgCSAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgiYmlyZHMub3V0Iik7Ci0gICAgICAKLSAgICAgIFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IFNlcmlhbGl6ZXJGYWN0b3J5LmdldFNlcmlhbGl6ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPdXRwdXRQcm9wZXJ0aWVzLmdldERlZmF1bHRNZXRob2RQcm9wZXJ0aWVzKCJ4bWwiKSk7Ci0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFN0cmVhbShmb3MpOwotICAgCi0gICAgICAKLSAgICAgIC8vIFNldCB0aGUgcmVzdWx0IGhhbmRsaW5nIHRvIGJlIGEgc2VyaWFsaXphdGlvbiB0byB0aGUgZmlsZSBvdXRwdXQgc3RyZWFtLgotICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTQVhSZXN1bHQoc2VyaWFsaXplci5hc0NvbnRlbnRIYW5kbGVyKCkpOwotICAgICAgaGFuZGxlci5zZXRSZXN1bHQocmVzdWx0KTsKLSAgICAgIAotICAgICAgLy8gUGFyc2UgdGhlIFhNTCBpbnB1dCBkb2N1bWVudC4KLSAgICAgIHJlYWRlci5wYXJzZSgiYmlyZHMueG1sIik7Ci0gICAgICAKLSAgICAJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqIFRoZSByZXN1bHQgaXMgaW4gYmlyZHMub3V0ICoqKioqKioqKioqKioiKTsJCi0gICAgfQkKLSAgICBlbHNlCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgZG9lcyBub3Qgc3VwcG9ydCBTQVggaW5wdXQgYW5kIFNBWCBvdXRwdXQiKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvU0FYMlNBWC9iaXJkcy54bWwgYi9zYW1wbGVzL1NBWDJTQVgvYmlyZHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDI3NjQyLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU0FYMlNBWC9iaXJkcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxDbGFzcz4KLTxPcmRlciBOYW1lPSJUSU5BTUlGT1JNRVMiPgotICAgICAgICA8RmFtaWx5IE5hbWU9IlRJTkFNSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlRpbmFtdXMgbWFqb3IiPiAgR3JlYXQgVGluYW1vdS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik5vdGhvY2VyY3VzIj5IaWdobGFuZCBUaW5hbW91LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQ3J5cHR1cmVsbHVzIHNvdWkiPkxpdHRsZSBUaW5hbW91LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQ3J5cHR1cmVsbHVzIGNpbm5hbW9tZXVzIj5UaGlja2V0IFRpbmFtb3UuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDcnlwdHVyZWxsdXMgYm91Y2FyZGkiPlNsYXR5LWJyZWFzdGVkIFRpbmFtb3UuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDcnlwdHVyZWxsdXMga2VycmlhZSI+Q2hvY28gVGluYW1vdS48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgIDwvT3JkZXI+Ci08T3JkZXIgTmFtZT0iR0FWSUlGT1JNRVMiPgotICAgICAgICA8RmFtaWx5IE5hbWU9IkdBVklJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iR2F2aWEgc3RlbGxhdGEiPlJlZC10aHJvYXRlZCBMb29uLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iR2F2aWEgYXJjdGljYSI+QXJjdGljIExvb24uPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBwYWNpZmljYSI+UGFjaWZpYyBMb29uLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iR2F2aWEgaW1tZXIiPkNvbW1vbiBMb29uLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iR2F2aWEgYWRhbXNpaSI+WWVsbG93LWJpbGxlZCBMb29uLjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgPC9PcmRlcj4KLQotCi08T3JkZXIgTmFtZT0iUE9ESUNJUEVESUZPUk1FUyI+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iUE9ESUNJUEVESURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlRhY2h5YmFwdHVzIGRvbWluaWN1cyI+TGVhc3QgR3JlYmUuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQb2RpbHltYnVzIHBvZGljZXBzIj5QaWVkLWJpbGxlZCBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IiI+QXRpdGxhbiBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IiI+SG9ybmVkIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5SZWQtbmVja2VkIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5FYXJlZCBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IiI+V2VzdGVybiBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IiI+Q2xhcmsncyBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IiIvPgotICAgICAgICA8L0ZhbWlseT4KLSAgICA8L09yZGVyPgotCi0KLTxPcmRlciBOYW1lPSJQUk9DRUxMQVJJSUZPUk1FUyI+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iRElPTUVERUlEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJUaGFsYXNzYXJjaGUgY2hsb3Jvcmh5bmNob3MiPlllbGxvdy1ub3NlZCBBbGJhdHJvc3MuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iVGhhbGFzc2FyY2hlIGNhdXRhIj5TaHkgQWxiYXRyb3NzLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlRoYWxhc3NhcmNoZSBtZWxhbm9waHJpcyI+QmxhY2stYnJvd2VkIEFsYmF0cm9zcy4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaG9lYmV0cmlhIHBhbHBlYnJhdGEiPkxpZ2h0LW1hbnRsZWQgQWxiYXRyb3NzLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkRpb21lZGVhIGV4dWxhbnMiPldhbmRlcmluZyBBbGJhdHJvc3MuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhvZWJhc3RyaWEgaW1tdXRhYmlsaXMiPkxheXNhbiBBbGJhdHJvc3MuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaG9lYmFzdHJpYSBuaWdyaXBlcyI+QmxhY2stZm9vdGVkIEFsYmF0cm9zcy48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBob2ViYXN0cmlhIGFsYmF0cnVzIj5TaG9ydC10YWlsZWQgQWxiYXRyb3NzLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IlBST0NFTExBUklJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iRnVsbWFydXMgZ2xhY2lhbGlzIj5Ob3J0aGVybiBGdWxtYXIuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIG5lZ2xlY3RhIj5LZXJtYWRlYyBQZXRyZWwuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBhcm1pbmpvbmlhbmEiPkhlcmFsZCBQZXRyZWwuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSB1bHRpbWEiPk11cnBoeSdzIFBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGluZXhwZWN0YXRhIj5Nb3R0bGVkIFBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGNhaG93Ij5CZXJtdWRhIFBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgaGFzaXRhdGEiPkJsYWNrLWNhcHBlZCBQZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGV4dGVybmEiPkp1YW4gRmVybmFuZGV6IFBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIHBoYWVvcHlnaWEiPkRhcmstcnVtcGVkIFBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgY2VydmljYWxpcyI+V2hpdGUtbmVja2VkIFBldHJlbC4gKEgpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGh5cG9sZXVjYSI+Qm9uaW4gUGV0cmVsLiAoSCk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgbmlncmlwZW5uaXMiPkJsYWNrLXdpbmdlZCBQZXRyZWwuIChILCBBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBjb29raWkiPkNvb2sncyBQZXRyZWwuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBsb25naXJvc3RyaXMiPlN0ZWpuZWdlcidzIFBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJCdWx3ZXJpYSBidWx3ZXJpaSI+QnVsd2VyJ3MgUGV0cmVsLiAoSCk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkJ1bHdlcmlhIGZhbGxheCI+Sm91YW5pbidzIFBldHJlbC4gKEgsIEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQcm9jZWxsYXJpYSBwYXJraW5zb25pIj5QYXJraW5zb24ncyBQZXRyZWwuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQ2Fsb25lY3RyaXMgbGV1Y29tZWxhcyI+U3RyZWFrZWQgU2hlYXJ3YXRlci4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDYWxvbmVjdHJpcyBkaW9tZWRlYSI+Q29yeSdzIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgY3JlYXRvcHVzIj5QaW5rLWZvb3RlZCBTaGVhcndhdGVyLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGNhcm5laXBlcyI+Rmxlc2gtZm9vdGVkIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgZ3JhdmlzIj5HcmVhdGVyIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgcGFjaWZpY3VzIj5XZWRnZS10YWlsZWQgU2hlYXJ3YXRlci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGJ1bGxlcmkiPkJ1bGxlcidzIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgZ3Jpc2V1cyI+U29vdHkgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyB0ZW51aXJvc3RyaXMiPlNob3J0LXRhaWxlZCBTaGVhcndhdGVyLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIG5hdGl2aXRhdGlzIj5DaHJpc3RtYXMgU2hlYXJ3YXRlci4gKEgpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBwdWZmaW51cyI+TWFueCBTaGVhcndhdGVyLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgYXVyaWN1bGFyaXMiPlRvd25zZW5kJ3MgU2hlYXJ3YXRlci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIG9waXN0aG9tZWxhcyI+QmxhY2stdmVudGVkIFNoZWFyd2F0ZXIuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBsaGVybWluaWVyaSI+QXVkdWJvbidzIFNoZWFyd2F0ZXIuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBhc3NpbWlsaXMiPkxpdHRsZSBTaGVhcndhdGVyLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IkhZRFJPQkFUSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFuaXRlcyBvY2VhbmljdXMiPldpbHNvbidzIFN0b3JtLVBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQZWxhZ29kcm9tYSBtYXJpbmEiPldoaXRlLWZhY2VkIFN0b3JtLVBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJIeWRyb2JhdGVzIHBlbGFnaWN1cyI+RXVyb3BlYW4gU3Rvcm0tUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIGZ1cmNhdGEiPkZvcmstdGFpbGVkIFN0b3JtLVBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIGxldWNvcmhvYSI+TGVhY2gncyBTdG9ybS1QZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSBob21vY2hyb2EiPkFzaHkgU3Rvcm0tUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgY2FzdHJvIj5CYW5kLXJ1bXBlZCBTdG9ybS1QZXRyZWwuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgdGV0aHlzIj5XZWRnZS1ydW1wZWQgU3Rvcm0tUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIG1lbGFuaWEiPkJsYWNrIFN0b3JtLVBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIG1hY3JvZGFjdHlsYSI+R3VhZGFsdXBlIFN0b3JtLVBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIG1hcmtoYW1pIj5NYXJraGFtJ3MgU3Rvcm0tUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIHRyaXN0cmFtaSI+VHJpc3RyYW0ncyBTdG9ybS1QZXRyZWwuIChIKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbWljcm9zb21hIj5MZWFzdCBTdG9ybS1QZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICA8L09yZGVyPgotCi08T3JkZXIgTmFtZT0iUEVMRUNBTklGT1JNRVMiPgotICAgICAgICA8RmFtaWx5IE5hbWU9IlBIQUVUSE9OVElEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFldGhvbiBsZXB0dXJ1cyI+V2hpdGUtdGFpbGVkIFRyb3BpY2JpcmQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFldGhvbiBhZXRoZXJldXMiPlJlZC1iaWxsZWQgVHJvcGljYmlyZC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWV0aG9uIHJ1YnJpY2F1ZGEiPlJlZC10YWlsZWQgVHJvcGljYmlyZC48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IlNVTElEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJTdWxhIGRhY3R5bGF0cmEiPk1hc2tlZCBCb29ieS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlN1bGEgbmVib3V4aWkiPkJsdWUtZm9vdGVkIEJvb2J5LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iU3VsYSB2YXJpZWdhdGEiPlBlcnV2aWFuIEJvb2J5LiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlN1bGEgbGV1Y29nYXN0ZXIiPkJyb3duIEJvb2J5LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iU3VsYSBzdWxhIj5SZWQtZm9vdGVkIEJvb2J5LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iTW9ydXMgYmFzc2FudXMiPk5vcnRoZXJuIEdhbm5ldC48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IlBFTEVDQU5JREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGVsZWNhbnVzIGVyeXRocm9yaHluY2hvcyI+QW1lcmljYW4gV2hpdGUgUGVsaWNhbi48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBlbGVjYW51cyBvY2NpZGVudGFsaXMiPkJyb3duIFBlbGljYW4uPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJQSEFMQUNST0NPUkFDSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWxhY3JvY29yYXggcGVuaWNpbGxhdHVzIj5CcmFuZHQncyBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFsYWNyb2NvcmF4IGJyYXNpbGlhbnVzIj5OZW90cm9waWMgQ29ybW9yYW50LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhbGFjcm9jb3JheCBhdXJpdHVzIj5Eb3VibGUtY3Jlc3RlZCBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFsYWNyb2NvcmF4IGNhcmJvIj5HcmVhdCBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFsYWNyb2NvcmF4IHVyaWxlIj5SZWQtZmFjZWQgQ29ybW9yYW50LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhbGFjcm9jb3JheCBwZWxhZ2ljdXMiPlBlbGFnaWMgQ29ybW9yYW50LjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iQU5ISU5HSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkFuaGluZ2EgYW5oaW5nYSI+QW5oaW5nYS48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IkZSRUdBVElEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJGcmVnYXRhIG1hZ25pZmljZW5zIj5NYWduaWZpY2VudCBGcmlnYXRlYmlyZC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkZyZWdhdGEgbWlub3IiPkdyZWF0IEZyaWdhdGViaXJkLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iRnJlZ2F0YSBhcmllbCI+TGVzc2VyIEZyaWdhdGViaXJkLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgIDwvT3JkZXI+Ci08L0NsYXNzPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TQVgyU0FYL2JpcmRzLnhzbCBiL3NhbXBsZXMvU0FYMlNBWC9iaXJkcy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNmY4ZTEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9TQVgyU0FYL2JpcmRzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkNsYXNzIj4KLTxCaXJkSW5mbz4KLQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ik9yZGVyIi8+Ci08L0JpcmRJbmZvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ik9yZGVyIj4KLU9yZGVyIGlzOiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBOYW1lIi8+Ci0JPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJGYW1pbHkiLz48eHNsOnRleHQ+Ci08L3hzbDp0ZXh0PgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkZhbWlseSI+Ci0JRmFtaWx5IGlzOiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBOYW1lIi8+Ci0JPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJTcGVjaWVzIHwgU3ViRmFtaWx5IHwgdGV4dCgpIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iU3ViRmFtaWx5Ij4KLQkJU3ViRmFtaWx5IGlzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJATmFtZSIvPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iU3BlY2llcyB8IHRleHQoKSIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IlNwZWNpZXMiPgotCTx4c2w6Y2hvb3NlPgotCSAgPHhzbDp3aGVuIHRlc3Q9Im5hbWUoLi4pPSdTdWJGYW1pbHknIj4KLQkJPHhzbDp0ZXh0Pgk8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAU2NpZW50aWZpY19OYW1lIi8+Ci0JICA8L3hzbDp3aGVuPgotCSAgPHhzbDpvdGhlcndpc2U+Ci0JCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAU2NpZW50aWZpY19OYW1lIi8+Ci0JICA8L3hzbDpvdGhlcndpc2U+Ci0JPC94c2w6Y2hvb3NlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NBWDJTQVgvZm9vLnhtbCBiL3NhbXBsZXMvU0FYMlNBWC9mb28ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTlmNzliLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU0FYMlNBWC9mb28ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxkb2M+SGVsbG88L2RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1NBWDJTQVgvZm9vLnhzbCBiL3NhbXBsZXMvU0FYMlNBWC9mb28ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGE4ZDVlLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU0FYMlNBWC9mb28ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+Ci0gICAgPG91dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvb3V0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9Db25uZWN0aW9uUG9vbHMuaHRtIGIvc2FtcGxlcy9TUUxFeHRlbnNpb24vQ29ubmVjdGlvblBvb2xzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2ZTc0Ni4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9Db25uZWN0aW9uUG9vbHMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+U1FMIEV4dGVuc2lvbjsgREIgQ29ubmVjdGlvbiBQb29sczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxociAvPgotPGgyPk92ZXJ2aWV3PC9oMj4gCi08aHIgLz4KLTxwPgotICAgRGF0YWJhc2UgY29ubmVjdGlvbiBwb29scyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIFhhbGFuIFNRTCBFeHRlbnNpb24gCi0gICBmb3IgdHdvIHJlYXNvbnMuIAotPG9sPgotIDxsaT5BIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50IHdoZXJlIGNvbnNlY3V0aXZlIHRyYW5zZm9ybWF0aW9uIGNhbiByZXVzZWQKLSBkYXRhYnNlIGNvbm5lY3Rpb25zIHdpdGhvdXQgcmVhbGxvY2F0aW5nIHJlc291cmNlcyBmcm9tIHRoZSBKREJDIERyaXZlci4gCi0gPC9saT4KLSA8bGk+QSBtZXRob2QgdG8gc2hhcmUgZGF0YWJzZSBjb25uZWN0aW9ucyBjcmVhdGVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZQotIFhhbGFuIFhTTFQgcHJvY2VzcyB3aXRoIHRoZSBzdHlsZXNoZWV0cyB0aGF0IHVzZSB0aGUgU1FMIGV4dGVuc2lvbnMKLSA8bGk+Ci08L29sPgotPC9wPgotCi0gPGhyIC8+IAotIDxoMj5SZXF1aXJtZW50czwvaDI+Ci0gPGhyIC8+Ci0gPHA+Ci0gPERMPgotICA8RFQ+PGk+TmFtZWQgQ29ubmVjdGlvbiBQb29sczwvaT48L0RUPgotICAgPEREPkNvbm5lY3Rpb24gUG9vbHMgd2lsbCBiZSByZWZlcmVkIHRvIGJ5IG5hbWUgdG8gcHJvdmlkZSBhIGxpbmthZ2UgdG8KLSAgIGNvbm5lY3Rpb24gcG9vbHMgY3JlYXRlZCBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUgWGFsYW4gUHJvY2Vzc29yLiBOYW1lZAotICAgQ29ubmVjdGlvbiBQb29scyB3aWxsIGFsc28gcHJvdmlkZSBhIG1lY2hpbnNpbSB0byBzdXBwb3J0IG5vbi1uYXRpdmUKLSAgIGNvbm5lY3Rpb24gdXNlZCBpbiBKREJDIDEuMCBhbmQgSk5ESSByZWZlcmVuY2VzIGluIEpEQkMgMi4wCi0gICA8L0REPgotICA8RFQ+PGk+QmFja3dhcmRzIENvbXBhdGliaWxpdHk8L2k+PERUPgotICAgPEREPklmIHRoZSBleGlzdGluZyBjb25uZWN0aW9uIG1lY2hpbnNpbSBpcyB1c2VkIChjb25zdHJ1Y3RvcnMgaW4KLSAgIFhDb25uZWN0aW9uKSwgY3JyZWF0ZSBhIGNvbm5lY3Rpb24gcG9vbCBvbiBpdHMgYmVoYWxmLiBUaGUgbmFtZSBvZiB0aGUgCi0gICBjb25uZWN0b24gcG9vbCB3aWxsIGJlIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBEcml2ZXIgbmFtZSwgREIgVVJMLCAKLSAgIFVzZXIgbmFtZSBhbmQgcGFzc3dvcmQuCi0gICA8L0REPgotICA8RFQ+PGk+Q29ubmVjdGlvbiBQb29sIFdyYXBwcGVyczwvaT48RFQ+Ci0gICA8REQ+SW1wbGVtZW50IGEgY29ubmVjdGlvbiBwb29sIGludGVyZmFjZSB0aGF0IGRlZmluZXMgdGhlIHJlcXVpcmVkCi0gICBiZWFodm9pdXIgZm9yIGNvbm5lY3Rpb24gcG9vbHMuIFRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgdXNlZCB0byBhZGFwdAotICAgb3RoZXIgY29ubmVjdGlvbiBtZWNoaW5zaW1zIHRvIHRoZSBYYWxhbiBTUUwgRXh0ZW5zaW9ucwotICAgPC9ERD4KLSAgPERUPjxpPk1pbmltYWwgRGVwZW5kYW5jaWVzPC9pPjwvRFQ+Ci0gICA8REQ+VGhlIFNRTCBFeHRlbnNpb24gd2lsbCBpbXBsZW1lbnQgYSBtaW5pbWFsIGRlZmF1bHQgY29ubmVjdGlvbiBwb29sIAotICAgbWVjaGluaXNtLiBUaGlzIHdpbGwgcmVkdWNlIHRoZSBkZXBlbmRhbmN5IG9mIHRoaXJkIHBhcnR5IGxpYnJhcmllcyB0byAKLSAgIGJ1aWxkIGFuZCB1c2UgdGhlIFhhbGFuIFNRTCBQcm9jZXNzb3IuIE90aGVyIHdyYXBwZXJzIGNhbiBiZSB3cml0dGVuCi0gICB0byBhZGFwdCB0aGlyZCBwYXJ0eSBjb25uZWN0aW9uIHBvb2xzIHRvIHRoZSBwcm9jZXNzb3IuIEEgc2FtcGxlIG9mIHRoZQotICAgQXBhY2hlIFR1cmJpbmUgcHJvamVjdCBpcyBwbGFubmVkIGFzIGEgc2FtcGxlIGZvciB0aGUgcHJvamVjdC4KLSAgIDwvREQ+Ci0gIDwvREw+Ci0gPC9wPgotCi0gPGhyIC8+Ci0gPGgyPkV4YW1wbGVzIG9mIFVzZTwvaDI+Ci0gPGhyIC8+Ci0gPFVMPgotIDxsaT5Fc3RhYmxpc2hpbmcgYSBiYXNpYyBjb25uZWN0aW9uPC9saT48YnIgLz4KLSA8Y29kZT4gU29tZSBjb2RlIHRleHQ8L2NvZGU+Ci0gPGxpPkVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24gYnkgc3VwcGxpeWluZyB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbgotICAgICBpbiB0aGUgWE1MIDwvbGk+PGJyIC8+Ci0gPGNvZGU+IFNvbWUgY29kZSB0ZXh0PC9jb2RlPgotIDxsaT5Vc2luZyBhIGNvbm5lY2N0aW9uIHRoYXQgaGFzIGJlZW4gZXN0YWJsaXNoZWQgb3V0c2lkZSB0aGUgWGFsYW4KLSAgICAgUHJvY2Vzc29yPC9saT48YnIgLz4KLSA8Y29kZT4gU29tZSBjb2RlIHRleHQ8L2NvZGU+Ci0gPC9VTD4KLSAgCi0gPGhyIC8+Ci0gPGgyPlNRTCBSZXN1bHRzPC9oMj4KLSA8aHIgLz4KLQotIDxociAvPgotIDxoMj5FcnJvciBDb250cm9sPC9oMj4KLSA8aHIgLz4KLQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9SRUFETUUgYi9zYW1wbGVzL1NRTEV4dGVuc2lvbi9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiN2QzMDIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9TUUxFeHRlbnNpb24vUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotU2FtcGxlcwotIFN0YXRpYyBsb2dpbiwgU3RhdGljIFF1ZXJ5Ci0gTG9naW4gd2l0aCBYTUwgRGF0YSwgU3RhdGljIFF1ZXJ5Ci0gTG9naW4gd2l0aCBFeHQgUGFyYW0sIFN0YXRpYyBRdWVyeQotIExvZ2luIHdpdGggRXh0IFBvb2wsIFN0YXRpYyBRdWVyeQotIAotIExvZ2luIHdpdGggWE1MIERhdGEsUFF1ZXJ5IC0gVHlwZSB3aXRoIGRhdGEsIERhdGEgaW4gWE1MCi0gTG9naW4gd2l0aCBYTUwgRGF0YSwgUFF1ZXJ5IC0gVHlwZSB3aXRoIHF1ZXJ5LCBEYXRhIGluIFhNTAotIAotIExvZ2luIHdpdGggWE1MIERhdGEsIFBRdWVyeSAtIFR5cGUgd2l0aCBxdWVyeSwgRGF0YSBFeHQgUGFyYW0KLSAKLSBUbyBEbywKLSAgU2luZ2xlIFhDb25uZWN0aW9uIGNvbnN0cnVjdG9yCi0gIE1ha2UgYSBjb25uZWN0IG1ldGhvZCB0aGF0IHJldHVybnMgYSBOb2RlSXRlcmF0b3IKLSAgQ3JlYXRlIGEgRXhjZXB0aW9uIHRoYXQgd2lsbCBzZXJpYW5semUgaXRzZWxmIGFzIGEgc3RyZWUgTm9kZQotICAKLSBEb2NzCi0gIEhvdyB0byBDb25uZWN0Ci0gIEhvdyB0byBleGVjdXRlIGEgcXVlcnkKLSAKLSAKLSAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2Jhc2ljLWNvbm5lY3Rpb24vZGJpbmZvLnhtbCBiL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2Jhc2ljLWNvbm5lY3Rpb24vZGJpbmZvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3ZDI1Zi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9iYXNpYy1jb25uZWN0aW9uL2RiaW5mby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08ZGJ0ZXN0PgotIDxkZXNjcmlwdGlvbj5UaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gbWFrZSBhIGNvbm5lY3Rpb24gdG8gdGhlIERCTVM8L2Rlc2NyaXB0aW9uPgotCi0gPERCSU5GTz4KLSAgIDxkYmRyaXZlcj5jb20uc3liYXNlLmpkYmMyLmpkYmMuU3liRHJpdmVyPC9kYmRyaXZlcj4KLSAgIDxkYnVybD5qZGJjOnN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAvc21hcnQ5MTE8L2RidXJsPgotICAgPHVzZXI+c2E8L3VzZXI+Ci0gICA8cGFzc3dvcmQvPgotIDwvREJJTkZPPgotIAotCi08L2RidGVzdD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2Jhc2ljLWNvbm5lY3Rpb24vZGJ0ZXN0LWNpbmZvLnhzbCBiL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2Jhc2ljLWNvbm5lY3Rpb24vZGJ0ZXN0LWNpbmZvLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkNWMyNi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9iYXNpYy1jb25uZWN0aW9uL2RidGVzdC1jaW5mby54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgICAgIHhtbG5zOnNxbD0iL29yZy5hcGFjaGUueGFsYW4ubGliLnNxbC5YQ29ubmVjdGlvbiIKLSAgICAgICAgICAgICAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0ic3FsIj4KLSAgPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIvPgotICA8eHNsOnBhcmFtIG5hbWU9InF1ZXJ5IiBzZWxlY3Q9IiZxdW90O1NFTEVDVCBGaXJzdE5hbWUsIExhc3ROYW1lLCBTdHJlZXQxLCBDaXR5LCBaaXAgIEZST00gQWNjb3VudCB3aGVyZSBBY2N0SUQ9JzIwMTkwMDEwMTAnJnF1b3Q7Ii8+Ci0gCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDwhLS0gMS4gTWFrZSB0aGUgY29ubmVjdGlvbiAtLT4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImNpbmZvIiBzZWxlY3Q9Ii8vREJJTkZPIiAvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYWNjb3VudHMiCi0gICAgICAgICAgICAgICAgICBzZWxlY3Q9J3NxbDpuZXcoJGNpbmZvKScvPgotICAgIDxIVE1MPgotICAgICAgPEhFQUQ+Ci0gICAgICA8L0hFQUQ+Ci0gICAgICA8Qk9EWT4KLSAgICAgICAgPFRBQkxFIGJvcmRlcj0iMSI+Ci0gICAgICAgIDwhLS0yLiBFeGVjdXRlIHRoZSBxdWVyeSAtLT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YWJsZSIgc2VsZWN0PSdzcWw6cXVlcnkoJGFjY291bnRzLCAkcXVlcnkpJy8+Ci0gICAgICAgICAgPFRSPgotICAgICAgICAgIDwhLS0gR2V0IGNvbHVtbi1sYWJlbCBhdHRyaWJ1dGUgZnJvbSBlYWNoIGNvbHVtbi1oZWFkZXItLT4KLSAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRhYmxlL3Jvdy1zZXQvY29sdW1uLWhlYWRlciI+Ci0gICAgICAgICAgICA8VEg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb2x1bW4tbGFiZWwiLz48L1RIPgotICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkdGFibGUvcm93LXNldC9yb3ciLz4KLSAgICAgICAgICA8eHNsOnRleHQ+JiMxMDs8L3hzbDp0ZXh0PgotICAgICAgICA8L1RBQkxFPgotICAgICAgPC9CT0RZPgotICAgIDwvSFRNTD4gCi0gICAgPCEtLSAzLiBDbG9zZSB0aGUgY29ubmVjdGlvbiAtLT4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3FsOmNsb3NlKCRhY2NvdW50cykiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icm93Ij4KLSAgICAgICAgPFRSPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iY29sIi8+Ci0gICAgICAgIDwvVFI+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbCI+Ci0gICAgPFREPgotICAgICAgPCEtLSBIZXJlIGlzIHRoZSBjb2x1bW4gZGF0YSAtLT4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz4KLSAgICA8L1REPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2Jhc2ljLWNvbm5lY3Rpb24vZGJ0ZXN0LnhzbCBiL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2Jhc2ljLWNvbm5lY3Rpb24vZGJ0ZXN0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjNmRiNS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9iYXNpYy1jb25uZWN0aW9uL2RidGVzdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgICAgIHhtbG5zOnNxbD0ib3JnLmFwYWNoZS54YWxhbi5saWIuc3FsLlhDb25uZWN0aW9uIgotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJzcWwiPgotICA8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icXVlcnkiIHNlbGVjdD0iJnF1b3Q7U0VMRUNUIEZpcnN0TmFtZSwgTGFzdE5hbWUsIFN0cmVldDEsIENpdHksIFppcCAgRlJPTSBBY2NvdW50IHdoZXJlIEFjY3RJRD0nMjAxOTAwMjAxMCcmcXVvdDsiLz4KLSAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPCEtLSAxLiBNYWtlIHRoZSBjb25uZWN0aW9uIC0tPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYWNjb3VudHMiCi0gICAgICAgICAgICAgICAgICBzZWxlY3Q9InNxbDpuZXcoJ2NvbS5zeWJhc2UuamRiYzIuamRiYy5TeWJEcml2ZXInLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnamRiYzpzeWJhc2U6VGRzOmxvY2FsaG9zdDo1MDAwL3NtYXJ0OTExJywgJ3NhJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycpIi8+Ci0gICAgPEhUTUw+Ci0gICAgICA8SEVBRD4KLSAgICAgIDwvSEVBRD4KLSAgICAgIDxCT0RZPgotICAgICAgICA8VEFCTEUgYm9yZGVyPSIxIj4KLSAgICAgICAgPCEtLTIuIEV4ZWN1dGUgdGhlIHF1ZXJ5IC0tPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRhYmxlIiBzZWxlY3Q9J3NxbDpxdWVyeSgkYWNjb3VudHMsICRxdWVyeSknLz4KLSAgICAgICAgICA8VFI+Ci0gICAgICAgICAgPCEtLSBHZXQgY29sdW1uLWxhYmVsIGF0dHJpYnV0ZSBmcm9tIGVhY2ggY29sdW1uLWhlYWRlci0tPgotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkdGFibGUvcm93LXNldC9jb2x1bW4taGVhZGVyIj4KLSAgICAgICAgICAgIDxUSD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbHVtbi1sYWJlbCIvPjwvVEg+Ci0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgPC9UUj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiR0YWJsZS9yb3ctc2V0L3JvdyIvPgotICAgICAgICAgIDx4c2w6dGV4dD4mIzEwOzwveHNsOnRleHQ+Ci0gICAgICAgIDwvVEFCTEU+Ci0gICAgICA8L0JPRFk+Ci0gICAgPC9IVE1MPiAKLSAgICA8IS0tIDMuIENsb3NlIHRoZSBjb25uZWN0aW9uIC0tPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzcWw6Y2xvc2UoJGFjY291bnRzKSIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJyb3ciPgotICAgICAgICA8VFI+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjb2wiLz4KLSAgICAgICAgPC9UUj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29sIj4KLSAgICA8VEQ+Ci0gICAgICA8IS0tIEhlcmUgaXMgdGhlIGNvbHVtbiBkYXRhIC0tPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPgotICAgIDwvVEQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TUUxFeHRlbnNpb24vZXh0LWNvbm5lY3Rpb24vRXh0ZXJuYWxDb25uZWN0aW9uLmphdmEgYi9zYW1wbGVzL1NRTEV4dGVuc2lvbi9leHQtY29ubmVjdGlvbi9FeHRlcm5hbENvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhMTA4ZC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9leHQtY29ubmVjdGlvbi9FeHRlcm5hbENvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYU0xUNEoiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0vLyBJbXBvcnRlZCBUcmFYIGNsYXNzZXMKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ubGliLnNxbC5EZWZhdWx0Q29ubmVjdGlvblBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5saWIuc3FsLlhDb25uZWN0aW9uUG9vbE1hbmFnZXI7Ci0KLQotLy8gSW1wb3J0ZWQgamF2YSBjbGFzc2VzCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogIFVzZSB0aGUgVHJhWCBpbnRlcmZhY2UgdG8gcGVyZm9ybSBhIHRyYW5zZm9ybWF0aW9uIGluIHRoZSBzaW1wbGVzdCBtYW5uZXIgcG9zc2libGUKLSAqICAoMyBzdGF0ZW1lbnRzKS4KLSAqLwotcHVibGljIGNsYXNzIEV4dGVybmFsQ29ubmVjdGlvbgotewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotCi0gIC8vIENyZWF0ZSBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlIHNlcnZlcgotICAvLyBVcCB0aGUgY29ubmVjdGlvbiBwb29sIGNvdW50IGZvciB0ZXN0aW5nCi0gIERlZmF1bHRDb25uZWN0aW9uUG9vbCBjcCA9IG5ldyBEZWZhdWx0Q29ubmVjdGlvblBvb2woKTsKLSAgY3Auc2V0RHJpdmVyKCJjb20uc3liYXNlLmpkYmMyLmpkYmMuU3liRHJpdmVyIik7Ci0gIGNwLnNldFVSTCgiamRiYzpzeWJhc2U6VGRzOmxvY2FsaG9zdDo1MDAwL3NtYXJ0OTExIik7Ci0gIGNwLnNldFVzZXIoInNhIik7Ci0gIGNwLnNldFBhc3N3b3JkKCIiKTsKLSAgY3Auc2V0TWluQ29ubmVjdGlvbnMoMTApOwotICBjcC5zZXRBY3RpdmUodHJ1ZSk7Ci0KLSAgLy8gTm93IGxldCdzIHJlZ2lzdGVyIG91ciBjb25uZWN0aW9uIHBvb2wgc28gd2UgY2FuIHVzZQotICAvLyBpbiBhIHN0eWxlc2hlZXQKLSAgWENvbm5lY3Rpb25Qb29sTWFuYWdlciBwbSA9IG5ldyBYQ29ubmVjdGlvblBvb2xNYW5hZ2VyKCk7Ci0gIHBtLnJlZ2lzdGVyUG9vbCgic3liYXNlIiwgY3ApOwotCi0KLSAgLy8gVXNlIHRoZSBzdGF0aWMgVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkgbWV0aG9kIHRvIGluc3RhbnRpYXRlCi0gIC8vIGEgVHJhbnNmb3JtZXJGYWN0b3J5LiBUaGUgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkKLSAgLy8gc3lzdGVtIHByb3BlcnR5IHNldHRpbmcgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIGNsYXNzIHRvIGluc3RhbnRpYXRlIC0tCi0gIC8vIG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIuVHJhbnNmb3JtZXJJbXBsLgotCVRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0JLy8gVXNlIHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgdG8gaW5zdGFudGlhdGUgYSBUcmFuc2Zvcm1lciB0aGF0IHdpbGwgd29yayB3aXRoCi0JLy8gdGhlIHN0eWxlc2hlZXQgeW91IHNwZWNpZnkuIFRoaXMgbWV0aG9kIGNhbGwgYWxzbyBwcm9jZXNzZXMgdGhlIHN0eWxlc2hlZXQKLSAgLy8gaW50byBhIGNvbXBpbGVkIFRlbXBsYXRlcyBvYmplY3QuCi0JVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0RmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigKLSAgICAgICAgbmV3IFN0cmVhbVNvdXJjZSgiZGJ0ZXN0LnhzbCIpKTsKLQotCS8vIFVzZSB0aGUgVHJhbnNmb3JtZXIgdG8gYXBwbHkgdGhlIGFzc29jaWF0ZWQgVGVtcGxhdGVzIG9iamVjdCB0byBhbiBYTUwgZG9jdW1lbnQKLQkvLyAoZm9vLnhtbCkgYW5kIHdyaXRlIHRoZSBvdXRwdXQgdG8gYSBmaWxlIChmb28ub3V0KS4KLQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oCi0gICAgICAgIG5ldyBTdHJlYW1Tb3VyY2UoImRidGVzdC54bWwiKSwKLSAgICAgICAgbmV3IFN0cmVhbVJlc3VsdChuZXcgRmlsZU91dHB1dFN0cmVhbSgiZGJ0ZXN0Lm91dCIpKSk7Ci0KLQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKiogVGhlIHJlc3VsdCBpcyBpbiBkYnRlc3Qub3V0ICoqKioqKioqKioqKioiKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2V4dC1jb25uZWN0aW9uL2RidGVzdC5vdXQgYi9zYW1wbGVzL1NRTEV4dGVuc2lvbi9leHQtY29ubmVjdGlvbi9kYnRlc3Qub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjE0ZGNhLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2V4dC1jb25uZWN0aW9uL2RidGVzdC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08SFRNTD4KLTxIRUFEPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9IRUFEPgotPEJPRFk+Ci08VEFCTEUgYm9yZGVyPSIxIj4KLTxUUj4KLTxUSD5GaXJzdE5hbWU8L1RIPjxUSD5MYXN0TmFtZTwvVEg+PFRIPlN0cmVldDE8L1RIPjxUSD5DaXR5PC9USD48VEg+WmlwPC9USD4KLTwvVFI+Ci08VFI+Ci08VEQ+PC9URD48VEQ+PC9URD48VEQ+PC9URD48VEQ+PC9URD48VEQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQ+TGF3cmVuY2UgICAgICAgICAgICAgICAgICAgICAgPC9URD48VEQ+RnJpZXNlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9URD48VEQ+NDAxMCBTYW50YSBSb3NhIEF2ZSAgICAgICAgICAgICAgICAgICAgIDwvVEQ+PFREPlR1bGFyZSAgICAgICAgICAgICAgICAgICAgICAgIDwvVEQ+PFREPjkyMzEzPC9URD4KLTwvVFI+Ci0KLTwvVEFCTEU+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9leHQtY29ubmVjdGlvbi9kYnRlc3QueG1sIGIvc2FtcGxlcy9TUUxFeHRlbnNpb24vZXh0LWNvbm5lY3Rpb24vZGJ0ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3ZDI1Zi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9leHQtY29ubmVjdGlvbi9kYnRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPGRidGVzdD4KLSA8ZGVzY3JpcHRpb24+VGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIG1ha2UgYSBjb25uZWN0aW9uIHRvIHRoZSBEQk1TPC9kZXNjcmlwdGlvbj4KLQotIDxEQklORk8+Ci0gICA8ZGJkcml2ZXI+Y29tLnN5YmFzZS5qZGJjMi5qZGJjLlN5YkRyaXZlcjwvZGJkcml2ZXI+Ci0gICA8ZGJ1cmw+amRiYzpzeWJhc2U6VGRzOmxvY2FsaG9zdDo1MDAwL3NtYXJ0OTExPC9kYnVybD4KLSAgIDx1c2VyPnNhPC91c2VyPgotICAgPHBhc3N3b3JkLz4KLSA8L0RCSU5GTz4KLSAKLQotPC9kYnRlc3Q+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9leHQtY29ubmVjdGlvbi9kYnRlc3QueHNsIGIvc2FtcGxlcy9TUUxFeHRlbnNpb24vZXh0LWNvbm5lY3Rpb24vZGJ0ZXN0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkNzE3OS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9leHQtY29ubmVjdGlvbi9kYnRlc3QueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCIKLSAgICAgICAgICAgICAgICB4bWxuczpzcWw9Im9yZy5hcGFjaGUueGFsYW4ubGliLnNxbC5YQ29ubmVjdGlvbiIKLSAgICAgICAgICAgICAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0ic3FsIj4KLSAgPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIvPgotICA8eHNsOnBhcmFtIG5hbWU9InF1ZXJ5IiBzZWxlY3Q9IiZxdW90O1NFTEVDVCBGaXJzdE5hbWUsIExhc3ROYW1lLCBTdHJlZXQxLCBDaXR5LCBaaXAgIEZST00gQWNjb3VudCB3aGVyZSBBY2N0SUQ9JzIwMTk5OTAwMDAnJnF1b3Q7Ii8+Ci0gCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDwhLS0gMS4gTWFrZSB0aGUgY29ubmVjdGlvbiAtLT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFjY291bnRzIgotICAgICAgICAgICAgICAgICAgc2VsZWN0PSJzcWw6bmV3KCdzeWJhc2UnKSIvPgotICAgIDxIVE1MPgotICAgICAgPEhFQUQ+Ci0gICAgICA8L0hFQUQ+Ci0gICAgICA8Qk9EWT4KLSAgICAgICAgPFRBQkxFIGJvcmRlcj0iMSI+Ci0gICAgICAgIDwhLS0yLiBFeGVjdXRlIHRoZSBxdWVyeSAtLT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YWJsZSIgc2VsZWN0PSdzcWw6cXVlcnkoJGFjY291bnRzLCAkcXVlcnkpJy8+Ci0gICAgICAgICAgPFRSPgotICAgICAgICAgIDwhLS0gR2V0IGNvbHVtbi1sYWJlbCBhdHRyaWJ1dGUgZnJvbSBlYWNoIGNvbHVtbi1oZWFkZXItLT4KLSAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRhYmxlL3Jvdy1zZXQvY29sdW1uLWhlYWRlciI+Ci0gICAgICAgICAgICA8VEg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb2x1bW4tbGFiZWwiLz48L1RIPgotICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkdGFibGUvcm93LXNldC9yb3ciLz4KLSAgICAgICAgICA8eHNsOnRleHQ+JiMxMDs8L3hzbDp0ZXh0PgotICAgICAgICA8L1RBQkxFPgotICAgICAgPC9CT0RZPgotICAgIDwvSFRNTD4gCi0gICAgPCEtLSAzLiBDbG9zZSB0aGUgY29ubmVjdGlvbiAtLT4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3FsOmNsb3NlKCRhY2NvdW50cykiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icm93Ij4KLSAgICAgICAgPFRSPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iY29sIi8+Ci0gICAgICAgIDwvVFI+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbCI+Ci0gICAgPFREPgotICAgICAgPCEtLSBIZXJlIGlzIHRoZSBjb2x1bW4gZGF0YSAtLT4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz4KLSAgICA8L1REPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL3BxdWVyeS9kYmluZm8ueG1sIGIvc2FtcGxlcy9TUUxFeHRlbnNpb24vcHF1ZXJ5L2RiaW5mby54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZDFjMWEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9TUUxFeHRlbnNpb24vcHF1ZXJ5L2RiaW5mby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08WE1MU1RPUkU+Ci0KLSA8UVVFUlk+Ci0gICA8QUNDVElEPjIwMTk5OTAwMDA8L0FDQ1RJRD4KLSA8L1FVRVJZPgotICAKLSA8REJJTkZPPgotICAgPGRiZHJpdmVyPmNvbS5zeWJhc2UuamRiYzIuamRiYy5TeWJEcml2ZXI8L2RiZHJpdmVyPgotICAgPGRidXJsPmpkYmM6c3liYXNlOlRkczpsb2NhbGhvc3Q6NTAwMC9zbWFydDkxMTwvZGJ1cmw+Ci0gICA8dXNlcj5zYTwvdXNlcj4KLSAgIDxwYXNzd29yZC8+Ci0gPC9EQklORk8+Ci0KLTwvWE1MU1RPUkU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9wcXVlcnkvZGJ0ZXN0LXBxdWVyeS54c2wgYi9zYW1wbGVzL1NRTEV4dGVuc2lvbi9wcXVlcnkvZGJ0ZXN0LXBxdWVyeS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYzk4ZGMuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9TUUxFeHRlbnNpb24vcHF1ZXJ5L2RidGVzdC1wcXVlcnkueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCIKLSAgICAgICAgICAgICAgICB4bWxuczpzcWw9Ii9vcmcuYXBhY2hlLnhhbGFuLmxpYi5zcWwuWENvbm5lY3Rpb24iCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InNxbCI+Ci0gIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJxMSIgc2VsZWN0PSImcXVvdDtTRUxFQ1QgRmlyc3ROYW1lLCBMYXN0TmFtZSwgU3RyZWV0MSwgQ2l0eSwgWmlwICBGUk9NIEFjY291bnQgd2hlcmUgQWNjdElEPSA/ICZxdW90OyIvPgotICA8eHNsOnBhcmFtIG5hbWU9InExdHlwZSIgc2VsZWN0PSJzdHJpbmciLz4KLSAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPCEtLSAxLiBNYWtlIHRoZSBjb25uZWN0aW9uIC0tPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iY2luZm8iIHNlbGVjdD0iLy9EQklORk8iIC8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJhY2NvdW50cyIKLSAgICAgICAgICAgICAgICAgIHNlbGVjdD0nc3FsOm5ldygkY2luZm8pJy8+Ci0gICAgPEhUTUw+Ci0gICAgICA8SEVBRD4KLSAgICAgIDwvSEVBRD4KLSAgICAgIDxCT0RZPgotICAgICAgICA8VEFCTEUgYm9yZGVyPSIxIj4KLSAgICAgICAgPCEtLTIuIEV4ZWN1dGUgdGhlIHF1ZXJ5IC0tPgotCTx4c2w6cGFyYW0gbmFtZT0icTFwYXJhbSIgc2VsZWN0PSIvL1FVRVJZIiAvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZvbyIgc2VsZWN0PSdzcWw6YWRkUGFyYW1ldGVyRnJvbUVsZW1lbnQoJGFjY291bnRzLCAkcTFwYXJhbSknIC8+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YWJsZSIgc2VsZWN0PSdzcWw6cHF1ZXJ5KCRhY2NvdW50cywgJHExLCAkcTF0eXBlKScvPgotICAgICAgICAgIDxUUj4KLSAgICAgICAgICA8IS0tIEdldCBjb2x1bW4tbGFiZWwgYXR0cmlidXRlIGZyb20gZWFjaCBjb2x1bW4taGVhZGVyLS0+Ci0gICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0YWJsZS9yb3ctc2V0L2NvbHVtbi1oZWFkZXIiPgotICAgICAgICAgICAgPFRIPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29sdW1uLWxhYmVsIi8+PC9USD4KLSAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICA8L1RSPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJHRhYmxlL3Jvdy1zZXQvcm93Ii8+Ci0gICAgICAgICAgPHhzbDp0ZXh0PiYjMTA7PC94c2w6dGV4dD4KLSAgICAgICAgPC9UQUJMRT4KLSAgICAgIDwvQk9EWT4KLSAgICA8L0hUTUw+IAotICAgIDwhLS0gMy4gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gLS0+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InNxbDpjbG9zZSgkYWNjb3VudHMpIi8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InJvdyI+Ci0gICAgICAgIDxUUj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNvbCIvPgotICAgICAgICA8L1RSPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb2wiPgotICAgIDxURD4KLSAgICAgIDwhLS0gSGVyZSBpcyB0aGUgY29sdW1uIGRhdGEgLS0+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+Ci0gICAgPC9URD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9zaG93LWVycm9yL2RiaW5mby54bWwgYi9zYW1wbGVzL1NRTEV4dGVuc2lvbi9zaG93LWVycm9yL2RiaW5mby54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzJkZGEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9TUUxFeHRlbnNpb24vc2hvdy1lcnJvci9kYmluZm8ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPFhNTFNUT1JFPgotCi0gPFVTRVJQUk9GSUxFPgotICA8VVNFUk5BTUU+Z2VudGlqbzwvVVNFUk5BTUU+Ci0gIDxQQVNTV0Q+ZHJvd3NzYXA8L1BBU1NXRD4KLSA8L1VTRVJQUk9GSUxFPgotCi0gPFFVRVJZPgotICAgPEFDQ1RJRD4yMDE5OTkwMDAwPC9BQ0NUSUQ+Ci0gPC9RVUVSWT4KLSAgCi0gPERCSU5GTz4KLSAgIDxkYmRyaXZlcj5jb20uc3liYXNlLmpkYmMyLmpkYmMuU3liRHJpdmVyPC9kYmRyaXZlcj4KLSAgIDxkYnVybD5qZGJjOnN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAvc21hcnQ5MTE8L2RidXJsPgotICAgPHVzZXI+c2E8L3VzZXI+Ci0gICA8cGFzc3dvcmQvPgotIDwvREJJTkZPPgotCi08L1hNTFNUT1JFPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TUUxFeHRlbnNpb24vc2hvdy1lcnJvci9kYnRlc3QueHNsIGIvc2FtcGxlcy9TUUxFeHRlbnNpb24vc2hvdy1lcnJvci9kYnRlc3QueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODEzYTA4Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL3Nob3ctZXJyb3IvZGJ0ZXN0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiCi0gICAgICAgICAgICAgICAgeG1sbnM6c3FsPSIvb3JnLmFwYWNoZS54YWxhbi5saWIuc3FsLlhDb25uZWN0aW9uIgotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJzcWwiPgotICA8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icXVlcnkiIHNlbGVjdD0iJnF1b3Q7U0VMRUMgRmlyc3ROYW1lLCBMYXN0TmFtZSwgU3RyZWV0MSwgQ2l0eSwgWmlwICBGUk9NIEFjY291bnQgd2hlcmUgQWNjdElEPScyMDE5OTkwMDAwJyZxdW90OyIvPgotIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8IS0tIDEuIE1ha2UgdGhlIGNvbm5lY3Rpb24gLS0+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJhY2NvdW50cyIKLSAgICAgICAgICAgICAgICAgIHNlbGVjdD0ic3FsOm5ldygnY29tLnN5YmFzZS5qZGJjMi5qZGJjLlN5YkRyaXZlcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqZGJjOnN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAvc21hcnQ5MTEnLCAnc2EnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnKSIvPgotICAgIDwhLS0yLiBFeGVjdXRlIHRoZSBxdWVyeSAtLT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRhYmxlIiBzZWxlY3Q9J3NxbDpxdWVyeSgkYWNjb3VudHMsICRxdWVyeSknLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAKLSAgIAk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiR0YWJsZS9yb3ctc2V0IiAvPgotIAkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkdGFibGUvZXh0LWVycm9yIiAvPgotICAgIAotICAgIDwhLS0gMy4gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gLS0+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InNxbDpjbG9zZSgkYWNjb3VudHMpIi8+Ci0KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icm93LXNldCI+Ci0gICAgCi0gICAgPEhUTUw+Ci0gICAgICA8SEVBRD4KLSAgICAgIDwvSEVBRD4KLSAgICAgIDxCT0RZPgotICAgICAgICA8VEFCTEUgYm9yZGVyPSIxIj4KLSAgICAgICAgICA8VFI+Ci0gICAgICAgICAgPCEtLSBHZXQgY29sdW1uLWxhYmVsIGF0dHJpYnV0ZSBmcm9tIGVhY2ggY29sdW1uLWhlYWRlci0tPgotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJyb3ctc2V0L2NvbHVtbi1oZWFkZXIiPgotICAgICAgICAgICAgPFRIPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29sdW1uLWxhYmVsIi8+PC9USD4KLSAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICA8L1RSPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iL3Jvdy1zZXQvcm93Ii8+Ci0gICAgICAgICAgPHhzbDp0ZXh0PiYjMTA7PC94c2w6dGV4dD4KLSAgICAgICAgPC9UQUJMRT4KLSAgICAgIDwvQk9EWT4KLSAgICA8L0hUTUw+IAotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJyb3ciPgotICAgICAgICA8VFI+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjb2wiLz4KLSAgICAgICAgPC9UUj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29sIj4KLSAgICA8VEQ+Ci0gICAgICA8IS0tIEhlcmUgaXMgdGhlIGNvbHVtbiBkYXRhIC0tPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPgotICAgIDwvVEQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vZXh0LWVycm9yIj4KLSAgICA8eHNsOnRleHQ+V29vcHMsIGFuIGVycm9yIG9jY3VyZWQ6IDwveHNsOnRleHQ+Ci0gIAk8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TaW1wbGVUcmFuc2Zvcm0vU2ltcGxlVHJhbnNmb3JtLmphdmEgYi9zYW1wbGVzL1NpbXBsZVRyYW5zZm9ybS9TaW1wbGVUcmFuc2Zvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0NmEyNS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NpbXBsZVRyYW5zZm9ybS9TaW1wbGVUcmFuc2Zvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhTTFQ0SiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLS8vIEltcG9ydGVkIFRyYVggY2xhc3NlcwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi0KLS8vIEltcG9ydGVkIGphdmEgY2xhc3NlcwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqICBVc2UgdGhlIFRyYVggaW50ZXJmYWNlIHRvIHBlcmZvcm0gYSB0cmFuc2Zvcm1hdGlvbiBpbiB0aGUgc2ltcGxlc3QgbWFubmVyIHBvc3NpYmxlCi0gKiAgKDMgc3RhdGVtZW50cykuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUcmFuc2Zvcm0KLXsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCAKLSAgICAgICAgICAgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7ICAKLSAgLy8gVXNlIHRoZSBzdGF0aWMgVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkgbWV0aG9kIHRvIGluc3RhbnRpYXRlIAotICAvLyBhIFRyYW5zZm9ybWVyRmFjdG9yeS4gVGhlIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5IAotICAvLyBzeXN0ZW0gcHJvcGVydHkgc2V0dGluZyBkZXRlcm1pbmVzIHRoZSBhY3R1YWwgY2xhc3MgdG8gaW5zdGFudGlhdGUgLS0KLSAgLy8gb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGwuCi0JVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCi0JLy8gVXNlIHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgdG8gaW5zdGFudGlhdGUgYSBUcmFuc2Zvcm1lciB0aGF0IHdpbGwgd29yayB3aXRoICAKLQkvLyB0aGUgc3R5bGVzaGVldCB5b3Ugc3BlY2lmeS4gVGhpcyBtZXRob2QgY2FsbCBhbHNvIHByb2Nlc3NlcyB0aGUgc3R5bGVzaGVldAotICAvLyBpbnRvIGEgY29tcGlsZWQgVGVtcGxhdGVzIG9iamVjdC4KLQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKG5ldyBTdHJlYW1Tb3VyY2UoImJpcmRzLnhzbCIpKTsKLQotCS8vIFVzZSB0aGUgVHJhbnNmb3JtZXIgdG8gYXBwbHkgdGhlIGFzc29jaWF0ZWQgVGVtcGxhdGVzIG9iamVjdCB0byBhbiBYTUwgZG9jdW1lbnQKLQkvLyAoZm9vLnhtbCkgYW5kIHdyaXRlIHRoZSBvdXRwdXQgdG8gYSBmaWxlIChmb28ub3V0KS4KLQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IFN0cmVhbVNvdXJjZSgiYmlyZHMueG1sIiksIG5ldyBTdHJlYW1SZXN1bHQobmV3IEZpbGVPdXRwdXRTdHJlYW0oImJpcmRzLm91dCIpKSk7Ci0JCi0JU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqIFRoZSByZXN1bHQgaXMgaW4gYmlyZHMub3V0ICoqKioqKioqKioqKioiKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtL2JpcmRzLnhtbCBiL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtL2JpcmRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyNzY0Mi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NpbXBsZVRyYW5zZm9ybS9iaXJkcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxDbGFzcz4KLTxPcmRlciBOYW1lPSJUSU5BTUlGT1JNRVMiPgotICAgICAgICA8RmFtaWx5IE5hbWU9IlRJTkFNSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlRpbmFtdXMgbWFqb3IiPiAgR3JlYXQgVGluYW1vdS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik5vdGhvY2VyY3VzIj5IaWdobGFuZCBUaW5hbW91LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQ3J5cHR1cmVsbHVzIHNvdWkiPkxpdHRsZSBUaW5hbW91LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQ3J5cHR1cmVsbHVzIGNpbm5hbW9tZXVzIj5UaGlja2V0IFRpbmFtb3UuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDcnlwdHVyZWxsdXMgYm91Y2FyZGkiPlNsYXR5LWJyZWFzdGVkIFRpbmFtb3UuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDcnlwdHVyZWxsdXMga2VycmlhZSI+Q2hvY28gVGluYW1vdS48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgIDwvT3JkZXI+Ci08T3JkZXIgTmFtZT0iR0FWSUlGT1JNRVMiPgotICAgICAgICA8RmFtaWx5IE5hbWU9IkdBVklJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iR2F2aWEgc3RlbGxhdGEiPlJlZC10aHJvYXRlZCBMb29uLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iR2F2aWEgYXJjdGljYSI+QXJjdGljIExvb24uPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBwYWNpZmljYSI+UGFjaWZpYyBMb29uLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iR2F2aWEgaW1tZXIiPkNvbW1vbiBMb29uLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iR2F2aWEgYWRhbXNpaSI+WWVsbG93LWJpbGxlZCBMb29uLjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgPC9PcmRlcj4KLQotCi08T3JkZXIgTmFtZT0iUE9ESUNJUEVESUZPUk1FUyI+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iUE9ESUNJUEVESURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlRhY2h5YmFwdHVzIGRvbWluaWN1cyI+TGVhc3QgR3JlYmUuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQb2RpbHltYnVzIHBvZGljZXBzIj5QaWVkLWJpbGxlZCBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IiI+QXRpdGxhbiBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IiI+SG9ybmVkIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5SZWQtbmVja2VkIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5FYXJlZCBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IiI+V2VzdGVybiBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IiI+Q2xhcmsncyBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IiIvPgotICAgICAgICA8L0ZhbWlseT4KLSAgICA8L09yZGVyPgotCi0KLTxPcmRlciBOYW1lPSJQUk9DRUxMQVJJSUZPUk1FUyI+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iRElPTUVERUlEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJUaGFsYXNzYXJjaGUgY2hsb3Jvcmh5bmNob3MiPlllbGxvdy1ub3NlZCBBbGJhdHJvc3MuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iVGhhbGFzc2FyY2hlIGNhdXRhIj5TaHkgQWxiYXRyb3NzLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlRoYWxhc3NhcmNoZSBtZWxhbm9waHJpcyI+QmxhY2stYnJvd2VkIEFsYmF0cm9zcy4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaG9lYmV0cmlhIHBhbHBlYnJhdGEiPkxpZ2h0LW1hbnRsZWQgQWxiYXRyb3NzLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkRpb21lZGVhIGV4dWxhbnMiPldhbmRlcmluZyBBbGJhdHJvc3MuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhvZWJhc3RyaWEgaW1tdXRhYmlsaXMiPkxheXNhbiBBbGJhdHJvc3MuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaG9lYmFzdHJpYSBuaWdyaXBlcyI+QmxhY2stZm9vdGVkIEFsYmF0cm9zcy48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBob2ViYXN0cmlhIGFsYmF0cnVzIj5TaG9ydC10YWlsZWQgQWxiYXRyb3NzLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IlBST0NFTExBUklJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iRnVsbWFydXMgZ2xhY2lhbGlzIj5Ob3J0aGVybiBGdWxtYXIuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIG5lZ2xlY3RhIj5LZXJtYWRlYyBQZXRyZWwuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBhcm1pbmpvbmlhbmEiPkhlcmFsZCBQZXRyZWwuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSB1bHRpbWEiPk11cnBoeSdzIFBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGluZXhwZWN0YXRhIj5Nb3R0bGVkIFBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGNhaG93Ij5CZXJtdWRhIFBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgaGFzaXRhdGEiPkJsYWNrLWNhcHBlZCBQZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGV4dGVybmEiPkp1YW4gRmVybmFuZGV6IFBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIHBoYWVvcHlnaWEiPkRhcmstcnVtcGVkIFBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgY2VydmljYWxpcyI+V2hpdGUtbmVja2VkIFBldHJlbC4gKEgpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGh5cG9sZXVjYSI+Qm9uaW4gUGV0cmVsLiAoSCk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgbmlncmlwZW5uaXMiPkJsYWNrLXdpbmdlZCBQZXRyZWwuIChILCBBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBjb29raWkiPkNvb2sncyBQZXRyZWwuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBsb25naXJvc3RyaXMiPlN0ZWpuZWdlcidzIFBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJCdWx3ZXJpYSBidWx3ZXJpaSI+QnVsd2VyJ3MgUGV0cmVsLiAoSCk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkJ1bHdlcmlhIGZhbGxheCI+Sm91YW5pbidzIFBldHJlbC4gKEgsIEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQcm9jZWxsYXJpYSBwYXJraW5zb25pIj5QYXJraW5zb24ncyBQZXRyZWwuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQ2Fsb25lY3RyaXMgbGV1Y29tZWxhcyI+U3RyZWFrZWQgU2hlYXJ3YXRlci4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDYWxvbmVjdHJpcyBkaW9tZWRlYSI+Q29yeSdzIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgY3JlYXRvcHVzIj5QaW5rLWZvb3RlZCBTaGVhcndhdGVyLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGNhcm5laXBlcyI+Rmxlc2gtZm9vdGVkIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgZ3JhdmlzIj5HcmVhdGVyIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgcGFjaWZpY3VzIj5XZWRnZS10YWlsZWQgU2hlYXJ3YXRlci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGJ1bGxlcmkiPkJ1bGxlcidzIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgZ3Jpc2V1cyI+U29vdHkgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyB0ZW51aXJvc3RyaXMiPlNob3J0LXRhaWxlZCBTaGVhcndhdGVyLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIG5hdGl2aXRhdGlzIj5DaHJpc3RtYXMgU2hlYXJ3YXRlci4gKEgpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBwdWZmaW51cyI+TWFueCBTaGVhcndhdGVyLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgYXVyaWN1bGFyaXMiPlRvd25zZW5kJ3MgU2hlYXJ3YXRlci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIG9waXN0aG9tZWxhcyI+QmxhY2stdmVudGVkIFNoZWFyd2F0ZXIuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBsaGVybWluaWVyaSI+QXVkdWJvbidzIFNoZWFyd2F0ZXIuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBhc3NpbWlsaXMiPkxpdHRsZSBTaGVhcndhdGVyLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IkhZRFJPQkFUSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFuaXRlcyBvY2VhbmljdXMiPldpbHNvbidzIFN0b3JtLVBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQZWxhZ29kcm9tYSBtYXJpbmEiPldoaXRlLWZhY2VkIFN0b3JtLVBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJIeWRyb2JhdGVzIHBlbGFnaWN1cyI+RXVyb3BlYW4gU3Rvcm0tUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIGZ1cmNhdGEiPkZvcmstdGFpbGVkIFN0b3JtLVBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIGxldWNvcmhvYSI+TGVhY2gncyBTdG9ybS1QZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSBob21vY2hyb2EiPkFzaHkgU3Rvcm0tUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgY2FzdHJvIj5CYW5kLXJ1bXBlZCBTdG9ybS1QZXRyZWwuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgdGV0aHlzIj5XZWRnZS1ydW1wZWQgU3Rvcm0tUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIG1lbGFuaWEiPkJsYWNrIFN0b3JtLVBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIG1hY3JvZGFjdHlsYSI+R3VhZGFsdXBlIFN0b3JtLVBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIG1hcmtoYW1pIj5NYXJraGFtJ3MgU3Rvcm0tUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIHRyaXN0cmFtaSI+VHJpc3RyYW0ncyBTdG9ybS1QZXRyZWwuIChIKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbWljcm9zb21hIj5MZWFzdCBTdG9ybS1QZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICA8L09yZGVyPgotCi08T3JkZXIgTmFtZT0iUEVMRUNBTklGT1JNRVMiPgotICAgICAgICA8RmFtaWx5IE5hbWU9IlBIQUVUSE9OVElEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFldGhvbiBsZXB0dXJ1cyI+V2hpdGUtdGFpbGVkIFRyb3BpY2JpcmQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFldGhvbiBhZXRoZXJldXMiPlJlZC1iaWxsZWQgVHJvcGljYmlyZC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWV0aG9uIHJ1YnJpY2F1ZGEiPlJlZC10YWlsZWQgVHJvcGljYmlyZC48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IlNVTElEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJTdWxhIGRhY3R5bGF0cmEiPk1hc2tlZCBCb29ieS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlN1bGEgbmVib3V4aWkiPkJsdWUtZm9vdGVkIEJvb2J5LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iU3VsYSB2YXJpZWdhdGEiPlBlcnV2aWFuIEJvb2J5LiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlN1bGEgbGV1Y29nYXN0ZXIiPkJyb3duIEJvb2J5LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iU3VsYSBzdWxhIj5SZWQtZm9vdGVkIEJvb2J5LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iTW9ydXMgYmFzc2FudXMiPk5vcnRoZXJuIEdhbm5ldC48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IlBFTEVDQU5JREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGVsZWNhbnVzIGVyeXRocm9yaHluY2hvcyI+QW1lcmljYW4gV2hpdGUgUGVsaWNhbi48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBlbGVjYW51cyBvY2NpZGVudGFsaXMiPkJyb3duIFBlbGljYW4uPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJQSEFMQUNST0NPUkFDSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWxhY3JvY29yYXggcGVuaWNpbGxhdHVzIj5CcmFuZHQncyBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFsYWNyb2NvcmF4IGJyYXNpbGlhbnVzIj5OZW90cm9waWMgQ29ybW9yYW50LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhbGFjcm9jb3JheCBhdXJpdHVzIj5Eb3VibGUtY3Jlc3RlZCBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFsYWNyb2NvcmF4IGNhcmJvIj5HcmVhdCBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFsYWNyb2NvcmF4IHVyaWxlIj5SZWQtZmFjZWQgQ29ybW9yYW50LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhbGFjcm9jb3JheCBwZWxhZ2ljdXMiPlBlbGFnaWMgQ29ybW9yYW50LjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iQU5ISU5HSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkFuaGluZ2EgYW5oaW5nYSI+QW5oaW5nYS48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IkZSRUdBVElEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJGcmVnYXRhIG1hZ25pZmljZW5zIj5NYWduaWZpY2VudCBGcmlnYXRlYmlyZC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkZyZWdhdGEgbWlub3IiPkdyZWF0IEZyaWdhdGViaXJkLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iRnJlZ2F0YSBhcmllbCI+TGVzc2VyIEZyaWdhdGViaXJkLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgIDwvT3JkZXI+Ci08L0NsYXNzPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TaW1wbGVUcmFuc2Zvcm0vYmlyZHMueHNsIGIvc2FtcGxlcy9TaW1wbGVUcmFuc2Zvcm0vYmlyZHMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDZmOGUxLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtL2JpcmRzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkNsYXNzIj4KLTxCaXJkSW5mbz4KLQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ik9yZGVyIi8+Ci08L0JpcmRJbmZvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ik9yZGVyIj4KLU9yZGVyIGlzOiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBOYW1lIi8+Ci0JPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJGYW1pbHkiLz48eHNsOnRleHQ+Ci08L3hzbDp0ZXh0PgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkZhbWlseSI+Ci0JRmFtaWx5IGlzOiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBOYW1lIi8+Ci0JPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJTcGVjaWVzIHwgU3ViRmFtaWx5IHwgdGV4dCgpIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iU3ViRmFtaWx5Ij4KLQkJU3ViRmFtaWx5IGlzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJATmFtZSIvPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iU3BlY2llcyB8IHRleHQoKSIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IlNwZWNpZXMiPgotCTx4c2w6Y2hvb3NlPgotCSAgPHhzbDp3aGVuIHRlc3Q9Im5hbWUoLi4pPSdTdWJGYW1pbHknIj4KLQkJPHhzbDp0ZXh0Pgk8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAU2NpZW50aWZpY19OYW1lIi8+Ci0JICA8L3hzbDp3aGVuPgotCSAgPHhzbDpvdGhlcndpc2U+Ci0JCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAU2NpZW50aWZpY19OYW1lIi8+Ci0JICA8L3hzbDpvdGhlcndpc2U+Ci0JPC94c2w6Y2hvb3NlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NpbXBsZVRyYW5zZm9ybS9mb28ueG1sIGIvc2FtcGxlcy9TaW1wbGVUcmFuc2Zvcm0vZm9vLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE5Zjc5Yi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NpbXBsZVRyYW5zZm9ybS9mb28ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxkb2M+SGVsbG88L2RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1NpbXBsZVRyYW5zZm9ybS9mb28ueHNsIGIvc2FtcGxlcy9TaW1wbGVUcmFuc2Zvcm0vZm9vLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRhOGQ1ZS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NpbXBsZVRyYW5zZm9ybS9mb28ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+Ci0gICAgPG91dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvb3V0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NpbXBsZVRyYW5zZm9ybS9yZWFkbWUuaHRtbCBiL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtL3JlYWRtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzg5MzZmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtL3JlYWRtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+WGFsYW4gU2FtcGxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMj5YYWxhbiBTYW1wbGVzPC9oMj4KLTxwPkZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2FtcGxlcyAod2hhdCB0aGV5IGlsbHVzdHJhdGUgYW5kIGhvdyB0byBydW4gdGhlbSksIHNlZSA8YSBocmVmPSIuLi8uLi9kb2NzL3NhbXBsZXMuaHRtbCI+U2FtcGxlczwvYT4uPC9wPgotCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvVHJhY2UvVHJhY2UuamF2YSBiL3NhbXBsZXMvVHJhY2UvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1OWU0Yi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1RyYWNlL1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIuVHJhbnNmb3JtZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuVHJhY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuUHJpbnRUcmFjZUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUcmFjZQotewkKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpCi0JICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgCi0JCQkgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLQkJCSBqYXZhLnV0aWwuVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbiwgCi0JCQkgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCQkJIAotICB7Ci0gICAgLy8gU2V0IHVwIGEgUHJpbnRUcmFjZUxpc3RlbmVyIG9iamVjdCB0byBwcmludCB0byBhIGZpbGUuCi0gICAgamF2YS5pby5GaWxlV3JpdGVyIGZ3ID0gbmV3IGphdmEuaW8uRmlsZVdyaXRlcigiZXZlbnRzLmxvZyIpOyAgCi0gICAgamF2YS5pby5QcmludFdyaXRlciBwdyA9IG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKGZ3LCB0cnVlKTsKLSAgICBQcmludFRyYWNlTGlzdGVuZXIgcHRsID0gbmV3IFByaW50VHJhY2VMaXN0ZW5lcihwdyk7Ci0KLSAgICAvLyBQcmludCBpbmZvcm1hdGlvbiBhcyBlYWNoIG5vZGUgaXMgJ2V4ZWN1dGVkJyBpbiB0aGUgc3R5bGVzaGVldC4KLSAgICBwdGwubV90cmFjZUVsZW1lbnRzID0gdHJ1ZTsKLSAgICAvLyBQcmludCBpbmZvcm1hdGlvbiBhZnRlciBlYWNoIHJlc3VsdC10cmVlIGdlbmVyYXRpb24gZXZlbnQuCi0gICAgcHRsLm1fdHJhY2VHZW5lcmF0aW9uID0gdHJ1ZTsKLSAgICAvLyBQcmludCBpbmZvcm1hdGlvbiBhZnRlciBlYWNoIHNlbGVjdGlvbiBldmVudC4KLSAgICBwdGwubV90cmFjZVNlbGVjdGlvbiA9IHRydWU7Ci0gICAgLy8gUHJpbnQgaW5mb3JtYXRpb24gd2hlbmV2ZXIgYSB0ZW1wbGF0ZSBpcyBpbnZva2VkLgotICAgIHB0bC5tX3RyYWNlVGVtcGxhdGVzID0gdHJ1ZTsKLQotICAgIC8vIFNldCB1cCB0aGUgdHJhbnNmb3JtYXRpb24gICAgCi0gICAJVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0RmFjdG9yeS5uZXdUcmFuc2Zvcm1lcihuZXcgU3RyZWFtU291cmNlKCJmb28ueHNsIikpOwotCi0gICAgLy8gQ2FzdCB0aGUgVHJhbnNmb3JtZXIgb2JqZWN0IHRvIFRyYW5zZm9ybWVySW1wbC4KLSAgICBpZiAodHJhbnNmb3JtZXIgaW5zdGFuY2VvZiBUcmFuc2Zvcm1lckltcGwpIAotCSAgewotICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVySW1wbCA9IChUcmFuc2Zvcm1lckltcGwpdHJhbnNmb3JtZXI7Ci0gICAgICAvLyBSZWdpc3RlciB0aGUgVHJhY2VMaXN0ZW5lciB3aXRoIGEgVHJhY2VNYW5hZ2VyIGFzc29jaWF0ZWQgCi0gICAgICAvLyB3aXRoIHRoZSBUcmFuc2Zvcm1lckltcGwuCi0gICAgICBUcmFjZU1hbmFnZXIgdHJNZ3IgPSB0cmFuc2Zvcm1lckltcGwuZ2V0VHJhY2VNYW5hZ2VyKCk7Ci0gICAgICB0ck1nci5hZGRUcmFjZUxpc3RlbmVyKHB0bCk7Ci0gICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8vIFBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uIC0tcHJpbnRpbmcgaW5mb3JtYXRpb24gdG8KLSAgICAgIC8vIHRoZSBldmVudHMgbG9nIGR1cmluZyB0aGUgcHJvY2Vzcy4KLSAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybQotICAgICAgICAgICAgICAgICAgICAgICAgICggbmV3IFN0cmVhbVNvdXJjZSgiZm9vLnhtbCIpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQobmV3IGphdmEuaW8uRmlsZVdyaXRlcigiZm9vLm91dCIpKSApOwotICAgIH0KLSAgICAvLyBDbG9zZSB0aGUgUHJpbnRXcml0ZXIgYW5kIEZpbGVXcml0ZXIuCi0gICAgcHcuY2xvc2UoKTsKLSAgICBmdy5jbG9zZSgpOwotICAgCVN5c3RlbS5vdXQucHJpbnRsbigiKipUaGUgb3V0cHV0IGlzIGluIGZvby5vdXQ7IHRoZSBsb2cgaXMgaW4gZXZlbnRzLmxvZyAqKioqIik7CQotICAgIAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9UcmFjZS9mb28ueG1sIGIvc2FtcGxlcy9UcmFjZS9mb28ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTcyZTE1Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvVHJhY2UvZm9vLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTx1cGxvYWQ+Ci0gIDxkYXk+Ci0gICAgPGRvdz50dWU8L2Rvdz4KLSAgICA8b3JkZXI+Ci0gICAgICA8bGluZT4KLSAgICAgICAgIDxwcm9kdWN0PkJlbHQ8L3Byb2R1Y3Q+Ci0gICAgICAgICA8cHJpY2U+NS41NDwvcHJpY2U+Ci0gICAgICA8L2xpbmU+Ci0gICAgPC9vcmRlcj4KLSAgPC9kYXk+Ci0gIDxkYXk+Ci0gICAgPGRvdz53ZWQ8L2Rvdz4KLSAgPC9kYXk+Ci0gIDxkYXk+Ci0gICAgPGRvdz50aHU8L2Rvdz4KLSAgICA8b3JkZXI+Ci0gICAgICA8bGluZT4KLSAgICAgICAgIDxwcm9kdWN0PkJvb3RzPC9wcm9kdWN0PgotICAgICAgICAgPHByaWNlPjkuMjM8L3ByaWNlPgotICAgICAgPC9saW5lPgotICAgIDwvb3JkZXI+Ci0gIDwvZGF5PgotICA8ZGF5PgotICAgIDxkb3c+ZnJpPC9kb3c+Ci0gICAgPG9yZGVyPgotICAgIDwvb3JkZXI+Ci0gICAgPG9yZGVyPgotICAgIDwvb3JkZXI+Ci0gIDwvZGF5PgotICA8ZGF5PgotICAgIDxkb3c+c2F0PC9kb3c+Ci0gICAgPG9yZGVyPgotICAgICAgPGxpbmU+Ci0gICAgICAgICA8cHJvZHVjdD5KYWNrZXQ8L3Byb2R1Y3Q+Ci0gICAgICAgICA8cHJpY2U+OS44NDwvcHJpY2U+Ci0gICAgICA8L2xpbmU+Ci0gICAgPC9vcmRlcj4KLSAgPC9kYXk+Ci0gIDxkYXk+Ci0gICAgPGRvdz5tb248L2Rvdz4KLSAgICA8b3JkZXI+Ci0gICAgPC9vcmRlcj4KLSAgICA8b3JkZXI+Ci0gICAgICA8bGluZT4KLSAgICAgICAgIDxwcm9kdWN0PlRpZTwvcHJvZHVjdD4KLSAgICAgICAgIDxwcmljZT41LjM3PC9wcmljZT4KLSAgICAgIDwvbGluZT4KLSAgICA8L29yZGVyPgotICA8L2RheT4KLSAgPGRheT4KLSAgICA8ZG93PnR1ZTwvZG93PgotICA8L2RheT4KLSAgPGRheT4KLSAgICA8ZG93PndlZDwvZG93PgotICAgIDxvcmRlcj4KLSAgICA8L29yZGVyPgotICA8L2RheT4KLSAgPGRheT4KLSAgICA8ZG93PnRodTwvZG93PgotICAgIDxvcmRlcj4KLSAgICAgIDxsaW5lPgotICAgICAgICAgPHByb2R1Y3Q+T3ZlcmFsbHM8L3Byb2R1Y3Q+Ci0gICAgICAgICA8cHJpY2U+My4xNjwvcHJpY2U+Ci0gICAgICA8L2xpbmU+Ci0gICAgPC9vcmRlcj4KLSAgPC9kYXk+Ci08L3VwbG9hZD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvVHJhY2UvZm9vLnhzbCBiL3NhbXBsZXMvVHJhY2UvZm9vLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3NWVlNy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1RyYWNlL2Zvby54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi0gIDwhLS0gRmlsZU5hbWU6IG1pc2MtZXZhbnMgLS0+Ci0gIDwhLS0gRG9jdW1lbnQ6IGh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQgLS0+Ci0gIDwhLS0gRG9jVmVyc2lvbjogMTk5OTExMTYgLS0+Ci0gIDwhLS0gUHVycG9zZTogQ09QWSBvZiBwZXJmIHRlc3Q7IkEgUHJhY3RpY2FsIFN1Z2dlc3Rpb24gZm9yIFhTTFQgUGVyZm9ybWFuY2UgSW1wcm92ZW1lbnQiIGJ5IENsYXJrIEV2YW5zLiAtLT4KLQotICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJkYXktbGlzdCIgCi0gICAgIHNlbGVjdD0iLy9kb3dbbm90KC49Zm9sbG93aW5nOjpkb3cpXSIgLz4KLQotICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9kdWN0LWxpc3QiIAotICAgICAgICAgICAgc2VsZWN0PSIvL3Byb2R1Y3Rbbm90KC49Zm9sbG93aW5nOjpwcm9kdWN0KV0iIC8+Ci0gICAgIAotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0ibXktdGVzdCI+PGE+PGIvPjwvYT48L3hzbDp2YXJpYWJsZT4KLSAgPGh0bWw+Ci0gICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iJG15LXRlc3QiLz4KLSAgICA8Ym9keT4KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD48eHNsOnRleHQ+IDwveHNsOnRleHQ+PC90ZD4KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkYXktbGlzdCI+Ci0gICAgICAgICAgPHhzbDpzb3J0IG9yZGVyPSJhc2NlbmRpbmciIHNlbGVjdD0iLiIgLz4KLSAgICAgICAgICA8dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L3RoPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgIDwvdHI+Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHByb2R1Y3QtbGlzdCI+Ci0gICAgICAgIDx4c2w6c29ydCAgICBvcmRlcj0iYXNjZW5kaW5nIiBzZWxlY3Q9Ii4iIC8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvZHVjdCIgc2VsZWN0PSIuIiAvPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9kdWN0IiAvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkYXktbGlzdCI+Ci0gICAgICAgICAgICA8eHNsOnNvcnQgb3JkZXI9ImFzY2VuZGluZyIgc2VsZWN0PSIuIiAvPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJkYXkiIHNlbGVjdD0iLiIgLz4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiAKLSAgICAgICAgICAgICBzZWxlY3Q9InN1bSgvL3ByaWNlWy4uL3Byb2R1Y3Q9JHByb2R1Y3RdWy4uLy4uLy4uL2Rvdz0kZGF5XSkiCi0vPiAuCi0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2YgCi0gICAgICAgICAgICAgIHNlbGVjdD0ic3VtKC8vcHJpY2VbLi4vcHJvZHVjdD0kcHJvZHVjdF0pIiAvPiAuCi0gICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48L3RkPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRheS1saXN0Ij4KLSAgICAgICAgICA8eHNsOnNvcnQgICAgb3JkZXI9ImFzY2VuZGluZyIgc2VsZWN0PSIuIiAvPgotICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZGF5IiBzZWxlY3Q9Ii4iIC8+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiAKLSAgICAgICAgICAgICAgc2VsZWN0PSJzdW0oLy9wcmljZVsuLi8uLi8uLi9kb3c9JGRheV0pIiAvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgvL3ByaWNlKSIgLz4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8L2JvZHk+Ci0gIDwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvVXNlU3R5bGVzaGVldFBJL1VzZVN0eWxlc2hlZXRQSS5qYXZhIGIvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UEkvVXNlU3R5bGVzaGVldFBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMGM3MTQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UEkvVXNlU3R5bGVzaGVldFBJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotLy8gSW1wb3J0ZWQgVHJhWCBjbGFzc2VzCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLS8vIEltcG9ydGVkIGphdmEuaW8gY2xhc3NlcwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwkKLQotcHVibGljIGNsYXNzIFVzZVN0eWxlc2hlZXRQSQotewotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotCSAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLQl7Ci0JICBTdHJpbmcgbWVkaWE9IG51bGwgLCB0aXRsZSA9IG51bGwsIGNoYXJzZXQgPSBudWxsOwotCSAgdHJ5Ci0JICB7CQotICAgIAlUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIFNvdXJjZSBzdHlsZXNoZWV0ID0gdEZhY3RvcnkuZ2V0QXNzb2NpYXRlZFN0eWxlc2hlZXQKLSAgICAgICAgKG5ldyBTdHJlYW1Tb3VyY2UoImZvb1gueG1sIiksbWVkaWEsIHRpdGxlLCBjaGFyc2V0KTsKLSAgICAgIAotICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0RmFjdG9yeS5uZXdUcmFuc2Zvcm1lcihzdHlsZXNoZWV0KTsKLSAgICAgICAgCi0JCSAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKCJmb29YLnhtbCIpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVJlc3VsdChuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKCJmb28ub3V0IikpKTsKLSAgICAgICAKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKiBUaGUgcmVzdWx0IGlzIGluIGZvby5vdXQgKioqKioqKioqKioqKiIpOwotICAgICAgIAotCSAgfQotICAJICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICB7Ci0JICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvVXNlU3R5bGVzaGVldFBJL2Zvby54c2wgYi9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQSS9mb28ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGE4ZDVlLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvVXNlU3R5bGVzaGVldFBJL2Zvby54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jIj4KLSAgICA8b3V0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9vdXQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvVXNlU3R5bGVzaGVldFBJL2Zvb1gueG1sIGIvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UEkvZm9vWC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNGI3NDMuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UEkvZm9vWC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iZm9vLnhzbCI/PgotPGRvYz5IZWxsbzwvZG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvVXNlU3R5bGVzaGVldFBhcmFtL1VzZVN0eWxlc2hlZXRQYXJhbS5qYXZhIGIvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UGFyYW0vVXNlU3R5bGVzaGVldFBhcmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YjNjOTEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UGFyYW0vVXNlU3R5bGVzaGVldFBhcmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWFNMVDRKIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0vLyBJbXBvcnRlZCBUcmFYIGNsYXNzZXMKLS8vIEltcG9ydGVkIFRyYVggY2xhc3NlcwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi0vLyBJbXBvcnRlZCBTQVggY2xhc3NlcwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLy8gSW1wb3J0ZWQgamF2YSBjbGFzc2VzCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotICAvKioKLSAgICogVXNlIGNvbW1hbmQtbGluZSBpbnB1dCBhcyBhIHN0eWxlc2hlZXQgcGFyYW1ldGVyLgotICAgKi8KLQotcHVibGljIGNsYXNzIFVzZVN0eWxlc2hlZXRQYXJhbQotewotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotCXRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCAKLSAgICAgICAgIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24JICAgCi0JewotICAgIGlmKGFyZ3MubGVuZ3RoICE9IDEpCi0gICAgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQbGVhc2UgcGFzcyBvbmUgc3RyaW5nIHRvIHRoaXMgcHJvZ3JhbSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCS8vIEdldCB0aGUgcGFyYW1ldGVyIHZhbHVlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IGFyZ3NbMF07Ci0JCi0gICAJVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0RmFjdG9yeS5uZXdUcmFuc2Zvcm1lcihuZXcgU3RyZWFtU291cmNlKCJmb28ueHNsIikpOwotCi0JLy8gU2V0IHRoZSBwYXJhbWV0ZXIuIEkgY2FuJ3QgZ2V0IG5vbi1udWxsIG5hbWVzcGFjZXMgdG8gd29yayEhCi0gICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKCJwYXJhbTEiLAkvKiBwYXJhbWV0ZXIgbmFtZSAqLwotICAgICAgICAgICAgICAgCQkJCQkJCSBwYXJhbVZhbHVlIC8qIHBhcmFtZXRlciB2YWx1ZSAqLyApOwotICAgIAotICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKCJmb28ueG1sIiksIG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCkpOwotICB9ICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UGFyYW0vZm9vLnhtbCBiL3NhbXBsZXMvVXNlU3R5bGVzaGVldFBhcmFtL2Zvby54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYzMyYjUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UGFyYW0vZm9vLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08ZG9jPkhlbGxvPC9kb2M+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQYXJhbS9mb28ueHNsIGIvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UGFyYW0vZm9vLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlMTlkYy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQYXJhbS9mb28ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icGFyYW0xIiBzZWxlY3Q9IidkZWZhdWx0IHZhbHVlJyIvPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2MiPgotICAgIDxvdXQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJhbTEiLz48L291dD4KLSAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UGFyYW0vcmVhZG1lLmh0bWwgYi9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQYXJhbS9yZWFkbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4OTM2Zi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQYXJhbS9yZWFkbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPlhhbGFuIFNhbXBsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDI+WGFsYW4gU2FtcGxlczwvaDI+Ci08cD5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNhbXBsZXMgKHdoYXQgdGhleSBpbGx1c3RyYXRlIGFuZCBob3cgdG8gcnVuIHRoZW0pLCBzZWUgPGEgaHJlZj0iLi4vLi4vZG9jcy9zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+LjwvcD4KLQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvVXNlWE1MRmlsdGVycy5qYXZhIGIvc2FtcGxlcy9Vc2VYTUxGaWx0ZXJzL1VzZVhNTEZpbHRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlNzhmZC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvVXNlWE1MRmlsdGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0vLyBJbXBvcnRlZCBUcmFYIGNsYXNzZXMKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVGVtcGxhdGVzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5UZW1wbGF0ZXNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjsgICAgICAgICAgICAgIAotCi0vLyBJbXBvcnRlZCBTQVggY2xhc3NlcwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5QYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5QYXJzZXJBZGFwdGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MRmlsdGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotCi0vLyBJbXBvcnRlZCBET00gY2xhc3NlcwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIEltcG9ydGVkIFNlcmlhbGl6ZXIgY2xhc3NlcwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuT3V0cHV0UHJvcGVydGllczsKLQotLy8gSW1wb3J0ZWQgSkFWQSBBUEkgZm9yIFhNTCBQYXJzaW5nIGNsYXNzZXMKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOyAKLQotLy8gSW1wb3J0ZWQgamF2YS5pbyBjbGFzc2VzCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGNoYWluIGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9ucyBieQotICAgKiBwaXBpbmcgU0FYIGV2ZW50cyBmcm9tIG9uZSBUcmFuc2Zvcm1lciB0byBhbm90aGVyLiBFYWNoIFRyYW5zZm9ybWVyCi0gICAqIG9wZXJhdGVzIGFzIGEgU0FYMiBYTUxGaWx0ZXIvWE1MUmVhZGVyLgotICAgKi8KLXB1YmxpYyBjbGFzcyBVc2VYTUxGaWx0ZXJzCi17Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0JdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIAotICAgICAgICAgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgkgICAKLQl7Ci0gICAgLy8gSW5zdGFudGlhdGUgIGEgVHJhbnNmb3JtZXJGYWN0b3J5LgotICAJVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSBzdXBwb3J0cyBUaGUgdXNlIHVmIFNBWFNvdXJjZSAKLSAgICAvLyBhbmQgU0FYUmVzdWx0Ci0gICAgaWYgKHRGYWN0b3J5LmdldEZlYXR1cmUoU0FYU291cmNlLkZFQVRVUkUpICYmIHRGYWN0b3J5LmdldEZlYXR1cmUoU0FYUmVzdWx0LkZFQVRVUkUpKQotICAgIHsgCi0gICAgICAvLyBDYXN0IHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgdG8gU0FYVHJhbnNmb3JtZXJGYWN0b3J5LgotICAgICAgU0FYVHJhbnNmb3JtZXJGYWN0b3J5IHNheFRGYWN0b3J5ID0gKChTQVhUcmFuc2Zvcm1lckZhY3RvcnkpIHRGYWN0b3J5KTsKLSAgCSAgLy8gQ3JlYXRlIGFuIFhNTEZpbHRlciBmb3IgZWFjaCBzdHlsZXNoZWV0LgotICAgICAgWE1MRmlsdGVyIHhtbEZpbHRlcjEgPSBzYXhURmFjdG9yeS5uZXdYTUxGaWx0ZXIobmV3IFN0cmVhbVNvdXJjZSgiZm9vMS54c2wiKSk7Ci0gICAgICBYTUxGaWx0ZXIgeG1sRmlsdGVyMiA9IHNheFRGYWN0b3J5Lm5ld1hNTEZpbHRlcihuZXcgU3RyZWFtU291cmNlKCJmb28yLnhzbCIpKTsKLSAgICAgIFhNTEZpbHRlciB4bWxGaWx0ZXIzID0gc2F4VEZhY3RvcnkubmV3WE1MRmlsdGVyKG5ldyBTdHJlYW1Tb3VyY2UoImZvbzMueHNsIikpOwotICAgIAotICAgICAgLy8gQ3JlYXRlIGFuIFhNTFJlYWRlci4KLQkgICAgWE1MUmVhZGVyIHJlYWRlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7Ci0gICAgCi0gICAgICAvLyB4bWxGaWx0ZXIxIHVzZXMgdGhlIFhNTFJlYWRlciBhcyBpdHMgcmVhZGVyLgotICAgICAgeG1sRmlsdGVyMS5zZXRQYXJlbnQocmVhZGVyKTsKLSAgICAKLSAgICAgIC8vIHhtbEZpbHRlcjIgdXNlcyB4bWxGaWx0ZXIxIGFzIGl0cyByZWFkZXIuCi0gICAgICB4bWxGaWx0ZXIyLnNldFBhcmVudCh4bWxGaWx0ZXIxKTsKLSAgICAKLSAgICAgIC8vIHhtbEZpbHRlcjMgdXNlcyB4bWxGaWx0ZXIyIGFzIGl0cyByZWFkZXIuCi0gICAgICB4bWxGaWx0ZXIzLnNldFBhcmVudCh4bWxGaWx0ZXIyKTsKLSAgICAKLSAgICAgIC8vIHhtbEZpbHRlcjMgb3V0cHV0cyBTQVggZXZlbnRzIHRvIHRoZSBzZXJpYWxpemVyLgotICAgICAgU2VyaWFsaXplciBzZXJpYWxpemVyID0gU2VyaWFsaXplckZhY3RvcnkuZ2V0U2VyaWFsaXplcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT3V0cHV0UHJvcGVydGllcy5nZXREZWZhdWx0TWV0aG9kUHJvcGVydGllcygieG1sIikpOyAgICAgICAgCi0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFN0cmVhbShTeXN0ZW0ub3V0KTsKLSAgICAgIHhtbEZpbHRlcjMuc2V0Q29udGVudEhhbmRsZXIoc2VyaWFsaXplci5hc0NvbnRlbnRIYW5kbGVyKCkpOwotCi0gIAkgIC8vIFBlcmZvcm0gdGhlIHNlcmllcyBvZiB0cmFuc2Zvcm1hdGlvbnMgYXMgZm9sbG93czoKLQkgICAgLy8gICAtIHRyYW5zZm9ybWVyMyBnZXRzIGl0cyBwYXJlbnQgKHRyYW5zZm9ybWVyMikgYXMgdGhlIFhNTFJlYWRlci9YTUxGaWx0ZXIKLQkgICAgLy8gICAgIGFuZCBjYWxscyB0cmFuc2Zvcm1lcjIucGFyc2UobmV3IElucHV0U291cmNlKCJmb28ueG1sIikpLgotICAgICAgLy8gICAtIHRyYW5zZm9ybWVyMiBnZXRzIGl0cyBwYXJlbnQgKHRyYW5zZm9ybWVyMSkgYXMgdGhlIFhNTFJlYWRlci9YTUxGaWx0ZXIKLQkgICAgLy8gICAgIGFuZCBjYWxscyB0cmFuc2Zvcm1lcjEucGFyc2UobmV3IElucHV0U291cmNlKCJmb28ueG1sIikpLiAKLSAgICAgIC8vICAgLSB0cmFuc2Zvcm1lcjEgZ2V0cyBpdHMgcGFyZW50IChyZWFkZXIsIGEgU0FYUGFyc2VyKSBhcyB0aGUgWE1MUmVhZGVyIAotICAgICAgLy8gICAgIGFuZCBjYWxscyByZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKCJmb28ueG1sIikpLgotCSAgICAvLyAgIC0gcmVhZGVyIHBhcnNlcyB0aGUgWE1MIGRvY3VtZW50IGFuZCBzZW5kcyB0aGUgU0FYIHBhcnNlIGV2ZW50cyB0byB0cmFuc2Zvcm1lcjEsIAotCSAgICAvLyAgICAgd2hpY2ggcGVyZm9ybXMgdHJhbnNmb3JtYXRpb24gMSBhbmQgc2VuZHMgdGhlIG91dHB1dCB0byB0cmFuc2Zvcm1lcjIuCi0gIAkgIC8vICAgLSB0cmFuc2Zvcm1lcjIgcGFyc2VzIHRoZSB0cmFuc2Zvcm1hdGlvbiAxIG91dHB1dCwgcGVyZm9ybXMgdHJhbnNmb3JtYXRpb24gMiwgYW5kIAotCSAgICAvLyAgICAgc2VuZHMgdGhlIG91dHB1dCB0byB0cmFuc2Zvcm1lcjMuCi0JICAgIC8vICAgLSB0cmFuc2Zvcm1lcjMgcGFyc2VzIHRoZSB0cmFuc2Zvcm1hdGlvbiAyIG91dHB1dCwgcGVyZm9ybXMgdHJhbnNmb3JtYXRpb24gMywKLSAgCSAgLy8gICAgIGFuZCBzZW5kcyB0aGUgb3V0cHV0IHRvIHRoZSBzZXJpYWxpemVyLgotICAgICAgeG1sRmlsdGVyMy5wYXJzZShuZXcgSW5wdXRTb3VyY2UoImZvby54bWwiKSk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Vc2VYTUxGaWx0ZXJzL2Zvby54bWwgYi9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvZm9vLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE5Zjc5Yi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvZm9vLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08ZG9jPkhlbGxvPC9kb2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Vc2VYTUxGaWx0ZXJzL2ZvbzEueHNsIGIvc2FtcGxlcy9Vc2VYTUxGaWx0ZXJzL2ZvbzEueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGE4ZDVlLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvVXNlWE1MRmlsdGVycy9mb28xLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+IAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2MiPgotICAgIDxvdXQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L291dD4KLSAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Vc2VYTUxGaWx0ZXJzL2ZvbzIueHNsIGIvc2FtcGxlcy9Vc2VYTUxGaWx0ZXJzL2ZvbzIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2NkMTk3Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvVXNlWE1MRmlsdGVycy9mb28yLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+IAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJvdXQiPgotICAgIDxvdXQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4gLi4uZ29vZCB0byBzZWUgeW91IGFnYWluITwvb3V0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvZm9vMy54c2wgYi9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvZm9vMy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzY2ZhYTYuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Vc2VYTUxGaWx0ZXJzL2ZvbzMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im91dCI+Ci0gICAgPG91dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPiAuLi5hbmQgZ29vZGJ5ITwvb3V0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvcmVhZG1lLmh0bWwgYi9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvcmVhZG1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODkzNmYuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Vc2VYTUxGaWx0ZXJzL3JlYWRtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+WGFsYW4gU2FtcGxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMj5YYWxhbiBTYW1wbGVzPC9oMj4KLTxwPkZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2FtcGxlcyAod2hhdCB0aGV5IGlsbHVzdHJhdGUgYW5kIGhvdyB0byBydW4gdGhlbSksIHNlZSA8YSBocmVmPSIuLi8uLi9kb2NzL3NhbXBsZXMuaHRtbCI+U2FtcGxlczwvYT4uPC9wPgotCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy8xLXJlZGlyLnhtbCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy8xLXJlZGlyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5ZjA1YS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvMS1yZWRpci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08ZG9jPgotICA8Zm9vIGZpbGU9IjEtcmVkaXIub3V0Ij4KLSAgICBUZXN0aW5nIFJlZGlyZWN0IGV4dGVuc2lvbjoKLSAgICA8YmFyPkEgZm9vIHN1YmVsZW1lbnQgdGV4dCBub2RlPC9iYXI+Ci0gIDwvZm9vPgotICA8bWFpbj4KLSAgICBFdmVyeXRoaW5nIGVsc2UKLSAgPC9tYWluPiAgCi08L2RvYz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy8xLXJlZGlyLnhzbCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy8xLXJlZGlyLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlNjljMi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvMS1yZWRpci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKLSAgICB4bWxuczpyZWRpcmVjdD0ib3JnLmFwYWNoZS54YWxhbi5saWIuUmVkaXJlY3QiCi0gICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KLQotICA8bHhzbHQ6Y29tcG9uZW50IHByZWZpeD0icmVkaXJlY3QiIGVsZW1lbnRzPSJ3cml0ZSBvcGVuIGNsb3NlIiBmdW5jdGlvbnM9IiI+Ci0gICAgPGx4c2x0OnNjcmlwdCBsYW5nPSJqYXZhY2xhc3MiIHNyYz0ib3JnLmFwYWNoZS54YWxhbi5saWIuUmVkaXJlY3QiLz4KLSAgPC9seHNsdDpjb21wb25lbnQ+ICAKLSAgICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPHN0YW5kYXJkLW91dD4KLSAgICAgIFN0YW5kYXJkIG91dHB1dDoKLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3N0YW5kYXJkLW91dD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPCEtLSBub3QgcmVkaXJlY3RlZCAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jL21haW4iPgotICAgIDxtYWluPgotICAgIC0tIGxvb2sgaW4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9kb2MvZm9vL0BmaWxlIi8+IGZvciB0aGUgcmVkaXJlY3RlZCBvdXRwdXQgLS0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L21haW4+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPCEtLSByZWRpcmVjdGVkIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2MvZm9vIj4KLSAgICA8IS0tIGdldCByZWRpcmVjdCBmaWxlIG5hbWUgZnJvbSBYTUwgaW5wdXQgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIHNlbGVjdD0iQGZpbGUiPgotICAgICAgPGZvby1vdXQ+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgIDwvZm9vLW91dD4KLSAgICA8L3JlZGlyZWN0OndyaXRlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi08IS0tIHJlZGlyZWN0ZWQgKGZyb20gdGhlIHhzbDphcHBseS10ZW1wbGF0ZXMgYWJvdmUuIEkuZS4sIGJhciBpcyBpbiAvZG9jL2ZvbyAtLT4gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJiYXIiPgotICAgIDxmb29iYXItb3V0PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwvZm9vYmFyLW91dD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy8yLWJhc2ljSnNjcmlwdC54bWwgYi9zYW1wbGVzL2V4dGVuc2lvbnMvMi1iYXNpY0pzY3JpcHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzY2Y2ExLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy8yLWJhc2ljSnNjcmlwdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGRvYz4KLSAgPGRlYWRsaW5lIG51bWRheXM9IjIiLz4KLTwvZG9jPiAgCi0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zLzItYmFzaWNKc2NyaXB0LnhzbCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy8yLWJhc2ljSnNjcmlwdC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMTljZjcuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zLzItYmFzaWNKc2NyaXB0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLU5hbWVzcGFjZXMgYXJlIGdsb2JhbCBpZiB5b3Ugc2V0IHRoZW0gaW4gdGhlIHN0eWxlc2hlZXQgZWxlbWVudC0tPgotPHhzbDpzdHlsZXNoZWV0IAotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiAKLSAgICB2ZXJzaW9uPSIxLjAiICAgCi0gICAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICAgIHhtbG5zOm15LWV4dD0iZXh0MiIKLSAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0ibXktZXh0Ij4KLSAgICAKLSAgPCEtLVRoZSBjb21wb25lbnQgYW5kIGl0cyBzY3JpcHQgYXJlIGluIHRoZSBseHNsdCBuYW1lc3BhY2UgYW5kIGRlZmluZSB0aGUgaW1wbGVtZW50YXRpb24tLT4KLSAgPGx4c2x0OmNvbXBvbmVudCBwcmVmaXg9Im15LWV4dCIgZWxlbWVudHM9InRpbWVsYXBzZSIgZnVuY3Rpb25zPSJnZXRkYXRlIj4KLSAgICA8bHhzbHQ6c2NyaXB0IGxhbmc9ImphdmFzY3JpcHQiPgotICAgICAgdmFyIG11bHRpcGxpZXI9MTsKLSAgICAgIC8vIEV4dGVuc2lvbiBlbGVtZW50IGltcGxlbWVudGF0aW9ucyBhbHdheXMgdGFrZSB0d28gYXJndW1lbnRzLiBUaGUgZmlyc3QKLSAgICAgIC8vIGFyZ3VtZW50IGlzIHRoZSBYU0wgUHJvY2Vzc29yIGNvbnRleHQ7IHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIGVsZW1lbnQuCi0gICAgICBmdW5jdGlvbiB0aW1lbGFwc2UoeHNsUHJvY2Vzc29yQ29udGV4dCwgZWxlbSkKLSAgICAgIHsKLSAgICAgICAgbXVsdGlwbGllcj1wYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZSgibXVsdGlwbGllciIpKTsKLSAgICAgICAgLy8gVGhlIGVsZW1lbnQgcmV0dXJuIHZhbHVlIGlzIHBsYWNlZCBpbiB0aGUgcmVzdWx0IHRyZWUuCi0gICAgICAgIC8vIElmIHlvdSBkbyBub3Qgd2FudCBhIHJldHVybiB2YWx1ZSwgcmV0dXJuIG51bGwuCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICAgZnVuY3Rpb24gZ2V0ZGF0ZShudW1kYXlzKQotICAgICAgewotICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKCk7Ci0gICAgICAgIGQuc2V0RGF0ZShkLmdldERhdGUoKSArIHBhcnNlSW50KG51bWRheXMqbXVsdGlwbGllcikpOwotICAgICAgICByZXR1cm4gZC50b0xvY2FsZVN0cmluZygpOwotICAgICAgfQotICAgIDwvbHhzbHQ6c2NyaXB0PgotICA8L2x4c2x0OmNvbXBvbmVudD4KLSAgICAgIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkZWFkbGluZSI+Ci0gICAgPHA+PG15LWV4dDp0aW1lbGFwc2UgbXVsdGlwbGllcj0iMiIvPldlIGhhdmUgcmVjZWl2ZWQgeW91ciBlbnF1aXJ5IGFuZCB3aWxsIAotICAgICAgcmVzcG9uZCBieSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibXktZXh0OmdldGRhdGUoc3RyaW5nKEBudW1kYXlzKSkiLz48L3A+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy8zLWphdmEtbmFtZXNwYWNlLnhtbCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy8zLWphdmEtbmFtZXNwYWNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyZWI0NC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvMy1qYXZhLW5hbWVzcGFjZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTxkb2M+Ci0gICA8ZGF0ZQotICAgIHllYXI9IjIwMDEiIG1vbnRoPSI1IiBkYXk9IjI3IgotICAgIGZvcm1hdD0iRUVFRSwgTU1NIGRkLCB5eXl5Ii8+Ci08L2RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvMy1qYXZhLW5hbWVzcGFjZS54c2wgYi9zYW1wbGVzL2V4dGVuc2lvbnMvMy1qYXZhLW5hbWVzcGFjZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YjZlNTkuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zLzMtamF2YS1uYW1lc3BhY2UueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+IAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIj4KLSAgICAgICAgICAgICAgICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIvZG9jL2RhdGUiLz4gCi0gIDwveHNsOnRlbXBsYXRlPgotIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYXRlIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InllYXIiIHNlbGVjdD0ic3RyaW5nKEB5ZWFyKSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibW9udGgiIHNlbGVjdD0ic3RyaW5nKEBtb250aCkiLz4gCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJkYXkiIHNlbGVjdD0ic3RyaW5nKEBkYXkpIi8+ICAgICAgICAgIAotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZm9ybWF0IiBzZWxlY3Q9InN0cmluZyhAZm9ybWF0KSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZm9ybWF0dGVyIiAgICAgICAKLSAgICAgICAgIHNlbGVjdD0iamF2YTpqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdC5uZXcoJGZvcm1hdCkiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImRhdGUiIAotICAgICAgICAgc2VsZWN0PSJqYXZhOkludERhdGUuZ2V0RGF0ZSgkeWVhciwkbW9udGgsJGRheSkiLz4KLSAgICA8cD5EYXRlOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iamF2YTpmb3JtYXQoJGZvcm1hdHRlciwgJGRhdGUpIi8+PC9wPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvNC1udW1saXN0SmF2YS54c2wgYi9zYW1wbGVzL2V4dGVuc2lvbnMvNC1udW1saXN0SmF2YS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZjk5MjQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zLzQtbnVtbGlzdEphdmEueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+IAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKLSAgICAgICAgICAgICAgICB4bWxuczpjb3VudGVyPSJNeUNvdW50ZXIiCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9ImNvdW50ZXIiCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIj4KLQotCi0gIDxseHNsdDpjb21wb25lbnQgcHJlZml4PSJjb3VudGVyIgotICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzPSJpbml0IGluY3IiIGZ1bmN0aW9ucz0icmVhZCI+Ci0gICAgPGx4c2x0OnNjcmlwdCBsYW5nPSJqYXZhY2xhc3MiIHNyYz0iTXlDb3VudGVyIi8+Ci0gIDwvbHhzbHQ6Y29tcG9uZW50PgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDxIVE1MPgotICAgICAgPEgxPkphdmEgRXhhbXBsZTwvSDE+Ci0gICAgICA8Y291bnRlcjppbml0IG5hbWU9ImluZGV4IiB2YWx1ZT0iMSIvPgotICAgICAgPHA+SGVyZSBhcmUgdGhlIG5hbWVzIGluIGFscGhhYmV0aWNhbCBvcmRlciBieSBsYXN0IG5hbWU6PC9wPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImRvYy9uYW1lIj4KLSAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQGxhc3QiLz4KLSAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQGZpcnN0Ii8+Ci0gICAgICAgIDxwPgotICAgICAgICA8eHNsOnRleHQ+WzwveHNsOnRleHQ+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudGVyOnJlYWQoJ2luZGV4JykiLz4KLSAgICAgICAgPHhzbDp0ZXh0Pl0uIDwveHNsOnRleHQ+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFzdCIvPgotICAgICAgICA8eHNsOnRleHQ+LCA8L3hzbDp0ZXh0PgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGZpcnN0Ii8+Ci0gICAgICAgIDwvcD4KLSAgICAgICAgPGNvdW50ZXI6aW5jciBuYW1lPSJpbmRleCIvPgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPC9IVE1MPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvNS1udW1saXN0SnNjcmlwdC54c2wgYi9zYW1wbGVzL2V4dGVuc2lvbnMvNS1udW1saXN0SnNjcmlwdC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMzUxY2IuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zLzUtbnVtbGlzdEpzY3JpcHQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+IAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKLSAgICAgICAgICAgICAgICB4bWxuczpjb3VudGVyPSJNeUNvdW50ZXIiCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9ImNvdW50ZXIiCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIj4KLQotICA8bHhzbHQ6Y29tcG9uZW50IHByZWZpeD0iY291bnRlciIKLSAgICAgICAgICAgICAgICAgICBlbGVtZW50cz0iaW5pdCBpbmNyIiBmdW5jdGlvbnM9InJlYWQiPgotICAgIDxseHNsdDpzY3JpcHQgbGFuZz0iamF2YXNjcmlwdCI+Ci0gICAgICB2YXIgY291bnRlcnMgPSBuZXcgQXJyYXkoKTsKLQotICAgICAgZnVuY3Rpb24gaW5pdCAoeHNscHJvYywgZWxlbSkgewotICAgICAgICBuYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUgKCJuYW1lIik7Ci0gICAgICAgIHZhbHVlID0gcGFyc2VJbnQoZWxlbS5nZXRBdHRyaWJ1dGUgKCJ2YWx1ZSIpKTsKLSAgICAgICAgY291bnRlcnNbbmFtZV0gPSB2YWx1ZTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIGZ1bmN0aW9uIHJlYWQgKG5hbWUpIHsKLSAgICAgICAgcmV0dXJuICIiICsgKGNvdW50ZXJzW25hbWVdKTsKLSAgICAgIH0KLQotICAgICAgZnVuY3Rpb24gaW5jciAoeHNscHJvYywgZWxlbSkKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlICgibmFtZSIpOwotICAgICAgICBjb3VudGVyc1tuYW1lXSsrOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICA8L2x4c2x0OnNjcmlwdD4KLSAgPC9seHNsdDpjb21wb25lbnQ+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPEhUTUw+Ci0gICAgICA8SDE+SmF2YVNjcmlwdCBFeGFtcGxlLjwvSDE+Ci0gICAgICA8Y291bnRlcjppbml0IG5hbWU9ImluZGV4IiB2YWx1ZT0iMSIvPgotICAgICAgPHA+SGVyZSBhcmUgdGhlIG5hbWVzIGluIGFscGhhYmV0aWNhbCBvcmRlciBieSBsYXN0IG5hbWU6PC9wPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImRvYy9uYW1lIj4KLSAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQGxhc3QiLz4KLSAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQGZpcnN0Ii8+Ci0gICAgICAgIDxwPgotICAgICAgICA8eHNsOnRleHQ+WzwveHNsOnRleHQ+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudGVyOnJlYWQoJ2luZGV4JykiLz4KLSAgICAgICAgPHhzbDp0ZXh0Pl0uIDwveHNsOnRleHQ+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFzdCIvPgotICAgICAgICA8eHNsOnRleHQ+LCA8L3hzbDp0ZXh0PgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGZpcnN0Ii8+Ci0gICAgICAgIDwvcD4KLSAgICAgICAgPGNvdW50ZXI6aW5jciBuYW1lPSJpbmRleCIvPgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPC9IVE1MPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvNi1zcWxsaWItaW5zdGFudGRiLnhzbCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy82LXNxbGxpYi1pbnN0YW50ZGIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTUzNTlkLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy82LXNxbGxpYi1pbnN0YW50ZGIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgICAgIHhtbG5zOnNxbD0ib3JnLmFwYWNoZS54YWxhbi5saWIuc3FsLlhDb25uZWN0aW9uIgotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJzcWwiPgotICA8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icXVlcnkiIHNlbGVjdD0iJ1NFTEVDVCAqIEZST00gaW1wb3J0MSciLz4KLSAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPCEtLSAxLiBNYWtlIHRoZSBjb25uZWN0aW9uIC0tPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvZHVjdHMiCi0gICAgICAgICAgICAgICAgICBzZWxlY3Q9InNxbDpuZXcoJ29yZy5lbmh5ZHJhLmluc3RhbnRkYi5qZGJjLmlkYkRyaXZlcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqZGJjOmlkYjouL2luc3RhbnRkYi9zYW1wbGUucHJwJykiLz4KLSAgICA8SFRNTD4KLSAgICAgIDxIRUFEPgotICAgICAgPC9IRUFEPgotICAgICAgPEJPRFk+Ci0gICAgICAgIDxUQUJMRSBib3JkZXI9IjEiPgotICAgICAgICA8IS0tMi4gRXhlY3V0ZSB0aGUgcXVlcnkgLS0+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGFibGUiIHNlbGVjdD0nc3FsOnF1ZXJ5KCRwcm9kdWN0cywgJHF1ZXJ5KScvPgotICAgICAgICAgIDxUUj4KLSAgICAgICAgICA8IS0tIEdldCBjb2x1bW4tbGFiZWwgYXR0cmlidXRlIGZyb20gZWFjaCBjb2x1bW4taGVhZGVyLS0+Ci0gICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0YWJsZS9yb3ctc2V0L2NvbHVtbi1oZWFkZXIiPgotICAgICAgICAgICAgPFRIPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29sdW1uLWxhYmVsIi8+PC9USD4KLSAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICA8L1RSPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJHRhYmxlL3Jvdy1zZXQvcm93Ii8+Ci0gICAgICAgICAgPHhzbDp0ZXh0PiYjMTA7PC94c2w6dGV4dD4KLSAgICAgICAgPC9UQUJMRT4KLSAgICAgIDwvQk9EWT4KLSAgICA8L0hUTUw+IAotICAgIDwhLS0gMy4gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gLS0+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InNxbDpjbG9zZSgkcHJvZHVjdHMpIi8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InJvdyI+Ci0gICAgICAgIDxUUj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNvbCIvPgotICAgICAgICA8L1RSPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb2wiPgotICAgIDxURD4KLSAgICAgIDwhLS0gSGVyZSBpcyB0aGUgY29sdW1uIGRhdGEgLS0+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+Ci0gICAgPC9URD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zL0ludERhdGUuamF2YSBiL3NhbXBsZXMvZXh0ZW5zaW9ucy9JbnREYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOWM2YzMuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zL0ludERhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotcHVibGljIGNsYXNzIEludERhdGUKLXsKLSAgcHVibGljIHN0YXRpYyBEYXRlIGdldERhdGUoU3RyaW5nIHllYXIsIFN0cmluZyBtb250aCwgU3RyaW5nIGRheSkKLSAgICB7Ci0gICAgICAvLyBEYXRlKGludCwgaW50LCBpbnQpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHNvIHVzZSBDYWxlbmRhciB0bwotICAgICAgLy8gc2V0IHRoZSB5ZWFyLCBtb250aCwgYW5kIGRheS4KLSAgICAgIENhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgICAgLy8gQ29udmVydCBlYWNoIGFyZ3VtZW50IHRvIGludC4KLSAgICAgIGMuc2V0KEludGVnZXIucGFyc2VJbnQoeWVhciksSW50ZWdlci5wYXJzZUludChtb250aCksSW50ZWdlci5wYXJzZUludChkYXkpKTsKLSAgICAgIHJldHVybiBjLmdldFRpbWUoKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9NeUNvdW50ZXIuamF2YSBiL3NhbXBsZXMvZXh0ZW5zaW9ucy9NeUNvdW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1ZjU0YS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvTXlDb3VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgTXlDb3VudGVyIHsKLSAgc3RhdGljIEhhc2h0YWJsZSBjb3VudGVycyA9IG5ldyBIYXNodGFibGUgKCk7Ci0KLQotICBwdWJsaWMgdm9pZCBpbml0KG9yZy5hcGFjaGUueGFsYW4uZXh0ZW5zaW9ucy5YU0xQcm9jZXNzb3JDb250ZXh0IGNvbnRleHQsIAotICAgICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgZWxlbSkgCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0gICAgU3RyaW5nIHZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7Ci0gICAgaW50IHZhbDsKLSAgICB0cnkgCi0gICAgewotICAgICAgdmFsID0gSW50ZWdlci5wYXJzZUludCAodmFsdWUpOwotICAgIH0gCi0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSAKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSAoKTsKLSAgICAgIHZhbCA9IDA7Ci0gICAgfQotICAgIGNvdW50ZXJzLnB1dCAobmFtZSwgbmV3IEludGVnZXIgKHZhbCkpOwotICB9Ci0KLSAgcHVibGljIGludCByZWFkKFN0cmluZyBuYW1lKSAKLSAgeyAKLSAgICBJbnRlZ2VyIGN2YWwgPSAoSW50ZWdlciljb3VudGVycy5nZXQobmFtZSk7Ci0gICAgcmV0dXJuIChjdmFsID09IG51bGwpID8gMCA6IGN2YWwuaW50VmFsdWUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluY3Iob3JnLmFwYWNoZS54YWxhbi5leHRlbnNpb25zLlhTTFByb2Nlc3NvckNvbnRleHQgY29udGV4dCwgIAotICAgICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgZWxlbSkgewotICAgIFN0cmluZyBuYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLSAgICBJbnRlZ2VyIGN2YWwgPSAoSW50ZWdlcikgY291bnRlcnMuZ2V0KG5hbWUpOwotICAgIGludCBudmFsID0gKGN2YWwgPT0gbnVsbCkgPyAwIDogKGN2YWwuaW50VmFsdWUgKCkgKyAxKTsKLSAgICBjb3VudGVycy5wdXQgKG5hbWUsIG5ldyBJbnRlZ2VyIChudmFsKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL2lkYi5qYXIgYi9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL2lkYi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MDE4MzMuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi9pZGIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi9zYW1wbGUucHJwIGIvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi9zYW1wbGUucHJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDViMjQ2Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvc2FtcGxlLnBycAorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0hLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0hCi0hIEJBU0lDIFBST1BFUlRJRVMKLSEKLSEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIQotISBQYXRoIHdoZXJlIGluZGV4IHRhYmxlcyBhcmUgaGVsZC4gQ2FuIGJlIGFic29sdXRlIG9yIHJlbGF0aXZlIAotISB0byB0aGUgcHJvcGVydGllcyBmaWxlLiBEZWZhdWx0cyB0byB0YWJsZVBhdGguCi0hCi0haW5kZXhQYXRoPS4vaW5kZXhlcwotIQotISBQYXRoIHdoZXJlIHN5c3RlbSB0YWJsZXMgYXJlIGhlbGQuIENhbiBiZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSB0byAKLSEgdGhlIHByb3BlcnRpZXMgZmlsZS4gRGVmYXVsdHMgdG8gdGFibGVQYXRoLgotIQotIXN5c3RlbVBhdGg9Li9zeXN0ZW0KLSEKLSEgUGF0aCB3aGVyZSBkYXRhYmFzZSB0YWJsZXMgYXJlIGhlbGQuIENhbiBiZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSAKLSEgdG8gdGhlIHByb3BlcnRpZXMgZmlsZS4gRGVmYXVsdHMgdG8gImN1cnJlbnQiIGRpcmVjdG9yeS4KLSEKLXRhYmxlUGF0aD0uL3RhYmxlcwotIQotISBQYXRoIHdoZXJlIHJlc3VsdHMgc2V0IHRhYmxlcyBhcmUgaGVsZC4gQ2FuIGJlIGFic29sdXRlIG9yIHJlbGF0aXZlIAotISB0byB0aGUgcHJvcGVydGllcyBmaWxlLiBEZWZhdWx0cyB0byB0YWJsZVBhdGguCi0hCi0hdG1wUGF0aD0uL3RtcAotIQotISBOb24temVybyBtZWFucyBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHByb3BlcnRpZXMgZmlsZS4gCi0hIERlZmF1bHQgaXMgYWJzb2x1dGUgcGF0aHMgZm9yIGZpbGVzLgotIQotcmVsYXRpdmVUb1Byb3BlcnRpZXM9MQotIQotISBBbHRlcm5hdGl2ZSBwYXJ0aXRpb25zIGNhbiBiZSBkZWZpbmVkIHNvIHRoYXQgdGFibGVzIGNhbiBiZSBwbGFjZWQKLSEgaW4gbXVsdGlwbGUgbG9jYXRpb25zLiBFYWNoIHBhcnRpdGlvbiBpcyBudW1iZXJlZDogMSwgMiwgMywuLi4gVGFibGVzCi0hIGNhbiBiZSBjcmVhdGVkIG9uIHBhcnRpdGlvbnMgdXNpbmcgdGhlIHN5bnRheCAKLSEKLSEgICBDUkVBVEUgVEFCTEUgPG5hbWU+IE9OIFBBUlRJVElPTiA8bnVtYmVyPi4uLgotIQotISBUaGUgcGFydGl0aW9uIGNvdW50IGhhcyB0byBiZSBzdXBwbGllZC4KLSEKLSFwYXJ0aXRpb25Db3VudD0yCi0hCi0hIFRoZSBsb2NhdGlvbnMgb2YgZWFjaCBwYXJ0aXRpb24gbXVzdCBiZSBzdXBwbGllZC4gVGhlc2UgYXJlIGFsd2F5cwotISBhYnNvbHV0ZSBwYXRoIG5hbWVzLgotIQotIXBhcnRpdGlvbjE9ZDovcGV0ZXMKLSFwYXJ0aXRpb24yPWM6L3RlbXAKLQotCi0hLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0hCi0hIFRVTklORyBQUk9QRVJUSUVTCi0hCi0hLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSEKLSEgVGhlIGFtb3VudCBvZiBlYWNoIGNvbHVtbiB0byBjYWNoZSwgZXhwcmVzc2VkIGVpdGhlciBhcyBhbiBhYnNvbHV0ZSAKLSEgbnVtYmVyIG9mIHJvd3Mgb3IgYXMgYSBwZXJjZW50YWdlIGZpZ3VyZS4gRGVmYXVsdHMgdG8gMjU2IG9yIDEwIHJlc3BlY3RpdmVseS4KLSEKLSEgVGhpcyB2YWx1ZSBhcHBsaWVzIG9ubHkgd2hlbiB0YWJsZXMgYXJlIGZpcnN0IGNyZWF0ZWQuIEl0IGhhcyBubyBlZmZlY3QKLSEgd2hlbiBhIHRhYmxlIGlzIGJlaW5nIHJlLW9wZW5lZC4KLSEKLWNhY2hlQW1vdW50PTUxMgotIQotISBDQUNIRV9ST1dTIE11c3QgYmUgb25lIG9mIENBQ0hFX1JPV1Mgb3IgQ0FDSEVfUEVSQ0VOVC4gRGV0ZXJtaW5lcyB3aGV0aGVyIAotISB0byBjYWNoZSBjb2x1bW5zIGluIHRhYmxlcyBiYXNlZCBvbiBhbiBhYnNvbHV0ZSBudW1iZXIgb2Ygcm93cywgb3IgdGhlIAotISBwZXJjZW50YWdlIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZS4gCi0hCi0hIFRoaXMgdmFsdWUgYXBwbGllcyBvbmx5IHdoZW4gdGFibGVzIGFyZSBmaXJzdCBjcmVhdGVkLiBJdCBoYXMgbm8gZWZmZWN0Ci0hIHdoZW4gYSB0YWJsZSBpcyBiZWluZyByZS1vcGVuZWQuCi0hCi1jYWNoZUNvbmRpdGlvbj1DQUNIRV9ST1dTCi0hCi0hIFRoZSBhbW91bnQgb2YgdGhlIHN5c3RlbSB0YWJsZXMgdG8gYmUgY2FjaGVkLiBEZWZhdWx0cyB0byAxMDAuCi0hCi0hIFRoaXMgdmFsdWUgYXBwbGllcyBvbmx5IHdoZW4gdGFibGVzIGFyZSBmaXJzdCBjcmVhdGVkLiBJdCBoYXMgbm8gZWZmZWN0Ci0hIHdoZW4gYSB0YWJsZSBpcyBiZWluZyByZS1vcGVuZWQuCi0hCi0hc3lzdGVtQ2FjaGVTaXplPTEwCi0hCi0hIFNpbWlsYXIgdG8gY2FjaGVDb25kaXRpb24sIGJ1dCBhcHBsaWVzIG9ubHkgdG8gdGhlIHN5c3RlbSB0YWJsZXMuCi0hCi0hIFRoaXMgdmFsdWUgYXBwbGllcyBvbmx5IHdoZW4gdGFibGVzIGFyZSBmaXJzdCBjcmVhdGVkLiBJdCBoYXMgbm8gZWZmZWN0Ci0hIHdoZW4gYSB0YWJsZSBpcyBiZWluZyByZS1vcGVuZWQuCi0hCi0hc3lzdGVtQ2FjaGVDb25kaXRpb249Q0FDSEVfUk9XUwotIQotISBUaGUgcGVyY2VudGFnZSBjYWNoZSBoaXQgaW1wcm92ZW1lbnQgcmVxdWlyZWQgaW4gb3JkZXIgdG8gbW92ZSB0aGUgCi0hIGNhY2hlIHRvIGEgbmV3IGxvY2F0aW9uIGluIGEgY29sdW1uLiAKLSEKLSEgKEN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQpLgotIQotY2FjaGVSZXNldFBlcmNlbnQ9MTAKLSEKLSEgTm9uLXplcm8gbWVhbnMgdGhhdCBkYXRhYmFzZSBjaGFuZ2VzIGRvIG5vdCBnZXQgd3JpdHRlbiB0byB0aGUgCi0hIGRhdGFiYXNlIGltbWVkaWF0ZWx5LiBTZWUgdHVuaW5nLmh0bWwuIAotIQotZmFzdFVwZGF0ZT0wCi0hCi0hIFBlcmNlbnRhZ2Ugb2YgZnJlZSBzcGFjZSBpbiBhbiBpbmRleCB0aGF0IG11c3QgYmUgcHJlc2VudCBiZWZvcmUgCi0hIHRoZSBpbmRleCByZW9yZ2FuaXNlcyBpdHNlbGYuIEhpZ2ggdmFsdWVzIG1lYW5zIGZyZXF1ZW50IGluZGV4Ci0hIHJlb3JnYW5pc2F0aW9uLiBMb3cgdmFsdWVzIG1lYW5zIHNsb3cgaW5kZXggaW5zZXJ0cy4KLSEKLWluZGV4TG9hZD01Ci0hCi0hIFRoZSBudW1iZXIgb2YgY2FjaGUgbWlzc2VzIHRvIGluY2x1ZGUgaW4gY2FsY3VsYXRpb25zIG9mIHRoZSBuZXh0IAotISBiYXNlIGZvciB0aGUgY2FjaGUuIAotIQotISAoQ3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCkuCi0hCi1taXNzZXNJbkNhY2hlU3RhdHM9MTAwCi0hCi0hIE5vbi16ZXJvIG1lYW5zIHRoYXQgcmVzdWx0cyBzZXRzIGdldCBpbnN0YW50aWF0ZWQgb24gZGlzay4gQnkgZGVmYXVsdAotISBJbnN0YW50REIgaG9sZHMgcmVzdWx0cyBzZXRzIGVtdGlyZWx5IGluIG1lbW9yeSAoYXBhcnQgZnJvbSBCaW5hcnkKLSEgY29sdW1ucykuIEZvciBsYXJnZSByZXN1bHRzIHNldHMgdGhpcyBjYW4gYmUgYSBwcm9ibGVtLiBUaGlzIHByb3BlcnR5Ci0hIGZvcmNlcyBhbGwgcmVzdWx0cyBzZXRzIHRvIGJlIGhlbGQgb24gZGlzay4KLSEKLXJlc3VsdHNPbkRpc2s9MAotIQotISBTaW1pbGFyIHRvIGNhY2hlQ29uZGl0aW9uIGJ1dCBhcHBsaWVzIG9ubHkgdG8gZGlzayBiYXNlZAotISByZXN1bHRzIHNldHMuIERlZmF1bHQgaXMgQ0FDSEVfUk9XUy4KLSEKLXJlc3VsdHNTZXRDYWNoZT1DQUNIRV9ST1dTCi0hCi0hIFNpbWlsYXIgdG8gY2FjaGVBbW91bnQgYnV0IGFwcGxpZXMgb25seSB0byBkaXNrIGJhc2VkCi0hIHJlc3VsdHMgc2V0cy4gRGVmYXVsdCBpcyAxMDAuCi0hCi1yZXN1bHRzU2V0Q2FjaGVBbW91bnQ9MTAwCi0hCi0hIE51bWJlciBvZiByb3dzIHRvIHJlYWQgaW50byB0aGUgZGlzayByZWFkIGFoZWFkIGJ1ZmZlci4gCi0hIFJlY29tbWVuZGVkIHRvIGJlIHNldCBzb21ld2hlcmUgYXJvdW5kIDEyOCB0byAyNTYuIAotISBEZWZhdWx0IGlzIDIwLgotIQotcm93Q2FjaGVTaXplPTEyOAotIQotISBUaGUgcmVhZCBhaGVhZCBidWZmZXIgaXMgZWZmZWN0aXZlIGF0IHNwZWVkaW5nIHVwIGZ1bGwKLSEgdGFibGUgc2NhbnMuIEhvd2V2ZXIgZm9yIGluZGV4ZWQgbG9va3VwcyBvciBtdWx0aXBsZQotISBzaW11bHRhbmVvdXMgc2NhbnMgaXQgaXMgYmV0dGVyIHRvIHJlYWQgYSBzaW5nbGUgcm93IGF0Ci0hIGEgdGltZS4gRWFjaCB0YWJsZSBob2xkcyBhIHNtYWxsIG51bWJlciBvZiBzaW5nbGUgcm93Ci0hIGJ1ZmZlcnMgdG8gaW1wcm92ZSBzdWNoIG9wZXJhdGlvbnMuIERlZmF1bHQgaXMgOC4KLSEKLSFzaW5nbGVSb3dDb3VudD00Ci0hCi0hIFNvbWV0aW1lcyB0aGUgbG9vayBhaGVhZCBidWZmZXIgY2FuIGJlIGhlbGQgYnkgYSBzaW5nbGUKLSEgdGhyZWFkIGV2ZW4gdGhvdWdoIGl0IGlzIG5vdCByZXRyaWV2ZWluZyBtYW55IHZhbHVlcyBmcm9tIGl0LgotISBJZiB0b28gbWFueSBsb29rdXBzIHJldHJpZXZlIGRhdGEgZnJvbSB0aGUgc2luZ2xlIHJvdwotISBidWZmZXJzIHRoZW4gaXQgaXMgYmV0dGVyIHRvIGZsdXNoIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciBhbmQKLSEgbWFrZSBpdCBhdmFpbGFibGUgZm9yIHJlLXVzZS4gRGVmYXVsdCBpcyAxMjguCi0hCi0hZmx1c2hBZnRlckNhY2hlTWlzc2VzPTY0Ci0hCi0hIE51bWJlciBvZiByb3dzIHRvIHJlYWQgYWhlYWQgZm9yIHN5c3RlbSB0YWJsZXMuIEJ5IGRlZmF1bHQKLSEgc3lzdGVtIHRhYmxlcyBjYWNoZSBldmVyeXRoaW5nLCBzbyBpdCBpcyB3YXN0ZWZ1bCB0byBoYXZlIGxhcmdlCi0hIHJlYWQgYWhlYWQgYnVmZmVycyBzaW5jZSB0aGV5IHdpbGwgdmVyeSByYXJlbHkgYmUgdXNlZC4gVGhpcwotISBhbGxvd3MgdGhlIHNpemUgb2YgdGhlIHN5c3RlbSByZWFkIGFoZWFkIGJ1ZmZlcnMgdG8gYmUgcmVkdWNlZAotISBpZiBuZWNlc3NhcnkuIERlZmF1bHRzIHRvIHJvd0NhY2hlU2l6ZS4KLSEKLSFzeXN0ZW1Sb3dzPTIwCi0hCi0hIFRoZSBjb250cm9sIGNvbHVtbiBpbiBhbGwgdGFibGVzIG5vcm1hbGx5IGhhcyBhIGxhcmdlIGNhY2hlCi0hIHNpbmNlIHRoaXMgc3BlZWRzIHVwIGFsbCBvcGVyYXRpb24gb24gdGhhdCB0YWJsZS4gVGhpcyBjYW4gYmUKLSEgdmFyaWVkIHRvIGVpdGhlciBpbXByb3ZlIHBlcmZvcm1hbmNlIG9yIHRvIHJlZHVjZSBzcGFjZS4KLSEgZGVmYXVsdCBpcyA4MTkyLgotIQotISBUaGlzIHZhbHVlIGFwcGxpZXMgb25seSB3aGVuIHRhYmxlcyBhcmUgZmlyc3QgY3JlYXRlZC4gSXQgaGFzIG5vIGVmZmVjdAotISB3aGVuIGEgdGFibGUgaXMgYmVpbmcgcmUtb3BlbmVkLgotIQotIWNvbnRyb2xDb2xDYWNoZVNpemU9NTEyCi0hCi0hIEJ5IGRlZmF1bHQsIEluc3RhbnREQiBvbmx5IGRvZXMgYSBjdXJzb3J5IHNlYXJjaCBmb3IgZGVsZXRlZCByb3dzIGR1cmluZyAKLSEgVVBEQVRFIHN0YXRlbWVudHMuIFNldHRpbmcgc2VhcmNoRGVsZXRlcz0xIGNhdXNlcyBtb3JlIGRldGFpbGVkIHNlYXJjaGVzIAotISBmb3IgZGVsZXRlZCByb3dzLiBUaGlzIHNsb3dzIGRvd24gVVBEQVRFIGV4ZWN1dGlvbnMsIGJ1dCByZXVsdHMgaW4gbW9yZSAKLSEgY29tcGFjdCB0YWJsZXMuICBEZWZhdWx0IGlzIDAuCi0hCi1zZWFyY2hEZWxldGVzPTAKLSEKLSEgVGhlIGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMsIGJldHdlZW4gY2hlY2tzIGZvciBzdGF0ZW1lbnQgZXhlY3V0aW9uCi0hIHRpbWVvdXRzLiBEZWZhdWx0IGlzIDUwMDAuCi0hCi0hdGltZXJDaGVjaz01MDAwCi0KLSEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSEKLSEgTE9HR0lORyBBTkQgREVCVUdHSU5HIFBST1BFUlRJRVMKLSEKLSEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIQotISBOb24temVybyBtZWFucyBpbmNsdWRlIFNRTCBzdGF0ZW1lbnRzIGluIHRoZSBleHBvcnQgZmlsZS4gCi0hCi1leHBvcnRTUUw9MAotIQotISBOb24temVybyBtZWFucyB0cmFjZSBvdXRwdXQgYWxzbyBkaXJlY3RlZCB0byBjb25zb2xlLiAKLSEgRGVmYXVsdHMgdG8gMC4KLSEKLXRyYWNlQ29uc29sZT0xCi0hCi0hIFJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggd2hlcmUgZXhwb3J0aW5nIGFuZCB0cmFjaW5nIGdvZXMuCi0hCi10cmFjZUZpbGU9Li90cmFjZS5sb2cKLSEKLSEgQml0bWFwIG9mIHZhcmlvdXMgaXRlbXMgdGhhdCBjYW4gYmUgdHJhY2VkLiBTZWUgZGVidWcuaHRtbC4gCi0hIERlZmF1bHRzIHRvIDAuCi0hCi10cmFjZUxldmVsPTIKLQotIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIQotISBUUkFOU0FDVElPTiBBTkQgUkVDT1ZFUlkgUFJPUEVSVElFUwotIQotIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0hCi0hIDAgbWVhbnMgZG8gbm90IHBlcmZvcm0gcmVjb3Zlcnkgb24gc3RhcnR1cC4KLSEgMSBtZWFucyBwZXJmb3JtIGF1dG9tYXRpYyByZWNvdmVyeQotISAyIChkZWZhdWx0KSBtZWFucyBwcm9tcHQgdGhlIHVzZXIgdXNpbmcgc3RhbmRhcmQgaW4gCi0hCi1yZWNvdmVyeVBvbGljeT0yCi0hCi0hIFNldHMgdGhlIGxldmVsIG9mIHRyYW5zYWN0aW9uIGpvdXJuYWxsaW5nLiBTZWUgdHJhbnMuaHRtbC4KLSEgRGVmYXVsdHMgdG8gMS4KLSEKLSEgMCAtIE5vIGpvdXJuYWxsaW5nIHRha2VzIHBsYWNlLgotISAxIC0gTm9ybWFsIGpvdXJuYWxsaW5nIChkZWZhdWx0KS4KLSEgMiAtIEZ1bGwgam91cm5hbGxpbmcuCi0hCi10cmFuc0xldmVsPTEKLSEKLSEgV2hlbiBkb2luZyBhbiBpbXBvcnQsIGRlZmluZXMgdGhlIG51bWJlciBvZiByb3dzIGltcG9ydGVkIAotISBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC4gUmVjb21tZW5kZWQgdmFsdWUgODE5Mi4KLSEgZGVmYXVsdHMgdG8gMTAwLgotIQotdHJhbnNJbXBvcnRzPTEwMAotCi0hLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0hCi0hIERBVEUsIFRJTUUgQU5EIENVUlJFTkNZIFBST1BFUlRJRVMKLSEKLSEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIQotISBOdW1iZXIgb2YgZGlnaXRzIGFmdGVyIGRlY2ltYWwgcG9pbnQgaW4gY3VycmVuY3kgb3V0cHV0cy4gRGVmYXVsdHMgdG8gMi4KLSEKLWN1cnJlbmN5RGVjaW1hbD0yCi0hCi0hIEN1cnJlbmN5IHN5bWJvbCB1c2VkIGluIGN1cnJlbmN5IG91dHB1dHMuIERlZmF1bHRzIHRvICQuCi0hCi1jdXJyZW5jeVN5bWJvbD0kCi0hCi0hIERlZmF1bHQgZm9ybWF0IGZvciBkYXRlIGNvbHVtbnMuIERlZmF1bHRzIHRvICJ5eXl5LW1tLWRkIi4KLSEKLWRhdGVGb3JtYXQ9eXl5eS1tbS1kZAotIQotISBEZWZhdWx0IGZvcm1hdCBmb3IgdGltZXN0YW1wIGNvbHVtbnMuIERlZmF1bHRzIHRvICJ5eXl5LW1tLWRkIGhoOm1tOnNzLmxsbCIuCi0hCi1kYXRlVGltZUZvcm1hdD15eXl5LW1tLWRkIGhoOm1tOnNzLmxsbAotIQotISBJZiBzZXQsIHRoZW4gYWxsIHR3byBkaWdpdCBkYXRlcyBsZXNzIHRoYW4gaXRzIHZhbHVlIGFyZSBpbnRlcnByZXRlZCAKLSEgYXMgMjFzdCBjZW50dXJ5IGRhdGVzLiAKLSEKLSFtaWxsZW5pdW1Cb3VuZGFyeT01MAotIQotISBTZXQgdG8gMSBjYXVzZXMgdGhlIGRhdGUgc3RyaW5nICJub3ciIHRvIHN0b3JlIGEgZnVsbCB0aW1lc3RhbXAuIAotISBEZWZhdWx0IGlzIHRvIHN0b3JlIG9ubHkgdGhlIGRhdGUgZm9yIGZpZWxkcyB3aXRoIG5vdyBob3VyIGluIHRoZSAKLSEgZm9ybWF0IHN0cmluZy4KLSEKLW5vd01lYW5zVGltZT0wCi0KLSEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSEKLSEgU1RSSU5HIEhBTkRMSU5HIFBST1BFUlRJRVMKLSEKLSEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIQotISBJZiBzZXQgdG8gMSB0aGVuIFN0cmluZyBoYXNoZXMgdXNlIHRoZSBKREsgT2JqZWN0Lmhhc2hDb2RlKCkgZnVuY3Rpb24uCi0hIEJ5IGRlZmF1bHQsIHVzZXMgSW5zdGFudERCJ3MgU3RyaW5nIGhhc2hpbmcuCi0hCi1hbHRTdHJpbmdIYXNoaW5nPTAKLSEKLSEgU2V0IHRvIDEgdG8gY2F1c2UgTElLRSBjbGF1c2VzIHRvIGFsd2F5cyBwZXJmb3JtIGNhc2UgaW5zZW5zaXRpdmUgCi0hIGNvbXBhcmlzb25zLiAKLSEKLWxpa2VJZ25vcmVDYXNlPTAKLSEKLSEgU2FtZSBhcyBTRVQgTElURVJBTCBTVFJJQ1RfT04uIFByZXZlbnRzIHN0cmluZyBsaXRlcmFscyBiZWluZyBpbnRlcnByZXRlZAotISBhcyBjb2x1bW4gbmFtZXMgb3IgbnVtYmVycy4gRGVmYXVsdCBpcyAwLgotIQotc3RyaWN0TGl0ZXJhbHM9MAotIQotISBTZXQgdGhpcyB2YWx1ZSB0byAxIChvbmUpIGlmIHlvdSB3b3VsZCBsaWtlIFByZXBhcmVkU3RhdGVtZW50LnNldFN0cmluZygpCi0hIHRvIGlnbm9yZSAiXCIgKGJhY2tzbGFzaCkgY2hhcmFjdGVycyB3aGVuIHByb2NlZXNpbmcgc3RyaW5nIGNvbnN0YW50cy4KLSEgV2hlbiBzZXQsIEluc3RhbnREQiB3aWxsIG5vdCBhdHRlbXB0IHRvIGludGVycHJldCBcIGFzIHRoZSBzdGFydCBvZiBhbgotISBlc2NhcGUgc2VxdWVuY2UuIERlZmF1bHQgaXMgMC4KLSEKLSFwcmVwYXJlSWdub3Jlc0VzY2FwZXM9MQotCi0hLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0hCi0hIE1JU0NFTExBTkVPVVMgUFJPUEVSVElFUwotIQotIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0hCi0hIEFsbG93cyBzZWxlY3RlZCBJbnN0YW50REIga2V5d29yZHMgdG8gYmUgdW4tcmVzZXJ2ZWQuIAotISBlLmcuIGlnbm9yZUtleXdvcmRzPXVybCxxdW90ZSB3b3VsZCBhbGxvdyB0aGUga2V5d29yZHMgCi0hIHVybCBhbmQgcXVvdGUgdG8gYmUgdXNlZCBhcyB0YWJsZSBvciBjb2x1bW4gbmFtZXMuIAotIQotISBUaGlzIGZhY2lsaXkgaXMgcHJvdmlkZWQgZm9yIGNvbXBhdGF0YmlsaXR5IHJlYXNvbnMgb25seS4KLSEgSXQncyB1c2UgaXMgbm90IHJlY29tbWVuZGVkIEFORCBJUyBOT1QgU1VQUE9SVEVELgotIQotIWlnbm9yZUtleXdvcmRzCi0hCi0hIE5vbi16ZXJvIG1lYW5zIGRhdGFiYXNlIGlzIG9wZW5lZCBpbiByZWFkIG9ubHkgbW9kZS4KLSEKLXJlYWRPbmx5PTAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzLyRkYiR0eXBlcy50YmwgYi9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy8kZGIkdHlwZXMudGJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTc4MTkyLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzLyRkYiR0eXBlcy50YmwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9pbXBvcnQxLnRibCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL2ltcG9ydDEudGJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjIwODcxLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL2ltcG9ydDEudGJsCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvc2FtcGxlJGRiJENvbHMkcEtleS50YmwgYi9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUkZGIkQ29scyRwS2V5LnRibApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzOTgyYS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUkZGIkQ29scyRwS2V5LnRibAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL3NhbXBsZSRkYiRDb2xzLnRibCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL3NhbXBsZSRkYiRDb2xzLnRibApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5MmQwMS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUkZGIkQ29scy50YmwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUkZGIkSW5kZXhlcy50YmwgYi9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUkZGIkSW5kZXhlcy50YmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTE1MTcuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvc2FtcGxlJGRiJEluZGV4ZXMudGJsCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvc2FtcGxlJGRiJFRhYmxlcyRwS2V5LnRibCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL3NhbXBsZSRkYiRUYWJsZXMkcEtleS50YmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZjBjMDkuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvc2FtcGxlJGRiJFRhYmxlcyRwS2V5LnRibAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL3NhbXBsZSRkYiRUYWJsZXMudGJsIGIvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvc2FtcGxlJGRiJFRhYmxlcy50YmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDE5NGQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvc2FtcGxlJGRiJFRhYmxlcy50YmwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUuanJsIGIvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvc2FtcGxlLmpybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiZWY0Zi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUuanJsCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zL251bWxpc3QueG1sIGIvc2FtcGxlcy9leHRlbnNpb25zL251bWxpc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmQ0MWMyLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9udW1saXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGRvYz4KLSAgPG5hbWUgZmlyc3Q9IlNhbmppdmEiIGxhc3Q9IldlZXJhd2FyYW5hIi8+Ci0gIDxuYW1lIGZpcnN0PSJKb3NlcGgiIGxhc3Q9Iktlc3NlbG1hbiIvPgotICA8bmFtZSBmaXJzdD0iU3RlcGhlbiIgbGFzdD0iQXVyaWVtbWEiLz4KLSAgPG5hbWUgZmlyc3Q9Iklnb3IiIGxhc3Q9IkJlbGFrb3Zza2l5Ii8+ICAgIAotICA8bmFtZSBmaXJzdD0iRGF2aWQiIGxhc3Q9Ik1hcnN0b24iLz4KLSAgPG5hbWUgZmlyc3Q9IkRhdmlkIiBsYXN0PSJCZXJ0b25pIi8+Ci0gIDxuYW1lIGZpcnN0PSJEb25hbGQiIGxhc3Q9Ikxlc2xpZSIvPgotICA8bmFtZSBmaXJzdD0iRW1pbHkiIGxhc3Q9IkZhcm1lciIvPgotICA8bmFtZSBmaXJzdD0iTXlyaWFtIiBsYXN0PSJNaWR5Ii8+Ci0gIDxuYW1lIGZpcnN0PSJQYXVsIiBsYXN0PSJEaWNrIi8+Ci0gIDxuYW1lIGZpcnN0PSJTY290dCIgbGFzdD0iQm9hZyIvPgotICA8bmFtZSBmaXJzdD0iU2hhbmUiIGxhc3Q9IkN1cmN1cnUiLz4KLSAgPG5hbWUgZmlyc3Q9Ik1hcmNpYSIgbGFzdD0iSG9mZm1hbiIvPgotICA8bmFtZSBmaXJzdD0iTm9haCIgbGFzdD0iTWVuZGVsc29obiIvPgotICA8bmFtZSBmaXJzdD0iQWxleCIgbGFzdD0iTW9ycm93Ii8+ICAgIAotPC9kb2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zL3JlYWRtZS5odG1sIGIvc2FtcGxlcy9leHRlbnNpb25zL3JlYWRtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzg5MzZmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9yZWFkbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPlhhbGFuIFNhbXBsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDI+WGFsYW4gU2FtcGxlczwvaDI+Ci08cD5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNhbXBsZXMgKHdoYXQgdGhleSBpbGx1c3RyYXRlIGFuZCBob3cgdG8gcnVuIHRoZW0pLCBzZWUgPGEgaHJlZj0iLi4vLi4vZG9jcy9zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+LjwvcD4KLQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zYW1wbGVzL3NlcnZsZXQvQXBwbHlYU0xULmphdmEgYi9zYW1wbGVzL3NlcnZsZXQvQXBwbHlYU0xULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MmUzMjYuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9zZXJ2bGV0L0FwcGx5WFNMVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODg5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBzZXJ2bGV0OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXRSb290OwotLy8gU0FYMiBJbXBvcnRzCi1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlRyYW5zZm9ybWVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnN0cmVlLlNvdXJjZVRyZWVIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YU3RyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTFJlYWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxGaWx0ZXJJbXBsOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBBcHBseVhTTFQgc3VwcGxpZXMgdGhlIGJhc2ljCi0gKiBmdW5jdGlvbnMgZm9yIHRyYW5zZm9ybWluZyBYTUwgZGF0YSB1c2luZyBYU0wgc3R5bGVzaGVldHMuCi0gKgotICogQGF1dGhvciBTcGVuY2VyIFNoZXBhcmQgKHNzaGVwYXJkQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIFIuIEFkYW0gS2luZyAocmFrQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIFRvbSBSb3dlICh0cm93ZUB1cy5pYm0uY29tKQotICogQGF1dGhvciBEb24gTGVzbGllIChkb25hbGRfbGVzbGllQGxvdHVzLmNvbSkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXB1YmxpYyBjbGFzcyBBcHBseVhTTFQgZXh0ZW5kcyBIdHRwU2VydmxldAotewotCi0gIC8qKgotICAgKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGlzIGNsYXNzLgotICAgKiA8cD5SZXF1ZXN0LXRpbWUgdmFsdWVzIG92ZXJyaWRlIGluaXQtdGltZSB2YWx1ZXMgd2hpY2ggb3ZlcnJpZGUgY2xhc3MgZGVmYXVsdHMuPC9wPgotICAgKiBAc2VlICNpbml0Ci0gICAqIEBzZXJpYWwKLSAgICovCi0gIHByb3RlY3RlZCBBcHBseVhTTFRQcm9wZXJ0aWVzIG91ckRlZmF1bHRQYXJhbWV0ZXJzID0gbnVsbDsKLQotICAvKioKLSAgICogU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZW5kIG9mIGxpbmUgY2hhcmFjdGVycyBmb3IgdGhlIFN5c3RlbS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAvKioKLSAgICogU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZmlsZSBzZXBhcmF0b3IgY2hhcmFjdGVycyBmb3IgdGhlIFN5c3RlbS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZTID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotCi0gICAvKioKLSAgICogU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBkaXJlY3RvcnkgZm9yIHByb3BlcnRpZXMgZmlsZXMuIFNlZSBpbml0KCkuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBST09UID0gU3lzdGVtLmdldFByb3BlcnR5KCJzZXJ2ZXIucm9vdCIpOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBDVVJSRU5URElSOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIG9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgZnJvbSB0aGUgY29uZmlndXJhdGlvbi4KLSAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9uCi0gICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBOZXZlciB0aHJvd24KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpCi0gICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLmluaXQoY29uZmlnKTsKLSAgICAvLyBJZiB0aGUgc2VydmVyLnJvb3QgcHJvcGVydHkgLS1zZWUgYWJvdmUtLSBpcyBudWxsLCB1c2UgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQotICAgIC8vIGFzIGRlZmF1bHQgbG9jYXRpb24gZm9yIG1lZGlhLnByb3BlcnRpZXMuCi0gICAgaWYgKFJPT1QgIT0gbnVsbCkKLSAgICAgIENVUlJFTlRESVI9IFJPT1QgKyBGUyArICJzZXJ2bGV0cyIgKyBGUzsKLSAgICBlbHNlCi0gICAgICBDVVJSRU5URElSID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpKyBGUzsKLSAgICAKLQlzZXREZWZhdWx0UGFyYW1ldGVycyhjb25maWcpOwotCQotICAgIHNldE1lZGlhUHJvcHMoY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoIm1lZGlhVVJMIikpOwkKLSAgfQotICAKLSAvKioKLSAgICogU2V0cyB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzIGZvciB0aGUgc2VydmxldCBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgotICAgKiBBbHNvIHNldHMgcmVxdWlyZWQgc3lzdGVtIHByb3BlcnRpZXMgdW50aWwgd2UgZmlndXJlIG91dCB3aHkgc2VydmxldCAKLSAgICogc29tZXRpbWVzcyBmYWlscyB0byByZWFkIHByb3BlcnRpZXMgZnJvbSBwcm9wZXJ0aWVzIGZpbGVzLgotICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRQYXJhbWV0ZXJzKFNlcnZsZXRDb25maWcgY29uZmlnKQotICB7Ci0gICAgb3VyRGVmYXVsdFBhcmFtZXRlcnMgPSBuZXcgRGVmYXVsdEFwcGx5WFNMVFByb3BlcnRpZXMoY29uZmlnKTsKLSAgfQotICAKLSAgLyoqCi0gICAqCUxvYWRzIHRoZSBtZWRpYSBwcm9wZXJ0aWVzIGZpbGUgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBzdHJpbmcuCi0gICAqIEBwYXJhbSBtZWRpYVVSTHN0cmluZyBMb2NhdGlvbiBvZiB0aGUgbWVkaWEgcHJvcGVydGllcyBmaWxlLiAgQ2FuIGJlIGVpdGhlciBhIGZ1bGwgVVJMIG9yIGEgcGF0aCByZWxhdGl2ZQotICAgKiB0byB0aGUgU3lzdGVtJ3Mgc2VydmVyLnJvb3QgL3NlcnZsZXRzIGRpcmVjdG9yeS4gIElmIHRoaXMgcGFyYW1ldGVyIGlzIG51bGwsCi0gICAqIHNlcnZlci5yb290L3NlcnZsZXRzL21lZGlhLnByb3BlcnRpZXMgd2lsbCBiZSB1c2VkLgotICAgKiBAc2VlIEFwcGx5WFNMI0NVUlJFTlRESVIKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldE1lZGlhUHJvcHMoU3RyaW5nIG1lZGlhVVJMc3RyaW5nKQotICB7Ci0gICAgaWYgKG1lZGlhVVJMc3RyaW5nICE9IG51bGwpCi0gICAgewotICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgdXJsID0gbmV3IFVSTChtZWRpYVVSTHN0cmluZyk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZTEpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCBDVVJSRU5URElSICsgbWVkaWFVUkxzdHJpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlMikKLSAgICAgICAgewotICAgICAgICAgIHdyaXRlTG9nKCJVbmFibGUgdG8gZmluZCB0aGUgbWVkaWEgcHJvcGVydGllcyBmaWxlIGJhc2VkIG9uIHBhcmFtZXRlciAnbWVkaWFVUkwnID0gIgotICAgICAgICAgICAgICAgICAgICsgbWVkaWFVUkxzdHJpbmcsIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQUNDRVBURUQsIG11ZTIpOwotICAgICAgICAgIHVybCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICh1cmwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBvdXJNZWRpYVByb3BzID0gbmV3IE9yZGVyZWRQcm9wcyh1cmwub3BlblN0cmVhbSgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lMSkKLSAgICAgICAgewotICAgICAgICAgIHdyaXRlTG9nKCJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgb3BlbmluZyBtZWRpYSBwcm9wZXJ0aWVzIGZpbGU6ICIgKyBtZWRpYVVSTHN0cmluZyArCi0gICAgICAgICAgICAgICAgICAgIi4gIE1lZGlhIHRhYmxlIG1heSBiZSBpbnZhbGlkLiIsIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQUNDRVBURUQsIGlvZTEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgZGVmYXVsdFByb3AgPSBDVVJSRU5URElSICsgIm1lZGlhLnByb3BlcnRpZXMiOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIG91ck1lZGlhUHJvcHMgPSBuZXcgT3JkZXJlZFByb3BzKG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVmYXVsdFByb3ApKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UyKQotICAgICAgewotICAgICAgICB3cml0ZUxvZygiRGVmYXVsdCBtZWRpYSBwcm9wZXJ0aWVzIGZpbGUgIiArIGRlZmF1bHRQcm9wICsgIiBub3QgZm91bmQuIiwKLSAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19BQ0NFUFRFRCwgaW9lMik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRNZWRpYShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHJldHVybiBvdXJNZWRpYVByb3BzLmdldFZhbHVlKHJlcXVlc3QuZ2V0SGVhZGVyKEhFQURFUl9OQU1FKSk7Ci0gIH0KLSAgCi0gIC8vIGRvUG9zdCByZW1vdmVkIGZvciBzZWN1cml0eSByZWFzb25zIGR1ZSB0byB0aGUgcG9zc2liaWxpdHkgb2Ygc2VuZGluZwotICAvLyB1bnNlY3VyZSBYTUwgYW5kIFhTTCBYU0xUSW5wdXRTb3VyY2VzIHRocm91Z2ggdGhlIHJlcXVlc3QgaW5wdXQgc3RyZWFtCi0KLSAgLyoqCi0gICAqIEhUVFAgR2V0IG1ldGhvZCBwYXNzZWQgb24gdG8gcHJvY2VzcygpLgotICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdAotICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlCi0gICAqIEBzZWUgI3Byb2Nlc3MKLSAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIE5ldmVyIHRocm93bgotICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIE5ldmVyIHRocm93bgotICAgKi8KLSAgcHVibGljIHZvaWQgZG9HZXQgKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLSAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsJCi0gICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIHByb2Nlc3ModEZhY3RvcnksIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb29yZGluYXRlcyBhcHBseWluZyBhbiBYU0wgc3R5bGVzaGVldCB0byBYTUwgZGF0YSB1c2luZyBvcGVyYXRpb25hbCBwYXJhbWV0ZXJzLgotICAgKiA8cD5JZiBzdWNjZXNzZnVsbHkgYXBwbGllZCwgdGhlIHJlc3VsdCB0cmVlIHdpbGwgYmUgc3RyZWFtZWQgdG8gdGhlIHJlc3BvbnNlIG9iamVjdAotICAgKiBhbmQgdGhlIGNvbnRlbnQgdHlwZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBYU0wgc3R5bGVzaGVldCdzICZsdDt4c2w6b3V0cHV0PiBlbGVtZW50KHMpLjwvcD4KLSAgICogPHA+SWYgdGhlcmUgaXMgYSBwcm9ibGVtIGluIHBhcnNpbmcgdGhlIFhNTC9YU0wgb3IgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGluIGFwcGx5aW5nCi0gICAqIHRoZSBYU0wgdG8gdGhlIFhNTCwgYW4gZXhjZXB0aW9uIHdpbGwgYmUgc3RyZWFtZWQgdG8gdGhlIHJlc3BvbnNlIG9iamVjdC4gIFRoZSBkZXRhaWwKLSAgICogb2YgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBvYmplY3Qgd2lsbCBkZXBlbmQgb24gd2hldGhlciB3ZSdyZQotICAgKiBydW5uaW5nIGluIGRlYnVnIG1vZGUgb3Igbm90LjwvcD4KLSAgICogQHBhcmFtIHByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbiBvZiBUUmFYIHByb2Nlc3NvcgotICAgKiBAcGFyYW0gcmVxdWVzdCAgTWF5IGNvbnRhaW4gaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gY3JlYXRpbmcgWE1MIGFuZCBYU0wgWFNMVElucHV0U291cmNlJ3MKLSAgICogQHBhcmFtIHJlc3BvbnNlIFdoZXJlIHRvIHdyaXRlIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQKLSAgICogQHNlZSAjZ2V0RG9jdW1lbnQKLSAgICogQHNlZSAjZ2V0U3R5bGVzaGVldAotICAgKiBAc2VlICNnZXRDb250ZW50VHlwZQotICAgKiBAc2VlICNkaXNwbGF5RXhjZXB0aW9uCi0gICAqIEBzZWUgI3NldFN0eWxlc2hlZXRQYXJhbXMKLSAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIE5ldmVyIHRocm93bgotICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIE5ldmVyIHRocm93bgotICAgKi8KLSAgCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3MoVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5LCAKLQkJCQkJICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIGRlYnVnID0gb3VyRGVmYXVsdFBhcmFtZXRlcnMuaXNEZWJ1ZyhyZXF1ZXN0KTsKLQotICAgIGxvbmcgdGltZSA9IDA7Ci0gICAgaWYgKGRlYnVnKQotICAgICAgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgLy8gTGlzdGVuZXIgdG8gYmUgdXNlZCBmb3IgYWxsIHJlcG9ydGluZwotICAgIEFwcGx5WFNMVExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEFwcGx5WFNMVExpc3RlbmVyKCk7Ci0JbGlzdGVuZXIub3V0LnByaW50bG4oImRlYnVnIGlzICIgKyBkZWJ1Zyk7Ci0KLSAgICBTdHJlYW1Tb3VyY2UgeG1sU291cmNlID0gbnVsbDsKLQlTdHJlYW1Tb3VyY2UgeHNsU291cmNlID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAoKHhtbFNvdXJjZSA9IGdldERvY3VtZW50KHJlcXVlc3QsIGxpc3RlbmVyKSkgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFwcGx5WFNMVEV4Y2VwdGlvbigiZ2V0RG9jdW1lbnQoKSByZXR1cm5lZCBudWxsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5TQ19OT1RfRk9VTkQpOwotICAgIH0KLSAgICBjYXRjaCAoQXBwbHlYU0xURXhjZXB0aW9uIGF4ZSkKLSAgICB7Ci0gICAgICBheGUuYXBwZW5kTWVzc2FnZShFT0wgKyAiZ2V0RG9jdW1lbnQoKSByZXN1bHRlZCBpbiBBcHBseVhTTFRFeGNlcHRpb24iICsgRU9MCi0gICAgICAgICAgICAgICAgICAgICAgICArIGxpc3RlbmVyLmdldE1lc3NhZ2UoKSk7Ci0gICAgICBpZiAoZGVidWcpIHdyaXRlTG9nKGF4ZSk7Ci0gICAgICBkaXNwbGF5RXhjZXB0aW9uKHJlc3BvbnNlLCBheGUsIGRlYnVnKTsKLSAgICAgIHhtbFNvdXJjZSA9IG51bGw7Ci0gICAgfQotICAgIC8vIGNyZWF0aW5nIFhTTCBTdHlsZXNoZWV0Ci0gICAgaWYgKHhtbFNvdXJjZSAhPSBudWxsKQotCXsKLSAgICAgIHRyeQotICAgICAgewotCSAgICBpZiAoKHhzbFNvdXJjZSA9IGdldFN0eWxlc2hlZXQodEZhY3RvcnksIHJlcXVlc3QsIHhtbFNvdXJjZSwgbGlzdGVuZXIpKSA9PSBudWxsKQotCQl7Ci0gICAgICAgICAgdGhyb3cgbmV3IEFwcGx5WFNMVEV4Y2VwdGlvbigiZ2V0U3R5bGVzaGVldCgpIHJldHVybmVkIG51bGwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5TQ19OT1RfRk9VTkQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEZvciB0aW1lIGJlaW5nLCBtdXN0ICJyZXNldCIgeG1sU291cmNlIGFmdGVyIGV4dHJhY3Rpbmcgc3R5bGVzaGVldCBQSQotCQl4bWxTb3VyY2UgPSBnZXREb2N1bWVudChyZXF1ZXN0LCBsaXN0ZW5lcik7IAotICAgICAgfQotICAgICAgY2F0Y2ggKEFwcGx5WFNMVEV4Y2VwdGlvbiBheGUpCi0gICAgICB7Ci0gICAgICAgIGF4ZS5hcHBlbmRNZXNzYWdlKEVPTCArICJnZXRTdHlsZXNoZWV0KCkgcmVzdWx0ZWQgaW4gQXBwbHlYU0xURXhjZXB0aW9uIiArIEVPTAotICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpc3RlbmVyLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIGlmIChkZWJ1Zykgd3JpdGVMb2coYXhlKTsKLSAgICAgICAgZGlzcGxheUV4Y2VwdGlvbihyZXNwb25zZSwgYXhlLCBkZWJ1Zyk7Ci0gICAgICAgIHhzbFNvdXJjZSA9IG51bGw7Ci0gICAgICB9Ci0gICAgLy8gcGVyZm9ybSBUcmFuc2Zvcm1hdGlvbgotCSAgCi0gICAgaWYgKCh4bWxTb3VyY2UgIT0gbnVsbCkgJiYgKHhzbFNvdXJjZSAhPSBudWxsKSkKLSAgICB7Ci0JICB0cnkKLQkgIHsKLSAgICAgICAgbGlzdGVuZXIub3V0LnByaW50bG4oIlBlcmZvcm1pbmcgdHJhbnNmb3JtYXRpb24uLi4iKTsKLQkJCi0gICAgICAgIFRlbXBsYXRlcyB0ZW1wbGF0ZXMgPSB0RmFjdG9yeS5uZXdUZW1wbGF0ZXMoeHNsU291cmNlKTsKLSAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0ZW1wbGF0ZXMubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7Ci0JCQkgICAgICBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlKHRlbXBsYXRlcyk7Ci0gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgIT0gbnVsbCk7Ci0gICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLQotCQkJICAgICAgaWYgKHRyYW5zZm9ybWVyIGluc3RhbmNlb2YgVHJhbnNmb3JtZXJJbXBsKQotCQkJICAgICAgewotCQkJICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXJJbXBsID0gKFRyYW5zZm9ybWVySW1wbCl0cmFuc2Zvcm1lcjsKLSAgICAgICAgICAgICAgdHJhbnNmb3JtZXJJbXBsLnNldFF1aWV0Q29uZmxpY3RXYXJuaW5ncyhvdXJEZWZhdWx0UGFyYW1ldGVycy5pc05vQ1cocmVxdWVzdCkpOwotCQkJICAgICAgfQotCQkJCi0JCQkgICAgICBzZXRTdHlsZXNoZWV0UGFyYW1zKHRyYW5zZm9ybWVyLCByZXF1ZXN0KTsJCQkKLQkgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHhtbFNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSkpOwotCQkJCi0JCQkgICAgICBpZiAoZGVidWcpICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgd3JpdGVMb2cobGlzdGVuZXIuZ2V0TWVzc2FnZSgpLCByZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFwcGx5WFNMVEV4Y2VwdGlvbiBheGUgPSBuZXcgQXBwbHlYU0xURXhjZXB0aW9uCi0JCQkJICAgICAgICAgICAgICAgICAgICAgKCJFeGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIFRyYW5zZm9ybWF0aW9uOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRU9MICsgbGlzdGVuZXIuZ2V0TWVzc2FnZSgpICsgRU9MCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGV4Yy5nZXRNZXNzYWdlKCksIAotCQkJCQkJCQkJICAgICAgICAgICAgICBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICBpZiAoZGVidWcpIHdyaXRlTG9nKGF4ZSk7Ci0gICAgICAgICAgICBkaXNwbGF5RXhjZXB0aW9uKHJlc3BvbnNlLCBheGUsIGRlYnVnKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZmluYWxseQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHRyYW5zZm9ybWVyLnJlc2V0KCk7Ci0gICAgICAgICAgfSAvLyBlbmQgb2YgdHJ5IC4uLiBjYXRjaCAuLi4gZmluYWxseQotCQl9Ci0JICB9Ci0gICAgICBjYXRjaCAoLypvcmcueG1sLnNheC5TQVgqL0V4Y2VwdGlvbiBzYXhFeGMpCi0gICAgICB7Ci0gICAgICAgIEFwcGx5WFNMVEV4Y2VwdGlvbiBheGUgPSBuZXcgQXBwbHlYU0xURXhjZXB0aW9uCi0JCQkgICAgICAgICAgICAgICAgICAgICAoIkV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgY3Rvci9UcmFuc2Zvcm1hdGlvbjoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEVPTCArIGxpc3RlbmVyLmdldE1lc3NhZ2UoKSArIEVPTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzYXhFeGMuZ2V0TWVzc2FnZSgpLCAKLQkJCSAgICAgICAgICAgICAgICAJCQkJCSAgc2F4RXhjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgIGlmIChkZWJ1Zykgd3JpdGVMb2coYXhlKTsKLSAgICAgICAgZGlzcGxheUV4Y2VwdGlvbihyZXNwb25zZSwgYXhlLCBkZWJ1Zyk7Ci0gICAgICB9IC8vIGVuZCBvZiBuZXcgdHJ5IC4uLiBjYXRjaAotICAgIH0gLy8gZW5kIG9mIGlmKChzdHlsZXNoZWV0Um9vdCAhPSBudWxsKSAuLi4KLSAgICBpZiAoZGVidWcpCi0gICAgewotICAgICAgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTsKLSAgICAgIHdyaXRlTG9nKCIgIE5vIENvbmZsaWN0IFdhcm5pbmdzID0gIiArIG91ckRlZmF1bHRQYXJhbWV0ZXJzLmlzTm9DVyhyZXF1ZXN0KSArCi0gICAgICAgICAgICAgICAiICBUcmFuc2Zvcm1hdGlvbiB0aW1lOiAiICsgdGltZSArICIgbXMiLCByZXNwb25zZS5TQ19PSyk7Ci0gICAgfQotICB9Ci0gIH0gIAotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIFhNTCBYU0xUSW5wdXRTb3VyY2UgRE9NLiAgQXR0ZW1wdHMgd2lsbCBiZSBtYWtlIHRvIGNyZWF0ZSB0aGUgRE9NIGZyb20gdGhlIGZvbGxvd2luZwotICAgKiBzb3VyY2VzOgotICAgKiA8b2w+Ci0gICAqIDxsaT5BIHJlbGF0aXZlIFVSTCBzcGVjaWZpZWQgaW4gdGhlIEhUVFAgcmVxdWVzdCdzIHBhdGggaW5mb3JtYXRpb24uIFRoaXMgY2FwYWJpbGl0eSBpcyBpbnRlbmRlZAotICAgKiBmb3IgdXNlIGJ5IDxiPnNlcnZsZXQgZW5naW5lcyB0aGF0IG1hcDwvYj4gc29tZSBvciBhbGwgWE1MIGRhdGEgdG8gYmUgcHJvY2Vzc2VkIGF0IHRoZSBzZXJ2ZXIuPC9saT4KLSAgICogPGxpPkEgVVJMIHNwZWNpZmllZCBpbiB0aGUgSFRUUCByZXF1ZXN0J3MgPGNvZGU+VVJMPTwvY29kZT4gcGFyYW1ldGVyLiAgVGhpcyBjYXBhYmlsaXR5Ci0gICAqIGlzIGludGVuZGVkIGZvciA8Yj5jbGllbnRzIHdpc2hpbmcgdG8gc2VsZWN0aXZlbHkgcHJvY2VzczwvYj4gWE1MIGRhdGEgYXQgdGhlIHNlcnZlci4gIEZvcgotICAgKiBzZWN1cml0eSByZWFzb25zLCB0aGlzIFVSTCB3aWxsIGJlIGZvcmNlZCB0byB0aGUgbG9jYWwgSVAgaG9zdC48L2xpPgotICAgKiA8bGk+VGhlIEhUVFAgcmVxdWVzdCdzIFhNTCBpbnB1dCBzdHJlYW0uIFRoaXMgY2FwYWJpbGl0eSBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGNoYWluZWQgc2VydmxldHMuPC9saT4KLSAgICogPC9vbD4KLSAgICogQHBhcmFtIHJlcXVlc3QgTWF5IGNvbnRhaW4gb3IgcG9pbnQgdG8gdGhlIFhNTCBYU0xUSW5wdXRTb3VyY2UKLSAgICogQHBhcmFtIGxpc3RlbmVyIFRvIHJlY29yZCBkZXRhaWxlZCBwYXJzaW5nIG1lc3NhZ2VzIGZvciBwb3NzaWJsZSByZXR1cm4gdG8gcmVxdWVzdG9yCi0gICAqIEByZXR1cm4gWE1MIFhTTFRJbnB1dFNvdXJjZSBET00sIG9yIG51bGwgaWYgdGhlIFhTTFRJbnB1dFNvdXJjZSBjb3VsZCBub3QgYmUgcGFyc2VkCi0gICAqIEBleGNlcHRpb24gQXBwbHlYU0xURXhjZXB0aW9uIFRocm93biBpZiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGhhbmRsaW5nIHJlcXVlc3QKLSAgICovCi0gIHByb3RlY3RlZCBTdHJlYW1Tb3VyY2UgZ2V0RG9jdW1lbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwbHlYU0xUTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgdGhyb3dzIEFwcGx5WFNMVEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nIHhtbFVSTCA9IG51bGw7Ci0gICAgICAvLyBkb2N1bWVudCBmcm9tIFBhdGhJbmZvCi0gICAgICBpZiAoKHhtbFVSTCA9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdGVuZXIub3V0LnByaW50bG4oIlBhcnNpbmcgWE1MIERvY3VtZW50IGZyb20gUGF0aEluZm86ICIgKyB4bWxVUkwpOwotICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVNvdXJjZShuZXcgVVJMKCJodHRwIiwgKChEZWZhdWx0QXBwbHlYU0xUUHJvcGVydGllcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3VyRGVmYXVsdFBhcmFtZXRlcnMpLmdldExvY2FsSG9zdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxVUkwucmVwbGFjZSgnXFwnLCAnLycpKS5vcGVuU3RyZWFtKCkpOwkJCi0gICAgICB9Ci0gICAgICAvLyBkb2N1bWVudCBmcm9tIFJlcXVlc3QgcGFyYW1ldGVyCi0gICAgICBpZiAoKHhtbFVSTCA9IG91ckRlZmF1bHRQYXJhbWV0ZXJzLmdldFhNTHVybChyZXF1ZXN0KSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdGVuZXIub3V0LnByaW50bG4oIlBhcnNpbmcgWE1MIERvY3VtZW50IGZyb20gcmVxdWVzdCBwYXJhbWV0ZXI6ICIgKyB4bWxVUkwpOwotICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVNvdXJjZShuZXcgVVJMKHhtbFVSTCkub3BlblN0cmVhbSgpKTsKLSAgICAgIH0KLSAgICAgIC8vIGRvY3VtZW50IGZyb20gY2hhaW4KLSAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgIGlmICgoY29udGVudFR5cGUgIT0gbnVsbCkgJiYgY29udGVudFR5cGUuc3RhcnRzV2l0aCgidGV4dC94bWwiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdGVuZXIub3V0LnByaW50bG4oIlBhcnNpbmcgWE1MIERvY3VtZW50IGZyb20gcmVxdWVzdCBjaGFpbiIpOwotICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVNvdXJjZShyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBBcHBseVhTTFRFeGNlcHRpb24oaW9lLCBIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgQXBwbHlYU0xURXhjZXB0aW9uKGUsIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIFRlbXBsYXRlcyAoU3R5bGVzaGVldFJvb3QpIG9iamVjdC4gIEF0dGVtcHRzIHdpbGwgYmUgbWFrZSB0byBjcmVhdGUgdGhlIFN0eWxlc2hlZXQgCi0gICAqIGZyb20gdGhlIGZvbGxvd2luZ3NvdXJjZXM6Ci0gICAqIDxvbD4KLSAgICogPGxpPkEgVVJMIHNwZWNpZmllZCBpbiB0aGUgSFRUUCByZXF1ZXN0J3MgPGNvZGU+eHNsVVJMPTwvY29kZT4gcGFyYW1ldGVyLiAgVGhpcyBjYXBhYmlsaXR5Ci0gICAqIGlzIGludGVuZGVkIGZvciBjbGllbnRzIHdpc2hpbmcgdG8gc2VsZWN0aXZlbHkgb3ZlcnJpZGUgdGhlIHNlcnZlciBhbGdvcml0aG0gZm9yIGFwcGx5aW5nIFhTTAotICAgKiBzdHlsZXNoZWV0cy4gIEZvciBzZWN1cml0eSByZWFzb25zLCB0aGlzIFVSTCB3aWxsIGJlIGZvcmNlZCB0byB0aGUgbG9jYWwgSVAgaG9zdC48L2xpPgotICAgKiA8bGk+WE1MIGFzc29jaWF0aW9uLiAgWE1MIGRvY3VtZW50cyBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvIG9uZSBvciBtb3JlIHN0eWxlc2hlZXRzIHVzaW5nCi0gICAqIDxhIEhSRUY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUFIteG1sLXN0eWxlc2hlZXQtMTk5OTAxMTQiPnRoaXM8L2E+IFczQyBwcm9wb3NlZCByZWNvbW1lbmRhdGlvbi4KLSAgICogSWYgdGhlIFhNTCBkb2N1bWVudCBkb2VzIGNvbnRhaW4gc3VjaCByZWZlcmVuY2VzLCBhIGJlc3QgbWF0Y2ggd2lsbCBiZSBjaG9zZW4gYmFzZWQgb24gdGhlIGJyb3dzZXIKLSAgICogdHlwZSBtYWtpbmcgdGhlIHJlcXVlc3QgYW5kIHRoZSBkZWZhdWx0IGFzc29jaWF0aW9uLiAgVGhpcyBjYXBhYmlsaXR5IGVuYWJsZXMgcmVsYXRpb25zaGlwcyB0byBiZQotICAgKiBkZWZpbmVkIGJldHdlZW4gY2xpZW50IGNhcGFiaWxpdGllcyBhbmQgc3R5bGVzaGVldHMgY2FwYWJsZSBvZiBhY3Rpbmcgb24gdGhlc2UgY2FwYWJpbGl0aWVzLjwvbGk+Ci0gICAqIDxsaT5BIGNvbmZpZ3VyZWQgZGVmYXVsdCBzdHlsZXNoZWV0IFVSTDwvbGk+Ci0gICAqIDwvb2w+Ci0gICAqIEBwYXJhbSByZXF1ZXN0IE1heSBjb250YWluIG9yIHBvaW50IHRvIHRoZSBYU0wgWFNMVElucHV0U291cmNlCi0gICAqIEBwYXJhbSB4bWxTb3VyY2UgIE1heSBwb2ludCB0byB0aGUgWFNMIFhTTFRJbnB1dFNvdXJjZQotICAgKiBAcGFyYW0gbGlzdGVuZXIgVG8gcmVjb3JkIGRldGFpbGVkIHBhcnNpbmcgbWVzc2FnZXMgZm9yIHBvc3NpYmxlIHJldHVybiB0byByZXF1ZXN0b3IKLSAgICogQHJldHVybiBYU0wgWFNMVElucHV0U291cmNlLCBvciBudWxsIGlmIHRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBwYXJzZWQKLSAgICogQHNlZSAjbWFrZURvY3VtZW50Ci0gICAqIEBzZWUgI2dldE1lZGlhCi0gICAqIEBzZWUgI1NUWUxFU0hFRVRfQVRUUklCVVRFCi0gICAqIEBzZWUgI2dldFhTTFVSTGZyb21Eb2MKLSAgICogQHNlZSAjdG9BY2NlcHRMYW5ndWFnZUNvbm5lY3Rpb24KLSAgICogQGV4Y2VwdGlvbiBBcHBseVhTTFRFeGNlcHRpb24gVGhyb3duIGlmIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgaGFuZGxpbmcgcmVxdWVzdAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmVhbVNvdXJjZSBnZXRTdHlsZXNoZWV0KFRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSwKLQkJCQkgICAJCSAgCQkJICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1Tb3VyY2UgeG1sU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwbHlYU0xUTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgdGhyb3dzIEFwcGx5WFNMVEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy9zdHlsZXNoZWV0IFVSTCBmcm9tIHJlcXVlc3QKLSAgICAgIFN0cmluZyB4c2xVUkwgPSAoKERlZmF1bHRBcHBseVhTTFRQcm9wZXJ0aWVzKSBvdXJEZWZhdWx0UGFyYW1ldGVycykuZ2V0WFNMUmVxdWVzdFVSTChyZXF1ZXN0KTsKLQotICAgICAgaWYgKHhzbFVSTCAhPSBudWxsKQotICAgICAgICBsaXN0ZW5lci5vdXQucHJpbnRsbigiUGFyc2luZyBYU0wgU3R5bGVzaGVldCBEb2N1bWVudCBmcm9tIHJlcXVlc3QgcGFyYW1ldGVyOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgeHNsVVJMKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gZmluZCBzdHlsZXNoZWV0IGZyb20gWE1MIERvY3VtZW50LCBNZWRpYSB0YWcgcHJlZmVyZW5jZQotICAgICAgICBpZiAoeG1sU291cmNlICE9IG51bGwpewotICAgICAgICAgIGxpc3RlbmVyLm91dC5wcmludGxuKCJjYWxsaW5nIGdldFhTTFVSTGZyb21Eb2MgYW5kIGdldE1lZGlhICIgKyBnZXRNZWRpYShyZXF1ZXN0KSApOwotICAgICAgICAgIHhzbFVSTCA9IGdldFhTTFVSTGZyb21Eb2MoeG1sU291cmNlLCBTVFlMRVNIRUVUX0FUVFJJQlVURSwgZ2V0TWVkaWEocmVxdWVzdCksIHRGYWN0b3J5KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoeHNsVVJMICE9IG51bGwpCi0gICAgICAgICAgbGlzdGVuZXIub3V0LnByaW50bG4oIlBhcnNpbmcgWFNMIFN0eWxlc2hlZXQgRG9jdW1lbnQgZnJvbSBYTUwgRG9jdW1lbnQgdGFnOiAiICsgeHNsVVJMKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIC8vIENvbmZpZ3VyYXRpb24gRGVmYXVsdAotICAgICAgICAgIGlmICgoeHNsVVJMID0gb3VyRGVmYXVsdFBhcmFtZXRlcnMuZ2V0WFNMdXJsKG51bGwpKSAhPSBudWxsKQotICAgICAgICAgICAgbGlzdGVuZXIub3V0LnByaW50bG4oIlBhcnNpbmcgWFNMIFN0eWxlc2hlZXQgRG9jdW1lbnQgZnJvbSBjb25maWd1cmF0aW9uOiAiICsgeHNsVVJMKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKHhzbFVSTCk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IEFwcGx5WFNMVEV4Y2VwdGlvbihpb2UsIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBBcHBseVhTTFRFeGNlcHRpb24oZSwgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXNwb25zZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGJ5IHRoZSBtZWRpYS10eXBlIGFuZCBlbmNvZGluZyBhdHRyaWJ1dGVzIG9mCi0gICAqIHRoZSAmbHQ7eHNsOm91dHB1dD4gZWxlbWVudChzKSBvZiB0aGUgc3R5bGVzaGVldC4KLSAgICogQHBhcmFtIHhzbFNvdXJjZVJvb3QgWFNMIFN0eWxlc2hlZXQgdG8gYmUgZXhhbWluZWQgZm9yICZsdDt4c2w6b3V0cHV0PiBlbGVtZW50cy4KLSAgICogQHJldHVybiBUaGUgcmVzcG9uc2UgY29udGVudCB0eXBlIChNSU1FIHR5cGUgYW5kIGNoYXJzZXQpIG9mIHRoZSBzdHlsZXNoZWV0IG91dHB1dAotICAgKiBAc2VlICNwcm9jZXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKFRlbXBsYXRlcyB0ZW1wbGF0ZXMpCi0gIHsKLSAgICBQcm9wZXJ0aWVzIG9wcm9wcyA9IHRlbXBsYXRlcy5nZXRPdXRwdXRQcm9wZXJ0aWVzKCk7Ci0gICAgU3RyaW5nIGVuY29kaW5nID0gb3Byb3BzLmdldFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcpOyAgCi0gICAgICAgICAgU3RyaW5nIG1lZGlhID0gb3Byb3BzLmdldFByb3BlcnR5KE91dHB1dEtleXMuTUVESUFfVFlQRSk7Ci0gICAgICAgICAgaWYgKG1lZGlhICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCi0gICAgICAgIHJldHVybiBtZWRpYSArICI7IGNoYXJzZXQ9IiArIGVuY29kaW5nOwotICAgICAgcmV0dXJuIG1lZGlhOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCA9IG9wcm9wcy5nZXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCk7Ci0gICAgICAgICAgICBpZiAobWV0aG9kLmVxdWFscygiaHRtbCIpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gInRleHQvaHRtbCI7Ci0gICAgICAgICAgICBlbHNlIGlmIChtZXRob2QuZXF1YWxzKCJ0ZXh0IikpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAidGV4dC9wbGFpbiI7Ci0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gInRleHQveG1sIjsKLSAgICAgICAgICB9Ci0gIH0gIAotICAKLQotICAvKioKLSAgICogRGVmaW5lcyBhbmQgc2V0cyBzZWxlY3QgdG9wLWxldmVsIFhTTCBzdHlsZXNoZWV0IHZhcmlhYmxlcyBmcm9tIHRoZSBIVFRQIHJlcXVlc3QsIHdoaWNoCi0gICAqIGNhbiBiZSBldmFsdWF0ZWQgdXNpbmcgJmx0O3hzbDpwYXJhbS12YXJpYWJsZSZndDsuICBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyB3aWxsIGJlCi0gICAqIGF1dG9tYXRpY2FsbHkgc2V0OgotICAgKiA8ZGw+Ci0gICAqIDxkdD48aT5QYXJhbWV0ZXJOYW1lPC9pPjwvZHQ+Ci0gICAqIDxkZD5FYWNoIG5vbi1yZXNlcnZlZCByZXF1ZXN0IHBhcmFtZXRlciByZXR1cm5lZCBmcm9tIHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKS4gIElmIGEKLSAgICogICAgIHBhcmFtZXRlciBjb250YWlucyBtb3JlIHRoYW4gYSBzaW5nbGUgdmFsdWUsIG9ubHkgdGhlIGZpcnN0IHZhbHVlIGlzIGF2YWlsYWJsZS48L2RkPgotICAgKiA8ZHQ+c2VydmxldC1SZW1vdGVBZGRyPC9kdD4KLSAgICogPGRkPkNvbnRhaW5zIFN0cmluZyBvdXRwdXQgZnJvbSByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSwgd2hpY2ggaXMgdGhlIElQIGFkZHJlc3MKLSAgICogICAgIG9mIHRoZSBjbGllbnQgbWFjaGluZS48L2RkPgotICAgKiA8ZHQ+c2VydmxldC1SZW1vdGVIb3N0PC9kdD4KLSAgICogPGRkPkNvbnRhaW5zIFN0cmluZyBvdXRwdXQgZnJvbSByZXF1ZXN0LmdldFJlbW90ZUhvc3QoKSwgd2hpY2ggaXMgdGhlIGhvc3QgbmFtZQotICAgKiAgICAgb2YgdGhlIGNsaWVudCBtYWNoaW5lLjwvZGQ+Ci0gICAqIDxkdD5zZXJ2bGV0LVJlbW90ZVVzZXI8L2R0PgotICAgKiA8ZGQ+Q29udGFpbnMgU3RyaW5nIG91dHB1dCBmcm9tIHJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpLCB3aGljaCB3YXMgdGhlIHVzZXIgbmFtZQotICAgKiAgICAgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlciB0byBncmFudCBhY2Nlc3MgdG8gdGhpcyBzZXJ2bGV0LjwvZGQ+Ci0gICAqIDxkdD5zZXJ2bGV0LVJlcXVlc3Q8L2R0PgotICAgKiA8ZGQ+Q29udGFpbnMgdGhlIHJlcXVlc3Qgb2JqZWN0LjwvZGQ+Ci0gICAqIDwvZGw+Ci0gICAqIEBwYXJhbSB4c2xwcm9jZXNzb3IgV2hlcmUgdG8gcmVnaXN0ZXIgcGFyYW1ldGVycyB0byBiZSBzZXQKLSAgICogQHBhcmFtIHJlcXVlc3QgUHJvdmlkZXMgYWNjZXNzIHRvIGFsbCBtZWFuaW5nZnVsIHBhcmFtZXRlcnMgdG8gc2V0Ci0gICAqIEBzZWUgI3Byb2Nlc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0eWxlc2hlZXRQYXJhbXMoVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgRW51bWVyYXRpb24gcGFyYW1OYW1lcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLSAgICB3aGlsZSAocGFyYW1OYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFyYW1OYW1lID0gKFN0cmluZykgcGFyYW1OYW1lcy5uZXh0RWxlbWVudCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHBhcmFtVmFscyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKHBhcmFtTmFtZSk7Ci0gICAgICAgIGlmIChwYXJhbVZhbHMgIT0gbnVsbCkKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcihwYXJhbU5hbWUsIG5ldyBYU3RyaW5nKHBhcmFtVmFsc1swXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgdHJ5Ci0gICAgewotICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKCJzZXJ2bGV0LVJlbW90ZUFkZHIiLCBuZXcgWFN0cmluZyhyZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgdHJ5Ci0gICAgewotICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKCJzZXJ2bGV0LVJlbW90ZUhvc3QiLCBuZXcgWFN0cmluZyhyZXF1ZXN0LmdldFJlbW90ZUhvc3QoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgdHJ5Ci0gICAgewotICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKCJzZXJ2bGV0LVJlbW90ZVVzZXIiLCBuZXcgWFN0cmluZyhyZXF1ZXN0LmdldFJlbW90ZVVzZXIoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiB0byB0aGUgc2VydmxldCBsb2c6Ci0gICAqIDxvbD4KLSAgICogPGxpPkhUVFAgc3RhdHVzIGNvZGU8L2xpPgotICAgKiA8bGk+TWVzc2FnZTwvbGk+Ci0gICAqIDxsaT5TdGFjayB0cmFjZTwvbGk+Ci0gICAqIDwvb2w+Ci0gICAqIEBwYXJhbSBheGUgQ29udGFpbnMgdmFsaWQgSFRUUCBzdGF0dXMgY29kZSwgbWVzc2FnZSwgYW5kIHN0YWNrIHRyYWNlIChvcHRpb25hbCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlTG9nKEFwcGx5WFNMVEV4Y2VwdGlvbiBheGUpCi0gIHsKLSAgICB3cml0ZUxvZyhheGUuZ2V0TWVzc2FnZSgpLCBheGUuZ2V0U3RhdHVzQ29kZSgpLCBheGUuZ2V0RXhjZXB0aW9uKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHRvIHRoZSBzZXJ2bGV0IGxvZzoKLSAgICogPG9sPgotICAgKiA8bGk+SFRUUCBzdGF0dXMgY29kZTwvbGk+Ci0gICAqIDxsaT5NZXNzYWdlPC9saT4KLSAgICogPGxpPlN0YWNrIHRyYWNlPC9saT4KLSAgICogPC9vbD4KLSAgICogQHBhcmFtIG1zZyBNZXNzYWdlIHRvIGJlIGxvZ2dlZAotICAgKiBAcGFyYW0gc3RhdHVzQ29kZSBWYWxpZCBzdGF0dXMgY29kZSBmcm9tIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlCi0gICAqIEBwYXJhbSB0IFVzZWQgdG8gZ2VuZXJhdGUgc3RhY2sgdHJhY2UgKG1heSBiZSA9bnVsbCB0byBzdXBwcmVzcyBzdGFjayB0cmFjZSkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlTG9nKFN0cmluZyBtc2csIGludCBzdGF0dXNDb2RlLCBUaHJvd2FibGUgdCkKLSAgewotICAgIGlmICh0ID09IG51bGwpCi0gICAgICB3cml0ZUxvZyhtc2csIHN0YXR1c0NvZGUpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoYnl0ZXMsIHRydWUpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gaXMgIiArIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgdC5wcmludFN0YWNrVHJhY2Uod3JpdGVyKTsKLSAgICAgIGxvZygiSFRUUCBTdGF0dXMgQ29kZTogIiArIHN0YXR1c0NvZGUgKyAiIC0gIiArIG1zZyArIEVPTCArIGJ5dGVzLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiB0byB0aGUgc2VydmxldCBsb2c6Ci0gICAqIDxvbD4KLSAgICogPGxpPkhUVFAgc3RhdHVzIGNvZGU8L2xpPgotICAgKiA8bGk+TWVzc2FnZTwvbGk+Ci0gICAqIDwvb2w+Ci0gICAqIEBwYXJhbSBtc2cgTWVzc2FnZSB0byBiZSBsb2dnZWQKLSAgICogQHBhcmFtIHN0YXR1c0NvZGUgVmFsaWQgc3RhdHVzIGNvZGUgZnJvbSBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVMb2coU3RyaW5nIG1zZywgaW50IHN0YXR1c0NvZGUpCi0gIHsKLSAgICBsb2coIkhUVFAgU3RhdHVzIENvZGU6ICIgKyBzdGF0dXNDb2RlICsgIiAtICIgKyBtc2cpOwotICB9Ci0KLSAgLyoqCi0gICAqIEludm9rZXMgcmVzcG9uc2Uuc2VuZEVycm9yIHNldHRpbmcgYW4gSFRUUCBzdGF0dXMgY29kZSBhbmQgb3B0aW9uYWxseSBhbiBlcnJvciBtZXNzYWdlCi0gICAqIGFzIGFuIEhUTUwgcGFnZS4KLSAgICogPHA+SWYgcnVubmluZyBpbiBkZWJ1ZyBtb2RlLCBhbHNvIHRyeSB0byByZXR1cm4gYSBzdGFjayB0cmFjZSBvZiB0aGUgZXhjZXB0aW9uIGFuZAotICAgKiBhbmQgeG1sL3hzbCBwcm9jZXNzb3IgbWVzc2FnZXMuPC9wPgotICAgKiBAcGFyYW0gcmVzcG9uc2UgV2hlcmUgdG8gc3RyZWFtIHRoZSBleGNlcHRpb24gdG8KLSAgICogQHBhcmFtIHhzZSBUaGUgd3JhcHBlciB3aGljaCBjb250YWlucyB0aGUgZXhjZXB0aW9uIGFuZCBpdHMgSFRUUCBzdGF0dXMgY29kZQotICAgKiBAcGFyYW0gZGVidWcgSW5kaWNhdGVzIHdoZXRoZXIgdG8gaW5jbHVkZSBzdGFjayB0cmFjZSwgZXRjLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZGlzcGxheUV4Y2VwdGlvbihIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBBcHBseVhTTFRFeGNlcHRpb24geHNlLCBib29sZWFuIGRlYnVnKQotICB7Ci0gICAgU3RyaW5nIG1lc2cgPSB4c2UuZ2V0TWVzc2FnZSgpOwotICAgIGlmIChtZXNnID09IG51bGwpCi0gICAgICBtZXNnID0gIiI7Ci0gICAgZWxzZSBtZXNnID0gIjxCPiIgKyBtZXNnICsgIjwvQj4iOwotICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1lc2csIEVPTCk7Ci0gICAgU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICB3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgIHN0ckJ1Zi5hcHBlbmQodG9rZW5zLm5leHRUb2tlbigpICsgRU9MICsgIjxCUj4iKTsKLSAgICBtZXNnID0gc3RyQnVmLnRvU3RyaW5nKCk7Ci0gICAgaWYgKGRlYnVnKQotICAgIHsKLSAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihieXRlcywgdHJ1ZSk7Ci0gICAgICB4c2UuZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7Ci0gICAgICBtZXNnICs9ICIgPFBSRT4gIiArIGJ5dGVzLnRvU3RyaW5nKCkgKyAiIDwvUFJFPiAiOwotICAgIH0KLSAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKHhzZS5nZXRTdGF0dXNDb2RlKCksIG1lc2cpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU9FeGNlcHRpb24gaXMgb2NjdXJyaW5nIHdoZW4gc2VuZEVycm9yIGlzIGNhbGxlZCIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBNYXBwaW5nIG9mIEhUVFAgcmVxdWVzdCdzIHVzZXItQWdlbnQgdmFsdWVzIHRvIHN0eWxlc2hlZXQgbWVkaWE9IHZhbHVlcy4KLSAgICogPHA+VGhpcyBtYXBwaW5nIGlzIGRlZmluZWQgYnkgYSBmaWxlIHBvaW50ZWQgdG8gYnkgdGhlIG9wZXJhdGlvbmFsIHBhcmFtZXRlciAibWVkaWFVUkwiIHdoaWNoIGNhbgotICAgKiAgZWl0aGVyIGNvbnRhaW4gYSBmdWxsIFVSTCBvciBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIFN5c3RlbSdzIHNlcnZlci5yb290IC9zZXJ2bGV0cyBkaXJlY3RvcnkuPC9wPgotICAgKiBAc2VlICNzZXRNZWRpYVByb3BzCi0gICAqIEBzZWUgI2dldE1lZGlhCi0gICAqIEBzZXJpYWwKLSAgICovCi0gIHByb3RlY3RlZCBPcmRlcmVkUHJvcHMgb3VyTWVkaWFQcm9wcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBjb25uZWN0aW9uIHdoaWNoIHJlc3BlY3RzIHRoZSBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyIG9mIHRoZSBIVFRQIHJlcXVlc3QuICBUaGlzCi0gICAqIGlzIHVzZWZ1bCB3aGVuIFhTTCBmaWxlcyBhcmUgaW50ZXJuYXRpb25hbGl6ZWQgZm9yIHVzZSB3aXRoIFdlYiBzZXJ2ZXJzIHdoaWNoIHJlc3BlY3QgdGhpcwotICAgKiBoZWFkZXIuCi0gICAqIDxwPkZvciBleGFtcGxlLCBBcGFjaGUgMS4zLjYgbWF5IGJlIGNvbmZpZ3VyZWQgZm9yIG11bHRpdmlld3MuICBVbmRlciB0aGlzIGNvbmZpZ3VyYXRpb24sCi0gICAqIHJlcXVlc3RzIGZvciBodHRwOi8vbXlob3N0L2luZGV4Lmh0bWwgd291bGQgcmV0dXJuIGh0dHA6Ly9teWhvc3QvaW5kZXguaHRtbC5mciB0byBGcmVuY2ggYnJvd3NlcnMKLSAgICogYW5kIGh0dHA6Ly9teWhvc3QvaW5kZXguaHRtbC5lbiB0byBFbmdsaXNoIGJyb3dzZXJzLjwvcD4KLSAgICogQHBhcmFtIHVybCBMb2NhdGlvbiB0byBjb25uZWN0IHRvCi0gICAqIEBwYXJhbSByZXF1ZXN0IENvdWxkIGNvbnRhaW4gYW4gQWNjZXB0LUxhbmd1YWdlIGhlYWRlcgotICAgKiBAcmV0dXJuIEFuIEFjY2VwdC1MYW5ndWFnZS1lbmFibGVkIFVSTCBjb25uZWN0aW9uCi0gICAqIEBzZWUgI2dldFN0eWxlc2hlZXQKLSAgICovCi0gIHByb3RlY3RlZCBVUkxDb25uZWN0aW9uIHRvQWNjZXB0TGFuZ3VhZ2VDb25uZWN0aW9uKFVSTCB1cmwsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICAgIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFVSTENvbm5lY3Rpb24gdGVtcENvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICB0ZW1wQ29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkFjY2VwdC1MYW5ndWFnZSIsIHJlcXVlc3QuZ2V0SGVhZGVyKCJBY2NlcHQtTGFuZ3VhZ2UiKSk7Ci0gICAgcmV0dXJuIHRlbXBDb25uZWN0aW9uOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgWFNMIHN0eWxlc2hlZXQgVVJMIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIFhNTCBkb2N1bWVudC4gIElmIG11bHRpcGxlIFhTTAotICAgKiBzdHlsZXNoZWV0cyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBYTUwgZG9jdW1lbnQsIHByZWZlcmVuY2Ugd2lsbCBiZSBnaXZlbiB0byB0aGUgc3R5bGVzaGVldAotICAgKiB3aGljaCBjb250YWlucyBhbiBhdHRyaWJ1dGUgbmFtZS92YWx1ZSBwYWlyIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVOYW1lCi0gICAqIGFuZCBhdHRyaWJ1dGVWYWx1ZS4KLSAgICogQHBhcmFtIHhtbFNvdXJjZSBYTUwgWFNMVElucHV0U291cmNlIHRvIGJlIHNlYXJjaGVkIGZvciBhc3NvY2lhdGVkIFhTTCBzdHlsZXNoZWV0cwotICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSAgQXR0cmlidXRlIG5hbWUgdG8gcHJvdmlkZSBwcmVmZXJlbnRpYWwgbWF0Y2hpbmcKLSAgICogQHBhcmFtIGF0dHJpYnV0ZVZhbHVlIEF0dHJpYnV0ZSB2YWx1ZSB0byBwcm92aWRlIHByZWZlcmVudGlhbCBtYXRjaGluZwotICAgKiBAcmV0dXJuIFRoZSBwcmVmZXJyZWQgWFNMIHN0eWxlc2hlZXQgVVJMLCBvciBudWxsIGlmIG5vIFhTTCBzdHlsZXNoZWV0IGFzc29jaWF0aW9uIGlzIGZvdW5kCi0gICAqIEBzZWUgI2dldFN0eWxlc2hlZXQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhTTFVSTGZyb21Eb2MoU3RyZWFtU291cmNlIHhtbFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5KQotICB7Ci0gICAgU3RyaW5nIHRlbXBVUkwgPSBudWxsLCByZXR1cm5VUkwgPSBudWxsOwotICAgIHRyeQotICAgIHsKLQkgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgTm9kZSBzb3VyY2VUcmVlID0gZG9jQnVpbGRlci5wYXJzZSh4bWxTb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICBmb3IoTm9kZSBjaGlsZD1zb3VyY2VUcmVlLmdldEZpcnN0Q2hpbGQoKTsgbnVsbCAhPSBjaGlsZDsgY2hpbGQ9Y2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgaWYoTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgPT0gY2hpbGQuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pY2hpbGQ7Ci0gICAgICAgICAgaWYocGkuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInhtbC1zdHlsZXNoZWV0IikpCi0gICAgICAgICAgewotICAgICAgICAgICAgUElBIHBpYSA9IG5ldyBQSUEocGkpOwotICAgICAgICAgICAgaWYoInRleHQveHNsIi5lcXVhbHMocGlhLmdldEF0dHJpYnV0ZSgidHlwZSIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdGVtcFVSTCA9IHBpYS5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKLSAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IHBpYS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgICAgICAgIGlmICgoYXR0cmlidXRlICE9IG51bGwpICYmIChhdHRyaWJ1dGUuaW5kZXhPZihhdHRyaWJ1dGVWYWx1ZSkgPiAtMSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBVUkw7Ci0gICAgICAgICAgICAgIGlmICghInllcyIuZXF1YWxzKHBpYS5nZXRBdHRyaWJ1dGUoImFsdGVybmF0ZSIpKSkKLSAgICAgICAgICAgICAgICByZXR1cm5VUkwgPSB0ZW1wVVJMOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaChFeGNlcHRpb24gc2F4RXhjKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHJldHVyblVSTDsKLSAgfSAgCi0KLSAvKioKLSAgICogVGhlIGF0dHJpYnV0ZSBuYW1lIGluIHRoZSA8P3htbC1zdHlsZXNoZWV0PiB0YWcgdXNlZCBpbiBzdHlsZXNoZWV0IHNlbGVjdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFU0hFRVRfQVRUUklCVVRFID0gIm1lZGlhIjsKLQotICAvKioKLSAgICoJVGhlIEhUVFAgSGVhZGVyIHVzZWQgZm9yIG1hdGNoaW5nIHRoZSBTdHlsZXNoZWV0IGF0dHJpYnV0ZSB2aWEgdGhlCi0gICAqIG1lZGlhIHByb3BlcnRpZXMgZmlsZSBzZWxlY3RlZC4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9OQU1FID0gInVzZXItQWdlbnQiOwotfQotCi0vKioKLSAqICBTdG9yZXMgdGhlIGtleXMgYW5kIHZhbHVlcyBmcm9tIGEgZmlsZSAoc2ltaWxhciB0byBhIHByb3BlcnRpZXMgZmlsZSkgYW5kCi0gKiAgY2FuIHJldHVybiB0aGUgZmlyc3QgdmFsdWUgd2hpY2ggaGFzIGEga2V5IGNvbnRhaW5lZCBpbiBpdHMgc3RyaW5nLgotICogIEZpbGUgY2FuIGhhdmUgY29tbWVudCBsaW5lcyBzdGFydGluZyB3aXRoICcjIiBhbmQgZm9yIGVhY2ggbGluZSB0aGUgZW50cmllcyBhcmUKLSAqICBzZXBhcmF0ZWQgYnkgdGFicyBhbmQgJz0nIGNoYXIuCi0gKi8KLWNsYXNzIE9yZGVyZWRQcm9wcwotewotCi0gIC8qKgotICAgKiBTdG9yZXMgdGhlIEtleSBhbmQgVmFsdWVzIGFzIGFuIGFycmF5IG9mIFN0cmluZ3MKLSAgICovCi0gIHByaXZhdGUgVmVjdG9yIGF0dFZlYyA9IG5ldyBWZWN0b3IoMTUpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIGlucHV0U3RyZWFtIFN0cmVhbSBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIGZpbGUuCi0gICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byByZWFkIGZyb20gc3RyZWFtCi0gICAqLwotICBPcmRlcmVkUHJvcHMoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBCdWZmZXJlZFJlYWRlciBpbnB1dCAgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKSk7Ci0gICAgU3RyaW5nIGN1cnJlbnRMaW5lLCBLZXkgPSBudWxsOwotICAgIFN0cmluZ1Rva2VuaXplciBjdXJyZW50VG9rZW5zOwotICAgIHdoaWxlICgoY3VycmVudExpbmUgPSBpbnB1dC5yZWFkTGluZSgpKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRUb2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGN1cnJlbnRMaW5lLCAiPVx0XHJcbiIpOwotICAgICAgaWYgKGN1cnJlbnRUb2tlbnMuaGFzTW9yZVRva2VucygpKSBLZXkgPSBjdXJyZW50VG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgIGlmICgoS2V5ICE9IG51bGwpICYmICFLZXkuc3RhcnRzV2l0aCgiIyIpICYmIGN1cnJlbnRUb2tlbnMuaGFzTW9yZVRva2VucygpKQotICAgICAgewotICAgICAgICBTdHJpbmcgdGVtcFtdID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgdGVtcFswXSA9IEtleTsgdGVtcFsxXSA9IGN1cnJlbnRUb2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICBhdHRWZWMuYWRkRWxlbWVudCh0ZW1wKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSXRlcmF0ZXMgdGhyb3VnaCB0aGUgS2V5IGxpc3QgYW5kIHJldHVybnMgdGhlIGZpcnN0IHZhbHVlIGZvciB3aG9zZQotICAgKiBrZXkgdGhlIGdpdmVuIHN0cmluZyBjb250YWlucy4gIFJldHVybnMgInVua25vd24iIGlmIG5vIGtleSBpcyBjb250YWluZWQKLSAgICogaW4gdGhlIHN0cmluZy4KLSAgICogQHBhcmFtIHMgU3RyaW5nIGJlaW5nIHNlYXJjaGVkIGZvciBhIGtleS4KLSAgICogQHJldHVybiBWYWx1ZSBmb3Iga2V5IGZvdW5kIGluIHN0cmluZywgb3RoZXJ3aXNlICJ1bmtub3duIgotICAgKi8KLSAgU3RyaW5nIGdldFZhbHVlKFN0cmluZyBzKQotICB7Ci0gICAgaW50IGksIGogPSBhdHRWZWMuc2l6ZSgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIHRlbXBbXSA9IChTdHJpbmdbXSkgYXR0VmVjLmVsZW1lbnRBdChpKTsKLSAgICAgIGlmIChzLmluZGV4T2YodGVtcFswXSkgPiAtMSkKLSAgICAgICAgcmV0dXJuIHRlbXBbMV07Ci0gICAgfQotICAgIHJldHVybiAidW5rbm93biI7Ci0gIH0KLX0KLQotLyoqCi0gKiBQYXJzZXMgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uJ3MgKFBJKSBhdHRyaWJ1dGVzIGZvciBlYXN5IHJldHJpZXZhbC4KLSAqLwotY2xhc3MgUElBCi17Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgcGlBdHRyaWJ1dGVzID0gbnVsbDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSBwaSBUaGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB3aG9zZSBhdHRyaWJ1dGVzIGFyZSB0byBiZSBwYXJzZWQKLSAgICovCi0gIFBJQShQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpCi0gIHsKLSAgICBwaUF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGkuZ2V0Tm9kZVZhbHVlKCksICI9XCIiKTsKLSAgICB3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIHBpQXR0cmlidXRlcy5wdXQodG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKSwgdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdmFsdWUgb2Ygc3BlY2lmaWVkIGF0dHJpYnV0ZS4KLSAgICogIEBwYXJhbSBuYW1lIEF0dHJpYnV0ZSBuYW1lCi0gICAqICBAcmV0dXJuIEF0dHJpYnV0ZSB2YWx1ZSwgb3IgbnVsbCBpZiB0aGUgYXR0cmlidXRlIG5hbWUgZG9lcyBub3QgZXhpc3QKLSAgICovCi0gIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZykgcGlBdHRyaWJ1dGVzLmdldChuYW1lKTsKLSAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zZXJ2bGV0L0FwcGx5WFNMVEV4Y2VwdGlvbi5qYXZhIGIvc2FtcGxlcy9zZXJ2bGV0L0FwcGx5WFNMVEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjNjNmExLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvc2VydmxldC9BcHBseVhTTFRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFdyYXBwZXIgZm9yIGV4Y2VwdGlvbnMgb2NjdXJyaW5nIGR1cmluZyBhcHBseSBYU0wgcHJvY2Vzc2luZy4gIAotICogQWxsb3dzIGZvciBleGNlcHRpb25zIHRvIGJlIHJldHVybmVkIHdpdGggYW4gYXNzb2NpYXRlZCBIVFRQIFN0YXR1cyBDb2RlLgotICoKLSAqIEBhdXRob3IgU3BlbmNlciBTaGVwYXJkIChzc2hlcGFyZEB1cy5pYm0uY29tKQotICogQGF1dGhvciBSLiBBZGFtIEtpbmcgKHJha0B1cy5pYm0uY29tKQotICogQGF1dGhvciBUb20gUm93ZSAodHJvd2VAdXMuaWJtLmNvbSkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHNlcnZsZXQ7Ci0KLXB1YmxpYyBjbGFzcyBBcHBseVhTTFRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICAqIEV4Y2VwdGlvbiBNZXNzYWdlLgotICAgICAgKiBAc2VyaWFsCi0gICAgICAqLyAKLSAgICBwcml2YXRlIFN0cmluZyBteU1lc3NhZ2UgPSAiIjsKLQotICAgIC8qKgotICAgICAgKiBIVFRQIFN0YXR1cyBDb2RlLiBEZWZhdWx0PSBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3IuCi0gICAgICAqIEBzZXJpYWwKLSAgICAgICovCi0gICAgcHJpdmF0ZSBpbnQgIG15SHR0cFN0YXR1c0NvZGUgPSBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7IAotCi0gICAgLyoqCi0gICAgICAqIFdyYXBwZWQgZXhjZXB0aW9uCi0gICAgICAqIEBzZXJpYWwKLSAgICAgICovCi0gICAgcHJpdmF0ZSBFeGNlcHRpb24gbXlFeGNlcHRpb24gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICAqIENvbnN0cnVjdG9yIGZvciBleGNlcHRpb24gd2l0aCBubyBhZGRpdGlvbmFsIGRldGFpbC4KLSAgICAgICovCi0gICAgcHVibGljIEFwcGx5WFNMVEV4Y2VwdGlvbigpIAotICAgIHsgCi0gICAgICAgIHN1cGVyKCk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgZXhjZXB0aW9uIHdpdGggbWVzc2FnZS4KLSAgICAgICogQHBhcmFtIHMgRXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgICovCi0gICAgcHVibGljIEFwcGx5WFNMVEV4Y2VwdGlvbihTdHJpbmcgcykgCi0gICAgeyAKLSAgICAgICAgc3VwZXIoKTsgCi0JbXlNZXNzYWdlID0gczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogQ29uc3RydWN0b3IgZm9yIGV4Y2VwdGlvbiB3aXRoIEhUVFAgc3RhdHVzIGNvZGUuCi0gICAgICAqIEBwYXJhbSBoc2MgVmFsaWQgc3RhdHVzIGNvZGUgZnJvbSBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZQotICAgICAgKi8KLSAgICBwdWJsaWMgQXBwbHlYU0xURXhjZXB0aW9uKGludCBoc2MpIAotICAgIHsKLQlzdXBlcigpOwotCW15SHR0cFN0YXR1c0NvZGUgPSBoc2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIENvbnN0cnVjdG9yIGZvciBleGNlcHRpb24gd2l0aCBtZXNzYWdlIGFuZCBIVFRQIHN0YXR1cyBjb2RlLgotICAgICAgKiBAcGFyYW0gcyBFeGNlcHRpb24gbWVzc2FnZQotICAgICAgKiBAcGFyYW0gaHNjIFZhbGlkIHN0YXR1cyBjb2RlIGZyb20gamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UKLSAgICAgICovCi0gICAgcHVibGljIEFwcGx5WFNMVEV4Y2VwdGlvbihTdHJpbmcgcywgaW50IGhzYykKLSAgICB7Ci0Jc3VwZXIoKTsKLQlteUh0dHBTdGF0dXNDb2RlID0gaHNjOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgZXhjZXB0aW9uLgotICAgICAgKiBAcGFyYW0gZSBFeGNlcHRpb24gdG8gYmUgd3JhcHBlZC4KLSAgICAgICovCi0gICAgcHVibGljIEFwcGx5WFNMVEV4Y2VwdGlvbihFeGNlcHRpb24gZSkKLSAgICB7Ci0Jc3VwZXIoKTsKLQlteU1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLQlteUV4Y2VwdGlvbiA9IGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIENvbnN0cnVjdG9yIGZvciBwYXNzZWQgZXhjZXB0aW9uIHdpdGggbWVzc2FnZS4KLSAgICAgICogQHBhcmFtIHMgRXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgICogQHBhcmFtIGUgRXhjZXB0aW9uIHRvIGJlIHdyYXBwZWQuCi0gICAgICAqLwotICAgIHB1YmxpYyBBcHBseVhTTFRFeGNlcHRpb24gKFN0cmluZyBzLCBFeGNlcHRpb24gZSkKLSAgICB7Ci0Jc3VwZXIoKTsKLQlteU1lc3NhZ2UgPSBzOwotCW15RXhjZXB0aW9uID0gZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogQ29uc3RydWN0b3IgZm9yIHBhc3NlZCBleGNlcHRpb24gd2l0aCBIVFRQIHN0YXR1cyBjb2RlLgotICAgICAgKiBAcGFyYW0gZSBFeGNlcHRpb24gdG8gYmUgd3JhcHBlZC4KLSAgICAgICogQHBhcmFtIGhzYyBWYWxpZCBzdGF0dXMgY29kZSBmcm9tIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlCi0gICAgICAqLwotICAgIHB1YmxpYyBBcHBseVhTTFRFeGNlcHRpb24oRXhjZXB0aW9uIGUsIGludCBoc2MpCi0gICAgewotCXN1cGVyKCk7Ci0JbXlNZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JbXlFeGNlcHRpb24gPSBlOwotCW15SHR0cFN0YXR1c0NvZGUgPSBoc2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIENvbnN0cnVjdG9yIGZvciBwYXNzZWQgZXhjZXB0aW9uIHdpdGggSFRUUCBzdGF0dXMgY29kZSBhbmQgbWVzc2FnZS4KLSAgICAgICogQHBhcmFtIHMgRXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgICogQHBhcmFtIGUgRXhjZXB0aW9uIHRvIGJlIHdyYXBwZWQuCi0gICAgICAqIEBwYXJhbSBoc2MgVmFsaWQgc3RhdHVzIGNvZGUgZnJvbSBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZQotICAgICAgKi8KLSAgICBwdWJsaWMgQXBwbHlYU0xURXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSwgaW50IGhzYykKLSAgICB7Ci0Jc3VwZXIoKTsKLQlteU1lc3NhZ2UgPSBzOwotCW15RXhjZXB0aW9uID0gZTsKLQlteUh0dHBTdGF0dXNDb2RlID0gaHNjOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBSZXR1cm5zIGV4Y2VwdGlvbiBtZXNzYWdlLgotICAgICAgKiBAcmV0dXJuIGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpCi0gICAgewotCXJldHVybiBteU1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIEFwcGVuZHMgc3RyaW5nIHRvIGV4Y2VwdGlvbiBtZXNzYWdlLgotICAgICAgKiBAcGFyYW0gcyBTdHJpbmcgdG8gYmUgYWRkZWQgdG8gbWVzc2FnZQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRNZXNzYWdlKFN0cmluZyBzKQotICAgIHsKLQlteU1lc3NhZ2UgKz0gczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogUmV0dXJucyB0aGUgd3JhcHBlZCBleGNlcHRpb24uCi0gICAgICAqIEByZXR1cm4gV3JhcHBlZCBleGNlcHRpb24KLSAgICAgICovCi0gICAgcHVibGljIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKQotICAgIHsKLQlyZXR1cm4gbXlFeGNlcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIFJldHVybnMgdGhlIEhUVFAgc3RhdHVzIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24uCi0gICAgICAqIEByZXR1cm4gVmFsaWQgc3RhdHVzIGNvZGUgZnJvbSBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZQotICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKQotICAgIHsKLQlyZXR1cm4gbXlIdHRwU3RhdHVzQ29kZTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvc2VydmxldC9BcHBseVhTTFRMaXN0ZW5lci5qYXZhIGIvc2FtcGxlcy9zZXJ2bGV0L0FwcGx5WFNMVExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNDZlMjYuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9zZXJ2bGV0L0FwcGx5WFNMVExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIHNlcnZsZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5EZWZhdWx0RXJyb3JIYW5kbGVyOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFwcGx5WFNMVExpc3RlbmVyIHByb3ZpZGVzIGEgYnVmZmVyZWQgbGlzdGVuZXIgZXNzZW50aWFsIGZvciBjYXB0dXJpbmcsIGFuZCB0aGVuIHN1YnNlcXVlbnRseQotICogcmVwb3J0aW5nLCBYTUwgYW5kIFhTTCBwcm9jZXNzb3IgbWVzc2FnZXMgd2hpY2ggbWF5IGJlIG9mIHVzZSBpbiBkZWJ1Z2dpbmcgWE1MK1hTTCBwcm9jZXNzZWQgYXQKLSAqIHRoZSBzZXJ2ZXIuCi0gKgotICogQGF1dGhvciBTcGVuY2VyIFNoZXBhcmQgKHNzaGVwYXJkQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIFIuIEFkYW0gS2luZyAocmFrQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIFRvbSBSb3dlICh0cm93ZUB1cy5pYm0uY29tKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcHVibGljIGNsYXNzIEFwcGx5WFNMVExpc3RlbmVyIGV4dGVuZHMgRGVmYXVsdEVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlcgotewotCi0gICAgLyoqCi0gICAgICAqIE91dHB1dCBzdHJlYW0KLSAgICAgICovCi0gICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgLyoqCi0gICAgICAqIEJ1ZmZlcmVkIG91dHB1dCBzdHJlYW0KLSAgICAgICovCi0gICAgcHVibGljIFByaW50V3JpdGVyIG91dCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgICogQ29uc3RydWN0b3IuCi0gICAgICAqLwotICAgIHB1YmxpYyBBcHBseVhTTFRMaXN0ZW5lcigpCi0gICAgewotICAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShvdXRTdHJlYW0pLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgYSB3YXJuaW5nLgotICAgICAgKgotICAgICAgKiBAcGFyYW0gc3BlIFRoZSB3YXJuaW5nIGluZm9ybWF0aW9uIGVuY2Fwc3VsYXRlZCBpbiBhIFNBWCBwYXJzZSBleGNlcHRpb24uCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gc3BlKQotICAgIHsKLQlvdXQucHJpbnRsbigiUGFyc2VyIFdhcm5pbmc6ICIgKyBzcGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgYSByZWNvdmVyYWJsZSBlcnJvci4KLSAgICAgICoKLSAgICAgICogQHBhcmFtIHNwZSBUaGUgZXJyb3IgaW5mb3JtYXRpb24gZW5jYXBzdWxhdGVkIGluIGEgU0FYIHBhcnNlIGV4Y2VwdGlvbi4KLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gc3BlKQotICAgIHsKLQlvdXQucHJpbnRsbigiUGFyc2VyIEVycm9yOiAiICsgc3BlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGEgbm9uLXJlY292ZXJhYmxlIGVycm9yLgotICAgICAgKgotICAgICAgKiBAcGFyYW0gc3BlIFRoZSBlcnJvciBpbmZvcm1hdGlvbiBlbmNhcHN1bGF0ZWQgaW4gYSBTQVggcGFyc2UgZXhjZXB0aW9uLgotICAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBBbHdheXMgdGhyb3duCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gc3BlKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0Jb3V0LnByaW50bG4oIlBhcnNlciBGYXRhbCBFcnJvcjogIiArIHNwZS5nZXRNZXNzYWdlKCkpOwotCXRocm93IHNwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogUmV0dXJucyB0aGUgYnVmZmVyZWQgcHJvY2Vzc2luZyBtZXNzYWdlKHMpLgotICAgICAgKiBAcmV0dXJuIEJ1ZmZlcmVkIHByb2Nlc3NpbmcgbWVzc2FnZShzKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICAgIHsKLQlyZXR1cm4gb3V0U3RyZWFtLnRvU3RyaW5nKCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zYW1wbGVzL3NlcnZsZXQvQXBwbHlYU0xUUHJvcGVydGllcy5qYXZhIGIvc2FtcGxlcy9zZXJ2bGV0L0FwcGx5WFNMVFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjllMGVkNC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3NlcnZsZXQvQXBwbHlYU0xUUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBzZXJ2bGV0OwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKLSAqIEFwcGx5WFNMVFByb3BlcnRpZXMgY29udGFpbnMgb3BlcmF0aW9uYWwgcGFyYW1ldGVycyBmb3IgQXBwbHlYU0xUIGJhc2VkIAotICogb24gcHJvZ3JhbSBkZWZhdWx0cyBhbmQgY29uZmlndXJhdGlvbi4gIAotICogPHA+VGhpcyBjbGFzcyBpcyBhbHNvIHVzZWQgdG8gcmV0dXJuIHZhbHVlcyBmb3IgcmVxdWVzdC10aW1lIHBhcmFtZXRlcnMuPC9wPgotICoKLSAqIEBhdXRob3IgU3BlbmNlciBTaGVwYXJkIChzc2hlcGFyZEB1cy5pYm0uY29tKQotICogQGF1dGhvciBSLiBBZGFtIEtpbmcgKHJha0B1cy5pYm0uY29tKQotICogQGF1dGhvciBUb20gUm93ZSAodHJvd2VAdXMuaWJtLmNvbSkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXB1YmxpYyBjbGFzcyBBcHBseVhTTFRQcm9wZXJ0aWVzIHsKLQotICAgIC8qKgotICAgICAgKiBQcm9ncmFtIGRlZmF1bHQgZm9yIHBhcmFtZXRlciAiVVJMIgotICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX1VSTDsKLQotICAgIC8qKgotICAgICAgKiBQcm9ncmFtIGRlZmF1bHQgZm9yIHBhcmFtZXRlciAieHNsVVJMIgotICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX3hzbFVSTDsKLSAgICAKLSAgICAvKioKLSAgICAgICogUHJvZ3JhbSBkZWZhdWx0IGZvciBwYXJhbWV0ZXIgImRlYnVnIgotICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9kZWJ1ZzsKLQotICAgIC8qKgotICAgICAgKiBQcm9ncmFtIGRlZmF1bHQgZm9yIHBhcmFtZXRlciAibm9Db25mbGljdFdhcm5pbmdzIgotICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9ub0NXOwotICAgIAotICAgIC8qKgotICAgICAgKiBDb25zdHJ1Y3RvciB0byB1c2UgcHJvZ3JhbSBkZWZhdWx0cy4KLSAgICAgICovCi0gICAgcHVibGljIEFwcGx5WFNMVFByb3BlcnRpZXMoKSAKLSAgICB7Ci0JREVGQVVMVF9VUkwgPSBudWxsOwotCURFRkFVTFRfeHNsVVJMID0gbnVsbDsKLQlERUZBVUxUX2RlYnVnID0gZmFsc2U7Ci0JREVGQVVMVF9ub0NXID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIENvbnN0cnVjdG9yIHRvIHVzZSB0byBvdmVycmlkZSBwcm9ncmFtIGRlZmF1bHRzLgotICAgICAgKiBAcGFyYW0gY29uZmlnIFNlcnZsZXQgY29uZmlndXJhdGlvbgotICAgICAgKi8KLSAgICBwdWJsaWMgQXBwbHlYU0xUUHJvcGVydGllcyhTZXJ2bGV0Q29uZmlnIGNvbmZpZykKLSAgICB7Ci0JU3RyaW5nIHhtID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoIlVSTCIpLAotCSAgICAgICB4dSA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJ4c2xVUkwiKSwKLQkgICAgICAgZGIgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiZGVidWciKSwKLQkgICAgICAgY3cgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigibm9Db25mbGljdFdhcm5pbmdzIik7Ci0JICAgICAgIAotCWlmICh4bSAhPSBudWxsKSBERUZBVUxUX1VSTCA9IHhtOwotCWVsc2UgREVGQVVMVF9VUkwgPSBudWxsOwotCWlmICh4dSAhPSBudWxsKSBERUZBVUxUX3hzbFVSTCA9IHh1OwotCWVsc2UgREVGQVVMVF94c2xVUkwgPSBudWxsOwotCWlmIChkYiAhPSBudWxsKSBERUZBVUxUX2RlYnVnID0gbmV3IEJvb2xlYW4oZGIpLmJvb2xlYW5WYWx1ZSgpOwotCWVsc2UgREVGQVVMVF9kZWJ1ZyA9IGZhbHNlOwotCWlmIChjdyAhPSBudWxsKSBERUZBVUxUX25vQ1cgPSBuZXcgQm9vbGVhbihjdykuYm9vbGVhblZhbHVlKCk7Ci0JZWxzZSBERUZBVUxUX25vQ1cgPSBmYWxzZTsKLSAgICB9Ci0gICAKLSAgICAvKioKLSAgICAgICogR2l2ZW4gYSBwYXJhbWV0ZXIgbmFtZSwgcmV0dXJucyB0aGUgSFRUUCByZXF1ZXN0J3MgU3RyaW5nIHZhbHVlOyAKLSAgICAgICogaWYgbm90IHByZXNlbnQgaW4gcmVxdWVzdCwgcmV0dXJucyBkZWZhdWx0IFN0cmluZyB2YWx1ZS4KLSAgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB0byBjaGVjayBmb3IgZGVmYXVsdCBvdmVycmlkZQotICAgICAgKiBAcGFyYW0gcGFyYW0gTmFtZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICAqIEByZXR1cm4gU3RyaW5nIHZhbHVlIG9mIG5hbWVkIHBhcmFtZXRlcgotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RQYXJtU3RyaW5nKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcGFyYW0pCi0gICAgewotCWlmIChyZXF1ZXN0ICE9IG51bGwpIHsgCi0JICAgIFN0cmluZ1tdIHBhcmFtVmFscyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKHBhcmFtKTsgCi0JICAgIGlmIChwYXJhbVZhbHMgIT0gbnVsbCkgCi0JCXJldHVybiBwYXJhbVZhbHNbMF07Ci0JfQotCXJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yICJVUkwiLgotICAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGNoZWNrIGZvciBwYXJhbWV0ZXIgdmFsdWUKLSAgICAgICogQHJldHVybiBTdHJpbmcgdmFsdWUgZm9yICJVUkwiCi0gICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uIFdpbGwgbm90IGJlIHRocm93bgotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhNTHVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgewotCVN0cmluZyB0ZW1wID0gZ2V0UmVxdWVzdFBhcm1TdHJpbmcocmVxdWVzdCwgIlVSTCIpOwotCWlmICh0ZW1wICE9IG51bGwpCi0JICAgIHJldHVybiB0ZW1wOwotCXJldHVybiBERUZBVUxUX1VSTDsKLSAgICB9ICAgICAKLSAgICAKLSAgICAvKioKLSAgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5nIGZvciAieHNsVVJMIi4KLSAgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB0byBjaGVjayBmb3IgcGFyYW1ldGVyIHZhbHVlCi0gICAgICAqIEByZXR1cm4gU3RyaW5nIHZhbHVlIGZvciAieHNsVVJMIgotICAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBXaWxsIG5vdCBiZSB0aHJvd24KLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRYU0x1cmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgIHsgIAotCVN0cmluZyB0ZW1wID0gZ2V0UmVxdWVzdFBhcm1TdHJpbmcocmVxdWVzdCwgInhzbFVSTCIpOwotCWlmICh0ZW1wICE9IG51bGwpCi0JICAgIHJldHVybiB0ZW1wOwotCXJldHVybiBERUZBVUxUX3hzbFVSTDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZyBmb3IgImRlYnVnIi4KLSAgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB0byBjaGVjayBmb3IgcGFyYW1ldGVyIHZhbHVlCi0gICAgICAqIEByZXR1cm4gQm9vbGVhbiB2YWx1ZSBmb3IgImRlYnVnIgotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlYnVnKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICAgIHsKLQlTdHJpbmcgdGVtcCA9IGdldFJlcXVlc3RQYXJtU3RyaW5nKHJlcXVlc3QsICJkZWJ1ZyIpOwotCWlmICh0ZW1wICE9IG51bGwpCi0JICAgIHJldHVybiBuZXcgQm9vbGVhbih0ZW1wKS5ib29sZWFuVmFsdWUoKTsKLQlyZXR1cm4gREVGQVVMVF9kZWJ1ZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5nIGZvciAibm9Db25mbGljdFdhcm5pbmdzIi4KLSAgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB0byBjaGVjayBmb3IgcGFyYW1ldGVyIHZhbHVlCi0gICAgICAqIEByZXR1cm4gQm9vbGVhbiB2YWx1ZSBmb3IgIm5vQ29uZmxpY3RXYXJuaW5ncyIKLSAgICAgICovCi0gICAgYm9vbGVhbiBpc05vQ1coSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gICAgewotCVN0cmluZyB0ZW1wID0gZ2V0UmVxdWVzdFBhcm1TdHJpbmcocmVxdWVzdCwgIm5vQ29uZmxpY3RXYXJuaW5ncyIpOwotCWlmICh0ZW1wICE9IG51bGwpCi0JICAgIHJldHVybiBuZXcgQm9vbGVhbih0ZW1wKS5ib29sZWFuVmFsdWUoKTsKLQlyZXR1cm4gREVGQVVMVF9ub0NXOwotICAgIH0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zZXJ2bGV0L0RlZmF1bHRBcHBseVhTTFRQcm9wZXJ0aWVzLmphdmEgYi9zYW1wbGVzL3NlcnZsZXQvRGVmYXVsdEFwcGx5WFNMVFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZkYjk2Ny4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3NlcnZsZXQvRGVmYXVsdEFwcGx5WFNMVFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugc2VydmxldDsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YXguc2VydmxldC4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKLSAqIERlZmF1bHRBcHBseVhTTFRQcm9wZXJ0aWVzIGNvbnRhaW5zIG9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgZm9yIERlZmF1bHRBcHBseVhTTFQgYmFzZWQgCi0gKiBvbiBwcm9ncmFtIGRlZmF1bHRzIGFuZCBjb25maWd1cmF0aW9uLiAgCi0gKiA8cD5UaGlzIGNsYXNzIGlzIGFsc28gdXNlZCB0byByZXR1cm4gdmFsdWVzIGZvciByZXF1ZXN0LXRpbWUgcGFyYW1ldGVycy48L3A+Ci0gKgotICogQGF1dGhvciBTcGVuY2VyIFNoZXBhcmQgKHNzaGVwYXJkQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIFIuIEFkYW0gS2luZyAocmFrQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIFRvbSBSb3dlICh0cm93ZUB1cy5pYm0uY29tKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcHVibGljIGNsYXNzIERlZmF1bHRBcHBseVhTTFRQcm9wZXJ0aWVzIGV4dGVuZHMgQXBwbHlYU0xUUHJvcGVydGllcyB7Ci0gICAgCi0gICAgLyoqCi0gICAgICAqIFByb2dyYW0gZGVmYXVsdCBmb3IgcGFyYW1ldGVyICJjYXRhbG9nIi4KLSAgICAgICogQHNlZSAjZ2V0Q2F0YWxvZwotICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX2NhdGFsb2c7Ci0KLSAgICAvKioKLSAgICAgICogSG9zdCB1c2VkIGZvciBsb2NhbCBjb250ZXh0IGNvbXBhcmlzb25zLgotICAgICAgKiBAc2VlICNnZXRMb2NhbEhvc3QKLSAgICAgICogQHNlZSAjc2V0TG9jYWxIb3N0Ci0gICAgICAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgU3RyaW5nIGxvY2FsSG9zdCA9IG51bGw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VydmVyIHBvcnQuIFVzZWQgaW4gdG9TYWZlVVJMKCkgLS0gZml4IHN1Ym1pdHRlZCBieSBSaXRlc2ggS3VtYXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgcG9ydCA9MDsKLQotICAgIC8qKgotICAgICAgKiBDb25zdHJ1Y3RvciB0byB1c2UgcHJvZ3JhbSBkZWZhdWx0cy4KLSAgICAgICovCi0gICAgcHVibGljIERlZmF1bHRBcHBseVhTTFRQcm9wZXJ0aWVzKCkKLSAgICB7Ci0Jc3VwZXIoKTsKLQlERUZBVUxUX2NhdGFsb2cgPSBudWxsOwotCXNldExvY2FsSG9zdCgpOwotCS8vIHNldFN5c3RlbVByb3BlcnRpZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogQ29uc3RydWN0b3IgdG8gdXNlIHRvIG92ZXJyaWRlIHByb2dyYW0gZGVmYXVsdHMuCi0gICAgICAqIEBwYXJhbSBjb25maWcgU2VydmxldCBjb25maWd1cmF0aW9uCi0gICAgICAqIEBzZWUgI3NldExvY2FsSG9zdAotICAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdEFwcGx5WFNMVFByb3BlcnRpZXMoU2VydmxldENvbmZpZyBjb25maWcpCi0gICAgewotCSAgICBzdXBlcihjb25maWcpOwotCSAgICBTdHJpbmcgY2F0ID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImNhdGFsb2ciKTsKLQkgICAgaWYgKGNhdCAhPSBudWxsKSBERUZBVUxUX2NhdGFsb2cgPSBjYXQ7Ci0JICAgIGVsc2UgREVGQVVMVF9jYXRhbG9nID0gbnVsbDsKLQkgICAgc2V0TG9jYWxIb3N0KCk7Ci0JICAgIHNldFN5c3RlbVByb3BlcnRpZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgbG9jYWwgSVAgaG9zdCBuYW1lOyB0aGlzIHZhbHVlIHdpbGwgYmUgdXNlZCB0byBjb25zdHJhaW4gdW50cnVzdGVkIAotICAgICAgKiBYTUwgZG9jdW1lbnQgYW5kIFhTTCBzdHlsZXNoZWV0IFVSTHMgdG8gdGhpcyB0cnVzdGVkIGhvc3QuCi0gICAgICAqIEBzZWUgI2dldExvY2FsSG9zdAotICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRMb2NhbEhvc3QoKQotICAgIHsKLQkgICAgdHJ5IAotCSAgICB7IAotCSAgICAgICAgbG9jYWxIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdE5hbWUoKTsKLQkgICAgfSAKLQkgICAgY2F0Y2ggKEV4Y2VwdGlvbiB1aGUpIAotCSAgICB7Ci0JICAgICAgbG9jYWxIb3N0ID0gbnVsbDsKLQkgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRydXN0ZWQgSVAgaG9zdC4KLSAgICAgICogQHJldHVybiBOYW1lIG9mIHRydXN0ZWQgaG9zdAotICAgICAgKiBAc2VlICNzZXRMb2NhbEhvc3QKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbEhvc3QoKQotICAgIHsKLQkgICAgcmV0dXJuIGxvY2FsSG9zdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogUmV0dXJucyBhIFVSTCB3aGljaCBpcyBjb25zdHJhaW5lZCB0byBhIHRydXN0ZWQgSVAgaG9zdC4KLSAgICAgICogQHBhcmFtIHhVUkwgVVJMIG9yIGZpbGUgcGF0aCB0byBiZSBtYWRlIHNhZmUgCi0gICAgICAqIEByZXR1cm4gU2FmZSBVUkwKLSAgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gVGhyb3duIHdoZW4geFVSTCBpcyBub3QgYSB2YWxpZCBVUkwKLSAgICAgICogQHNlZSAjc2V0TG9jYWxIb3N0Ci0gICAgICAqIEBzZWUgI2dldExvY2FsSG9zdAotICAgICAgKi8KLSAgICBwdWJsaWMgVVJMIHRvU2FmZVVSTChTdHJpbmcgeFVSTCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIC8vIEZpeCBzdWJtaXR0ZWQgYnkgUml0ZXNoIEt1bWFyLiBQb3J0IGlzIGluY2x1ZGVkIGluIGNvbnN0cnVjdGlvbiBvZiBVUkwgdGhhdCBpcyByZXR1cm5lZC4KLSAgICAgIGlmIChwb3J0ID09IDApCi0gICAgICAgIHBvcnQgPSByZXF1ZXN0LmdldFNlcnZlclBvcnQoKTsKLSAgICAgIAotCSAgICBpZiAoeFVSTCA9PSBudWxsKQotCSAgICAgIHJldHVybiBudWxsOwotCi0JICAgIGlmICh4VVJMLnN0YXJ0c1dpdGgoIi8iKSkgCi0gICAgICB7Ci0JICAgICAgdHJ5IAotICAgICAgICB7Ci0JCSAgICAgIHJldHVybiBuZXcgVVJMKCJodHRwIiwgbG9jYWxIb3N0LCBwb3J0LCB4VVJMKTsKLQkgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSAKLSAgICAgICAgewotCSAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbigidG9TYWZlVVJMKCk6ICIgKyB4VVJMICsgCi0JCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkaWQgbm90IG1hcCB0byBsb2NhbCIpOwotCSAgICAgIH0KLQkgICAgfQotCSAgICBVUkwgdGVtcFVSTCA9IG51bGw7Ci0JICAgIHRyeSAKLSAgICAgIHsgCi0JICAgICAgdGVtcFVSTCA9IG5ldyBVUkwoeFVSTCk7Ci0JICAgIH0gCi0gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgCi0gICAgICB7Ci0JICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbigidG9TYWZlVVJMKCk6ICIgKyB4VVJMICsgCi0JCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbm90IGEgdmFsaWQgVVJMIik7IAotCSAgICB9Ci0JICAgIHRyeSAKLSAgICAgIHsgCi0JICAgICAgcmV0dXJuIG5ldyBVUkwodGVtcFVSTC5nZXRQcm90b2NvbCgpLCBsb2NhbEhvc3QsIAotCQkJICAgICAgICAgICAgICAgICBwb3J0LCB0ZW1wVVJMLmdldEZpbGUoKSk7Ci0JICAgIH0gCi0gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgCi0gICAgICB7Ci0JICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbigidG9TYWZlVVJMKCk6ICIgKyB4VVJMICsgCi0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICIgY291bGQgbm90IGJlIGNvbnZlcnRlZCB0byBsb2NhbCBob3N0Iik7Ci0JICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICoJUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbnN0cmFpbmVkIFVSTCBmb3IgdGhlIFhNTCBkb2N1bWVudC4KLSAgICAgICogSWYgdGhlcmUgaXMgbm8gcmVxdWVzdCBwYXJhbWV0ZXIgZm9yIHRoZSBYTUwgZG9jdW1lbnQsIHJldHVybiB0aGUgY29uZmlndXJlZCBkZWZhdWx0LgotICAgICAgKiBAcGFyYW0gcmVxdWVzdCBNYXkgY29udGFpbiBhbiBYTUwgZG9jdW1lbnQgVVJMIHBhcmFtZXRlcgotICAgICAgKiBAcmV0dXJuIFN0cmluZyBmb3JtIG9mIFhNTCBVUkwKLSAgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gVGhyb3duIHdoZW4gcmVxdWVzdCBVUkwgaXMgbm90IGEgdmFsaWQgVVJMIG9yIHBhdGgKLSAgICAgICogQHNlZSAjdG9TYWZlVVJMCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WE1MdXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICB7Ci0JICAgIFVSTCB1cmwgPSB0b1NhZmVVUkwoZ2V0UmVxdWVzdFBhcm1TdHJpbmcocmVxdWVzdCwgIlVSTCIpLHJlcXVlc3QpOwotCSAgICBpZiAodXJsID09IG51bGwpCi0JICAgICAgcmV0dXJuIHN1cGVyLmdldFhNTHVybChudWxsKTsKLQkgICAgcmV0dXJuIHVybC50b0V4dGVybmFsRm9ybSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29uc3RyYWluZWQgVVJMIGZvciB0aGUgWFNMIHN0eWxlc2hlZXQgCi0gICAgICAqIGZyb20gdGhlIHJlcXVlc3QuCi0gICAgICAqIEBwYXJhbSByZXF1ZXN0IE1heSBjb250YWluIGFuIFhTTCBzdHlsZXNoZWV0IFVSTCBwYXJhbWV0ZXIKLSAgICAgICogQHJldHVybiBTdHJpbmcgZm9ybSBvZiByZXF1ZXN0IFhTTCBVUkwsIG9yIG51bGwgaWYgcmVxdWVzdCBjb250YWlucyBubyB4c2xVUkwgcGFyYW1ldGVyCi0gICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uIFRocm93biB3aGVuIHJlcXVlc3QgVVJMIGlzIG5vdCBhIHZhbGlkIFVSTCBvciBwYXRoCi0gICAgICAqIEBzZWUgI3RvU2FmZVVSTAotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhTTFJlcXVlc3RVUkwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgIHsKLQkgICAgVVJMIHVybCA9IHRvU2FmZVVSTChnZXRSZXF1ZXN0UGFybVN0cmluZyhyZXF1ZXN0LCAieHNsVVJMIikscmVxdWVzdCk7Ci0JICAgIGlmICh1cmwgPT0gbnVsbCkKLQkgICAgICAgIHJldHVybiBudWxsOwotCSAgICByZXR1cm4gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb25zdHJhaW5lZCByZXF1ZXN0IFVSTCBmb3IgdGhlIFhTTCBzdHlsZXNoZWV0LgotICAgICAgKiBJZiB0aGVyZSBpcyBubyByZXF1ZXN0IHBhcmFtZXRlciBmb3IgdGhlIFhTTCBzdHlsZXNoZWV0LCByZXR1cm4gdGhlIGNvbmZpZ3VyZWQgZGVmYXVsdC4KLSAgICAgICogQHBhcmFtIHJlcXVlc3QgTWF5IGNvbnRhaW4gYW4gWFNMIHN0eWxlc2hlZXQgVVJMIHBhcmFtZXRlcgotICAgICAgKiBAcmV0dXJuIFN0cmluZyBmb3JtIG9mIFhTTCBVUkwKLSAgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gVGhyb3duIHdoZW4gcmVxdWVzdCBVUkwgaXMgbm90IGEgdmFsaWQgVVJMIG9yIHBhdGgKLSAgICAgICogQHNlZSAjdG9TYWZlVVJMCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WFNMdXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICB7Ci0JICAgIFN0cmluZyByZXFVUkwgPSBnZXRYU0xSZXF1ZXN0VVJMKHJlcXVlc3QpOwotCSAgICBpZiAocmVxVVJMICE9IG51bGwpCi0JICAgICAgICByZXR1cm4gcmVxVVJMOwotCSAgICByZXR1cm4gc3VwZXIuZ2V0WFNMdXJsKG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBSZXR1cm5zIFVSTHMgZm9yIGFsbCA8YSBocmVmPSJodHRwOi8vd3d3LmNjaWwub3JnL35jb3dhbi9YTUwvWENhdGFsb2cuaHRtbCI+WENhdGFsb2dzPC9hPiAKLSAgICAgICogdGhhdCBhcmUgdG8gYmUgdXNlZCB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LiAgQ2F0YWxvZ3MgYXJlIHVzZWQgdG8gcmVzb2x2ZSBYTUwgcHVibGljIGlkZW50aWZpZXJzCi0gICAgICAqIGludG8gc3lzdGVtIGlkZW50aWZpZXJzLgotICAgICAgKiA8cD5BIHNpbmdsZSBYQ2F0YWxvZyBjYW4gYmUgY29uZmlndXJlZCBhcyBhIGRlZmF1bHQsCi0gICAgICAqIGJ1dCBtdWx0aXBsZSBYQ2F0YWxvZ3MgY2FuIGJlIHNwZWNpZmllZCBhdCByZXF1ZXN0IHRpbWUgdG8gYXVnbWVudCB0aGUgY29uZmlndXJlZCBkZWZhdWx0LgotICAgICAgKiBAcGFyYW0gcmVxdWVzdCBNYXkgY29udGFpbiBvbmUgb3IgbW9yZSBYQ2F0YWxvZyBwYXJhbWV0ZXJzCi0gICAgICAqIEByZXR1cm4gQXJyYXkgb2Ygc3RyaW5ncyBmb3IgYWxsIGNhdGFsb2cgVVJMcwotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2F0YWxvZyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgICB7Ci0JICAgIFN0cmluZyB0ZW1wW10gPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcygiY2F0YWxvZyIpOwotCSAgICBpZiAoREVGQVVMVF9jYXRhbG9nID09IG51bGwpCi0JICAgICAgICByZXR1cm4gdGVtcDsKLQkgICAgaWYgKHRlbXAgPT0gbnVsbCkgCi0gICAgICB7Ci0JICAgICAgU3RyaW5nIGRlZmF1bHRBcnJheVtdID0gbmV3IFN0cmluZyBbMV07Ci0JICAgICAgZGVmYXVsdEFycmF5WzBdID0gREVGQVVMVF9jYXRhbG9nOwotCSAgICAgIHJldHVybiBkZWZhdWx0QXJyYXk7Ci0JICAgIH0KLQkgICAgaW50IGksIGxlbiA9IHRlbXAubGVuZ3RoICsgMTsKLQkgICAgU3RyaW5nIG5ld0NhdGFsb2dzW10gPSBuZXcgU3RyaW5nW2xlbl07Ci0JICAgIG5ld0NhdGFsb2dzWzBdID0gREVGQVVMVF9jYXRhbG9nOwotCSAgICBmb3IgKGk9MTsgaSA8IGxlbjsgaSsrKSAKLSAgICAgIHsKLQkgICAgICBuZXdDYXRhbG9nc1tpXSA9IHRlbXBbaS0xXTsKLQkgICAgfQotCSAgICByZXR1cm4gbmV3Q2F0YWxvZ3M7Ci0gICAgfQotCQotCSAvKioKLSAgICogSSB0aGluayB3ZSBubyBsb25nZXIgbmVlZCB0aGlzLiBTZXRzIHRoZSAzIGpheHAgY29yZSBzeXN0ZW0gcHJvcGVydGllcy4KLSAgICovCQotICAgIHByb3RlY3RlZCB2b2lkIHNldFN5c3RlbVByb3BlcnRpZXMoKQotCXsKLQkgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgIHByb3BzLnB1dCgiamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkiLCAKLSAgICAgICAgICAgICAgIm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwiKTsKLSAgICBwcm9wcy5wdXQoImphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkiLCAKLSAgICAgICAgICAgICAgIm9yZy5hcGFjaGUueGVyY2VzLmpheHAuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeUltcGwiKTsKLSAgICBwcm9wcy5wdXQoImphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkiLCAKLSAgICAgICAgICAgICAgIm9yZy5hcGFjaGUueGVyY2VzLmpheHAuU0FYUGFyc2VyRmFjdG9yeUltcGwiKTsKLSAgICAKLSAgICAgIFByb3BlcnRpZXMgc3lzdGVtUHJvcHMgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOwotICAgICAgRW51bWVyYXRpb24gcHJvcEVudW0gPSBwcm9wcy5wcm9wZXJ0eU5hbWVzKCk7Ci0gICAgICB3aGlsZShwcm9wRW51bS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3AgPSAoU3RyaW5nKXByb3BFbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGlmKCFzeXN0ZW1Qcm9wcy5jb250YWluc0tleShwcm9wKSkKLSAgICAgICAgICBzeXN0ZW1Qcm9wcy5wdXQocHJvcCwgcHJvcHMuZ2V0UHJvcGVydHkocHJvcCkpOwotICAgICAgfQotICAgICAgU3lzdGVtLnNldFByb3BlcnRpZXMoc3lzdGVtUHJvcHMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zZXJ2bGV0L1NpbXBsZVhTTFRTZXJ2bGV0LmphdmEgYi9zYW1wbGVzL3NlcnZsZXQvU2ltcGxlWFNMVFNlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjMDgyMi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3NlcnZsZXQvU2ltcGxlWFNMVFNlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugc2VydmxldDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi0vKgotICogVGhpcyBzYW1wbGUgYXBwbGllcyB0aGUgdG9kby54c2wgc3R5bGVzaGVldCB0byB0aGUKLSAqIHRvZG8ueG1sIFhNTCBkb2N1bWVudCwgYW5kIHJldHVybnMgdGhlIHRyYW5zZm9ybWF0aW9uCi0gKiBvdXRwdXQgKEhUTUwpIHRvIHRoZSBjbGllbnQgYnJvd3Nlci4KLSAqCi0gKiBJTVBPUlRBTlQ6IEZvciB0aGlzIHRvIHdvcmssIHlvdSBtdXN0IHBsYWNlIHRvZG8ueHNsIGFuZCB0b2RvLnhtbCAKLSAqIGluIHRoZSBzZXJ2bGV0IHJvb3QgZGlyZWN0b3J5IGZvciBkb2N1bWVudHMuCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVYU0xUU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKLQotICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIuaW5pdChjb25maWcpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9HZXQgKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLSAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIE91dHB1dCBnb2VzIGluIHRoZSByZXNwb25zZSBzdHJlYW0uCi0gICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyIChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgLy8gVGhlIHNlcnZsZXQgcmV0dXJucyBIVE1MLgotICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsgICAgCi0gICAgdHJ5Ci0gICAgewkKLSAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgLy8gR2V0IHRoZSBYTUwgaW5wdXQgZG9jdW1lbnQgYW5kIHRoZSBzdHlsZXNoZWV0LgotICAgICAgU291cmNlIHhtbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UobmV3IFVSTCgiZmlsZTp0b2RvLnhtbCIpLm9wZW5TdHJlYW0oKSk7Ci0gICAgICBTb3VyY2UgeHNsU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgVVJMKCJmaWxlOnRvZG8ueHNsIikub3BlblN0cmVhbSgpKTsKLSAgICAgIC8vIEdlbmVyYXRlIHRoZSB0cmFuc2Zvcm1lci4KLSAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIoeHNsU291cmNlKTsKLSAgICAgIC8vIFBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uLCBzZW5kaW5nIHRoZSBvdXRwdXQgdG8gdGhlIHJlc3BvbnNlLgotICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHhtbFNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChvdXQpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG91dC53cml0ZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZShvdXQpOyAgICAKLSAgICB9Ci0gICAgb3V0LmNsb3NlKCk7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3NlcnZsZXQvVXNlU3R5bGVzaGVldFBhcmFtU2VydmxldC5qYXZhIGIvc2FtcGxlcy9zZXJ2bGV0L1VzZVN0eWxlc2hlZXRQYXJhbVNlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4NDBiYi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3NlcnZsZXQvVXNlU3R5bGVzaGVldFBhcmFtU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotCi0vKgotU2ltcGxlIFNlcnZsZXQgRXhhbXBsZSB1c2luZyBhIHN0eWxlc2hlZXQgcGFyYW1ldGVyCi0gKi8KLXBhY2thZ2Ugc2VydmxldDsKLS8vIEltcG9ydGVkIFRyYVggY2xhc3NlcwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi0vLyBJbXBvcnRlZCBTQVggY2xhc3NlcwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLy8gSW1wb3J0ZWQgamF2YS5pbyBhbmQgamF2YXguc2VydmxldCBjbGFzc2VzCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGNsYXNzIFVzZVN0eWxlc2hlZXRQYXJhbVNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7Ci0JCi0JUHJpbnRXcml0ZXIgb3V0OwotCVN0cmluZyB4c2xGaWxlLCB4bWxGaWxlLCBwYXJhbVZhbHVlOwotCXB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCi0JCUh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotCQkJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJlcy5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7Ci0JCQlvdXQgPSByZXMuZ2V0V3JpdGVyKCk7Ci0KLSAgICAgIHBhcmFtVmFsdWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJQVkFMIik7Ci0JCQl4bWxGaWxlICAgID0gcmVxLmdldFBhcmFtZXRlcigiWE1MIik7Ci0JCQl4c2xGaWxlICAgID0gcmVxLmdldFBhcmFtZXRlcigiWFNMIik7Ci0gCQlpZiAocGFyYW1WYWx1ZSA9PSBudWxsKSB7Ci0JCQlvdXQucHJpbnRsbigKLQkJCSI8aDE+Tm8gaW5wdXQgZm9yIHBhcmFtVmFsdWU8L2gxPiIpOwotCQkJcmV0dXJuOwotCQl9Ci0gCQlpZiAoIHhtbEZpbGUgPT0gbnVsbCkgewotCQkJb3V0LnByaW50bG4oCi0JCQkiPGgxPk5vIGlucHV0IGZvciB4bWxGaWxlPC9oMT4iKTsKLQkJCXJldHVybjsKLQkJfQkKLQkJaWYgKCB4c2xGaWxlID09IG51bGwpIHsKLQkJCW91dC5wcmludGxuKAotCQkJIjxoMT5ObyBpbnB1dCBmb3IgeHNsRmlsZTwvaDE+Iik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0KLQkJCVRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9Ci0JCQl0RmFjdG9yeS5uZXdUcmFuc2Zvcm1lcihuZXcgU3RyZWFtU291cmNlKHhzbEZpbGUpKTsKLQotICAgIC8vIFNldCB0aGUgc3R5bGVzaGVldCBwYXJhbWV0ZXIgKG5hbWVkIHBhcmFtMSkuCi0JCQl0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIoInBhcmFtMSIsIHBhcmFtVmFsdWUpOwotICAgIC8vIFBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uLgotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBTdHJlYW1Tb3VyY2UoeG1sRmlsZSksCi0JCQkJCSAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQob3V0KSk7Ci0JCX0JCQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CQkJCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJU3lzdGVtLmV4aXQoLTEpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZShvdXQpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zZXJ2bGV0L1hTTFRTZXJ2bGV0V2l0aFBhcmFtcy5qYXZhIGIvc2FtcGxlcy9zZXJ2bGV0L1hTTFRTZXJ2bGV0V2l0aFBhcmFtcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmU3M2Y5Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvc2VydmxldC9YU0xUU2VydmxldFdpdGhQYXJhbXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugc2VydmxldDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lio7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotLyoKLSAqIFRoaXMgc2FtcGxlIHRha2VzIGlucHV0IHBhcmFtZXRlcnMgaW4gdGhlIHJlcXVlc3QgVVJMOiBhIFVSTAotICogcGFyYW1ldGVyIGZvciB0aGUgWE1MIGlucHV0LCBhbiB4c2xVUkwgcGFyYW1ldGVyIGZvciB0aGUgc3R5bGVzaGVldCwKLSAqIGFuZCBvcHRpb25hbCBzdHlsZXNoZWV0IHBhcmFtZXRlcnMuCi0gKiBUbyBydW4gdGhlIGVxdWl2YWxlbnQgb2YgU2ltcGxlc3RYU0xTZXJ2bGV0ICh3aXRoIHRoZSBkb2N1bWVudHMgaW4gdGhlCi0gKiBzZXJ2bGV0IGRvY3VtZW50IHJvb3QgZGlyZWN0b3J5KSwgdGhlIHJlcXVlc3QgVVJMIGlzCi0gKiBodHRwOi8vPHNlcnZlci9zZXJ2bGV0cGF0aD5zZXJ2bGV0LlNpbXBsZVhTTFNlcnZsZXQ/VVJMPWZpbGU6dG9kby54bWwmeHNsVVJMPWZpbGU6dG9kby54c2wKLSAqCi0gKiBVc2luZyBhIHN0eWxlc2hlZXQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbjoKLSAqIElmIHRoZSBYTUwgZG9jdW1lbnQgaW5jbHVkZXMgYSBzdHlsZXNoZWV0IFBJIHRoYXQgeW91IHdhbnQgdG8gdXNlLCAKLSAqIG9taXQgdGhlIHhzbFVSTCBwYXJhbWV0ZXIuCi0gKgotICogU2VuZGluZyBzdHlsZXNoZWV0IHBhcmFtZXRlcnM6IAotICogSWYsIGZvciBleGFtcGxlLCBhIHNlcnZsZXQgdGFrZXMgYSBzdHlsZXNoZWV0IHBhcmFtZXRlciBuYW1lZCBwYXJhbTEKLSAqIHBhcmFtMSB0aGF0IHlvdSB3YW50IHRvIHNldCB0byBmb28sIGluY2x1ZGUgcGFyYW0xPWZvbyBpbiB0aGUgVVJMLgotICovCi0KLXB1YmxpYyBjbGFzcyBYU0xUU2VydmxldFdpdGhQYXJhbXMgZXh0ZW5kcyBIdHRwU2VydmxldCB7Ci0KLSAgcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLmluaXQoY29uZmlnKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvR2V0IChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCi0gICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBPdXRwdXQgZ29lcyBpbiB0aGUgcmVzcG9uc2Ugc3RyZWFtLgotICAgIFByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlciAocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgIC8vIFRoaXMgc2VydmxldCBpcyBpbnRlbmRlZCB0byByZXR1cm4gSFRNTC4KLSAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7ICAgIAotICAgIHRyeQotICAgIHsJCi0gICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIC8vIEdldCBwYXJhbXMgZnJvbSBVUkwuCi0gICAgICBTdHJpbmcgeG1sID0gZ2V0UmVxdWVzdFBhcmFtKHJlcXVlc3QsICJVUkwiKTsKLSAgICAgIFN0cmluZyB4c2wgPSBnZXRSZXF1ZXN0UGFyYW0ocmVxdWVzdCwgInhzbFVSTCIpOwotICAgICAgU291cmNlIHhtbFNvdXJjZSA9IG51bGw7Ci0gICAgICBTb3VyY2UgeHNsU291cmNlID0gbnVsbDsKLSAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gbnVsbDsKLSAgICAgIC8vIEdldCB0aGUgWE1MIGlucHV0IGRvY3VtZW50LgotICAgICAgaWYgKHhtbCAhPSBudWxsICYmIHhtbC5sZW5ndGgoKT4gMCkKLSAgICAgICAgeG1sU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgVVJMKHhtbCkub3BlblN0cmVhbSgpKTsKLSAgICAgIC8vIEdldCB0aGUgc3R5bGVzaGVldC4KLSAgICAgIGlmICh4c2wgIT0gbnVsbCAmJiB4c2wubGVuZ3RoKCk+IDApCi0gICAgICAgIHhzbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UobmV3IFVSTCh4c2wpLm9wZW5TdHJlYW0oKSk7Ci0gICAgICBpZiAoeG1sU291cmNlICE9IG51bGwpIC8vIFdlIGhhdmUgYW4gWE1MIGlucHV0IGRvY3VtZW50LgotICAgICAgewotICAgICAgICBpZiAoeHNsU291cmNlID09IG51bGwpIC8vIElmIG5vIHN0eWxlc2hlZXQsIGxvb2sgZm9yIFBJIGluIFhNTCBpbnB1dCBkb2N1bWVudC4KLSAgICAgICAgewotICAgICAJICAgIFN0cmluZyBtZWRpYT0gbnVsbCAsIHRpdGxlID0gbnVsbCwgY2hhcnNldCA9IG51bGw7Ci0gICAgICAgICAgeHNsU291cmNlID0gdEZhY3RvcnkuZ2V0QXNzb2NpYXRlZFN0eWxlc2hlZXQoeG1sU291cmNlLG1lZGlhLCB0aXRsZSwgY2hhcnNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHhzbFNvdXJjZSAhPSBudWxsKSAvLyBOb3cgZG8gd2UgaGF2ZSBhIHN0eWxlc2hlZXQ/Ci0gICAgICAgIHsKLSAgICAgICAgICB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHhzbFNvdXJjZSk7Ci0gICAgICAgICAgc2V0UGFyYW1ldGVycyh0cmFuc2Zvcm1lciwgcmVxdWVzdCk7IC8vIFNldCBzdHlsZXNoZWV0IHBhcmFtcy4KLSAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oeG1sU291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KG91dCkpOyAvLyBQZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbi4KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgb3V0LndyaXRlKCJObyBTdHlsZXNoZWV0ISIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBvdXQud3JpdGUoIk5vIFhNTCBJbnB1dCBEb2N1bWVudCEiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG91dC53cml0ZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZShvdXQpOyAgICAKLSAgICB9Ci0gICAgb3V0LmNsb3NlKCk7Ci0gIH0KLSAgCi0gIC8vIEdldCBwYXJhbWV0ZXJzIGZyb20gdGhlIHJlcXVlc3QgVVJMLgotICBTdHJpbmcgZ2V0UmVxdWVzdFBhcmFtKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcGFyYW0pCi0gIHsKLQkgIGlmIChyZXF1ZXN0ICE9IG51bGwpIAotICAgIHsgCi0JICAgIFN0cmluZyBwYXJhbVZhbCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKHBhcmFtKTsgCi0JCSAgcmV0dXJuIHBhcmFtVmFsOwotCSAgfQotCSAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8vIFNldCBzdHlsZXNoZWV0IHBhcmFtZXRlcnMgZnJvbSB0aGUgcmVxdWVzdCBVUkwuCi0gIHZvaWQgc2V0UGFyYW1ldGVycyhUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBwYXJhbU5hbWVzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOwotICAgIHdoaWxlIChwYXJhbU5hbWVzLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSAoU3RyaW5nKSBwYXJhbU5hbWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHBhcmFtVmFsID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIocGFyYW1OYW1lKTsKLSAgICAgICAgaWYgKHBhcmFtVmFsICE9IG51bGwpCi0gICAgICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKHBhcmFtTmFtZSwgcGFyYW1WYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICB9ICAKLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvc2VydmxldC9kZWZhdWx0LnhzbCBiL3NhbXBsZXMvc2VydmxldC9kZWZhdWx0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhODVlMC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3NlcnZsZXQvZGVmYXVsdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgRGVmYXVsdCBYU0wgc3R5bGVzaGVldCBmb3IgdXNlIGJ5IGNvbS5sb3R1cy54c2wuc2VydmVyI0RlZmF1bHRBcHBseVhTTC4gICAgICAgLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIFRoaXMgc3R5bGVzaGVldCBtaW1pY3MgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgSUUgd2hlbiBYTUwgZGF0YSBpcyBkaXNwbGF5ZWQgIC0tPgotPCEtLSAgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgWFNMIHN0eWxlc2hlZXQuICBUaGlzIHN0eWxlc2hlZXQgdXNlcyBKYXZhU2NyaXB0ICAgICAgLS0+Ci08IS0tICB0byBhY2NvbW1vZGF0ZSBub2RlIGV4cGFuc2lvbiBhbmQgY29udHJhY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0gICAgICAgICAgICAgICAgCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ibm8iLz4KLTx4c2w6c3RyaXAtc3BhY2UgZWxlbWVudHM9IioiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gIDxIVE1MPgotICAgIDxIRUFEPgotICAgICAgPFNUWUxFIHR5cGU9InRleHQvY3NzIj4KLSAgICAgICAgQk9EWSB7Zm9udDp4LXNtYWxsICdWZXJkYW5hJzsgbWFyZ2luLXJpZ2h0OjEuNWVtfQotICAgICAgPCEtLSBjb250YWluZXIgZm9yIGV4cGFuZGluZy9jb2xsYXBzaW5nIGNvbnRlbnQgLS0+Ci0gICAgICAgIC5jICB7Y3Vyc29yOmhhbmR9Ci0gICAgICA8IS0tIGJ1dHRvbiAtIGNvbnRhaW5zICsvLS9uYnNwIC0tPgotICAgICAgICAuYiAge2NvbG9yOnJlZDsgZm9udC1mYW1pbHk6J0NvdXJpZXIgTmV3JzsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmV9Ci0gICAgICA8IS0tIGVsZW1lbnQgY29udGFpbmVyIC0tPgotICAgICAgICAuZSAge21hcmdpbi1sZWZ0OjFlbTsgdGV4dC1pbmRlbnQ6LTFlbTsgbWFyZ2luLXJpZ2h0OjFlbX0KLSAgICAgIDwhLS0gY29tbWVudCBvciBjZGF0YSAtLT4KLSAgICAgICAgLmsgIHttYXJnaW4tbGVmdDoxZW07IHRleHQtaW5kZW50Oi0xZW07IG1hcmdpbi1yaWdodDoxZW19Ci0gICAgICA8IS0tIHRhZyAtLT4KLSAgICAgICAgLnQgIHtjb2xvcjojOTkwMDAwfQotICAgICAgPCEtLSB0YWcgaW4geHNsIG5hbWVzcGFjZSAtLT4KLSAgICAgICAgLnh0IHtjb2xvcjojOTkwMDk5fQotICAgICAgPCEtLSBhdHRyaWJ1dGUgaW4geG1sIG9yIHhtbG5zIG5hbWVzcGFjZSAtLT4KLSAgICAgICAgLm5zIHtjb2xvcjpyZWR9Ci0gICAgICA8IS0tIG1hcmt1cCBjaGFyYWN0ZXJzIC0tPgotICAgICAgICAubSAge2NvbG9yOmJsdWV9Ci0gICAgICA8IS0tIHRleHQgbm9kZSAtLT4KLSAgICAgICAgLnR4IHtmb250LXdlaWdodDpib2xkfQotICAgICAgPCEtLSBtdWx0aS1saW5lIChibG9jaykgY2RhdGEgLS0+Ci0gICAgICAgIC5kYiB7dGV4dC1pbmRlbnQ6MHB4OyBtYXJnaW4tbGVmdDoxZW07IG1hcmdpbi10b3A6MHB4OyBtYXJnaW4tYm90dG9tOjBweDsKLSAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6LjNlbTsgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNDQ0NDQ0M7IGZvbnQ6c21hbGwgQ291cmllcn0KLSAgICAgIDwhLS0gc2luZ2xlLWxpbmUgKGlubGluZSkgY2RhdGEgLS0+Ci0gICAgICAgIC5kaSB7Zm9udDpzbWFsbCBDb3VyaWVyfQotICAgICAgPCEtLSBET0NUWVBFIGRlY2xhcmF0aW9uIC0tPgotICAgICAgICAuZCAge2NvbG9yOmJsdWV9Ci0gICAgICA8IS0tIHBpIC0tPgotICAgICAgICAucGkge2NvbG9yOmJsdWV9Ci0gICAgICA8IS0tIG11bHRpLWxpbmUgKGJsb2NrKSBjb21tZW50IC0tPgotICAgICAgICAuY2Ige3RleHQtaW5kZW50OjBweDsgbWFyZ2luLWxlZnQ6MWVtOyBtYXJnaW4tdG9wOjBweDsgbWFyZ2luLWJvdHRvbTowcHg7Ci0gICAgICAgICAgICAgcGFkZGluZy1sZWZ0Oi4zZW07IGZvbnQ6c21hbGwgQ291cmllcjsgY29sb3I6Izg4ODg4OH0KLSAgICAgIDwhLS0gc2luZ2xlLWxpbmUgKGlubGluZSkgY29tbWVudCAtLT4KLSAgICAgICAgLmNpIHtmb250OnNtYWxsIENvdXJpZXI7IGNvbG9yOiM4ODg4ODh9Ci0gICAgICAgIFBSRSB7bWFyZ2luOjBweDsgZGlzcGxheTppbmxpbmV9Ci0gICAgICA8L1NUWUxFPgotCi0gICAgICA8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PHhzbDpjb21tZW50PjwhW0NEQVRBWwotICAgICAgICAvLyBEZXRlY3QgYW5kIHN3aXRjaCB0aGUgZGlzcGxheSBvZiBDREFUQSBhbmQgY29tbWVudHMgZnJvbSBhbiBpbmxpbmUgdmlldwotICAgICAgICAvLyAgdG8gYSBibG9jayB2aWV3IGlmIHRoZSBjb21tZW50IG9yIENEQVRBIGlzIG11bHRpLWxpbmUuCi0gICAgICAgIGZ1bmN0aW9uIGYoZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGlmIHRoaXMgZWxlbWVudCBpcyBhbiBpbmxpbmUgY29tbWVudCwgYW5kIGNvbnRhaW5zIG1vcmUgdGhhbiBhIHNpbmdsZQotICAgICAgICAgIC8vICBsaW5lLCB0dXJuIGl0IGludG8gYSBibG9jayBjb21tZW50LgotICAgICAgICAgIGlmIChlLmNsYXNzTmFtZSA9PSAiY2kiKSB7Ci0gICAgICAgICAgICBpZiAoZS5jaGlsZHJlbigwKS5pbm5lclRleHQuaW5kZXhPZigiXG4iKSA+IDApCi0gICAgICAgICAgICAgIGZpeChlLCAiY2IiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gaWYgdGhpcyBlbGVtZW50IGlzIGFuIGlubGluZSBjZGF0YSwgYW5kIGNvbnRhaW5zIG1vcmUgdGhhbiBhIHNpbmdsZQotICAgICAgICAgIC8vICBsaW5lLCB0dXJuIGl0IGludG8gYSBibG9jayBjZGF0YS4KLSAgICAgICAgICBpZiAoZS5jbGFzc05hbWUgPT0gImRpIikgewotICAgICAgICAgICAgaWYgKGUuY2hpbGRyZW4oMCkuaW5uZXJUZXh0LmluZGV4T2YoIlxuIikgPiAwKQotICAgICAgICAgICAgICBmaXgoZSwgImRiIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIC8vIHJlbW92ZSB0aGUgaWQgc2luY2Ugd2Ugb25seSB1c2VkIGl0IGZvciBjbGVhbnVwCi0gICAgICAgICAgZS5pZCA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBGaXggdXAgdGhlIGVsZW1lbnQgYXMgYSAiYmxvY2siIGRpc3BsYXkgYW5kIGVuYWJsZSBleHBhbmQvY29sbGFwc2Ugb24gaXQKLSAgICAgICAgZnVuY3Rpb24gZml4KGUsIGNsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gY2hhbmdlIHRoZSBjbGFzcyBuYW1lIGFuZCBkaXNwbGF5IHZhbHVlCi0gICAgICAgICAgZS5jbGFzc05hbWUgPSBjbDsKLSAgICAgICAgICBlLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwotICAgICAgICAgIAotICAgICAgICAgIC8vIG1hcmsgdGhlIGNvbW1lbnQgb3IgY2RhdGEgZGlzcGxheSBhcyBhIGV4cGFuZGFibGUgY29udGFpbmVyCi0gICAgICAgICAgaiA9IGUucGFyZW50RWxlbWVudC5jaGlsZHJlbigwKTsKLSAgICAgICAgICBqLmNsYXNzTmFtZSA9ICJjIjsKLQotICAgICAgICAgIC8vIGZpbmQgdGhlICsvLSBzeW1ib2wgYW5kIG1ha2UgaXQgdmlzaWJsZSAtIHRoZSBkdW1teSBsaW5rIGVuYWJsZXMgdGFiYmluZwotICAgICAgICAgIGsgPSBqLmNoaWxkcmVuKDApOwotICAgICAgICAgIGsuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKLSAgICAgICAgICBrLmhyZWYgPSAiIyI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGFuZ2UgdGhlICsvLSBzeW1ib2wgYW5kIGhpZGUgdGhlIGNoaWxkcmVuLiAgVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiAiZWxlbWVudCIKLSAgICAgICAgLy8gIGRpc3BsYXlzCi0gICAgICAgIGZ1bmN0aW9uIGNoKGUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBmaW5kIHRoZSArLy0gc3ltYm9sCi0gICAgICAgICAgbWFyayA9IGUuY2hpbGRyZW4oMCkuY2hpbGRyZW4oMCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gaWYgaXQgaXMgYWxyZWFkeSBjb2xsYXBzZWQsIGV4cGFuZCBpdCBieSBzaG93aW5nIHRoZSBjaGlsZHJlbgotICAgICAgICAgIGlmIChtYXJrLmlubmVyVGV4dCA9PSAiKyIpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWFyay5pbm5lclRleHQgPSAiLSI7Ci0gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgIGUuY2hpbGRyZW4oaSkuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIC8vIGlmIGl0IGlzIGV4cGFuZGVkLCBjb2xsYXBzZSBpdCBieSBoaWRpbmcgdGhlIGNoaWxkcmVuCi0gICAgICAgICAgZWxzZSBpZiAobWFyay5pbm5lclRleHQgPT0gIi0iKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hcmsuaW5uZXJUZXh0ID0gIisiOwotICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICBlLmNoaWxkcmVuKGkpLnN0eWxlLmRpc3BsYXk9Im5vbmUiOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQ2hhbmdlIHRoZSArLy0gc3ltYm9sIGFuZCBoaWRlIHRoZSBjaGlsZHJlbi4gIFRoaXMgZnVuY3Rpb24gd29yayBvbiAiY29tbWVudCIKLSAgICAgICAgLy8gIGFuZCAiY2RhdGEiIGRpc3BsYXlzCi0gICAgICAgIGZ1bmN0aW9uIGNoMihlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gZmluZCB0aGUgKy8tIHN5bWJvbCwgYW5kIHRoZSAiUFJFIiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGNvbnRlbnQKLSAgICAgICAgICBtYXJrID0gZS5jaGlsZHJlbigwKS5jaGlsZHJlbigwKTsKLSAgICAgICAgICBjb250ZW50cyA9IGUuY2hpbGRyZW4oMSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gaWYgaXQgaXMgYWxyZWFkeSBjb2xsYXBzZWQsIGV4cGFuZCBpdCBieSBzaG93aW5nIHRoZSBjaGlsZHJlbgotICAgICAgICAgIGlmIChtYXJrLmlubmVyVGV4dCA9PSAiKyIpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWFyay5pbm5lclRleHQgPSAiLSI7Ci0gICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBjb3JyZWN0ICJibG9jayIvImlubGluZSIgZGlzcGxheSB0eXBlIHRvIHRoZSBQUkUKLSAgICAgICAgICAgIGlmIChjb250ZW50cy5jbGFzc05hbWUgPT0gImRiIiB8fCBjb250ZW50cy5jbGFzc05hbWUgPT0gImNiIikKLSAgICAgICAgICAgICAgY29udGVudHMuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7Ci0gICAgICAgICAgICBlbHNlIGNvbnRlbnRzLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gaWYgaXQgaXMgZXhwYW5kZWQsIGNvbGxhcHNlIGl0IGJ5IGhpZGluZyB0aGUgY2hpbGRyZW4KLSAgICAgICAgICBlbHNlIGlmIChtYXJrLmlubmVyVGV4dCA9PSAiLSIpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWFyay5pbm5lclRleHQgPSAiKyI7Ci0gICAgICAgICAgICBjb250ZW50cy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSGFuZGxlIGEgbW91c2UgY2xpY2sKLSAgICAgICAgZnVuY3Rpb24gY2woKQotICAgICAgICB7Ci0gICAgICAgICAgZSA9IHdpbmRvdy5ldmVudC5zcmNFbGVtZW50OwotICAgICAgICAgIAotICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBhcmUgaGFuZGxpbmcgY2xpY2tzIHVwb24gZXhwYW5kYWJsZSBjb250YWluZXIgZWxlbWVudHMKLSAgICAgICAgICBpZiAoZS5jbGFzc05hbWUgIT0gImMiKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGUgPSBlLnBhcmVudEVsZW1lbnQ7Ci0gICAgICAgICAgICBpZiAoZS5jbGFzc05hbWUgIT0gImMiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGUgPSBlLnBhcmVudEVsZW1lbnQ7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gY2FsbCB0aGUgY29ycmVjdCBmdW50aW9uIHRvIGNoYW5nZSB0aGUgY29sbGFwc2UvZXhwYW5kIHN0YXRlIGFuZCBkaXNwbGF5Ci0gICAgICAgICAgaWYgKGUuY2xhc3NOYW1lID09ICJlIikKLSAgICAgICAgICAgIGNoKGUpOwotICAgICAgICAgIGlmIChlLmNsYXNzTmFtZSA9PSAiayIpCi0gICAgICAgICAgICBjaDIoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEVyYXNlIGJvZ3VzIGxpbmsgaW5mbyBmcm9tIHRoZSBzdGF0dXMgd2luZG93Ci0gICAgICAgIGZ1bmN0aW9uIGgoKQotICAgICAgICB7Ci0gICAgICAgICAgd2luZG93LnN0YXR1cz0iICI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIG9uY2xpY2sgaGFuZGxlcgotICAgICAgICBkb2N1bWVudC5vbmNsaWNrID0gY2w7Ci0gICAgICAgIAotICAgICAgXV0+Ly88L3hzbDpjb21tZW50PjwvU0NSSVBUPgotICAgIDwvSEVBRD4KLQotICAgIDxCT0RZIGNsYXNzPSJzdCI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvQk9EWT4KLQotICA8L0hUTUw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBUZW1wbGF0ZXMgZm9yIGVhY2ggbm9kZSB0eXBlIGZvbGxvd3MuICBUaGUgb3V0cHV0IG9mIGVhY2ggdGVtcGxhdGUgaGFzIGEgc2ltaWxhciBzdHJ1Y3R1cmUKLSAgdG8gZW5hYmxlIHNjcmlwdCB0byB3YWxrIHRoZSByZXN1bHQgdHJlZSBlYXNpbHkgZm9yIGhhbmRsaW5nIHVzZXIgaW50ZXJhY3Rpb24uIC0tPgotICAKLTwhLS0gVGVtcGxhdGUgZm9yIHBpcyBub3QgaGFuZGxlZCBlbHNld2hlcmUgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9jZXNzaW5nLWluc3RydWN0aW9uKCkiPgotICA8RElWIGNsYXNzPSJlIj4KLSAgPFNQQU4gY2xhc3M9ImIiPiYjMTYwOzwvU1BBTj4KLSAgPFNQQU4gY2xhc3M9Im0iPiZsdDs/PC9TUEFOPjxTUEFOIGNsYXNzPSJwaSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L1NQQU4+PFNQQU4gY2xhc3M9Im0iPj8mZ3Q7PC9TUEFOPgotICA8L0RJVj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFRlbXBsYXRlIGZvciB0aGUgWE1MIGRlY2xhcmF0aW9uLiAgTmVlZCBhIHNlcGFyYXRlIHRlbXBsYXRlIGJlY2F1c2UgdGhlIHBzZXVkby1hdHRyaWJ1dGVzCi0gICAgYXJlIGFjdHVhbGx5IGV4cG9zZWQgYXMgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIGp1c3QgZWxlbWVudCBjb250ZW50LCBhcyBpbiBvdGhlciBwaXMgCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9jZXNzaW5nLWluc3RydWN0aW9uKCd4bWwnKSI+Ci0gIDxESVYgY2xhc3M9ImUiPgotICA8U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPgotICA8U1BBTiBjbGFzcz0ibSI+Jmx0Oz88L1NQQU4+PFNQQU4gY2xhc3M9InBpIj54bWwgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkAqIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPj0iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4iIDwveHNsOmZvci1lYWNoPjwvU1BBTj48U1BBTiBjbGFzcz0ibSI+PyZndDs8L1NQQU4+Ci0gIDwvRElWPgotPC94c2w6dGVtcGxhdGU+Ci0tLT4KLQotPCEtLSBUZW1wbGF0ZSBmb3IgYXR0cmlidXRlcyBub3QgaGFuZGxlZCBlbHNld2hlcmUgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJAKiI+PFNQQU4gY2xhc3M9InQiPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPjwvU1BBTj48U1BBTiBjbGFzcz0ibSI+PSI8L1NQQU4+PEI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L0I+PFNQQU4gY2xhc3M9Im0iPiI8L1NQQU4+PC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gVGVtcGxhdGUgZm9yIGF0dHJpYnV0ZXMgaW4gdGhlIHhtbG5zIG9yIHhtbCBuYW1lc3BhY2UKLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkB4bWxuczoqfEB4bWxuc3xAeG1sOioiPjxTUEFOIGNsYXNzPSJucyI+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPjxTUEFOIGNsYXNzPSJtIj49IjwvU1BBTj48QiBjbGFzcz0ibnMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9CPjxTUEFOIGNsYXNzPSJtIj4iPC9TUEFOPjwveHNsOnRlbXBsYXRlPgotLS0+Ci0KLTwhLS0gVGVtcGxhdGUgZm9yIHRleHQgbm9kZXMgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0KCkiPgotICA8eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0ibmFtZSguKSA9ICcjY2RhdGEtc2VjdGlvbiciPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjZGF0YSIvPjwveHNsOndoZW4+Ci0gIDx4c2w6b3RoZXJ3aXNlPjxESVYgY2xhc3M9ImUiPgotICA8U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPgotICA8U1BBTiBjbGFzcz0idHgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9TUEFOPgotICA8L0RJVj48L3hzbDpvdGhlcndpc2U+PC94c2w6Y2hvb3NlPgotPC94c2w6dGVtcGxhdGU+Ci0gIAotPCEtLSBUZW1wbGF0ZSBmb3IgY29tbWVudCBub2RlcyAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbW1lbnQoKSI+Ci0gIDxESVYgY2xhc3M9ImsiPgotICA8U1BBTj48QSBjbGFzcz0iYiIgb25jbGljaz0icmV0dXJuIGZhbHNlIiBvbmZvY3VzPSJoKCkiIFNUWUxFPSJ2aXNpYmlsaXR5OmhpZGRlbiI+LTwvQT4gPFNQQU4gY2xhc3M9Im0iPiZsdDshLS08L1NQQU4+PC9TUEFOPgotICA8U1BBTiBpZD0iY2xlYW4iIGNsYXNzPSJjaSI+PFBSRT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvUFJFPjwvU1BBTj4KLSAgPFNQQU4gY2xhc3M9ImIiPiYjMTYwOzwvU1BBTj4gPFNQQU4gY2xhc3M9Im0iPi0tJmd0OzwvU1BBTj4KLSAgPFNDUklQVD5mKGNsZWFuKTs8L1NDUklQVD48L0RJVj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFRlbXBsYXRlIGZvciBjZGF0YSBub2RlcyAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iY2RhdGEiPgotICA8RElWIGNsYXNzPSJrIj4KLSAgPFNQQU4+PEEgY2xhc3M9ImIiIG9uY2xpY2s9InJldHVybiBmYWxzZSIgb25mb2N1cz0iaCgpIiBTVFlMRT0idmlzaWJpbGl0eTpoaWRkZW4iPi08L0E+IDxTUEFOIGNsYXNzPSJtIj4mbHQ7IVtDREFUQVs8L1NQQU4+PC9TUEFOPgotICA8U1BBTiBpZD0iY2xlYW4iIGNsYXNzPSJkaSI+PFBSRT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvUFJFPjwvU1BBTj4KLSAgPFNQQU4gY2xhc3M9ImIiPiYjMTYwOzwvU1BBTj4gPFNQQU4gY2xhc3M9Im0iPl1dJmd0OzwvU1BBTj4KLSAgPFNDUklQVD5mKGNsZWFuKTs8L1NDUklQVD48L0RJVj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFRlbXBsYXRlIGZvciBlbGVtZW50cyBub3QgaGFuZGxlZCBlbHNld2hlcmUgKGxlYWYgbm9kZXMpIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKiI+Ci0gIDxESVYgY2xhc3M9ImUiPjxESVYgU1RZTEU9Im1hcmdpbi1sZWZ0OjFlbTt0ZXh0LWluZGVudDotMmVtIj4KLSAgPFNQQU4gY2xhc3M9ImIiPiYjMTYwOzwvU1BBTj4KLSAgPFNQQU4gY2xhc3M9Im0iPiZsdDs8L1NQQU4+PFNQQU4gY2xhc3M9InQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPiA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIi8+PFNQQU4gY2xhc3M9Im0iPiAvJmd0OzwvU1BBTj4KLSAgPC9ESVY+PC9ESVY+Ci08L3hzbDp0ZW1wbGF0ZT4KLSAgCi08IS0tIFRlbXBsYXRlIGZvciBlbGVtZW50cyB3aXRoIGNvbW1lbnQsIHBpIGFuZC9vciBjZGF0YSBjaGlsZHJlbgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKltjb21tZW50KCkgb3IgcHJvY2Vzc2luZy1pbnN0cnVjdGlvbigpIG9yIGNkYXRhKCldIj4KLSAgPERJViBjbGFzcz0iZSI+Ci0gIDxESVYgY2xhc3M9ImMiPjxBIGhyZWY9IiMiIG9uY2xpY2s9InJldHVybiBmYWxzZSIgb25mb2N1cz0iaCgpIiBjbGFzcz0iYiI+LTwvQT4gPFNQQU4gY2xhc3M9Im0iPiZsdDs8L1NQQU4+PFNQQU4+PHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPjx4c2w6aWYgdGVzdD0ieHNsOioiPng8L3hzbDppZj50PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiLz4gPFNQQU4gY2xhc3M9Im0iPiZndDs8L1NQQU4+PC9ESVY+Ci0gIDxESVY+PHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICA8RElWPjxTUEFOIGNsYXNzPSJiIj4mIzE2MDs8L1NQQU4+IDxTUEFOIGNsYXNzPSJtIj4mbHQ7LzwvU1BBTj48U1BBTj48eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+PHhzbDppZiB0ZXN0PSJ4c2w6KiI+eDwveHNsOmlmPnQ8L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz48L1NQQU4+PFNQQU4gY2xhc3M9Im0iPiZndDs8L1NQQU4+PC9ESVY+Ci0gIDwvRElWPjwvRElWPgotPC94c2w6dGVtcGxhdGU+IC0tPgotCi08IS0tIFRlbXBsYXRlIGZvciBlbGVtZW50cyB3aXRoIG9ubHkgdGV4dCBjaGlsZHJlbiAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IipbdGV4dCgpIGFuZCBub3QoY29tbWVudCgpIG9yIHByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKSBvciAqKV0iPgotICA8RElWIGNsYXNzPSJlIj48RElWIFNUWUxFPSJtYXJnaW4tbGVmdDoxZW07dGV4dC1pbmRlbnQ6LTJlbSI+Ci0gIDxTUEFOIGNsYXNzPSJiIj4mIzE2MDs8L1NQQU4+IDxTUEFOIGNsYXNzPSJtIj4mbHQ7PC9TUEFOPjxTUEFOIGNsYXNzPSJ0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPjwvU1BBTj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIi8+Ci0gIDxTUEFOIGNsYXNzPSJtIj4mZ3Q7PC9TUEFOPjxTUEFOIGNsYXNzPSJ0eCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L1NQQU4+PFNQQU4gY2xhc3M9Im0iPiZsdDsvPC9TUEFOPjxTUEFOIGNsYXNzPSJ0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPjwvU1BBTj48U1BBTiBjbGFzcz0ibSI+Jmd0OzwvU1BBTj4KLSAgPC9ESVY+PC9ESVY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBUZW1wbGF0ZSBmb3IgZWxlbWVudHMgd2l0aCBlbGVtZW50IGNoaWxkcmVuIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKlsqXSI+Ci0gIDxESVYgY2xhc3M9ImUiPgotICA8RElWIGNsYXNzPSJjIiBTVFlMRT0ibWFyZ2luLWxlZnQ6MWVtO3RleHQtaW5kZW50Oi0yZW0iPjxBIGhyZWY9IiMiIG9uY2xpY2s9InJldHVybiBmYWxzZSIgb25mb2N1cz0iaCgpIiBjbGFzcz0iYiI+LTwvQT4gPFNQQU4gY2xhc3M9Im0iPiZsdDs8L1NQQU4+PFNQQU4gY2xhc3M9InQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiLz48U1BBTiBjbGFzcz0ibSI+Jmd0OzwvU1BBTj48L0RJVj4KLSAgPERJVj48eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDxESVY+PFNQQU4gY2xhc3M9ImIiPiYjMTYwOzwvU1BBTj48U1BBTiBjbGFzcz0ibSI+Jmx0Oy88L1NQQU4+PFNQQU4gY2xhc3M9InQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPjxTUEFOIGNsYXNzPSJtIj4mZ3Q7PC9TUEFOPjwvRElWPgotICA8L0RJVj48L0RJVj4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvc2VydmxldC9kZWZhdWx0Mi54c2wgYi9zYW1wbGVzL3NlcnZsZXQvZGVmYXVsdDIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjE5ZjNmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvc2VydmxldC9kZWZhdWx0Mi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgRGVmYXVsdCBYU0wgc3R5bGVzaGVldCBmb3IgdXNlIGJ5IGNvbS5sb3R1cy54c2wuc2VydmVyI0RlZmF1bHRBcHBseVhTTC4gICAgICAgLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIFRoaXMgc3R5bGVzaGVldCBtaW1pY3MgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgSUUgd2hlbiBYTUwgZGF0YSBpcyBkaXNwbGF5ZWQgIC0tPgotPCEtLSAgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgWFNMIHN0eWxlc2hlZXQuICBUaGlzIHN0eWxlc2hlZXQgdXNlcyBubyBKYXZhU2NyaXB0ICAgLS0+Ci08IS0tICBhbmQgZGlzcGxheXMgYWxsIG5vZGVzIGFzIGZ1bGx5IGV4cGFuZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0gICAgICAgICAgICAgICAgCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ibm8iLz4KLTx4c2w6c3RyaXAtc3BhY2UgZWxlbWVudHM9IioiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gIDxIVE1MPgotICAgIDxIRUFEPgotICAgICAgPFNUWUxFIHR5cGU9InRleHQvY3NzIj4KLSAgICAgICAgQk9EWSB7Zm9udDp4LXNtYWxsICdWZXJkYW5hJzsgbWFyZ2luLXJpZ2h0OjEuNWVtfQotICAgICAgPCEtLSBjb250YWluZXIgZm9yIGV4cGFuZGluZy9jb2xsYXBzaW5nIGNvbnRlbnQgLS0+Ci0gICAgICAgIC5jICB7Y3Vyc29yOmhhbmR9Ci0gICAgICA8IS0tIGJ1dHRvbiAtIGNvbnRhaW5zICsvLS9uYnNwIC0tPgotICAgICAgICAuYiAge2NvbG9yOnJlZDsgZm9udC1mYW1pbHk6J0NvdXJpZXIgTmV3JzsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmV9Ci0gICAgICA8IS0tIGVsZW1lbnQgY29udGFpbmVyIC0tPgotICAgICAgICAuZSAge21hcmdpbi1sZWZ0OjFlbTsgdGV4dC1pbmRlbnQ6LTFlbTsgbWFyZ2luLXJpZ2h0OjFlbX0KLSAgICAgIDwhLS0gY29tbWVudCBvciBjZGF0YSAtLT4KLSAgICAgICAgLmsgIHttYXJnaW4tbGVmdDoxZW07IHRleHQtaW5kZW50Oi0xZW07IG1hcmdpbi1yaWdodDoxZW19Ci0gICAgICA8IS0tIHRhZyAtLT4KLSAgICAgICAgLnQgIHtjb2xvcjojOTkwMDAwfQotICAgICAgPCEtLSB0YWcgaW4geHNsIG5hbWVzcGFjZSAtLT4KLSAgICAgICAgLnh0IHtjb2xvcjojOTkwMDk5fQotICAgICAgPCEtLSBhdHRyaWJ1dGUgaW4geG1sIG9yIHhtbG5zIG5hbWVzcGFjZSAtLT4KLSAgICAgICAgLm5zIHtjb2xvcjpyZWR9Ci0gICAgICA8IS0tIG1hcmt1cCBjaGFyYWN0ZXJzIC0tPgotICAgICAgICAubSAge2NvbG9yOmJsdWV9Ci0gICAgICA8IS0tIHRleHQgbm9kZSAtLT4KLSAgICAgICAgLnR4IHtmb250LXdlaWdodDpib2xkfQotICAgICAgPCEtLSBtdWx0aS1saW5lIChibG9jaykgY2RhdGEgLS0+Ci0gICAgICAgIC5kYiB7dGV4dC1pbmRlbnQ6MHB4OyBtYXJnaW4tbGVmdDoxZW07IG1hcmdpbi10b3A6MHB4OyBtYXJnaW4tYm90dG9tOjBweDsKLSAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6LjNlbTsgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNDQ0NDQ0M7IGZvbnQ6c21hbGwgQ291cmllcn0KLSAgICAgIDwhLS0gc2luZ2xlLWxpbmUgKGlubGluZSkgY2RhdGEgLS0+Ci0gICAgICAgIC5kaSB7Zm9udDpzbWFsbCBDb3VyaWVyfQotICAgICAgPCEtLSBET0NUWVBFIGRlY2xhcmF0aW9uIC0tPgotICAgICAgICAuZCAge2NvbG9yOmJsdWV9Ci0gICAgICA8IS0tIHBpIC0tPgotICAgICAgICAucGkge2NvbG9yOmJsdWV9Ci0gICAgICA8IS0tIG11bHRpLWxpbmUgKGJsb2NrKSBjb21tZW50IC0tPgotICAgICAgICAuY2Ige3RleHQtaW5kZW50OjBweDsgbWFyZ2luLWxlZnQ6MWVtOyBtYXJnaW4tdG9wOjBweDsgbWFyZ2luLWJvdHRvbTowcHg7Ci0gICAgICAgICAgICAgcGFkZGluZy1sZWZ0Oi4zZW07IGZvbnQ6c21hbGwgQ291cmllcjsgY29sb3I6Izg4ODg4OH0KLSAgICAgIDwhLS0gc2luZ2xlLWxpbmUgKGlubGluZSkgY29tbWVudCAtLT4KLSAgICAgICAgLmNpIHtmb250OnNtYWxsIENvdXJpZXI7IGNvbG9yOiM4ODg4ODh9Ci0gICAgICAgIFBSRSB7bWFyZ2luOjBweDsgZGlzcGxheTppbmxpbmV9Ci0gICAgICA8L1NUWUxFPgotICAgIDwvSEVBRD4KLQotICAgIDxCT0RZIGNsYXNzPSJzdCI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvQk9EWT4KLQotICA8L0hUTUw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBUZW1wbGF0ZXMgZm9yIGVhY2ggbm9kZSB0eXBlIGZvbGxvd3MuICBUaGUgb3V0cHV0IG9mIGVhY2ggdGVtcGxhdGUgaGFzIGEgc2ltaWxhciBzdHJ1Y3R1cmUKLSAgdG8gZW5hYmxlIHNjcmlwdCB0byB3YWxrIHRoZSByZXN1bHQgdHJlZSBlYXNpbHkgZm9yIGhhbmRsaW5nIHVzZXIgaW50ZXJhY3Rpb24uIC0tPgotICAKLTwhLS0gVGVtcGxhdGUgZm9yIHBpcyBub3QgaGFuZGxlZCBlbHNld2hlcmUgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9jZXNzaW5nLWluc3RydWN0aW9uKCkiPgotICA8RElWIGNsYXNzPSJlIj4KLSAgPFNQQU4gY2xhc3M9ImIiPiYjMTYwOzwvU1BBTj4KLSAgPFNQQU4gY2xhc3M9Im0iPiZsdDs/PC9TUEFOPjxTUEFOIGNsYXNzPSJwaSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L1NQQU4+PFNQQU4gY2xhc3M9Im0iPj8mZ3Q7PC9TUEFOPgotICA8L0RJVj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFRlbXBsYXRlIGZvciB0aGUgWE1MIGRlY2xhcmF0aW9uLiAgTmVlZCBhIHNlcGFyYXRlIHRlbXBsYXRlIGJlY2F1c2UgdGhlIHBzZXVkby1hdHRyaWJ1dGVzCi0gICAgYXJlIGFjdHVhbGx5IGV4cG9zZWQgYXMgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIGp1c3QgZWxlbWVudCBjb250ZW50LCBhcyBpbiBvdGhlciBwaXMgCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9jZXNzaW5nLWluc3RydWN0aW9uKCd4bWwnKSI+Ci0gIDxESVYgY2xhc3M9ImUiPgotICA8U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPgotICA8U1BBTiBjbGFzcz0ibSI+Jmx0Oz88L1NQQU4+PFNQQU4gY2xhc3M9InBpIj54bWwgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkAqIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPj0iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4iIDwveHNsOmZvci1lYWNoPjwvU1BBTj48U1BBTiBjbGFzcz0ibSI+PyZndDs8L1NQQU4+Ci0gIDwvRElWPgotPC94c2w6dGVtcGxhdGU+Ci0tLT4KLQotPCEtLSBUZW1wbGF0ZSBmb3IgYXR0cmlidXRlcyBub3QgaGFuZGxlZCBlbHNld2hlcmUgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJAKiI+PFNQQU4gY2xhc3M9InQiPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPjwvU1BBTj48U1BBTiBjbGFzcz0ibSI+PSI8L1NQQU4+PEI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L0I+PFNQQU4gY2xhc3M9Im0iPiI8L1NQQU4+PC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gVGVtcGxhdGUgZm9yIGF0dHJpYnV0ZXMgaW4gdGhlIHhtbG5zIG9yIHhtbCBuYW1lc3BhY2UKLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkB4bWxuczoqfEB4bWxuc3xAeG1sOioiPjxTUEFOIGNsYXNzPSJucyI+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPjxTUEFOIGNsYXNzPSJtIj49IjwvU1BBTj48QiBjbGFzcz0ibnMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9CPjxTUEFOIGNsYXNzPSJtIj4iPC9TUEFOPjwveHNsOnRlbXBsYXRlPgotLS0+Ci0KLTwhLS0gVGVtcGxhdGUgZm9yIHRleHQgbm9kZXMgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0KCkiPgotICA8eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0ibmFtZSguKSA9ICcjY2RhdGEtc2VjdGlvbiciPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjZGF0YSIvPjwveHNsOndoZW4+Ci0gIDx4c2w6b3RoZXJ3aXNlPjxESVYgY2xhc3M9ImUiPgotICA8U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPgotICA8U1BBTiBjbGFzcz0idHgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9TUEFOPgotICA8L0RJVj48L3hzbDpvdGhlcndpc2U+PC94c2w6Y2hvb3NlPgotPC94c2w6dGVtcGxhdGU+Ci0gIAotPCEtLSBUZW1wbGF0ZSBmb3IgY29tbWVudCBub2RlcyAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbW1lbnQoKSI+Ci0gIDxESVYgY2xhc3M9ImsiPgotICA8U1BBTj48U1BBTiBjbGFzcz0iYiIgU1RZTEU9InZpc2liaWxpdHk6aGlkZGVuIj4tPC9TUEFOPiA8U1BBTiBjbGFzcz0ibSI+Jmx0OyEtLTwvU1BBTj48L1NQQU4+Ci0gIDxTUEFOIGNsYXNzPSJjYiI+PFBSRT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvUFJFPjwvU1BBTj4KLSAgPFNQQU4gY2xhc3M9ImIiPiYjMTYwOzwvU1BBTj4gPFNQQU4gY2xhc3M9Im0iPi0tJmd0OzwvU1BBTj4KLSAgPC9ESVY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBUZW1wbGF0ZSBmb3IgY2RhdGEgbm9kZXMgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImNkYXRhIj4KLSAgPERJViBjbGFzcz0iayI+Ci0gIDxTUEFOPjxTUEFOIGNsYXNzPSJiIiBTVFlMRT0idmlzaWJpbGl0eTpoaWRkZW4iPi08L1NQQU4+IDxTUEFOIGNsYXNzPSJtIj4mbHQ7IVtDREFUQVs8L1NQQU4+PC9TUEFOPgotICA8U1BBTiBjbGFzcz0iZGIiPjxQUkU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L1BSRT48L1NQQU4+Ci0gIDxTUEFOIGNsYXNzPSJiIj4mIzE2MDs8L1NQQU4+IDxTUEFOIGNsYXNzPSJtIj5dXSZndDs8L1NQQU4+Ci0gIDwvRElWPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gVGVtcGxhdGUgZm9yIGVsZW1lbnRzIG5vdCBoYW5kbGVkIGVsc2V3aGVyZSAobGVhZiBub2RlcykgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSIqIj4KLSAgPERJViBjbGFzcz0iZSI+PERJViBTVFlMRT0ibWFyZ2luLWxlZnQ6MWVtO3RleHQtaW5kZW50Oi0yZW0iPgotICA8U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPgotICA8U1BBTiBjbGFzcz0ibSI+Jmx0OzwvU1BBTj48U1BBTiBjbGFzcz0idCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz48L1NQQU4+IDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiLz48U1BBTiBjbGFzcz0ibSI+IC8mZ3Q7PC9TUEFOPgotICA8L0RJVj48L0RJVj4KLTwveHNsOnRlbXBsYXRlPgotICAKLTwhLS0gVGVtcGxhdGUgZm9yIGVsZW1lbnRzIHdpdGggY29tbWVudCwgcGkgYW5kL29yIGNkYXRhIGNoaWxkcmVuCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIqW2NvbW1lbnQoKSBvciBwcm9jZXNzaW5nLWluc3RydWN0aW9uKCkgb3IgY2RhdGEoKV0iPgotICA8RElWIGNsYXNzPSJlIj4KLSAgPERJViBjbGFzcz0iYyI+PEEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuIGZhbHNlIiBvbmZvY3VzPSJoKCkiIGNsYXNzPSJiIj4tPC9BPiA8U1BBTiBjbGFzcz0ibSI+Jmx0OzwvU1BBTj48U1BBTj48eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+PHhzbDppZiB0ZXN0PSJ4c2w6KiI+eDwveHNsOmlmPnQ8L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz48L1NQQU4+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKiIvPiA8U1BBTiBjbGFzcz0ibSI+Jmd0OzwvU1BBTj48L0RJVj4KLSAgPERJVj48eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDxESVY+PFNQQU4gY2xhc3M9ImIiPiYjMTYwOzwvU1BBTj4gPFNQQU4gY2xhc3M9Im0iPiZsdDsvPC9TUEFOPjxTUEFOPjx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj48eHNsOmlmIHRlc3Q9InhzbDoqIj54PC94c2w6aWY+dDwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPjwvU1BBTj48U1BBTiBjbGFzcz0ibSI+Jmd0OzwvU1BBTj48L0RJVj4KLSAgPC9ESVY+PC9ESVY+Ci08L3hzbDp0ZW1wbGF0ZT4gLS0+Ci0KLTwhLS0gVGVtcGxhdGUgZm9yIGVsZW1lbnRzIHdpdGggb25seSB0ZXh0IGNoaWxkcmVuIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKlt0ZXh0KCkgYW5kIG5vdChjb21tZW50KCkgb3IgcHJvY2Vzc2luZy1pbnN0cnVjdGlvbigpIG9yICopXSI+Ci0gIDxESVYgY2xhc3M9ImUiPjxESVYgU1RZTEU9Im1hcmdpbi1sZWZ0OjFlbTt0ZXh0LWluZGVudDotMmVtIj4KLSAgPFNQQU4gY2xhc3M9ImIiPiYjMTYwOzwvU1BBTj4gPFNQQU4gY2xhc3M9Im0iPiZsdDs8L1NQQU4+PFNQQU4gY2xhc3M9InQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiLz4KLSAgPFNQQU4gY2xhc3M9Im0iPiZndDs8L1NQQU4+PFNQQU4gY2xhc3M9InR4Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvU1BBTj48U1BBTiBjbGFzcz0ibSI+Jmx0Oy88L1NQQU4+PFNQQU4gY2xhc3M9InQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPjxTUEFOIGNsYXNzPSJtIj4mZ3Q7PC9TUEFOPgotICA8L0RJVj48L0RJVj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFRlbXBsYXRlIGZvciBlbGVtZW50cyB3aXRoIGVsZW1lbnQgY2hpbGRyZW4gLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSIqWypdIj4KLSAgPERJViBjbGFzcz0iZSI+Ci0gIDxESVYgY2xhc3M9ImMiIFNUWUxFPSJtYXJnaW4tbGVmdDoxZW07dGV4dC1pbmRlbnQ6LTJlbSI+PFNQQU4gY2xhc3M9ImIiPi08L1NQQU4+PFNQQU4gY2xhc3M9Im0iPiZsdDs8L1NQQU4+PFNQQU4gY2xhc3M9InQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiLz4gPFNQQU4gY2xhc3M9Im0iPiZndDs8L1NQQU4+PC9ESVY+Ci0gIDxESVY+PHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICA8RElWPjxTUEFOIGNsYXNzPSJiIj4mIzE2MDs8L1NQQU4+IDxTUEFOIGNsYXNzPSJtIj4mbHQ7LzwvU1BBTj48U1BBTiBjbGFzcz0idCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz48L1NQQU4+PFNQQU4gY2xhc3M9Im0iPiZndDs8L1NQQU4+PC9ESVY+Ci0gIDwvRElWPjwvRElWPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zZXJ2bGV0L2Zvb3BhcmFtLnhtbCBiL3NhbXBsZXMvc2VydmxldC9mb29wYXJhbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYzMyYjUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9zZXJ2bGV0L2Zvb3BhcmFtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08ZG9jPkhlbGxvPC9kb2M+CmRpZmYgLS1naXQgYS9zYW1wbGVzL3NlcnZsZXQvZm9vcGFyYW0ueHNsIGIvc2FtcGxlcy9zZXJ2bGV0L2Zvb3BhcmFtLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2OTFkMS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3NlcnZsZXQvZm9vcGFyYW0ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icGFyYW0xIiBzZWxlY3Q9IidkZWZhdWx0IHZhbHVlJyIvPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2MiPgotICAgIDxodG1sPjxib2R5PjxwPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyYW0xIi8+PC9wPjwvYm9keT48L2h0bWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvc2VydmxldC9tZWRpYS5wcm9wZXJ0aWVzIGIvc2FtcGxlcy9zZXJ2bGV0L21lZGlhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiM2NmNDUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9zZXJ2bGV0L21lZGlhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIFRoaXMgcHJvcGVydHkgZmlsZSBpcyB1c2VkIGJ5IGNvbS5sb3R1cy54c2wuc2VydmVyLkRlZmF1bHRBcHBseVhTTC4KLSMKLSMgRWFjaCBsaW5lIGJlbG93IHNwZWNpZmllcyBhIG1hcHBpbmcgcnVsZSBiZXR3ZWVuIGEgdmFsdWUgY29udGFpbmVkIGluIHRoZSBIVFRQIHJlcXVlc3QncyB1c2VyLUFnZW50IAotIyBmaWVsZCBhbmQgYSB2YWx1ZSB0byBiZSBzY2FubmVkIGZvciBpbiBYU0wgc3R5bGVzaGVldChzKSBhc3NvY2lhdGVkIHdpdGggdGhlIFhNTCBkYXRhLiBUaGlzIG1hcHBpbmcgCi0jIGVuYWJsZXMgcmVsYXRpb25zaGlwcyB0byBiZSBkZWZpbmVkIGJldHdlZW4gY2xpZW50IGNhcGFiaWxpdGllcyBhbmQgc3R5bGVzaGVldHMgY2FwYWJsZSBvZiBhY3RpbmcgCi0jIG9uIHRoZXNlIGNhcGFiaWxpdGllcy4KLSMKLSMgVGhlIHJ1bGVzIGRlZmluZWQgYmVsb3cgYXJlIG9yZGVyLXNpZ25pZmljYW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBmaXJzdCBydWxlIGlzIHVuc3VjY2Vzc2Z1bCwKLSMgdGhlIHNlY29uZCBydWxlIHdpbGwgYmUgdHJpZWQsIGV0Yy4gIFRoZSBtZWRpYSB2YWx1ZSAidW5rbm93biIgd2lsbCBiZSB1c2VkIHdoZW4gbm8gcnVsZXMgYXJlCi0jIHNhdGlzZmllZC4KLSMKLSMgRXhhbXBsZTogCi0jCi0jIE1hcHBpbmcgcnVsZXMgb2YuLi4KLSMKLSMgICBNU0lFPWV4cGxvcmVyCi0jICAgTVNQSUU9cG9ja2V0ZXhwbG9yZXIKLSMKLSMgLi4uYW5kIFhNTCBkYXRhIHRoYXQgY29udGFpbnMgWFNMIHN0eWxlc2hlZXQgYXNzb2NpYXRpb25zIG9mLi4uCi0jCi0jIDw/eG1sLXN0eWxlc2hlZXQgICAgICAgICAgICAgICAgIG1lZGlhPSJleHBsb3JlciIgICAgICAgaHJlZj0iYWxsZGF0YS54c2wiICB0eXBlPSJ0ZXh0L3hzbCI/PgotIyA8P3htbC1zdHlsZXNoZWV0IGFsdGVybmF0ZT0ieWVzIiBtZWRpYT0icG9ja2V0ZXhwbG9yZXIiIGhyZWY9InNvbWVkYXRhLnhzbCIgdHlwZT0idGV4dC94c2wiPz4KLSMKLSMgLi4uYW5kIGFuIEhUVFAgcmVxdWVzdCB0aGF0IGNvbnRhaW5zIGEgdXNlci1BZ2VudCB2YWx1ZSBvZi4uLgotIyAgICAKLSMgICBmb28gTVNQSUUgYmFyCi0jCi0jIC4uLndpbGwgYXBwbHkgdGhlIFhTTCBzdHlsZXNoZWV0IHNvbWVkYXRhLnhzbC4KLSMKLU1TSUU9ZXhwbG9yZXIKLU1TUElFPXBvY2tldGV4cGxvcmVyCi1IYW5kSFRUUD1oYW5kd2ViCi1Nb3ppbGxhPW5ldHNjYXBlCi1MeW54PWx5bngKLU9wZXJhPW9wZXJhCi1KYXZhPWphdmEKLUF2YW50R289YXZhbnRnbwotTm9raWE9bm9raWEKLVVQLkJyb3dzZXI9dXAKLURvQ29Nbz1pbW9kZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zZXJ2bGV0L3JlYWRtZS5odG1sIGIvc2FtcGxlcy9zZXJ2bGV0L3JlYWRtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzg5MzZmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvc2VydmxldC9yZWFkbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPlhhbGFuIFNhbXBsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDI+WGFsYW4gU2FtcGxlczwvaDI+Ci08cD5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNhbXBsZXMgKHdoYXQgdGhleSBpbGx1c3RyYXRlIGFuZCBob3cgdG8gcnVuIHRoZW0pLCBzZWUgPGEgaHJlZj0iLi4vLi4vZG9jcy9zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+LjwvcD4KLQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zYW1wbGVzL3RyYXgvRXhhbXBsZUNvbnRlbnRIYW5kbGVyLmphdmEgYi9zYW1wbGVzL3RyYXgvRXhhbXBsZUNvbnRlbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMzA4ZjQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy90cmF4L0V4YW1wbGVDb250ZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFeGFtcGxlQ29udGVudEhhbmRsZXIgaW1wbGVtZW50cyBDb250ZW50SGFuZGxlcgotewotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IgKExvY2F0b3IgbG9jYXRvcikKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2V0RG9jdW1lbnRMb2NhdG9yIik7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQgKCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0RG9jdW1lbnQiKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZW5kRG9jdW1lbnQiKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nIChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3RhcnRQcmVmaXhNYXBwaW5nOiAiK3ByZWZpeCsiLCAiK3VyaSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcgKFN0cmluZyBwcmVmaXgpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJlbmRQcmVmaXhNYXBwaW5nOiAiK3ByZWZpeCk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCAoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50KCJzdGFydEVsZW1lbnQ6ICIrbmFtZXNwYWNlVVJJKyIsICIrbmFtZXNwYWNlVVJJKwotICAgICAgICAgICAgICAgICAgICAgICAiLCAiK3FOYW1lKTsKLSAgICBpbnQgbiA9IGF0dHMuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50KCIsICIrYXR0cy5nZXRRTmFtZShpKSk7Ci0gICAgfQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQgKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxTmFtZSkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVuZEVsZW1lbnQ6ICIrbmFtZXNwYWNlVVJJKyIsICIrbmFtZXNwYWNlVVJJKwotICAgICAgICAgICAgICAgICAgICAgICAiLCAiK3FOYW1lKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgY2hhcmFjdGVycyAoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGNoLCBzdGFydCwgKGxlbmd0aCA+IDMwKSA/IDMwIDogbGVuZ3RoKTsKLSAgICBpZihsZW5ndGggPiAzMCkKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhcmFjdGVyczogXCIiK3MrIlwiLi4uIik7Ci0gICAgZWxzZQotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaGFyYWN0ZXJzOiBcIiIrcysiXCIiKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSAoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJpZ25vcmFibGVXaGl0ZXNwYWNlIik7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbiAoU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJwcm9jZXNzaW5nSW5zdHJ1Y3Rpb246ICIrdGFyZ2V0KyIsICIrdGFyZ2V0KTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgc2tpcHBlZEVudGl0eSAoU3RyaW5nIG5hbWUpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJza2lwcGVkRW50aXR5OiAiK25hbWUpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJheC9FeGFtcGxlcy5qYXZhIGIvc2FtcGxlcy90cmF4L0V4YW1wbGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZWZlY2MuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy90cmF4L0V4YW1wbGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4Lio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS4qOwotCi0vLyBOZWVkZWQgamF2YSBjbGFzc2VzCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLy8gTmVlZGVkIFNBWCBjbGFzc2VzCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlBhcnNlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlBhcnNlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxGaWx0ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcjsKLQotLy8gTmVlZGVkIERPTSBjbGFzc2VzCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy8gTmVlZGVkIEpBWFAgY2xhc3NlcwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07ICAgIC8vIGRtbAotCi0vKioKLSAqIFNvbWUgZXhhbXBsZXMgdG8gc2hvdyBob3cgdGhlIFNpbXBsZSBBUEkgZm9yIFRyYW5zZm9ybWF0aW9ucwotICogY291bGQgYmUgdXNlZC4KLSAqIAotICogWGFsYW4gRGV2ZWxvcGVyczogcGxlYXNlIHNlZSAKLSAqIHhtbC14YWxhbi90ZXN0L2phdmEvc3JjL29yZy9hcGFjaGUvcWV0ZXN0L3RyYXgvRXhhbXBsZXNUZXN0LmphdmEKLSAqIHdoZW4gdXBkYXRpbmcgdGhpcyBmaWxlLCBhbmQgdXBkYXRlIHRoYXQgdGVzdCBmaWxlIGFzIHdlbGwuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2NvdHRfYm9hZ0Bsb3R1cy5jb20iPlNjb3R0IEJvYWc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFeGFtcGxlcwotewotICAvKioKLSAgICogTWV0aG9kIG1haW4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pCi0gICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuPT09PSBleGFtcGxlU2ltcGxlID09PT0iKTsKLSAgICB0cnkgewotICAgICAgICBleGFtcGxlU2ltcGxlMSgieG1sL2Zvby54bWwiLCAieHNsL2Zvby54c2wiKTsKLSAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7IAotICAgICAgICBoYW5kbGVFeGNlcHRpb24oZXgpOwotICAgIH0gCi0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuPT09PSBleGFtcGxlU2ltcGxlMiA9PT09Iik7Ci0gICAgdHJ5IHsKLSAgICAgICAgZXhhbXBsZVNpbXBsZTIoInhtbC9mb28ueG1sIiwgInhzbC9mb28ueHNsIik7Ci0gICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeyAKLSAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4KTsKLSAgICB9IAotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbj09PT0gZXhhbXBsZUZyb21TdHJlYW0gPT09PSIpOwotICAgIHRyeSB7Ci0gICAgICAgIGV4YW1wbGVGcm9tU3RyZWFtKCJ4bWwvZm9vLnhtbCIsICJ4c2wvZm9vLnhzbCIpOwotICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsgCi0gICAgICAgIGhhbmRsZUV4Y2VwdGlvbihleCk7Ci0gICAgfSAKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG49PT09IGV4YW1wbGVGcm9tUmVhZGVyID09PT0iKTsKLSAgICB0cnkgewotICAgICAgICBleGFtcGxlRnJvbVJlYWRlcigieG1sL2Zvby54bWwiLCAieHNsL2Zvby54c2wiKTsKLSAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7IAotICAgICAgICBoYW5kbGVFeGNlcHRpb24oZXgpOwotICAgIH0gCi0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuPT09PSBleGFtcGxlVXNlVGVtcGxhdGVzT2JqID09PT0iKTsKLSAgICB0cnkgewotICAgICAgICBleGFtcGxlVXNlVGVtcGxhdGVzT2JqKCJ4bWwvZm9vLnhtbCIsICJ4bWwvYmF6LnhtbCIsICJ4c2wvZm9vLnhzbCIpOwotICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsgCi0gICAgICAgIGhhbmRsZUV4Y2VwdGlvbihleCk7Ci0gICAgfSAKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG49PT09IGV4YW1wbGVDb250ZW50SGFuZGxlclRvQ29udGVudEhhbmRsZXIgPT09PSIpOwotICAgIHRyeSB7Ci0gICAgICAgIGV4YW1wbGVDb250ZW50SGFuZGxlclRvQ29udGVudEhhbmRsZXIoInhtbC9mb28ueG1sIiwgInhzbC9mb28ueHNsIik7Ci0gICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeyAKLSAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4KTsKLSAgICB9IAotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbj09PT0gZXhhbXBsZVhNTFJlYWRlciA9PT09Iik7Ci0gICAgdHJ5IHsKLSAgICAgICAgZXhhbXBsZVhNTFJlYWRlcigieG1sL2Zvby54bWwiLCAieHNsL2Zvby54c2wiKTsKLSAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7IAotICAgICAgICBoYW5kbGVFeGNlcHRpb24oZXgpOwotICAgIH0gCi0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuPT09PSBleGFtcGxlWE1MRmlsdGVyID09PT0iKTsKLSAgICB0cnkgewotICAgICAgICBleGFtcGxlWE1MRmlsdGVyKCJ4bWwvZm9vLnhtbCIsICJ4c2wvZm9vLnhzbCIpOwotICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsgCi0gICAgICAgIGhhbmRsZUV4Y2VwdGlvbihleCk7Ci0gICAgfSAKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG49PT09IGV4YW1wbGVYTUxGaWx0ZXJDaGFpbiA9PT09Iik7Ci0gICAgdHJ5IHsKLSAgICAgICAgZXhhbXBsZVhNTEZpbHRlckNoYWluKCJ4bWwvZm9vLnhtbCIsICJ4c2wvZm9vLnhzbCIsICJ4c2wvZm9vMi54c2wiLCAieHNsL2ZvbzMueHNsIik7Ci0gICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeyAKLSAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4KTsKLSAgICB9IAotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbj09PT0gZXhhbXBsZURPTTJET00gPT09PSIpOwotICAgIHRyeSB7Ci0gICAgICAgIGV4YW1wbGVET00yRE9NKCJ4bWwvZm9vLnhtbCIsICJ4c2wvZm9vLnhzbCIpOwotICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsgCi0gICAgICAgIGhhbmRsZUV4Y2VwdGlvbihleCk7Ci0gICAgfSAKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG49PT09IGV4YW1wbGVQYXJhbSA9PT09Iik7Ci0gICAgdHJ5IHsKLSAgICAgICAgZXhhbXBsZVBhcmFtKCJ4bWwvZm9vLnhtbCIsICJ4c2wvZm9vLnhzbCIpOwotICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsgCi0gICAgICAgIGhhbmRsZUV4Y2VwdGlvbihleCk7Ci0gICAgfSAKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG49PT09IGV4YW1wbGVUcmFuc2Zvcm1lclJldXNlID09PT0iKTsKLSAgICB0cnkgewotICAgICAgICBleGFtcGxlVHJhbnNmb3JtZXJSZXVzZSgieG1sL2Zvby54bWwiLCAieHNsL2Zvby54c2wiKTsKLSAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7IAotICAgICAgICBoYW5kbGVFeGNlcHRpb24oZXgpOwotICAgIH0gCi0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuPT09PSBleGFtcGxlT3V0cHV0UHJvcGVydGllcyA9PT09Iik7Ci0gICAgdHJ5IHsKLSAgICAgICAgZXhhbXBsZU91dHB1dFByb3BlcnRpZXMoInhtbC9mb28ueG1sIiwgInhzbC9mb28ueHNsIik7Ci0gICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeyAKLSAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4KTsKLSAgICB9IAotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbj09PT0gZXhhbXBsZVVzZUFzc29jaWF0ZWQgPT09PSIpOwotICAgIHRyeSB7Ci0gICAgICAgIGV4YW1wbGVVc2VBc3NvY2lhdGVkKCJ4bWwvZm9vLnhtbCIpOwotICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsgCi0gICAgICAgIGhhbmRsZUV4Y2VwdGlvbihleCk7Ci0gICAgfSAKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG49PT09IGV4YW1wbGVDb250ZW50SGFuZGxlcjJET00gPT09PSIpOwotICAgIHRyeSB7Ci0gICAgICAgIGV4YW1wbGVDb250ZW50SGFuZGxlcjJET00oInhtbC9mb28ueG1sIiwgInhzbC9mb28ueHNsIik7Ci0gICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeyAKLSAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4KTsKLSAgICB9IAotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbj09PT0gZXhhbXBsZUFzU2VyaWFsaXplciA9PT09Iik7Ci0gICAgdHJ5IHsKLSAgICAgICAgZXhhbXBsZUFzU2VyaWFsaXplcigieG1sL2Zvby54bWwiLCAieHNsL2Zvby54c2wiKTsKLSAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7IAotICAgICAgICBoYW5kbGVFeGNlcHRpb24oZXgpOwotICAgIH0gCi0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuPT09PSBleGFtcGxlQ29udGVudEhhbmRsZXIyRE9NID09PT0iKTsKLSAgICB0cnkgewotICAgICAgICBleGFtcGxlQ29udGVudEhhbmRsZXIyRE9NKCJ4bWwvZm9vLnhtbCIsICJ4c2wvZm9vLnhzbCIpOwotICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsgCi0gICAgICAgIGhhbmRsZUV4Y2VwdGlvbihleCk7Ci0gICAgfSAKLQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG49PT09IGRvbmUhID09PT0iKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNob3cgdGhlIHNpbXBsZXN0IHBvc3NpYmxlIHRyYW5zZm9ybWF0aW9uIGZyb20gc3lzdGVtIGlkIAotICAgKiB0byBvdXRwdXQgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVTaW1wbGUxKFN0cmluZyBzb3VyY2VJRCwgU3RyaW5nIHhzbElEKQotICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgYSB0cmFuc2Zvcm0gZmFjdG9yeSBpbnN0YW5jZS4KLSAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSB0cmFuc2Zvcm1lciBmb3IgdGhlIHN0eWxlc2hlZXQuCi0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgCi0gICAgICA9IHRmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKG5ldyBTdHJlYW1Tb3VyY2UoeHNsSUQpKTsKLSAgICAKLSAgICAvLyBUcmFuc2Zvcm0gdGhlIHNvdXJjZSBYTUwgdG8gU3lzdGVtLm91dC4KLSAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oIG5ldyBTdHJlYW1Tb3VyY2Uoc291cmNlSUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTaG93IHRoZSBzaW1wbGVzdCBwb3NzaWJsZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIEZpbGUgCi0gICAqIHRvIGEgRmlsZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBleGFtcGxlU2ltcGxlMihTdHJpbmcgc291cmNlSUQsIFN0cmluZyB4c2xJRCkKLSAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQ3JlYXRlIGEgdHJhbnNmb3JtIGZhY3RvcnkgaW5zdGFuY2UuCi0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgdHJhbnNmb3JtZXIgZm9yIHRoZSBzdHlsZXNoZWV0LgotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyIAotICAgICAgPSB0ZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcihuZXcgU3RyZWFtU291cmNlKHhzbElEKSk7Ci0gICAgCi0gICAgLy8gVHJhbnNmb3JtIHRoZSBzb3VyY2UgWE1MIHRvIFN5c3RlbS5vdXQuCi0gICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKCBuZXcgU3RyZWFtU291cmNlKG5ldyBGaWxlKHNvdXJjZUlEKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWFtUmVzdWx0KG5ldyBGaWxlKCJmb28ub3V0IikpKTsKLSAgfQotCi0gIAotICAvKioKLSAgICogU2hvdyBzaW1wbGUgdHJhbnNmb3JtYXRpb24gZnJvbSBpbnB1dCBzdHJlYW0gdG8gb3V0cHV0IHN0cmVhbS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBleGFtcGxlRnJvbVN0cmVhbShTdHJpbmcgc291cmNlSUQsIFN0cmluZyB4c2xJRCkKLSAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgYSB0cmFuc2Zvcm0gZmFjdG9yeSBpbnN0YW5jZS4KLSAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgIElucHV0U3RyZWFtIHhzbElTID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSh4c2xJRCkpOwotICAgIFN0cmVhbVNvdXJjZSB4c2xTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhzbElTKTsKLSAgICAvLyBOb3RlIHRoYXQgaWYgd2UgZG9uJ3QgZG8gdGhpcywgcmVsYXRpdmUgVVJMcyBjYW4gbm90IGJlIHJlc29sdmVkIGNvcnJlY3RseSEKLSAgICB4c2xTb3VyY2Uuc2V0U3lzdGVtSWQoeHNsSUQpOwotCi0gICAgLy8gQ3JlYXRlIGEgdHJhbnNmb3JtZXIgZm9yIHRoZSBzdHlsZXNoZWV0LgotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoeHNsU291cmNlKTsKLSAgICAKLSAgICBJbnB1dFN0cmVhbSB4bWxJUyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlSUQpKTsKLSAgICBTdHJlYW1Tb3VyY2UgeG1sU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh4bWxJUyk7Ci0gICAgLy8gTm90ZSB0aGF0IGlmIHdlIGRvbid0IGRvIHRoaXMsIHJlbGF0aXZlIFVSTHMgY2FuIG5vdCBiZSByZXNvbHZlZCBjb3JyZWN0bHkhCi0gICAgeG1sU291cmNlLnNldFN5c3RlbUlkKHNvdXJjZUlEKTsKLSAgICAKLSAgICAvLyBUcmFuc2Zvcm0gdGhlIHNvdXJjZSBYTUwgdG8gU3lzdGVtLm91dC4KLSAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oIHhtbFNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTaG93IHNpbXBsZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIHJlYWRlciB0byBvdXRwdXQgc3RyZWFtLiAgSW4gZ2VuZXJhbCAKLSAgICogdGhpcyB1c2UgY2FzZSBpcyBkaXNjb3VyYWdlZCwgc2luY2UgdGhlIFhNTCBlbmNvZGluZyBjYW4gbm90IGJlIAotICAgKiBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZXhhbXBsZUZyb21SZWFkZXIoU3RyaW5nIHNvdXJjZUlELCBTdHJpbmcgeHNsSUQpCi0gICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQ3JlYXRlIGEgdHJhbnNmb3JtIGZhY3RvcnkgaW5zdGFuY2UuCi0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAvLyBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlIHRoZSBYTUwgZW5jb2RpbmcgY2FuIG5vdCBiZSBwcm9jZXNzZWQhCi0gICAgUmVhZGVyIHhzbFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcih4c2xJRCkpOwotICAgIFN0cmVhbVNvdXJjZSB4c2xTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhzbFJlYWRlcik7Ci0gICAgLy8gTm90ZSB0aGF0IGlmIHdlIGRvbid0IGRvIHRoaXMsIHJlbGF0aXZlIFVSTHMgY2FuIG5vdCBiZSByZXNvbHZlZCBjb3JyZWN0bHkhCi0gICAgeHNsU291cmNlLnNldFN5c3RlbUlkKHhzbElEKTsKLQotICAgIC8vIENyZWF0ZSBhIHRyYW5zZm9ybWVyIGZvciB0aGUgc3R5bGVzaGVldC4KLSAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHhzbFNvdXJjZSk7Ci0gICAgCi0gICAgLy8gTm90ZSB0aGF0IGluIHRoaXMgY2FzZSB0aGUgWE1MIGVuY29kaW5nIGNhbiBub3QgYmUgcHJvY2Vzc2VkIQotICAgIFJlYWRlciB4bWxSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoc291cmNlSUQpKTsKLSAgICBTdHJlYW1Tb3VyY2UgeG1sU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh4bWxSZWFkZXIpOwotICAgIC8vIE5vdGUgdGhhdCBpZiB3ZSBkb24ndCBkbyB0aGlzLCByZWxhdGl2ZSBVUkxzIGNhbiBub3QgYmUgcmVzb2x2ZWQgY29ycmVjdGx5IQotICAgIHhtbFNvdXJjZS5zZXRTeXN0ZW1JZChzb3VyY2VJRCk7Ci0gICAgCi0gICAgLy8gVHJhbnNmb3JtIHRoZSBzb3VyY2UgWE1MIHRvIFN5c3RlbS5vdXQuCi0gICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKCB4bWxTb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCkpOwotICB9Ci0KLQotIAotICAvKioKLSAgICogU2hvdyB0aGUgc2ltcGxlc3QgcG9zc2libGUgdHJhbnNmb3JtYXRpb24gZnJvbSBzeXN0ZW0gaWQgdG8gb3V0cHV0IHN0cmVhbS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBleGFtcGxlVXNlVGVtcGxhdGVzT2JqKFN0cmluZyBzb3VyY2VJRDEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUlEMiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgeHNsSUQpCi0gICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotCi0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgdGVtcGxhdGVzIG9iamVjdCwgd2hpY2ggaXMgdGhlIHByb2Nlc3NlZCwgCi0gICAgLy8gdGhyZWFkLXNhZmUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0eWxlc2hlZXQuCi0gICAgVGVtcGxhdGVzIHRlbXBsYXRlcyA9IHRmYWN0b3J5Lm5ld1RlbXBsYXRlcyhuZXcgU3RyZWFtU291cmNlKHhzbElEKSk7Ci0KLSAgICAvLyBJbGx1c3RyYXRlIHRoZSBmYWN0IHRoYXQgeW91IGNhbiBtYWtlIG11bHRpcGxlIHRyYW5zZm9ybWVycyAKLSAgICAvLyBmcm9tIHRoZSBzYW1lIHRlbXBsYXRlLgotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyMSA9IHRlbXBsYXRlcy5uZXdUcmFuc2Zvcm1lcigpOwotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyMiA9IHRlbXBsYXRlcy5uZXdUcmFuc2Zvcm1lcigpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbi0tLS0tIHRyYW5zZm9ybSBvZiAiK3NvdXJjZUlEMSsiIC0tLS0tIik7Ci0gICAgCi0gICAgdHJhbnNmb3JtZXIxLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKHNvdXJjZUlEMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCkpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbi0tLS0tIHRyYW5zZm9ybSBvZiAiK3NvdXJjZUlEMisiIC0tLS0tIik7Ci0gICAgCi0gICAgdHJhbnNmb3JtZXIyLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKHNvdXJjZUlEMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCkpOwotICB9Ci0gIAotCi0KLSAgLyoqCi0gICAqIFNob3cgdGhlIFRyYW5zZm9ybWVyIHVzaW5nIFNBWCBldmVudHMgaW4gYW5kIFNBWCBldmVudHMgb3V0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVDb250ZW50SGFuZGxlclRvQ29udGVudEhhbmRsZXIoU3RyaW5nIHNvdXJjZUlELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHhzbElEKQotICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgCi0gICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgCi0gICAgICAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgLy8gRG9lcyB0aGlzIGZhY3Rvcnkgc3VwcG9ydCBTQVggZmVhdHVyZXM/Ci0gICAgaWYgKHRmYWN0b3J5LmdldEZlYXR1cmUoU0FYU291cmNlLkZFQVRVUkUpKQotICAgIHsKLSAgICAgIC8vIElmIHNvLCB3ZSBjYW4gc2FmZWx5IGNhc3QuCi0gICAgICBTQVhUcmFuc2Zvcm1lckZhY3Rvcnkgc3RmYWN0b3J5ID0gKChTQVhUcmFuc2Zvcm1lckZhY3RvcnkpIHRmYWN0b3J5KTsKLSAgICAgIAotICAgICAgLy8gQSBUcmFuc2Zvcm1lckhhbmRsZXIgaXMgYSBDb250ZW50SGFuZGxlciB0aGF0IHdpbGwgbGlzdGVuIGZvciAKLSAgICAgIC8vIFNBWCBldmVudHMsIGFuZCB0cmFuc2Zvcm0gdGhlbSB0byB0aGUgcmVzdWx0LgotICAgICAgVHJhbnNmb3JtZXJIYW5kbGVyIGhhbmRsZXIgCi0gICAgICAgID0gc3RmYWN0b3J5Lm5ld1RyYW5zZm9ybWVySGFuZGxlcihuZXcgU3RyZWFtU291cmNlKHhzbElEKSk7Ci0KLSAgICAgIC8vIFNldCB0aGUgcmVzdWx0IGhhbmRsaW5nIHRvIGJlIGEgc2VyaWFsaXphdGlvbiB0byBTeXN0ZW0ub3V0LgotICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTQVhSZXN1bHQobmV3IEV4YW1wbGVDb250ZW50SGFuZGxlcigpKTsKLSAgICAgIGhhbmRsZXIuc2V0UmVzdWx0KHJlc3VsdCk7Ci0gICAgICAKLSAgICAgIC8vIENyZWF0ZSBhIHJlYWRlciwgYW5kIHNldCBpdCdzIGNvbnRlbnQgaGFuZGxlciB0byBiZSB0aGUgVHJhbnNmb3JtZXJIYW5kbGVyLgotICAgICAgWE1MUmVhZGVyIHJlYWRlcj1udWxsOwotCi0gICAgICAvLyBVc2UgSkFYUDEuMSAoIGlmIHBvc3NpYmxlICkKLSAgICAgIHRyeSB7Ci0JICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5IGZhY3Rvcnk9Ci0JICAgICAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCSAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSggdHJ1ZSApOwotCSAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyIGpheHBQYXJzZXI9Ci0JICAgICAgZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkgIHJlYWRlcj1qYXhwUGFyc2VyLmdldFhNTFJlYWRlcigpOwotCSAgCi0gICAgICB9IGNhdGNoKCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4ICkgewotCSAgdGhyb3cgbmV3IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiggZXggKTsKLSAgICAgIH0gY2F0Y2goIGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZXgxICkgewotCSAgdGhyb3cgbmV3IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiggZXgxLnRvU3RyaW5nKCkgKTsKLSAgICAgIH0gY2F0Y2goIE5vU3VjaE1ldGhvZEVycm9yIGV4MiApIHsKLSAgICAgIH0KLSAgICAgIGlmKCByZWFkZXI9PW51bGwgKSByZWFkZXIgPSBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigpOwotICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOwotICAgICAgCi0gICAgICAvLyBJdCdzIGEgZ29vZCBpZGVhIGZvciB0aGUgcGFyc2VyIHRvIHNlbmQgbGV4aWNhbCBldmVudHMuCi0gICAgICAvLyBUaGUgVHJhbnNmb3JtZXJIYW5kbGVyIGlzIGFsc28gYSBMZXhpY2FsSGFuZGxlci4KLSAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgaGFuZGxlcik7Ci0gICAgICAKLSAgICAgIC8vIFBhcnNlIHRoZSBzb3VyY2UgWE1MLCBhbmQgc2VuZCB0aGUgcGFyc2UgZXZlbnRzIHRvIHRoZSBUcmFuc2Zvcm1lckhhbmRsZXIuCi0gICAgICByZWFkZXIucGFyc2Uoc291cmNlSUQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAiQ2FuJ3QgZG8gZXhhbXBsZUNvbnRlbnRIYW5kbGVyVG9Db250ZW50SGFuZGxlciBiZWNhdXNlIHRmYWN0b3J5IGlzIG5vdCBhIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSIpOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIFNob3cgdGhlIFRyYW5zZm9ybWVyIGFzIGEgU0FYMiBYTUxSZWFkZXIuICBBbiBYTUxGaWx0ZXIgb2J0YWluZWQgCi0gICAqIGZyb20gbmV3WE1MRmlsdGVyIHNob3VsZCBhY3QgYXMgYSB0cmFuc2Zvcm1pbmcgWE1MUmVhZGVyIGlmIHNldFBhcmVudCBpcyBub3QKLSAgICogY2FsbGVkLiAgSW50ZXJuYWxseSwgYW4gWE1MUmVhZGVyIGlzIGNyZWF0ZWQgYXMgdGhlIHBhcmVudCBmb3IgdGhlIFhNTEZpbHRlci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBleGFtcGxlWE1MUmVhZGVyKFN0cmluZyBzb3VyY2VJRCwgU3RyaW5nIHhzbElEKQotICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uICAgIC8vICwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgaWYodGZhY3RvcnkuZ2V0RmVhdHVyZShTQVhTb3VyY2UuRkVBVFVSRSkpCi0gICAgewotICAgICAgWE1MUmVhZGVyIHJlYWRlciAKLSAgICAgICAgPSAoKFNBWFRyYW5zZm9ybWVyRmFjdG9yeSkgdGZhY3RvcnkpLm5ld1hNTEZpbHRlcihuZXcgU3RyZWFtU291cmNlKHhzbElEKSk7Ci0gICAgICAKLSAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgRXhhbXBsZUNvbnRlbnRIYW5kbGVyKCkpOwotCi0gICAgICByZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKHNvdXJjZUlEKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGZhY3RvcnkgZG9lcyBub3Qgc3VwcG9ydCBTQVggZmVhdHVyZXMhIik7Ci0gIH0KLQotICAvKioKLSAgICogU2hvdyB0aGUgVHJhbnNmb3JtZXIgYXMgYSBzaW1wbGUgWE1MRmlsdGVyLiAgVGhpcyBpcyBwcmV0dHkgc2ltaWxhcgotICAgKiB0byBleGFtcGxlWE1MUmVhZGVyLCBleGNlcHQgdGhhdCBoZXJlIHRoZSBwYXJlbnQgWE1MUmVhZGVyIGlzIGNyZWF0ZWQgCi0gICAqIGJ5IHRoZSBjYWxsZXIsIGluc3RlYWQgb2YgYXV0b21hdGljYWxseSB3aXRoaW4gdGhlIFhNTEZpbHRlci4gIFRoaXMgCi0gICAqIGdpdmVzIHRoZSBjYWxsZXIgbW9yZSBkaXJlY3QgY29udHJvbCBvdmVyIHRoZSBwYXJlbnQgcmVhZGVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVYTUxGaWx0ZXIoU3RyaW5nIHNvdXJjZUlELCBTdHJpbmcgeHNsSUQpCi0gICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gICAgLy8gLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgIFhNTFJlYWRlciByZWFkZXI9bnVsbDsKLSAgICAKLSAgICAvLyBVc2UgSkFYUDEuMSAoIGlmIHBvc3NpYmxlICkKLSAgICB0cnkgewotCWphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeT0KLQkgICAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCSAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSggdHJ1ZSApOwotCSAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyIGpheHBQYXJzZXI9Ci0JICAgIGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JcmVhZGVyPWpheHBQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0JCi0gICAgfSBjYXRjaCggamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleCApIHsKLQl0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKCBleCApOwotICAgIH0gY2F0Y2goIGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZXgxICkgewotCXRocm93IG5ldyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24oIGV4MS50b1N0cmluZygpICk7Ci0gICAgfSBjYXRjaCggTm9TdWNoTWV0aG9kRXJyb3IgZXgyICkgewotICAgIH0KLSAgICBpZiggcmVhZGVyPT1udWxsICkgcmVhZGVyID0gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKLSAgICAvLyBUaGUgdHJhbnNmb3JtZXIgd2lsbCB1c2UgYSBTQVggcGFyc2VyIGFzIGl0J3MgcmVhZGVyLiAgICAKLSAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IEV4YW1wbGVDb250ZW50SGFuZGxlcigpKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9keW5hbWljIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKQotICAgIHsKLQotICAgICAgLy8gV2hhdCBjYW4gd2UgZG8/Ci0gICAgICAvLyBUT0RPOiBVc2VyIGRpYWdub3N0aWNzLgotICAgIH0KLQotICAgIFhNTEZpbHRlciBmaWx0ZXIgCi0gICAgICA9ICgoU0FYVHJhbnNmb3JtZXJGYWN0b3J5KSB0ZmFjdG9yeSkubmV3WE1MRmlsdGVyKG5ldyBTdHJlYW1Tb3VyY2UoeHNsSUQpKTsKLQotICAgIGZpbHRlci5zZXRQYXJlbnQocmVhZGVyKTsKLQotICAgIC8vIE5vdywgd2hlbiB5b3UgY2FsbCB0cmFuc2Zvcm1lci5wYXJzZSwgaXQgd2lsbCBzZXQgaXRzZWxmIGFzIAotICAgIC8vIHRoZSBjb250ZW50IGhhbmRsZXIgZm9yIHRoZSBwYXJzZXIgb2JqZWN0IChpdCdzICJwYXJlbnQiKSwgYW5kIAotICAgIC8vIHdpbGwgdGhlbiBjYWxsIHRoZSBwYXJzZSBtZXRob2Qgb24gdGhlIHBhcnNlci4KLSAgICBmaWx0ZXIucGFyc2UobmV3IElucHV0U291cmNlKHNvdXJjZUlEKSk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBjaGFpbiBldmVudHMgZnJvbSBvbmUgVHJhbnNmb3JtZXIKLSAgICogdG8gYW5vdGhlciB0cmFuc2Zvcm1lciwgdXNpbmcgdGhlIFRyYW5zZm9ybWVyIGFzIGEKLSAgICogU0FYMiBYTUxGaWx0ZXIvWE1MUmVhZGVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVYTUxGaWx0ZXJDaGFpbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlSUQsIFN0cmluZyB4c2xJRF8xLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgeHNsSURfMiwgU3RyaW5nIHhzbElEXzMpCi0gICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIAotICAgIFRlbXBsYXRlcyBzdHlsZXNoZWV0MSA9IHRmYWN0b3J5Lm5ld1RlbXBsYXRlcyhuZXcgU3RyZWFtU291cmNlKHhzbElEXzEpKTsKLSAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcjEgPSBzdHlsZXNoZWV0MS5uZXdUcmFuc2Zvcm1lcigpOwotICAgIAotICAgICAvLyBJZiBvbmUgc3VjY2VzcywgYXNzdW1lIGFsbCB3aWxsIHN1Y2NlZWQuCi0gICAgaWYgKHRmYWN0b3J5LmdldEZlYXR1cmUoU0FYU291cmNlLkZFQVRVUkUpKQotICAgIHsKLSAgICAgIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSBzdGYgPSAoU0FYVHJhbnNmb3JtZXJGYWN0b3J5KXRmYWN0b3J5OwotICAgICAgWE1MUmVhZGVyIHJlYWRlcj1udWxsOwotCi0gICAgICAvLyBVc2UgSkFYUDEuMSAoIGlmIHBvc3NpYmxlICkKLSAgICAgIHRyeSB7Ci0JICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5IGZhY3Rvcnk9Ci0JICAgICAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCSAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSggdHJ1ZSApOwotCSAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyIGpheHBQYXJzZXI9Ci0JICAgICAgZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkgIHJlYWRlcj1qYXhwUGFyc2VyLmdldFhNTFJlYWRlcigpOwotCSAgCi0gICAgICB9IGNhdGNoKCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4ICkgewotCSAgdGhyb3cgbmV3IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiggZXggKTsKLSAgICAgIH0gY2F0Y2goIGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZXgxICkgewotCSAgdGhyb3cgbmV3IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiggZXgxLnRvU3RyaW5nKCkgKTsKLSAgICAgIH0gY2F0Y2goIE5vU3VjaE1ldGhvZEVycm9yIGV4MiApIHsKLSAgICAgIH0KLSAgICAgIGlmKCByZWFkZXI9PW51bGwgKSByZWFkZXIgPSBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigpOwotCi0gICAgICBYTUxGaWx0ZXIgZmlsdGVyMSA9IHN0Zi5uZXdYTUxGaWx0ZXIobmV3IFN0cmVhbVNvdXJjZSh4c2xJRF8xKSk7Ci0gICAgICBYTUxGaWx0ZXIgZmlsdGVyMiA9IHN0Zi5uZXdYTUxGaWx0ZXIobmV3IFN0cmVhbVNvdXJjZSh4c2xJRF8yKSk7Ci0gICAgICBYTUxGaWx0ZXIgZmlsdGVyMyA9IHN0Zi5uZXdYTUxGaWx0ZXIobmV3IFN0cmVhbVNvdXJjZSh4c2xJRF8zKSk7Ci0KLSAgICAgIGlmIChudWxsICE9IGZpbHRlcjEpIC8vIElmIG9uZSBzdWNjZXNzLCBhc3N1bWUgYWxsIHdlcmUgc3VjY2Vzcy4KLSAgICAgIHsKLSAgICAgICAgLy8gdHJhbnNmb3JtZXIxIHdpbGwgdXNlIGEgU0FYIHBhcnNlciBhcyBpdCdzIHJlYWRlci4gICAgCi0gICAgICAgIGZpbHRlcjEuc2V0UGFyZW50KHJlYWRlcik7Ci0KLSAgICAgICAgLy8gdHJhbnNmb3JtZXIyIHdpbGwgdXNlIHRyYW5zZm9ybWVyMSBhcyBpdCdzIHJlYWRlci4KLSAgICAgICAgZmlsdGVyMi5zZXRQYXJlbnQoZmlsdGVyMSk7Ci0KLSAgICAgICAgLy8gdHJhbnNmb3JtMyB3aWxsIHVzZSB0cmFuc2Zvcm0yIGFzIGl0J3MgcmVhZGVyLgotICAgICAgICBmaWx0ZXIzLnNldFBhcmVudChmaWx0ZXIyKTsKLQotICAgICAgICBmaWx0ZXIzLnNldENvbnRlbnRIYW5kbGVyKG5ldyBFeGFtcGxlQ29udGVudEhhbmRsZXIoKSk7Ci0gICAgICAgIC8vIGZpbHRlcjMuc2V0Q29udGVudEhhbmRsZXIobmV3IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIoKSk7Ci0KLSAgICAgICAgLy8gTm93LCB3aGVuIHlvdSBjYWxsIHRyYW5zZm9ybWVyMyB0byBwYXJzZSwgaXQgd2lsbCBzZXQgIAotICAgICAgICAvLyBpdHNlbGYgYXMgdGhlIENvbnRlbnRIYW5kbGVyIGZvciB0cmFuc2Zvcm0yLCBhbmQgCi0gICAgICAgIC8vIGNhbGwgdHJhbnNmb3JtMi5wYXJzZSwgd2hpY2ggd2lsbCBzZXQgaXRzZWxmIGFzIHRoZSAKLSAgICAgICAgLy8gY29udGVudCBoYW5kbGVyIGZvciB0cmFuc2Zvcm0xLCBhbmQgY2FsbCB0cmFuc2Zvcm0xLnBhcnNlLCAKLSAgICAgICAgLy8gd2hpY2ggd2lsbCBzZXQgaXRzZWxmIGFzIHRoZSBjb250ZW50IGxpc3RlbmVyIGZvciB0aGUgCi0gICAgICAgIC8vIFNBWCBwYXJzZXIsIGFuZCBjYWxsIHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoInhtbC9mb28ueG1sIikpLgotICAgICAgICBmaWx0ZXIzLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShzb3VyY2VJRCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZG8gZXhhbXBsZVhNTEZpbHRlciBiZWNhdXNlICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidGZhY3RvcnkgZG9lc24ndCBzdXBwb3J0IGFzWE1MRmlsdGVyKCkiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZG8gZXhhbXBsZVhNTEZpbHRlciBiZWNhdXNlICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgInRmYWN0b3J5IGlzIG5vdCBhIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTaG93IGhvdyB0byB0cmFuc2Zvcm0gYSBET00gdHJlZSBpbnRvIGFub3RoZXIgRE9NIHRyZWUuCi0gICAqIFRoaXMgdXNlcyB0aGUgamF2YXgueG1sLnBhcnNlcnMgdG8gcGFyc2UgYW4gWE1MIGZpbGUgaW50byBhCi0gICAqIERPTSwgYW5kIGNyZWF0ZSBhbiBvdXRwdXQgRE9NLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBOb2RlIGV4YW1wbGVET00yRE9NKFN0cmluZyBzb3VyY2VJRCwgU3RyaW5nIHhzbElEKQotICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgaWYgKHRmYWN0b3J5LmdldEZlYXR1cmUoRE9NU291cmNlLkZFQVRVUkUpKQotICAgIHsKLSAgICAgIFRlbXBsYXRlcyB0ZW1wbGF0ZXM7Ci0KLSAgICAgIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkZmFjdG9yeSA9Ci0gICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY0J1aWxkZXIgPSBkZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgb3V0Tm9kZSA9IGRvY0J1aWxkZXIubmV3RG9jdW1lbnQoKTsKLSAgICAgICAgTm9kZSBkb2MgPSBkb2NCdWlsZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZSh4c2xJRCkpOwotIAotICAgICAgICBET01Tb3VyY2UgZHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jKTsKLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlIHRyYW5zZm9ybWVyIHdvbid0IGtub3cgaG93IHRvIAotICAgICAgICAvLyByZXNvbHZlIHJlbGF0aXZlIFVSTHMgaW4gdGhlIHN0eWxlc2hlZXQuCi0gICAgICAgIGRzb3VyY2Uuc2V0U3lzdGVtSWQoeHNsSUQpOwotCi0gICAgICAgIHRlbXBsYXRlcyA9IHRmYWN0b3J5Lm5ld1RlbXBsYXRlcyhkc291cmNlKTsKLSAgICAgIH0KLQotICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0ZW1wbGF0ZXMubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgb3V0Tm9kZSA9IGRvY0J1aWxkZXIubmV3RG9jdW1lbnQoKTsKLSAgICAgIE5vZGUgZG9jID0gZG9jQnVpbGRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2Uoc291cmNlSUQpKTsKLQotICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jKSwgbmV3IERPTVJlc3VsdChvdXROb2RlKSk7Ci0gICAgICAKLSAgICAgIFRyYW5zZm9ybWVyIHNlcmlhbGl6ZXIgPSB0ZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgc2VyaWFsaXplci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShvdXROb2RlKSwgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7Ci0KLSAgICAgIHJldHVybiBvdXROb2RlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhyb3cgbmV3IG9yZy54bWwuc2F4Ci0gICAgICAgIC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIkRPTSBub2RlIHByb2Nlc3Npbmcgbm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0gIH0gCi0KLSAgLyoqCi0gICAqIFRoaXMgc2hvd3MgaG93IHRvIHNldCBhIHBhcmFtZXRlciBmb3IgdXNlIGJ5IHRoZSB0ZW1wbGF0ZXMuIFVzZSAKLSAgICogdHdvIHRyYW5zZm9ybWVycyB0byBzaG93IHRoYXQgZGlmZmVyZW50IHBhcmFtZXRlcnMgbWF5IGJlIHNldCAKLSAgICogb24gZGlmZmVyZW50IHRyYW5zZm9ybWVycy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBleGFtcGxlUGFyYW0oU3RyaW5nIHNvdXJjZUlELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgeHNsSUQpCi0gICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIFRlbXBsYXRlcyB0ZW1wbGF0ZXMgPSB0ZmFjdG9yeS5uZXdUZW1wbGF0ZXMobmV3IFN0cmVhbVNvdXJjZSh4c2xJRCkpOwotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyMSA9IHRlbXBsYXRlcy5uZXdUcmFuc2Zvcm1lcigpOwotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyMiA9IHRlbXBsYXRlcy5uZXdUcmFuc2Zvcm1lcigpOwotCi0gICAgdHJhbnNmb3JtZXIxLnNldFBhcmFtZXRlcigiYS1wYXJhbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVsbG8gdG8geW91ISIpOwotICAgIHRyYW5zZm9ybWVyMS50cmFuc2Zvcm0obmV3IFN0cmVhbVNvdXJjZShzb3VyY2VJRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWFtUmVzdWx0KFN5c3RlbS5vdXQpKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuPT09PT09PT09Iik7Ci0gICAgCi0gICAgdHJhbnNmb3JtZXIyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0gICAgdHJhbnNmb3JtZXIyLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKHNvdXJjZUlEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCkpOwotICB9Ci0gIAotICAvKioKLSAgICogU2hvdyB0aGUgdGhhdCBhIHRyYW5zZm9ybWVyIGNhbiBiZSByZXVzZWQsIGFuZCBzaG93IHJlc2V0dGluZyAKLSAgICogYSBwYXJhbWV0ZXIgb24gdGhlIHRyYW5zZm9ybWVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVUcmFuc2Zvcm1lclJldXNlKFN0cmluZyBzb3VyY2VJRCwgU3RyaW5nIHhzbElEKQotICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgYSB0cmFuc2Zvcm0gZmFjdG9yeSBpbnN0YW5jZS4KLSAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSB0cmFuc2Zvcm1lciBmb3IgdGhlIHN0eWxlc2hlZXQuCi0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgCi0gICAgICA9IHRmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKG5ldyBTdHJlYW1Tb3VyY2UoeHNsSUQpKTsKLSAgICAKLSAgICB0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIoImEtcGFyYW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlbGxvIHRvIHlvdSEiKTsKLSAgICAKLSAgICAvLyBUcmFuc2Zvcm0gdGhlIHNvdXJjZSBYTUwgdG8gU3lzdGVtLm91dC4KLSAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oIG5ldyBTdHJlYW1Tb3VyY2Uoc291cmNlSUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7Ci0KLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuPT09PT09PT09XG4iKTsKLQotICAgIHRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcigiYS1wYXJhbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVsbG8gdG8gbWUhIik7Ci0gICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLQotICAgIC8vIFRyYW5zZm9ybSB0aGUgc291cmNlIFhNTCB0byBTeXN0ZW0ub3V0LgotICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSggbmV3IFN0cmVhbVNvdXJjZShzb3VyY2VJRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWFtUmVzdWx0KFN5c3RlbS5vdXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBTaG93IGhvdyB0byBvdmVycmlkZSBvdXRwdXQgcHJvcGVydGllcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBleGFtcGxlT3V0cHV0UHJvcGVydGllcyhTdHJpbmcgc291cmNlSUQsIFN0cmluZyB4c2xJRCkKLSAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0KLSAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBUZW1wbGF0ZXMgdGVtcGxhdGVzID0gdGZhY3RvcnkubmV3VGVtcGxhdGVzKG5ldyBTdHJlYW1Tb3VyY2UoeHNsSUQpKTsKLSAgICBQcm9wZXJ0aWVzIG9wcm9wcyA9IHRlbXBsYXRlcy5nZXRPdXRwdXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICBvcHJvcHMucHV0KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0KLSAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRlbXBsYXRlcy5uZXdUcmFuc2Zvcm1lcigpOwotCi0gICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydGllcyhvcHJvcHMpOwotICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKHNvdXJjZUlEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7Ci0gIH0KLQotICAvKioKLSAgICogU2hvdyBob3cgdG8gZ2V0IHN0eWxlc2hlZXRzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCi0gICAqIHhtbCBkb2N1bWVudCB2aWEgdGhlIHhtbC1zdHlsZXNoZWV0IFBJIChzZWUgaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQvKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBleGFtcGxlVXNlQXNzb2NpYXRlZChTdHJpbmcgc291cmNlSUQpCi0gICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgLy8gVGhlIERPTSB0ZmFjdG9yeSB3aWxsIGhhdmUgaXQncyBvd24gd2F5LCBiYXNlZCBvbiBET00yLCAKLSAgICAvLyBvZiBnZXR0aW5nIGFzc29jaWF0ZWQgc3R5bGVzaGVldHMuCi0gICAgaWYgKHRmYWN0b3J5IGluc3RhbmNlb2YgU0FYVHJhbnNmb3JtZXJGYWN0b3J5KQotICAgIHsKLSAgICAgIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSBzdGYgPSAoKFNBWFRyYW5zZm9ybWVyRmFjdG9yeSkgdGZhY3RvcnkpOwotICAgICAgU291cmNlIHNvdXJjZXMgPQotICAgICAgICBzdGYuZ2V0QXNzb2NpYXRlZFN0eWxlc2hlZXQobmV3IFN0cmVhbVNvdXJjZShzb3VyY2VJRCksCi0gICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgIGlmKG51bGwgIT0gc291cmNlcykKLSAgICAgIHsKLSAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0ZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcihzb3VyY2VzKTsKLQotICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IFN0cmVhbVNvdXJjZShzb3VyY2VJRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWFtUmVzdWx0KFN5c3RlbS5vdXQpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYW4ndCBmaW5kIHRoZSBhc3NvY2lhdGVkIHN0eWxlc2hlZXQhIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogU2hvdyB0aGUgVHJhbnNmb3JtZXIgdXNpbmcgU0FYIGV2ZW50cyBpbiBhbmQgRE9NIG5vZGVzIG91dC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBleGFtcGxlQ29udGVudEhhbmRsZXIyRE9NKFN0cmluZyBzb3VyY2VJRCwgU3RyaW5nIHhzbElEKQotICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGUgdHJhbnNmb3JtZXIgZmFjdG9yeSB3ZSBvYnRhaW5lZCBzdXBwb3J0cyBib3RoCi0gICAgLy8gRE9NIGFuZCBTQVguCi0gICAgaWYgKHRmYWN0b3J5LmdldEZlYXR1cmUoU0FYU291cmNlLkZFQVRVUkUpCi0gICAgICAgICYmIHRmYWN0b3J5LmdldEZlYXR1cmUoRE9NU291cmNlLkZFQVRVUkUpKQotICAgIHsKLSAgICAgIC8vIFdlIGNhbiBub3cgc2FmZWx5IGNhc3QgdG8gYSBTQVhUcmFuc2Zvcm1lckZhY3RvcnkuCi0gICAgICBTQVhUcmFuc2Zvcm1lckZhY3Rvcnkgc2ZhY3RvcnkgPSAoU0FYVHJhbnNmb3JtZXJGYWN0b3J5KSB0ZmFjdG9yeTsKLSAgICAgIAotICAgICAgLy8gQ3JlYXRlIGFuIERvY3VtZW50IG5vZGUgYXMgdGhlIHJvb3QgZm9yIHRoZSBvdXRwdXQuCi0gICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRmYWN0b3J5IAotICAgICAgICA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gZGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBvdXROb2RlID0gZG9jQnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgCi0gICAgICAvLyBDcmVhdGUgYSBDb250ZW50SGFuZGxlciB0aGF0IGNhbiBsaXN0b24gdG8gU0FYIGV2ZW50cyAKLSAgICAgIC8vIGFuZCB0cmFuc2Zvcm0gdGhlIG91dHB1dCB0byBET00gbm9kZXMuCi0gICAgICBUcmFuc2Zvcm1lckhhbmRsZXIgaGFuZGxlciAKLSAgICAgICAgPSBzZmFjdG9yeS5uZXdUcmFuc2Zvcm1lckhhbmRsZXIobmV3IFN0cmVhbVNvdXJjZSh4c2xJRCkpOwotICAgICAgaGFuZGxlci5zZXRSZXN1bHQobmV3IERPTVJlc3VsdChvdXROb2RlKSk7Ci0gICAgICAKLSAgICAgIC8vIENyZWF0ZSBhIHJlYWRlciBhbmQgc2V0IGl0J3MgQ29udGVudEhhbmRsZXIgdG8gYmUgdGhlIAotICAgICAgLy8gdHJhbnNmb3JtZXIuCi0gICAgICBYTUxSZWFkZXIgcmVhZGVyPW51bGw7Ci0KLSAgICAgIC8vIFVzZSBKQVhQMS4xICggaWYgcG9zc2libGUgKQotICAgICAgdHJ5IHsKLQkgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeT0KLQkgICAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKCB0cnVlICk7Ci0JICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIgamF4cFBhcnNlcj0KLQkgICAgICBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCSAgcmVhZGVyPWpheHBQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0JICAKLSAgICAgIH0gY2F0Y2goIGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXggKSB7Ci0JICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKCBleCApOwotICAgICAgfSBjYXRjaCggamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBleDEgKSB7Ci0JICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKCBleDEudG9TdHJpbmcoKSApOwotICAgICAgfSBjYXRjaCggTm9TdWNoTWV0aG9kRXJyb3IgZXgyICkgewotICAgICAgfQotICAgICAgaWYoIHJlYWRlcj09bnVsbCApIHJlYWRlcj0gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKLSAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKLSAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKTsKLSAgICAgIAotICAgICAgLy8gU2VuZCB0aGUgU0FYIGV2ZW50cyBmcm9tIHRoZSBwYXJzZXIgdG8gdGhlIHRyYW5zZm9ybWVyLAotICAgICAgLy8gYW5kIHRodXMgdG8gdGhlIERPTSB0cmVlLgotICAgICAgcmVhZGVyLnBhcnNlKHNvdXJjZUlEKTsKLSAgICAgIAotICAgICAgLy8gU2VyaWFsaXplIHRoZSBub2RlIGZvciBkaWFnbm9zaXMuCi0gICAgICBleGFtcGxlU2VyaWFsaXplTm9kZShvdXROb2RlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgIkNhbid0IGRvIGV4YW1wbGVDb250ZW50SGFuZGxlclRvQ29udGVudEhhbmRsZXIgYmVjYXVzZSB0ZmFjdG9yeSBpcyBub3QgYSBTQVhUcmFuc2Zvcm1lckZhY3RvcnkiKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXJpYWxpemUgYSBub2RlIHRvIFN5c3RlbS5vdXQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZXhhbXBsZVNlcmlhbGl6ZU5vZGUoTm9kZSBub2RlKQotICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOyAKLSAgICAKLSAgICAvLyBUaGlzIGNyZWF0ZXMgYSB0cmFuc2Zvcm1lciB0aGF0IGRvZXMgYSBzaW1wbGUgaWRlbnRpdHkgdHJhbnNmb3JtLCAKLSAgICAvLyBhbmQgdGh1cyBjYW4gYmUgdXNlZCBmb3IgYWxsIGludGVudHMgYW5kIHB1cnBvc2VzIGFzIGEgc2VyaWFsaXplci4KLSAgICBUcmFuc2Zvcm1lciBzZXJpYWxpemVyID0gdGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAKLSAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0gICAgc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAieWVzIik7Ci0gICAgc2VyaWFsaXplci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShub2RlKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIEEgZnVsbGVyIGV4YW1wbGUgc2hvd2luZyBob3cgdGhlIFRyQVggaW50ZXJmYWNlIGNhbiBiZSB1c2VkIAotICAgKiB0byBzZXJpYWxpemUgYSBET00gdHJlZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBleGFtcGxlQXNTZXJpYWxpemVyKFN0cmluZyBzb3VyY2VJRCwgU3RyaW5nIHhzbElEKQotICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgRG9jdW1lbnRCdWlsZGVyIGRvY0J1aWxkZXIgPSBkZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBvdXROb2RlID0gZG9jQnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgIE5vZGUgZG9jID0gZG9jQnVpbGRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2Uoc291cmNlSUQpKTsKLQotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOyAKLSAgICAKLSAgICAvLyBUaGlzIGNyZWF0ZXMgYSB0cmFuc2Zvcm1lciB0aGF0IGRvZXMgYSBzaW1wbGUgaWRlbnRpdHkgdHJhbnNmb3JtLCAKLSAgICAvLyBhbmQgdGh1cyBjYW4gYmUgdXNlZCBmb3IgYWxsIGludGVudHMgYW5kIHB1cnBvc2VzIGFzIGEgc2VyaWFsaXplci4KLSAgICBUcmFuc2Zvcm1lciBzZXJpYWxpemVyID0gdGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAKLSAgICBQcm9wZXJ0aWVzIG9wcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgb3Byb3BzLnB1dCgibWV0aG9kIiwgImh0bWwiKTsKLSAgICBvcHJvcHMucHV0KCJpbmRlbnQtYW1vdW50IiwgIjIiKTsKLSAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnRpZXMob3Byb3BzKTsKLSAgICBzZXJpYWxpemVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvYyksIAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCkpOwotICB9Ci0gIAotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgIGhhbmRsZUV4Y2VwdGlvbiggRXhjZXB0aW9uIGV4ICkgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRVhDRVBUSU9OOiAiICk7Ci0gICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgCi0gICAgaWYoIGV4IGluc3RhbmNlb2YgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uICkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVybmFsIGV4Y2VwdGlvbjogIiApOwotICAgICAgVGhyb3dhYmxlIGV4MT0oKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbilleCkuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICBleDEucHJpbnRTdGFja1RyYWNlKCk7Ci0KLSAgICAgIGlmKCBleDEgaW5zdGFuY2VvZiBTQVhFeGNlcHRpb24gKSB7Ci0JICBFeGNlcHRpb24gZXgyPSgoU0FYRXhjZXB0aW9uKWV4MSkuZ2V0RXhjZXB0aW9uKCk7Ci0JICBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVybmFsIHN1Yi1leGNlcHRpb246ICIgKTsKLQkgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmF4L3htbC9iYXoueG1sIGIvc2FtcGxlcy90cmF4L3htbC9iYXoueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWNmNDczLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvdHJheC94bWwvYmF6LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08Zm9vOmRvY3VtZW50IAotCQkgIHhtbG5zOmZvbz0iaHR0cDovL2FwYWNoZS5vcmcvZm9vIgotCQkgIHhtbG5zOmJhcj0iaHR0cDovL2FwYWNoZS5vcmcvYmFyIj4KLTxiYXI6ZWxlbWVudD5NeUJhejwvYmFyOmVsZW1lbnQ+Ci08L2Zvbzpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL3RyYXgveG1sL2Zvby54bWwgYi9zYW1wbGVzL3RyYXgveG1sL2Zvby54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NTk3YWIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy90cmF4L3htbC9mb28ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIuLi94c2wvZm9vLnhzbCI/PgotPGZvbzpkb2N1bWVudCAKLQkJICB4bWxuczpmb289Imh0dHA6Ly9hcGFjaGUub3JnL2ZvbyIKLQkJICB4bWxuczpiYXI9Imh0dHA6Ly9hcGFjaGUub3JnL2JhciIKLQkJICBmaWxlLW5hbWU9InRlc3QiCi0gICAgICAgICBmaWxlLXBhdGg9IndvcmsiCi0JCSAgY3JlYXRpb24tZGF0ZT0iOTcxMjU1NjkyMDc4Ij4KLTxiYXI6ZWxlbWVudD5NeUJhcjwvYmFyOmVsZW1lbnQ+Ci08L2Zvbzpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL3RyYXgveG1sL3N1YmRpcjEvZm9vMi54bWwgYi9zYW1wbGVzL3RyYXgveG1sL3N1YmRpcjEvZm9vMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDhhZTQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy90cmF4L3htbC9zdWJkaXIxL2ZvbzIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTxkb2M+dGV4dCBpbiBmb28yLnhtbDwvZG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJheC94bWwvc3ViZGlyMS9zdWJkaXIyL2ZvbzMueG1sIGIvc2FtcGxlcy90cmF4L3htbC9zdWJkaXIxL3N1YmRpcjIvZm9vMy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZGExZjAuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy90cmF4L3htbC9zdWJkaXIxL3N1YmRpcjIvZm9vMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPGRvYz50ZXh0IGluIGZvbzMueG1sPC9kb2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmF4L3hzbC9iYXoueHNsIGIvc2FtcGxlcy90cmF4L3hzbC9iYXoueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0M2IzLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvdHJheC94c2wvYmF6LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCAKLSAgICAgIHhtbG5zOnhzbD0naHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJyB2ZXJzaW9uPScxLjAnPgotICAgIAotICA8IS0tIHNhbWUgYXMgZm9vLnhzbCBidXQgZG9lc24ndCBpbmNsdWRlIHRoZSBwYXJhbSBiZWNhdXNlIG9mIGEgYnVnIC0tPiAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDxvdXQ+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC9vdXQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAgICAgCi0gIDx4c2w6dGVtcGxhdGUgCi0gICAgICBtYXRjaD0iQCp8Knx0ZXh0KCl8cHJvY2Vzc2luZy1pbnN0cnVjdGlvbigpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAKLSAgICAgICAgIHNlbGVjdD0iQCp8Knx0ZXh0KCl8cHJvY2Vzc2luZy1pbnN0cnVjdGlvbigpIi8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJheC94c2wvZm9vLnhzbCBiL3NhbXBsZXMvdHJheC94c2wvZm9vLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzYjk0NS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RyYXgveHNsL2Zvby54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgCi0gICAgICB4bWxuczp4c2w9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybScgdmVyc2lvbj0nMS4wJwotICAgICAgeG1sbnM6YmFyPSJodHRwOi8vYXBhY2hlLm9yZy9iYXIiCi0gICAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0iYmFyIj4KLSAgICAgIAotICA8eHNsOmluY2x1ZGUgaHJlZj0iaW5jMS9pbmMxLnhzbCIvPgotICAgICAgCi0gIDx4c2w6cGFyYW0gbmFtZT0iYS1wYXJhbSI+ZGVmYXVsdCBwYXJhbSB2YWx1ZTwveHNsOnBhcmFtPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYmFyOmVsZW1lbnQiPgotICAgIDxiYXI+Ci0gICAgICA8cGFyYW0tdmFsPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGEtcGFyYW0iLz48eHNsOnRleHQ+LCA8L3hzbDp0ZXh0PgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG15LXZhciIvPgotICAgICAgPC9wYXJhbS12YWw+Ci0gICAgICA8ZGF0YT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9kYXRhPgotICAgIDwvYmFyPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAgIAotICA8eHNsOnRlbXBsYXRlIAotICAgICAgbWF0Y2g9IkAqfCp8dGV4dCgpfHByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgCi0gICAgICAgICBzZWxlY3Q9IkAqfCp8dGV4dCgpfHByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL3RyYXgveHNsL2ZvbzIueHNsIGIvc2FtcGxlcy90cmF4L3hzbC9mb28yLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0ZjVmMC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RyYXgveHNsL2ZvbzIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+IAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0gICAgICAgICAgICAgICAgeG1sbnM6YmFyPSJodHRwOi8vYXBhY2hlLm9yZy9iYXIiPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYmFyIj4KLSAgICA8b3V0PgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KLSAgICA8L291dD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0KCkiPgotICA8L3hzbDp0ZW1wbGF0ZT4gIAotIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJheC94c2wvZm9vMy54c2wgYi9zYW1wbGVzL3RyYXgveHNsL2ZvbzMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWJmNDJhLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvdHJheC94c2wvZm9vMy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJvdXQiPgotICAgIDxvdXQ+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC9vdXQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGV4dCgpIj4KLSAgICA8c29tZS10ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9zb21lLXRleHQ+Ci0gIDwveHNsOnRlbXBsYXRlPiAgCi0gICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL3RyYXgveHNsL2luYzEvaW5jMS54c2wgYi9zYW1wbGVzL3RyYXgveHNsL2luYzEvaW5jMS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZWJiMjUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy90cmF4L3hzbC9pbmMxL2luYzEueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgCi0gICAgICB4bWxuczp4c2w9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybScgdmVyc2lvbj0nMS4wJz4KLSAgICAgIAotICA8eHNsOmluY2x1ZGUgaHJlZj0iaW5jMi9pbmMyLnhzbCIvPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmF4L3hzbC9pbmMxL2luYzIvaW5jMi54c2wgYi9zYW1wbGVzL3RyYXgveHNsL2luYzEvaW5jMi9pbmMyLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY3MjhlYi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RyYXgveHNsL2luYzEvaW5jMi9pbmMyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0IAotICAgICAgeG1sbnM6eHNsPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0nIHZlcnNpb249JzEuMCc+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0ibXktdmFyIiBzZWxlY3Q9Iid0ZXh0IGZyb20gbXktdmFyIGluIGluYzIueHNsJyIvPgotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdHJheC90cmF4LnByb3BlcnRpZXMgYi9zcmMvdHJheC90cmF4LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OTNjMzkuLjAwMDAwMDAKLS0tIGEvc3JjL3RyYXgvdHJheC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyAkUmV2aXNpb24kICREYXRlJAotIwotIyBOb3RlOiBUaGlzIHByb3BlcnRpZXMgZmlsZSBpcyBwcm92aWRlZCBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzCi0jICAgICAgIG9ubHkgYW5kIGlzIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSMgICAgICAgVGhpcyBwcm9wZXJ0aWVzIGZpbGUgaXMgbG9jYXRlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gSkFSCi0jICAgICAgIGFuZCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIHdpbGwgc3BlY2lmeSBkaWZmZXJlbnQKLSMgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBhbmQgb3V0cHV0IG1ldGhvZHMuCi0jCi0KLSMgVGhlIFRSYVggU3R5bGVzaGVldCBwcm9jZXNzb3IKLXRyYXgucHJvY2Vzc29yLnhzbHQ9b3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuU3R5bGVzaGVldFByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvdG9kby54bWwgYi90b2RvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkZTBmOC4uMDAwMDAwMAotLS0gYS90b2RvLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHRvZG8gdGl0bGU9IlRoaW5ncyBUbyBEbyIgcHJvamVjdD0iWGFsYW4iIG1ham9yLXZlcnNpb249IjIiPgotCi0gPGRldnM+Ci0gIDwhLS0gaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBieSBsYXN0IG5hbWUgLS0+Ci0gIDxwZXJzb24gbmFtZT0iU2NvdHQgQm9hZyIgZW1haWw9InNjb3R0X2JvYWdAbG90dXMuY29tIiBpZD0iU0IiIGV4cGVydGlzZT0iY29kZSI+Ci0gICAgWGFsYW4gYXJjaGl0ZWN0LCBsZWFkIGRldmVsb3BlciBvbiBYYWxhbi1KIDIueC4KLSAgPC9wZXJzb24+Ci0gIDxwZXJzb24gbmFtZT0iU2hhbmUgQ3VyY3VydSIgZW1haWw9IlNoYW5lX0N1cmN1cnVAbG90dXMuY29tIiBpZD0iU0MiIGV4cGVydGlzZT0idGVzdCI+Ci0gICAgTGVhZCB0ZXN0ZXIgZm9yIEFQSSBpc3N1ZXMsIGF1dG9tYXRpb24gZnJhbWV3b3JrLgotICA8L3BlcnNvbj4KLSAgPHBlcnNvbiBuYW1lPSJQYXVsIERpY2siIGVtYWlsPSJQYXVsX0RpY2tAbG90dXMuY29tIiBpZD0iUEQiIGV4cGVydGlzZT0idGVzdCI+Ci0gICAgWFNMVCBDb25mb3JtYW5jZSBzdHlsZXNoZWV0IGlzc3VlcyBhbmQgWGFsYW4tQyB0ZXN0aW5nLgotICA8L3BlcnNvbj4KLSAgPHBlcnNvbiBuYW1lPSJKb3NlcGggS2Vzc2VsbWFuIiBlbWFpbD0iSm9zZXBoX0tlc3NlbG1hbkBsb3R1cy5jb20iIGlkPSJKSyIgZXhwZXJ0aXNlPSJjb2RlIj4KLSAgICBYYWxhbi1KIDIueCBkZXZlbG9wZXIsIGNvbXBpbGluZy9jb21waWxlZCBzdHlsZXNoZWV0cyBleHBlcmltZW50cy4KLSAgPC9wZXJzb24+Ci0gIDxwZXJzb24gbmFtZT0iRG9uYWxkIExlc2xpZSIgZW1haWw9ImRvbmFsZF9sZXNsaWVAbG90dXMuY29tIiBpZD0iREwiIGV4cGVydGlzZT0iZG9jIj4KLSAgICBYYWxhbi1KIGFuZCAtQyBkb2N1bWVudGF0aW9uLCBzZXJ2bGV0cyBhbmQgc2FtcGxlcy4KLSAgPC9wZXJzb24+Ci0gIDxwZXJzb24gbmFtZT0iQ29zdGluIE1hbm9sYWNoZSIgZW1haWw9ImNtYW5vbGFjaGVAeWFob28uY29tIiBpZD0iQ00iPgotICAgIFhhbGFuLUogMi54IGRldmVsb3Blci4KLSAgPC9wZXJzb24+Ci0gIDxwZXJzb24gbmFtZT0iRGF2aWQgTWFyc3RvbiIgZW1haWw9IkRhdmlkX01hcnN0b25AbG90dXMuY29tIiBpZD0iRE0iIGV4cGVydGlzZT0idGVzdCI+Ci0gICAgTGVhZCB0ZXN0ZXIgZm9yIFhTTFQgQ29uZm9ybWFuY2Ugc3R5bGVzaGVldCBpc3N1ZXMuCi0gIDwvcGVyc29uPgotICA8cGVyc29uIG5hbWU9Ik15cmlhbSBNaWR5IiBlbWFpbD0ibXlyaWFtX21pZHlAbG90dXMuY29tIiBpZD0iTU0iIGV4cGVydGlzZT0iY29kZSI+Ci0gICAgWGFsYW4tSiAxLnggYW5kIDIueCBkZXZlbG9wZXIuCi0gIDwvcGVyc29uPgotICA8cGVyc29uIG5hbWU9IkdhcnkgTCBQZXNraW4iIGVtYWlsPSJnYXJ5cEBmaXJzdGVjaC5jb20iIGlkPSJHUCIgZXhwZXJ0aXNlPSJjb2RlIj4KLSAgICBYYWxhbi1KIDEueCBhbmQgMi54IGRldmVsb3BlciwgZXNwZWNpYWxseSBleHRlbnNpb24gbWVjaGFuaXNpbS4KLSAgPC9wZXJzb24+Ci0KLSA8L2RldnM+Ci0KLSA8YWN0aW9ucz4KLQotICAgPHRhcmdldC1yZWxlYXNlLWRlc2NyaXB0aW9uPgotICAgIDxkYXRlPjAxLzE5LzAxPC9kYXRlPgotICAgIDxsZXZlbD5wcm9kdWN0aW9uPC9sZXZlbD4KLSAgICA8Z29hbCB0eXBlPSJjb25mb3JtYW5jZSI+WFNMVCAxLjAgYW5kIFhQYXRoIDEuMCBjb21wbGlhbnQsIDk5JSBjb25mb3JtYW5jZSB0ZXN0IHBhc3NhZ2UuPC9nb2FsPgotICAgIDxnb2FsIHR5cGU9InBlcmZvcm1hbmNlIj5SZWFzb25hYmxlLCBjb21wZXRhdGl2ZSBwZXJmb3JtYW5jZS4gW25lZWQgbWV0cmljc108L2dvYWw+Ci0gICAgPGdvYWwgdHlwZT0ic3RhYmlsaXR5Ij5Sb2J1c3QuPC9nb2FsPgotICAgIDxnb2FsIHR5cGU9ImFwaSI+QVBJIENvbXBsZXRlLjwvZ29hbD4KLSAgICA8Z29hbCB0eXBlPSJkb2N1bWVudGF0aW9uIj5Eb2N1bWVudGF0aW9uIGNvbXBsZXRlLjwvZ29hbD4KLSAgIDwvdGFyZ2V0LXJlbGVhc2UtZGVzY3JpcHRpb24+Ci0KLSAgPCEtLSBNb3ZlIHRvIGNvbXBsZXRlZCBzZWN0aW9uIHdoZW4gZG9uZS4gLS0+Ci0gICAgICAgICAgICAKLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9InJlbGVhc2UiPgotICAgICAgTm8ga25vd24gYWN0aW9ucyBwZW5kaW5nIGZvciAyLjAuMCByZWxlYXNlLgotICAgPC9hY3Rpb24+Ci0gIAotIDwvYWN0aW9ucz4KLQotIDxhY3Rpb25zIHByaW9yaXR5PSJsb25nLXRlcm0iID4KLSAgPCEtLSBNb3ZlIHRvIGNvbXBsZXRlZCBzZWN0aW9uIHdoZW4gZG9uZS4gLS0+Ci0KLSAgIDx0YXJnZXQtcmVsZWFzZS1kZXNjcmlwdGlvbj4KLSAgICA8ZGF0ZT40LzE1LzAxPC9kYXRlPgotICAgIDxsZXZlbD5iZXRhPC9sZXZlbD4KLSAgICA8Z29hbCB0eXBlPSJjb25mb3JtYW5jZSI+WFNMVCAxLjEgYW5kIFhQYXRoIDEuMCthZGRlbmR1bSBjb21wbGlhbnQsIDEwMCUgY29uZm9ybWFuY2UgdGVzdCBwYXNzYWdlLjwvZ29hbD4KLSAgICA8Z29hbCB0eXBlPSJwZXJmb3JtYW5jZSI+VmVyeSBnb29kIHBlcmZvcm1hbmNlLiBbbmVlZCBtZXRyaWNzXTwvZ29hbD4KLSAgICA8Z29hbCB0eXBlPSJzdGFiaWxpdHkiPlN0YWJsZSwgcmVhc29uYWJsZS48L2dvYWw+Ci0gICAgPGdvYWwgdHlwZT0iYXBpIj5BUEkgQ29tcGxldGUuPC9nb2FsPgotICAgIDxnb2FsIHR5cGU9ImRvY3VtZW50YXRpb24iPkRvY3VtZW50YXRpb24gZnVuY3Rpb25hbGx5IGNvbXBsZXRlLjwvZ29hbD4KLSAgIDwvdGFyZ2V0LXJlbGVhc2UtZGVzY3JpcHRpb24+Ci0gICAKLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImNvbmZvcm1hbmNlIiB3aG89IkdQIj4KLSAgICAgIFZlcmlmeSB0aGF0IHRoZSByZWNvbXBvc2luZyBwcm9jZWR1cmUgZm9yIGVhY2ggb2YgdGhlIHJlY29tcG9zYWJsZQotICAgICAgZWxlbWVudHMgbWF0Y2hlcyB0aGUgc3RhbmRhcmQgKGluY2x1ZGluZyBlcnJhdGEpLgotICAgPC9hY3Rpb24+Ci0KLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImNvbmZvcm1hbmNlIiB3aG89IkdQIj4KLSAgICAgIEZpeCB4c2w6b3V0cHV0IG1ldGhvZD0gc28gdGhhdCBpdCBvbmx5IGFjY2VwdHMgdmFsaWQgdmFsdWVzIHBlciB0aGUKLSAgICAgIHN0YW5kYXJkICh4bWwsIGh0bWwsIHRleHQsIHFuYW1lLXRoYXQtaXMtbm90LWFuLW5jbmFtZSkuICBJJ20gbG9va2luZwotICAgICAgaW50byB3aGVyZSB0aGlzIGNoYW5nZSBzaG91bGQgYmUgbWFkZS4KLSAgIDwvYWN0aW9uPgotCi0gICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJjb25mb3JtYW5jZSIgd2hvPSJHUCI+Ci0gICAgICBWZXJpZnkgdGhhdCB0aGUgZWxlbWVudC1hdmFpbGFibGUgZnVuY3Rpb24gZXhoaWJpdHMgdGhlIHByb3BlcgotICAgICAgYmVoYXZpb3IgYWNjb3JkaW5nIHRvIEVycmF0YSBFNyByZWdhcmRpbmcgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlCi0gICAgICBkZWZhdWx0IG5hbWVzcGFjZSBhbmQgdGhlIGVsZW1lbnQtYXZhaWxhYmxlIGZ1bmN0aW9uLgotICAgPC9hY3Rpb24+Ci0KLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImV4dGVuc2lvbnMiIHdobz0iR1AiPgotICAgICAgQWRkIGNvbXBhdGliaWxpdHkgd2l0aCBYYWxhbkoxIE5vZGVTZXQgZXh0ZW5zaW9uLCBzbyB0aGF0IHN0eWxlaHNoZWV0cyAKLSAgICAgIGNhbiB3b3JrIHdpdGggYm90aCBwcm9jZXNzb3JzLgotICAgPC9hY3Rpb24+Ci0KLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImJ1ZyIgd2hvPSJTQiI+Ci0gICAgSGFuZGxlIHFOYW1lIHBhcmFtdGVyZXIgdG8gdGhlIENvbnRlbnRIYW5kbGVyIG1ldGhvZHMgYmVpbmcgYW4gZW1wdHkgc3RyaW5nLgotICAgIFNlZSBub3RlIGZyb20gbWlrYWVsQGluZ2VuLnJla2xhbS5zdGFsZGFsLm51IChNaWthZWwgU3TlbGRhbCksIDAxLzAxLzIwMDEgMDk6NDIgQU0uCi0gICA8L2FjdGlvbj4KLQotICAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiIHdobz0iU0IiPgotICAgIE9wdGltaXplICIuIiBwYXR0ZXJucyB0byBiZSB1bHRyYSBzaW1wbGUgaXRlcmF0b3IuCi0gICA8L2FjdGlvbj4KLQotICAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiIHdobz0iU0IiPgotICAgIE9wdGltaXplICIvZm9vL2JheiIgcGF0dGVybnMgdGhhdCBoYXZlIG5vIHZhcmlhYmlsaXR5LCB0byBhIGdsb2JhbCBzcGFjZSwgCi0gICAgYW5kIGRvbid0IHJlLWV2YWx1YXRlIGVhY2ggdGltZS4KLSAgIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImZlYXR1cmUiPgotICAgIERvbiBwdWJsaXNoZWQgYSBsaXN0IG9mIHByb3Bvc2VkIGV4dGVuc2lvbnMgYSB3aGlsZSBhZ28uCi0gICAgSSB3b3VsZCByZWFsbHkgbGlrZSB0byBnZXQgdGhlc2UgaW1wbGVtZW50ZWQuICBUaGlzIGlzIGEgZ29vZAotICAgIGFyZWEgZm9yIHBhcnQtdGltZSBjb250cmlidXRlcnMsIGFzIHRoZSBleHRlbnNpb25zIGhhdmUgbGltaXRlZCBzY29wZS4KLSAgPC9hY3Rpb24+Ci0KLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiPgotICAgIEpvZSBjb3VsZCB1c2UgaGVscCB3aXRoIHRoZSBzdHlsZXNoZWV0IGNvbXBpbGVyIHN0dWZmLgotICAgIExvdHMgb2Ygd29yayB0byBiZSBkb25lIHRoZXJlLiAgSW4gcGFydGljdWxhciwgSSB3b3VsZCBsaWtlIHRvCi0gICAgZmlndXJlIG91dCBob3cgdG8gaW5saW5lIHNvbWUgc2ltcGxlIGl0dGVyYXRvciBvcGVyYXRpb25zLAotICAgIGxpa2Ugc2VsZWN0PSJub2RlKCkiIGFuZCBzZWxlY3Q9ImZvbyIuICBBbHNvLCB3ZSBuZWVkIHRvIGZpZ3VyZQotICAgIG91dCBob3cgdG8gYW5hbHl6ZSBhIHBhcnRpY3VsYXIgc3R5bGVzaGVldCdzIGRlcGVuZGVuY2llcywgYW5kCi0gICAgYmUgYWJsZSB0byBwYWNrYWdlIGp1c3QgdGhvc2UgY2xhc3NlcyBpbiBhIGphciwgYWxvbmcgd2l0aCB0aGUKLSAgICBjb21waWxlZCBjbGFzc2VzLgotICAgIDxpc3N1ZSBpZD0iaXNzdWUtY29tcGlsZXItZm9yLWphbnVhcnktcmVsZWFzZSI+SSBzdXNwZWN0IGl0IGlzIHVubGlrZWx5IHRoaXMKLSAgICB3aWxsIGJlIHJlYWR5IGluIHRpbWUgZm9yIHRoaXMgcmVsZWFzZS48L2lzc3VlPgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9InRlc3QiIGNhdGVnb3J5PSJmZWF0dXJlIiBwcmlvcml0eT0iaGlnaCI+Ci0gICAgQHRvZG8gbmVlZCB0byBmaW5kIGFuIEhUTUwgdG8gRE9NIHBhcnNlciB3ZSBjYW4gdXNlISEKLSAgICBHZXQgYSBnb29kLCBhcGFjaGUtbGljZW5zZWQgSFRNTC10by1ET00gcGFyc2VyIGNoZWNrZWQgaW50byB0aGUgCi0gICAgeG1sLXhhbGFuXHRlc3RcamF2YSByZXBvc2l0b3J5LCBmb3IgdXNlIGJ5IG9yZy5hcGFjaGUucWV0ZXN0LnhzbC5YSFRDb21wYXJhdG9yCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0idGVzdCIgY2F0ZWdvcnk9InRlc3RzIiBwcmlvcml0eT0ibWVkaXVtIj4KLSAgICBHZXQgbW9yZSByZWFsLXdvcmxkIHN0eWxlc2hlZXRzIGNoZWNrZWQgaW50byB4bWwteGFsYW5cdGVzdFx0ZXN0c1xjb250cmliLgotICAgIFdlIG5lZWQgbW9yZSByZWFsLWxpZmUgZXhhbXBsZXMgb2YgaG93IHBlb3BsZSBhcmUgdXNpbmcgc3R5bGVzaGVldHMsIGFsb25nIAotICAgIHdpdGggZXhwZWN0ZWQgb3V0cHV0cyAoaW4gY29udHJpYi1nb2xkKSAtIHdlIGNhbiB0aGVuIHJ1biBvdXIgdGVzdCBkcml2ZXIgCi0gICAgb3ZlciB0aGUgd2hvbGUgc2V0IG9mIHRoZW0gZWFzaWx5IHRvIGdldCBtb3JlIHRlc3QgcG9pbnRzLgotICAgIE5vdGU6IHBsZWFzZSBmZWVsIGZyZWUgdG8gY29udHJpYnV0ZSB0ZXN0cyBoZXJlIC0gdGhlIGNvbW1pdHRlcnMgCi0gICAgd2lsbCByZXZpZXcgYW5kIG1vdmUgdGVzdHMgaW50byBjb25mb3JtYW5jZSwgcHJvZHVjdCwgZXRjLiB0ZXN0IAotICAgIGFyZWFzIGFzIG5lZWRlZCwgYnV0IHdlIGNhbiBhbHdheXMganVzdCBydW4gQ29udHJpYlRlc3Qgb24gYW55IHRlc3RzLgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9InRlc3QiIGNhdGVnb3J5PSJ0ZXN0cyIgcHJpb3JpdHk9ImhpZ2giPgotICAgIEdldCBleHRlbnNpb24gdGVzdHMgY2hlY2tlZCBpbnRvIHhtbC14YWxhblx0ZXN0XHRlc3RzXGV4dGVuZAotICAgIFdlIGhhdmUgc29tZSBhdCBMb3R1cyB3ZSBuZWVkIHRvIGNsZWFudXAgYW5kIGNoZWNraW4sIGFuZCB3ZSAKLSAgICBob3BlIHRvIGdldCBtb3JlIGV4YW1wbGVzIGZyb20gR2FyeSBhbmQgb3RoZXIgbGlzdCBtZW1iZXJzLgotICA8L2FjdGlvbj4KLSAgIAotICAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiIHdobz0iU0IiPgotICAgIERlbGV0ZSBub2RlcyBpbiB0aGUgc291cmNlIHRyZWUgd2hlbiBwb3NzaWJsZS4gICg/PyBOb3RlIHN1cmUgaWYgdGhpcyAKLSAgICBpcyBkby1hYmxlIGJ5IGJldGEyLikKLSAgICA8cHN1ZWRvLWNvZGU+Ci0gICAgICAxKSBGb3IgZWFjaCBleHByZXNzaW9uLCB0ZWxsIGlmIGV4cHJlc3Npb24gY2FuIHRyYXZlcnNlIG91dHNpZGUgaXQncyAKLSAgICAgICAgIHN1YnRyZWUuCi0gICAgICAyKSBGb3IgZWFjaCBlbGVtZW50LCB0ZWxsIGlmIGFueSBmb2xsb3dpbmcgZWxlbWVudHMgbWF5IG5lZWQgdG8gIAotICAgICAgICAgYWNjZXNzIHRoYXQgbm9kZS4KLSAgICAgIDMpIEluIGluc3RydWN0aW9ucyB0aGF0IHRyYXZlcnNlIG5vZGVzLCBvbmNlIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSAKLSAgICAgICAgIG5vZGUgaXMgY29tcGxldGVkLCByZW1vdmUgdGhlIG5vZGUgaWYgbm8gZm9sbG93aW5nIGVsZW1lbnRzIG1heSAKLSAgICAgICAgIG5lZWQgdG8gYWNjZXNzIHRoYXQgbm9kZS4KLSAgICAgIDQpIEtlZXAgdGhlIHBhcnNlIGV2ZW50cyBmcm9tIGdldHRpbmcgdG9vIGZhciBhaGVhZCBvZiB0aGUgdHJhbnNmb3JtLgotICAgICAgCi0gICAgICBUT0RPOiBJbiBTdGVwUGF0dGVybiwgQW5jZXN0b3JzIHRlc3RzIHdpdGggcHJlZGljYXRlcyBhcmUgcHJvYmxlbWF0aWMsIAotICAgICAgYW5kIHdpbGwgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudC4KLSAgICA8L3BzdWVkby1jb2RlPgotICAgPC9hY3Rpb24+Ci0KLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iZmVhdHVyZSI+Ci0gICAgWFBvaW50ZXIgYnVpbHQgb24gdGhlIFhQYXRoIHBhY2thZ2UuCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgcGFja2FnZXM9InhwYXRoLmF4ZXMiIGNhdGVnb3J5PSJwZXJmb3JtYW5jZSI+Ci0gICAgU2NoZW1hLXNhdnkgaXR0ZXJhdG9ycy4KLSAgICBUaGlzIGlzIGhhcmQgYmVjYXVzZSB0aGVyZSBpcyBubyBzdGFuZGFyZCBBUEkgZm9yIHNjaGVtYXMgeWV0LgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGlkPSJzdHlsZXNoZWV0LWFuYWx5c2lzIiBwYWNrYWdlcz0icHJvY2Vzc29yIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiPgotICAgIFN0eWxlc2hlZXQgYW5hbHlzaXMgbW9kdWxlLiAgV2hlbiBJIGNhbGwgYSB0ZW1wbGF0ZSwgd2hlcmUgaXMgaXQgbGlrZWx5IHRvIHdhbGsgaW4gdGhlIHRyZWU/Ci0gICAgQ2FuIEkgYmUgc3VyZSB0aGF0IGl0IHdpbGwgbm90IHdhbGsgdXAgYWdhaW4/Ci0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgcGFja2FnZXM9InN0cmVlIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiPgotICAgIFJlbGF0ZWQgdG8gc3R5bGVzaGVldC1hbmFseXNpcywgdGhlIGFiaWxpdHkgdG8gdGhyb3cgYXdheSBwYXJ0cyBvZiB0aGUgdHJlZSB0aGF0IGhhdmUgYmVlbiBwcm9jZXNzZWQsCi0gICAgYW5kIHdlIGtub3cgd2Ugd29uJ3QgcmV1c2UsIGJhc2VkIG9uIHRoZSBzdHlsZXNoZWV0IGFuYWx5c2lzLgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIHBhY2thZ2VzPSJwcm9jZXNzb3IiIGNhdGVnb3J5PSJwZXJmb3JtYW5jZSI+Ci0gICAgU3ViLWV4cHJlc3Npb24gZWxpbWluYXRpb24uICBXaGVuIEkgY2FsbCBhIHNlcmllcyBvZgotICAgIHhzbDp3aGVuIHRlc3RzLCBhcmUgdGhlcmUgY29tbW9uIHN1YmV4cHJlc3Npb25zIHRoYXQgY2FuIGJlCi0gICAgZXhlY3V0ZWQgb25jZSBhbmQgdGhlbiBzaGFyZWQ/Ci0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSI+Ci0gIDwvYWN0aW9uPgotCi0gPC9hY3Rpb25zPgotCi0gPGNvbXBsZXRlZD4KLSAgPCEtLSBNb3ZlIGFjdGlvbiBzZWN0aW9ucyB0byBoZXJlIHdoZW4gY29tcGxldGVkLCBhbmQgZGF0ZSB0aGVtLiAtLT4KLSAgCi0gICA8YWN0aW9uIGNvbnRleHQ9ImRvYyIgY2F0ZWdvcnk9ImRvY3VtZW50YXRpb24iIHdobz0iU0IiIGNvbXBsZXRlZD0iMDEvMTIvMDEiPgotICAgIFVwZGF0ZSBhbmQgYWRkIHRvIGFyY2hpdGVjdHVyZSBkb2N1bWVudGF0aW9uLCBpbmNsdWRpbmcgcGFja2FnZSBoZWFkZXJzLgotICAgPC9hY3Rpb24+Ci0KLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImVycm9yLWhhbmRsaW5nIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjAxLzA2LzAxIj4KLSAgICBTaW1wbGlmeSBzb21lIG9mIHRoZSBleGNlcHRpb24gbmVzdGluZywgbWF5YmUsIGFuZCBtYWtlIHN1cmUgZXJyb3IgbGlzdGVuZXJzIAotICAgIGFyZSBiZWluZyBjYWxsZWQgZm9yIGFsbCBjYXNlcy4KLSAgICA8bm90ZT5GaXhlZCBidWcgd2l0aCBYUGF0aHMgaW4gdGhpcyBhcmVhLiAgTW9zdCBvZiB0aGUgbmVzdGluZyBpcyBiZWluZyBjYXVzZWQgCi0gICAgYnkgVHJhbmZvcm1lckhhbmRsZXIgdG8gU0FYRXhjZXB0aW9uIG5lc3RpbmcsIHdoaWNoIGNhbiBiZSB1bm5lc3RlZC48L25vdGU+Ci0gICA8L2FjdGlvbj4KLSAgCi0gICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJidWciIHdobz0iU0IiIGNvbXBsZXRlZD0iMDEvMDYvMDEiPgotICAgIEZpeCAxLjggcHJvYmxlbXM6IGV4dGVuZDAxIChleGNlcHRpb24pLCBudW1iZXJmb3JtYXQgMDYsIG51bWJlcmZvcm1hdDE2LCBvdXRwdXQ3NyAoZXhjZXB0aW9uKS4KLSAgICBKREsgMS4xLjgsIHVzaW5nIHhtbC14YWxhblx0ZXN0XENvbmZvcm1hbmNlVGVzdC5iYXQsIHJ1bmhhcm5lc3MuYmF0LCBhbmQgdGVzdHRocmVhZHMuYmF0IGFzLWlzLgotICAgIDxub3RlPlRoZSBudW1iZXIgZm9ybWF0IHN0dWZmIGlzIGEgYnVnIGluIEpESyAxLjggYW5kIGNhbid0IGVhc2lseSBiZSBmaXhlZCAKLSAgICBvciBoYWNrZWQuPC9ub3RlPgotICAgPC9hY3Rpb24+Ci0KLSAgIDwhLS0gYWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJmZWF0dXJlIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjAxLzA0LzAxIj4KLSAgICBJbnRlZ3JhdGUgSm9obiBHZW50aWxpbiAmbHQ7am9obmdsaW51eEBleWVjYXRjaGluZy5jb20+IGNvZGUsIAotICAgIGZvciBTUUwgRXh0ZW5zaW9uIEVuaGFuY2VtZW50cy4KLSAgIDwvYWN0aW9uICAoQ0hBTkdFUyBCQUNLRUQgT1VUIE9GKSAtLT4KLQotICAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iYnVnIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjAxLzA0LzAxIj4KLSAgICBJbXBsZW1lbnQgeHNsOnN0cmlwLXNwYWNlIGZvciBnZW5lcmljIERPTSBwcm9jZXNzaW5nLgotICAgPC9hY3Rpb24+Ci0KLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9InBlcmZvcm1hbmNlIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjAxLzAzLzAxIj4KLSAgICBGb3IgZGVmYXVsdCB0cmFuc2Zvcm1lciwgZG8gZGlyZWN0IHRyYW5zZm9ybSB3aXRob3V0IHN0eWxlc2hlZXQuCi0gICA8L2FjdGlvbj4KLSAgIAotICAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iZG9jdW1lbnRhdGlvbiIgd2hvPSJTQiIgY29tcGxldGVkPSIwMS8wMS8wMSI+Ci0gICAgRml4IHNvbWUgamF2YWRvYyBoZWFkZXJzIHRoYXQgc3RpbGwgaGF2ZSBvbGQgWGFsYW5KMSB0ZXh0LiAgRm9yIGluc3RhbmNlLCAKLSAgICBUcmFuc2Zvcm1lckltcGwuCi0gICA8L2FjdGlvbj4KLSAgCi0gICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJidWdzIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjEyLzMxLzAwIj4KLSAgICBGaXggYnVnIHdpdGggU2hhbmUncyBzMnMgdGVzdCBoYW5nLgotICAgPC9hY3Rpb24+Ci0gICAKLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImJ1Z3MiIHdobz0iU0IsIEpLIiBjb21wbGV0ZWQ9IjEyLzMxLzAwIj4KLSAgICBGaXggYnVnIHdpdGggcmFyZSBpbnRlcm1pdHRlbnQgZmFpbHVyZXMsIHByb2JhYmx5IGluIHRoZSBTVHJlZS4KLSAgICA8bm90ZT5WZXJpZmljYXRpb24gdGVzdGluZyBvbiBKSydzIG1hY2hpbmUgbmVlZGVkLjwvbm90ZT4KLSAgIDwvYWN0aW9uPgotCi0gICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJwZXJmb3JtYW5jZSIgd2hvPSJTQiIgY29tcGxldGVkPSIxMi8yNi8wMCI+Ci0gICAgT3B0aW1pemUgIi9mb28vYmF6IiBwYXR0ZXJucyB0byB1c2Ugc2ltcGxlIGNoaWxkIHdhbGtlcnMuCi0gICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0idGVzdCIgd2hvPSJTQyIgY2F0ZWdvcnk9Im1pbml0ZXN0IiBwcmlvcml0eT0ibWVkaXVtIiBjb21wbGV0ZWQ9IjEyLzA4LzAwIj4KLSAgICBDcmVhdGUgTWluaXRlc3QgYXV0b21hdGVkIHRlc3QgZm9yIGRldmVsb3BlcnMgdG8gcnVuIGJlZm9yZSBjaGVja2luOyAKLSAgICB2ZXJpZmllcyBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIFRSQVggaW50ZXJmYWNlIGFuZCBYYWxhbiBwcm9jZXNzb3IuIAotICAgIChTdGlsbCB0b2RvLCBtaW5vcjogZ2V0IHhhbGFuLWRldiBsaXN0IHRvIHZvdGUgdG8gdXNlIHRoaXMpCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImFyY2hpdGVjdHVyZSIgcHJpb3JpdHk9ImhpZ2giIHdobz0iU0IiIGNvbXBsZXRlZD0iMTIvMTAvMDAiPgotICAgIEZpeCByZW1haW5pbmcgYXhlcyB0ZXN0cy4KLSAgPC9hY3Rpb24+Ci0KLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiIHByaW9yaXR5PSJoaWdoIiB3aG89Ik1NIiBjb21wbGV0ZWQ9IjEyLzgvMDAiPgotICAgIFdoZW4gdXNpbmcgU1RyZWUgZm9yIHRoZSBpbnB1dCwgdXNlIFNUcmVlIGZvciB0aGUgZG9jdW1lbnQoKSBhbmQKLSAgICByZXN1bHQgdHJlZSBmcmFnbWVudHMuCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImFyY2hpdGVjdHVyZSwgY29uZm9ybWFuY2UiIHByaW9yaXR5PSJoaWdoIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjEyLzA2LzAwIj4KLSAgICBSZXN0cnVjdHVyZSBPdXRwdXRGb3JtYXQgY2xhc3MgdG8gYmUgYmFzZWQgb24gcHJvcGVydGllcy4gIE1ha2Ugc3VyZSAKLSAgICBpbmNsdWRlL2ltcG9ydCBjb25mb3JtYW5jZSBpcyBjb3JyZWN0LgotICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImFyY2hpdGVjdHVyZSIgcHJpb3JpdHk9ImhpZ2giIHdobz0iU0IiIGNvbXBsZXRlZD0iMTIvMDYvMDAiPgotICAgIE1ha2UgZW50aXRpZXMgaW4gdGhlIGh0bWwgc2VyaWFsaXplciB0byBiZSByZXNvdXJjZSBmaWxlIGRyaXZlbi4KLSAgPC9hY3Rpb24+Ci0gIAotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJhcmNoaXRlY3R1cmUiIHByaW9yaXR5PSJoaWdoIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjEyLzA2LzAwIj4KLSAgICBSZW1vdmVkIGxpbmVmZWVkIG5vcm1hbGl6YXRpb24gZnJvbSBzZXJpYWxpemVycy4gIEkgdGhpbmsuCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY29tcGxldGVkLWRhdGU9IjEwLzMxLzAwIj4KLSAgICBNYWtlIHRoaXMgdG9kbyBsaXN0LgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIHdobz0iU0IiICBjYXRlZ29yeT0idHJheCIgY29tcGxldGVkLWRhdGU9IjExLzA2LzAwIj4KLSAgICBpbXBsZW1lbnQgamF2YXgudHJheCBpbnRlcmZhY2VzLgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIHBhY2thZ2VzPSJzZXJpYWxpemUiIHdobz0iU0IiICBjYXRlZ29yeT0iZmVhdHVyZSIKLSAgICAgICAgICBjb21wbGV0ZWQtZGF0ZT0iMTEvMTcvMDAiPgotICAgIEltcGxlbWVudCBET01TZXJpYWxpemVyIG9uIFNlcmlhbGl6ZXJUb1hNTC4KLSAgPC9hY3Rpb24+Ci0KLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiB3aG89IlNCIiBwYWNrYWdlcz0ieHBhdGguYXhlcyIgY2F0ZWdvcnk9InBlcmZvcm1hbmNlIgotICAgICAgICAgIHByaW9yaXR5PSJoaWdoIiBjb21wbGV0ZWQtZGF0ZT0iMTEvMTcvMDAiPgotICAgIGltcGxlbWVudCBmYXN0IGl0ZXJhdG9yIGZvciAiZm9vIiBwYXR0ZXJuLgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIHdobz0iTU0iIGNhdGVnb3J5PSJwZXJmb3JtYW5jZSIgcHJpb3JpdHk9ImhpZ2giIGNvbXBsZXRlZC1kYXRlPSIxMS8yOS8wMCI+Ci0gICAgb3B0aW1pemUgeHNsOmtleSBhbmQga2V5KCkgc3R1ZmYgYnkgYnVpbGRpbmcgaGFzaCB0YWJsZSBvZiBpdGVyYXRvcnMgZm9yCi0gICAgZWFjaCBrZXkuCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImNvZGUtY2xlYW51cCIgcHJpb3JpdHk9Im1lZGl1bSIgY29tcGxldGVkPSIxMi8wMS8wMCI+Ci0gICAgQ2xlYW4gdXAgdHJlYXRtZW50IG9mIG51bGwgbmFtZXNwYWNlcywgcmUgIiIgdnMuIG51bGwuCi0gICAgPGNvbXBsZXRlZC1jb21tZW50PkkgY29uc2lkZXIgdGhpcyB0byBiZSBwcmV0dHkgZ29vZCBpbiBtb3N0IHBsYWNlcy4gICIiIAotICAgIGVxdWFscyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuICBObyBwZW5kaW5nIHBsYW5zIGZvciBhY3Rpb24sIG90aGVyIHRoYW4gb25nb2luZyAKLSAgICBjbGVhbnVwIGFuZCBqYXZhZG9jIGFzIGl0IG9jY3Vycy48L2NvbXBsZXRlZC1jb21tZW50PgotICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgIGNhdGVnb3J5PSJjb25mb3JtYW5jZSIgcHJpb3JpdHk9ImhpZ2giIGNvbXBsZXRlZD0iMTIvMTAvMDAiPgotICAgIEltcGxlbWVudCBuYW1lc3BhY2UgYWxpYXNpbmcuCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgcGFja2FnZXM9InRlbXBsYXRlcyIgY2F0ZWdvcnk9ImNvbmZvcm1hbmNlIiBwcmlvcml0eT0ibWVkaXVtIgotICAgICAgICAgIG5vdGU9ImRvbmU/IiBjb21wbGV0ZWQ9IjExLzI5LzAwIj4KLSAgICBDYXRjaCBtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiBhIHZhcmlhYmxlIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2NvcGUuCi0gIDwvYWN0aW9uPgotICAKLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iY29kZS1jbGVhbnVwIiBwcmlvcml0eT0ibWVkaXVtIiBjb21wbGV0ZWQ9IjExLzI1LzAwIj4KLSAgICBNb3ZlIG9yZy5hcGFjaGUueGFsYW4udXRpbHMgcGFja2FnZSB0byBvcmcuYXBhY2hlLnhtbC51dGlscy4KLSAgICByZW1vdmUgcmVzb3VyY2UgZGVwZW5kZW5jaWVzIG9uIHhhbGFuIGFuZC9vciB4cGF0aCBwYWNrYWdlLgotICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImNvZGUtY2xlYW51cCwgcGVyZm9ybWFuY2UiIHBhY2thZ2VzPSJ0ZW1wbGF0ZXMiCi0gICBwcmlvcml0eT0ibWVkaXVtIiB3aG89IkdQIiBjb21wbGV0ZWQ9IjExLzMwLzAwIj4KLSAgICBSZWZhY3RvcmVkIHRoZSByZWNvbXBvc2UgbG9naWMgdG8gb3BlcmF0ZSBtb3JlIGNsZWFubHkgYW5kIHF1aWNrbHkuIEZpeGVkIFRlbXBsYXRlTGlzdAotICAgIHRvIHByb3Blcmx5IG9yZGVyIHRlbXBsYXRlcy4KLSAgPC9hY3Rpb24+Ci0gIAotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJjb2RlLWNsZWFudXAiIHBhY2thZ2VzPSJleHRlbnNpb25zIgotICAgcHJpb3JpdHk9Im1lZGl1bSIgd2hvPSJHUCIgY29tcGxldGVkPSIxMC8yOS8wMCI+Ci0gICAgSW1wcm92ZWQgZXJyb3IgcmVwb3J0aW5nIGZvciBqYXZhIGV4dGVuc2lvbiBtZXRob2QgZXJyb3JzLgotICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImRvY3VtZW50YXRpb24iIHByaW9yaXR5PSJtZWRpdW0iIHdobz0iR1AiIGNvbXBsZXRlZD0iMTEvMjMvMDAiPgotICAgIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgRXh0ZW5zaW9uIEhhbmRsaW5nIHRvIGNvbmZvcm0gdG8gdGhlIG5ldyBleHRlbnNpb24gbWVjaGFuaXNtLgotICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImZlYXR1cmUiIHByaW9yaXR5PSJtZWRpdW0iIHdobz0iR1AiIGNvbXBsZXRlZD0iMTIvMDMvMDAiPgotICAgIENoYW5nZWQgZXh0ZW5zaW9uIG1lY2hhbmlzbSB0byBsb2FkIGV4dGVuc2lvbnMgdXNpbmcgdGhlIHRocmVhZCdzIENvbnRleHRDbGFzc0xvYWRlciwKLSAgICBpZiBhdmFpbGFibGUuCi0gIDwvYWN0aW9uPgotICAKLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iZmVhdHVyZSIgcGFja2FnZXM9ImV4dGVuc2lvbnMiIAotICAgcHJpb3JpdHk9Im1lZGl1bSIgd2hvPSJHUCIgY29tcGxldGVkPSIxMS8yOC8wMCI+Ci0gICAgSW1wbGVtZW50IHRva2VuaXplIGV4dGVuc2lvbi4gIEltcGxlbWVudCBlbGVtZW50LWF2YWlsYWJsZSBhbmQgZnVuY3Rpb24tYXZhaWxhYmxlIGZvcgotICAgIGJ1aWx0LWluIGVsZW1lbnRzIGFuZCBmdW5jdGlvbnMuCi0gIDwvYWN0aW9uPgotICAKLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iY29kZS1jbGVhbnVwIiBwYWNrYWdlcz0iZXh0ZW5zaW9ucyIgCi0gICBwcmlvcml0eT0ibWVkaXVtIiB3aG89IkdQIiBjb21wbGV0ZWQ9IjExLzA3LzAwIj4KLSAgICAgRml4IGhhbmRsaW5nIG9mIHhzbDpmYWxsYmFjayBlbGVtZW50cyB3aXRoaW4gZXh0ZW5zaW9uIGVsZW1lbnRzIHRoYXQgcHJvY2VzcyB0aGVpciBvd24KLSAgICAgY29kZSAobGlrZSByZWRpcmVjdCkuCi0gIDwvYWN0aW9uPgotICAKLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iY29kZS1jbGVhbnVwIiBwYWNrYWdlcz0iY29tcGlsZXIiIAotICAgcHJpb3JpdHk9Im1lZGl1bSIgd2hvPSJHUCIgY29tcGxldGVkPSIxMS8wOS8wMCI+Ci0gICAgIENsZWFuZWQgdXAgY29tcGlsZXIgaGFuZGxpbmcgb2YgZ2V0V2hhdFRvU2hvdygpIHRvIHJlc3VsdCBpbiBjbGVhbmVyIGNvZGUgYW5kIHByb3ZpZGUKLSAgICAgYSBtb3JlIGFjY3VyYXRlIGZpbHRlci4KLSAgPC9hY3Rpb24+Ci0gIAotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIHdobz0iU0IiIHBhY2thZ2VzPSJ4cGF0aC5heGVzIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiIHByaW9yaXR5PSJoaWdoIiBjb21wbGV0ZWQ9IjEyLzEzLzAwIj4KLSAgICBpbXBsZW1lbnQgZmFzdCBpdGVyYXRvciBmb3IgIkBmb28iIHBhdHRlcm4uCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgd2hvPSJTQiIgcGFja2FnZXM9InhwYXRoLmF4ZXMiIGNhdGVnb3J5PSJwZXJmb3JtYW5jZSIgcHJpb3JpdHk9ImhpZ2giIGNvbXBsZXRlZD0iMTIvMTQvMDAiPgotICAgIGltcGxlbWVudCBmYXN0IGl0ZXJhdG9yIGZvciAiLy9mb28iIHBhdHRlcm4uCi0gIDwvYWN0aW9uPgotICAKLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImNvZGUtY2xlYW51cCIgd2hvPSJETCIgcGFja2FnZXM9InhhbGFuc2VydmxldCIgcHJpb3JpdHk9Im1lZGl1bSIgY29tcGxldGVkPSIxMi8xNS8wMCI+Ci0gICAgIFJld3JpdGUgdGhlIHNhbXBsZSBzZXJ2bGV0IHRvIHVzZSB0aGUgVHJBWCBpbnRlcmZhY2VzIGFuZCBlbGltaW5hdGUgc2V0dGluZyBzeXN0ZW0gcHJvcGVydGllcwotICAgICB3aXRoaW4gdGhlIHNlcnZsZXQuCi0gIDwvYWN0aW9uPiAgCi0KLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiB3aG89IlNCIiBwYWNrYWdlcz0ib3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUiIGNhdGVnb3J5PSJzYW1wbGVzIiBwcmlvcml0eT0iaGlnaCIgY29tcGxldGVkPSIxMi8xNi8wMCI+Ci0gICAgRml4IHRoZSBzZXJpYWxpemVyIHNvIGl0IGNhbiBzZXJpYWxpemUgYXJiaXRyYXJ5IFhQYXRoIGV4cHJlc3Npb24gcmVzdWx0cyAob3RoZXIgdGhhbiBEb2N1bWVudCBub2RlcykuCi0gICAgQXMgaXQgY3VycmVudGx5IHN0YW5kcywgdGhlIEFwcGx5WFBhdGggc2FtcGxlIG9ubHkgd29ya3Mgd2hlbiB5b3UgZ2l2ZSBpdCBhbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyAKLSAgICB0aGUgZW50aXJlIERvY3VtZW50LgotICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImRvY3VtZW50YXRpb24iIHByaW9yaXR5PSJoaWdoIiBjb21wbGV0ZWQ9IjEyLzE3LzAwIj4KLSAgICBGaWxsIGluIGFsbCBORUVEU0RPQyBzZWN0aW9ucy4KLSAgPC9hY3Rpb24+Ci0KLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iY29kZS1jbGVhbnVwIiB3aG89IkRMIiBwYWNrYWdlcz0ieGFsYW4uY2xpZW50IiBwcmlvcml0eT0ibWVkaXVtIiBjb21wbGV0ZWQ9IjEyLzE3LzAwIj4KLSAgICBSZXdyaXRlIHRoZSBjbGllbnQgYXBwbGV0IHRvIHVzZSB0aGUgVHJBWCBpbnRlcmZhY2VzLCBhbmQgbW92ZSBmZXRjaGluZyBvZiBzb3VyY2UKLSAgICBkb2N1bWVudHMgYW5kIHN0eWxlc2hlZXRzIHRvIHRoZSB0cnVzdGVkIHdvcmtlciB0aHJlYWQgdG8gZ2V0IGFyb3VuZCBJRSBzZWN1cml0eSByZXN0cmljdGlvbnMuCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgIGNhdGVnb3J5PSJjb25mb3JtYW5jZSIgcHJpb3JpdHk9ImhpZ2giIGNvbXBsZXRlZD0iMTIvMTkvMDAiPgotICAgIENoZWNrIHJlbGF0aXZlIFVSTCByZXNvbHV0aW9uIHdpdGggbm90YXRpb25zIGFuZCB1bnBhcnNlZCBlbnRpdGllcy4KLSAgICBOb3Qgc3VyZSBpZiB0aGVyZSBpcyBhIGJ1ZyBoZXJlLiAgU2VlIG5vdGUgZnJvbSBUaG9tYWwgTWFlc2luZyBvbgotICAgIDEwLzI0LzIwMDAsIHRpdGxlZCAiQW50d29ydDogUmU6Ii4KLSAgPC9hY3Rpb24+Ci0KLSAgPGFjdGlvbiBjb250ZXh0PSJ0ZXN0IiBjYXRlZ29yeT0iZmVhdHVyZSIgcHJpb3JpdHk9ImhpZ2giIGNvbXBsZXRlZD0iMTIvMTkvMDAiPgotICAgIFVwZGF0ZSB0aGUgeG1sLXhhbGFuXHRlc3Rcdmlld1Jlc3VsdHMueHNsIHN0eWxlc2hlZXQgdG8gc2hvdyAKLSAgICBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byByZXN1bHQgZmlsZXMgZnJvbSB0aGUgc2FtZSB0ZXN0IChlZy4KLSAgICBzaG93IGRpZmZlcmVuY2VzIGZyb20gYSByZXN1bHRzLWJlZm9yZS54bWwgcnVuIGJlZm9yZSBhIGRldmVsb3BlciAKLSAgICBtYWtlcyBhIGNoYW5nZSwgd2l0aCByZXN1bHRzLWFmdGVyLnhtbCwgd2hpY2ggd2FzIGFmdGVyIHRoZSAKLSAgICBkZXZlbG9wZXIncyBjaGFuZ2UuKQotICAgIFRoaXMgY291bGQgYmUgYSBidW5jaCBvZiBzdHVmZiBhZGRlZCB0byB2aWV3UmVzdWx0cy54c2wgb3IgY291bGQgCi0gICAgYmUgYSBzZXBhcmF0ZSBzdHlsZXNoZWV0LiBTZWUgPGI+U0M8L2I+IGZvciBkZXRhaWxzLgotICA8L2FjdGlvbj4KLQotIDwvY29tcGxldGVkPgotCi08L3RvZG8+CmRpZmYgLS1naXQgYS90b2RvLnhzbCBiL3RvZG8ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDA2ODU0Li4wMDAwMDAwCi0tLSBhL3RvZG8ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDxIVE1MPgotICAgICAgPEhFQUQ+Ci0gICAgICAgICA8VElUTEU+WGFsYW4tSmF2YSBWZXJzaW9uIDI8L1RJVExFPgotICAgICAgPC9IRUFEPgotICAgICAgPEJPRFk+Ci0gICAgICAgIDwhLS0gSDE+WGFsYW4gZm9yIEphdmEgVmVyc2lvbiAyPC9IMSAtLT4KLSAgICAgICAgPEgyPlhhbGFuIGZvciBKYXZhIFZlcnNpb24gMjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRvZG8vQHRpdGxlIi8+PC9IMj4KLSAgICAgICAgPHA+PGZvbnQgc2l6ZT0iLTEiPlNlZSBhIAotICAgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhIj4KLSAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPiNkZXZlbG9wZXItbGlzdDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDx4c2w6dGV4dD5saXN0IG9mIGRldmVsb3BlcnMvaW5pdGlhbHMuPC94c2w6dGV4dD4KLSAgICAgICAgICA8L3hzbDplbGVtZW50PgotICAgICAgICA8L2ZvbnQ+PC9wPgotICAgICAgICA8Zm9udCBzaXplPSItMSI+PHA+UGxhbm5lZCByZWxlYXNlczogCi0gICAgICAgICAgICA8QlIvPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJ0b2RvL2FjdGlvbnMvdGFyZ2V0LXJlbGVhc2UtZGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYSI+Ci0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+I3JlbGVhc2UtZGF0ZS08eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGF0ZSIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGF0ZSIvPgotICAgICAgICAgICAgICA8L3hzbDplbGVtZW50Pjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhIj4KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4jcmVsZWFzZS1kYXRlLWNvbXBsZXRlZDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+Q29tcGxldGVkPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgPC94c2w6ZWxlbWVudD4KLQotICAgICAgICA8L3A+PC9mb250PgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0idG9kbyI+Ci0gICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImFjdGlvbnMiPgotICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0idGFyZ2V0LXJlbGVhc2UtZGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhY3Rpb24iPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm9ybWFsaXplLXNwYWNlKC4pIj4KLSAgICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgIDx4c2w6bnVtYmVyLz4pIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkAqIj4KLSAgICAgICAgICAgICAgICAgICAgPEJSLz4KLSAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIi8+Ci0gICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDxIUi8+Ci0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iY29tcGxldGVkIj4KLSAgICAgICAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImEiPgotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPnJlbGVhc2UtZGF0ZS1jb21wbGV0ZWQ8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgPEgzPkNvbXBsZXRlZDogPC9IMz4KLSAgICAgICAgICAgICAgPC94c2w6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhY3Rpb24iPgotICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vcm1hbGl6ZS1zcGFjZSguKSI+Ci0gICAgICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgIDx4c2w6bnVtYmVyLz4pIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAKiI+Ci0gICAgICAgICAgICAgICAgICA8QlIvPgotICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKiIvPgotICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgPEhSLz4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRldmVsb3Blci1saXN0Ii8+Ci0gICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgIDwvQk9EWT4KLSAgICA8L0hUTUw+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImFjdGlvbi9AKiI+Ci0gIDwhLS0gQWRkIGxpbmsgdG8gdGhlIHdobyBhdHRyaWJ1dGVzIHRvIGNvcnJlc3BvbmRpbmcgaXRlbSBpbiBkZXZlbG9wZXItbGlzdCAtLT4KLSAgICA8Yj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPjo8L2I+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJuYW1lKC4pPSd3aG8nIj4KLSAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYSI+Ci0gICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4jcGVyc29ucmVmLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KLSAgICAgICAgICA8L3hzbDplbGVtZW50PgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPHhzbDppZiB0ZXN0PSJub3QgKHBvc2l0aW9uKCk9bGFzdCgpKSI+Ci0gICAgICA8eHNsOnRleHQ+LCA8L3hzbDp0ZXh0PgotICAgIDwveHNsOmlmPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0YXJnZXQtcmVsZWFzZS1kZXNjcmlwdGlvbi9kYXRlIj4KLSAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhIj4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+cmVsZWFzZS1kYXRlLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICA8Yj48eHNsOnRleHQ+Rm9yIHJlbGVhc2U6IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L2I+Ci0gICAgICA8L3hzbDplbGVtZW50PgotICAgIAotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJpc3N1ZSI+Ci0gICAgPEJSLz48Yj5Jc3N1ZSA8L2I+PHhzbDp0ZXh0Pls8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4KLSAgICA8eHNsOnRleHQ+XTogPC94c2w6dGV4dD4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRhcmdldC1yZWxlYXNlLWRlc2NyaXB0aW9uL2xldmVsIj4KLSAgICA8eHNsOnRleHQ+LCA8L3hzbDp0ZXh0Pjx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGFyZ2V0LXJlbGVhc2UtZGVzY3JpcHRpb24vZ29hbCI+Ci0gICAgPEJSLz48Yj5Hb2FsIDwvYj48eHNsOnRleHQ+WzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgPHhzbDp0ZXh0Pl06IDwveHNsOnRleHQ+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iZGV2ZWxvcGVyLWxpc3QiPgotICAgIDxIMz4KLSAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhIj4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+ZGV2ZWxvcGVyLWxpc3Q8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgIDx4c2w6dGV4dD5EZXZlbG9wZXJzOjwveHNsOnRleHQ+Ci0gICAgICA8L3hzbDplbGVtZW50PgotICAgIDwvSDM+Ci0gICAgPHA+QSBsaXN0IG9mIHNvbWUgb2YgcGVvcGxlIHdvcmtpbmcgb24gWGFsYW4gY3VycmVudGx5OjwvcD4KLSAgICA8dWw+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImRldnMvcGVyc29uIj4KLSAgICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0ibWFpbHRvOntAZW1haWx9Ij4KLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgPC9hPgotICAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImEiPgotICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48eHNsOnRleHQ+cGVyc29ucmVmLTwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgPHhzbDp0ZXh0PiAoPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+PHhzbDp0ZXh0Pik8L3hzbDp0ZXh0PgotICAgICAgICAgPC94c2w6ZWxlbWVudD4KLSAgICAgICAgIDxCUi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KLSAgICAgIDwvbGk+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPC91bD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cmF4X2J1Z3MueG1sIGIvdHJheF9idWdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2ZjljNS4uMDAwMDAwMAotLS0gYS90cmF4X2J1Z3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08P3htLXdlbGxfZm9ybWVkIHBhdGg9IkU6XHhtbC14YWxhblxqYXZhXGJ1Z3MuZHRkIj8+Ci08IS0tIFRoaXMgc2hvdWxkIGNvbnRhaW4gKm9ubHkqIFNQUnMgKFNvZnR3YXJlIFByb2JsZW0gUmVwb3J0cykgZm9yIHRoZSBUckFYIEFQSSAKLSAgICAgaW50ZXJmYWNlcyBhbmQgY2xhc3Nlcy4gLS0+Ci08U3Bycz48U3ByPjxOYW1lPlRSQVhTUFIwMDAxPC9OYW1lPgotPERhdGVDcmVhdGVkPjExLzE1LzIwMDA8L0RhdGVDcmVhdGVkPgotPFN0YXRlPk9wZW48L1N0YXRlPgotPFRlc3REZXNjPlNBWFRyYW5zZm9ybWVyRmFjdG90eSNGRUFUVVJFIHNob3VsZCBkb2N1bWVudCBzdXBwb3J0IGZvciBhbGwgVHJhbnNmb3JtZXJGYWN0b3JpZXMuPC9UZXN0RGVzYz48RGV0YWlscz48IVtDREFUQVtJbiBTQVhUcmFuc2Zvcm1lckZhY3RvdHk6Ci0KLSAgICAvKiogSWYge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I2dldEZlYXR1cmV9Ci0gICAgICogcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIHRoaXMgdmFsdWUgYXMgYW4gYXJndW1lbnQsCi0gICAgICogdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSByZXR1cm5lZCBmcm9tCi0gICAgICoge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I25ld0luc3RhbmNlfSBtYXkKLSAgICAgKiBiZSBzYWZlbHkgY2FzdCB0byBhIFNBWFRyYW5zZm9ybWVyRmFjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFID0KLQotSSBwcm9wb3NlIHlvdSByZW1vdmUgdGhlIHBocmFzZSAicmV0dXJuZWQgZnJvbQotVHJhbnNmb3JlckZhY3RvcnkubmV3SW5zdGFuY2UiLiBJc24ndCB0aGUgaW50ZW50IHRoYXQgZmVhdHVyZSB0ZXN0aW5nCi1jYW4gYmUgZG9uZSBvbiBhbGwgVHJhbnNmb3JtZXJGYWN0b3JpZXMsIHJlZ2FyZGxlc3MgaG93IHRoZXkgYXJlCi1jcmVhdGVkPyBJdCBjYW4gYmUgbGlrZSB0aGlzIGluc3RlYWQ6Ci0KLSAgICAvKiogSWYge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I2dldEZlYXR1cmV9Ci0gICAgICogcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIHRoaXMgdmFsdWUgYXMgYW4gYXJndW1lbnQsCi0gICAgICogdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gYQotICAgICAqIFNBWFRyYW5zZm9ybWVyRmFjdG9yeS4KLSAgICAgKi9dXT48L0RldGFpbHM+PC9TcHI+PFNwcj48TmFtZT5UUkFYU1BSMDAwMjwvTmFtZT4KLTxEYXRlQ3JlYXRlZD4xMS8xNS8yMDAwPC9EYXRlQ3JlYXRlZD4KLTxTdGF0ZT5PcGVuPC9TdGF0ZT4KLTxUZXN0RGVzYz5PdXRwdXRLZXlzI21ldGhvZCBzaG91bGQgZG9jdW1lbnQgcW5hbWUgaW5zdGVhZCBvZiBxbmFtZS1idXQtbm90LW5jbmFtZTwvVGVzdERlc2M+PERldGFpbHM+PCFbQ0RBVEFbSW4gT3V0cHV0S2V5czoKLQotICAgIC8qKgotICAgICAqIG1ldGhvZCA9ICJ4bWwiIHwgImh0bWwiIHwgInRleHQiIHwgPHZhcj5xbmFtZS1idXQtbm90LW5jbmFtZTwvdmFyPi4KLSAgICAgKgotICAgICAqIDxwPlRoZSBtZXRob2QgYXR0cmlidXRlIGlkZW50aWZpZXMgdGhlIG92ZXJhbGwgbWV0aG9kIHRoYXQKLSAgICAgKiBzaG91bGQgYmUgdXNlZCBmb3Igb3V0cHV0dGluZyB0aGUgcmVzdWx0IHRyZWUuICBPdGhlcgotICAgICAqIG5vbi1uYW1lc3BhY2VkIHZhbHVlcyBtYXkgYmUgdXNlZCwKLQotVGhpcyBpcyBjb250cmFkaWN0YXJ5LCBjaGFuZ2UgInFuYW1lLWJ1dC1ub3QtbmNuYW1lIiB0byAicW5hbWUiLl1dPjwvRGV0YWlscz48L1Nwcj4KLTxTcHI+PE5hbWU+VFJBWFNQUjAwMDM8L05hbWU+Ci08RGF0ZUNyZWF0ZWQ+MTEvMTUvMjAwMDwvRGF0ZUNyZWF0ZWQ+Ci08U3RhdGU+T3BlbjwvU3RhdGU+Ci08VGVzdERlc2M+PC9UZXN0RGVzYz48RGV0YWlscz48IVtDREFUQVtdXT48L0RldGFpbHM+PC9TcHI+Ci08U3ByPjxOYW1lPlRSQVhTUFIwMDA0PC9OYW1lPgotPERhdGVDcmVhdGVkPjExLzE1LzIwMDA8L0RhdGVDcmVhdGVkPgotPFN0YXRlPk9wZW48L1N0YXRlPgotPFRlc3REZXNjPjwvVGVzdERlc2M+PERldGFpbHM+PCFbQ0RBVEFbXV0+PC9EZXRhaWxzPjwvU3ByPgotPFNwcj48TmFtZT5UUkFYU1BSMDAwNTwvTmFtZT4KLTxEYXRlQ3JlYXRlZD4xMS8xNS8yMDAwPC9EYXRlQ3JlYXRlZD4KLTxTdGF0ZT5PcGVuPC9TdGF0ZT4KLTxUZXN0RGVzYz48L1Rlc3REZXNjPjxEZXRhaWxzPjwhW0NEQVRBW11dPjwvRGV0YWlscz48L1Nwcj4KLQotPC9TcHJzPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy9kZXNpZ24vY29tcGlsYXRpb24uZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24vY29tcGlsYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzVkN2Q0Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL2NvbXBpbGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL2NvbmNlcHR1YWwuZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24vY29uY2VwdHVhbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4M2ZlZTUuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy9kZXNpZ24vY29uY2VwdHVhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL2Rlc2lnbi9kYXRhLmdpZiBiL3hkb2NzL3NvdXJjZXMvZGVzaWduL2RhdGEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjI4YTE3Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL2RhdGEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy9kZXNpZ24vZGVzaWduMl8wXzAueG1sIGIveGRvY3Mvc291cmNlcy9kZXNpZ24vZGVzaWduMl8wXzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGZjMmU1Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL2Rlc2lnbjJfMF8wLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBzMSBTWVNURU0gInNiazovc3R5bGUvZHRkL2RvY3VtZW50LmR0ZCI+Ci08czEgdGl0bGU9IlhhbGFuLUogMi4wIERlc2lnbiI+Ci0gIDxwPjxsaW5rPlhhbGFuLUogMi4wIERlc2lnbjwvbGluaz48aW1nIHNyYz0ieG1sbG9nby5naWYiIGFsdD0ieG1sbG9nby5naWYiLz48L3A+Ci0gIDxwPkF1dGhvcjogU2NvdHQgQm9hZzxici8+U3RhdGU6IEluIFByb2dyZXNzPC9wPgotICA8dWw+IAotCSAgIDxsaT48bGluayBhbmNob3I9ImludHJvIj5JbnRyb2R1Y3Rpb248L2xpbms+PC9saT4KLSAJICAgPGxpPjxsaW5rIGFuY2hvcj0icmVxdWlyZW1lbnRzIj5YYWxhbiBSZXF1aXJlbWVudHM8L2xpbms+PC9saT4KLQkgICA8bGk+PGxpbmsgYW5jaG9yPSJvdmVyYXJjaCI+T3ZlcnZpZXcgb2YgQXJjaGl0ZWN0dXJlPC9saW5rPjwvbGk+Ci0JICAgPGxpPjxsaW5rIGFuY2hvcj0icHJvY2VzcyI+UHJvY2VzcyBNb2R1bGU8L2xpbms+PC9saT4KLQkgICA8bGk+PGxpbmsgYW5jaG9yPSJ0ZW1wbGF0ZXMiPlRlbXBsYXRlcyBNb2R1bGU8L2xpbms+PC9saT4KLQkgICA8bGk+PGxpbmsgYW5jaG9yPSJ0cmFuc2Zvcm1lciI+VHJhbnNmb3JtZXIgTW9kdWxlPC9saW5rPjwvbGk+Ci0gICAgICAgPHVsPgotICAgICAgICAgPGxpPjxsaW5rIGFuY2hvcj0ic3RyZWUiPlN0cmVlIE1vZHVsZTwvbGluaz48L2xpPgotICAgICAgICAgPGxpPjxsaW5rIGFuY2hvcj0iZXh0ZW5zaW9ucyI+RXh0ZW5zaW9ucyBNb2R1bGU8L2xpbms+PC9saT4KLSAgICAgPC91bD4KLQkgICA8bGk+PGxpbmsgYW5jaG9yPSJ4cGF0aCI+WFBhdGggTW9kdWxlPC9saW5rPjwvbGk+Ci0gICAgICAgPHVsPjxsaT48bGluayBhbmNob3I9InhwYXRoZGJjb25uIj5YUGF0aCBEYXRhYmFzZSBDb25uZWN0aW9uPC9saW5rPjwvbGk+PC91bD4KLQkgICA8bGk+PGxpbmsgYW5jaG9yPSJ1dGlscyI+VXRpbHMgUGFja2FnZTwvbGluaz48L2xpPiAgICAgICAgIAotCSAgIDxsaT48bGluayBhbmNob3I9Im90aGVyIj5PdGhlciBQYWNrYWdlczwvbGluaz48L2xpPiAgICAgICAgIAotCSAgIDxsaT48bGluayBhbmNob3I9ImNvbXBpbGF0aW9uIj5YYWxhbiBTdHlsZXNoZWV0IENvbXBsaWxhdGlvbiB0byBKYXZhPC9saW5rPjwvbGk+PGxpPjxsaW5rIGFuY2hvcj0ib3B0aW1pemF0aW9ucyI+RnV0dXJlIE9wdGltaXphdGlvbnM8L2xpbms+PC9saT48bGk+PGxpbmsgYW5jaG9yPSJjb2RpbmciPkNvZGluZyBDb252ZW50aW9uczwvbGluaz48L2xpPgotCSAgICAgICAgCi0gICA8bGk+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9pbmRleC5odG1sIj5YYWxhbi1KIDIuMCBKYXZhZG9jPC9qdW1wPjwvbGk+Ci0gIDwvdWw+PGFuY2hvciBuYW1lPSJpbnRybyIvPgotICA8czIgdGl0bGU9IkludHJvZHVjdGlvbiI+IAotCSA8cD48bGluaz5JbnRyb2R1Y3Rpb248L2xpbms+PC9wPiAKLQkgPHA+VGhpcyBkb2N1bWVudCBwcmVzZW50cyB0aGUgYmFzaWMgZGVzaWduIGZvciBYYWxhbi1KIDIuMCwgd2hpY2ggaXMgYQotCQk8anVtcCBocmVmPSJodHRwOi8vd3d3LmF3bC5jb20vY3NlbmcvdGl0bGVzLzAtMjAxLTg5NTQyLTAvdGVjaG5pcXVlcy9yZWZhY3RvcmluZy5odG0iPnJlZmFjdG9yaW5nPC9qdW1wPgotCQlhbmQgcmVkZXNpZ24gb2YgdGhlIFhhbGFuLUogMS54IHByb2Nlc3Nvci4gICBUaGlzIGRvY3VtZW50IHdpbGwgZXhwYW5kIGFuZCBncm93IG92ZXIgdGltZSwgYW5kIGlzIGFsc28gaW5jb21wbGV0ZSBpbiBzb21lIHNlY3Rpb25zLCB0aG91Z2ggaG9wZWZ1bGx5IG92ZXJhbGwgYWNjdXJhdGUuICBUaGUgcmVhZGVyIHNob3VsZCBiZSBhYmxlIHRvIGdldCBhIGdvb2Qgb3ZlcmFsbCBpZGVhIG9mIHRoZSBpbnRlcm5hbCBkZXNpZ24gb2YgWGFsYW4sIGFuZCBiZWdpbiB0byB1bmRlcnN0YW5kIHRoZSBwcm9jZXNzIGZsb3csIGFuZCBhbHNvIHRoZSB0ZWNobmljYWwgY2hhbGxhbmdlcy48L3A+IAotCSA8cD5UaGUgbWFpbiBnb2FscyBvZiB0aGlzIHJlZGVzaWduIGFyZQotCQl0bzogPC9wPjxvbD4gCi0JCTxsaT5NYWtlIHRoZSBkZXNpZ24gYW5kIGNvZGUgbW9yZSB1bmRlcnN0YW5kYWJsZSBieSBPcGVuIFNvdXJjZQotCQkgIHBlb3BsZS48L2xpPiAKLQkJPGxpPlJlZHVjZSBjb2RlIHNpemUgYW5kIGNvbXBsZXhpdHkuPC9saT4KLQkJPGxpPkJ5IHNpbXBsaWZ5aW5nIHRoZSBjb2RlLCBtYWtlIG9wdGltaXphdGlvbiBlYXNpZXIuPC9saT4gCi0JCTxsaT5NYWtlIG1vZHVsZXMgZ2VuZXJhbGx5IG1vcmUgbG9jYWxpemVkLCBhbmQgbGVzcyB0YW5nbGVkIHdpdGggb3RoZXIKLQkJICBtb2R1bGVzLjwvbGk+IAotCQk8bGk+Q29uZm9ybSB0byB0aGUgPGp1bXAgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9hYm91dEphdmEvY29tbXVuaXR5cHJvY2Vzcy9qc3IvanNyXzA2M19qYXhwMTEuaHRtbCI+amF2YXgueG1sLnRyYW5zZm9ybSAgKFRyQVggW1RyYW5zZm9ybWF0aW9ucyBmb3IgWE1MXSk8L2p1bXA+IGludGVyZmFjZXMuPC9saT4gCi0JIDxsaT5JbmNyZWFzZSB0aGUgYWJpbGl0eSB0byBpbmNyZW1lbnRhbGx5IHByb2R1Y2UgdGhlIHJlc3VsdCB0cmVlLjwvbGk+PC9vbD4gCi0JIDxwPlRoZSB0ZWNobmlxdWVzIHVzZWQgdG93YXJkIHRoZXNlIGdvYWxzIGFyZSB0bzo8L3A+IAotCSA8b2w+IAotCQk8bGk+SW4gZ2VuZXJhbCwgZmxhdHRlbiB0aGUgaGllcmFyY2h5IG9mIHBhY2thZ2VzLCBpbiBvcmRlciB0byBtYWtlIHRoZQotCQkgIHN0cnVjdHVyZSBtb3JlIGFwcGFyZW50IGZyb20gdGhlIHRvcC1sZXZlbCB2aWV3LjwvbGk+IAotCQk8bGk+QnJlYWsgdGhlIGNvbnN0cnVjdGlvbiBhbmQgdGhlIHZhbGlkYXRpb24gb2YgdGhlIFhTTFQgc3R5bGVzaGVldCBmcm9tCi0JCSAgdGhlIHN0eWxlc2hlZXQgb2JqZWN0cyB0aGVtc2VsdmVzLjwvbGk+Ci0JCTxsaT5Ecml2ZSB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBzdHlsZXNoZWV0IHRocm91Z2ggYSB0YWJsZSwgc28gdGhhdCBpdAotCQkgIGlzIGxlc3MgcHJvbmUgdG8gZXJyb3IuPC9saT4gCi0JCTxsaT5CcmVhayB0aGUgdHJhbnNmb3JtYXRpb24gcHJvY2VzcyBpbnRvIGEgc2VwYXJhdGUgcGFja2FnZSwgYXdheSBmcm9tCi0JCSAgdGhlIHN0eWxlc2hlZXQgb2JqZWN0cy48L2xpPiAKLQkJPGxpPkNyZWF0ZSB0aGlzIGRlc2lnbiBkb2N1bWVudCwgYXMgYSBzdGFydGluZyBwb2ludCBmb3IgcGVvcGxlIGludGVyZXN0ZWQgaW4KLQkJICBhcHByb2FjaGluZyB0aGUgY29kZS48L2xpPiAKLQkgPC9vbD4gCi0JIDxwPlRoZSBnb2FscyBhcmUgbm90OjwvcD4gCi0JIDxvbD4gCi0JCTxsaT5UbyBhZGQgbW9yZSBmZWF0dXJlcyBpbiB0aGUgcHJvZ3Jlc3Mgb2YgdGhpcyByZWZhY3RvcmluZy4gVGhpcyBpcwotCQkgIGRlc2lnbiBhbmQgY29kZSBjbGVhbi11cCBpbiBvcmRlciB0byBtZWV0IHRoZSBhYm92ZS1uYW1lZCBnb2Fscy4gV2UgZXhwZWN0IHRoYXQgaXQgd2lsbCBiZSA8ZW0+bXVjaDwvZW0+IGVhc2llciB0byBhZGQKLQkJICBmZWF0dXJlcyBvbmNlIHRoaXMgd29yayBpcyBjb21wbGV0ZWQuPC9saT4gCi0JCTxsaT5UbyBvcHRpbWl6ZSBjb2RlIGZvciB0aGUgc2FrZSBvZiBvcHRpbWl6YXRpb24uIEhvd2V2ZXIsIHdlCi0JCSAgZXhwZWN0IHRoYXQgdGhlIGNvZGUgd2lsbCBiZSBmYXN0ZXIgb25jZSB0aGlzIHdvcmsgaXMgY29tcGxldGUuPC9saT4gCi0JIDwvb2w+IAotCSA8cD5Ib3cgd2VsbCB3ZSd2ZSBhY2hpZXZlZCB0aGUgZ29hbHMgd2lsbCBiZSBtZWFzdXJlZCBieSBmZWVkYmFjayBmcm9tIHRoZQotCQk8anVtcCBocmVmPSJodHRwOi8vYXJjaGl2ZS5jb3ZhbGVudC5uZXQvIj5YYWxhbi1kZXY8L2p1bXA+IGxpc3QsIGFuZCBieSBzb2Z0d2FyZSBtZXRyaWNzIHRvb2xzLjwvcD4gCi0JIDxwPlBsZWFzZSBub3RlIHRoYXQgdGhlIGRpYWdyYW1zIGluIHRoaXMgZGVzaWduIGRvY3VtZW50IGFyZSBtZWFudCB0byBiZQotCQl1c2VmdWwgYWJzdHJhY3Rpb25zLCBhbmQgbWF5IG5vdCBhbHdheXMgYmUgZXhhY3QuPC9wPiAKLSAgPC9zMj48YW5jaG9yIG5hbWU9InJlcXVpcmVtZW50cyIvPiAKLSAgPHMyIHRpdGxlPSJYYWxhbiBSZXF1aXJlbWVudHMiPjxwPjxsaW5rPlhhbGFuIFJlcXVpcmVtZW50czwvbGluaz48L3A+PHA+VGhlc2UgYXJlIHRoZSBjb25jcmV0ZSBnZW5lcmFsIHJlcXVpcmVtZW50cyBvZiBYYWxhbiwgYXMgSSB1bmRlcnN0YW5kIHRoZW0sIGFuZCBjb3ZlcmluZyBib3RoIHRoZSBKYXZhIGFuZCBDKysgdmVyc2lvbnMuICBUaGVzZSByZXF1aXJlbWVudHMgaGF2ZSBiZWVuIGJ1aWx0IHVwIG92ZXIgdGltZSBieSBleHBlcmllbmNlIHdpdGggcHJvZHVjdCBncm91cHMgYW5kIGdlbmVyYWwgdXNlcnMuPC9wPjxvbD48bGk+SmF2YSwgQysrIFZlcnNpb25zLjwvbGk+PGxpPlhTTFQgMS4wIGNvbmZvcm1hbmNlLCBhbmQgYmV5b25kLiAoaS5lLiBjb25mb3JtIHRvIHRoZSBjdXJyZW50IFczQyByZWNvbW1lbmRhdGlvbikuPC9saT48bGk+SGF2ZSBkZXNpZ24gYW5kIENvZGUgdW5kZXJzdGFuZGFibGUgYnkgT3BlbiBTb3VyY2UgQ29tbXVuaXR5LjwvbGk+PGxpPkFiaWxpdHkgdG8gaW50ZXJvcGVyYXRlIHdpdGggc3RhbmRhcmQgQVBJcy4gIChTQVgyLCBET00yLCBKQVhQKSAgW3RoaXMgaXMgY3VycmVudGx5IExlc3Mgb2YgYW4gaXNzdWUgd2l0aCBDKytdLjwvbGk+PGxpPkhpZ2ggUGVyZm9ybWFuY2UgKFJhdyBwZXJmb3JtYW5jZSwgSW5jcmVtZW50YWwgYWJpbGl0eSwgU2NhbGVhYmlsaXR5IHRvIGxhcmdlIGRvY3VtZW50cywgUmVkdWN0aW9uIG9mIEdhcmJhZ2UgQ29sbGVjdGlvbiBmb3IgdGhlIEphdmEgdmVyc2lvbi4pPC9saT48bGk+VG9vbGluZyBBUEkgKEFjY2VzcyBzdHlsZXNoZWV0IGRhdGEgc3RydWN0dXJlcywgQWNjZXNzIHNvdXJjZSBub2RlIGZyb20gcmVzdWx0IGV2ZW50LCBBc2sgcnVudGltZSBxdWVzdGlvbnMsIERlYnVnZ2luZyBBUEkpLjwvbGk+PGxpPlN1cHBvcnQgYWRkcmVzc2luZyBvZiBYTUwgaW4gc3RhbmRhbG9uZSBmYXNoaW9uIChpLmUuIFhQYXRoIEFQSSkuPC9saT48bGk+RXh0ZW5zaWJpbGl0eSAoQWJpbGl0eSB0byBjYWxsIEphdmEsIEFiaWxpdHkgdG8gY2FsbCBKYXZhU2NyaXB0LCBvdGhlciBsYW5ndWFnZXMpLjwvbGk+PGxpPk11bHRpcGxlIGRhdGEgc291cmNlcyAoSkRCQywgTERBUCwgb3RoZXIgZGF0YSBzb3VyY2VzLCBEaXJlY3QgWE1MIHJlcG9zaXRvcnkgY291cGxpbmcpLjwvbGk+PC9vbD48L3MyPjxhbmNob3IgbmFtZT0ib3ZlcmFyY2giLz4gCi0gIDxzMiB0aXRsZT0iT3ZlcnZpZXcgb2YgQXJjaGl0ZWN0dXJlIj4gCi0JIDxwPjxsaW5rPk92ZXJ2aWV3IG9mIEFyY2hpdGVjdHVyZTwvbGluaz48L3A+PHA+VGhlIGZvbGxvd2luZyBkaWFncmFtIHNob3dzIHRoZSBYU0xUIGFic3RyYWN0IHByb2Nlc3NpbmcgbW9kZWwuICBBIHRyYW5zZm9ybWF0aW9uIGV4cHJlc3NlZCBpbiBYU0xUIGRlc2NyaWJlcyBydWxlcyBmb3IgdHJhbnNmb3JtaW5nIGEgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjZGF0YS1tb2RlbCI+U291cmNlIFRyZWUgPC9qdW1wPiBpbnRvIGEgcmVzdWx0IHRyZWUuIFRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBhY2hpZXZlZCBieSBhc3NvY2lhdGluZyBwYXR0ZXJucyB3aXRoIHRlbXBsYXRlcy4gQSBwYXR0ZXJuIGlzIG1hdGNoZWQgYWdhaW5zdCBlbGVtZW50cyBpbiB0aGUgc291cmNlIHRyZWUuIEEgdGVtcGxhdGUgaXMgaW5zdGFudGlhdGVkIHRvIGNyZWF0ZSBwYXJ0IG9mIHRoZSByZXN1bHQgdHJlZS4gVGhlIHJlc3VsdCB0cmVlIGlzIHNlcGFyYXRlIGZyb20gdGhlIHNvdXJjZSB0cmVlLiBUaGUgc3RydWN0dXJlIG9mIHRoZSByZXN1bHQgdHJlZSBjYW4gYmUgY29tcGxldGVseSBkaWZmZXJlbnQgZnJvbSB0aGUgc3RydWN0dXJlIG9mIHRoZSBzb3VyY2UgdHJlZS4gSW4gY29uc3RydWN0aW5nIHRoZSByZXN1bHQgdHJlZSwgZWxlbWVudHMgZnJvbSB0aGUgc291cmNlIHRyZWUgY2FuIGJlIGZpbHRlcmVkIGFuZCByZW9yZGVyZWQsIGFuZCBhcmJpdHJhcnkgc3RydWN0dXJlIGNhbiBiZSBhZGRlZC4KLQotPC9wPjxwPlRoZSB0ZXJtICJ0cmVlIiwgYXMgdXNlZCB3aXRoaW4gdGhpcyBkb2N1bWVudCwgZGVzY3JpYmVzIGFuCi0JCQkgYWJzdHJhY3Qgc3RydWN0dXJlIHRoYXQgY29uc2lzdHMgb2Ygbm9kZXMgb3IgZXZlbnRzIHRoYXQgbWF5IGJlIHByb2R1Y2VkIGJ5Ci0JCQkgWE1MLiBBIFRyZWUgcGh5c2ljYWxseSBtYXkgYmUgYSBET00gdHJlZSwgYSBzZXJpZXMgb2Ygd2VsbCBiYWxhbmNlZCBwYXJzZQotCQkJIGV2ZW50cyAoc3VjaCBhcyB0aG9zZSBjb21pbmcgZnJvbSBhIFNBWDIgQ29udGVudEhhbmRlciksIGEgc2VyaWVzIG9mIHJlcXVlc3RzCi0JCQkgKHRoZSByZXN1bHQgb2Ygd2hpY2ggY2FuIGRlc2NyaWJlIGEgdHJlZSksIG9yIGEgc3RyZWFtIG9mIG1hcmtlZC11cAotCQkJIGNoYXJhY3RlcnMuPC9wPjxwPjxpbWcgc3JjPSJ4c2x0X2Fic3RyYWN0LmdpZiIgYWx0PSJ4c2x0X2Fic3RyYWN0LmdpZiIvPjwvcD48cD5UaGUgcHJpbWFyeSBpbnRlcmZhY2UgZm9yIFhhbGFuIDIuMCBleHRlcm5hbCB1c2FnZSBpcyBkZWZpbmVkIGluIHRoZSA8anVtcCBocmVmPSIuLi9hcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwjcGFja2FnZV9kZXNjcmlwdGlvbiI+amF2YXgueG1sLnRyYW5zZm9ybTwvanVtcD4gaW50ZXJmYWNlcy4gIFRoZXNlIGludGVyZmFjZXMgZGVmaW5lIGEgc3RhbmRhcmQgYW5kIHBvd2VyZnVsIGludGVyZmFjZSB0byBwZXJmb3JtIHRyZWUtYmFzZWQgdHJhbnNmb3JtYXRpb25zLjwvcD4gCi0JIDxwPlRoZSBpbnRlcm5hbCBhcmNoaXRlY3R1cmUgb2YgWGFsYW4gMi4wIGlzIGRpdmlkZWQgaW50byBmb3VyIG1ham9yIG1vZHVsZXMsIGFuZCB2YXJpb3VzIHNtYWxsZXIKLQkJbW9kdWxlcy4gVGhlIG1haW4gbW9kdWxlcyBhcmU6PC9wPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9wcm9jZXNzb3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yPC9qdW1wPjwvY29kZT48L2xhYmVsPiAKLQkJPGl0ZW0+VGhlIG1vZHVsZSB0aGF0IHByb2Nlc3NlcyB0aGUgc3R5bGVzaGVldCwgYW5kIHByb3ZpZGVzIHRoZSBtYWluCi0JCSAgZW50cnkgcG9pbnQgaW50byBYYWxhbi48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzPC9qdW1wPjwvY29kZT48L2xhYmVsPiAKLQkJPGl0ZW0+VGhlIG1vZHVsZSB0aGF0IGRlZmluZXMgdGhlIHN0eWxlc2hlZXQgc3RydWN0dXJlcywgaW5jbHVkaW5nIHRoZQotCQkgIFN0eWxlc2hlZXQgb2JqZWN0LCB0ZW1wbGF0ZSBlbGVtZW50IGluc3RydWN0aW9ucywgYW5kIEF0dHJpYnV0ZSBWYWx1ZQotCQkgIFRlbXBsYXRlcy4gPC9pdGVtPiAKLQkgPC9nbG9zcz4gCi0JIDxnbG9zcz4gCi0JCTxsYWJlbD48Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXI8L2p1bXA+PC9jb2RlPjwvbGFiZWw+IAotCQk8aXRlbT5UaGUgbW9kdWxlIHRoYXQgYXBwbGllcyB0aGUgc291cmNlIHRyZWUgdG8gdGhlIFRlbXBsYXRlcywgYW5kCi0JCSAgcHJvZHVjZXMgYSByZXN1bHQgdHJlZS48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94cGF0aC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmFwYWNoZS54cGF0aDwvanVtcD48L2NvZGU+PC9sYWJlbD4gCi0JCTxpdGVtPlRoZSBtb2R1bGUgdGhhdCBwcm9jZXNzZXMgYm90aCBYUGF0aCBleHByZXNzaW9ucywgYW5kIFhTTFQgTWF0Y2gKLQkJICBwYXR0ZXJucy48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgPHA+SW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIG1vZHVsZXMsIFhhbGFuIGltcGxlbWVudHMgdGhlCi0JCTxqdW1wIGhyZWY9Ii4uL2FwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9wYWNrYWdlLXN1bW1hcnkuaHRtbCNwYWNrYWdlX2Rlc2NyaXB0aW9uIj5qYXZheC54bWwudHJhbnNmb3JtPC9qdW1wPiBpbnRlcmZhY2VzLCBhbmQgZGVwZW5kcyBvbiB0aGUKLQkgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9KYXZhL2luZGV4Lmh0bWwiPlNBWDI8L2p1bXA+IGFuZCA8anVtcCBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi8iPkRPTTwvanVtcD4gcGFja2FnZXMuCi08L3A+PHA+PGltZyBzcmM9InRyYXguZ2lmIiBhbHQ9InRyYXguZ2lmIi8+PC9wPjxwPlRoZXJlIGlzIGFsc28gYSBnZW5lcmFsIHV0aWxpdGllcyBwYWNrYWdlIHRoYXQgY29udGFpbnMgYm90aCBYTUwgdXRpbGl0eQotCSBjbGFzc2VzIHN1Y2ggYXMgUU5hbWUsIGJ1dCBnZW5lcmFsbHkgdXNlZnVsIGNsYXNzZXMgc3VjaCBhcwotCSBTdHJpbmdUb0ludFRhYmxlLjwvcD4gCi0JIDxwPkluIHRoZSBkaWFncmFtIGJlbG93LCB0aGUgZGFzaGVkIGxpbmVzIGRlbm90ZSB2aXNpYmlsaXR5LiBBbGwgcGFja2FnZXMKLQkJYWNjZXNzIHRoZSBTQVgyIGFuZCBET00gcGFja2FnZXMuPC9wPiAKLQkgPHA+PGltZyBzcmM9InhhbGFuMV8xeDEuZ2lmIiBhbHQ9InhhbGFuMV8xeDEuZ2lmIi8+PC9wPiAKLQkgPHA+SW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIHBhY2thZ2VzLCB0aGVyZSBhcmUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsCi0JCXBhY2thZ2VzOjwvcD4gCi0JIDxnbG9zcz4gCi0JCTxsYWJlbD48Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vY2xpZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLmNsaWVudDwvanVtcD48L2NvZGU+PC9sYWJlbD4gCi0JCTxpdGVtPlRoaXMgcGFja2FnZSBoYXMgYSBjbGllbnQgYXBwbGV0LiBJIHN1c3BlY3QgdGhpcyBzaG91bGQgYmUgbW92ZWQKLQkJICBpbnRvIHRoZSBzYW1wbGVzIGRpcmVjdG9yeS48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLmV4dGVuc2lvbnM8L2p1bXA+PC9jb2RlPjwvbGFiZWw+IAotCQk8aXRlbT5UaGlzIGhvbGRzIGNsYXNzZXMgYmVsb25naW5nIHRvIHRoZSBYYWxhbiBleHRlbnNpb25zIG1lY2hhbmlzbSwKLQkJICB3aGljaCBhbGxvd3MgSmF2YSBjb2RlIGFuZCBzY3JpcHQgdG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgc3R5bGVzaGVldC48L2l0ZW0+Ci0JCQotCSA8L2dsb3NzPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9saWIvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ubGliPC9qdW1wPjwvY29kZT48L2xhYmVsPiAKLQkJPGl0ZW0+VGhpcyBpcyB0aGUgYnVpbHQtaW4gWGFsYW4gZXh0ZW5zaW9ucyBsaWJyYXJ5LCB3aGljaCBob2xkcwotCQkgIGV4dGVuc2lvbnMgc3VjaCBhcyBSZWRpcmVjdCAod2hpY2ggYWxsb3dzIGEgc3R5bGVzaGVldCB0byBwcm9kdWNlIG11bHRpcGxlCi0JCSAgb3V0cHV0IGZpbGVzKS48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9yZXMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucmVzPC9qdW1wPjwvY29kZT48L2xhYmVsPiAKLQkJPGl0ZW0+VGhpcyBob2xkcyByZXNvdXJjZSBmaWxlcyBuZWVkZWQgYnkgWGFsYW4sIHN1Y2ggYXMgZXJyb3IgbWVzc2FnZQotCQkgIHJlc291cmNlcy48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgIAotCSA8Z2xvc3M+IAotCQk8bGFiZWw+PGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RyYWNlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLnRyYWNlPC9qdW1wPjwvY29kZT48L2xhYmVsPiAKLQkJPGl0ZW0+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgdGhhdCBhbGxvdyBhIGNhbGxlciB0bwotCQkgIGFkZCB0cmFjZSBsaXN0ZW5lcnMgdG8gdGhlIHRyYW5zZm9ybWF0aW9uLCBhbGxvd2luZyBhbiBpbnRlcmZhY2UgdG8gWFNMVAotCQkgIGRlYnVnZ2VycyBhbmQgc2ltaWxhciB0b29scy48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi94c2x0L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLnhzbHQ8L2p1bXA+PC9jb2RlPjwvbGFiZWw+IAotCQk8aXRlbT5UaGlzIHBhY2thZ2UgaG9sZHMgdGhlIFhhbGFuMiBjb21tYW5kIGxpbmUgcHJvY2Vzc29yLjwvaXRlbT4gCi0JIDwvZ2xvc3M+IAotICA8cD5BIG1vcmUgY29uY2VwdHVhbCB2aWV3IG9mIHRoaXMgYXJjaGl0ZWN0dXJlIGlzIGFzIGZvbGxvd3M6PC9wPjxwPjxpbWcgc3JjPSJjb25jZXB0dWFsLmdpZiIgYWx0PSJQaWN0dXJlIG9mIGNvbmNlcHR1YWwgYXJjaGl0ZWN0dXJlLiIvPjwvcD48L3MyPjxhbmNob3IgbmFtZT0icHJvY2VzcyIvPiAKLSAgPHMyIHRpdGxlPSJQcm9jZXNzIE1vZHVsZSI+IAotCSA8cD48bGluaz5Qcm9jZXNzb3IgTW9kdWxlPC9saW5rPjwvcD4gCi0JIDxwPlRoZSA8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3NvcjwvanVtcD48L2NvZGU+IG1vZHVsZSBpbXBsZW1lbnRzIHRoZQotCQk8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vVHJhbnNmb3JtZXJGYWN0b3J5Lmh0bWwiPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5PC9qdW1wPjwvY29kZT4gaW50ZXJmYWNlLCB3aGljaCBwcm92aWRlcyBhCi0JCWZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhIGNvbmNyZXRlIFByb2Nlc3NvciBpbnN0YW5jZSwgYW5kIHByb3ZpZGVzIG1ldGhvZHMKLQkJZm9yIGNyZWF0aW5nIGEgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9qYXZheC94bWwvdHJhbnNmb3JtL1RlbXBsYXRlcy5odG1sIj5qYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlczwvanVtcD48L2NvZGU+IGluc3RhbmNlLCB3aGljaCwgaW4KLQkJWGFsYW4gYW5kIFhTTFQgdGVybXMsIGlzIHRoZSBTdHlsZXNoZWV0LiBUaHVzIHRoZSB0YXNrIG9mIHRoZSBwcm9jZXNzIG1vZHVsZSBpcwotCQl0byByZWFkIHRoZSBYU0xUIGlucHV0IGluIHRoZSBmb3JtIG9mIGEgZmlsZSwgc3RyZWFtLCBTQVggZXZlbnRzLCBvciBhIERPTQotCQl0cmVlLCBhbmQgcHJvZHVjZSBhIFRlbXBsYXRlcy9TdHlsZXNoZWV0IG9iamVjdC48L3A+IAotCSA8cD5UaGUgb3ZlcmFsbCBzdHJhdGVneSBpcyB0byBkZWZpbmUgYSBzY2hlbWEgaW4gdGhhdCBkaWN0YXRlcyB0aGUgbGVnYWwKLQkJc3RydWN0dXJlIGZvciBYU0xUIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLCBhbmQgdG8gYXNzb2NpYXRlIHdpdGggdGhvc2UKLQkJZWxlbWVudHMgY29uc3RydWN0aW9uLXRpbWUgcHJvY2Vzc29ycyB0aGF0IGNhbiBmaWxsIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMKLQkJaW4gdGhlIHRvcC1sZXZlbCBTdHlsZXNoZWV0IG9iamVjdCwgYW5kIGFsc28gYXNzb2NpYXRlIGNsYXNzZXMgaW4gdGhlIHRlbXBsYXRlcwotCQltb2R1bGUgdGhhdCBjYW4gYmUgY3JlYXRlZCBpbiBhIGdlbmVyYWxpemVkIGZhc2hpb24uIFRoaXMgbWFrZXMgdGhlIHZhbGlkYXRpb24KLQkJb2JqZWN0LXRvLWNsYXNzIGFzc29jaWF0aW9ucyBjZW50cmFsaXplZCBhbmQgZGVjbGFyYXRpdmUuPC9wPiAKLQkgPHA+VGhlIHNjaGVtYSdzIHJvb3QgY2xhc3MgaXMKLQkJPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3Nvci9YU0xUU2NoZW1hLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlhTTFRTY2hlbWE8L2p1bXA+PC9jb2RlPiwgYW5kIGl0IGlzIGhlcmUgdGhhdCB0aGUKLQkJWFNMVCBzY2hlbWEgc3RydWN0dXJlIGlzIGRlZmluZWQuIFhTTFRTY2hlbWEgdXNlcwotCQk8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yL1hTTFRFbGVtZW50RGVmLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlhTTFRFbGVtZW50RGVmPC9qdW1wPjwvY29kZT4gdG8gZGVmaW5lIGVsZW1lbnRzLCBhbmQKLQkJPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3Nvci9YU0xUQXR0cmlidXRlRGVmLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlhTTFRBdHRyaWJ1dGVEZWY8L2p1bXA+PC9jb2RlPiB0byBkZWZpbmUgYXR0cmlidXRlcy4KLQkJQm90aCBjbGFzc2VzIGhvbGQgdGhlIGFsbG93ZWQgbmFtZXNwYWNlLCBsb2NhbCBuYW1lLCBhbmQgdHlwZSBvZiBlbGVtZW50IG9yCi0JCWF0dHJpYnV0ZS4gVGhlIFhTTFRFbGVtZW50RGVmIGFsc28gaG9sZHMgYSByZWZlcmVuY2UgdG8gYQotCQk8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yL1hTTFRFbGVtZW50UHJvY2Vzc29yLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlhTTFRFbGVtZW50UHJvY2Vzc29yPC9qdW1wPjwvY29kZT4sIGFuZCBhIHNvbWV0aW1lcyBhCi0JCTxjb2RlPkNsYXNzPC9jb2RlPiBvYmplY3QsIHdpdGggd2hpY2ggaXQgY2FuIGNyZWF0ZSBvYmplY3RzIHRoYXQgZGVyaXZlIGZyb20KLQkJPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVGVtcGxhdGVFbGVtZW50Lmh0bWwiPm9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1UZW1wbGF0ZUVsZW1lbnQ8L2p1bXA+PC9jb2RlPi4gSW4gYWRkaXRpb24sIHRoZQotCQlYU0xURWxlbWVudERlZiBpbnN0YW5jZSBob2xkcyBhIGxpc3Qgb2YgWFNMVEVsZW1lbnREZWYgaW5zdGFuY2VzIHRoYXQgZGVmaW5lCi0JCWxlZ2FsIGVsZW1lbnRzIG9yIGNoYXJhY3RlciBldmVudHMgdGhhdCBhcmUgYWxsb3dlZCBhcyBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4KLQkJZWxlbWVudC48L3A+IAotCSA8cD5UaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lckZhY3RvcnkuaHRtbCI+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk8L2p1bXA+PC9jb2RlPgotCQlpbnRlcmZhY2UgaXMgaW4gPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3Nvci9UcmFuc2Zvcm1lckZhY3RvcnlJbXBsLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGw8L2p1bXA+PC9jb2RlPiwKLQkJd2hpY2ggY3JlYXRlcyBhIDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9wcm9jZXNzb3IvU3R5bGVzaGVldEhhbmRsZXIuaHRtbCI+b3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuU3R5bGVzaGVldEhhbmRsZXI8L2p1bXA+PC9jb2RlPgotCQlpbnN0YW5jZS4gVGhpcyBpbnN0YW5jZSBhY3RzIGFzIHRoZSBDb250ZW50SGFuZGxlciBmb3IgdGhlIHBhcnNlIGV2ZW50cywgYW5kIGlzCi0JCWhhbmRlZCB0byB0aGUgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcveG1sL3NheC9YTUxSZWFkZXIuaHRtbCI+b3JnLnhtbC5zYXguWE1MUmVhZGVyPC9qdW1wPjwvY29kZT4sIHdoaWNoIHRoZSBTdHlsZXNoZWV0UHJvY2Vzc29yCi0JCXVzZXMgdG8gcGFyc2UgdGhlIFhTTFQgZG9jdW1lbnQuIFRoZSA8Y29kZT5TdHlsZXNoZWV0SGFuZGxlcjwvY29kZT4gdGhlbiByZWNlaXZlcyB0aGUgcGFyc2UKLQkJZXZlbnRzLCB3aGljaCBtYWludGFpbnMgdGhlIHN0YXRlIG9mIHRoZSBjb25zdHJ1Y3Rpb24sIGFuZCBwYXNzZXMgdGhlIGV2ZW50cyBvbgotCQl0byB0aGUgYXBwcm9wcmlhdGUgPGNvZGU+WFNMVEVsZW1lbnRQcm9jZXNzb3I8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gZXZlbnQsIGFzIGRpY3RhdGVkIGJ5IHRoZQotCQk8Y29kZT5YU0xURWxlbWVudERlZjwvY29kZT4gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGV2ZW50LjwvcD4gCi0JIDwvczI+PGFuY2hvciBuYW1lPSJ0ZW1wbGF0ZXMiLz4gCi0gIDxzMiB0aXRsZT0iVGVtcGxhdGVzIE1vZHVsZSI+IAotCSA8cD48bGluaz5UZW1wbGF0ZXMgTW9kdWxlPC9saW5rPjwvcD4gCi0JIDxwPlRoZSA8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlczwvanVtcD48L2NvZGU+IG1vZHVsZSBpbXBsZW1lbnRzIHRoZQotCQk8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vVGVtcGxhdGVzLmh0bWwiPmphdmF4LnhtbC50cmFuc2Zvcm0uVGVtcGxhdGVzPC9qdW1wPjwvY29kZT4gaW50ZXJmYWNlLCBhbmQgZGVmaW5lcyBhIHNldCBvZgotCQljbGFzc2VzIHRoYXQgcmVwcmVzZW50IGEgU3R5bGVzaGVldC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0bwotCQlob2xkIHN0eWxlc2hlZXQgZGF0YSwgbm90IHRvIHBlcmZvcm0gcHJvY2VkdXJhbCB0YXNrcyBhc3NvY2lhdGVkIHdpdGggdGhlCi0JCWNvbnN0cnVjdGlvbiBvZiB0aGUgZGF0YSwgbm9yIHRhc2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNmb3JtYXRpb24gaXRzZWxmLgotCQk8L3A+IAotCSA8cD5UaGUgYmFzZSBjbGFzcyBvZiBhbGwgdGVtcGxhdGVzIG9iamVjdHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGFuIFhTTFQgZWxlbWVudCBpcyB0aGUgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVGVtcGxhdGVFbGVtZW50Lmh0bWwiPkVsZW1UZW1wbGF0ZUVsZW1lbnQ8L2p1bXA+PC9jb2RlPiBvYmplY3QsIHdoaWNoIGluIHR1cm4gaW1wbGVtZW50cyA8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveG1sL3V0aWxzL1VuSW1wbE5vZGUuaHRtbCI+VW5JbXBsTm9kZTwvanVtcD48L2NvZGU+LiAgIEEgPGNvZGU+RWxlbVRlbXBsYXRlRWxlbWVudDwvY29kZT4gb2JqZWN0IG11c3QgYmUgaW1tdXRhYmxlIG9uY2UgaXQncyBjb25zdHJ1Y3RlZCwgc28gdGhhdCBpdCBtYXkgYmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LiAgSWRlYWxseSwgYSA8Y29kZT5FbGVtVGVtcGxhdGVFbGVtZW50PC9jb2RlPiBzaG91bGQgYmUgYSBkYXRhIG9iamVjdCBvbmx5LCBhbmQgYmUgdXNlZCB2aWEgYSB2aXNpdG9yIHBhdHRlcm4uICBIb3dldmVyLCBpbiBwcmFjdGljZSB0aGlzIGlzIGltcHJhY3RpY2FsLCBiZWNhdXNlIGl0IHdvdWxkIGNhdXNlIHRvbyBtdWNoIGRhdGEgZXhwb3N1cmUgYW5kIHdvdWxkIGhhdmUgYSBzaWduaWZpY2FudCBpbXBhY3Qgb24gcGVyZm9ybWFuY2UuICBUaGVyZWZvcmUsIGVhY2ggPGNvZGU+RWxlbVRlbXBsYXRlRWxlbWVudDwvY29kZT4gY2xhc3MgaGFzIGFuIDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVRlbXBsYXRlRWxlbWVudC5odG1sI2V4ZWN1dGUob3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGwsIG9yZy53M2MuZG9tLk5vZGUsIG9yZy5hcGFjaGUueG1sLnV0aWxzLlFOYW1lKSI+ZXhlY3V0ZTwvanVtcD48L2NvZGU+IG1ldGhvZCB3aGVyZSBpdCBwZXJmb3JtcyBpdCdzIHRyYW5zZm9ybWF0aW9uIGR1dGllcy4gIEEgPGNvZGU+RWxlbVRlbXBsYXRlRWxlbWVudDwvY29kZT4gYWxzbyBrbm93cyBpdCdzIHBvc2l0aW9uIGluIHRoZSBzb3VyY2Ugc3R5bGVzaGVldCwgYW5kIGNhbiBhbnN3ZXIgcXVlc3Rpb25zIGFib3V0IGN1cnJlbnQgbmFtZXNwYWNlIG5vZGVzLjwvcD48cD5BIDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvU3R5bGVzaGVldFJvb3QuaHRtbCI+U3R5bGVzaGVldFJvb3Q8L2p1bXA+PC9jb2RlPiwgd2hpY2ggaW1wbGVtZW50cyB0aGUKLQkJPGNvZGU+VGVtcGxhdGVzPC9jb2RlPiBpbnRlcmZhY2UsIGlzIGEgdHlwZSBvZiA8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL1N0eWxlc2hlZXRDb21wb3NlZC5odG1sIj5TdHlsZXNoZWV0Q29tcG9zZWQ8L2p1bXA+PC9jb2RlPiwKLQkJd2hpY2ggaXMgYSA8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL1N0eWxlc2hlZXQuaHRtbCI+U3R5bGVzaGVldDwvanVtcD48L2NvZGU+IGNvbXBvc2VkIG9mIGl0c2VsZiBhbmQgYWxsIGluY2x1ZGVkCi0JCTxjb2RlPlN0eWxlc2hlZXQ8L2NvZGU+IG9iamVjdHMuIEEgPGNvZGU+U3R5bGVzaGVldFJvb3Q8L2NvZGU+IGhhcyBhIGdsb2JhbAotCQlpbXBvcnRzIGxpc3QsIHdoaWNoIGlzIGEgbGlzdCBvZiBhbGwgaW1wb3J0ZWQgPGNvZGU+U3R5bGVzaGVldENvbXBvc2VkPC9jb2RlPgotCQlpbnN0YW5jZXMuIEZyb20gZWFjaCA8Y29kZT5TdHlsZXNoZWV0Q29tcG9zZWQ8L2NvZGU+IG9iamVjdCwgb25lIGNhbiBpdGVyYXRlCi0JCXRocm91Z2ggdGhlIGxpc3Qgb2YgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmNsdWRlZCA8Y29kZT5TdHlsZXNoZWV0PC9jb2RlPgotCQlvYmplY3RzLCBhbmQgb25lIGNhbGwgYWxzbyBpdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgYWxsCi0JCTxjb2RlPlN0eWxlc2hlZXRDb21wb3NlZDwvY29kZT4gb2JqZWN0cyBvZiBsZXNzZXIgaW1wb3J0IHByZWNlZGVuY2UuCi0JCTxjb2RlPlN0eWxlc2hlZXRSb290PC9jb2RlPiBpcyBhIDxjb2RlPlN0eWxlc2hlZXRDb21wb3NlZDwvY29kZT4sIHdoaWNoIGlzIGEKLQkJPGNvZGU+U3R5bGVzaGVldDwvY29kZT4uPC9wPiAKLQkgPHA+RWFjaCBzdHlsZXNoZWV0IGhhcyBhIHNldCBvZiBwcm9wZXJ0aWVzLCB3aGljaCBjYW4gYmUgc2V0IGJ5IHZhcmlvdXMKLQkJbWVhbnMsIHVzdWFsbHkgZWl0aGVyIHZpYSBhbiBhdHRyaWJ1dGUgb24geHNsOnN0eWxlc2hlZXQsIG9yIHZpYSBhIHRvcC1sZXZlbAotCQl4c2wgaW5zdHJ1Y3Rpb24gKGZvciBpbnN0YW5jZSwgeHNsOmF0dHJpYnV0ZS1zZXQpLiBUaGUgZ2V0IG1ldGhvZHMgZm9yIHRoZXNlCi0JCXByb3BlcnRpZXMgb25seSBhY2Nlc3MgdGhlIGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgZ2l2ZW4gPGNvZGU+U3R5bGVzaGVldDwvY29kZT4KLQkJb2JqZWN0LCBhbmQgbmV2ZXIgdGFrZXMgaW50byBhY2NvdW50IGluY2x1ZGVkIG9yIGltcG9ydGVkIHN0eWxlc2hlZXRzLiBUaGUKLQkJPGNvZGU+U3R5bGVzaGVldENvbXBvc2VkPC9jb2RlPiBkZXJpdmF0aXZlIG9iamVjdCwgaWYgaXQgaXMgYSByb290Ci0JCTxjb2RlPlN0eWxlc2hlZXQ8L2NvZGU+IG9yIGltcG9ydGVkIDxjb2RlPlN0eWxlc2hlZXQ8L2NvZGU+LCBoYXMgImNvbXBvc2VkIgotCQlnZXR0ZXIgbWV0aG9kcyB0aGF0IGRvIHRha2UgaW50byBhY2NvdW50IGltcG9ydGVkIGFuZCBpbmNsdWRlZCBzdHlsZXNoZWV0cywgZm9yCi0JCXNvbWUgb2YgdGhlc2UgcHJvcGVydGllcy48L3A+IAotCSAgCi0gIDwvczI+PGFuY2hvciBuYW1lPSJ0cmFuc2Zvcm1lciIvPiAKLSAgPHMyIHRpdGxlPSJUcmFuc2Zvcm1lciBNb2R1bGUiPiAKLQkgPHA+PGxpbms+VHJhbnNmb3JtZXIgTW9kdWxlPC9saW5rPjwvcD4gCi0JIDxwPlRoZSA8anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPlRyYW5zZm9ybWVyPC9qdW1wPiBtb2R1bGUgaXMgaW4gY2hhcmdlIG9mIHJ1bi10aW1lIHRyYW5zZm9ybWF0aW9ucy4gIFRoZSA8anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvVHJhbnNmb3JtZXJJbXBsLmh0bWwiPlRyYW5zZm9ybWVySW1wbDwvanVtcD4gb2JqZWN0LCB3aGljaCBpbXBsZW1lbnRzIHRoZSBUckFYIDxqdW1wIGhyZWY9Ii4uL2FwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lci5odG1sIj5UcmFuc2Zvcm1lcjwvanVtcD4gaW50ZXJmYWNlLCBhbmQgaGFzIGFuIGFzc29jaWF0aW9uIHdpdGggYSA8anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL1N0eWxlc2hlZXRSb290Lmh0bWwiPlN0eWxlc2hlZXRSb290PC9qdW1wPiBvYmplY3QsIGJlZ2lucyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgc291cmNlIHRyZWUgKG9yIHByb3ZpZGVzIGEgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9KYXZhL2phdmFkb2Mvb3JnL3htbC9zYXgvQ29udGVudEhhbmRsZXIuaHRtbCI+Q29udGVudEhhbmRsZXI8L2p1bXA+IHJlZmVyZW5jZSB2aWEgdGhlPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3N0cmVlL1NvdXJjZVRyZWVIYW5kbGVyLmh0bWwiPlNvdXJjZVRyZWVIYW5kbGVyPC9qdW1wPjwvY29kZT4pLCBhbmQgcGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9uLiAgVGhlIFRyYW5zZm9ybWVyIHBhY2thZ2UgZG9lcyBhcyBtdWNoIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBhcyBpdCBjYW4sIGJ1dCBlbGVtZW50IGxldmVsIG9wZXJhdGlvbnMgYXJlIGdlbmVyYWxseSBwZXJmb3JtZWQgaW4gdGhlIDxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVRlbXBsYXRlRWxlbWVudC5odG1sI2V4ZWN1dGUob3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGwsIG9yZy53M2MuZG9tLk5vZGUsIG9yZy5hcGFjaGUueGFsYW4udXRpbHMuUU5hbWUpIj5FbGVtVGVtcGxhdGVFbGVtZW50LmV4ZWN1dGUoLi4uKTwvanVtcD4gbWV0aG9kcy48L3A+PHA+UmVzdWx0IFRyZWUgZXZlbnRzIGFyZSBmZWQgaW50byBhIDxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9SZXN1bHRUcmVlSGFuZGxlci5odG1sIj5SZXN1bHRUcmVlSGFuZGxlcjwvanVtcD4gb2JqZWN0LCB3aGljaCBhY3RzIGFzIGEgbGF5ZXIgYmV0d2VlbiB0aGUgZGlyZWN0IGNhbGxzIHRvIHRoZSByZXN1bHQgCi10cmVlIGNvbnRlbnQgaGFuZGxlciAob2Z0ZW4gYSA8anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vc2VyaWFsaXplL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5TZXJpYWxpemVyPC9qdW1wPiksIGFuZCB0aGUgPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+LiAgRm9yIG9uZSB0aGluZywgCi0gd2UgaGF2ZSB0byBkZWxheSB0aGUgY2FsbCB0bwotIHN0YXJ0RWxlbWVudChuYW1lLCBhdHRzKSBiZWNhdXNlIG9mIHRoZQotIHhzbDphdHRyaWJ1dGUgYW5kIHhzbDpjb3B5IGNhbGxzLiAgSW4gb3RoZXIgd29yZHMsCi0gdGhlIGF0dHJpYnV0ZXMgaGF2ZSB0byBiZSBmdWxseSBjb2xsZWN0ZWQgYmVmb3JlIHlvdQotIGNhbiBjYWxsIHN0YXJ0RWxlbWVudC48L3A+PHA+T3RoZXIgaW1wb3J0YW50IGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZTo8L3A+PGdsb3NzPjxsYWJlbD5Db3VudGVyc1RhYmxlIGFuZCBDb3VudGVyPC9sYWJlbD48aXRlbT5UaGUgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL0NvdW50ZXIuaHRtbCI+Q291bnRlcjwvanVtcD48L2NvZGU+IGNsYXNzIGRvZXMgaW5jcmVtZW50YWwgY291bnRpbmcgZm9yIHN1cHBvcnQgb2YgeHNsOm51bWJlci4KLSBUaGlzIGNsYXNzIHN0b3JlcyBhIGNhY2hlIG9mIGNvdW50ZWQgbm9kZXMgKG1fY291bnROb2RlcykuIAotICBJdCB0cmllcyB0byBjYWNoZSB0aGUgY291bnRlZCBub2RlcyBpbiBkb2N1bWVudCBvcmRlci4uLiAKLSB0aGUgbm9kZSBjb3VudCBpcyBiYXNlZCBvbiBpdHMgcG9zaXRpb24gaW4gdGhlIGNhY2hlIGxpc3QuICBUaGUgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL0NvdW50ZXJzVGFibGUuaHRtbCI+Q291bnRlcnNUYWJsZTwvanVtcD48L2NvZGU+IGNsYXNzIGlzIGEgdGFibGUgb2YgY291bnRlcnMsIGtleWVkIGJ5IDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbU51bWJlci5odG1sIj5FbGVtTnVtYmVyPC9qdW1wPjwvY29kZT4gb2JqZWN0cywgZWFjaCAKLSBvZiB3aGljaCBoYXMgYSBsaXN0IG9mIDxjb2RlPkNvdW50ZXI8L2NvZGU+IG9iamVjdHMuPC9pdGVtPjwvZ2xvc3M+PGdsb3NzPjxsYWJlbD5LZXlJdGVyYXRvciwgS2V5TWFuYWdlciwgYW5kIEtleVRhYmxlPC9sYWJlbD48aXRlbT5UaGVzZSBjbGFzc2VzIGhhbmRsZSBtYXBwaW5nIG9mIGtleXMgZGVjbGFyZWQgd2l0aCB0aGUgeHNsOmtleSBlbGVtZW50LiAgVGhleSBhdHRlbXB0IHRvIHdvcmsgaW5jcmVtZW50YWxseSwgbG9jYXRpbmcgbm9kZXMgb24gcmVxdWVzdCBidXQgaW5kZXhpbmcgYWxsIGFzIHRoZXkgdHJhdmVyc2UgdGhlIHRyZWUsIGFuZCBzdG9wcGluZyB3aGVuIHRoZSByZXF1ZXN0ZWQgbm9kZSBpcyBmb3VuZC4gIElmIGEgcmVxdWVzdGVkIG5vZGUgaXMgbm90IGZvdW5kLCB0aGVuIHRoZSBlbnRpcmUgdHJlZSB3aWxsIGJlIHRyYXZlcnNlZC4gIFN1Y2ggaXMgdGhlIG5hdHVyZSBvZiB4c2w6a2V5LjwvaXRlbT48L2dsb3NzPjxnbG9zcz48bGFiZWw+VHJhbnNmb3JtU3RhdGU8L2xhYmVsPjxpdGVtPlRoaXMgaW50ZXJmYWNlIGlzIG1lYW50IHRvIGJlIHVzZWQgYnkgYSBjb25zdW1lciBvZiBTQVgyIGV2ZW50cyBwcm9kdWNlZCBieSBYYWxhbiwgYW5kIGVuYWJsZXMgdGhlIGNvbnN1bWVyIAotIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHRyYW5zZm9ybS4gIEl0IAotIGlzIHByaW1hcmlseSBpbnRlbmRlZCBhcyBhIHRvb2xpbmcgaW50ZXJmYWNlLjwvaXRlbT48L2dsb3NzPjxwPkV2ZW4gdGhvdWdoIHRoZSBmb2xsb3dpbmcgbW9kdWxlcyBhcmUgZGVmaW5lZCBpbiB0aGUgPGNvZGU+b3JnLmFwYWNoZS54YWxhbjwvY29kZT4gcGFja2FnZSwgaW5zdGVhZCBvZiB0aGUgdHJhbnNmb3JtZXIgcGFja2FnZSwgdGhleSBhcmUgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24gYXMgdGhleSBhcmUgbW9zdGx5IHJlbGF0ZWQgdG8gcnVudGltZSB0cmFuc2Zvcm1hdGlvbi48L3A+PGFuY2hvciBuYW1lPSJzdHJlZSIvPgotICA8czMgdGl0bGU9IlN0cmVlIE1vZHVsZSI+PHA+PGxpbms+U3RyZWUgTW9kdWxlIFtBbmQgZGlzY3Vzc2lvbnMgYWJvdXQgc3RyZWFtaW5nXTwvbGluaz48L3A+PHA+VGhlIFN0cmVlIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBkZWZhdWx0IDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI2RhdGEtbW9kZWwiPlNvdXJjZSBUcmVlIDwvanVtcD4gZm9yIFhhbGFuLCB0aGF0IGlzIHRvIGJlIHRyYW5zZm9ybWVkLiAgSXQgaW1wbGVtZW50cyByZWFkLW9ubHkgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTIvIj5ET00yPC9qdW1wPiBpbnRlcmZhY2VzLCBhbmQgcHJvdmlkZXMgc29tZSBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGZhc3QgdHJhbnNmb3Jtcywgc3VjaCBhcyBkb2N1bWVudCBvcmRlciBpbmRleGVzLiAgSXQgYWxzbyBhdHRlbXB0cyB0byBhbGxvdyBhbiBpbmNyZW1lbnRhbCB0cmFuc2Zvcm0gYnkgbGF1bmNoaW5nIHRoZSB0cmFuc2Zvcm0gb24gYSBzZWNvbmRhcnkgdGhyZWFkIGFzIHNvb24gYXMgdGhlIFNBWDIgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9KYXZhL2phdmFkb2Mvb3JnL3htbC9zYXgvQ29udGVudEhhbmRsZXIuaHRtbCNzdGFydERvY3VtZW50KCkiPlN0YXJ0RG9jdW1lbnQ8L2p1bXA+IGV2ZW50IGhhcyBvY2N1cnJlZC4gIFdoZW4gdGhlIHRyYW5zZm9ybSByZXF1ZXN0cyBhIG5vZGUsIGFuZCB0aGUgbm9kZSBpcyBub3QgcHJlc2VudCwgdGhlIGdldEZpcnN0Q2hpbGQgYW5kIEdldE5leHRTaWJsaW5nIG1ldGhvZHMgd2lsbCB3YWl0IHVudGlsIHRoZSBjaGlsZCBub2RlIGhhcyBhcnJpdmVkLCBvciBhbiA8anVtcCBocmVmPSJodHRwOi8vd3d3Lm1lZ2dpbnNvbi5jb20vU0FYL0phdmEvamF2YWRvYy9vcmcveG1sL3NheC9Db250ZW50SGFuZGxlci5odG1sI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywlMjBqYXZhLmxhbmcuU3RyaW5nLCUyMGphdmEubGFuZy5TdHJpbmcpIj5lbmRFbGVtZW50PC9qdW1wPiBldmVudCBoYXMgb2NjdXJyZWQuPC9wPjxwPk5vdGUgdGhhdCB0aGUgc2Vjb25kYXJ5IHRocmVhZCBpcyBhbiBpc3N1ZS4gIEl0IHdvdWxkIGJlIGJldHRlciB0byBkbyB0aGUgc2FtZSB0aGluZyBhcyBkZXNjcmliZWQgYWJvdmUgb24gYSBzaW5nbGUgdGhyZWFkLCBidXQgdXNpbmcgdGhlIHBhcnNlciBpbiAncHVsbCcgbW9kZSwgb3Igc2ltcGx5IHdpdGggYSBwYXJzZU5leHQgbWV0aG9kIHNvIHRoZSBwYXJzZSB3b3VsZCBvY2N1ciBpbiBibG9ja3MuICBIb3dldmVyLCB0aGlzIG1vZGVsIHdvdWxkIG9ubHkgYmUgcG9zc2libGU8L3A+PHA+VGhpcyBraW5kIG9mIGluY3JlbWVudGFsaXR5IGlzIG5vdCBwZXJmZWN0IGJlY2F1c2UgaXQgc3RpbGwgcmVxdWlyZXMgYW4gZW50aXJlIHNvdXJjZSB0cmVlIHRvIGJlIGNvbmNyZXRlbHkgYnVpbHQuICBUaGVyZSBoYXZlIGJlZW4gYSBsb3Qgb2YgZ29vZCBkaXNjdXNzaW9ucyBvbiB0aGUgeGFsYW4tZGV2IGxpc3QgYWJvdXQgaG93IHRvIGRvIHN0YXRpYyBhbmFseXNpcyBvZiBhIHN0eWxlc2hlZXQsIGFuZCBiZSBhYmxlIHRvIGFsbG9jYXRlIG9ubHkgdGhlIG5vZGVzIG5lZWRlZCBieSB0aGUgdHJhbnNmb3JtLCB3aGlsZSB0aGV5IGFyZSBuZWVkZWQgKG9yIG5vdCBhbGxvY2F0ZSBzb3VyY2Ugb2JqZWN0cyBhdCBhbGwpLjwvcD48L3MzPjxzMyB0aXRsZT0iU2VyaWFsaXplciBNb2R1bGUiPjxwPjxsaW5rPlNlcmlhbGl6ZXIgTW9kdWxlPC9saW5rPjwvcD48cD5YTUwgc2VyaWFsaXphdGlvbiBpcyBhIHRlcm0gdXNlZCBmb3IgdHVybmluZyBhIHRyZWUgb3Igc2V0IG9mIGV2ZW50cyBpbnRvIGEgc3RyZWFtLCBhbmQgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIEphdmEgb2JqZWN0IHNlcmlhbGl6YXRpb24uICBUaGUgWGFsYW4gc2VyaWFsaXplcnMgaW1wbGVtZW50IHRoZSA8anVtcCBocmVmPSJodHRwOi8vd3d3Lm1lZ2dpbnNvbi5jb20vU0FYL0phdmEvamF2YWRvYy9vcmcveG1sL3NheC9Db250ZW50SGFuZGxlci5odG1sIj5Db250ZW50SGFuZGxlcjwvanVtcD4gdG8gdHVybiBwYXJzZXIgZXZlbnRzIGNvbWluZyBmcm9tIHRoZSB0cmFuc2Zvcm0sIGludG8gYSBzdHJlYW0gb2YgWE1MLCBIVE1MLCBvciBwbGFpbiB0ZXh0LiAgVGhlIHNlcmlhbGl6ZXJzIGFsc28gaW1wbGVtZW50IHRoZSA8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vc2VyaWFsaXplci9TZXJpYWxpemVyLmh0bWwiPlNlcmlhbGl6ZXI8L2p1bXA+PC9jb2RlPiB3aGljaCBhbGxvd3MgdGhlIHRyYW5zZm9ybSBwcm9jZXNzIHRvIHNldCBYU0xUIG91dHB1dCBwcm9wZXJ0aWVzIGFuZCB0aGUgb3V0cHV0IHN0cmVhbSBvciBXcml0ZXIuPC9wPjwvczM+PHMzIHRpdGxlPSJFeHRlbnNpb25zIE1vZHVsZSI+PHA+PGxpbms+RXh0ZW5zaW9ucyBNb2R1bGU8L2xpbms+PC9wPjxwPlRoaXMgcGFja2FnZSBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBYYWxhbiBFeHRlbnNpb24gTWVjaGFuaXNtLCB3aGljaCB1c2VzIHRoZSA8anVtcCBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9ic2YvIj5CZWFuIFNjcmlwdGluZyBGcmFtZXdvcms8L2p1bXA+LgotCi1UaGUgQmVhbiBTY3JpcHRpbmcgRnJhbWV3b3JrIChCU0YpIGlzIGFuIGFyY2hpdGVjdHVyZSBmb3IgaW5jb3Jwb3JhdGluZyBzY3JpcHRpbmcgaW50byBKYXZhIGFwcGxpY2F0aW9ucyBhbmQgYXBwbGV0cy4gIFNjcmlwdGluZyBsYW5ndWFnZXMgc3VjaCBhcyBOZXRzY2FwZSBSaGlubyAoSmF2YXNjcmlwdCksIFZCU2NyaXB0LCBQZXJsLCBUY2wsIFB5dGhvbiwgTmV0UmV4eCBhbmQgUmV4eCBjYW4gYmUgdXNlZCB0byBhdWdtZW50IFhTTFQncyBmdW5jdGlvbmFsaXR5LiAgSW4gYWRkaXRpb24sIHRoZSBYYWxhbiBleHRlbnNpb24gbWVjaGFuaXNtIGFsbG93cyB1c2Ugb2YgSmF2YSBjbGFzc2VzLiAgU2VlIHRoZSA8anVtcCBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4vZXh0ZW5zaW9ucy5odG1sIj5YYWxhbi1KIDIgZXh0ZW5zaW9uIGRvY3VtZW50YXRpb248L2p1bXA+IGZvciBhIGRlc2NyaXB0aW9uIG9mIHVzaW5nIGV4dGVuc2lvbnMgaW4gYSBzdHlsZXNoZWV0LiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBXM0MgWFNMIFdvcmtpbmcgR3JvdXAgaXMgd29ya2luZyBvbiBhIHNwZWNpZmljYXRpb24gZm9yIHN0YW5kYXJkIGV4dGVuc2lvbiBiaW5kaW5ncywgYW5kIHRoaXMgbW9kdWxlIHdpbGwgY2hhbmdlIHRvIGZvbGxvdyB0aGF0IHNwZWNpZmljYXRpb24uICA8L3A+PHA+W01vcmUgbmVlZGVkLi4uIC1zYl08L3A+PC9zMz48L3MyPjxhbmNob3IgbmFtZT0ieHBhdGgiLz4gCi0gIDxzMiB0aXRsZT0iWFBhdGggTW9kdWxlIj4gCi0JIDxwPjxsaW5rPlhQYXRoIE1vZHVsZTwvbGluaz48L3A+IAotCSA8cD5UaGlzIG1vZHVsZSBpcyBwdWxsZWQgb3V0IG9mIHRoZSBYYWxhbiBwYWNrYWdlLCBhbmQgcHV0IGluIHRoZSBvcmcuYXBhY2hlIHBhY2thZ2UsIHRvIGVtcGhhc2l6ZSB0aGF0IHRoZSBpbnRlbnRpb24gaXMgdGhhdCB0aGlzIHBhY2thZ2UgY2FuIGJlIHVzZWQgaW5kZXBlbmRlbnRseSBvZiB0aGUgWFNMVCBlbmdpbmUsIGV2ZW4gdGhvdWdoIGl0IGhhcyBkZXBlbmRlbmNpZXMgb24gdGhlIFhhbGFuIHV0aWxzIG1vZHVsZS48L3A+PHA+PGltZyBzcmM9Im9yZ19hcGFjaGUuZ2lmIiBhbHQ9InhhbGFuIC0tLT4geHBhdGgiLz48L3A+IAotICA8cD5UaGUgWFBhdGggbW9kdWxlIGZpcnN0IGNvbXBpbGVzIHRoZSBYUGF0aCBzdHJpbmdzIGludG8gZXhwcmVzc2lvbiB0cmVlcywgYW5kIHRoZW4gZXhlY3V0ZXMgdGhlc2UgZXhwcmVzc2lvbnMgdmlhIGEgY2FsbCB0byB0aGUgWFBhdGggZXhlY3V0ZSguLi4pIGZ1bmN0aW9uLiAgPC9wPiAgPHA+TWFqb3IgY2xhc3NlcyBhcmU6PC9wPjxnbG9zcz48bGFiZWw+WFBhdGg8L2xhYmVsPjxpdGVtPlJlcHJlc2VudHMgYSBjb21waWxlZCBYUGF0aC4gIE1ham9yIGZ1bmN0aW9uIGlzIDxjb2RlPlhPYmplY3QgZXhlY3V0ZShYUGF0aENvbnRleHQgeGN0eHQsIE5vZGUgY29udGV4dE5vZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgIFByZWZpeFJlc29sdmVyIG5hbWVzcGFjZUNvbnRleHQpLjwvY29kZT48L2l0ZW0+PC9nbG9zcz48Z2xvc3M+PGxhYmVsPlhQYXRoQVBJPC9sYWJlbD48aXRlbT5UaGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSBjb252ZW5pZW5jZSBtZXRob2RzIGludG8gdGhlCi0gbG93LWxldmVsIFhQYXRoIEFQSS48L2l0ZW0+PC9nbG9zcz48Z2xvc3M+PGxhYmVsPlhQYXRoQ29udGV4dDwvbGFiZWw+PGl0ZW0+VXNlZCBhcyB0aGUgcnVudGltZSBleGVjdXRpb24gY29udGV4dCBmb3IgWFBhdGguPC9pdGVtPjwvZ2xvc3M+PGdsb3NzPjxsYWJlbD5ET01IZWxwZXI8L2xhYmVsPjxpdGVtPlVzZWQgYXMgYSBoZWxwZXIgZm9yIGhhbmRsaW5nIERPTSBpc3N1ZXMuICBNYXkgYmUgc3ViY2xhc3NlZCB0byB0YWtlIGFkdmFudGFnZSAKLSAgIG9mIHNwZWNpZmljIERPTSBpbXBsZW1lbnRhdGlvbnMuPC9pdGVtPjwvZ2xvc3M+PGdsb3NzPjxsYWJlbD5Tb3VyY2VUcmVlTWFuYWdlcjwvbGFiZWw+PGl0ZW0+Ym90dGxlbmVja3MgYWxsIG1hbmFnZW1lbnQgb2Ygc291cmNlIHRyZWVzLiAgVGhlIG1ldGhvZHMKLSBpbiB0aGlzIGNsYXNzIHNob3VsZCBhbGxvdyBlYXN5IGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBzb3VyY2UgCi0gdHJlZXMsIGFuZCBzaG91bGQgY2VudHJhbGl6ZSBwYXJzaW5nIGZvciB0aG9zZSBzb3VyY2UgdHJlZXMuPC9pdGVtPjwvZ2xvc3M+PGdsb3NzPjxsYWJlbD5FeHByZXNzaW9uPC9sYWJlbD48aXRlbT5UaGUgYmFzZS1jbGFzcyBvZiBhbGwgZXhwcmVzc2lvbiBvYmplY3RzLCBhbGxvd2luZyBwb2x5bW9ycGhpYyBiZWhhdmlvcnMuPC9pdGVtPjwvZ2xvc3M+PHA+VGhlIGdlbmVyYWwgYXJjaGl0ZWN0dXJlIG9mIHRoZSBYUGF0aCBtb2R1bGUgaXMgZGl2aWRlZCBpbnRvIHRoZSBjb21waWxlciwgYW5kIGNhdGVnb3JpZXMgb2YgZXhwcmVzc2lvbiBvYmplY3RzLjwvcD48cD48aW1nIHNyYz0ieHBhdGguZ2lmIiBhbHQ9InhwYXRoIG1vZHVsZXMiLz48L3A+PHA+VGhlIG1vc3QgaW1wb3J0YW50IG1vZHVsZSBpcyB0aGUgYXhlcyBtb2R1bGUuICBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBET00yIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yL3RyYXZlcnNhbC5odG1sI0l0ZXJhdG9yLW92ZXJ2aWV3Ij5Ob2RlSXRlcmF0b3I8L2p1bXA+IGludGVyZmFjZSwgYW5kIGlzIG1lYW50IHRvIGFsbG93IFhQYXRoIGNsaWVudHMgdG8gZWl0aGVyIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9yIHRvIHJlcGxhY2UgdGhpcyBiZWhhdmlvci48L3A+PHA+VGhlIDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94cGF0aC9heGVzL0xvY1BhdGhJdGVyYXRvci5odG1sIj5Mb2NQYXRoSXRlcmF0b3I8L2p1bXA+PC9jb2RlPiBhbmQgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvVW5pb25QYXRoSXRlcmF0b3IuaHRtbCI+VW5pb25QYXRoSXRlcmF0b3I8L2p1bXA+PC9jb2RlPiBjbGFzc2VzIGltcGxlbWVudCB0aGUgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTIvamF2YS1iaW5kaW5nLmh0bWwjb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvciI+Tm9kZUl0ZXJhdG9yPC9qdW1wPiBpbnRlcmZhY2UsIGFuZCBwb2x5bW9ycGhpY2FsbHkgdXNlIDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94cGF0aC9heGVzL0F4ZXNXYWxrZXIuaHRtbCI+QXhlc1dhbGtlcjwvanVtcD48L2NvZGU+IGRlcml2ZWQgb2JqZWN0cyB0byBleGVjdXRlIGVhY2ggc3RlcCBpbiB0aGUgcGF0aC4gIFRoZSB3aG9sZSB0cmljayBpcyB0byBleGVjdXRlIHRoZSA8Y29kZT5Mb2NhdGlvblBhdGg8L2NvZGU+IGluIGRlcHRoLWZpcnN0IGRvY3VtZW50IG9yZGVyIHNvIHRoYXQgbm9kZXMgY2FuIGJlIGZvdW5kIHdpdGhvdXQgbmVjZXNzYXJpbHkgbG9va2luZyBhaGVhZCBvciBwZXJmb3JtaW5nIGEgYnJlYWR0aC1maXJzdCBzZWFyY2guICBCZWNhdXNlIGEgZG9jdW1lbnQgb3JkZXIgZGVwdGgtZmlyc3Qgc2VhcmNoIHJlcXVpcmVzIHN0YXRlIHRvIGJlIHNhdmVkIGZvciBtYW55IGV4cHJlc3Npb25zLCB0aGUgZGVmYXVsdCBvcGVyYXRpb25zIGNyZWF0ZSAiV2FpdGVyIiBjbG9uZXMgdGhhdCBoYXZlIHRvIHdhaXQgd2hpbGUgdGhlIG1haW4gPGNvZGU+QXhlc1dhbGtlcnM8L2NvZGU+IHRyYXZlcnNlcyBjaGlsZCBub2RlcyAodGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoYXQgaGFwcGVucyB3aGVuIGEgIi8vZm9vL2JheiIgZXhwcmVzc2lvbiBpcyBleGVjdXRlZCkuICAgT3B0aW1pemF0aW9uIGlzIGRvbmUgYnkgaW1wbGVtZW50aW5nIHNwZWNpYWxpemVkIGl0ZXJhdG9ycyBhbmQgPGNvZGU+QXhlc1dhbGtlcnM8L2NvZGU+IGZvciBjZXJ0YWluIHR5cGVzIG9mIG9wZXJhdGlvbnMuICBUaGUgZGVjaXNpb24gYXMgdG8gd2hhdCB0eXBlIG9mIGl0ZXJhdG9yIG9yIHdhbGtlciB3aWxsIGJlIGNyZWF0ZWQgaXMgZG9uZSBpbiB0aGUgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvV2Fsa2VyRmFjdG9yeS5odG1sIj5XYWxrZXJGYWN0b3J5PC9qdW1wPjwvY29kZT4gY2xhc3MuPC9wPjxwPltGcmFua2x5LCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRlZmF1bHQgQXhlc1dhbGtlciwgd2l0aCBpdCdzIHdhaXRlcnMsIGlzIHRoZSBvbmUgdG90YWxseSBpbmNvbXByZWhlbnNpYmxlIHBhcnQgb2YgWGFsYW4uICBJdCBnZXRzIGVzcGVjaWFsbHkgZGlmZmljdWx0IGJlY2F1c2UgeW91IGNhbiBub3QgbG9vayB0byB0aGUgbm9kZSBhaGVhZC4gIEkgd291bGQgYmUgdmVyeSBpbnRlcmVzdGVkIGlmIGFueSByb2NrZXQgc2NpZW50aXN0cyBvdXQgdGhlcmUgY2FuIGNvbWUgdXAgd2l0aCBhIGJldHRlciBhbGdvcml0aG0uXTwvcD48YW5jaG9yIG5hbWU9InhwYXRoZGJjb25uIi8+PHMzIHRpdGxlPSJYUGF0aCBEYXRhYmFzZSBDb25uZWN0aW9uIj48cD48bGluaz5YUGF0aCBEaXJlY3QgRGF0YWJhc2UgQ29ubmVjdGlvbnM8L2xpbms+PC9wPjxwPkFuIGltcG9ydGFudCBwYXJ0IG9mIHRoZSBYUGF0aCBkZXNpZ24gaW4gYm90aCBYYWxhbiAxIGFuZCBYYWxhbiAyLCBpcyB0byBlbmFibGUgZGF0YWJhc2UgY29ubmVjdGlvbnMgdG8gYmUgdXNlZCBhcyBkcml2ZXJzIGRpcmVjdGx5IHRvIHRoZSBYUGF0aCA8anVtcCBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aCNsb2NhdGlvbi1wYXRocyI+TG9jYXRpb25QYXRoPC9qdW1wPiBoYW5kbGluZy4gIFRoaXMgYWxsb3dzIGRhdGFiYXNlcyB0byBiZSBkaXJlY3RseSBjb25uZWN0ZWQgdG8gdGhlIHRyYW5zZm9ybSwgYW5kIGJlIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaW50ZXJuYWwgaW5kZXhpbmcgYW5kIHRoZSBsaWtlLiAgV2hpbGUgaW4gWGFsYW4gMSB0aGlzIHdhcyBkb25lIHZpYSB0aGUgPGp1bXAgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YTG9jYXRvci5odG1sIj5YTG9jYXRvcjwvanVtcD4gaW50ZXJmYWNlLCBpbiBYYWxhbiAyIHRoaXMgaW50ZXJmYWNlIGlzIG5vIGxvbmdlciB1c2VkLCBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIERPTTIgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTIvdHJhdmVyc2FsLmh0bWwjSXRlcmF0b3Itb3ZlcnZpZXciPk5vZGVJdGVyYXRvcjwvanVtcD4gaW50ZXJmYWNlLiAgQW4gYXBwbGljYXRpb24gb3IgZXh0ZW5zaW9uIHNob3VsZCBiZSBhYmxlIHRvIGluc3RhbGwgdGhlaXIgb3duIE5vZGVJdGVyYXRvciBmb3IgYSBnaXZlbiBkb2N1bWVudC48L3A+PHA+PGltZyBzcmM9ImRhdGEuZ2lmIiBhbHQ9ImRhdGEuZ2lmIi8+PC9wPjxwPltNb3JlIHRvIGRvXTwvcD48L3MzPjwvczI+PGFuY2hvciBuYW1lPSJ1dGlscyIvPiAKLSAgPHMyIHRpdGxlPSJVdGlscyBQYWNrYWdlIj4gCi0JIDxwPjxsaW5rPlV0aWxzIFBhY2thZ2U8L2xpbms+PC9wPiAKLSAgPHA+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIGdlbmVyYWwgdXRpbGl0aWVzIGZvciB1c2UgYnkgYm90aCB0aGUgeGFsYW4gYW5kIHhwYXRoIHBhY2thZ2VzLjwvcD48L3MyPjxhbmNob3IgbmFtZT0ib3RoZXIiLz4KLSAgPHMyIHRpdGxlPSJPdGhlciBQYWNrYWdlcyI+IAotCSA8cD48bGluaz5PdGhlciBQYWNrYWdlczwvbGluaz48L3A+IAotCSA8Z2xvc3M+PGxhYmVsPmNsaWVudDwvbGFiZWw+PGl0ZW0+SW1wbGVtZW50YXRpb24gb2YgWGFsYW4gQXBwbGV0IFtzaG91bGQgd2Uga2VlcCB0aGlzP10uCi0KLTwvaXRlbT48L2dsb3NzPiAKLQkJIAotCQkgCi0JCTxnbG9zcz48bGFiZWw+bGliPC9sYWJlbD48aXRlbT5JbXBsZW1lbnRhdGlvbiBvZiBYYWxhbi1zcGVjaWZpYyBleHRlbnNpb25zLjwvaXRlbT48L2dsb3NzPjxnbG9zcz48bGFiZWw+cmVzPC9sYWJlbD48aXRlbT5Db250YWlucyBzdHJpbmdzIHRoYXQgcmVxdWlyZSBpbnRlcm5hdGlvbmFsaXphdGlvbi48L2l0ZW0+PC9nbG9zcz48L3MyPjxhbmNob3IgbmFtZT0iY29tcGlsYXRpb24iLz48czIgdGl0bGU9IlhhbGFuIFN0eWxlc2hlZXQgQ29tcGxpbGF0aW9uIHRvIEphdmEiPjxwPjxsaW5rPlhhbGFuIFN0eWxlc2hlZXQgQ29tcGxpbGF0aW9uIHRvIEphdmE8L2xpbms+PC9wPjxwPldlIGFyZSBkb2luZyBzb21lIHdvcmsgb24gY29tcGlsaW5nIHN0eWxlc2hlZXQgb2JqZWN0cyB0byBKYXZhLiAgVGhpcyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGFuZCBpcyBub3QgbWVhbnQgZm9yIGdlbmVyYWwgdXNlIHlldC4gIEZvciB0aGUgbW9tZW50LCB3ZSBhcmUgd3JpdGluZyBvdXQgSmF2YSB0ZXh0IGZpbGVzLCBhbmQgdGhlbiBjb21waWxpbmcgdGhlbSB0byBieXRlY29kZXMgdmlhIGphdmFjLCByYXRoZXIgdGhhbiBkaXJlY3RseSBwcm9kdWNpbmcgYnl0ZWNvZGVzLiAgVGhlIENvbXBpbGluZ1N0eWxlc2hlZXRQcm9jZXNzb3IgZGVyaXZlcyBmcm9tIFRyYW5zZm9ybWVyRmFjdG9yeUltcGwgdG8gcHJvZHVjZSB0aGVzZSBjbGFzc2VzLCB3aGljaCBhcmUgdGhlbiBidW5kbGVkIGludG8gYSBqYXIgZmlsZS4gIEZvciB0aGUgbW9tZW50IHRoZSBmdWxsIFhhbGFuIGphciBpcyByZXF1aXJlZCwgYnV0IHdlJ3JlIGxvb2tpbmcgYXQgd2F5cyB0byBvbmx5IHVzZSBhIHN1YnNldCBvZiBYYWxhbiwgc28gdGhhdCBvbmx5IGEgbWluaW1hbCBqYXIgd291bGQgYmUgcmVxdWlyZWQuPC9wPjxwPjxpbWcgc3JjPSJjb21waWxhdGlvbi5naWYiIGFsdD0iY29tcGlsYXRpb24uZ2lmIi8+PC9wPjwvczI+PGFuY2hvciBuYW1lPSJvcHRpbWl6YXRpb25zIi8+PHMyIHRpdGxlPSJGdXR1cmUgT3B0aW1pemF0aW9ucyI+PHA+PGxpbms+RnV0dXJlIE9wdGltaXphdGlvbnM8L2xpbms+PC9wPjxwPlRoaXMgc2VjdGlvbiBlbnVtZXJhdGVzIHNvbWUgb3B0aW1pemF0aW9ucyB0aGF0IHdlJ3JlIHBsYW5uaW5nIHRvIGRvIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBYYWxhbi48L3A+PHA+TGlrZWx5IG5lYXIgdGVybSBvcHRpbWl6YXRpb25zIChuZXh0IHNpeCBtb250aHM/KTo8L3A+PG9sPjxsaT5CeSBwcmUtYW5hbHlzaXMgb2YgdGhlIHN0eWxlc2hlZXQsIHBydW5lIG5vZGVzIGZyb20gdGhlIHRyZWUgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkIGFuZCBjYW4gYmUgcHJlZGljdGVkIHRoYXQgdGhleSB3b24ndCBiZSB2aXNpdGVkIGFnYWluLjwvbGk+PGxpPkVsaW1pbmF0ZSByZWR1bmRlbnQgZXhwcmVzc2lvbnMgKHhzbDp3aGVuLCB2YXJpYWJsZSBzZXRzLCByb290ZWQgcGF0dGVybnMsIGV0Yy4pLjwvbGk+PGxpPk9wdGltaXplIHZhcmlhYmxlIHBhdHRlcm5zIHN1Y2ggYXMgJmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJmb28iJmd0OyZsdDt4c2w6dmFyaWFibGUgc2VsZWN0PSJ5YWRhIi8mZ3Q7Jmx0Oy94c2w6dmFyaWFibGUmZ3Q7IGludG8gJmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJmb28iIHNlbGVjdD0ic3RyaW5nKHlhZGEpIi8mZ3Q7LCBpbiBvcmRlciB0byByZWR1Y2UgcmVzdWx0IHRyZWUgZnJhZ21lbnQgY3JlYXRpb24uPC9saT48bGk+UmVkdWNlIHNpemUgb2YgU3RyZWUgbm9kZXMuPC9saT48bGk+SW1wbGVtZW50IG91ciBvd24gTmFtZXNwYWNlU3VwcG9ydCBjbGFzcyAodGhlIFNBWDIgb25lIGlzIHRvbyBleHBlbnNpdmUpLjwvbGk+PGxpPk1vcmUgc3BlY2lhbGl6YXRpb24gb2YgaXR0ZXJhdG9ycyBhbmQgd2Fsa2Vycy48L2xpPjxsaT5GdWxsIEphdmEgY29tcGlsYXRpb24gc3VwcG9ydC48L2xpPjxsaT5TY2hlbWEgQXdhcmVuZXNzIChpZiAiLy9mb28iLCB0aGUgU2NoZW1hIGNhbiB0ZWxsIHVzIHdoZXJlIHRvIGxvb2ssIGJ1dCB3ZSBuZWVkIHN0YW5kYXJkIGludGVyZmFjZSB0byBTY2hlbWFzKS48L2xpPjwvb2w+PHA+TGlrZWx5IGxvbmdlciB0ZXJtIG9wdGltaXphdGlvbnMgKDEyLTE4IG1vbnRocz8pOjwvcD48b2w+PGxpPk9uLXRoZS1mbHkgaW5kZXhpbmcuPC9saT48bGk+UHJlZGljdCBpZiBub2RlcyB3b24ndCBiZSBwcm9jZXNzZWQgYXQgYWxsLCBhbmQgc28gZG9uJ3QgYnVpbGQgdGhlbSwgYWNoaWV2ZSBmdWxsIHN0cmVhbWluZyBzdXBwb3J0IGZvciBhIGNlcnRhaW4gY2xhc3Mgb2Ygc3R5bGVzaGVldHMuPC9saT48L29sPjwvczI+PGFuY2hvciBuYW1lPSJjb2RpbmciLz4gCi0gIDxzMiB0aXRsZT0iQ29kaW5nIENvbnZlbnRpb25zIj4gCi0JIDxwPjxsaW5rPkNvZGluZyBDb252ZW50aW9uczwvbGluaz48L3A+IAotCSA8cD5UaGlzIHNlY3Rpb24gZG9jdW1lbnRzIHRoZSBjb2RpbmcgY29udmVudGlvbnMgdXNlZCBpbiB0aGUgWGFsYW4KLQkJc291cmNlLjwvcD4gCi0JIDxvbD4gCi0JCTxsaT5DbGFzcyBmaWxlcyBhcmUgYXJyYW5nZWQgd2l0aCBjb25zdHJ1Y3RvcnMgYW5kIHBvc3NpYmx5IGFuIGluaXQoKQotCQkgIGZ1bmN0aW9uIGZpcnN0LCBwdWJsaWMgQVBJIG1ldGhvZHMgc2Vjb25kLCBwYWNrYWdlIHNwZWNpZmljLCBwcm90ZWN0ZWQsIGFuZAotCQkgIHByaXZhdGUgbWV0aG9kcyBmb2xsb3dpbmcgKGFycmFuZ2VkIGJhc2VkIG9uIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSksIG1lbWJlcgotCQkgIHZhcmlhYmxlcyB3aXRoIHRoZWlyIGdldHRlci9zZXR0ZXIgYWNjZXNzIG1ldGhvZHMgbGFzdC48L2xpPiAKLQkJPGxpPk5vbi1zdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcmUgcHJlZml4ZWQgd2l0aCAibV8iLjwvbGk+IAotCQk8bGk+c3RhdGljIGZpbmFsIG1lbWJlciB2YXJpYWJsZXMgc2hvdWxkIGFsd2F5cyBiZSB1cHBlciBjYXNlLCB3aXRob3V0Ci0JCSAgdGhlICJtXyIgcHJlZml4LiBUaGV5IG5lZWQgbm90IGhhdmUgYWNjZXNzb3JzLjwvbGk+IAotCQk8bGk+UHJpdmF0ZSBtZW1iZXIgdmFyaWFibGVzIHRoYXQgYXJlIG5vdCBhY2Nlc3NlZCBvdXRzaWRlIHRoZSBjbGFzcyBuZWVkCi0JCSAgbm90IGhhdmUgZ2V0dGVyL3NldHRlciBtZXRob2RzIGRlY2xhcmVkLjwvbGk+IAotCQk8bGk+UHJpdmF0ZSBtZW1iZXIgdmFyaWFibGVzIHRoYXQgYXJlIGFjY2Vzc2VkIG91dHNpZGUgdGhlIGNsYXNzIHNob3VsZAotCQkgIGhhdmUgZWl0aGVyIHBhY2thZ2Ugc3BlY2lmaWMgb3IgcHVibGljIGdldHRlci9zZXR0ZXIgbWV0aG9kcyBkZWNsYXJlZC4gQWxsCi0JCSAgYWNjZXNzb3JzIHNob3VsZCBmb2xsb3cgdGhlIGJlYW4gZGVzaWduIHBhdHRlcm5zLjwvbGk+IAotCQk8bGk+UGFja2FnZS1zY29wZWQgbWVtYmVyIHZhcmlhYmxlcywgcHVibGljIG1lbWJlciB2YXJpYWJsZXMsIGFuZAotCQkgIHByb3RlY3RlZCBtZW1iZXIgdmFyaWFibGVzIHNob3VsZCBub3QgYmUgZGVjbGFyZWQuPC9saT4gCi0JIDwvb2w+IAotICA8L3MyPjxhbmNob3IgbmFtZT0ib3BlbiIvPiAKLSAgCi08L3MxPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy9kZXNpZ24vb3JnX2FwYWNoZS5naWYgYi94ZG9jcy9zb3VyY2VzL2Rlc2lnbi9vcmdfYXBhY2hlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1ZjI2NC4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL2Rlc2lnbi9vcmdfYXBhY2hlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3Byb2Nlc3MuZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24vcHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YTg3MWUuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy9kZXNpZ24vcHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL2Rlc2lnbi90cmF4LmdpZiBiL3hkb2NzL3NvdXJjZXMvZGVzaWduL3RyYXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWI5NjE0Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3RyYXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy9kZXNpZ24veGFsYW4uZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24veGFsYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTRhNTdjLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3hhbGFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3hhbGFuMV8xeDEuZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24veGFsYW4xXzF4MS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZTE1MzYuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy9kZXNpZ24veGFsYW4xXzF4MS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL2Rlc2lnbi94bWxsb2dvLmdpZiBiL3hkb2NzL3NvdXJjZXMvZGVzaWduL3htbGxvZ28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjMxODhkLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3htbGxvZ28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy9kZXNpZ24veHBhdGguZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24veHBhdGguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI4ZjljLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3hwYXRoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3hzbHRfYWJzdHJhY3QuZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24veHNsdF9hYnN0cmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMDQxYTYuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy9kZXNpZ24veHNsdF9hYnN0cmFjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL2VudGl0aWVzLmVudCBiL3hkb2NzL3NvdXJjZXMvZW50aXRpZXMuZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2RlMDQ0Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZW50aXRpZXMuZW50CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgZW5jb2Rpbmc9IlVTLUFTQ0lJIj8+Ci0KLTwhRU5USVRZIHhzbHQ0aiAiWGFsYW4tSmF2YSI+Ci08IUVOVElUWSB4c2x0NGoyICJYYWxhbi1KYXZhIDIiPgotPCFFTlRJVFkgeHNsdDRqLWRpc3QgInhhbGFuLWpfMl8wXzEiPgotPCFFTlRJVFkgeHNsdDRqLWN1cnJlbnQgIiZ4c2x0NGo7IHZlcnNpb24gMi4wLjEiPgotPCFFTlRJVFkgeG1sNGogIlhlcmNlcy1KYXZhIj4KLTwhRU5USVRZIHhtbDRqLXVzZWQgIiZ4bWw0ajsgdmVyc2lvbiAxLjMuMCI+Ci08IUVOVElUWSB4c2x0NGMgIlhhbGFuLUMrKyI+Ci08IUVOVElUWSB4bWw0YyAiWGVyY2VzLUMrKyI+Ci08IUVOVElUWSBkb3dubG9hZCAiVGhlICZ4c2x0NGotY3VycmVudDsgZG93bmxvYWQgZnJvbSB4bWwuYXBhY2hlLm9yZyBpbmNsdWRlcyB4ZXJjZXMuamFyIGZyb20gJnhtbDRqLXVzZWQ7LiI+Ci08IUVOVElUWSB0cmF4c2FtcGxlbm90ZSAiVG8gcnVuIHRoZSB0cmF4IHNhbXBsZSwgeW91IG11c3QgYmUgdXNpbmcgYW4gWE1MIHBhcnNlciAoc3VjaCBhcyBYZXJjZXMgMS4zLjAgb3IgQ3JpbXNvbiAxLjEpIAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZnVsbHkgaW1wbGVtZW50cyB0aGUgSkFYUCAxLjEgamF2YXgueG1sLnBhcnNlcnMgaW50ZXJmYWNlLiI+Ci0KZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMvdHJheC90cmF4LnhtbCBiL3hkb2NzL3NvdXJjZXMvdHJheC90cmF4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlY2IwMS4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3RyYXgvdHJheC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgc3BlYyBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9zcGVjLmR0ZCI+Ci08c3BlYz4gCi0gIDx0aXRsZT5UcmFuc2Zvcm1hdGlvbiBBUEkgRm9yIFhNTCAoVHJBWCk8L3RpdGxlPgotICA8ZnJvbnRtYXR0ZXI+IAotICA8cHViZGF0ZT5Ob3ZlbWJlciAxMiwgMjAwMDwvcHViZGF0ZT4gCi0gIDxjb3B5cmlnaHQ+Q29weXJpZ2h0IDIwMDAgSmF2YSBDb21tdW5pdHkgUHJvY2VzcyAoU3VuIE1pY3Jvc3lzdGVtcywKLQkgSW5jLik8L2NvcHlyaWdodD4gCi0gIDxhdXRob3I+PGZpcnN0bmFtZT5TY290dDwvZmlyc3RuYW1lPiAKLQkgPHN1cm5hbWU+Qm9hZzwvc3VybmFtZT4gCi0JIDxvcmduYW1lPklCTSBSZXNlYXJjaDwvb3JnbmFtZT4gCi0JIDxhZGRyZXNzPiAKLQkJPGVtYWlsPnNib2FnQGxvdHVzLmNvbTwvZW1haWw+IAotCSA8L2FkZHJlc3M+IAotICA8L2F1dGhvcj48L2Zyb250bWF0dGVyPiAKLSAgPGludHJvZHVjdGlvbj4gCi0gIDx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPiAKLSAgPHBhcmE+VGhpcyBvdmVydmlldyBkZXNjcmliZXMgdGhlIHNldCBvZiBBUElzIGNvbnRhaW5lZCBpbgotCSA8dWxpbmsgdXJsPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+amF2YXgueG1sLnRyYW5zZm9ybTwvdWxpbms+LCA8dWxpbmsgdXJsPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+amF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW08L3VsaW5rPiwgPHVsaW5rIHVybD0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPmphdmF4LnhtbC50cmFuc2Zvcm0uZG9tPC91bGluaz4sIGFuZCA8dWxpbmsgdXJsPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+amF2YXgueG1sLnRyYW5zZm9ybS5zYXg8L3VsaW5rPi4gRm9yIHRoZSBzYWtlIG9mIGJyZXZpdHksIHRoZXNlIGludGVyZmFjZXMgYXJlIHJlZmVycmVkIHRvCi0JIGFzIFRyQVggKFRyYW5zZm9ybWF0aW9uIEFQSSBmb3IgWE1MKS4gPC9wYXJhPiAKLSAgPHBhcmE+VGhlcmUgaXMgYSBicm9hZCBuZWVkIGZvciBKYXZhIGFwcGxpY2F0aW9ucyB0byBiZSBhYmxlIHRvIHRyYW5zZm9ybSBYTUwKLQkgYW5kIHJlbGF0ZWQgdHJlZS1zaGFwZWQgZGF0YSBzdHJ1Y3R1cmVzLiBJbiBmYWN0LCBYTUwgaXMgbm90IG5vcm1hbGx5IHZlcnkKLQkgdXNlZnVsIHRvIGFuIGFwcGxpY2F0aW9uIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBzb21lIHNvcnQgb2YgdHJhbnNmb3JtYXRpb24sCi0JIHVubGVzcyB0aGUgc2VtYW50aWMgc3RydWN0dXJlIGlzIHVzZWQgZGlyZWN0bHkgYXMgZGF0YS4gQWxtb3N0IGFsbCBYTUwtcmVsYXRlZAotCSBhcHBsaWNhdGlvbnMgbmVlZCB0byBwZXJmb3JtIHRyYW5zZm9ybWF0aW9ucy4gVHJhbnNmb3JtYXRpb25zIG1heSBiZSBkZXNjcmliZWQKLQkgYnkgSmF2YSBjb2RlLCBQZXJsIGNvZGUsIDx1bGluayB1cmw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPlhTTFQ8L3VsaW5rPgotCSBTdHlsZXNoZWV0cywgb3RoZXIgdHlwZXMgb2Ygc2NyaXB0LCBvciBieSBwcm9wcmlldGFyeSBmb3JtYXRzLiBUaGUgaW5wdXRzLCBvbmUKLQkgb3IgbXVsdGlwbGUsIHRvIGEgdHJhbnNmb3JtYXRpb24sIG1heSBiZSBhIFVSTCwgWE1MIHN0cmVhbSwgYSBET00gdHJlZSwgU0FYCi0JIEV2ZW50cywgb3IgYSBwcm9wcmlldGFyeSBmb3JtYXQgb3IgZGF0YSBzdHJ1Y3R1cmUuIFRoZSBvdXRwdXQgdHlwZXMgYXJlIHRoZQotCSBwcmV0dHkgbXVjaCB0aGUgc2FtZSB0eXBlcyBhcyB0aGUgaW5wdXRzLCBidXQgZGlmZmVyZW50IGlucHV0cyBtYXkgbmVlZCB0byBiZQotCSBjb21iaW5lZCB3aXRoIGRpZmZlcmVudCBvdXRwdXRzLjwvcGFyYT4gCi0gIDxwYXJhPlRoZSBncmVhdCBjaGFsbGVuZ2Ugb2YgYSB0cmFuc2Zvcm1hdGlvbiBBUEkgaXMgaG93IHRvIGRlYWwgd2l0aCBhbGwgdGhlCi0JIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiBpbnB1dHMgYW5kIG91dHB1dHMsIHdpdGhvdXQgYmVjb21pbmcgc3BlY2lhbGl6ZWQgZm9yCi0JIGFueSBvZiB0aGUgZ2l2ZW4gdHlwZXMuPC9wYXJhPiAKLSAgPHBhcmE+VGhlIEphdmEgY29tbXVuaXR5IHdpbGwgZ3JlYXRseSBiZW5lZml0IGZyb20gYSBjb21tb24gQVBJIHRoYXQgd2lsbAotCSBhbGxvdyB0aGVtIHRvIHVuZGVyc3RhbmQgYW5kIGFwcGx5IGEgc2luZ2xlIG1vZGVsLCB3cml0ZSB0byBjb25zaXN0ZW50Ci0JIGludGVyZmFjZXMsIGFuZCBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb25zIHBvbHltb3JwaGljYWxseS4gVHJBWCBhdHRlbXB0cyB0bwotCSBkZWZpbmUgYSBtb2RlbCB0aGF0IGlzIGNsZWFuIGFuZCBnZW5lcmljLCB5ZXQgZmlsbHMgZ2VuZXJhbCBhcHBsaWNhdGlvbgotCSByZXF1aXJlbWVudHMgYWNyb3NzIGEgd2lkZSB2YXJpZXR5IG9mIHVzZXMuIDwvcGFyYT4gCi0gIDxzZWN0Mj4gCi0JIDx0aXRsZT5HZW5lcmFsIFRlcm1pbm9sb2d5PC90aXRsZT4gCi0JIDxwYXJhPlRoaXMgc2VjdGlvbiB3aWxsIGV4cGxhaW4gc29tZSBnZW5lcmFsIHRlcm1pbm9sb2d5IHVzZWQgaW4gdGhpcwotCQlkb2N1bWVudC4gVGVjaG5pY2FsIHRlcm1pbm9sb2d5IHdpbGwgYmUgZXhwbGFpbmVkIGluIHRoZSBNb2RlbCBzZWN0aW9uLiBJbiBtYW55Ci0JCWNhc2VzLCB0aGUgZ2VuZXJhbCB0ZXJtaW5vbG9neSBvdmVybGFwcyB3aXRoIHRoZSB0ZWNobmljYWwgdGVybWlub2xvZ3kuPC9wYXJhPiAKLQkgPHZhcmlhYmxlbGlzdD4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPlRyZWU8L3Rlcm0+IAotCQkgIDxsaXN0aXRlbT5UaGlzIHRlcm0sIGFzIHVzZWQgd2l0aGluIHRoaXMgZG9jdW1lbnQsIGRlc2NyaWJlcyBhbgotCQkJIGFic3RyYWN0IHN0cnVjdHVyZSB0aGF0IGNvbnNpc3RzIG9mIG5vZGVzIG9yIGV2ZW50cyB0aGF0IG1heSBiZSBwcm9kdWNlZCBieQotCQkJIFhNTC4gQSBUcmVlIHBoeXNpY2FsbHkgbWF5IGJlIGEgRE9NIHRyZWUsIGEgc2VyaWVzIG9mIHdlbGwgYmFsYW5jZWQgcGFyc2UKLQkJCSBldmVudHMgKHN1Y2ggYXMgdGhvc2UgY29taW5nIGZyb20gYSBTQVgyIENvbnRlbnRIYW5kZXIpLCBhIHNlcmllcyBvZiByZXF1ZXN0cwotCQkJICh0aGUgcmVzdWx0IG9mIHdoaWNoIGNhbiBkZXNjcmliZSBhIHRyZWUpLCBvciBhIHN0cmVhbSBvZiBtYXJrZWQtdXAKLQkJCSBjaGFyYWN0ZXJzLjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPlNvdXJjZSBUcmVlKHMpPC90ZXJtPiAKLQkJICA8bGlzdGl0ZW0+T25lIG9yIG1vcmUgdHJlZXMgdGhhdCBhcmUgdGhlIGlucHV0cyB0byB0aGUKLQkJCSB0cmFuc2Zvcm1hdGlvbi48L2xpc3RpdGVtPiAKLQkJPC92YXJsaXN0ZW50cnk+IAotCQk8dmFybGlzdGVudHJ5PiAKLQkJICA8dGVybT5SZXN1bHQgVHJlZShzKTwvdGVybT4gCi0JCSAgPGxpc3RpdGVtPk9uZSBvciBtb3JlIHRyZWVzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgdGhlCi0JCQkgdHJhbnNmb3JtYXRpb24uPC9saXN0aXRlbT4gCi0JCTwvdmFybGlzdGVudHJ5PiAKLQkJPHZhcmxpc3RlbnRyeT4gCi0JCSAgPHRlcm0+VHJhbnNmb3JtYXRpb248L3Rlcm0+IAotCQkgIDxsaXN0aXRlbT5UaGUgcHJvY2Vzc29yIG9mIGNvbnN1bWluZyBhIHN0cmVhbSBvciB0cmVlIHRvIHByb2R1Y2UKLQkJCSBhbm90aGVyIHN0cmVhbSBvciB0cmVlLjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPklkZW50aXR5IChvciBDb3B5KSBUcmFuc2Zvcm1hdGlvbjwvdGVybT4gCi0JCSAgPGxpc3RpdGVtPlRoZSBwcm9jZXNzIG9mIHRyYW5zZm9ybWF0aW9uIGZyb20gYSBzb3VyY2UgdG8gYSByZXN1bHQsCi0JCQkgbWFraW5nIGFzIGZldyBzdHJ1Y3R1cmFsIGNoYW5nZXMgYXMgcG9zc2libGUgYW5kIG5vIGluZm9ybWF0aW9uYWwgY2hhbmdlcy4gVGhlCi0JCQkgdGVybSBpcyBzb21ld2hhdCBsb29zZWx5IHVzZWQsIGFzIHRoZSBwcm9jZXNzIGlzIHJlYWxseSBhIGNvcHkuIGZyb20gb25lCi0JCQkgImZvcm1hdCIgKHN1Y2ggYXMgYSBET00gdHJlZSwgc3RyZWFtLCBvciBzZXQgb2YgU0FYIGV2ZW50cykgdG8KLQkJCSBhbm90aGVyLjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPlNlcmlhbGl6YXRpb248L3Rlcm0+IAotCQkgIDxsaXN0aXRlbT5UaGUgcHJvY2VzcyBvZiB0YWtpbmcgYSB0cmVlIGFuZCB0dXJuaW5nIGl0IGludG8gYSBzdHJlYW0uIEluCi0JCQkgc29tZSBzZW5zZSwgYSBzZXJpYWxpemF0aW9uIGlzIGEgc3BlY2lhbGl6ZWQgdHJhbnNmb3JtYXRpb24uPC9saXN0aXRlbT4gCi0JCTwvdmFybGlzdGVudHJ5PiAKLQkJPHZhcmxpc3RlbnRyeT4gCi0JCSAgPHRlcm0+UGFyc2luZzwvdGVybT4gCi0JCSAgPGxpc3RpdGVtPlRoZSBwcm9jZXNzIG9mIHRha2luZyBhIHN0cmVhbSBhbmQgdHVybmluZyBpdCBpbnRvIGEgdHJlZS4gSW4KLQkJCSBzb21lIHNlbnNlLCBwYXJzaW5nIGlzIGEgc3BlY2lhbGl6ZWQgdHJhbnNmb3JtYXRpb24uPC9saXN0aXRlbT4gCi0JCTwvdmFybGlzdGVudHJ5PiAKLQkJPHZhcmxpc3RlbnRyeT4gCi0JCSAgPHRlcm0+VHJhbnNmb3JtZXI8L3Rlcm0+IAotCQkgIDxsaXN0aXRlbT5BIFRyYW5zZm9ybWVyIGlzIHRoZSBvYmplY3QgdGhhdCBleGVjdXRlcyB0aGUgdHJhbnNmb3JtYXRpb24uCi0JCQkgPC9saXN0aXRlbT4gCi0JCTwvdmFybGlzdGVudHJ5PiAKLQkJPHZhcmxpc3RlbnRyeT4gCi0JCSAgPHRlcm0+VHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zPC90ZXJtPiAKLQkJICA8bGlzdGl0ZW0+RGVzY3JpYmVzIHRoZSB0cmFuc2Zvcm1hdGlvbi4gQSBmb3JtIG9mIGNvZGUsIHNjcmlwdCwgb3IKLQkJCSBzaW1wbHkgYSBkZWNsYXJhdGlvbiBvciBzZXJpZXMgb2YgZGVjbGFyYXRpb25zLjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPlN0eWxlc2hlZXQ8L3Rlcm0+IAotCQkgIDxsaXN0aXRlbT5UaGUgc2FtZSBhcyAidHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zLCIgZXhjZXB0IGl0IGlzCi0JCQkgbGlrZWx5IHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCA8dWxpbmsKLQkJCSB1cmw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPlhTTFQ8L3VsaW5rPi48L2xpc3RpdGVtPiAKLQkJPC92YXJsaXN0ZW50cnk+IAotCQk8dmFybGlzdGVudHJ5PiAKLQkJICA8dGVybT5UZW1wbGF0ZXM8L3Rlcm0+IAotCQkgIDxsaXN0aXRlbT5Bbm90aGVyIGZvcm0gb2YgInRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucy4iIEluIHRoZSBUckFYCi0JCQkgaW50ZXJmYWNlLCB0aGlzIHRlcm0gaXMgdXNlZCB0byBkZXNjcmliZSBwcm9jZXNzZWQgb3IgY29tcGlsZWQgdHJhbnNmb3JtYXRpb24KLQkJCSBpbnN0cnVjdGlvbnMuIFRoZSBTb3VyY2UgZmxvd3MgdGhyb3VnaCBhIFRlbXBsYXRlcyBvYmplY3QgdG8gYmUgZm9ybWVkIGludG8gdGhlCi0JCQkgUmVzdWx0LjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPlByb2Nlc3NvcjwvdGVybT4gCi0JCSAgPGxpc3RpdGVtPkEgZ2VuZXJhbCB0ZXJtIGZvciB0aGUgdGhpbmcgdGhhdCBtYXkgYm90aCBwcm9jZXNzIHRoZQotCQkJIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucywgYW5kIHBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uLjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPkRPTTwvdGVybT4gCi0JCSAgPGxpc3RpdGVtPkRvY3VtZW50IE9iamVjdCBNb2RlbCwgc3BlY2lmaWNhbGx5IHJlZmVycmluZyB0byB0aGUKLQkJCSA8dGVybXJlZiBsaW5rLXVybD0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTIgIj5Eb2N1bWVudCBPYmplY3QgTW9kZWwKLQkJCSAoRE9NKSBMZXZlbCAyIFNwZWNpZmljYXRpb248L3Rlcm1yZWY+LjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPlNBWDwvdGVybT4gCi0JCSAgPGxpc3RpdGVtPlNpbXBsZSBBUEkgZm9yIFhNTCwgc3BlY2lmaWNhbGx5IHJlZmVycmluZyB0byB0aGUKLQkJCSA8dGVybXJlZiBsaW5rLXVybD0iaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9TQVgyIj5TQVggMi4wCi0JCQkgcmVsZWFzZTwvdGVybXJlZj4uPC9saXN0aXRlbT4gCi0JCTwvdmFybGlzdGVudHJ5PiAKLQkgPC92YXJpYWJsZWxpc3Q+IAotICA8L3NlY3QyPjwvaW50cm9kdWN0aW9uPgotICA8cmVxdWlyZW1lbnRzPiAKLSAgPHRpdGxlPlJlcXVpcmVtZW50czwvdGl0bGU+IAotICA8cGFyYT5UaGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBoYXZlIGJlZW4gZGV0ZXJtaW5lZCBmcm9tIGJyb2FkIGV4cGVyaWVuY2UKLQkgd2l0aCBYTUwgcHJvamVjdHMgZnJvbSB0aGUgdmFyaW91cyBtZW1iZXJzIHBhcnRpY2lwYXRpbmcgb24gdGhlIEpDUC48L3BhcmE+IAotICA8b3JkZXJlZGxpc3Q+IAotCSA8bGlzdGl0ZW0gaWQ9InJlcXVpcmVtZW50LXNpbXBsZSI+VHJBWCBtdXN0IHByb3ZpZGUgYSBjbGVhbiwgc2ltcGxlCi0JCWludGVyZmFjZSBmb3Igc2ltcGxlIHVzZXMuPC9saXN0aXRlbT4gCi0JIDxsaXN0aXRlbSBpZD0icmVxdWlyZW1lbnQtZ2VuZXJhbCI+VHJBWCBtdXN0IGJlIHBvd2VyZnVsIGVub3VnaCB0byBiZQotCQlhcHBsaWVkIHRvIGEgd2lkZSByYW5nZSBvZiB1c2VzLCBzdWNoIGFzLCBlLWNvbW1lcmNlLCBjb250ZW50IG1hbmFnZW1lbnQsCi0JCXNlcnZlciBjb250ZW50IGRlbGl2ZXJ5LCBhbmQgY2xpZW50IGFwcGxpY2F0aW9ucy48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1vcHRpbWl6ZWFibGUiPkEgcHJvY2Vzc29yIHRoYXQgaW1wbGVtZW50cyBhIFRyQVgKLQkJaW50ZXJmYWNlIG11c3QgYmUgb3B0aW1pemVhYmxlLiBQZXJmb3JtYW5jZSBpcyBhIGNyaXRpY2FsIGlzc3VlIGZvciBtb3N0Ci0JCXRyYW5zZm9ybWF0aW9uIHVzZSBjYXNlcy48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1jb21waWxlZC1tb2RlbCI+QXMgYSBzcGVjaWFsaXphdGlvbiBvZiB0aGUgYWJvdmUKLQkJcmVxdWlyZW1lbnQsIGEgVHJBWCBwcm9jZXNzb3IgbXVzdCBiZSBhYmxlIHRvIHN1cHBvcnQgYSBjb21waWxlZCBtb2RlbCwgc28gdGhhdAotCQlhIHNpbmdsZSBzZXQgb2YgdHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zIGNhbiBiZSBjb21waWxlZCwgb3B0aW1pemVkLCBhbmQKLQkJYXBwbGllZCB0byBhIGxhcmdlIHNldCBvZiBpbnB1dCBzb3VyY2VzLjwvbGlzdGl0ZW0+IAotCSA8bGlzdGl0ZW0gaWQ9InJlcXVpcmVtZW50LWluZGVwZW5kZW5jZSI+VHJBWCBtdXN0IG5vdCBiZSBkZXBlbmRlbnQgYW4gYW55Ci0JCWdpdmVuIHR5cGUgb2YgdHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zLiBGb3IgaW5zdGFuY2UsIGl0IG11c3QgcmVtYWluCi0JCWluZGVwZW5kZW50IG9mIDx1bGluayB1cmw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPlhTTFQ8L3VsaW5rPi48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1mcm9tLWRvbSI+VHJBWCBtdXN0IGJlIGFibGUgdG8gYWxsb3cgcHJvY2Vzc29ycwotCQl0byB0cmFuc2Zvcm0gRE9NIHRyZWVzLjwvbGlzdGl0ZW0+IAotCSA8bGlzdGl0ZW0gaWQ9InJlcXVpcmVtZW50LXRvLWRvbSI+VHJBWCBtdXN0IGJlIGFibGUgdG8gYWxsb3cgcHJvY2Vzc29ycyB0bwotCQlwcm9kdWNlIERPTSB0cmVlcy48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1mcm9tLXNheCI+VHJBWCBtdXN0IGFsbG93IHByb2Nlc3NvcnMgdG8gdHJhbnNmb3JtCi0JCVNBWCBldmVudHMuPC9saXN0aXRlbT4gCi0JIDxsaXN0aXRlbSBpZD0icmVxdWlyZW1lbnQtdG8tc2F4Ij5UckFYIG11c3QgYWxsb3cgcHJvY2Vzc29ycyB0byBwcm9kdWNlIFNBWAotCQlldmVudHMuPC9saXN0aXRlbT4gCi0JIDxsaXN0aXRlbSBpZD0icmVxdWlyZW1lbnQtZnJvbS1zdHJlYW0iPlRyQVggbXVzdCBhbGxvdyBwcm9jZXNzb3JzIHRvCi0JCXRyYW5zZm9ybSBzdHJlYW1zIG9mIFhNTC48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC10by1zdHJlYW0iPlRyQVggbXVzdCBhbGxvdyBwcm9jZXNzb3JzIHRvIHByb2R1Y2UKLQkJWE1MLCBIVE1MLCBhbmQgb3RoZXIgdHlwZXMgb2Ygc3RyZWFtcy48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1jb21iby1pbnB1dC1vdXRwdXQiPlRyQVggbXVzdCBhbGxvdyBwcm9jZXNzb3JzIHRvCi0JCWltcGxlbWVudCB0aGUgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgaW5wdXRzIGFuZCBvdXRwdXRzIHdpdGhpbiBhIHNpbmdsZQotCQlwcm9jZXNzb3IuPC9saXN0aXRlbT4gCi0JIDxsaXN0aXRlbSBpZD0icmVxdWlyZW1lbnQtbGltaXRlZC1pbnB1dC1vdXRwdXQiPlRyQVggbXVzdCBhbGxvdyBwcm9jZXNzb3JzCi0JCXRvIGltcGxlbWVudCBvbmx5IGEgbGltaXRlZCBzZXQgb2YgaW5wdXRzLiBGb3IgaW5zdGFuY2UsIGl0IHNob3VsZCBiZSBwb3NzaWJsZQotCQl0byB3cml0ZSBhIHByb2Nlc3NvciB0aGF0IGltcGxlbWVudHMgdGhlIFRyQVggaW50ZXJmYWNlcyBhbmQgdGhhdCBvbmx5Ci0JCXByb2Nlc3NlcyBET00gdHJlZXMsIG5vdCBzdHJlYW1zIG9yIFNBWCBldmVudHMuPC9saXN0aXRlbT4gCi0JIDxsaXN0aXRlbSBpZD0icmVxdWlyZW1lbnQtcHJvcHJpZXRhcnktZGF0YS1zdHJ1Y3R1cmVzIj5UckFYIHNob3VsZCBhbGxvdyBhCi0JCXByb2Nlc3NvciB0byBpbXBsZW1lbnQgdHJhbnNmb3JtYXRpb25zIG9mIHByb3ByaWV0YXJ5IGRhdGEgc3RydWN0dXJlcy4gRm9yCi0JCWluc3RhbmNlLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gaW1wbGVtZW50IGEgcHJvY2Vzc29yIHRoYXQgcHJvdmlkZXMgVHJBWAotCQlpbnRlcmZhY2VzIHRoYXQgcGVyZm9ybXMgdHJhbnNmb3JtYXRpb24gb2YgSkRPTSB0cmVlcy48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1zZXJpYWxpemF0aW9uLXByb3BzIj5UckFYIG11c3QgYWxsb3cgdGhlIHNldHRpbmcKLQkJb2Ygc2VyaWFsaXphdGlvbiBwcm9wZXJ0aWVzLCB3aXRob3V0IGNvbnN0cmFpbnQgYXMgdG8gd2hhdCB0aGUgZGV0YWlscyBvZiB0aG9zZQotCQlwcm9wZXJ0aWVzIGFyZS48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1zZXR0aW5nLXBhcmFtZXRlcnMiPlRyQVggbXVzdCBhbGxvdyB0aGUgc2V0dGluZwotCQlvZiBwYXJhbWV0ZXJzIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnMuPC9saXN0aXRlbT4gCi0JIDxsaXN0aXRlbSBpZD0icmVxdWlyZW1lbnQtbmFtZXNwYWNlZC1wcm9wZXJ0aWVzIj5UckFYIG11c3Qgc3VwcG9ydCB0aGUKLQkJc2V0dGluZyBvZiBwYXJhbWV0ZXJzIGFuZCBwcm9wZXJ0aWVzIGFzIFhNTCBOYW1lc3BhY2VkIGl0ZW1zIChpLmUuLCBxdWFsaWZpZWQKLQkJbmFtZXMpLjwvbGlzdGl0ZW0+IAotCSA8bGlzdGl0ZW0gaWQ9InJlcXVpcmVtZW50LXJlbGF0aXZlLXVybC1yZXNvbHV0aW9uIj5UckFYIG11c3Qgc3VwcG9ydCBVUkwKLQkJcmVzb2x1dGlvbiBmcm9tIHdpdGhpbiB0aGUgdHJhbnNmb3JtYXRpb24sIGFuZCBoYXZlIGl0IHJldHVybiB0aGUgbmVlZGVkIGRhdGEKLQkJc3RydWN0dXJlLjwvbGlzdGl0ZW0+IAotCSA8bGlzdGl0ZW0gaWQ9InJlcXVpcmVtZW50LWVycm9yLXJlcG9ydGluZyI+VHJBWCBtdXN0IGhhdmUgYSBtZWNoYW5pc20gZm9yCi0JCXJlcG9ydGluZyBlcnJvcnMgYW5kIHdhcm5pbmdzIHRvIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLjwvbGlzdGl0ZW0+IAotICA8L29yZGVyZWRsaXN0PiA8L3JlcXVpcmVtZW50cz4gCi0gIDxtb2RlbD4gCi0gIDx0aXRsZT5Nb2RlbDwvdGl0bGU+IAotICA8cGFyYT5UaGUgc2VjdGlvbiBkZWZpbmVzIHRoZSBhYnN0cmFjdCBtb2RlbCBmb3IgVHJBWCwgYXBhcnQgZnJvbSB0aGUgZGV0YWlscwotCSBvZiB0aGUgaW50ZXJmYWNlcy48L3BhcmE+IAotICA8cGFyYT5BIFRSYVggPHRlcm1yZWYKLQkgbGluay11cmw9InBhdHRlcm4tVHJhbnNmb3JtZXJGYWN0b3J5Ij5UcmFuc2Zvcm1lckZhY3Rvcnk8L3Rlcm1yZWY+IGlzIGFuIG9iamVjdAotCSB0aGF0IHByb2Nlc3NlcyB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnMsIGFuZCBwcm9kdWNlcwotCSA8dGVybXJlZiBsaW5rLXVybD0icGF0dGVybi1UZW1wbGF0ZXMiPlRlbXBsYXRlczwvdGVybXJlZj4gKGluIHRoZSB0ZWNobmljYWwKLQkgdGVybWlub2xvZ3kpLiBBIDx0ZXJtcmVmIGxpbmstdXJsPSJwYXR0ZXJuLVRlbXBsYXRlcyI+VGVtcGxhdGVzPC90ZXJtcmVmPgotCSBvYmplY3QgcHJvdmlkZXMgYSA8dGVybXJlZgotCSBsaW5rLXVybD0icGF0dGVybi1UcmFuc2Zvcm1lciI+VHJhbnNmb3JtZXI8L3Rlcm1yZWY+LCB3aGljaCB0cmFuc2Zvcm1zIG9uZSBvcgotCSBtb3JlIDx0ZXJtcmVmIGxpbmstdXJsPSJwYXR0ZXJuLVNvdXJjZSI+U291cmNlPC90ZXJtcmVmPnMgaW50byBvbmUgb3IgbW9yZQotCSA8dGVybXJlZiBsaW5rLXVybD0icGF0dGVybi1SZXN1bHQiPlJlc3VsdDwvdGVybXJlZj5zLjwvcGFyYT4gCi0gIDxwYXJhPlRvIHVzZSB0aGUgVFJhWCBpbnRlcmZhY2UsIHlvdSBjcmVhdGUgYQotCSA8dGVybXJlZiBsaW5rLXVybD0icGF0dGVybi1UcmFuc2Zvcm1lckZhY3RvcnkiPlRyYW5zZm9ybWVyRmFjdG9yeTwvdGVybXJlZj4sCi0JIHdoaWNoIG1heSBkaXJlY3RseSBwcm92aWRlIGEgPHRlcm1yZWYKLQkgbGluay11cmw9InBhdHRlcm4tVHJhbnNmb3JtZXJzIj5UcmFuc2Zvcm1lcnM8L3Rlcm1yZWY+LCBvciB3aGljaCBjYW4gcHJvdmlkZQotCSA8dGVybXJlZiBsaW5rLXVybD0icGF0dGVybi1UZW1wbGF0ZXMiPlRlbXBsYXRlczwvdGVybXJlZj4gZnJvbSBhIHZhcmlldHkgb2YKLQkgPHRlcm1yZWYgbGluay11cmw9InBhdHRlcm4tU291cmNlIj5Tb3VyY2U8L3Rlcm1yZWY+cy4gVGhlCi0JIDx0ZXJtcmVmIGxpbmstdXJsPSJwYXR0ZXJuLVRlbXBsYXRlcyI+VGVtcGxhdGVzPC90ZXJtcmVmPiBvYmplY3QgaXMgYSBwcm9jZXNzZWQKLQkgb3IgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucywgYW5kIHByb3ZpZGVzIGEKLQkgPHRlcm1yZWYgbGluay11cmw9InBhdHRlcm4tVHJhbnNmb3JtZXIiPlRyYW5zZm9ybWVyPC90ZXJtcmVmPi4gVGhlCi0JIDx0ZXJtcmVmIGxpbmstdXJsPSJwYXR0ZXJuLVRyYW5zZm9ybWVyIj5UcmFuc2Zvcm1lcjwvdGVybXJlZj4gcHJvY2Vzc2VzIGEKLQkgPHRlcm1yZWYgbGluay11cmw9InBhdHRlcm4tVHJhbnNmb3JtZXIiPlNvdXJjZTwvdGVybXJlZj4gYWNjb3JkaW5nIHRvIHRoZQotCSBpbnN0cnVjdGlvbnMgZm91bmQgaW4gdGhlIDx0ZXJtcmVmCi0JIGxpbmstdXJsPSJwYXR0ZXJuLVRlbXBsYXRlcyI+VGVtcGxhdGVzPC90ZXJtcmVmPiwgYW5kIHByb2R1Y2VzIGEKLQkgPHRlcm1yZWYgbGluay11cmw9InBhdHRlcm4tUmVzdWx0Ij5SZXN1bHQ8L3Rlcm1yZWY+LjwvcGFyYT4gCi0gIDxwYXJhPlRoZSBwcm9jZXNzIG9mIHRyYW5zZm9ybWF0aW9uIGZyb20gYSB0cmVlLCBlaXRoZXIgaW4gdGhlIGZvcm0gb2YgYW4KLQkgb2JqZWN0IG1vZGVsLCBvciBpbiB0aGUgZm9ybSBvZiBwYXJzZSBldmVudHMsIGludG8gYSBzdHJlYW0sIGlzIGtub3duIGFzCi0JIDx0ZXJtcmVmPnNlcmlhbGl6YXRpb248L3Rlcm1yZWY+LiBXZSBiZWxpZXZlIHRoaXMgaXMgdGhlIG1vc3Qgc3VpdGFibGUgdGVybSBmb3IKLQkgdGhpcyBwcm9jZXNzLCBkZXNwaXRlIHRoZSBvdmVybGFwIHdpdGggSmF2YSBvYmplY3Qgc2VyaWFsaXphdGlvbi48L3BhcmE+IAotICA8cGF0dGVybnMgbW9kdWxlPSJUUmFYIj4gPHBhdHRlcm4+PHBhdHRlcm4tbmFtZQotICBpZD0icGF0dGVybi1Qcm9jZXNzb3IiPlByb2Nlc3NvcjwvcGF0dGVybi1uYW1lPjxpbnRlbnQ+R2VuZXJpYyBjb25jZXB0IGZvciB0aGUKLSAgc2V0IG9mIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIFRyQVggaW50ZXJmYWNlcy48L2ludGVudD4KLSAgPHJlc3BvbnNpYmlsaXRpZXM+Q3JlYXRlIGNvbXBpbGVkIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucywgdHJhbnNmb3JtCi0gIHNvdXJjZXMsIGFuZCBtYW5hZ2UgdHJhbnNmb3JtYXRpb24gcGFyYW1ldGVycyBhbmQKLSAgcHJvcGVydGllcy48L3Jlc3BvbnNpYmlsaXRpZXM+PHRocmVhZC1zYWZldHk+T25seSB0aGUgVGVtcGxhdGVzIG9iamVjdCBjYW4gYmUKLSAgdXNlZCBjb25jdXJyZW50bHkgaW4gbXVsdGlwbGUgdGhyZWFkcy4gVGhlIHJlc3Qgb2YgdGhlIHByb2Nlc3NvciBkb2VzIG5vdCBkbwotICBzeW5jaHJvbml6ZWQgYmxvY2tpbmcsIGFuZCBzbyBtYXkgbm90IGJlIHVzZWQgdG8gcGVyZm9ybSBtdWx0aXBsZSBjb25jdXJyZW50Ci0gIG9wZXJhdGlvbnMuPC90aHJlYWQtc2FmZXR5PjwvcGF0dGVybj48cGF0dGVybj4gCi0gIDxwYXR0ZXJuLW5hbWUgaWQ9InBhdHRlcm4tVHJhbnNmb3JtZXJGYWN0b3J5Ij5UcmFuc2Zvcm1lckZhY3Rvcnk8L3BhdHRlcm4tbmFtZT4KLSAgPGludGVudD5TZXJ2ZSBhcyBhIHZlbmRvci1uZXV0cmFsIFByb2Nlc3NvciBpbnRlcmZhY2UgZm9yCi0gIDx1bGluayB1cmw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPlhTTFQ8L3VsaW5rPiBhbmQgc2ltaWxhcgotICBwcm9jZXNzb3JzLjwvaW50ZW50PiA8cmVzcG9uc2liaWxpdGllcz5TZXJ2ZSBhcyBhIGZhY3RvcnkgZm9yIGEgY29uY3JldGUKLSAgaW1wbGVtZW50YXRpb24gb2YgYW4gVHJhbnNmb3JtZXJGYWN0b3J5LCBzZXJ2ZSBhcyBhIGRpcmVjdCBmYWN0b3J5IGZvcgotICBUcmFuc2Zvcm1lciBvYmplY3RzLCBzZXJ2ZSBhcyBhIGZhY3RvcnkgZm9yIFRlbXBsYXRlcyBvYmplY3RzLCBhbmQgbWFuYWdlCi0gIHByb2Nlc3NvciBzcGVjaWZpYyBmZWF0dXJlcy48L3Jlc3BvbnNpYmlsaXRpZXM+IDx0aHJlYWQtc2FmZXR5PkEKLSAgVHJhbnNmb3JtZXJGYWN0b3J5IG1heSBub3QgcGVyZm9ybSBtdWxpdHBsZSBjb25jdXJyZW50Ci0gIG9wZXJhdGlvbnMuPC90aHJlYWQtc2FmZXR5PiA8L3BhdHRlcm4+IDxwYXR0ZXJuPiAKLSAgPHBhdHRlcm4tbmFtZSBpZD0icGF0dGVybi1UZW1wbGF0ZXMiPlRlbXBsYXRlczwvcGF0dGVybi1uYW1lPiA8aW50ZW50PlRoZQotICBydW50aW1lIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnMuPC9pbnRlbnQ+IAotICA8cmVzcG9uc2liaWxpdGllcz5BIGRhdGEgYmFnIGZvciB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnM7IGFjdCBhcyBhIGZhY3RvcnkKLSAgZm9yIFRyYW5zZm9ybWVycy48L3Jlc3BvbnNpYmlsaXRpZXM+IDx0aHJlYWQtc2FmZXR5PlRocmVhZHNhZmUgZm9yIGNvbmN1cnJlbnQKLSAgdXNhZ2Ugb3ZlciBtdWx0aXBsZSB0aHJlYWRzIG9uY2UgY29uc3RydWN0aW9uIGlzIGNvbXBsZXRlLjwvdGhyZWFkLXNhZmV0eT4KLSAgPC9wYXR0ZXJuPiA8cGF0dGVybj4gPHBhdHRlcm4tbmFtZQotICBpZD0icGF0dGVybi1UcmFuc2Zvcm1lciI+VHJhbnNmb3JtZXI8L3BhdHRlcm4tbmFtZT4gPGludGVudD5BY3QgYXMgYSBwZXItdGhyZWFkCi0gIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0cmFuc2Zvcm1hdGlvbnMsIGFjdCBhcyBhbiBpbnRlcmZhY2UgZm9yIHBlcmZvcm1pbmcgdGhlCi0gIHRyYW5zZm9ybWF0aW9uLjwvaW50ZW50PjxyZXNwb25zaWJpbGl0aWVzPlBlcmZvcm0gdGhlCi0gIHRyYW5zZm9ybWF0aW9uLjwvcmVzcG9uc2liaWxpdGllcz4gPHRocmVhZC1zYWZldHk+T25seSBvbmUgaW5zdGFuY2UgcGVyIHRocmVhZAotICBpcyBzYWZlLjwvdGhyZWFkLXNhZmV0eT4gPG5vdGVzPlRoZSBUcmFuc2Zvcm1lciBpcyBib3VuZCB0byB0aGUgVGVtcGxhdGVzCi0gIG9iamVjdCB0aGF0IGNyZWF0ZWQgaXQuPC9ub3Rlcz4gPC9wYXR0ZXJuPiA8cGF0dGVybj4gCi0gIDxwYXR0ZXJuLW5hbWUgaWQ9InBhdHRlcm4tU291cmNlIj5Tb3VyY2U8L3BhdHRlcm4tbmFtZT4gPGludGVudD5TZXJ2ZSBhcyBhCi0gIHNpbmdsZSB2ZW5kb3ItbmV1dHJhbCBvYmplY3QgZm9yIG11bHRpcGxlIHR5cGVzIG9mIGlucHV0LjwvaW50ZW50PiAKLSAgPHJlc3BvbnNpYmlsaXRpZXM+QWN0IGFzIHNpbXBsZSBkYXRhIGhvbGRlciBmb3IgU3lzdGVtIElEcywgRE9NIG5vZGVzLCBzdHJlYW1zLAotICBldGMuPC9yZXNwb25zaWJpbGl0aWVzPiA8dGhyZWFkLXNhZmV0eT5UaHJlYWRzYWZlIGNvbmN1cnJlbnRseSBvdmVyIG11bHRpcGxlCi0gIHRocmVhZHMgZm9yIHJlYWQtb25seSBvcGVyYXRpb25zOyBtdXN0IGJlIHN5bmNocm9uaXplZCBmb3IgZWRpdAotICBvcGVyYXRpb25zLjwvdGhyZWFkLXNhZmV0eT4gPC9wYXR0ZXJuPjxwYXR0ZXJuPiAKLSAgPHBhdHRlcm4tbmFtZSBpZD0icGF0dGVybi1SZXN1bHQiPlJlc3VsdDwvcGF0dGVybi1uYW1lPiAKLSAgPHBvdGVudGlhbC1hbHRlcm5hdGUtbmFtZT5SZXN1bHRUYXJnZXQ8L3BvdGVudGlhbC1hbHRlcm5hdGUtbmFtZT4gPGludGVudD5TZXJ2ZQotICBhcyBhIHNpbmdsZSBvYmplY3QgZm9yIG11bHRpcGxlIHR5cGVzIG9mIG91dHB1dCwgc28gdGhlcmUgY2FuIGJlIHNpbXBsZSBwcm9jZXNzCi0gIG1ldGhvZCBzaWduYXR1cmVzLjwvaW50ZW50PiA8cmVzcG9uc2liaWxpdGllcz5BY3QgYXMgc2ltcGxlIGRhdGEgaG9sZGVyIGZvcgotICBvdXRwdXQgc3RyZWFtLCBET00gbm9kZSwgQ29udGVudEhhbmRsZXIsIGV0Yy48L3Jlc3BvbnNpYmlsaXRpZXM+IAotICA8dGhyZWFkLXNhZmV0eT5UaHJlYWRzYWZlIGNvbmN1cnJlbnRseSBvdmVyIG11bHRpcGxlIHRocmVhZHMgZm9yIHJlYWQtb25seSwKLSAgbXVzdCBiZSBzeW5jaHJvbml6ZWQgZm9yIGVkaXQuPC90aHJlYWQtc2FmZXR5PiA8L3BhdHRlcm4+IDwvcGF0dGVybnM+PC9tb2RlbD4gCi0gIDxzZWN0MSBpZD0icGFja2FnZSI+IAotCSA8dGl0bGU+amF2YXgueG1sLnRyYW5zZm9ybTwvdGl0bGU+IAotCSA8cGFyYT5UaGlzIHBhY2thZ2UgZGVmaW5lcyB0aGUgZ2VuZXJpYyBBUElzIGZvciBwcm9jZXNzaW5nIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucywKLQkJYW5kIHBlcmZvcm1pbmcgYSB0cmFuc2Zvcm1hdGlvbiBmcm9tIHNvdXJjZSB0byByZXN1bHQuIFRoZXNlIAotCQlpbnRlcmZhY2VzIGhhdmUgbm8gZGVwZW5kZW5jaWVzIG9uIFNBWCBvciB0aGUgRE9NIHN0YW5kYXJkLCBhbmQgdHJ5IHRvIG1ha2UgYXMKLQkJZmV3IGFzc3VtcHRpb25zIGFzIHBvc3NpYmxlIGFib3V0IHRoZSBkZXRhaWxzIG9mIHRoZSBzb3VyY2UgYW5kIHJlc3VsdCBvZiBhCi0JCXRyYW5zZm9ybWF0aW9uLiBUaGUgQVBJIGFjaGlldmVzIHRoaXMgYnkgZGVmaW5pbmcgCi0JCTxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTwvcGxpbms+IGFuZCAKLQkJPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0PC9wbGluaz4gaW50ZXJmYWNlcy48L3BhcmE+IAotCSA8cGFyYT5UbyBkZWZpbmUgY29uY3JldGUgY2xhc3NlcyBmb3IgdGhlIHVzZXIsIHRoZSBBUEkgZGVmaW5lcyBzcGVjaWFsaXphdGlvbnMKLQkJb2YgdGhlIGludGVyZmFjZXMgZm91bmQgYXQgdGhlIHJvb3QgbGV2ZWwuIFRoZXNlIGludGVyZmFjZXMgYXJlIGZvdW5kIGluIAotCQk8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXg8L3BsaW5rPiwgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uZG9tPC9wbGluaz4sCi0JCWFuZCA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW08L3BsaW5rPi48L3BhcmE+IAotCSA8c2VjdDI+IAotCQk8dGl0bGU+Q3JlYXRpbmcgT2JqZWN0czwvdGl0bGU+IAotCQk8cGFyYT5UaGUgQVBJIGFsbG93cyBhIGNvbmNyZXRlIAotCQkgIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTwvcGxpbms+IG9iamVjdCB0byBiZSBjcmVhdGVkIGZyb20KLQkJICB0aGUgc3RhdGljIGZ1bmN0aW9uIAotCQkgIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSNuZXdJbnN0YW5jZTwvcGxpbms+LiBUaGUKLQkJICAiamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkiIHN5c3RlbSBwcm9wZXJ0eSBkZXRlcm1pbmVzIHdoaWNoCi0JCSAgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbiB0byBpbnN0YW50aWF0ZS4gVGhpcyBwcm9wZXJ0eSBuYW1lcyBhIGNvbmNyZXRlIHN1YmNsYXNzCi0JCSAgb2YgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSBhYnN0cmFjdCBjbGFzcy4gSWYgdGhpcyBzeXN0ZW0gcHJvcGVydHkgaXMgbm90Ci0JCSAgZGVmaW5lZCwgYSBwbGF0Zm9ybSBkZWZhdWx0IGlzIHVzZWQuPC9wYXJhPiAKLQkgPC9zZWN0Mj4gCi0JIDxzZWN0Mj4gCi0JCTx0aXRsZT5TcGVjaWZpY2F0aW9uIG9mIElucHV0cyBhbmQgT3V0cHV0czwvdGl0bGU+IAotCQk8cGFyYT5UaGlzIEFQSSBkZWZpbmVzIHR3byBpbnRlcmZhY2Ugb2JqZWN0cyBjYWxsZWQgCi0JCSAgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlPC9wbGluaz4gYW5kIAotCQkgIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDwvcGxpbms+LiBJbiBvcmRlciB0byBwYXNzIFNvdXJjZSBhbmQgUmVzdWx0Ci0JCSAgb2JqZWN0cyB0byB0aGUgaW50ZXJmYWNlcywgY29uY3JldGUgY2xhc3NlcyBtdXN0IGJlIHVzZWQuIFRoZSB0cmFuc2Zvcm1hdGlvbiBBUEkgZGVmaW5lcwotCQkgIHRocmVlIGNvbmNyZXRlIHJlcHJlc2VudGF0aW9ucyBmb3IgZWFjaCBvZiB0aGVzZSBvYmplY3RzOiAKLQkJICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlPC9wbGluaz4gYW5kIAotCQkgIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ8L3BsaW5rPiwKLQkJICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlPC9wbGluaz4gYW5kIAotCQkgIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ8L3BsaW5rPiwgYW5kIAotCQkgIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U8L3BsaW5rPiBhbmQgCi0JCSAgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDwvcGxpbms+LiBFYWNoIG9mIHRoZXNlIG9iamVjdHMgZGVmaW5lcwotCQkgIGEgRkVBVFVSRSBzdHJpbmcgKHdoaWNoIGlzIGkgdGhlIGZvcm0gb2YgYSBVUkwpLCB3aGljaCBjYW4gYmUgcGFzc2VkIGludG8gCi0JCSAgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I2dldEZlYXR1cmU8L3BsaW5rPiB0byBzZWUgaWYgdGhlCi0JCSAgZ2l2ZW4gdHlwZSBvZiBTb3VyY2Ugb3IgUmVzdWx0IG9iamVjdCBpcyBzdXBwb3J0ZWQuIEZvciBpbnN0YW5jZSwgdG8gdGVzdCBpZiBhCi0JCSAgRE9NU291cmNlIGFuZCBhIFN0cmVhbVJlc3VsdCBpcyBzdXBwb3J0ZWQsIHlvdSBjYW4gYXBwbHkgdGhlIGZvbGxvd2luZwotCQkgIHRlc3QuPC9wYXJhPiAKLQkJPHByb2dyYW1saXN0aW5nPiAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgIGlmICh0ZmFjdG9yeS5nZXRGZWF0dXJlKERPTVNvdXJjZS5GRUFUVVJFKSAmYW1wOyZhbXA7IHRmYWN0b3J5LmdldEZlYXR1cmUoU3RyZWFtUmVzdWx0LkZFQVRVUkUpKQotICAgIHsKLSAgICAgICAuLi4KLSAgICB9PC9wcm9ncmFtbGlzdGluZz4KLSAgPC9zZWN0Mj4gCi0gIDxzZWN0Mj4gCi0JIDx0aXRsZSBpZD0icW5hbWUtZGVsaW1pdGVyIj5RdWFsaWZpZWQgTmFtZSByZXByZXNlbnRhdGlvbjwvdGl0bGU+IAotCSA8cGFyYT48dWxpbmsgdXJsPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzIj5OYW1lc3BhY2VzPC91bGluaz4KLQkJcHJlc2VudCBzb21ldGhpbmcgb2YgYSBwcm9ibGVtIGFyZWEgd2hlbiBkZWFsaW5nIHdpdGggWE1MIG9iamVjdHMuIFF1YWxpZmllZAotCQlOYW1lcyBhcHBlYXIgaW4gWE1MIG1hcmt1cCBhcyBwcmVmaXhlZCBuYW1lcy4gQnV0IHRoZSBwcmVmaXhlcyB0aGVtc2VsdmVzIGRvCi0JCW5vdCBob2xkIGlkZW50aXR5LiBSYXRoZXIsIGl0IGlzIHRoZSBVUklzIHRoYXQgdGhleSBjb250ZXh0dWFsbHkgbWFwIHRvIHRoYXQKLQkJaG9sZCB0aGUgaWRlbnRpdHkuIFRoZXJlZm9yZSwgd2hlbiBwYXNzaW5nIGEgUXVhbGlmaWVkIE5hbWUgbGlrZSAieHl6OmZvbyIKLQkJYW1vbmcgSmF2YSBwcm9ncmFtcywgb25lIG11c3QgcHJvdmlkZSBhIG1lYW5zIHRvIG1hcCAieHl6IiB0byBhIG5hbWVzcGFjZS4KLQkJPC9wYXJhPiAKLQkgPHBhcmE+T25lIHNvbHV0aW9uIGhhcyBiZWVuIHRvIGNyZWF0ZSBhICJRTmFtZSIgb2JqZWN0IHRoYXQgaG9sZHMgdGhlCi0JCW5hbWVzcGFjZSBVUkksIGFzIHdlbGwgYXMgdGhlIHByZWZpeCBhbmQgbG9jYWwgbmFtZSwgYnV0IHRoaXMgaXMgbm90IGFsd2F5cyBhbgotCQlvcHRpbWFsIHNvbHV0aW9uLCBhcyB3aGVuLCBmb3IgZXhhbXBsZSwgeW91IHdhbnQgdG8gdXNlIHVuaXF1ZSBzdHJpbmdzIGFzIGtleXMKLQkJaW4gYSBkaWN0aW9uYXJ5IG9iamVjdC4gTm90IGhhdmluZyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBhbHNvIG1ha2VzIGl0Ci0JCWRpZmZpY3VsdCB0byBzcGVjaWZ5IGEgbmFtZXNwYWNlZCBpZGVudGl0eSBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIGFuIFhNTAotCQlkb2N1bWVudC48L3BhcmE+IAotCSA8cGFyYT5JbiBvcmRlciB0byBwYXNzIG5hbWVzcGFjZWQgdmFsdWVzIHRvIHRyYW5zZm9ybWF0aW9ucywgZm9yIGluc3RhbmNlCi0JCWFzIGEgc2V0IG9mIHByb3BlcnRpZXMgdG8gdGhlIFNlcmlhbGl6ZXIsIHRoaXMgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIHRoYXQgYQotCQlTdHJpbmcgInFuYW1lIiBvYmplY3QgcGFyYW1ldGVyIGJlIHBhc3NlZCBhcyB0d28tcGFydCBzdHJpbmcsIHRoZSBuYW1lc3BhY2UgVVJJCi0JCWVuY2xvc2VkIGluIGN1cmx5IGJyYWNlcyAoe30pLCBmb2xsb3dlZCBieSB0aGUgbG9jYWwgbmFtZS4gSWYgdGhlIHFuYW1lIGhhcyBhCi0JCW51bGwgVVJJLCB0aGVuIHRoZSBTdHJpbmcgb2JqZWN0IG9ubHkgY29udGFpbnMgdGhlIGxvY2FsIG5hbWUuIEFuIGFwcGxpY2F0aW9uCi0JCWNhbiBzYWZlbHkgY2hlY2sgZm9yIGEgbm9uLW51bGwgVVJJIGJ5IHRlc3RpbmcgdG8gc2VlIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKLQkJdGhlIG5hbWUgaXMgYSAneycgY2hhcmFjdGVyLjwvcGFyYT4gCi0JIDxwYXJhPkZvciBleGFtcGxlLCBpZiBhIFVSSSBhbmQgbG9jYWwgbmFtZSB3ZXJlIG9idGFpbmVkIGZyb20gYW4gZWxlbWVudAotCQlkZWZpbmVkIHdpdGggJmx0O3h5ejpmb28geG1sbnM6eHl6PSJodHRwOi8veHl6LmZvby5jb20veWFkYS9iYXouaHRtbCIvJmd0OywKLQkJdGhlbiB0aGUgdHJhbnNmb3JtYXRpb24gQVBJIFF1YWxpZmllZCBOYW1lIHdvdWxkIGJlICJ7aHR0cDovL3h5ei5mb28uY29tL3lhZGEvYmF6Lmh0bWx9Zm9vIi4KLQkJTm90ZSB0aGF0IHRoZSBwcmVmaXggaXMgbG9zdC48L3BhcmE+IAotICA8L3NlY3QyPiAKLSAgPHNlY3QyPiAKLQkgPHRpdGxlPlJlc3VsdCBUcmVlIFNlcmlhbGl6YXRpb248L3RpdGxlPiAKLQkgPHBhcmE+U2VyaWFsaXphdGlvbiBvZiB0aGUgcmVzdWx0IHRyZWUgdG8gYSBzdHJlYW0gY2FuIGJlIGNvbnRyb2xsZWQgd2l0aAotCQl0aGUgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIjc2V0T3V0cHV0UHJvcGVydGllczwvcGxpbms+IGFuZCB0aGUgCi0JCTxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyI3NldE91dHB1dFByb3BlcnR5PC9wbGluaz4gbWV0aG9kcy4KLQkJU3RyaW5ncyB0aGF0IG1hdGNoIHRoZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0I291dHB1dCI+WFNMVAotCQlzcGVjaWZpY2F0aW9uIGZvciB4c2w6b3V0cHV0IGF0dHJpYnV0ZXM8L3VsaW5rPiBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoZSAKLQkJPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czwvcGxpbms+IGNsYXNzLiBPdGhlciBzdHJpbmdzIGNhbiBiZQotCQlzcGVjaWZpZWQgYXMgd2VsbC4gSWYgdGhlIHRyYW5zZm9ybWVyIGRvZXMgbm90IHJlY29nbml6ZSBhbiBvdXRwdXQga2V5LCBhIAotCQk8cGxpbms+amF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvcGxpbms+IGlzIHRocm93biwgdW5sZXNzIHRoZSAKLQkJPGVtcGhhc2lzPnVubGVzczwvZW1waGFzaXM+IHRoZSBrZXkgbmFtZSBpcyA8bGluawotCQlsaW5rZW5kPSJxbmFtZS1kZWxpbWl0ZXIiPm5hbWVzcGFjZSBxdWFsaWZpZWQ8L2xpbms+LiBPdXRwdXQga2V5IG5hbWVzIHRoYXQgYXJlCi0JCXF1YWxpZmllZCBieSBhIG5hbWVzcGFjZSBhcmUgaWdub3JlZCBvciBwYXNzZWQgb24gdG8gdGhlIHNlcmlhbGl6ZXIKLQkJbWVjaGFuaXNtLjwvcGFyYT4gCi0JIDxwYXJhPklmIGFsbCB0aGF0IGlzIGRlc2lyZWQgaXMgdGhlIHNpbXBsZSBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiBvZiBhCi0JCXNvdXJjZSB0byBhIHJlc3VsdCwgdGhlbiA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk8L3BsaW5rPgotCQlwcm92aWRlcyBhCi0JCTxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSNuZXdUcmFuc2Zvcm1lcigpPC9wbGluaz4gbWV0aG9kCi0JCXdpdGggbm8gYXJndW1lbnRzLiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgVHJhbnNmb3JtZXIgdGhhdCBlZmZlY3RpdmVseSBjb3BpZXMKLQkJdGhlIHNvdXJjZSB0byB0aGUgcmVzdWx0LiBUaGlzIG1ldGhvZCBtYXkgYmUgdXNlZCB0byBjcmVhdGUgYSBET00gZnJvbSBTQVgKLQkJZXZlbnRzIG9yIHRvIGNyZWF0ZSBhbiBYTUwgb3IgSFRNTCBzdHJlYW0gZnJvbSBhIERPTSBvciBTQVggZXZlbnRzLjwvcGFyYT4KLTwvc2VjdDI+IAotPHNlY3QyPiAKLSAgPHRpdGxlPkV4Y2VwdGlvbnMgYW5kIEVycm9yIFJlcG9ydGluZzwvdGl0bGU+IAotICA8cGFyYT5UaGUgdHJhbnNmb3JtYXRpb24gQVBJIHRocm93cyB0aHJlZSB0eXBlcyBvZiBzcGVjaWFsaXplZCBleGNlcHRpb25zLiBBCi0JIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjwvcGxpbms+IGlzIHBhcmFsbGVsIHRvCi0JIHRoZSA8cGxpbms+amF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjwvcGxpbms+LCBhbmQgaXMgdGhyb3duCi0JIHdoZW4gYSBjb25maWd1cmF0aW9uIHByb2JsZW0gd2l0aCB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IGV4aXN0cy4gVGhpcyBlcnJvcgotCSB3aWxsIHR5cGljYWxseSBiZSB0aHJvd24gd2hlbiB0aGUgdHJhbnNmb3JtYXRpb24gZmFjdG9yeSBjbGFzcyBzcGVjaWZpZWQgd2l0aAotCSB0aGUgImphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5IiBzeXN0ZW0gcHJvcGVydHkgY2Fubm90IGJlIGZvdW5kIG9yCi0JIGluc3RhbnRpYXRlZC48L3BhcmE+IAotICA8cGFyYT5BIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjwvcGxpbms+Ci0JIG1heSBiZSB0aHJvd24gaWYgZm9yIGFueSByZWFzb24gYSBUcmFuc2Zvcm1lciBjYW4gbm90IGJlIGNyZWF0ZWQuIEEKLQkgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gaWYgdGhlcmUgaXMgYSBzeW50YXggZXJyb3IgaW4KLQkgdGhlIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucywgZm9yIGV4YW1wbGUgd2hlbgotCSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkjbmV3VHJhbnNmb3JtZXI8L3BsaW5rPiBpcwotCSBjYWxsZWQuPC9wYXJhPiAKLSAgPHBhcmE+PHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb248L3BsaW5rPiBpcyBhIGdlbmVyYWwKLQkgZXhjZXB0aW9uIHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgY291cnNlIG9mIGEgdHJhbnNmb3JtYXRpb24uIEEgdHJhbnNmb3JtZXIKLQkgZXhjZXB0aW9uIG1heSB3cmFwIGFub3RoZXIgZXhjZXB0aW9uLCBhbmQgaWYgYW55IG9mIHRoZQotCSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiNwcmludFN0YWNrVHJhY2UoKTwvcGxpbms+Ci0JIG1ldGhvZHMgYXJlIGNhbGxlZCBvbiBpdCwgaXQgd2lsbCBwcm9kdWNlIGEgbGlzdCBvZiBzdGFjayBkdW1wcywgc3RhcnRpbmcgZnJvbQotCSB0aGUgbW9zdCByZWNlbnQuIFRoZSB0cmFuc2Zvcm1lciBleGNlcHRpb24gYWxzbyBwcm92aWRlcyBhCi0JIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZUxvY2F0b3I8L3BsaW5rPiBvYmplY3Qgd2hpY2ggaW5kaWNhdGVzIHdoZXJlCi0JIGluIHRoZSBzb3VyY2UgdHJlZSBvciB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnMgdGhlIGVycm9yIG9jY3VycmVkLgotCSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiNnZXRNZXNzYWdlQW5kTG9jYXRpb24oKTwvcGxpbms+Ci0JIG1heSBiZSBjYWxsZWQgdG8gZ2V0IGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCBsb2NhdGlvbiBpbmZvLCBhbmQKLQkgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24jZ2V0TG9jYXRpb25Bc1N0cmluZygpPC9wbGluaz4KLQkgbWF5IGJlIGNhbGxlZCB0byBnZXQganVzdCB0aGUgbG9jYXRpb24gc3RyaW5nLjwvcGFyYT4gCi0gIDxwYXJhPlRyYW5zZm9ybWF0aW9uIHdhcm5pbmdzIGFuZCBlcnJvcnMgYXJlIG5vcm1hbGx5IGZpcnN0IHNlbnQgdG8gYQotCSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5FcnJvckxpc3RlbmVyPC9wbGluaz4sIGF0IHdoaWNoIHBvaW50IHRoZQotCSBpbXBsZW1lbnRvciBtYXkgZGVjaWRlIHRvIHJlcG9ydCB0aGUgZXJyb3Igb3Igd2FybmluZywgYW5kIG1heSBkZWNpZGUgdG8gdGhyb3cKLQkgYW4gZXhjZXB0aW9uIGZvciBhIG5vbi1mYXRhbCBlcnJvci4gVGhlIGVycm9yIGxpc3RlbmVyIG1heSBiZSBzZXQgdmlhCi0JIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSNzZXRFcnJvckxpc3RlbmVyPC9wbGluaz4gZm9yCi0JIHJlcG9ydGluZyBlcnJvcnMgdGhhdCBoYXZlIHRvIGRvIHdpdGggc3ludGF4IGVycm9ycyBpbiB0aGUgdHJhbnNmb3JtYXRpb24KLQkgaW5zdHJ1Y3Rpb25zLCBvciB2aWEKLQkgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIjc2V0RXJyb3JMaXN0ZW5lcjwvcGxpbms+IHRvIHJlcG9ydAotCSBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgdGhlIHRyYW5zZm9ybWF0aW9uLiBUaGUgZXJyb3IgbGlzdGVuZXIgb24gYm90aCBvYmplY3RzCi0JIHNob3VsZCBhbHdheXMgYmUgdmFsaWQgYW5kIG5vbi1udWxsLCB3aGV0aGVyIHNldCBieSB0aGUgdXNlciBvciBhIGRlZmF1bHQKLQkgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhlIHByb2Nlc3Nvci48L3BhcmE+IAotPC9zZWN0Mj4gCi08c2VjdDI+IAotICA8dGl0bGU+UmVzb2x1dGlvbiBvZiBVUklzIHdpdGhpbiBhIHRyYW5zZm9ybWF0aW9uPC90aXRsZT4gCi0gIDxwYXJhPlRoZSBBUEkgcHJvdmlkZXMgYSB3YXkgZm9yIFVSSXMgcmVmZXJlbmNlZCBmcm9tIHdpdGhpbiB0aGUgc3R5bGVzaGVldAotCSBpbnN0cnVjdGlvbnMgb3Igd2l0aGluIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBiZSByZXNvbHZlZCBieSB0aGUgY2FsbGluZwotCSBhcHBsaWNhdGlvbi4gVGhpcyBjYW4gYmUgZG9uZSBieSBjcmVhdGluZyBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUKLQkgVVJJUmVzb2x2ZXIgaW50ZXJmYWNlLCB3aXRoIGl0cyBvbmUgbWV0aG9kLAotCSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlciNyZXNvbHZlPC9wbGluaz4sIGFuZCB1c2UgdGhpcyBjbGFzcyB0bwotCSBzZXQgdGhlIFVSSSByZXNvbHV0aW9uIGZvciB0aGUgdHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zIG9yIHRyYW5zZm9ybWF0aW9uCi0JIHdpdGggPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I3NldFVSSVJlc29sdmVyPC9wbGluaz4gb3IKLQkgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIjc2V0VVJJUmVzb2x2ZXI8L3BsaW5rPi4gVGhlCi0JIFVSSVJlc29sdmVyLnJlc29sdmUgbWV0aG9kIHRha2VzIHR3byBTdHJpbmcgYXJndW1lbnRzLCB0aGUgVVJJIGZvdW5kIGluIHRoZQotCSBzdHlsZXNoZWV0IGluc3RydWN0aW9ucyBvciBidWlsdCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBwcm9jZXNzLCBhbmQgdGhlCi0JIGJhc2UgVVJJIGluIGVmZmVjdCB3aGVuIHRoZSBVUkkgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB3YXMgZW5jb3VudGVyZWQuCi0JIFRoZSByZXR1cm5lZCA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U8L3BsaW5rPiBvYmplY3QgbXVzdCBiZSB1c2FibGUgYnkKLQkgdGhlIHRyYW5zZm9ybWVyLCBhcyBzcGVjaWZpZWQgaW4gaXRzIGltcGxlbWVudGVkIGZlYXR1cmVzLjwvcGFyYT4gCi08L3NlY3QyPiAKLTxzZWN0MiBpZD0ic3BlY2lhbGl6ZWQtcGFja2FnZXMiPiAKLTx0aXRsZT5TcGVjaWFsaXplZCBQYWNrYWdlczwvdGl0bGU+IAotPHNlY3QzPiAKLSAgPHRpdGxlPmphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtPC90aXRsZT4gCi0gIDxwYXJhPlRoaXMgcGFja2FnZSBpbXBsZW1lbnRzIHN0cmVhbS0gYW5kIFVSSS0gc3BlY2lmaWMgdHJhbnNmb3JtYXRpb24gQVBJcy4KLQkgPC9wYXJhPiAKLSAgPHBhcmE+VGhlIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U8L3BsaW5rPiBjbGFzcwotCSBwcm92aWRlcyBtZXRob2RzIGZvciBzcGVjaWZ5aW5nIDxwbGluaz5qYXZhLmlvLklucHV0U3RyZWFtPC9wbGluaz4gaW5wdXQsCi0JIDxwbGluaz5qYXZhLmlvLlJlYWRlcjwvcGxpbms+IGlucHV0LCBhbmQgVVJMIGlucHV0IGluIHRoZSBmb3JtIG9mIHN0cmluZ3MuIEV2ZW4KLQkgaWYgYW4gaW5wdXQgc3RyZWFtIG9yIHJlYWRlciBpcyBzcGVjaWZpZWQgYXMgdGhlIHNvdXJjZSwKLQkgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZSNzZXRTeXN0ZW1JZDwvcGxpbms+IHNob3VsZCBzdGlsbAotCSBiZSBjYWxsZWQsIHNvIHRoYXQgdGhlIHRyYW5zZm9ybWVyIGNhbiBrbm93IGZyb20gd2hlcmUgaXQgc2hvdWxkIHJlc29sdmUKLQkgcmVsYXRpdmUgVVJJcy4gVGhlIHB1YmxpYyBpZGVudGlmaWVyIGlzIGFsd2F5cyBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uCi0JIHdyaXRlciBpbmNsdWRlcyBvbmUsIGl0IHdpbGwgYmUgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUKLQkgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlTG9jYXRvcjwvcGxpbms+IGluZm9ybWF0aW9uLjwvcGFyYT4gCi0gIDxwYXJhPlRoZSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0PC9wbGluaz4gY2xhc3MKLQkgcHJvdmlkZXMgbWV0aG9kcyBmb3Igc3BlY2lmeWluZyA8cGxpbms+amF2YS5pby5PdXRwdXRTdHJlYW08L3BsaW5rPiwKLQkgPHBsaW5rPmphdmEuaW8uV3JpdGVyPC9wbGluaz4sIG9yIGFuIG91dHB1dCBzeXN0ZW0gSUQsIGFzIHRoZSBvdXRwdXQgb2YgdGhlCi0JIHRyYW5zZm9ybWF0aW9uIHJlc3VsdC48L3BhcmE+IAotICA8cGFyYT5Ob3JtYWxseSBzdHJlYW1zIHNob3VsZCBiZSB1c2VkIHJhdGhlciB0aGFuIHJlYWRlcnMgb3Igd3JpdGVycywgZm9yCi0JIGJvdGggdGhlIFNvdXJjZSBhbmQgUmVzdWx0LCBzaW5jZSByZWFkZXJzIGFuZCB3cml0ZXJzIGFscmVhZHkgaGF2ZSB0aGUgZW5jb2RpbmcKLQkgZXN0YWJsaXNoZWQgdG8gYW5kIGZyb20gdGhlIGludGVybmFsIFVuaWNvZGUgZm9ybWF0LiBIb3dldmVyLCB0aGVyZSBhcmUgdGltZXMKLQkgd2hlbiBpdCBpcyB1c2VmdWwgdG8gd3JpdGUgdG8gYSBjaGFyYWN0ZXIgc3RyZWFtLCBzdWNoIGFzIHdoZW4gdXNpbmcgYQotCSBTdHJpbmdXcml0ZXIgaW4gb3JkZXIgdG8gd3JpdGUgdG8gYSBTdHJpbmcsIG9yIGluIHRoZSBjYXNlIG9mIHJlYWRpbmcgc291cmNlCi0JIFhNTCBmcm9tIGEgU3RyaW5nUmVhZGVyLjwvcGFyYT4gCi08L3NlY3QzPiAKLTxzZWN0Mz4gCi08dGl0bGU+amF2YXgueG1sLnRyYW5zZm9ybS5zYXg8L3RpdGxlPiAKLTxwYXJhPlRoaXMgcGFja2FnZSBpbXBsZW1lbnRzIFNBWDItc3BlY2lmaWMgdHJhbnNmb3JtYXRpb24gQVBJcy4gSXQgcHJvdmlkZXMKLSAgY2xhc3NlcyB3aGljaCBhbGxvdyBpbnB1dCBmcm9tIDxwbGluaz5vcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjwvcGxpbms+Ci0gIGV2ZW50cywgYW5kIGFsc28gY2xhc3NlcyB0aGF0IHByb2R1Y2Ugb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgZXZlbnRzLiBJdAotICBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgdG8gc2V0IHRoZSBpbnB1dCBzb3VyY2UgYXMgYW4KLSAgPHBsaW5rPm9yZy54bWwuc2F4LlhNTFJlYWRlcjwvcGxpbms+LCBvciB0byB1c2UgYQotICA8cGxpbms+b3JnLnhtbC5zYXguSW5wdXRTb3VyY2U8L3BsaW5rPiBhcyB0aGUgc291cmNlLiBJdCBhbHNvIGFsbG93cyB0aGUKLSAgY3JlYXRpb24gb2YgYSA8cGxpbms+b3JnLnhtbC5zYXguWE1MRmlsdGVyPC9wbGluaz4sIHdoaWNoIGVuYWJsZXMKLSAgdHJhbnNmb3JtYXRpb25zIHRvICJwdWxsIiBmcm9tIG90aGVyIHRyYW5zZm9ybWF0aW9ucywgYW5kIGxldHMgdGhlIHRyYW5zZm9ybWVyCi0gIHRvIGJlIHVzZWQgcG9seW1vcnBoaWNhbGx5IGFzIGFuIDxwbGluaz5vcmcueG1sLnNheC5YTUxSZWFkZXI8L3BsaW5rPi48L3BhcmE+IAotPHBhcmE+VGhlIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U8L3BsaW5rPiBjbGFzcyBhbGxvd3MgdGhlCi0gIHNldHRpbmcgb2YgYW4gPHBsaW5rPm9yZy54bWwuc2F4LlhNTFJlYWRlcjwvcGxpbms+IHRvIGJlIHVzZWQgZm9yICJwdWxsaW5nIgotICBwYXJzZSBldmVudHMsIGFuZCBhbiA8cGxpbms+b3JnLnhtbC5zYXguSW5wdXRTb3VyY2U8L3BsaW5rPiB0aGF0IG1heSBiZSB1c2VkIHRvCi0gIHNwZWNpZnkgdGhlIFNBWCBzb3VyY2UuPC9wYXJhPiAKLTxwYXJhPlRoZSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYUmVzdWx0PC9wbGluaz4gY2xhc3MgYWxsb3dzIHRoZQotICBzZXR0aW5nIG9mIGEgPHBsaW5rPm9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyPC9wbGluaz4gdG8gYmUgdGhlIHJlY2VpdmVyIG9mCi0gIFNBWDIgZXZlbnRzIGZyb20gdGhlIHRyYW5zZm9ybWF0aW9uLjwvcGFyYT4KLTxwYXJhPlRoZSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5PC9wbGluaz4gZXh0ZW5kcwotICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk8L3BsaW5rPiB0byBwcm92aWRlIGZhY3RvcnkKLSAgbWV0aG9kcyBmb3IgY3JlYXRpbmcgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRlbXBsYXRlc0hhbmRsZXI8L3BsaW5rPiwKLSAgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjwvcGxpbms+LCBhbmQKLSAgPHBsaW5rPm9yZy54bWwuc2F4LlhNTFJlYWRlcjwvcGxpbms+IGluc3RhbmNlcy48L3BhcmE+IAotPHBhcmE+VG8gb2J0YWluIGEgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFRyYW5zZm9ybWVyRmFjdG9yeTwvcGxpbms+LAotICB0aGUgY2FsbGVyIG11c3QgY2FzdCB0aGUgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5PC9wbGluaz4KLSAgaW5zdGFuY2UgcmV0dXJuZWQgZnJvbQotICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkjbmV3SW5zdGFuY2U8L3BsaW5rPi48L3BhcmE+Ci08cGFyYT5UaGUgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjwvcGxpbms+IGludGVyZmFjZQotICBhbGxvd3MgYSB0cmFuc2Zvcm1hdGlvbiB0byBiZSBjcmVhdGVkIGZyb20gU0FYMiBwYXJzZSBldmVudHMsIHdoaWNoIGlzIGEgInB1c2giCi0gIG1vZGVsIHJhdGhlciB0aGFuIHRoZSAicHVsbCIgbW9kZWwgdGhhdCBub3JtYWxseSBvY2N1cnMgZm9yIGEgdHJhbnNmb3JtYXRpb24uCi0gIE5vcm1hbCBwYXJzZSBldmVudHMgYXJlIHJlY2VpdmVkIHRocm91Z2ggdGhlCi0gIDxwbGluaz5vcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjwvcGxpbms+IGludGVyZmFjZSwgbGV4aWNhbCBldmVudHMgc3VjaCBhcwotICBzdGFydENEQVRBIGFuZCBlbmRDREFUQSBhcmUgcmVjZWl2ZWQgdGhyb3VnaCB0aGUKLSAgPHBsaW5rPm9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjwvcGxpbms+IGludGVyZmFjZSwgYW5kIGV2ZW50cyB0aGF0IHNpZ25hbAotICB0aGUgc3RhcnQgb3IgZW5kIG9mIGRpc2FibGluZyBvdXRwdXQgZXNjYXBpbmcgYXJlIHJlY2VpdmVkIHZpYQotICA8cGxpbms+b3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjcHJvY2Vzc2luZ0luc3RydWN0aW9uPC9wbGluaz4sIHdpdGggdGhlCi0gIHRhcmdldCBwYXJhbWV0ZXIgYmVpbmcKLSAgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0I1BJX0RJU0FCTEVfT1VUUFVUX0VTQ0FQSU5HPC9wbGluaz4gYW5kCi0gIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdCNQSV9FTkFCTEVfT1VUUFVUX0VTQ0FQSU5HPC9wbGluaz4uIElmCi0gIHBhcmFtZXRlcnMsIG91dHB1dCBwcm9wZXJ0aWVzLCBvciBvdGhlciBmZWF0dXJlcyBuZWVkIHRvIGJlIHNldCBvbiB0aGUKLSAgVHJhbnNmb3JtZXIgaGFuZGxlciwgYSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjwvcGxpbms+IHJlZmVyZW5jZQotICB3aWxsIG5lZWQgdG8gYmUgb2J0YWluZWQgZnJvbQotICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyI2dldFRyYW5zZm9ybWVyPC9wbGluaz4sIGFuZAotICB0aGUgbWV0aG9kcyBpbnZva2VkIGZyb20gdGhhdCByZWZlcmVuY2UuPC9wYXJhPgotPHBhcmE+VGhlIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLnNheC5UZW1wbGF0ZXNIYW5kbGVyPC9wbGluaz4gaW50ZXJmYWNlCi0gIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVGVtcGxhdGVzPC9wbGluaz4gb2JqZWN0cwotICBmcm9tIFNBWDIgcGFyc2UgZXZlbnRzLiBPbmNlIHRoZSA8cGxpbms+b3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI8L3BsaW5rPgotICBldmVudHMgYXJlIGNvbXBsZXRlLCB0aGUgVGVtcGxhdGVzIG9iamVjdCBtYXkgYmUgb2J0YWluZWQgZnJvbQotICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXguVGVtcGxhdGVzSGFuZGxlciNnZXRUZW1wbGF0ZXM8L3BsaW5rPi4gTm90ZSB0aGF0IAotICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXguVGVtcGxhdGVzSGFuZGxlciNzZXRTeXN0ZW1JZDwvcGxpbms+IHNob3VsZAotICBub3JtYWxseSBiZSBjYWxsZWQgaW4gb3JkZXIgdG8gZXN0YWJsaXNoIGEgYmFzZSBzeXN0ZW0gSUQgZnJvbSB3aGljaCByZWxhdGl2ZQotICBVUkxzIG1heSBiZSByZXNvbHZlZC48L3BhcmE+Ci08cGFyYT5UaGUKLSAgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFRyYW5zZm9ybWVyRmFjdG9yeSNuZXdYTUxGaWx0ZXI8L3BsaW5rPgotICBtZXRob2QgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhIDxwbGluaz5vcmcueG1sLnNheC5YTUxGaWx0ZXI8L3BsaW5rPiwgd2hpY2gKLSAgZW5jYXBzdWxhdGVzIHRoZSBTQVgyIG5vdGlvbiBvZiBhICJwdWxsIiB0cmFuc2Zvcm1hdGlvbi4gVGhlIGZvbGxvd2luZwotICBpbGx1c3RyYXRlcyBzZXZlcmFsIHRyYW5zZm9ybWF0aW9ucyBjaGFpbmVkIHRvZ2V0aGVyLiBFYWNoIGZpbHRlciBwb2ludHMgdG8gYQotICBwYXJlbnQgPHBsaW5rPm9yZy54bWwuc2F4LlhNTFJlYWRlcjwvcGxpbms+LCBhbmQgdGhlIGZpbmFsIHRyYW5zZm9ybWF0aW9uIGlzCi0gIGNhdXNlZCBieSBpbnZva2luZyA8cGxpbms+b3JnLnhtbC5zYXguWE1MUmVhZGVyI3BhcnNlPC9wbGluaz4gb24gdGhlIGZpbmFsCi0gIHJlYWRlciBpbiB0aGUgY2hhaW4uPC9wYXJhPgotPC9zZWN0Mz4gCi08c2VjdDM+IAotPHRpdGxlPmphdmF4LnhtbC50cmFuc2Zvcm0uZG9tPC90aXRsZT4gCi08cGFyYT5UaGlzIHBhY2thZ2UgaW1wbGVtZW50cyBET00tc3BlY2lmaWMgdHJhbnNmb3JtYXRpb24gQVBJcy48L3BhcmE+IAotPHBhcmE+VGhlIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U8L3BsaW5rPiBjbGFzcyBhbGxvd3MgdGhlCi1jbGllbnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgQVBJIHRvIHNwZWNpZnkgYSBET00KLTxwbGluaz5vcmcudzNjLmRvbS5Ob2RlPC9wbGluaz4gYXMgdGhlIHNvdXJjZSBvZiB0aGUgaW5wdXQgdHJlZS4gVGhlIG1vZGVsIG9mCi1ob3cgdGhlIFRyYW5zZm9ybWVyIGRlYWxzIHdpdGggdGhlIERPTSB0cmVlIGluIHRlcm1zIG9mIG1pc21hdGNoZXMgd2l0aCB0aGUKLTx1bGluayB1cmw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjZGF0YS1tb2RlbCI+WFNMVCBkYXRhIG1vZGVsPC91bGluaz4gb3IKLW90aGVyIGRhdGEgbW9kZWxzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudC4gQW55IG9mIHRoZSBub2RlcwotZGVyaXZlZCBmcm9tIDxwbGluaz5vcmcudzNjLmRvbS5Ob2RlPC9wbGluaz4gYXJlIGxlZ2FsIGlucHV0LjwvcGFyYT4KLTxwYXJhPlRoZSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0PC9wbGluaz4gY2xhc3MgYWxsb3dzIGEKLTxwbGluaz5vcmcudzNjLmRvbS5Ob2RlPC9wbGluaz4gdG8gYmUgc3BlY2lmaWVkIHRvIHdoaWNoIHJlc3VsdCBET00gbm9kZXMgd2lsbAotYmUgYXBwZW5kZWQuIElmIGFuIG91dHB1dCBub2RlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSB0cmFuc2Zvcm1lciB3aWxsIHVzZSAKLTxwbGluaz5qYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIjbmV3RG9jdW1lbnQ8L3BsaW5rPiB0byBjcmVhdGUgYW4KLW91dHB1dCA8cGxpbms+b3JnLnczYy5kb20uRG9jdW1lbnQ8L3BsaW5rPiBub2RlLiBJZiBhIG5vZGUgaXMgc3BlY2lmaWVkLCBpdAotc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiA8cGxpbms+b3JnLnczYy5kb20uRG9jdW1lbnQ8L3BsaW5rPiwgCi08cGxpbms+b3JnLnczYy5kb20uRWxlbWVudDwvcGxpbms+LCBvciAKLTxwbGluaz5vcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50PC9wbGluaz4uIFNwZWNpZmljYXRpb24gb2YgYW55IG90aGVyIG5vZGUKLXR5cGUgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGFuZCB1bmRlZmluZWQgYnkgdGhpcyBBUEkuIElmIHRoZSByZXN1bHQgaXMgYSAKLTxwbGluaz5vcmcudzNjLmRvbS5Eb2N1bWVudDwvcGxpbms+LCB0aGUgb3V0cHV0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtdXN0IGhhdmUKLWEgc2luZ2xlIGVsZW1lbnQgcm9vdCB0byBzZXQgYXMgdGhlIGRvY3VtZW50IGVsZW1lbnQuPC9wYXJhPgotPHBhcmE+VGhlIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Mb2NhdG9yPC9wbGluaz4gbm9kZSBtYXkgYmUgcGFzc2VkCi10byA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjwvcGxpbms+IG9iamVjdHMsIGFuZAotcmV0cmlldmVkIGJ5IHRyeWluZyB0byBjYXN0IHRoZSByZXN1bHQgb2YKLXRoZSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiNnZXRMb2NhdG9yKCk8L3BsaW5rPiBtZXRob2QuCi1UaGUgaW1wbGVtZW50YXRpb24gaGFzIG5vIHJlc3BvbnNpYmlsaXR5IHRvIHVzZSBhIERPTUxvY2F0b3IgaW5zdGVhZCBvZgotYSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2VMb2NhdG9yPC9wbGluaz4gKHRob3VnaCBsaW5lIG51bWJlcnMgYW5kIHRoZQotbGlrZSBkbyBub3QgbWFrZSBtdWNoIHNlbnNlIGZvciBhIERPTSksIHNvIHRoZSByZXN1bHQgb2YgZ2V0TG9jYXRvciBtdXN0IGFsd2F5cwotYmUgdGVzdGVkIHdpdGggYW4gaW5zdGFuY2VvZi4gPC9wYXJhPgotPC9zZWN0Mz4gCi08L3NlY3QyPgotPC9zZWN0MT4KLTwvc3BlYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hhbGFuLWNvbGxhdGUueHNsIGIveGRvY3Mvc291cmNlcy94YWxhbi1jb2xsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1NWQyYS4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hhbGFuLWNvbGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaCA9Ii8iPgotICA8ZG9jdW1lbnRhdGlvbj4KLSAgICA8Y2hhcHRlciBpZD0iaW5kZXgiPjx4c2w6Y29weS1vZiBzZWxlY3Q9ImRvY3VtZW50KCd4YWxhbi9pbmRleC54bWwnKSIvPjwvY2hhcHRlcj4gIAotICAgIDxjaGFwdGVyIGlkPSJ3aGF0c25ldyI+PHhzbDpjb3B5LW9mIHNlbGVjdD0iZG9jdW1lbnQoJ3hhbGFuL3doYXRzbmV3LnhtbCcpIi8+PC9jaGFwdGVyPgotICAgIDxjaGFwdGVyIGlkPSJvdmVydmlldyI+PHhzbDpjb3B5LW9mIHNlbGVjdD0iZG9jdW1lbnQoJ3hhbGFuL292ZXJ2aWV3LnhtbCcpIi8+PC9jaGFwdGVyPgotICAgIDxjaGFwdGVyIGlkPSJnZXRzdGFydGVkIj48eHNsOmNvcHktb2Ygc2VsZWN0PSJkb2N1bWVudCgneGFsYW4vZ2V0c3RhcnRlZC54bWwnKSIvPjwvY2hhcHRlcj4KLSAgICA8Y2hhcHRlciBpZD0iZmFxIj48eHNsOmNvcHktb2Ygc2VsZWN0PSJkb2N1bWVudCgneGFsYW4vZmFxLnhtbCcpIi8+PC9jaGFwdGVyPgotICAgIDxjaGFwdGVyIGlkPSJzYW1wbGVzIj48eHNsOmNvcHktb2Ygc2VsZWN0PSJkb2N1bWVudCgneGFsYW4vc2FtcGxlcy54bWwnKSIvPjwvY2hhcHRlcj4KLSAgICA8Y2hhcHRlciBpZD0iY29tbWFuZGxpbmUiPjx4c2w6Y29weS1vZiBzZWxlY3Q9ImRvY3VtZW50KCd4YWxhbi9jb21tYW5kbGluZS54bWwnKSIvPjwvY2hhcHRlcj4KLSAgICA8Y2hhcHRlciBpZD0idXNhZ2VwYXR0ZXJucyI+PHhzbDpjb3B5LW9mIHNlbGVjdD0iZG9jdW1lbnQoJ3hhbGFuL3VzYWdlcGF0dGVybnMueG1sJykiLz48L2NoYXB0ZXI+Ci0gICAgPGNoYXB0ZXIgaWQ9ImV4dGVuc2lvbnMiPjx4c2w6Y29weS1vZiBzZWxlY3Q9ImRvY3VtZW50KCd4YWxhbi9leHRlbnNpb25zLnhtbCcpIi8+PC9jaGFwdGVyPgotICAgIDxjaGFwdGVyIGlkPSJleHRlbnNpb25zbGliIj48eHNsOmNvcHktb2Ygc2VsZWN0PSJkb2N1bWVudCgneGFsYW4vZXh0ZW5zaW9uc2xpYi54bWwnKSIvPjwvY2hhcHRlcj4KLSAgICA8Y2hhcHRlciBpZD0icmVhZG1lIj48eHNsOmNvcHktb2Ygc2VsZWN0PSJkb2N1bWVudCgneGFsYW4vcmVhZG1lLnhtbCcpIi8+PC9jaGFwdGVyPgotICAgIDxjaGFwdGVyIGlkPSJhcGkiPgotICAgICAgPHMxIHRpdGxlPSJKYXZhIEFQSSI+Ci0gICAgICAgIDxwPkphdmFkb2MgZm9yIHRoZSBlbnRpcmUgWGFsYW4tSmF2YSBBUEk6PC9wPgotICAgICAgICA8dWw+Ci0gICAgICAgICAgPGxpPjxqdW1wIGhyZWY9ImFwaWRvY3MvaW5kZXguaHRtbCI+WGFsYW4tSmF2YSAyIEFQSTwvanVtcD48L2xpPgotICAgICAgICAgIDxsaT48anVtcCBocmVmPSJjb21wYXRfYXBpZG9jcy9pbmRleC5odG1sIj5YYWxhbi1KYXZhIDEgY29tcGF0aWJpbGl0eSBBUEk8L2p1bXA+PC9saT4KLSAgICAgICAgPC91bD4gICAgICAgICAKLSAgICAgIDwvczE+Ci0gICAgPC9jaGFwdGVyPgotICA8L2RvY3VtZW50YXRpb24+Ci08L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+Ci0KLQpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94YWxhbi1qbG9jYWwueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi1qbG9jYWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM4MjcyLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4tamxvY2FsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGJvb2sgU1lTVEVNICJzYms6L3N0eWxlL2R0ZC9ib29rLmR0ZCI+Ci0KLTwhLS0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci0KLTxib29rIHRpdGxlPSJYYWxhbiBYU0wgVHJhbnNmb3JtZXIgVXNlcidzIEd1aWRlIiBjb3B5cmlnaHQ9IjIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIj4KLSAgPHJlc291cmNlcyBzb3VyY2U9InNiazovc291cmNlcy94YWxhbi9yZXNvdXJjZXMueG1sIi8+Ci0gIDxkb2N1bWVudCBpZD0id2hhdHNuZXciIGxhYmVsPSJXaGF0J3MgTmV3IiBzb3VyY2U9InhhbGFuL3doYXRzbmV3LnhtbCIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGRvY3VtZW50IGlkPSJvdmVydmlldyIgbGFiZWw9Ik92ZXJ2aWV3IiBzb3VyY2U9InhhbGFuL292ZXJ2aWV3LnhtbCIvPgotICA8ZG9jdW1lbnQgaWQ9ImdldHN0YXJ0ZWQiIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiIHNvdXJjZT0ieGFsYW4vZ2V0c3RhcnRlZC54bWwiLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxmYXFzIGlkPSJmYXEiIGxhYmVsPSJGQVFzIiBzb3VyY2U9InhhbGFuL2ZhcS54bWwiLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxkb2N1bWVudCBpZD0ic2FtcGxlcyIgbGFiZWw9IlNhbXBsZSBBcHBzIiBzb3VyY2U9InhhbGFuL3NhbXBsZXMueG1sIi8+Ci0gIDxkb2N1bWVudCBpZD0iY29tbWFuZGxpbmUiIGxhYmVsPSJDb21tYW5kIExpbmUiIHNvdXJjZT0ieGFsYW4vY29tbWFuZGxpbmUueG1sIi8+Ci0gIDxzZXBhcmF0b3IvPgotICA8ZG9jdW1lbnQgaWQ9InVzYWdlcGF0dGVybnMiIGxhYmVsPSJVc2FnZSBQYXR0ZXJucyIgc291cmNlPSJ4YWxhbi91c2FnZXBhdHRlcm5zLnhtbCIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGV4dGVybmFsIGhyZWY9ImFwaWRvY3MvaW5kZXguaHRtbCIgbGFiZWw9IkFQSSAoSmF2YWRvYykiLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxkb2N1bWVudCBpZD0iZXh0ZW5zaW9ucyIgbGFiZWw9IkV4dGVuc2lvbnMiIHNvdXJjZT0ieGFsYW4vZXh0ZW5zaW9ucy54bWwiLz4KLSAgPGRvY3VtZW50IGlkPSJleHRlbnNpb25zbGliIiBsYWJlbD0iRXh0ZW5zaW9ucyBMaWJyYXJ5IiBzb3VyY2U9InhhbGFuL2V4dGVuc2lvbnNsaWIueG1sIi8+Ci0gIDxzZXBhcmF0b3IvPgotICA8ZG9jdW1lbnQgaWQ9InJlYWRtZSIgbGFiZWw9IlJlbGVhc2UgTm90ZXMiIHNvdXJjZT0ieGFsYW4vcmVhZG1lLnhtbCIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGV4dGVybmFsIGhyZWY9ImRlc2lnbi9kZXNpZ24yXzBfMC5odG1sIiBsYWJlbD0iWGFsYW4gMiBEZXNpZ24iLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxleHRlcm5hbCBocmVmPSJyZWFkbWUuaHRtbCNidWdzIiBsYWJlbD0iQnVncyIvPgotICA8ZXh0ZXJuYWwgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuLWovdGVzdC9vdmVydmlldy5odG1sIiBsYWJlbD0iVGVzdGluZyIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGV4dGVybmFsIGhyZWY9InRvZG8uaHRtbCNkZXZlbG9wZXItbGlzdCIgbGFiZWw9IkNyZWRpdHMiLz4gIAotPC9ib29rPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94YWxhbi1qc2l0ZS54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuLWpzaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzZWJhMS4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hhbGFuLWpzaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGJvb2sgU1lTVEVNICJzYms6L3N0eWxlL2R0ZC9ib29rLmR0ZCI+Ci0KLTwhLS0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci0KLTxib29rIHRpdGxlPSJYYWxhbiBYU0wgVHJhbnNmb3JtZXIgVXNlcidzIEd1aWRlIiBjb3B5cmlnaHQ9IjIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIj4KLSAgPHJlc291cmNlcyBzb3VyY2U9InNiazovc291cmNlcy94YWxhbi9yZXNvdXJjZXMueG1sIi8+Ci0gIDxleHRlcm5hbCBocmVmPSIuLi9pbmRleC5odG1sIiBsYWJlbD0iSG9tZSIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGRvY3VtZW50IGlkPSJpbmRleCIgbGFiZWw9IlhhbGFuLUogMi4wLjEiIHNvdXJjZT0ieGFsYW4vaW5kZXgueG1sIi8+Ci0gIDxkb2N1bWVudCBpZD0id2hhdHNuZXciIGxhYmVsPSJXaGF0J3MgTmV3IiBzb3VyY2U9InhhbGFuL3doYXRzbmV3LnhtbCIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGRvY3VtZW50IGlkPSJvdmVydmlldyIgbGFiZWw9Ik92ZXJ2aWV3IiBzb3VyY2U9InhhbGFuL292ZXJ2aWV3LnhtbCIvPgotICA8ZG9jdW1lbnQgaWQ9ImdldHN0YXJ0ZWQiIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiIHNvdXJjZT0ieGFsYW4vZ2V0c3RhcnRlZC54bWwiLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxmYXFzIGlkPSJmYXEiIGxhYmVsPSJGQVFzIiBzb3VyY2U9InhhbGFuL2ZhcS54bWwiLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxkb2N1bWVudCBpZD0ic2FtcGxlcyIgbGFiZWw9IlNhbXBsZSBBcHBzIiBzb3VyY2U9InhhbGFuL3NhbXBsZXMueG1sIi8+Ci0gIDxkb2N1bWVudCBpZD0iY29tbWFuZGxpbmUiIGxhYmVsPSJDb21tYW5kIExpbmUiIHNvdXJjZT0ieGFsYW4vY29tbWFuZGxpbmUueG1sIi8+Ci0gIDxzZXBhcmF0b3IvPgotICA8ZG9jdW1lbnQgaWQ9InVzYWdlcGF0dGVybnMiIGxhYmVsPSJVc2FnZSBQYXR0ZXJucyIgc291cmNlPSJ4YWxhbi91c2FnZXBhdHRlcm5zLnhtbCIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGV4dGVybmFsIGhyZWY9ImFwaWRvY3MvaW5kZXguaHRtbCIgbGFiZWw9IkFQSSAoSmF2YWRvYykiLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxkb2N1bWVudCBpZD0iZXh0ZW5zaW9ucyIgbGFiZWw9IkV4dGVuc2lvbnMiIHNvdXJjZT0ieGFsYW4vZXh0ZW5zaW9ucy54bWwiLz4KLSAgPGRvY3VtZW50IGlkPSJleHRlbnNpb25zbGliIiBsYWJlbD0iRXh0ZW5zaW9ucyBMaWJyYXJ5IiBzb3VyY2U9InhhbGFuL2V4dGVuc2lvbnNsaWIueG1sIi8+Ci0gIDxzZXBhcmF0b3IvPgotICA8ZG9jdW1lbnQgaWQ9InJlYWRtZSIgbGFiZWw9IlJlbGVhc2UgTm90ZXMiIHNvdXJjZT0ieGFsYW4vcmVhZG1lLnhtbCIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGV4dGVybmFsIGhyZWY9ImRlc2lnbi9kZXNpZ24yXzBfMC5odG1sIiBsYWJlbD0iWGFsYW4gMiBEZXNpZ24iLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxleHRlcm5hbCBocmVmPSJyZWFkbWUuaHRtbCNidWdzIiBsYWJlbD0iQnVncyIvPiAgCi0gIDxleHRlcm5hbCBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai90ZXN0L292ZXJ2aWV3Lmh0bWwiIGxhYmVsPSJUZXN0aW5nIi8+Ci0gIDxzZXBhcmF0b3IvPgotICA8ZXh0ZXJuYWwgaHJlZj0idG9kby5odG1sI2RldmVsb3Blci1saXN0IiBsYWJlbD0iQ3JlZGl0cyIvPiAgCi08L2Jvb2s+CmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hhbGFuL1NUQVRVUyBiL3hkb2NzL3NvdXJjZXMveGFsYW4vU1RBVFVTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTBhM2ZjLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vU1RBVFVTCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0gIDxzMyB0aXRsZT0iVmVyc2lvbiBvZiBYZXJjZXMgdG8gdXNlIj4gCi08cD5UaGUgJnhzbHQ0ai1jdXJyZW50OyBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCAmeG1sNGotdXNlZDsuICZkb3dubG9hZDsgRm9yIGluZm9ybWF0aW9uIGFib3V0IGluY2x1ZGluZyB4ZXJjZXMuamFyIG9uIHRoZSBzeXN0ZW0gY2xhc3MgcGF0aCwgc2VlIDxsaW5rIGlkcmVmPSJnZXRzdGFydGVkIiBhbmNob3I9ImNsYXNzcGF0aCI+U2V0dGluZyB1cCB0aGUgc3lzdGVtIGNsYXNzIHBhdGg8L2xpbms+LjwvcD4KLTxwPjxlbT5JbXBvcnRhbnQ8L2VtPiBZb3UgbWF5IGV4cGVyaWVuY2UgdW5wcmVkaWN0YWJsZSBhbm9tYWxpZXMgaWYgeW91ciBYYWxhbiBhbmQgWGVyY2VzIGJ1aWxkcyBhcmUgbm90IGluIHN5bmNoLiBJZiB5b3UgZG93bmxvYWQgYW4gdXBkYXRlIHRvIFhhbGFuLCBjaGVjayB0aGUgcmVsZWFzZSBub3RlcyB0byBkZXRlcm1pbmUgd2hpY2ggdmVyc2lvbiBvZiBYZXJjZXMgeW91IHNob3VsZCB1c2UuPC9wPgotPG5vdGU+WW91IGNhbiB1c2UgWGFsYW4gd2l0aCBvdGhlciBYTUwgcGFyc2VycyB0aGF0IGltcGxlbWVudCB0aGUgPHJlc291cmNlLXJlZiBpZHJlZj0iamF4cCIvPi4gU2VlIAotPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0icGx1ZyI+UGx1Z2dpbmcgaW4gdGhlIFRyYW5zZm9ybWVyIGFuZCBYTUwgcGFyc2VyPC9saW5rPi48L25vdGU+Ci08L3MzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vY29tbWFuZGxpbmUueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi9jb21tYW5kbGluZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTYxOWEuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94YWxhbi9jb21tYW5kbGluZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PgotPCFET0NUWVBFIHMxIFNZU1RFTSAiLi4vLi4vc3R5bGUvZHRkL2RvY3VtZW50LmR0ZCI+Ci0KLTwhLS0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci0gCi0KLTxzMSB0aXRsZT0iQ29tbWFuZC1MaW5lIFV0aWxpdHkiPgotICAgCi0gICA8czIgdGl0bGU9IlVzaW5nIHRoZSBDb21tYW5kLUxpbmUgVXRpbGl0eSI+Ci0gICAgICA8cD5UbyBwZXJmb3JtIGEgdHJhbnNmb3JtYXRpb24sIHlvdSBjYW4gY2FsbCAmeHNsdDRqOyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKG9yIHNjcmlwdCksIAotICAgICAgYW4gYXBwbGV0LCBhbiBhcHBsaWNhdGlvbiwgb3IgYSBzZXJ2bGV0IChzZWUgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiPlVzYWdlIFBhdHRlcm5zPC9saW5rPikuPC9wPgotICAgICA8cD5UaGUgb3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MgbWFpbigpIG1ldGhvZCBwcm92aWRlcyBhIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UKLSAgICBmb3IgcGVyZm9ybWluZyBYU0wgdHJhbnNmb3JtYXRpb24uIFRvIHBlcmZvcm0gYSB0cmFuc2Zvcm1hdGlvbiBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3IgYSBzY3JpcHQsCi0gICAgZG8gdGhlIGZvbGxvd2luZzo8L3A+Ci0gCQk8b2w+Ci0gICAgPGxpPkRvd25sb2FkICZ4c2x0NGo7Ljxici8+PGJyLz48L2xpPiAKLSAgICA8bGk+PGxpbmsgaWRyZWY9ImdldHN0YXJ0ZWQiIGFuY2hvcj0iY2xhc3NwYXRoIj5TZXQgdGhlIEphdmEgY2xhc3NwYXRoPC9saW5rPiB0byBpbmNsdWRlIHhhbGFuLmphciBhbmQKLSAgICB4ZXJjZXMuamFyIChvciBhbm90aGVyIGNvbmZvcm1hbnQgWE1MIFBhcnNlciAtLSBzZWUgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0icGx1ZyI+UGx1Z2dpbmcgaW4gCi0gICAgdGhlIFRyYW5zZm9ybWVyIGFuZCBYTUwgcGFyc2VyPC9saW5rPikuPGJyLz48YnIvPjwvbGk+Ci0gICAgPGxpPkNhbGwgamF2YSBhbmQgdGhlIFByb2Nlc3MgY2xhc3Mgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgYW5kCi0gICAgYXJndW1lbnRzIChkZXNjcmliZWQgYmVsb3cpLiBUaGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZSwgZm9yIGV4YW1wbGUsIGluY2x1ZGVzIHRoZSAtSU4sIC1YU0wsCi0gICAgYW5kIC1PVVQgZmxhZ3Mgd2l0aCB0aGVpciBhY2NvbXBhbnlpbmcgYXJndW1lbnRzIC0tIHRoZSBYTUwgc291cmNlIGRvY3VtZW50LCB0aGUgWFNMCi0gICAgc3R5bGVzaGVldCwgYW5kIHRoZSBvdXRwdXQgZmlsZTo8YnIvPjxici8+Ci0gICAgPGNvZGU+amF2YSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuUHJvY2VzcyAtSU4gZm9vLnhtbCAtWFNMIGZvby54c2wgLU9VVCBmb28ub3V0PC9jb2RlPgotICAgIDwvbGk+PC9vbD4KLSAgICA8cD5UaGUgY29tbWFuZCBsaW5lIHV0aWxpdHkgY2FuIHRha2UgdGhlIGZvbGxvd2luZyBmbGFncyBhbmQgYXJndW1lbnRzICh0aGUgZmxhZ3MgYXJlIGNhc2UgaW5zZW5zaXRpdmUpOjwvcD4gCi0gICAgICA8c291cmNlPi1JTiBpbnB1dFhNTFVSTAotLVhTTCBYU0xUcmFuc2Zvcm1hdGlvblVSTAotLU9VVCBvdXRwdXRGaWxlTmFtZQotLVYgKFZlcnNpb24gaW5mbykKLS1RQyAoUXVpZXQgUGF0dGVybiBDb25mbGljdHMgV2FybmluZ3MpCi0tUSAgKFF1aWV0IE1vZGUpCi0tTEYgKFVzZSBsaW5lZmVlZHMgb25seSBvbiBvdXRwdXQgLS0gZGVmYXVsdCBpcyBDUi9MRikKLS1DUiAoVXNlIGNhcnJpYWdlIHJldHVybnMgb25seSBvbiBvdXRwdXQgLS0gZGVmYXVsdCBpcyBDUi9MRikKLS1JTkRFTlQgKE51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IGVhY2ggbGV2ZWwgaW4gb3V0cHV0IHRyZWUgLS1kZWZhdWx0IGlzIDApCi0tVFQgKFRyYWNlIHRoZSB0ZW1wbGF0ZXMgYXMgdGhleSBhcmUgYmVpbmcgY2FsbGVkKQotLVRHIChUcmFjZSBlYWNoIHJlc3VsdCB0cmVlIGdlbmVyYXRpb24gZXZlbnQpCi0tVFMgKFRyYWNlIGVhY2ggc2VsZWN0aW9uIGV2ZW50KQotLVRUQyAoVHJhY2UgdGhlIHRlbXBsYXRlIGNoaWxkcmVuIGFzIHRoZXkgYXJlIGJlaW5nIHByb2Nlc3NlZCkKLS1FRFVNUCBbb3B0aW9uYWxdRmlsZU5hbWUgKERvIHN0YWNrZHVtcCBvbiBlcnJvcikKLS1YTUwgKFVzZSBYTUwgZm9ybWF0dGVyIGFuZCBhZGQgWE1MIGhlYWRlcikKLS1URVhUIChVc2Ugc2ltcGxlIFRleHQgZm9ybWF0dGVyKQotLUhUTUwgKFVzZSBIVE1MIGZvcm1hdHRlcikKLS1QQVJBTSBuYW1lIHZhbHVlIChTZXQgYSBzdHlsZXNoZWV0IHBhcmFtZXRlcikKLS1ESUFHIHB1dCBvdXQgdGltaW5nIGRpYWdub3N0aWNzCi0tVVJJUkVTT0xWRVIgZnVsbENsYXNzTmFtZSAoVXNlIGEgY3VzdG9tIFVSSVJlc29sdmVyKQotLUVOVElUWVJFU09MVkVSIGZ1bGxDbGFzc05hbWUgKFVzZSBhIGN1c3RvbSBFbnRpdHlSZXNvbHZlcikKLS1DT05URU5USEFORExFUiBmdWxsQ2xhc3NOYW1lIChVc2UgYSBjdXN0b20gQ29udGVudEhhbmRsZXIpCi08L3NvdXJjZT4KLSAgICAgIDxwPlVzZSA8Y29kZT4tSU48L2NvZGU+IHRvIHNwZWNpZnkgdGhlIFhNTCBzb3VyY2UgZG9jdW1lbnQuPC9wPiAKLSAgICAgIDxwPlVzZSA8Y29kZT4tWFNMPC9jb2RlPiB0byBzcGVjaWZ5IHRoZSBYU0wgc3R5bGVzaGVldCBmaWxlLjwvcD4KLSAgICAgIDxwPlVzZSA8Y29kZT4tVEVYVDwvY29kZT4gaWYgeW91IHdhbnQgdGhlIG91dHB1dCB0byBpbmNsdWRlIG9ubHkgZWxlbWVudCB2YWx1ZXMgKG5vdCBlbGVtZW50IHRhZ3Mgd2l0aCBlbGVtZW50IG5hbWVzIGFuZAotICAgICAgYXR0cmlidXRlcykuPC9wPgotICAgICAgPHA+VXNlIDxjb2RlPi1IVE1MPC9jb2RlPiB0byB3cml0ZSA0LjAgdHJhbnNpdGlvbmFsIEhUTUwgKHNvbWUgZWxlbWVudHMsIHN1Y2ggYXMgJmx0O2JyJmd0OywgYXJlCi0gICAgICBub3Qgd2VsbCBmb3JtZWQgWE1MKS48L3A+Ci0gICAgICA8cD5UbyBzZXQgc3R5bGVzaGVldCBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgdXNlIDxici8+Ci0gICAgICA8Y29kZT5qYXZhIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIC1QQVJBTSA8cmVmPm5hbWUgdmFsdWU8L3JlZj48L2NvZGU+PC9wPgotICAgICAgPHA+VXNlIDxjb2RlPi1VUklSRVNPTFZFUjwvY29kZT4gd2l0aCBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHRvIHV0aWxpemUgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gICAgICA8anVtcCBocmVmPSJhcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vVVJJUmVzb2x2ZXIuaHRtbCI+VVJJUmVzb2x2ZXI8L2p1bXA+IFRyQVggaW50ZXJmYWNlIHRvIHJlc29sdmUgVVJJcyBmb3IKLSAgICAgICB4c2w6aW5jbHVkZSwgeHNsOmltcG9ydCwgYW5kIHRoZSBkb2N1bWVudCgpIGZ1bmN0aW9uLjwvcD4KLSAgICAgICA8cD5Vc2UgPGNvZGU+LUVOVElUWVJFU09MVkVSPC9jb2RlPiB3aXRoIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgdG8gdXRpbGl6ZSBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAgICAgICA8anVtcCBocmVmPSJhcGlkb2NzL29yZy94bWwvc2F4L0VudGl0eVJlc29sdmVyLmh0bWwiPkVudGl0eVJlc29sdmVyPC9qdW1wPiBTQVggaW50ZXJmYWNlIHRvIGhhbmRsZSBleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlcy48L3A+Ci0gICAgICAgPHA+VXNlIDxjb2RlPi1DT05URU5USEFORExFUjwvY29kZT4gd2l0aCBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHRvIHV0aWxpemUgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgdGhlIAotICAgICAgIDxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL3htbC9zYXgvQ29udGVudEhhbmRsZXIuaHRtbCI+Q29udGVudEhhbmRsZXI8L2p1bXA+IFNBWCBpbnRlcmZhY2UgdG8gc2VyaWFsaXplIG91dHB1dC48L3A+Ci0gICA8L3MyPgotPC9zMT4KZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vZXh0ZW5zaW9ucy54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuL2V4dGVuc2lvbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTg2MTRiLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vZXh0ZW5zaW9ucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PgotPCFET0NUWVBFIHMxIFNZU1RFTSAiLi4vLi4vc3R5bGUvZHRkL2RvY3VtZW50LmR0ZCI+Ci0KLTwhLS0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci0KLTxzMSB0aXRsZT0iJnhzbHQ0ajsgRXh0ZW5zaW9ucyI+Ci08dWw+Ci08bGk+PGxpbmsgYW5jaG9yPSJpbnRybyI+SW50cm9kdWN0aW9uPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJzdXBwb3J0ZWQtbGFuZyI+U3VwcG9ydGVkIGxhbmd1YWdlczwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iYmFzaWMtcGF0dGVybiI+VGhlIGJhc2ljIHBhdHRlcm48L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InNldHVwLXJ1bnRpbWUiPlNldHRpbmcgdXAgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQ8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImJhc2ljLXN5bnRheCI+U3ludGF4PC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJleHQtZWxlbWVudHMiPlVzaW5nIGFuIGV4dGVuc2lvbiBlbGVtZW50PC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJleHQtZnVuY3Rpb25zIj5Vc2luZyBleHRlbnNpb24gZnVuY3Rpb25zPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJqYXZhLW5hbWVzcGFjZSI+QWx0ZXJuYXRpdmU6IHVzaW5nIHRoZSBhYmJyZXZpYXRlZCBzeW50YXggZm9yIGV4dGVuc2lvbnMgaW1wbGVtZW50ZWQgaW4gSmF2YTwvbGluaz48L2xpPgotPGxpPkV4YW1wbGVzOiA8bGluayBhbmNob3I9ImV4LWJhc2ljIj5iYXNpYyBKYXZhU2NyaXB0IGV4YW1wbGU8L2xpbms+LCA8bGluayBhbmNob3I9ImV4LWphdmEtbmFtZXNwYWNlIj51c2luZyB0aGUgamF2YSBuYW1lc3BhY2U8L2xpbms+LCA8bGluayBhbmNob3I9ImV4LWphdmEiPnVzaW5nIGEgSmF2YSBIYXNodGFibGU8L2xpbms+LCA8bGluayBhbmNob3I9ImV4LWphdmFzY3JpcHQiPnVzaW5nIGEgSmF2YVNjcmlwdCBhcnJheTwvbGluaz48L2xpPgotPC91bD48YW5jaG9yIG5hbWU9ImludHJvIi8+Ci0gIDxzMiB0aXRsZT0iSW50cm9kdWN0aW9uIj4KLSAgPHA+Rm9yIHRob3NlIHNpdHVhdGlvbnMgd2hlcmUgeW91IHdvdWxkIGxpa2UgdG8gYXVnbWVudCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBYU0xUIHdpdGggY2FsbHMgdG8gYSBwcm9jZWR1cmFsIGxhbmd1YWdlLCAmeHNsdDRqOyBzdXBwb3J0cyB0aGUgY3JlYXRpb24gYW5kIHVzZSBvZiBleHRlbnNpb24gZWxlbWVudHMgYW5kIGV4dGVuc2lvbiBmdW5jdGlvbnMuICZ4c2x0NGo7IGFsc28gcHJvdmlkZXMgYSBncm93aW5nIDxsaW5rIGlkcmVmPSJleHRlbnNpb25zbGliIj5leHRlbnNpb25zIGxpYnJhcnk8L2xpbms+IGF2YWlsYWJsZSBmb3IgeW91ciB1c2UuIEFuIGV4dGVuc2lvbiAoYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIGFuZCBmdW5jdGlvbnMpIGluaGFiaXRzIGEgbmFtZXNwYWNlLCBlaXRoZXIgYSBuYW1lc3BhY2UgeW91IGRlY2xhcmUgYW5kIGRlc2lnbmF0ZSBhcyBhbiBleHRlbnNpb25zIG5hbWVzcGFjZSwgb3Igb25lIG9mIHRoZSBwcmVkZWZpbmVkIG5hbWVzcGFjZXMgdGhhdCAmeHNsdDRqOyBwcm92aWRlcy4gRm9yIGluZm9ybWF0aW9uIGFib3V0IFhNTCBuYW1lc3BhY2VzLCBzZWUgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy8iPk5hbWVzcGFjZXMgaW4gWE1MPC9qdW1wPi48L3A+Ci0KLTxwPjxlbT5FeHRlbnNpb24gZWxlbWVudHM8L2VtPiAgVW5saWtlIGEgbGl0ZXJhbCByZXN1bHQgZWxlbWVudCwgd2hpY2ggdGhlIHN0eWxlc2hlZXQgc2ltcGx5IHRyYW5zZmVycyB0byB0aGUgcmVzdWx0IHRyZWUsIGFuIGV4dGVuc2lvbiBlbGVtZW50IHBlcmZvcm1zIGFuIGFjdGlvbi4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHRoZSBSZWRpcmVjdCBleHRlbnNpb24gZWxlbWVudHMgc2hpcHBlZCB3aXRoICZ4c2x0NGo7IHRvIHJlZGlyZWN0IHBvcnRpb25zIG9mIHlvdXIgdHJhbnNmb3JtYXRpb24gb3V0cHV0IHRvIG9uZSBvciBtb3JlIGZpbGVzLiBFeHRlbnNpb24gZWxlbWVudHMgbWF5IGNvbnRhaW4gYXR0cmlidXRlcywgdGV4dCBub2Rlcywgb3RoZXIgZWxlbWVudHMsIGJhc2ljYWxseSBhbnkgdmFsaWQgWE1MLiBFeHRlbnNpb24gZWxlbWVudHMgbWF5IHBlcmZvcm0gcXVpdGUgc29waGlzdGljYXRlZCBhY3Rpb25zLCBnaXZlbiB0aGF0IHRoZSBleHRlbnNpb24gcm91dGluZSAodGhlIGltcGxlbWVudGF0aW9uKSBoYXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgWFNMVCBwcm9jZXNzb3IgY29udGV4dCBvYmplY3QgYW5kIHRvIHRoZSBlbGVtZW50LiBJbiBtYW55IGNhc2VzIHRoZSBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHZvaWQgb3IgbnVsbDsgaWYgaXQgZG9lcyByZXR1cm4gYSB2YWx1ZSwgdGhhdCB2YWx1ZSBpcyBwbGFjZWQgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIHJlc3VsdCB0cmVlLjwvcD4KLQotPHA+PGVtPkV4dGVuc2lvbiBmdW5jdGlvbnM8L2VtPiAgWW91IGNhbiB0aGluayBvZiBleHRlbnNpb24gZnVuY3Rpb25zIGFzIGV4dGVuZGluZyB0aGUgY29yZSBsaWJyYXJ5IG9mIGZ1bmN0aW9ucyB0aGF0IFhQYXRoIHByb3ZpZGVzLiBBbiBleHRlbnNpb24gZnVuY3Rpb24gcGFzc2VzIGFyZ3VtZW50cyB0byB0aGUgZXh0ZW5zaW9uIGltcGxlbWVudGF0aW9uIGFuZCByZXR1cm5zIGEgdmFsdWUuIFlvdSBjYW4gdXNlIGV4dGVuc2lvbiBmdW5jdGlvbnMgdG8gcmV0dXJuIHZhbHVlcyB0aGF0IFhTTFQgY2FuIGludGVyYWN0IHdpdGggZGlyZWN0bHkgKG5vZGUtc2V0LCByZXN1bHQgdHJlZSBmcmFnbWVudCwgc3RyaW5nLCBib29sZWFuLCBhbmQgbnVtYmVyKSBhcyB3ZWxsIGFzIHZhbHVlcyAob2YgYW55IHR5cGUpIHRoYXQgeW91IHBhc3MgaW4gdHVybiB0byBvdGhlciBleHRlbnNpb24gZnVuY3Rpb25zLiBFeHRlbnNpb24gZnVuY3Rpb25zIHdyaXR0ZW4gaW4gSmF2YSBjYW4gYWxzbyBhY2Nlc3MgY2VydGFpbiBpdGVtcyBpbiB0aGUgWFNMVCBleGVjdXRpb24gZW52aXJvbm1lbnQgdGhyb3VnaCBhbiA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vZXh0ZW5zaW9ucy9FeHByZXNzaW9uQ29udGV4dC5odG1sIj5FeHByZXNzaW9uQ29udGV4dDwvanVtcD4gaW50ZXJmYWNlLjwvcD4KLQotPHA+WFNMVCBleHRlbnNpb25zIGFyZSBzcGVjaWZpZWQgaW4gdGhlIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjZXh0ZW5zaW9uIj5YU0xUIFJlY29tbWVuZGF0aW9uPC9qdW1wPi4gIFRoaXMgZG9jdW1lbnQgZm9jdXNlcyBvbiB0aGUgJnhzbHQ0ajsgaW1wbGVtZW50YXRpb24gb2YgdGhvc2UgcmVxdWlyZW1lbnRzLCBub3Qgb24gWFNMVCBleHRlbnNpb25zIGluIGdlbmVyYWwuIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4dGVuc2lvbnMsIGNvbnN1bHQgdGhlIFJlY29tbWVuZGF0aW9uIG9yIHRoZSBvdGhlciByZXNvdXJjZXMgbGlzdGVkIGluIDxsaW5rIGlkcmVmPSJvdmVydmlldyIgYW5jaG9yPSJ1cHRvc3BlZWQiPkdldHRpbmcgdXAgdG8gc3BlZWQgd2l0aCBYU0xUPC9saW5rPi48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0ic3VwcG9ydGVkLWxhbmciLz4KLTxzMiB0aXRsZT0iU3VwcG9ydGVkIGxhbmd1YWdlcyI+Ci08cD5FeHRlbnNpb25zIHdyaXR0ZW4gaW4gSmF2YSBhcmUgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5ICZ4c2x0NGo7LiAgRm9yIGV4dGVuc2lvbnMgd3JpdHRlbiBpbiBsYW5ndWFnZXMgb3RoZXIgdGhhbiBKYXZhLCAmeHNsdDRqOyB1c2VzIHRoZSA8cmVzb3VyY2UtcmVmIGlkcmVmPSJic2YiLz4sIGFuIGFyY2hpdGVjdHVyZSBmb3IgaW5jb3Jwb3JhdGluZyBzY3JpcHRpbmcgaW50byBKYXZhIGFwcGxpY2F0aW9ucyBhbmQgYXBwbGV0cy4gQlNGIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB0YWtlIGFkdmFudGFnZSBvZiBzY3JpcHRpbmcgd2hpbGUgYmVpbmcgaW5kZXBlbmRlbnQgb2YgYW55IHNwZWNpZmljIHNjcmlwdGluZyBsYW5ndWFnZS4gVG8gZGF0ZSwgd2UgaGF2ZSB0ZXN0ZWQgZXh0ZW5zaW9ucyBpbXBsZW1lbnRlZCBpbiBKYXZhU2NyaXB0LiBPdGhlciBsYW5ndWFnZXMgd2l0aCBCU0Ygc3VwcG9ydCBhcHBlYXIgaW4gdGhlIHRhYmxlIGJlbG93LjwvcD4KLTxwPkJTRiByZXF1aXJlcyBic2YuamFyIG9uIHRoZSBjbGFzc3BhdGguIFRoaXMgSkFSIGZpbGUgaXMgc2hpcHBlZCB3aXRoICZ4c2x0NGo7IGFuZCBpcyByZXF1aXJlZCBvbmx5IGlmIHlvdSBoYXZlIGV4dGVuc2lvbnMgd3JpdHRlbiBpbiBsYW5ndWFnZXMgb3RoZXIgdGhhbiBKYXZhLiBUaGUgYWRkaXRpb25hbCBKQVIgZmlsZXMgb3IgRExMcyByZXF1aXJlZCB0byBzdXBwb3J0IGV4dGVuc2lvbnMgd3JpdHRlbiBpbiBvdGhlciBsYW5ndWFnZXMgYXJlIGxpc3RlZCBpbiB0aGUgdGFibGUgYmVsb3cuIFRoZXNlIGZpbGVzIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgc291cmNlcyBpbmRpY2F0ZWQgYW5kIGFyZSBub3Qgc2hpcHBlZCB3aXRoICZ4c2x0NGo7LjwvcD4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZD48ZW0+TGFuZ3VhZ2U8L2VtPjwvdGQ+Ci0gICAgPHRkPjxlbT5WZXJzaW9uPC9lbT48L3RkPgotICAgIDx0ZD48ZW0+UmVxdWlyZW1lbnRzPC9lbT48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPk1vemlsbGEgUmhpbm8gKEphdmFTY3JpcHQpPGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPjEuNTxici8+PGJyLz48L3RkPgotICAgIDx0ZD5qcy5qYXIgYXZhaWxhYmxlIGZyb20gCi0JCQkJICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvcmhpbm88YnIvPjxici8+PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD5OZXRSZXh4PGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPjEuMTQ4IHVwIDxici8+PGJyLz48L3RkPgotICAgIDx0ZD5OZXRSZXh4Qy56aXAgYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL25ldHJleHg8YnIvPjxici8+PC90ZD4KLSAgPC90cj4KLSAgICA8dHI+Ci0gICAgPHRkPkJNTDxici8+PGJyLz48L3RkPgotICAgIDx0ZD4yLjQ8YnIvPjxici8+PC90ZD4KLSAgICA8dGQ+Ym1sYWxsLmphciBhdmFpbGFibGUgZnJvbSBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3MvcHJvamVjdHMvYnNmPGJyLz48YnIvPjwvdGQ+Ci0gIDwvdHI+Ci0gICAgPHRyPgotICAgIDx0ZD5KUHl0aG9uPGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPjEuMS1iZXRhMzxici8+PGJyLz48L3RkPgotICAgIDx0ZD5weXRob24uamFyIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuanB5dGhvbi5vcmcvPGJyLz48YnIvPjwvdGQ+Ci0gIDwvdHI+Ci0gICAgPHRyPgotICAgIDx0ZD5KYWNsPGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPjEuMS4xPGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPiBqYWNsLmphciBhbmQgdGNsamF2YS5qYXIgZnJvbSBodHRwOi8vd3d3LnNjcmlwdGljcy5jb20vamF2YTxici8+PGJyLz48L3RkPgotICA8L3RyPgotICAgIDx0cj4KLSAgICA8dGQ+V2luMzIgQWN0aXZlU2NyaXB0IGxhbmdzCi0JSlNjcmlwdCwgVkJTY3JpcHQ8YnIvPjxici8+PC90ZD4KLSAgICA8dGQ+PGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPk1TVkNQNjAuRExMIGZyb20gTWljcm9zb2Z0LCBhcHByb3ByaWF0ZSBsYW5ndWFnZSBETExzIGZyb20gTWljcm9zb2Z0IAotICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vc2NyaXB0aW5nPGJyLz48YnIvPjwvdGQ+Ci0gIDwvdHI+Ci0gICAgPHRyPgotICAgIDx0ZD5QZXJsU2NyaXB0PGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPjxici8+PGJyLz48L3RkPgotICAgIDx0ZD5BY3RpdmVQZXJsIGZyb20gaHR0cDovL3d3dy5hY3RpdmVzdGF0ZS5jb20vPGJyLz48YnIvPjwvdGQ+Ci0gIDwvdHI+ICAKLTwvdGFibGU+Ci08L3MyPjxhbmNob3IgbmFtZT0iYmFzaWMtcGF0dGVybiIvPgotPHMyIHRpdGxlPSJUaGUgYmFzaWMgcGF0dGVybiI+Ci08cD5MZXQncyBleGFtaW5lIGEgc2ltcGxlIGV4YW1wbGUuIFRoZSBzdHlsZXNoZWV0IGJlbG93IHVzZXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgYW5kIGFuIGV4dGVuc2lvbiBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gYW4gZWxlbWVudCBpbiB0aGUgWE1MIHNvdXJjZSBpbnRvIGEgc3RhdGVtZW50IGluIHRoZSBvdXRwdXQgaW5kaWNhdGluZyB0aGUgZGF0ZSBieSB3aGljaCBhIGN1c3RvbWVyIGNhbiBleHBlY3QgYSByZXNwb25zZSB0byBhIGdpdmVuIGVucXVpcnkuPC9wPgotCi08cD5UaGUgc291cmNlIGVsZW1lbnQgY29udGFpbnMgYSBudW1kYXlzIGF0dHJpYnV0ZS4gVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgbXVsdGlwbGllciBhdHRyaWJ1dGUsIHdoaWNoIGlzIHVzZWQgdG8gc2V0IGEgdmFyaWFibGUgaW4gdGhlIGV4dGVuc2lvbi4gVGhlIGV4dGVuc2lvbiBmdW5jdGlvbiBjb21wdXRlcyB0aGUgZGVhZGxpbmUsIHRoYXQgaXMgdGhlIGN1cnJlbnQgZGF0ZSBwbHVzIG51bWRheXMgKiBtdWx0aXBsaWVyLiBTbyBmb3IgJmx0O2RlYWRsaW5lIG51bWRheXM9IjMiLyZndDsgKGluIHRoZSBYTUwgc291cmNlKSBhbmQgJmx0O215LWV4dDp0aW1lbGFwc2UgbXVsdGlwbGllcj0iMiIvJmd0OyAoaW4gdGhlIHN0eWxlc2hlZXQpLCB0aGUgZXh0ZW5zaW9uIGNvbXB1dGVzIGEgZGVhZGxpbmUgNiBkYXlzIGZyb20gbm93LCBhbmQgdGhlIHN0eWxlc2hlZXQgdGVtcGxhdGUgdHJhbnNmb3JtcyB0aGUgZGVhZGxpbmUgZWxlbWVudCBpbnRvIGEgc3RyaW5nIGFsb25nIHRoZSBsaW5lcyBvZiA8Y29kZT4mbHQ7cCZndDtXZSBoYXZlIGxvZ2dlZCB5b3VyIGVucXVpcnkgYW5kIHdpbGwgcmVzcG9uZCBieSBBcHJpbCAyOSwgMjAwMCAxMjowNzoxNiBQTSBFU1QuJmx0Oy9wJmd0OzwvY29kZT48L3A+Ci08bm90ZT5UaGUgZXh0ZW5zaW9uIGZ1bmN0aW9uIGNvdWxkIGluY2x1ZGUgYm90aCBudW1kYXlzIGFuZCBtdWx0aXBsaWVyIGFzIGFyZ3VtZW50cywgdGh1cyBieXBhc3NpbmcgdGhlIG5lZWQgZm9yIHRoZSBleHRlbnNpb24gZWxlbWVudCwgYnV0IHRoZSBwdXJwb3NlIGhlcmUgaXMgdG8gaWxsdXN0cmF0ZSB0aGUgdXNhZ2UgcGF0dGVybiBmb3IgZXh0ZW5zaW9uIGVsZW1lbnRzLjwvbm90ZT4KLTxwPkFzIHlvdSByZXZpZXcgdGhpcyBzdHlsZXNoZWV0LCBwbGVhc2Ugbm90ZSB0aGUgZm9sbG93aW5nOjwvcD4KLTxvbD4KLQkgIDxsaT5UaGUgZGVjbGFyYXRpb24gb2YgdGhlIFhhbGFuIGx4c2x0IG5hbWVzcGFjZSwgd2hpY2ggcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIGNvbXBvbmVudCBhbmQKLSAgICAgY29tcG9uZW50L3NjcmlwdCBlbGVtZW50czo8YnIvPjxici8+Ci0gICAgPGNvZGU+eG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IjwvY29kZT48YnIvPjxici8+PC9saT4KLSAgICA8bGk+VGhlIGRlY2xhcmF0aW9uIG9mIGEgbmFtZXNwYWNlIGZvciB0aGlzIGV4dGVuc2lvbjo8YnIvPjxici8+Ci0gICAgPGNvZGU+eG1sbnM6bXktZXh0PSJleHQxIjwvY29kZT48YnIvPjxici8+PC9saT4KLSAgCTxsaT5UaGUgZGVzaWduYXRpb24gb2YgdGhpcyBuYW1lc3BhY2UgcHJlZml4IGFzIGFuIGV4dGVuc2lvbiBwcmVmaXguIFRoaXMgY2F1c2VzIGFueSBlbGVtZW50IGluIHRoZSBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJlZml4IHRvIGJlIHRyZWF0ZWQgYXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgcmF0aGVyIHRoYW4gYSBsaXRlcmFsIHJlc3VsdCBlbGVtZW50Ljxici8+PGJyLz4KLSAgICAgPGNvZGU+ZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9Im15LWV4dCI8L2NvZGU+PGJyLz48YnIvPjwvbGk+Ci0JICA8bGk+VGhlIGx4c2x0OmNvbXBvbmVudCB3aXRoIGF0dHJpYnV0ZXMgZGVzaWduYXRpbmcgdGhlIG5hbWVzcGFjZSBwcmVmaXggYW5kIHRoZSBlbGVtZW50cyBhbmQKLSAgICAgZnVuY3Rpb25zIHRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzLjxici8+PGJyLz48L2xpPgotICAJPGxpPlRoZSBseHNsdDpzY3JpcHQgc3ViZWxlbWVudCB3aXRoIGEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZW5zaW9uLiBGb3IgSmF2YQotICAgICBleHRlbnNpb25zLCB0aGUgbHhzbHQ6c2NyaXB0IGVsZW1lbnQgaGFzIGEgc3JjIGF0dHJpYnV0ZSB0aGF0IHlvdSBzZXQgdG8gaWRlbnRpZnkgdGhlIEphdmEgY2xhc3MuPC9saT4KLTwvb2w+PGFuY2hvciBuYW1lPSJleC1iYXNpYyIvPiAgIAotPHNvdXJjZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSZsdDshLS1OYW1lc3BhY2VzIGFyZSBnbG9iYWwgaWYgeW91IHNldCB0aGVtIGluIHRoZSBzdHlsZXNoZWV0IGVsZW1lbnQtLSZndDsKLSZsdDt4c2w6c3R5bGVzaGVldCAKLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgCi0gICAgdmVyc2lvbj0iMS4wIiAgIAotICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKLSAgICB4bWxuczpteS1leHQ9ImV4dDEiCi0gICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9Im15LWV4dCImZ3Q7Ci0gICAgCi0gICZsdDshLS1UaGUgY29tcG9uZW50IGFuZCBpdHMgc2NyaXB0IGFyZSBpbiB0aGUgbHhzbHQgbmFtZXNwYWNlIGFuZCBkZWZpbmUgdGhlIAotICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlbnNpb24uLS0mZ3Q7Ci0gICZsdDtseHNsdDpjb21wb25lbnQgcHJlZml4PSJteS1leHQiIGVsZW1lbnRzPSJ0aW1lbGFwc2UiIGZ1bmN0aW9ucz0iZ2V0ZGF0ZSImZ3Q7Ci0gICAgJmx0O2x4c2x0OnNjcmlwdCBsYW5nPSJqYXZhc2NyaXB0IiZndDsKLSAgICAgIHZhciBtdWx0aXBsaWVyPTE7Ci0gICAgICAvLyBUaGUgbWV0aG9kcyBvciBmdW5jdGlvbnMgdGhhdCBpbXBsZW1lbnQgZXh0ZW5zaW9uIGVsZW1lbnRzIGFsd2F5cyB0YWtlIDIKLSAgICAgIC8vIGFyZ3VtZW50cy4gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBYU0wgUHJvY2Vzc29yIGNvbnRleHQ7IHRoZSBzZWNvbmQgCi0gICAgICAvLyBhcmd1bWVudCBpcyB0aGUgZWxlbWVudCBub2RlLgotICAgICAgZnVuY3Rpb24gdGltZWxhcHNlKHhzbFByb2Nlc3NvckNvbnRleHQsIGVsZW0pCi0gICAgICB7Ci0gICAgICAgIG11bHRpcGxpZXI9cGFyc2VJbnQoZWxlbS5nZXRBdHRyaWJ1dGUoIm11bHRpcGxpZXIiKSk7Ci0gICAgICAgIC8vIFRoZSBlbGVtZW50IHJldHVybiB2YWx1ZSBpcyBwbGFjZWQgaW4gdGhlIHJlc3VsdCB0cmVlLgotICAgICAgICAvLyBJZiB5b3UgZG8gbm90IHdhbnQgYSByZXR1cm4gdmFsdWUsIHJldHVybiBudWxsLgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIGZ1bmN0aW9uIGdldGRhdGUobnVtZGF5cykKLSAgICAgIHsKLSAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwotICAgICAgICB2YXIgdG90YWxEYXlzID0gcGFyc2VJbnQobnVtZGF5cykgKiBtdWx0aXBsaWVyOwotICAgICAgICBkLnNldERhdGUoZC5nZXREYXRlKCkgKyB0b3RhbERheXMpOwotICAgICAgICByZXR1cm4gZC50b0xvY2FsZVN0cmluZygpOwotICAgICAgfQotICAgICZsdDsvbHhzbHQ6c2NyaXB0Jmd0OwotICAmbHQ7L2x4c2x0OmNvbXBvbmVudCZndDsKLSAgICAgIAotICAmbHQ7eHNsOnRlbXBsYXRlIG1hdGNoPSJkZWFkbGluZSImZ3Q7Ci0gICAgJmx0O3AmZ3Q7Jmx0O215LWV4dDp0aW1lbGFwc2UgbXVsdGlwbGllcj0iMiIvJmd0O1dlIGhhdmUgbG9nZ2VkIHlvdXIgZW5xdWlyeSBhbmQgd2lsbCAKLSAgICAgIHJlc3BvbmQgYnkgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9Im15LWV4dDpnZXRkYXRlKHN0cmluZyhAbnVtZGF5cykpIi8mZ3Q7LiZsdDsvcCZndDsKLSAgJmx0Oy94c2w6dGVtcGxhdGU+Ci0KLSZsdDsveHNsOnN0eWxlc2hlZXQmZ3Q7Ci08L3NvdXJjZT4KLTwvczI+PGFuY2hvciBuYW1lPSJzZXR1cC1ydW50aW1lIi8+Ci08czIgdGl0bGU9IlNldHRpbmcgdXAgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQiPgotPHA+VG8gcnVuIHRoZSBwcmVjZWRpbmcgZXhhbXBsZSwgYnNmLmphciBhbmQganMuamFyIG11c3QgYmUgb24gdGhlIGNsYXNzcGF0aC4gUmVtZW1iZXIgdGhhdCBic2YuamFyIG11c3QgYmUgb24gdGhlIGNsYXNzcGF0aCB0byBydW4gYW55IGV4dGVuc2lvbiB3cml0dGVuIGluIGEgbGFuZ3VhZ2Ugb3RoZXIgdGhhbiBKYXZhLiBGb3IgZXh0ZW5zaW9ucyBpbXBsZW1lbnRlZCBpbiBhIHNjcmlwdGluZyBsYW5ndWFnZSwgc2VlIHRoZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBpbiA8bGluayBhbmNob3I9InN1cHBvcnRlZC1sYW5nIj5TdXBwb3J0ZWQgbGFuZ3VhZ2VzPC9saW5rPi48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0iYmFzaWMtc3ludGF4Ii8+Ci08czIgdGl0bGU9IlN5bnRheCI+Ci08cD5Zb3UgY2FuIGFsd2F5cyB1c2UgdGhlIHBhdHRlcm4gaWxsdXN0cmF0ZWQgYWJvdmUgdG8gc2V0IHVwIGFuZCB1c2UgZXh0ZW5zaW9uIGVsZW1lbnRzIGFuZCBleHRlbnNpb24gZnVuY3Rpb25zLiBGb3IgZXh0ZW5zaW9uIGVsZW1lbnRzIGFuZCBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gSmF2YSwgeW91IGNhbiBhbHNvIHVzZSBhbiBhYmJyZXZpYXRlZCBzeW50YXgsIGRlc2NyaWJlZCBpbiA8bGluayBhbmNob3I9ImphdmEtbmFtZXNwYWNlIj5BbHRlcm5hdGl2ZTogdXNpbmcgdGhlIGFiYnJldmlhdGVkIHN5bnRheCBmb3IgZXh0ZW5zaW9ucyBpbXBsZW1lbnRlZCBpbiBKYXZhPC9saW5rPi4gVW5sZXNzIHlvdSBhcmUgdXNpbmcgdGhlIGFiYnJldmlhdGVkIHN5bnRheCwgZG8gdGhlIGZvbGxvd2luZzo8L3A+Ci08czMgdGl0bGU9IjEuIERlY2xhcmUgdGhlIGx4c2x0IG5hbWVzcGFjZSI+Ci08cD48YnIvPjxjb2RlPnhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCI8L2NvZGU+PC9wPgotPHA+VGhlIGx4c2x0IG5hbWVzcGFjZSBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgbHhzbHQ6Y29tcG9uZW50IGVsZW1lbnQgYW5kIGx4c2x0OnNjcmlwdCBzdWJlbGVtZW50LjwvcD4KLTwvczM+Ci08czMgdGl0bGU9IjIuIERlY2xhcmUgYSB1bmlxdWUgbmFtZXNwYWNlIGZvciBlYWNoIGV4dGVuc2lvbiBwcmVmaXgiPgotPHA+PGJyLz48Y29kZT54bWxuczo8cmVmPnByZWZpeDwvcmVmPj08cmVmPlVSSTwvcmVmPjwvY29kZT48L3A+Ci08cD5UaGUgPHJlZj5wcmVmaXg8L3JlZj4gaWRlbnRpZmllcyB0aGUgbmFtZXNwYWNlLCBhbmQgPHJlZj5VUkk8L3JlZj4gaXMgYW4gYXJiaXRyYXJ5IChidXQgdW5pcXVlKSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGUgcHJlZml4IGF0dHJpYnV0ZSBvZiBhbiBseHNsdDpjb21wb25lbnQgZWxlbWVudCBpbiB0aGUgc3R5bGVzaGVldC48YnIvPgotRXhhbXBsZTogPGNvZGU+eG1sbnM6ZXh0MT0ieHl6IjwvY29kZT48YnIvPjxici8+PC9wPgotPC9zMz4KLTxzMyB0aXRsZT0iMy4gSWYgeW91IGFyZSB1c2luZyBleHRlbnNpb24gZWxlbWVudHMsIGRlc2lnbmF0ZSB0aGUgZXh0ZW5zaW9uIGVsZW1lbnQgcHJlZml4ZXMiPgotPHA+PGJyLz5UaGlzIHN0ZXAgaXMgcmVxdWlyZWQgb25seSBpZiB5b3UgYXJlIHVzaW5nIGV4dGVuc2lvbiBlbGVtZW50cy4gIElmIHlvdSBhcmUgdXNpbmcgZXh0ZW5zaW9uIGZ1bmN0aW9ucyBvbmx5LCB5b3UgY2FuIHNraXAgdGhpcyBzdGVwLjwvcD4KLTxwPkluIHRoZSBzdHlsZXNoZWV0IGVsZW1lbnQsIHdyaXRlOjwvcD4gCi08cD48Y29kZT5leHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0iPHJlZj5wcmVmaXgtMSBwcmVmaXgtMiAuLi48L3JlZj4iPC9jb2RlPjwvcD4KLTxwPkluIGEgbGl0ZXJhbCByZXN1bHQgZWxlbWVudCBvciBleHRlbnNpb24gZWxlbWVudCBpbmNsdWRlIHRoZSB4c2wgcHJlZml4OjwvcD4KLTxwPjxjb2RlPnhzbDpleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0iPHJlZj5wcmVmaXgxIHByZWZpeDIgLi4uPC9yZWY+IjwvY29kZT48L3A+Ci08cD5LZWVwIGluIG1pbmQgdGhhdCB3aGVyZSB5b3UgZGVjbGFyZSBuYW1lc3BhY2VzIGFuZCBkZXNpZ25hdGUgZXh0ZW5zaW9uIHByZWZpeGVzIGRldGVybWluZXMgdGhlIHNjb3BlIG9mIHRob3NlIG5hbWVzcGFjZXMuVG8gbWFrZSB5b3VyIGV4dGVuc2lvbnMgYXZhaWxhYmxlIHRocm91Z2hvdXQgdGhlIHN0eWxlc2hlZXQsIGluY2x1ZGUgdGhlc2Ugc2V0dGluZ3MgYW5kIGF0dHJpYnV0ZSBpbiB0aGUgc3R5bGVzaGVldCBlbGVtZW50LjwvcD4KLTwvczM+Ci08czMgdGl0bGU9IjQuIChPcHRpb25hbCkgRXhjbHVkZSB0aGUgZXh0ZW5zaW9uIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBmcm9tIHRoZSByZXN1bHQgdHJlZSI+Ci08cD48YnIvPkJ5IGRlZmF1bHQsIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgYXJlIGluY2x1ZGVkIGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBvdXRwdXQuIFRvIGV4Y2x1ZGUgbmFtZXNwYWNlcyBmcm9tIHRoZSBvdXRwdXQsIHVzZTwvcD4KLTxwPjxjb2RlPmV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSI8cmVmPnByZWZpeC0xIHByZWZpeC0yIC4uLjwvcmVmPiI8L2NvZGU+PC9wPgotPHA+aW4gdGhlIHN0eWxlc2hlZXQgZWxlbWVudCBvcjwvcD4KLTxwPjxjb2RlPnhzbDpleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0iPHJlZj5wcmVmaXgtMSBwcmVmaXgtMiAuLi48L3JlZj4iPC9jb2RlPjwvcD4gCi08cD5pbiBhIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnQgb3IgZXh0ZW5zaW9uIGVsZW1lbnQuPC9wPgotPC9zMz4KLTxzMyB0aXRsZT0iNS4gU2V0IHVwIGFuIGx4c2x0OmNvbXBvbmVudCI+Ci08cD48YnIvPkluIHRoZSBzY29wZSBvZiB0aGUgbHhzbHQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uOjwvcD4KLTxwPjxjb2RlPiZsdDtseHNsdDpjb21wb25lbnQgcHJlZml4PSI8cmVmPnByZWZpeDwvcmVmPiIgPC9jb2RlPjxici8+Ci0gICA8Y29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmdW5jdGlvbnM9IjxyZWY+ZnVuYy0xIGZ1bmMtMiAuLi5mdW5jLW48L3JlZj4iPC9jb2RlPjxici8+IAotICAgPGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZWxlbWVudHM9IjxyZWY+ZWxlbS0xIGVsZW0tMiAuLi5lbGVtLW48L3JlZj4iJmd0OzwvY29kZT48YnIvPgotICAgPGNvZGU+Jm5ic3A7Jm5ic3A7Jmx0OyEtLVNlZSBseHNsdDpzY3JpcHQgYmVsb3ctLSZndDs8L2NvZGU+PGJyLz4KLSAgIDxjb2RlPiZsdDsvbHhzbHQ6Y29tcG9uZW50Jmd0OzwvY29kZT48L3A+Ci08cD53aGVyZSA8cmVmPmZ1bmMtMSBmdW5jLTIgLi4uIGZ1bmMtbjwvcmVmPiBhbmQgPHJlZj5lbGVtLTEgZWxlbS0yIC4uLiBlbGVtLW48L3JlZj4gZGVzaWduYXRlIHRoZSBmdW5jdGlvbnMgYW5kIGVsZW1lbnRzIHRoZSBleHRlbnNpb24gcHJvdmlkZXMgYW5kIHRoZSBzdHlsZXNoZWV0IHVzZXMuIFlvdSBjYW4gdXNlIHRoZSBmdW5jdGlvbi1hdmFpbGFibGUgYW5kIGVsZW1lbnQtYXZhaWxhYmxlIGZ1bmN0aW9ucyB0byBkZXRlcm1pbmUgYXQgcnVuIHRpbWUgd2hldGhlciBhIGZ1bmN0aW9uIG9yIGVsZW1lbnQgZGVzaWduYXRlZCBpbiB0aGUgbHhzbHQ6Y29tcG9uZW50IGlzIGFjdHVhbGx5IGF2YWlsYWJsZS48L3A+Ci08bm90ZT5JZiB0aGUgY29tcG9uZW50IGlzIGltcGxlbWVudGVkIGluIEphdmEsIHRoZSB2YWx1ZXMgb2YgdGhlIDxjb2RlPmZ1bmN0aW9uczwvY29kZT4gYW5kIDxjb2RlPmVsZW1lbnRzPC9jb2RlPiBhdHRyaWJ1dGVzIGFyZSBpZ25vcmVkLiBUaGUgZnVuY3Rpb24tYXZhaWxhYmxlIGFuZCBlbGVtZW50LWF2YWlsYWJsZSBmdW5jdGlvbnMgdXNlIHJlZmxlY3Rpb24gdG8gZXhhbWluZSB0aGUgYWN0dWFsIEphdmEgbWV0aG9kcy48L25vdGU+Ci08L3MzPgotPGFuY2hvciBuYW1lPSJzZXR1cC1zY3JpcHQiLz4KLTxzMyB0aXRsZT0iNi4gU2V0IHVwIHRoZSBseHNsdDpzY3JpcHQgZWxlbWVudCI+Ci08cD48YnIvPkluIGVhY2ggbHhzbHQ6Y29tcG9uZW50LCB5b3UgbXVzdCBpbmNsdWRlIGV4YWN0bHkgb25lIGx4c2x0OnNjcmlwdCBlbGVtZW50LiBJZiB0aGUgZXh0ZW5zaW9uIGlzIGltcGxlbWVudGVkIGluIEphdmFTY3JpcHQ6PC9wPgotPHA+PGNvZGU+Jmx0O2x4c2x0OnNjcmlwdCBsYW5nPSJqYXZhc2NyaXB0IiAmZ3Q7PC9jb2RlPjxici8+Ci08Y29kZT4mbmJzcDsmbmJzcDsmbHQ7IS0tVGhlIGltcGxlbWVudGF0aW9uIHNjcmlwdC0tJmd0OzwvY29kZT48YnIvPgotPGNvZGU+Jmx0Oy9seHNsdDpzY3JpcHQmZ3Q7PC9jb2RlPjwvcD4KLTxwPkZvciBvdGhlciBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHN1cHBvcnRlZCBieSBCU0YsIHVzZSB0aGUgc2FtZSBhcHByb2FjaCBhcyBmb3IgSmF2YVNjcmlwdC4gJnhzbHQ0ajsgcGxhbnMgdG8gYWRkIHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBzcmMgYXR0cmlidXRlIHRvIGlkZW50aWZ5IGFub3RoZXIgZG9jdW1lbnQgdGhhdCBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gc2NyaXB0OyB0aGlzIGZlYXR1cmUgaXMgbm90IHlldCBzdXBwb3J0ZWQuPC9wPgotPHA+SWYgdGhlIGV4dGVuc2lvbiBpcyBpbXBsZW1lbnRlZCBpbiBKYXZhLCB5b3UgaGF2ZSB0aHJlZSBjaG9pY2VzIGZvciB0aGUgZm9ybWF0IG9mIHRoZSBzcmMgYXR0cmlidXRlIGluIHRoZSBseHNsdDpzY3JpcHQgZWxlbWVudC48L3A+Ci08cD48Y29kZT4mbHQ7bHhzbHQ6c2NyaXB0IGxhbmc9ImphdmFjbGFzcyIgc3JjPSJ4YWxhbjovLzxyZWY+RlFDTjwvcmVmPiIvJmd0OzwvY29kZT4KLTxici8+d2hlcmUgPHJlZj5GUUNOPC9yZWY+IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KLTxici8+RXhhbXBsZTogPGNvZGU+Jmx0O2x4c2x0OnNjcmlwdCBsYW5nPSJqYXZhY2xhc3MiIHNyYz0ieGFsYW46Ly9qYXZhLnV0aWwuSGFzaHRhYmxlIi8mZ3Q7PC9jb2RlPjwvcD4KLTxwPjxjb2RlPiZsdDtseHNsdDpzY3JpcHQgbGFuZz0iamF2YWNsYXNzIiBzcmM9InhhbGFuOi8vPHJlZj5QSlBOPC9yZWY+Ii8mZ3Q7PC9jb2RlPgotPGJyLz53aGVyZSA8cmVmPlBKUE48L3JlZj4gaXMgdGhlIGJlZ2lubmluZyBvZiBvciB0aGUgY29tcGxldGUgbmFtZSBvZiBhIGphdmEgcGFja2FnZS4KLTxici8+RXhhbXBsZTogPGNvZGU+Jmx0O2x4c2x0OnNjcmlwdCBsYW5nPSJqYXZhY2xhc3MiIHNyYz0iamF2YS51dGlsIi8mZ3Q7PC9jb2RlPjwvcD4KLTxwPjxjb2RlPiZsdDtseHNsdDpzY3JpcHQgbGFuZz0iamF2YWNsYXNzIiBzcmM9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiLyZndDs8L2NvZGU+PC9wPgotPHA+VGhlIGRpZmZlcmVudCBmb3JtYXRzIGZvciB0aGUgdmFsdWUgb2YgdGhlIHNyYyBhdHRyaWJ1dGUgd2hlbiB1c2luZyBKYXZhIGV4dGVuc2lvbnMgYXJlIG1vcmUgZnVsbHkgZXhwbGFpbmVkIGluIDxsaW5rIGFuY2hvcj0iamF2YS1uYW1lc3BhY2UtZGVjbGFyZSI+RGVjbGFyZSB0aGUgbmFtZXNwYWNlPC9saW5rPi48L3A+Ci08L3MzPgotPHMzIHRpdGxlPSJJbXBsaWNpdCBEVEQgZm9yIGx4c2x0OmNvbXBvbmVudCI+Ci08c291cmNlPiZsdDshRUxFTUVOVCBseHNsdDpjb21wb25lbnQgKGx4c2x0OnNjcmlwdCkmZ3Q7Ci0mbHQ7IUFUVExJU1QgbHhzbHQ6Y29tcG9uZW50Ci0gIHByZWZpeCBDREFUQSAjUkVRVUlSRUQKLSAgZWxlbWVudHMgTk1UT0tFTlMgI0lNUExJRUQKLSAgZnVuY3Rpb25zIE5NVE9LRU5TICNJTVBMSUVEJmd0OwotCi0mbHQ7IUVMRU1FTlQgbHhzbHQ6c2NyaXB0ICgjUENEQVRBIHwgRU1QVFkpPyZndDsKLSZsdDshQVRUTElTVCBseHNsdDpzY3JpcHQKLSAgbGFuZyBDREFUQSAjUkVRVUlSRUQKLSAgc3JjIENEQVRBICNJTVBMSUVEJmd0Ozwvc291cmNlPgotPC9zMz4KLTwvczI+PGFuY2hvciBuYW1lPSJleHQtZWxlbWVudHMiLz4KLTxzMiB0aXRsZT0iVXNpbmcgYW4gZXh0ZW5zaW9uIGVsZW1lbnQiPgotPHA+RXh0ZW5zaW9uIGVsZW1lbnRzIHBhc3MgdGhlIGV4dGVuc2lvbiB0d28gb2JqZWN0czo8L3A+Ci08dWw+Ci08bGk+PGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL2V4dGVuc2lvbnMvWFNMUHJvY2Vzc29yQ29udGV4dC5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLmV4dGVuc2lvbnMuWFNMUHJvY2Vzc29yQ29udGV4dDwvanVtcD4sIHdoaWNoIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgWFNMIHByb2Nlc3NvciwgdGhlIFhNTCBzb3VyY2UgdHJlZSwgdGhlIHN0eWxlc2hlZXQgdHJlZSwgdGhlIGN1cnJlbnQgY29udGV4dCBub2RlLCBhbmQgdGhlIGN1cnJlbnQgbW9kZSAoaWYgYW55KS48YnIvPjxici8+PC9saT4KLTxsaT48anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1FeHRlbnNpb25DYWxsLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1FeHRlbnNpb25DYWxsPC9qdW1wPiwgd2hpY2ggcHJvdmlkZXMgdGhlIEFQSSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgZXh0ZW5zaW9uIGVsZW1lbnQuPC9saT4KLTwvdWw+Ci08cD5Zb3UgY2FuIHVzZSB0aGUgRWxlbUV4dGVuc2lvbkNhbGwgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSBtZXRob2QsIGZvciBleGFtcGxlLCB0byByZWFkIGVsZW1lbnQgYXR0cmlidXRlcyBpbiB0aGVpciByYXcgZm9ybS4gIFVzZSB0aGUgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBOb2RlIHNvdXJjZU5vZGUsIFhTTFRFbmdpbmVJbXBsIHByb2Nlc3NvcikgbWV0aG9kIHRvIGV2YWx1YXRlIHRoZSBhdHRyaWJ1dGUgYXMgYW4gYXR0cmlidXRlIHZhbHVlIHRlbXBsYXRlLiAgTm90ZSB0aGF0IHRoZSBtZXRob2QgbmFtZXMgYXJlIHRoZSBzYW1lIGJ1dCB0aGUgbWV0aG9kIHNpZ25hdHVyZXMgYXJlIGRpZmZlcmVudC4gIEZvciBmdWxsIGRldGFpbHMsIHNlZSB0aGUgPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtRXh0ZW5zaW9uQ2FsbC5odG1sIj5KYXZhZG9jPC9qdW1wPiBmb3IgdGhlIEVsZW1FeHRlbnNpb25DYWxsIGNsYXNzLjwvcD4KLTxzMyB0aXRsZT0iSW1wbGVtZW50aW5nIGFuIGV4dGVuc2lvbiBlbGVtZW50Ij4KLTxwPkZvciBlYWNoIGV4dGVuc2lvbiBlbGVtZW50IGluIGEgbmFtZXNwYWNlLCB0aGUgaW1wbGVtZW50YXRpb24gbXVzdCBiZSBhIEphdmEgbWV0aG9kIHdpdGggdGhlIGZvbGxvd2luZyBzaWduYXR1cmUsIG9yIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgZXF1aXZhbGVudDo8L3A+Ci08cD48Y29kZT48cmVmPlR5cGUgZWxlbWVudDwvcmVmPihvcmcuYXBhY2hlLnhhbGFuLmV4dGVuc2lvbnMuWFNMUHJvY2Vzc29yQ29udGV4dCwgPC9jb2RlPjxici8+Ci08Y29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtRXh0ZW5zaW9uQ2FsbCBleHRlbnNpb25FbGVtZW50KTwvY29kZT48L3A+Ci08cD53aGVyZSA8cmVmPlR5cGU8L3JlZj4gZGVzaWduYXRlcyB0aGUgcmV0dXJuIHR5cGUgYW5kIDxyZWY+ZWxlbWVudDwvcmVmPiBpcyB0aGUgbG9jYWwgcGFydCBvZiB0aGUgZXh0ZW5zaW9uIGVsZW1lbnQgbmFtZSAodGhlIGVsZW1lbnQgbmFtZSB3aXRob3V0IHRoZSBuYW1lc3BhY2UgcHJlZml4KS4gSW4gdGhlIG1ldGhvZCBzaWduYXR1cmUsIHlvdSBtYXkgYWxzbyB1c2Ugc3VwZXJjbGFzc2VzIG9mIHRoZSBpbmRpY2F0ZWQgdHlwZXMuPC9wPgotPHA+SWYgdGhlIGV4dGVuc2lvbiBlbGVtZW50IGlzIGltcGxlbWVudGVkIGluIGEgbG9vc2VseSB0eXBlZCBzY3JpcHRpbmcgbGFuZ3VhZ2UsIHN1Y2ggYXMgSmF2YVNjcmlwdCwgdGhlIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlIGFyZSB1bnR5cGVkLjwvcD4KLTxwPjxlbT5DYXV0aW9uOjwvZW0+IFRoZSB2YWx1ZSByZXR1cm5lZCBieSBhbiBleHRlbnNpb24gZWxlbWVudCBpcyBwbGFjZWQgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIHJlc3VsdC4gSWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiBhIHJldHVybiB2YWx1ZSwgdXNlIGEgcHVibGljIHZvaWQgSmF2YSBtZXRob2Qgb3IgcmV0dXJuIG51bGwgZnJvbSBhIHNjcmlwdGluZyBsYW5ndWFnZSBmdW5jdGlvbi48L3A+Ci08cD5KYXZhIGV4YW1wbGU6IDxjb2RlPnB1YmxpYyB2b2lkIG15RWxlbWVudDwvY29kZT48YnIvPgotPGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xQcm9jZXNzb3JDb250ZXh0LCA8L2NvZGU+PGJyLz4KLTxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO29yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1FeHRlbnNpb25DYWxsIGV4dGVuc2lvbkVsZW1lbnQpPC9jb2RlPjwvcD4KLTxwPkphdmFTY3JpcHQgZXhhbXBsZTogPGNvZGU+ZnVuY3Rpb24gbXlFbGVtZW50KHhzbFByb2NDb250ZXh0LCBlbGVtZW50KTwvY29kZT48L3A+Ci08cD5UaGUgPGxpbmsgaWRyZWY9ImV4dGVuc2lvbnNsaWIiIGFuY2hvcj0icmVkaXJlY3QiPlJlZGlyZWN0IGV4dGVuc2lvbjwvbGluaz4gaW4gdGhlIGV4dGVuc2lvbnMgbGlicmFyeSBjb250YWlucyB0aHJlZSBleHRlbnNpb24gZWxlbWVudHMuPC9wPgotPC9zMz4KLQotPC9zMj48YW5jaG9yIG5hbWU9ImV4dC1mdW5jdGlvbnMiLz4KLTxzMiB0aXRsZT0iVXNpbmcgZXh0ZW5zaW9uIGZ1bmN0aW9ucyI+Ci08cD5FeHRlbnNpb24gZnVuY3Rpb25zIG1heSBpbmNsdWRlIGFyZ3VtZW50cyBvZiBhbnkgdHlwZSBhbmQgcmV0dXJuIGEgdmFsdWUgb2YgYW55IHR5cGUuPC9wPgotPHA+WFNMVCByZWNvZ25pemVzIGZpdmUgZGF0YSB0eXBlczogbm9kZS1zZXQsIHJlc3VsdC10cmVlLWZyYWdtZW50LCBzdHJpbmcsIGJvb2xlYW4sIGFuZCBudW1iZXIuIFlvdSBjYW4gdXNlIFhQYXRoIGV4cHJlc3Npb25zIHRvIHNldCB2YXJpYWJsZXMgd2l0aCB2YWx1ZXMgb2YgdGhlc2UgdHlwZXMuIFlvdSBjYW4gYWxzbyBwYXNzIGxpdGVyYWxzIGZvciBzdHJpbmcsIGJvb2xlYW4sIGFuZCBudW1iZXIgYXJndW1lbnRzLiBJZiB5b3Ugd2FudCB0byBwYXNzIGFuIGFyZ3VtZW50IG9mIGEgdHlwZSB0aGF0IFhTTFQgZG9lcyBub3QgcmVjb2duaXplLCB1c2UgYW5vdGhlciBleHRlbnNpb24gZnVuY3Rpb24gdG8gcmV0dXJuIGFuIG9iamVjdCBvZiB0aGF0IHR5cGUuIFRoZSBzdHlsZXNoZWV0IHRoYXQgYXBwZWFycyBpbiA8bGluayBhbmNob3I9ImZvcm1hdC1kYXRlLXN0eWxlc2hlZXQiPkZvcm1hdHRpbmcgYSBkYXRlPC9saW5rPiwgZm9yIGV4YW1wbGUgdXNlcyBleHRlbnNpb24gZnVuY3Rpb25zIHRvIHJldHVybiBhIERhdGUgb2JqZWN0IGFuZCBhIFNpbXBsZURhdGVGb3JtYXQgb2JqZWN0LCBhbmQgdGhlbiB1c2VzIHRoZXNlIG9iamVjdHMgdG8gY2FsbCBhbm90aGVyIGV4dGVuc2lvbiBmdW5jdGlvbi48L3A+Ci08czMgdGl0bGU9IkRhdGEgdHlwZSBtYXBwaW5nIGFuZCBtZXRob2Qgc2VsZWN0aW9uIj4KLTxwPldoZW4gY2FsbGluZyBhbiBleHRlbnNpb24gZnVuY3Rpb24gd3JpdHRlbiBpbiBhIGxhbmd1YWdlIG90aGVyIHRoYW4gSmF2YSwgb2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIEphdmEgY2xhc3NlcyB3aWxsIGFsd2F5cyBiZSBwYXNzZWQgdG8gdGhlIGV4dGVuc2lvbiBmdW5jdGlvbjo8L3A+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGg+WFNMVCBUeXBlPC90aD4KLSAgICAgIDx0aD5KYXZhIFR5cGU8L3RoPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgIDx0ZD5Ob2RlLVNldDwvdGQ+Ci0gICAgICAgPHRkPm9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgIDx0ZD5TdHJpbmc8L3RkPgotICAgICAgIDx0ZD5qYXZhLmxhbmcuU3RyaW5nPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+Qm9vbGVhbjwvdGQ+Ci0gICAgICAgPHRkPmphdmEubGFuZy5Cb29sZWFuPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+TnVtYmVyPC90ZD4KLSAgICAgICA8dGQ+amF2YS5sYW5nLkRvdWJsZTwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgPHRkPlJlc3VsdCBUcmVlIEZyYWdtZW50PC90ZD4KLSAgICAgICA8dGQ+b3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTxwPkFueSBub24tWFNMVCB0eXBlIGlzIHBhc3NlZCB3aXRob3V0IGNvbnZlcnNpb24uPC9wPgotPHA+V2hlbiBjYWxsaW5nIGFuIGV4dGVuc2lvbiBmdW5jdGlvbiB3cml0dGVuIGluIEphdmEsIHRoZSBleHRlbnNpb24gZnVuY3Rpb24gc2lnbmF0dXJlIGNhbiBzcGVjaWZ5IGFueSBvZiB0aGUgaW5kaWNhdGVkIEphdmEgdHlwZXMsIGFzIGV4cGxhaW5lZCBiZWxvdzo8L3A+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGg+WFNMVCBUeXBlPC90aD4KLSAgICAgIDx0aD5KYXZhIFR5cGVzPC90aD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+Tm9kZS1TZXQ8L3RkPgotICAgICAgIDx0ZD5vcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yLCBvcmcudzNjLmRvbS5Ob2RlTGlzdCwgb3JnLnczYy5kb20uTm9kZSBvciBpdHMgc3ViY2xhc3NlcywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCwgY2hhciwgW2RvdWJsZSwgZmxvYXQsIGxvbmcsIGludCwgc2hvcnQsIGJ5dGUsXSBib29sZWFuPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+U3RyaW5nPC90ZD4KLSAgICAgICA8dGQ+amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCwgY2hhciwgW2RvdWJsZSwgZmxvYXQsIGxvbmcsIGludCwgc2hvcnQsIGJ5dGUsXSBib29sZWFuPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+Qm9vbGVhbjwvdGQ+Ci0gICAgICAgPHRkPmJvb2xlYW4sIGphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+TnVtYmVyPC90ZD4KLSAgICAgICA8dGQ+ZG91YmxlLCBqYXZhLmxhbmcuRG91YmxlLCBmbG9hdCwgbG9uZywgaW50LCBzaG9ydCxjaGFyLCBieXRlLCBib29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+UmVzdWx0IFRyZWUgRnJhZ21lbnQ8L3RkPgotICAgICAgIDx0ZD5vcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yLCBvcmcudzNjLmRvbS5Ob2RlTGlzdCwgb3JnLnczYy5kb20uTm9kZSBvciBpdHMgc3ViY2xhc3NlcywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCwgY2hhciwgW2RvdWJsZSwgZmxvYXQsIGxvbmcsIGludCwgc2hvcnQsIGJ5dGUsXSBib29sZWFuPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+Tm9uLVhTTFQgVHlwZTwvdGQ+Ci0gICAgICAgPHRkPnRoZSBuYXRpdmUgdHlwZSBvciBhbnkgb2YgaXRzIHN1cGVyY2xhc3NlcywgZG91YmxlLCBmbG9hdCwgbG9uZywgaW50LCBzaG9ydCwgY2hhciwgYnl0ZSwgamF2YS5sYW5nLlN0cmluZzwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTxwPldoZW4gY2FsbGluZyBleHRlbnNpb24gZnVuY3Rpb25zIHdyaXR0ZW4gaW4gSmF2YSwgJnhzbHQ0ajsgc2VsZWN0cyB0aGUgbWV0aG9kIHRvIGNhbGwgYXMgZm9sbG93czo8L3A+Ci08b2w+Ci0gIDxsaT4meHNsdDRqOyBzZWxlY3RzIGFsbCBtZXRob2RzIHdob3NlIG5hbWUgbWF0Y2hlcyB0aGUgZXh0ZW5zaW9uIGZ1bmN0aW9uIG5hbWUgYXMgc3BlY2lmaWVkIGluIDxsaW5rIGFuY2hvcj0iZXh0LWZ1bmMtY2FsbHMiPkV4dGVuc2lvbiBmdW5jdGlvbiBKYXZhIGNhbGxzPC9saW5rPi48L2xpPgotICA8bGk+RnJvbSB0aGlzIGxpc3Qgb2YgbWV0aG9kcywgJnhzbHQ0ajsgZGV0ZXJtaW5lcyB3aGljaCBtZXRob2RzIGFyZSA8cmVmPnF1YWxpZmllZDwvcmVmPi48L2xpPgotICA8bGk+RWFjaCBxdWFsaWZpZWQgbWV0aG9kIGlzIGFzc2lnbmVkIGEgc2NvcmUgYmFzZWQgb24gdGhlIHRhYmxlIHNob3duIGFib3ZlLiBUbyBhc3NpZ24gdGhlIHNjb3JlIHRvIGEgZ2l2ZW4gbWV0aG9kLCAmeHNsdDRqOyBleGFtaW5lcyBlYWNoIG9mIHRoZSBYU0xUIGFyZ3VtZW50IHR5cGVzIGluIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIGluIHRoZSBzdHlsZXNoZWV0LiBGb3IgZWFjaCBhcmd1bWVudCwgdGhlIGFwcHJvcHJpYXRlIHJvdyBpbiB0aGUgdGFibGUgYWJvdmUgaXMgc2VsZWN0ZWQuIFRoZW4sIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgcGFyYW1ldGVyIHR5cGUgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUgaW4gdGhlIEphdmEgcHJvZ3JhbSBpcyBzY29yZWQuIFR5cGVzIHdoaWNoIGFwcGVhciBlYXJsaWVyIGluIHRoZSBsaXN0IGFyZSBnaXZlbiBhIGhpZ2hlciBzY29yZS4gIFRoYXQgaXMsIHRoZSBsaXN0IGFwcGVhcnMgaW4gb3JkZXIgb2Ygc2NvcmluZyBwcmVmZXJlbmNlIGZyb20gaGlnaGVzdCB0byBsb3dlc3QuIFR5cGVzIHNob3duIGluIHNxdWFyZSBicmFja2V0cyBoYXZlIGVxdWFsIHByaW9yaXR5LjwvbGk+Ci0gIDxsaT5UaGUgbWV0aG9kIHdpdGggdGhlIGhpZ2hlc3Qgc2NvcmUgaXMgaW52b2tlZCBhZnRlciB0aGUgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUuIElmIG1vcmUgdGhhbiBvbmUgbWV0aG9kIGhhcyB0aGUgaGlnaGVzdCBzY29yZSwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi48L2xpPgotPC9vbD4KLTxwPkFueSBleHRlbnNpb24gZnVuY3Rpb24gd3JpdHRlbiBpbiBKYXZhIGNhbiBoYXZlIGEgZmlyc3QgcGFyYW1ldGVyIG9mIHR5cGUgPGNvZGU+b3JnLmFwYWNoZS54YWxhbi5leHRlbnNpb25zLkV4cHJlc3Npb25Db250ZXh0PC9jb2RlPi4gQW55IG1ldGhvZCB3aXRoIGFuIEV4cHJlc3Npb25Db250ZXh0IGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgd2lsbCBzY29yZSBoaWdoZXIgdGhhbiBhbnkgbWV0aG9kIHdoaWNoIGRvZXMgbm90IGhhdmUgYW4gRXhwcmVzc2lvbkNvbnRleHQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIuPC9wPgotPC9zMz4KLTxhbmNob3IgbmFtZT0iZXh0LWZ1bmMtY2FsbHMiLz4KLTxzMyB0aXRsZT0iRXh0ZW5zaW9uIGZ1bmN0aW9uIEphdmEgY2FsbHMiPgotPHA+VGhlIHRlY2huaXF1ZSBmb3IgaW5zdGFudGlhdGluZyBKYXZhIG9iamVjdHMgYW5kIGNhbGxpbmcgSmF2YSBtZXRob2RzIGRlcGVuZHMgb24gdGhlIGZvcm1hdCBvZiB0aGUgZXh0ZW5zaW9uIG5hbWVzcGFjZSB0aGF0IHdhcyBkZWNsYXJlZC4gIFNlZSA8bGluayBhbmNob3I9ImphdmEtbmFtZXNwYWNlLWRlY2xhcmUiPkRlY2xhcmUgdGhlIG5hbWVzcGFjZTwvbGluaz4gZm9yIHRoZSB0aHJlZSBkaWZmZXJlbnQgZm9ybWF0cyBvZiBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGZvciBKYXZhIGV4dGVuc2lvbnMuIEZvciBlYWNoIG5hbWVzcGFjZSBmb3JtYXQsIHRoZSBzZWN0aW9uIGJlbG93IGRlc2NyaWJlcyBob3cgdG8gaW5zdGFudGlhdGUgYW4gb2JqZWN0LCBob3cgdG8gaW52b2tlIGFuIGluc3RhbmNlIG1ldGhvZCwgYW5kIGhvdyB0byBpbnZva2UgYSBzdGF0aWMgbWV0aG9kLiBUaGUgc2VjdGlvbnMgYmVsb3cgZXhwbGFpbiwgZm9yIGVhY2ggc3ludGF4LCB3aGljaCBtZXRob2RzIGFyZSA8cmVmPnF1YWxpZmllZDwvcmVmPiBmb3IgbWV0aG9kIHNlbGVjdGlvbiBhcyBkZXNjcmliZWQgaW4gdGhlIHByZWNlZWRpbmcgc2VjdGlvbi48L3A+Ci08czQgdGl0bGU9IkNsYXNzIGZvcm1hdCBuYW1lc3BhY2UiPgotPHA+PGJyLz48ZW0+VG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIG9iamVjdDwvZW0+OgotPGJyLz48Y29kZT48cmVmPnByZWZpeDwvcmVmPjpuZXcgKDxyZWY+YXJnczwvcmVmPik8L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj5wcmVmaXg8L3JlZj4gaXMgdGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UgcHJlZml4LiBBIG5ldyBpbnN0YW5jZSBpcyB0byBiZSBjcmVhdGVkIHdpdGggdGhlIDxyZWY+YXJnczwvcmVmPiBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKGlmIGFueSkuIEFsbCBjb25zdHJ1Y3RvciBtZXRob2RzIGFyZSBxdWFsaWZpZWQgZm9yIG1ldGhvZCBzZWxlY3Rpb24uCi08YnIvPkV4YW1wbGU6IDxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ibXlUeXBlIjwvY29kZT4KLTxici8+PGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c2VsZWN0PSJteS1jbGFzczpuZXcoKSImZ3Q7PC9jb2RlPjwvcD4KLQotPHA+PGVtPlRvIGludm9rZSBhbiBpbnN0YW5jZSBtZXRob2Qgb24gYSBzcGVjaWZpZWQgb2JqZWN0PC9lbT46Ci08YnIvPjxjb2RlPjxyZWY+cHJlZml4PC9yZWY+OjxyZWY+bWV0aG9kTmFtZTwvcmVmPiAoPHJlZj5vYmplY3Q8L3JlZj4sIDxyZWY+YXJnczwvcmVmPik8L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj5wcmVmaXg8L3JlZj4gaXMgdGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UgcHJlZml4IGFuZCA8cmVmPm1ldGhvZE5hbWU8L3JlZj4gaXMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb24gPHJlZj5vYmplY3Q8L3JlZj4gd2l0aCB0aGUgPHJlZj5hcmdzPC9yZWY+IGFyZ3VtZW50cy4gPHJlZj5vYmplY3Q8L3JlZj4gbXVzdCBiZSBhbiBvYmplY3Qgb2YgdGhlIGNsYXNzIGluZGljYXRlZCBieSB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uLiAgT3RoZXJ3aXNlLCB0aGUgY2FzZSBzaG93biBpbW1lZGlhdGVseSBiZWxvdyB3aWxsIGFwcGx5LiBPbmx5IGluc3RhbmNlIG1ldGhvZHMgd2l0aCAgdGhlIG5hbWUgPHJlZj5tZXRob2ROYW1lPC9yZWY+IGFyZSBxdWFsaWZpZWQgbWV0aG9kcy4gSWYgYSBtYXRjaGluZyBtZXRob2QgaXMgZm91bmQsIDxyZWY+b2JqZWN0PC9yZWY+IHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgb2JqZWN0IGluc3RhbmNlIGFuZCA8cmVmPmFyZ3M8L3JlZj4gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLgotPGJyLz4KLUV4YW1wbGU6IDxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ibmV3LXBvcCI8L2NvZGU+PGJyLz4KLTxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NlbGVjdD0ibXktY2xhc3M6dmFsdWVPZigkbXlUeXBlLCBzdHJpbmcoQHBvcHVsYXRpb24pKSImZ3Q7PC9jb2RlPjwvcD4KLQotPHA+PGVtPlRvIGludm9rZSBhbiBpbnN0YW5jZSBtZXRob2Qgb24gYSBkZWZhdWx0IG9iamVjdDwvZW0+OgotPGJyLz48Y29kZT48cmVmPnByZWZpeDwvcmVmPjo8cmVmPm1ldGhvZE5hbWU8L3JlZj4gKDxyZWY+YXJnczwvcmVmPik8L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj5wcmVmaXg8L3JlZj4gaXMgdGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UgcHJlZml4IGFuZCA8cmVmPm1ldGhvZE5hbWU8L3JlZj4gaXMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugd2l0aCB0aGUgPHJlZj5hcmdzPC9yZWY+IGFyZ3VtZW50cy4gVGhlIGZpcnN0IDxyZWY+YXJnPC9yZWY+LCBpZiBhbnksIG11c3Qgbm90IGJlIGFuIG9iamVjdCBvZiB0aGUgY2xhc3MgaW5kaWNhdGVkIGJ5IHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24uICBPdGhlcndpc2UsIHRoZSBjYXNlIHNob3duIGltbWVkaWF0ZWx5IGFib3ZlIHdpbGwgYXBwbHkuIE9ubHkgaW5zdGFuY2UgbWV0aG9kcyB3aXRoIHRoZSBuYW1lIDxyZWY+bWV0aG9kTmFtZTwvcmVmPiBhcmUgcXVhbGlmaWVkIG1ldGhvZHMuIElmIGEgbWF0Y2hpbmcgbWV0aG9kIGlzIGZvdW5kLCBhIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotPGJyLz4KLUV4YW1wbGU6IDxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ibmV3LXBvcCI8L2NvZGU+PGJyLz4KLTxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NlbGVjdD0ibXktY2xhc3M6dmFsdWVPZihzdHJpbmcoQHBvcHVsYXRpb24pKSImZ3Q7PC9jb2RlPjwvcD4KLQotPHA+PGVtPlRvIGludm9rZSBhIHN0YXRpYyBtZXRob2Q8L2VtPjoKLTxici8+PGNvZGU+PHJlZj5wcmVmaXg8L3JlZj46PHJlZj5tZXRob2ROYW1lPC9yZWY+ICg8cmVmPmFyZ3M8L3JlZj4pPC9jb2RlPjwvcD4KLTxwPndoZXJlIDxyZWY+cHJlZml4PC9yZWY+IGlzIHRoZSBleHRlbnNpb24gbmFtZXNwYWNlIHByZWZpeCBhbmQgPHJlZj5tZXRob2ROYW1lPC9yZWY+IGlzIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlIHdpdGggdGhlIDxyZWY+YXJnczwvcmVmPiBhcmd1bWVudHMuIE9ubHkgc3RhdGljIG1ldGhvZHMgd2l0aCB0aGUgbmFtZSA8cmVmPm1ldGhvZE5hbWU8L3JlZj4gYXJlIHF1YWxpZmllZCBtZXRob2RzLiBJZiBhIG1hdGNoaW5nIG1ldGhvZCBpcyBmb3VuZCwgPHJlZj5hcmdzPC9yZWY+IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBpbnZva2VkIHN0YXRpYyBtZXRob2QuCi08YnIvPgotRXhhbXBsZTogPGNvZGU+Jmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJuZXctcG9wIjwvY29kZT48YnIvPgotPGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c2VsZWN0PSJteS1jbGFzczpwcmludGl0KHN0cmluZyhAcG9wdWxhdGlvbikpIiZndDs8L2NvZGU+PC9wPgotPC9zND4KLTxzNCB0aXRsZT0iUGFja2FnZSBmb3JtYXQgbmFtZXNwYWNlIj4KLTxwPjxici8+PGVtPlRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBvYmplY3Q8L2VtPjoKLTxici8+PGNvZGU+PHJlZj5wcmVmaXg8L3JlZj46PHJlZj5zdWJwYWNrYWdlPC9yZWY+LjxyZWY+Y2xhc3M8L3JlZj4ubmV3ICg8cmVmPmFyZ3M8L3JlZj4pPC9jb2RlPjwvcD4KLTxwPndoZXJlIDxyZWY+cHJlZml4PC9yZWY+IGlzIHRoZSBleHRlbnNpb24gbmFtZXNwYWNlIHByZWZpeCwgPHJlZj5zdWJwYWNrYWdlPC9yZWY+IGlzIHRoZSByZXN0IG9mIHRoZSBwYWNrYWdlIG5hbWUgKHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2thZ2UgbmFtZSB3YXMgaW4gdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiksIGFuZCA8cmVmPmNsYXNzPC9yZWY+IGlzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy4gQSBuZXcgaW5zdGFuY2UgaXMgdG8gYmUgY3JlYXRlZCB3aXRoIHRoZSA8cmVmPmFyZ3M8L3JlZj4gY29uc3RydWN0b3IgYXJndW1lbnRzIChpZiBhbnkpLiBBbGwgY29uc3RydWN0b3IgbWV0aG9kcyBhcmUgcXVhbGlmaWVkIGZvciBtZXRob2Qgc2VsZWN0aW9uLgotPGJyLz5FeGFtcGxlOiA8Y29kZT4mbHQ7eHNsOnZhcmlhYmxlIG5hbWU9Im15VHlwZSI8L2NvZGU+Ci08YnIvPjxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NlbGVjdD0ibXktcGFja2FnZTpleHRjbGFzcy5uZXcoKSImZ3Q7PC9jb2RlPjwvcD4KLQotPHA+PGVtPlRvIGludm9rZSBhbiBpbnN0YW5jZSBtZXRob2Qgb24gYSBzcGVjaWZpZWQgaW5zdGFuY2U8L2VtPjoKLTxici8+PGNvZGU+PHJlZj5wcmVmaXg8L3JlZj46PHJlZj5tZXRob2ROYW1lPC9yZWY+ICg8cmVmPm9iamVjdDwvcmVmPiwgPHJlZj5hcmdzPC9yZWY+KTwvY29kZT48L3A+Ci08cD53aGVyZSA8cmVmPnByZWZpeDwvcmVmPiBpcyB0aGUgZXh0ZW5zaW9uIG5hbWVzcGFjZSBwcmVmaXggYW5kIDxyZWY+bWV0aG9kTmFtZTwvcmVmPiBpcyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGludm9rZSBvbiA8cmVmPm9iamVjdDwvcmVmPiB3aXRoIHRoZSA8cmVmPmFyZ3M8L3JlZj4gYXJndW1lbnRzLiBPbmx5IGluc3RhbmNlIG1ldGhvZHMgb2YgdGhlIDxyZWY+b2JqZWN0PC9yZWY+IHdpdGggdGhlIG5hbWUgPHJlZj5tZXRob2ROYW1lPC9yZWY+IGFyZSBxdWFsaWZpZWQgbWV0aG9kcy4gSWYgYSBtYXRjaGluZyBtZXRob2QgaXMgZm91bmQsIDxyZWY+b2JqZWN0PC9yZWY+IHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgb2JqZWN0IGluc3RhbmNlIGFuZCA8cmVmPmFyZ3M8L3JlZj4gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLgotPGJyLz4KLUV4YW1wbGU6IDxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ibmV3LXBvcCI8L2NvZGU+PGJyLz4KLTxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NlbGVjdD0ibXktcGFja2FnZTp2YWx1ZU9mKCRteVR5cGUsIHN0cmluZyhAcG9wdWxhdGlvbikpIiZndDs8L2NvZGU+PC9wPgotCi08cD48ZW0+VG8gaW52b2tlIGEgc3RhdGljIG1ldGhvZDwvZW0+OgotPGJyLz48Y29kZT48cmVmPnByZWZpeDwvcmVmPjo8cmVmPnN1YnBhY2thZ2U8L3JlZj4uPHJlZj5jbGFzczwvcmVmPi48cmVmPm1ldGhvZE5hbWU8L3JlZj4gKDxyZWY+YXJnczwvcmVmPik8L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj5wcmVmaXg8L3JlZj4gaXMgdGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UgcHJlZml4LCA8cmVmPnN1YnBhY2thZ2U8L3JlZj4gaXMgdGhlIHJlc3Qgb2YgdGhlIHBhY2thZ2UgbmFtZSAodGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2FnZSBuYW1lIHdhcyBpbiB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uKSwgPHJlZj5jbGFzczwvcmVmPiBpcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MsIGFuZCA8cmVmPm1ldGhvZE5hbWU8L3JlZj4gaXMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugd2l0aCB0aGUgPHJlZj5hcmdzPC9yZWY+IGFyZ3VtZW50cy4gT25seSBzdGF0aWMgbWV0aG9kcyB3aXRoIHRoZSBuYW1lIDxyZWY+bWV0aG9kTmFtZTwvcmVmPiBhcmUgcXVhbGlmaWVkIG1ldGhvZHMuIElmIGEgbWF0Y2hpbmcgbWV0aG9kIGlzIGZvdW5kLCA8cmVmPmFyZ3M8L3JlZj4gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGludm9rZWQgc3RhdGljIG1ldGhvZC4KLTxici8+Ci1FeGFtcGxlOiA8Y29kZT4mbHQ7eHNsOnZhcmlhYmxlIG5hbWU9Im5ldy1wb3AiPC9jb2RlPjxici8+Ci08Y29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzZWxlY3Q9Im15LXBhY2thZ2U6ZXh0Y2xhc3MucHJpbnRpdChzdHJpbmcoQHBvcHVsYXRpb24pKSImZ3Q7PC9jb2RlPjwvcD4KLTxub3RlPlVubGlrZSB0aGUgY2xhc3MgZm9ybWF0IG5hbWVzcGFjZSwgdGhlcmUgaXMgbm8gY29uY2VwdCBvZiBhIGRlZmF1bHQgb2JqZWN0IHNpbmNlIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gZG9lcyBub3QgaWRlbnRpZnkgYSB1bmlxdWUgY2xhc3MuPC9ub3RlPgotPC9zND4KLTxzNCB0aXRsZT0iSmF2YSBmb3JtYXQgbmFtZXNwYWNlIj4KLTxwPjxici8+PGVtPlRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBvYmplY3Q8L2VtPjoKLTxici8+PGNvZGU+PHJlZj5wcmVmaXg8L3JlZj46PHJlZj5GUUNOPC9yZWY+Lm5ldyAoPHJlZj5hcmdzPC9yZWY+KTwvY29kZT48L3A+Ci08cD53aGVyZSA8cmVmPnByZWZpeDwvcmVmPiBpcyB0aGUgZXh0ZW5zaW9uIG5hbWVzcGFjZSBwcmVmaXggZm9yIHRoZSBKYXZhIG5hbWVzcGFjZSBhbmQgPHJlZj5GUUNOPC9yZWY+IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3Mgd2hvc2UgY29uc3RydWN0b3IgaXMgdG8gYmUgY2FsbGVkLiBBIG5ldyBpbnN0YW5jZSBpcyB0byBiZSBjcmVhdGVkIHdpdGggdGhlIDxyZWY+YXJnczwvcmVmPiBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKGlmIGFueSkuIEFsbCBjb25zdHJ1Y3RvciBtZXRob2RzIGFyZSBxdWFsaWZpZWQgZm9yIG1ldGhvZCBzZWxlY3Rpb24uCi08YnIvPkV4YW1wbGU6IDxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ibXlIYXNoIjwvY29kZT4KLTxici8+PGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c2VsZWN0PSJqYXZhOmphdmEudXRpbC5IYXNodGFibGUubmV3KCkiJmd0OzwvY29kZT48L3A+Ci0KLTxwPjxlbT5UbyBpbnZva2UgYW4gaW5zdGFuY2UgbWV0aG9kIG9uIGEgc3BlY2lmaWVkIGluc3RhbmNlPC9lbT46Ci08YnIvPjxjb2RlPjxyZWY+cHJlZml4PC9yZWY+OjxyZWY+bWV0aG9kTmFtZTwvcmVmPiAoPHJlZj5vYmplY3Q8L3JlZj4sIDxyZWY+YXJnczwvcmVmPik8L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj5wcmVmaXg8L3JlZj4gaXMgdGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UgcHJlZml4IGFuZCA8cmVmPm1ldGhvZE5hbWU8L3JlZj4gaXMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb24gPHJlZj5vYmplY3Q8L3JlZj4gd2l0aCB0aGUgPHJlZj5hcmdzPC9yZWY+IGFyZ3VtZW50cy4gT25seSBpbnN0YW5jZSBtZXRob2RzIG9mIHRoZSA8cmVmPm9iamVjdDwvcmVmPiB3aXRoIHRoZSBuYW1lIDxyZWY+bWV0aG9kTmFtZTwvcmVmPiBhcmUgcXVhbGlmaWVkIG1ldGhvZHMuIElmIGEgbWF0Y2hpbmcgbWV0aG9kIGlzIGZvdW5kLCA8cmVmPm9iamVjdDwvcmVmPiB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG9iamVjdCBpbnN0YW5jZSBhbmQgPHJlZj5hcmdzPC9yZWY+IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC4KLTxici8+Ci1FeGFtcGxlOiA8Y29kZT4mbHQ7eHNsOnZhcmlhYmxlIG5hbWU9Im5ldy1wb3AiPC9jb2RlPjxici8+Ci08Y29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzZWxlY3Q9ImphdmE6cHV0KCRteUhhc2gsIHN0cmluZyhAcmVnaW9uKSwgJG5ld3BvcCkiJmd0OzwvY29kZT48L3A+Ci0KLTxwPjxlbT5UbyBpbnZva2UgYSBzdGF0aWMgbWV0aG9kPC9lbT46Ci08YnIvPjxjb2RlPjxyZWY+cHJlZml4PC9yZWY+OjxyZWY+RlFDTjwvcmVmPi48cmVmPm1ldGhvZE5hbWU8L3JlZj4gKDxyZWY+YXJnczwvcmVmPik8L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj5wcmVmaXg8L3JlZj4gaXMgdGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UgcHJlZml4LCA8cmVmPkZRQ048L3JlZj4gaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyB3aG9zZSBzdGF0aWMgbWV0aG9kIGlzIHRvIGJlIGNhbGxlZCwgYW5kIDxyZWY+bWV0aG9kTmFtZTwvcmVmPiBpcyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGludm9rZSB3aXRoIHRoZSA8cmVmPmFyZ3M8L3JlZj4gYXJndW1lbnRzLiBPbmx5IHN0YXRpYyBtZXRob2RzIHdpdGggdGhlIG5hbWUgPHJlZj5tZXRob2ROYW1lPC9yZWY+IGFyZSBxdWFsaWZpZWQgbWV0aG9kcy4gSWYgYSBtYXRjaGluZyBtZXRob2QgaXMgZm91bmQsIDxyZWY+YXJnczwvcmVmPiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgaW52b2tlZCBzdGF0aWMgbWV0aG9kLgotPGJyLz4KLUV4YW1wbGU6IDxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ibmV3LXBvcCI8L2NvZGU+PGJyLz4KLTxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NlbGVjdD0iamF2YTpqYXZhLmxhbmcuSW50ZWdlci52YWx1ZU9mKHN0cmluZyhAcG9wdWxhdGlvbikpIiZndDs8L2NvZGU+PC9wPgotPG5vdGU+VW5saWtlIHRoZSBjbGFzcyBmb3JtYXQgbmFtZXNwYWNlLCB0aGVyZSBpcyBubyBjb25jZXB0IG9mIGEgZGVmYXVsdCBvYmplY3Qgc2luY2UgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBkb2VzIG5vdCBpZGVudGlmeSBhIHVuaXF1ZSBjbGFzcy48L25vdGU+Ci08L3M0PgotPC9zMz4KLQotPHMzIHRpdGxlPSJQYXNzaW5nIE5vZGVzIHRvIGphdmEiPgotPHA+UGxlYXNlIGtlZXAgaW4gbWluZCB0aGF0IDxlbT5hbGw8L2VtPiBMb2NhdGlvblBhdGggZXhwcmVzc2lvbnMgcmV0dXJuIGEgbm9kZS1zZXQsIGV2ZW4gaWYgdGhlIGV4cHJlc3Npb24gb25seSByZXR1cm5zIGEgc2luZ2xlIGF0dHJpYnV0ZSBvciBhIHRleHQgbm9kZSAobm9kZS1zZXRzIHdpdGggb25lIG1lbWJlcikuIFlvdSBjYW4gdXNlIHRoZSBYU0xUIHN0cmluZygpIGZ1bmN0aW9uIChhcyBpbiB0aGUgc3ludGF4IGV4YW1wbGVzIGFib3ZlKSB0byBjb252ZXJ0IGEgbm9kZS1zZXQgdmFsdWUgdG8gc3RyaW5nLCBhbmQgdGhlIG51bWJlcigpIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBub2RlLXNldCB2YWx1ZSB0byBudW1iZXIgKGEgZG91YmxlKS48L3A+Ci08cD5JZiB5b3Ugd2FudCB0byBwYXNzIGEgbm9kZS1zZXQgdG8gYW4gZXh0ZW5zaW9uIGZ1bmN0aW9uLCBzZXQgdXAgYSBKYXZhIG1ldGhvZCB0byBhY2NlcHQgYW4gCi1vcmcudzNjLmRvbS5Ob2RlTGlzdCAob3IgYW4gb3JnLmFwYWNoZS54cGF0aC5Ob2RlU2V0LCB3aGljaCBpbXBsZW1lbnRzIE5vZGVMaXN0LCBpZiB5b3Ugd2FudCB0byBtb2RpZnkgdGhlIG5vZGVzKS48L3A+Ci08cD5TdXBwb3NlLCBmb3IgZXhhbXBsZSwgeW91IGhhdmUgYSBteUV4dGVuc2lvbnMuUHJvY2Vzc05vZGVzIGNsYXNzIHdpdGggdGhlIGZvbGxvd2luZyBkb1NvbWV0aGluZyBtZXRob2Q6PC9wPgotPHA+PGNvZGU+cHVibGljIHN0YXRpYyBib29sZWFuIGRvU29tZXRoaW5nKG9yZy53M2MuZG9tLk5vZGVMaXN0IG5MaXN0KTwvY29kZT48L3A+Ci08cD5Bc3N1bWluZyB5b3Ugc2V0IHVwIHRoaXMgZXh0ZW5zaW9uIGluIHRoZSBub2RlLWV4dCBuYW1lc3BhY2UsIGFueSBvZiB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbiBjYWxscyBmcm9tIGEgc3R5bGVzaGVldCBhcmUgc3ludGFjdGljYWxseSBwb3NzaWJsZTo8L3A+Ci08cD48Y29kZT4mbHQ7IS0tUHJvY2VzcyB0aGUgY3VycmVudCBub2RlLS0mZ3Q7PC9jb2RlPjxici8+Ci08Y29kZT4mbHQ7eHNsOnZhcmlhYmxlIG5hbWU9InN1Y2Nlc3MiIHNlbGVjdD0ibm9kZS1leHQ6TXlFeHRlbnNpb25zLlByb2Nlc3NOb2Rlcy5kb1NvbWV0aGluZyguKSIvJmd0OzwvY29kZT48L3A+Ci08cD48Y29kZT4mbHQ7IS0tUHJvY2VzcyBhbGwgbm9kZXMgaW4gY3VycmVudCBjb250ZXh0LS0+PC9jb2RlPjxici8+Ci08Y29kZT4mbHQ7eHNsOnZhcmlhYmxlIG5hbWU9InN1Y2Nlc3MiIHNlbGVjdD0ibm9kZS1leHQ6TXlFeHRlbnNpb25zLlByb2Nlc3NOb2Rlcy5kb1NvbWV0aGluZygqKSIvJmd0OzwvY29kZT48L3A+Ci08cD48Y29kZT4mbHQ7IS0tIFByb2Nlc3MgYWxsIG5vZGVzIC0tPjwvY29kZT48YnIvPgotPGNvZGU+Jmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJzdWNjZXNzIiBzZWxlY3Q9Im5vZGUtZXh0Ok15RXh0ZW5zaW9ucy5Qcm9jZXNzTm9kZXMuZG9Tb21ldGhpbmcoLyopIi8mZ3Q7PC9jb2RlPjwvcD4KLTxwPjxjb2RlPiZsdDshLS1Qcm9jZXNzIHRoZSBmb28vYmF6IG5vZGVzIGluIGN1cnJlbnQgY29udGV4dCAtLT48L2NvZGU+PGJyLz4KLTxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ic3VjY2VzcyIgc2VsZWN0PSJub2RlLWV4dDpNeUV4dGVuc2lvbnMuUHJvY2Vzc05vZGVzLmRvU29tZXRoaW5nKGZvby9iYXopIi8mZ3Q7PC9jb2RlPjwvcD4KLTxwPjxjb2RlPiZsdDshLS1Qcm9jZXNzIHRoZS9mb28vYmF6IGFuZCAvYmFyL3NheiBub2RlcyAtLT48L2NvZGU+PGJyLz4KLTxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ic3VjY2VzcyIgc2VsZWN0PSJub2RlLWV4dDpNeUV4dGVuc2lvbnMuUHJvY2Vzc05vZGVzLmRvU29tZXRoaW5nKC9mb28vYmF6IHwgL2Jhci9zYXopIi8mZ3Q7PC9jb2RlPjwvcD4KLTxwPlRoZSBOb2RlTGlzdCBpcyBpbiBmYWN0IGEgbGlzdCBvZiByZWZlcmVuY2VzIGludG8gdGhlIFhNTCBkb2N1bWVudCwgc28ga2VlcCBpbiBtaW5kIHRoYXQgZ2V0TmV4dFNpYmxpbmcoKSwgZm9yIGV4YW1wbGUsIGdldHMgeW91IHRoZSBuZXh0IHNpYmxpbmcgaW4gdGhlIGRvY3VtZW50LCB3aGljaCBtYXkgbm90IGJlIHRoZSBuZXh0IE5vZGUgaW4gdGhlIE5vZGVMaXN0LjwvcD4KLTwvczM+Ci08czMgdGl0bGU9IkltcGxlbWVudGluZyBleHRlbnNpb24gZnVuY3Rpb25zIj4KLTxwPkZvciBlYWNoIGV4dGVuc2lvbiBmdW5jdGlvbiBpbiBhIG5hbWVzcGFjZSB3aGljaCBpcyBpbXBsZW1lbnRlZCBpbiBhIGxhbmd1YWdlIG90aGVyIHRoYW4gSmF2YSwgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgaW5jbHVkZSBhIG1ldGhvZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlLCBvciB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIGVxdWl2YWxlbnQ6PC9wPgotPHA+PGNvZGU+cHVibGljIDxyZWY+IG9iamVjdCBmdW5jdGlvbjwvcmVmPig8cmVmPmFyZ3M8L3JlZj4pPC9jb2RlPjwvcD4KLTxwPndoZXJlIDxyZWY+b2JqZWN0PC9yZWY+IGlzIHRoZSByZXR1cm4gdHlwZSwgPHJlZj5mdW5jdGlvbjwvcmVmPiBpcyB0aGUgbG9jYWwgcGFydCBvZiB0aGUgZXh0ZW5zaW9uIGZ1bmN0aW9uIG5hbWUgKHRoZSBmdW5jdGlvbiBuYW1lIHdpdGhvdXQgdGhlIG5hbWVzcGFjZSBwcmVmaXgpLCBhbmQgPHJlZj5hcmdzPC9yZWY+IGNvcnJlc3BvbmQgdG8gdGhlIGFyZ3VtZW50cyBpbiB0aGUgZnVuY3Rpb24gY2FsbC48L3A+Ci08cD5JbiBhZGRpdGlvbiwgZm9yIGV4dGVuc2lvbiBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gSmF2YSwgdGhlIGltcGxlbWVudGF0aW9uIG1heSBpbmNsdWRlIGVpdGhlciBhIEphdmEgbWV0aG9kIHdpdGggdGhlIHNpZ25hdHVyZSBzaG93biBhYm92ZSBvciBvbmUgd2l0aCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZTo8L3A+Ci08cD48Y29kZT5wdWJsaWMgPHJlZj4gb2JqZWN0IGZ1bmN0aW9uPC9yZWY+KG9yZy5hcGFjaGUueGFsYW4uZXh0ZW5zaW9ucy5FeHByZXNzaW9uQ29udGV4dCwgPHJlZj5hcmdzPC9yZWY+KTwvY29kZT48L3A+Ci08L3MzPgotPC9zMj48YW5jaG9yIG5hbWU9ImphdmEtbmFtZXNwYWNlIi8+Ci08czIgdGl0bGU9IkFsdGVybmF0aXZlOiB1c2luZyB0aGUgYWJicmV2aWF0ZWQgc3ludGF4IGZvciBleHRlbnNpb25zIGltcGxlbWVudGVkIGluIEphdmEiPgotPHA+Rm9yIGV4dGVuc2lvbiBmdW5jdGlvbnMgYW5kIGV4dGVuc2lvbiBlbGVtZW50cyBpbXBsZW1lbnRlZCBpbiBKYXZhLCBYYWxhbiBwZXJtaXRzIGFuIGFiYnJldmlhdGVkIHN5bnRheC4gV2hlbiB5b3UgdXNlIHRoZSBhYmJyZXZpYXRlZCBzeW50YXgsIHlvdSBkbyBub3QgdXNlIGFuIGx4c2x0OmNvbXBvbmVudCB0byBkZXNpZ25hdGUgdGhlIGZ1bmN0aW9ucy48L3A+Ci08cD5UaGUgYWJicmV2aWF0ZWQgc3ludGF4IHN1cHBvcnRzIHRoZSB1c2Ugb2YgZXh0ZW5zaW9uIGZ1bmN0aW9ucyBhbmQgZXh0ZW5zaW9uIGVsZW1lbnRzIGltcGxlbWVudGVkIGluIEphdmEuIFlvdSBjYW5ub3QgdXNlIHRoaXMgc3ludGF4IHdpdGggZXh0ZW5zaW9ucyBpbXBsZW1lbnRlZCBpbiBKYXZhU2NyaXB0IG9yIGFub3RoZXIgc2NyaXB0aW5nIGxhbmd1YWdlLjwvcD4KLTxhbmNob3IgbmFtZT0iamF2YS1uYW1lc3BhY2UtZGVjbGFyZSIvPgotPHMzIHRpdGxlPSJEZWNsYXJlIHRoZSBuYW1lc3BhY2UiPgotPHA+RGVjbGFyZSB0aGUgbmFtZXNwYWNlIGZvciB5b3VyIGV4dGVuc2lvbnMgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgdGhyZWUgZm9ybWF0cy4gVGhlIHRlY2huaXF1ZSBmb3IgaW52b2tpbmcgYW4gZXh0ZW5zaW9uIGZvciBlYWNoIGZvcm1hdCBpcyBleHBsYWluZWQgaW4gPGxpbmsgYW5jaG9yPSJleHQtZnVuYy1jYWxscyI+RXh0ZW5zaW9uIGZ1bmN0aW9uIEphdmEgY2FsbHM8L2xpbms+LjwvcD4KLTxwPjxlbT5jbGFzcyBmb3JtYXQ6PC9lbT4gPGNvZGU+eG1sbnM6bXktY2xhc3M9InhhbGFuOi8vPHJlZj5GUUNOPC9yZWY+IjwvY29kZT48L3A+Ci08cD53aGVyZSA8cmVmPkZRQ048L3JlZj4gaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotPGJyLz5FeGFtcGxlczogPGNvZGU+eG1sbnM6bXktY2xhc3M9InhhbGFuOi8vamF2YS51dGlsLkhhc2h0YWJsZSI8L2NvZGU+Ci08YnIvPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxjb2RlPnhtbG5zOm15LWNsYXNzPSJ4YWxhbjovL215cGFja2FnZS5teWNsYXNzIjwvY29kZT48L3A+Ci08cD48ZW0+cGFja2FnZSBmb3JtYXQ6PC9lbT4gPGNvZGU+eG1sbnM6bXktY2xhc3M9InhhbGFuOi8vPHJlZj5QSlBOPC9yZWY+IjwvY29kZT48L3A+Ci08cD53aGVyZSA8cmVmPlBKUE48L3JlZj4gaXMgYSBwYXJ0aWFsIGphdmEgcGFja2FnZSBuYW1lLiAgVGhhdCBpcywgaXQgaXMgdGhlIGJlZ2lubmluZyBvZiBvciB0aGUgY29tcGxldGUgbmFtZSBvZiBhIGphdmEgcGFja2FnZS4KLTxici8+RXhhbXBsZXM6IDxjb2RlPnhtbG5zOm15LXBhY2thZ2U9InhhbGFuOi8vamF2YS51dGlsIjwvY29kZT4KLTxici8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGNvZGU+eG1sbnM6bXktcGFja2FnZT0ieGFsYW46Ly9teXBhY2thZ2UiPC9jb2RlPjwvcD4KLTxwPjxlbT5KYXZhIGZvcm1hdDo8L2VtPiA8Y29kZT54bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIjwvY29kZT48L3A+Ci08bm90ZT5BbHRob3VnaCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNsYXNzIGFuZCBwYWNrYWdlIGZvcm1hdHMgYXJlIHNob3duIHdpdGggdGhlIHhhbGFuOi8vIHByZWZpeCwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZm9yIHRob3NlIGZvcm1hdHMgd2lsbCBzaW1wbHkgdXNlIHRoZSBzdHJpbmcgdG8gdGhlIHJpZ2h0IG9mIHRoZSByaWdodG1vc3QgZm9yd2FyZCBzbGFzaCBhcyB0aGUgSmF2YSBjbGFzcyBuYW1lLiBUaGlzIGZvcm1hdCBpcyBzaG93biBpbiBvcmRlciB0byBjb21wbHkgd2l0aCBXM0MgcmVjb21tZW5kYXRpb25zIGZvciBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLjwvbm90ZT4KLTxub3RlPlRoZSBjbGFzczogcHJlZml4IHdoaWNoIHdhcyBzb21ldGltZXMgcmVxdWlyZWQgaW4gZWFybGllciB2ZXJzaW9ucyBvZiAmeHNsdDRqOyBpcyBubyBsb25nZXIgcmVxdWlyZWQuPC9ub3RlPgotPG5vdGU+VGhlc2UgZm9ybWF0cyBhcmUgYWxzbyBhdmFpbGFibGUgd2hlbiBjb2RpbmcgdGhlIHNyYyBhdHRyaWJ1dGUgb2YgdGhlIGx4c2x0OnNjcmlwdCBlbGVtZW50IGFzIGV4cGxhaW5lZCBpbiA8bGluayBhbmNob3I9InNldHVwLXNjcmlwdCI+U2V0IHVwIHRoZSBseHNsdDpzY3JpcHQgZWxlbWVudDwvbGluaz4uPC9ub3RlPgotPC9zMz4KLTxzMyB0aXRsZT0iVXNlIHRoZSBuYW1lc3BhY2Ugd2hlbiB5b3UgbWFrZSBleHRlbnNpb24gY2FsbHMiPgotPHA+VXNlIHRoZSBkZWNsYXJlZCBwcmVmaXggd2l0aCB0aGUgc3ludGF4IGRlc2NyaWJlZCBpbiA8bGluayBhbmNob3I9ImV4dC1mdW5jLWNhbGxzIj5FeHRlbnNpb24gZnVuY3Rpb24gSmF2YSBjYWxsczwvbGluaz4uPC9wPgotPHA+VGhhdCBpcyBhbGwuIFlvdSBkbyBub3QgaW5jbHVkZSBhbiBseHNsdDpjb21wb25lbnQgZWxlbWVudC4gVXNpbmcgdGhlIGFiYnJldmlhdGVkIHN5bnRheCBjbGVhcmx5IGludm9sdmVzIGxlc3Mgc2V0dXAgdGhhbiB1c2luZyB0aGUgbHhzbHQ6Y29tcG9uZW50L2x4c2x0OnNjcmlwdCBhcHByb2FjaC48L3A+Ci08bm90ZT5XZSByZWNvbW1lbmQgdGhhdCwgZm9yIGV4dGVuc2lvbnMgY29kZWQgaW4gSmF2YSwgdGhlIGFiYnJldmlhdGVkIHN5bnRheCBzaG91bGQgYWx3YXlzIGJlIHVzZWQgc2luY2UgdGhlIGx4c2x0OmNvbXBvbmVudC9seHNsdDpzY3JpcHQgY29uc3RydWN0cyBhZGQgbm8gZnVuY3Rpb25hbGl0eS48L25vdGU+Ci08L3MzPjxhbmNob3IgbmFtZT0iZXgtamF2YS1uYW1lc3BhY2UiLz4gCi08czMgdGl0bGU9IkV4YW1wbGU6IEZvcm1hdHRpbmcgYSBkYXRlIj4KLTxwPlRoaXMgZXhhbXBsZSB1c2VzIGV4dGVuc2lvbiBmdW5jdGlvbnMgdG8gY2FsbCB0aGUgU2ltcGxlRGF0ZUZvcm1hdCBjbGFzcyBhbmQgdGhlIEludERhdGUgY2xhc3MuIEludERhdGUgdXNlcyBTdHJpbmcgYXJndW1lbnRzIHRvIHNldCB1cCBhIERhdGUgb2JqZWN0OjwvcD4KLTxzb3VyY2U+aW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotcHVibGljIGNsYXNzIEludERhdGUKLXsKLSAgcHVibGljIHN0YXRpYyBEYXRlIGdldERhdGUoU3RyaW5nIHllYXIsIFN0cmluZyBtb250aCwgU3RyaW5nIGRheSkKLSAgICB7Ci0gICAgICAvLyBEYXRlKGludCwgaW50LCBpbnQpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHNvIHVzZSBDYWxlbmRhciB0bwotICAgICAgLy8gc2V0IHRoZSB5ZWFyLCBtb250aCwgYW5kIGRheS4KLSAgICAgIENhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgICAgLy8gQ29udmVydCBlYWNoIGFyZ3VtZW50IHRvIGludC4KLSAgICAgIGMuc2V0ICggSW50ZWdlci5wYXJzZUludCh5ZWFyKSwKLSAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChtb250aCksCi0gICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoZGF5KSApOwotICAgICAgcmV0dXJuIGMuZ2V0VGltZSgpOwotICAgIH0KLX08L3NvdXJjZT4KLTxwPlRoZSB0ZW1wbGF0ZSB0cmFuc2Zvcm1zIGRhdGUgZWxlbWVudHMgd2l0aCBmb3VyIGF0dHJpYnV0ZXMuIEZvciBleGFtcGxlLCBpdCB0cmFuc2Zvcm1zIDxjb2RlPiZsdDtkYXRlIGZvcm1hdD0iRUVFRSwgTU1NIGRkLCB5eXl5IiB5ZWFyPSIyMDAwIiBtb250aD0iNCIgZGF5PSIyNyIvJmd0OzwvY29kZT4gaW50byAmbHQ7cCZndDtEYXRlOiBUaHVyc2RheSwgQXByaWwgMjcsIDIwMDAuJmx0Oy9wJmd0Oy48L3A+Ci08cD5BcyB5b3UgcmV2aWV3IHRoaXMgc3R5bGVzaGVldCwgcGxlYXNlIGtlZXAgdGhlIGZvbGxvd2luZyBpbiBtaW5kOjwvcD4KLSA8dWw+Ci0gIDxsaT5UaGUgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXMgc3R5bGVzaGVldCBhdHRyaWJ1dGUgcHJldmVudHMgdGhlIGphdmEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGZyb20KLSAgIGFwcGVhcmluZyBpbiB0aGUgb3V0cHV0LjwvbGk+Ci0gIDxsaT5UaGUgWFNMVCB0eXBlIHJldHVybmVkIGJ5IGFueSBMb2NhdGlvblBhdGggZXhwcmVzc2lvbiBpcyBub2RlLXNldCwgc28gdGhlIFhTTFQgc3RyaW5nCi0gICAgZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0IHRoZSBmb3JtYXQsIHllYXIsIG1vbnRoLCBhbmQgZGF5IGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBub2RlLXNldHMgdG8KLSAgICBzdHJpbmdzLjwvbGk+Ci0gIDxsaT5UaGUgZm9ybWF0IGF0dHJpYnV0ZSBwcm92aWRlcyBhIFN0cmluZyBhcmd1bWVudCBmb3IgY29uc3RydWN0aW5nIGEgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQKLSAgICBvYmplY3QuPC9saT4KLSAgICA8bGk+VGhlIEludERhdGUgY2xhc3MgdXNlcyBTdHJpbmcgdmFsdWVzIHByb3ZpZGVkIGJ5IHRoZSB5ZWFyLCBtb250aCwgYW5kIGRheSBhdHRyaWJ1dGVzLCB0byBzZXQgdGhlCi0gICAgZGF0ZS4gWFNMVCBjYW4gcGFzcyBudW1iZXIgdmFsdWVzLCBidXQgdGhlc2UgYXJlIGNvbnZlcnRlZCBpbnRvIGRvdWJsZXMuPC9saT4KLSAgPGxpPlRoZSBmb3JtYXR0ZXIgdmFyaWFibGUgaG9sZHMgYSBTaW1wbGVEYXRlRm9ybWF0IG9iamVjdCwgYW5kIHRoZSBkYXRlIHZhcmlhYmxlIGhvbGRzIGEgRGF0ZSBvYmplY3QuCi0gICAgWFNMVCBkb2VzIG5vdCB1bmRlcnN0YW5kIGVpdGhlciBvZiB0aGVzZSB0eXBlcywgYnV0IHRoZXkgYXJlIHVzZWQgdG8gY2FsbCB0aGUgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQKLSAgICAgbWV0aG9kLiBJbiB0aGF0IGNhbGwsICRmb3JtYXR0ZXIgaXMgdGhlIG9iamVjdCwgYW5kICRkYXRlIGlzIHRoZSBhcmd1bWVudC4gVGhlIHN5bnRheCBmb3IgY2FsbGluZwotICAgICBKYXZhIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcyBpcyBkZXNjcmliZWQgYWJvdmUgaW4gPGxpbmsgYW5jaG9yPSJleHQtZnVuYy1jYWxscyI+RXh0ZW5zaW9uIGZ1bmN0aW9uIEphdmEgY2FsbHM8L2xpbms+LjwvbGk+ICAgIAotIDwvdWw+PGFuY2hvciBuYW1lPSJmb3JtYXQtZGF0ZS1zdHlsZXNoZWV0Ii8+ICAgCi08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3hzbDpzdHlsZXNoZWV0IAotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiAKLSAgICB2ZXJzaW9uPSIxLjAiICAgCi0gICAgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIKLSAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0iamF2YSImZ3Q7Ci0gICAgCi0gICZsdDshLS1PdGhlciB0ZW1wbGF0ZXMgZm9yIHRyYW5zZm9ybWluZyB0aGUgcmVzdCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgWE1MIHNvdXJjZSBkb2N1bWVudHMtLSZndDsKLSAgCi0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9ImRhdGUiJmd0OyAKLSAgICAmbHQ7eHNsOnZhcmlhYmxlIG5hbWU9InllYXIiIHNlbGVjdD0ic3RyaW5nKC4vQHllYXIpIi8mZ3Q7Ci0gICAgJmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJtb250aCIgc2VsZWN0PSJzdHJpbmcoLi9AbW9udGgpIi8mZ3Q7IAotICAgICZsdDt4c2w6dmFyaWFibGUgbmFtZT0iZGF5IiBzZWxlY3Q9InN0cmluZyguL0BkYXkpIi8mZ3Q7ICAgICAgICAgIAotICAgICZsdDt4c2w6dmFyaWFibGUgbmFtZT0iZm9ybWF0IiBzZWxlY3Q9InN0cmluZyguL0Bmb3JtYXQpIi8mZ3Q7Ci0KLSAgICAmbHQ7eHNsOnZhcmlhYmxlIG5hbWU9ImZvcm1hdHRlciIgICAgICAgCi0gICAgICAgIHNlbGVjdD0iamF2YTpqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdC5uZXcoJGZvcm1hdCkiLyZndDsKLQotICAgICZsdDt4c2w6dmFyaWFibGUgbmFtZT0iZGF0ZSIgCi0gICAgICAgIHNlbGVjdD0iamF2YTpJbnREYXRlLmdldERhdGUoJHllYXIsICRtb250aCwgJGRheSkiLyZndDsKLQotICAgICZsdDtwJmd0O0RhdGU6ICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJqYXZhOmZvcm1hdCgkZm9ybWF0dGVyLCAkZGF0ZSkiLyZndDsmbHQ7L3AmZ3Q7Ci0gICZsdDsveHNsOnRlbXBsYXRlJmd0OwotJmx0Oy94c2w6c3R5bGVzaGVldCZndDsgIAotPC9zb3VyY2U+Ci08L3MzPgotPC9zMj4KLTxzMiB0aXRsZT0iRXhhbXBsZXM6IHVzaW5nIEphdmEgYW5kIEphdmFTY3JpcHQgdG8gaW1wbGVtZW50IHRoZSBzYW1lIGV4dGVuc2lvbiI+Ci08cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgdHdvIGV4YW1wbGVzLiBUaGUgZmlyc3QgZXhhbXBsZSB1c2VzIGEgSmF2YSBleHRlbnNpb24gdG8gdHJhbnNmb3JtIGEgc2V0IG9mIG5hbWUgZWxlbWVudHMgIGludG8gYW4gYWxwaGFiZXRpY2FsIGFuZCBudW1iZXJlZCBsaXN0LiBUaGUgc2Vjb25kIGV4YW1wbGUgdXNlcyBhIEphdmFTY3JpcHQgc2NyaXB0IHRvIGRvIHRoZSBzYW1lLiBCb3RoIGV4YW1wbGVzIGluY2x1ZGUgZXF1aXZhbGVudCBleHRlbnNpb24gZWxlbWVudHMgYW5kIGFuIGV4dGVuc2lvbiBmdW5jdGlvbi48L3A+Ci08YW5jaG9yIG5hbWU9ImV4LWphdmEiLz4gCi08czMgdGl0bGU9IkphdmEgaW1wbGVtZW50YXRpb24iPgotPHA+TXlDb3VudGVyLmphdmE8L3A+Ci08c291cmNlPkltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIE15Q291bnRlciB7Ci0gIEhhc2h0YWJsZSBjb3VudGVycyA9IG5ldyBIYXNodGFibGUgKCk7Ci0KLSAgcHVibGljIE15Q291bnRlciAoKSAKLSAge30KLQotICBwdWJsaWMgdm9pZCBpbml0Ci0gICAgICAgICAgICAgKCBvcmcuYXBhY2hlLnhhbGFuLmV4dGVuc2lvbnMuWFNMUHJvY2Vzc29yQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuRWxlbUV4dGVuc2lvbkNhbGwgZXh0RWxlbSApIAotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBleHRFbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIFN0cmluZyB2YWx1ZSA9IGV4dEVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOwotICAgIGludCB2YWw7Ci0gICAgdHJ5IAotICAgIHsKLSAgICAgIHZhbCA9IEludGVnZXIucGFyc2VJbnQgKHZhbHVlKTsKLSAgICB9IAotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UgKCk7Ci0gICAgICB2YWwgPSAwOwotICAgIH0KLSAgICBjb3VudGVycy5wdXQgKG5hbWUsIG5ldyBJbnRlZ2VyICh2YWwpKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgcmVhZChTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBJbnRlZ2VyIGN2YWwgPSAoSW50ZWdlcikgY291bnRlcnMuZ2V0IChuYW1lKTsKLSAgICByZXR1cm4gKGN2YWwgPT0gbnVsbCkgPyAwIDogY3ZhbC5pbnRWYWx1ZSAoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluY3IKLSAgICAgICAgICAgICAoIG9yZy5hcGFjaGUueGFsYW4uZXh0ZW5zaW9ucy5YU0xQcm9jZXNzb3JDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtRXh0ZW5zaW9uQ2FsbCBleHRFbGVtKSAKLSAgewotICAgIFN0cmluZyBuYW1lID0gZXh0RWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLSAgICBJbnRlZ2VyIGN2YWwgPSAoSW50ZWdlcikgY291bnRlcnMuZ2V0KG5hbWUpOwotICAgIGludCBudmFsID0gKGN2YWwgPT0gbnVsbCkgPyAwIDogKGN2YWwuaW50VmFsdWUgKCkgKyAxKTsKLSAgICBjb3VudGVycy5wdXQgKG5hbWUsIG5ldyBJbnRlZ2VyIChudmFsKSk7Ci0gIH0KLX0KLTwvc291cmNlPgotPHA+QW4gWE1MIHNvdXJjZSBkb2N1bWVudDo8L3A+Ci08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O2RvYyZndDsKLSAgJmx0O25hbWUgZmlyc3Q9IkRhdmlkIiBsYXN0PSJNYXJzdG9uIi8mZ3Q7Ci0gICZsdDtuYW1lIGZpcnN0PSJEYXZpZCIgbGFzdD0iQmVydG9uaSIvJmd0OwotICAmbHQ7bmFtZSBmaXJzdD0iRG9uYWxkIiBsYXN0PSJMZXNsaWUiLyZndDsKLSAgJmx0O25hbWUgZmlyc3Q9IkVtaWx5IiBsYXN0PSJGYXJtZXIiLyZndDsKLSAgJmx0O25hbWUgZmlyc3Q9IkphY2siIGxhc3Q9IkRvbm9odWUiLyZndDsKLSAgJmx0O25hbWUgZmlyc3Q9Ik15cmlhbSIgbGFzdD0iTWlkeSIvJmd0OwotICAmbHQ7bmFtZSBmaXJzdD0iUGF1bCIgbGFzdD0iRGljayIvJmd0OwotICAmbHQ7bmFtZSBmaXJzdD0iUm9iZXJ0IiBsYXN0PSJXZWlyIi8mZ3Q7Ci0gICZsdDtuYW1lIGZpcnN0PSJTY290dCIgbGFzdD0iQm9hZyIvJmd0OwotICAmbHQ7bmFtZSBmaXJzdD0iU2hhbmUiIGxhc3Q9IkN1cmN1cnUiLyZndDsKLSZsdDsvZG9jJmd0Ozwvc291cmNlPgotPHA+VGhlIHN0eWxlc2hlZXQ6PC9wPgotPHNvdXJjZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsgCi0mbHQ7eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICAgICAgICAgICAgICAgIHhtbG5zOmNvdW50ZXI9Ik15Q291bnRlciIKLSAgICAgICAgICAgICAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0iY291bnRlciIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiJmd0OwotCi0gICZsdDtseHNsdDpjb21wb25lbnQgcHJlZml4PSJjb3VudGVyIgotICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzPSJpbml0IGluY3IiIGZ1bmN0aW9ucz0icmVhZCImZ3Q7Ci0gICAgJmx0O2x4c2x0OnNjcmlwdCBsYW5nPSJqYXZhY2xhc3MiIHNyYz0ieGFsYW46Ly9NeUNvdW50ZXIiLyZndDsKLSAgJmx0Oy9seHNsdDpjb21wb25lbnQmZ3Q7Ci0KLSAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0iLyImZ3Q7Ci0gICAgJmx0O0hUTUwmZ3Q7Ci0gICAgICAmbHQ7SDEmZ3Q7TmFtZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyJmx0Oy9IMSZndDsKLSAgICAgICZsdDtjb3VudGVyOmluaXQgbmFtZT0iaW5kZXgiIHZhbHVlPSIxIi8mZ3Q7Ci0gICAgICAmbHQ7eHNsOmZvci1lYWNoIHNlbGVjdD0iZG9jL25hbWUiJmd0OwotICAgICAgICAmbHQ7eHNsOnNvcnQgc2VsZWN0PSJAbGFzdCIvJmd0OwotICAgICAgICAmbHQ7eHNsOnNvcnQgc2VsZWN0PSJAZmlyc3QiLyZndDsKLSAgICAgICAgJmx0O3AmZ3Q7Ci0gICAgICAgICZsdDt4c2w6dGV4dCZndDtbJmx0Oy94c2w6dGV4dCZndDsKLSAgICAgICAgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50ZXI6cmVhZCgnaW5kZXgnKSIvJmd0OwotICAgICAgICAmbHQ7eHNsOnRleHQmZ3Q7XS4gJmx0Oy94c2w6dGV4dCZndDsKLSAgICAgICAgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYXN0Ii8mZ3Q7Ci0gICAgICAgICZsdDt4c2w6dGV4dCZndDssICZsdDsveHNsOnRleHQmZ3Q7Ci0gICAgICAgICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmlyc3QiLyZndDsKLSAgICAgICAgJmx0Oy9wJmd0OwotICAgICAgICAmbHQ7Y291bnRlcjppbmNyIG5hbWU9ImluZGV4Ii8mZ3Q7Ci0gICAgICAmbHQ7L3hzbDpmb3ItZWFjaCZndDsKLSAgICAmbHQ7L0hUTUwmZ3Q7Ci0gICZsdDsveHNsOnRlbXBsYXRlJmd0OwotIAotJmx0Oy94c2w6c3R5bGVzaGVldCZndDsKLTwvc291cmNlPgotPHA+VHJhbnNmb3JtYXRpb24gb3V0cHV0OjwvcD4KLTxzb3VyY2U+Jmx0O0hUTUwmZ3Q7Ci0mbHQ7SDEmZ3Q7TmFtZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyJmx0Oy9IMSZndDsKLSZsdDtwJmd0O1sxXS4gQmVydG9uaSwgRGF2aWQmbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtbMl0uIEJvYWcsIFNjb3R0Jmx0Oy9wJmd0OwotJmx0O3AmZ3Q7WzNdLiBDdXJjdXJ1LCBTaGFuZSZsdDsvcCZndDsKLSZsdDtwJmd0O1s0XS4gRGljaywgUGF1bCZsdDsvcCZndDsKLSZsdDtwJmd0O1s1XS4gRG9ub2h1ZSwgSmFjayZsdDsvcCZndDsKLSZsdDtwJmd0O1s2XS4gRmFybWVyLCBFbWlseSZsdDsvcCZndDsKLSZsdDtwJmd0O1s3XS4gTGVzbGllLCBEb25hbGQmbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtbOF0uIE1hcnN0b24sIERhdmlkJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7WzldLiBNaWR5LCBNeXJpYW0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtbMTBdLiBXZWlyLCBSb2JlcnQmbHQ7L3AmZ3Q7Ci0mbHQ7L0hUTUwmZ3Q7PC9zb3VyY2U+Ci08L3MzPjxhbmNob3IgbmFtZT0iZXgtamF2YXNjcmlwdCIvPiAKLTxzMyB0aXRsZT0iSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiI+Ci08cD48L3A+Ci08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OyAKLSZsdDt4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICAgICAgICAgICAgICB4bWxuczpseHNsdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiCi0gICAgICAgICAgICAgICAgeG1sbnM6Y291bnRlcj0iTXlDb3VudGVyIgotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJjb3VudGVyIgotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCImZ3Q7Ci0KLSAgJmx0O2x4c2x0OmNvbXBvbmVudCBwcmVmaXg9ImNvdW50ZXIiCi0gICAgICAgICAgICAgICAgICAgZWxlbWVudHM9ImluaXQgaW5jciIgZnVuY3Rpb25zPSJyZWFkIiZndDsKLSAgICAmbHQ7bHhzbHQ6c2NyaXB0IGxhbmc9ImphdmFzY3JpcHQiJmd0OwotICAgICAgdmFyIGNvdW50ZXJzID0gbmV3IEFycmF5KCk7Ci0KLSAgICAgIGZ1bmN0aW9uIGluaXQgKHhzbHByb2MsIGVsZW0pIHsKLSAgICAgICAgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlICgibmFtZSIpOwotICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KGVsZW0uZ2V0QXR0cmlidXRlICgidmFsdWUiKSk7Ci0gICAgICAgIGNvdW50ZXJzW25hbWVdID0gdmFsdWU7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotCi0gICAgICBmdW5jdGlvbiByZWFkIChuYW1lKSB7Ci0gICAgICAgIC8vIFJldHVybiBhIHN0cmluZy4KLSAgICAgICAgcmV0dXJuICIiICsgKGNvdW50ZXJzW25hbWVdKTsKLSAgICAgIH0KLQotICAgICAgZnVuY3Rpb24gaW5jciAoeHNscHJvYywgZWxlbSkKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlICgibmFtZSIpOwotICAgICAgICBjb3VudGVyc1tuYW1lXSsrOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAmbHQ7L2x4c2x0OnNjcmlwdCZndDsKLSAgJmx0Oy9seHNsdDpjb21wb25lbnQmZ3Q7Ci0KLSAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0iLyImZ3Q7Ci0gICAgJmx0O0hUTUwmZ3Q7Ci0gICAgICAmbHQ7SDEmZ3Q7TmFtZXMgaW4gYWxwaGF0ZWJpY2FsIG9yZGVyJmx0Oy9IMSZndDsKLSAgICAgICZsdDtjb3VudGVyOmluaXQgbmFtZT0iaW5kZXgiIHZhbHVlPSIxIi8mZ3Q7Ci0gICAgICAmbHQ7eHNsOmZvci1lYWNoIHNlbGVjdD0iZG9jL25hbWUiJmd0OwotICAgICAgICAmbHQ7eHNsOnNvcnQgc2VsZWN0PSJAbGFzdCIvJmd0OwotICAgICAgICAmbHQ7eHNsOnNvcnQgc2VsZWN0PSJAZmlyc3QiLyZndDsKLSAgICAgICAgJmx0O3AmZ3Q7Ci0gICAgICAgICZsdDt4c2w6dGV4dCZndDtbJmx0Oy94c2w6dGV4dCZndDsKLSAgICAgICAgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50ZXI6cmVhZCgnaW5kZXgnKSIvJmd0OwotICAgICAgICAmbHQ7eHNsOnRleHQmZ3Q7XS4gJmx0Oy94c2w6dGV4dCZndDsKLSAgICAgICAgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYXN0Ii8mZ3Q7Ci0gICAgICAgICZsdDt4c2w6dGV4dCZndDssICZsdDsveHNsOnRleHQmZ3Q7Ci0gICAgICAgICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmlyc3QiLyZndDsKLSAgICAgICAgJmx0Oy9wJmd0OwotICAgICAgICAmbHQ7Y291bnRlcjppbmNyIG5hbWU9ImluZGV4Ii8mZ3Q7Ci0gICAgICAmbHQ7L3hzbDpmb3ItZWFjaCZndDsKLSAgICAmbHQ7L0hUTUwmZ3Q7Ci0gICZsdDsveHNsOnRlbXBsYXRlJmd0OwotIAotJmx0Oy94c2w6c3R5bGVzaGVldCZndDsKLTwvc291cmNlPgotPHA+VGhpcyBzdHlsZXNoZWV0IHByb2R1Y2VzIHRoZSBzYW1lIG91dHB1dCBhcyB0aGUgcHJlY2VkaW5nIGV4YW1wbGUgd2l0aCB0aGUgSmF2YSBleHRlbnNpb24uPC9wPgotPC9zMz4KLTwvczI+Ci08L3MxPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94YWxhbi9leHRlbnNpb25zbGliLnhtbCBiL3hkb2NzL3NvdXJjZXMveGFsYW4vZXh0ZW5zaW9uc2xpYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MTVjODAuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94YWxhbi9leHRlbnNpb25zbGliLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+IAotPCFET0NUWVBFIHMxIFNZU1RFTSAiLi4vLi4vc3R5bGUvZHRkL2RvY3VtZW50LmR0ZCI+Ci08IS0tIAotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLTxzMSB0aXRsZT0iRXh0ZW5zaW9ucyBsaWJyYXJ5Ij4KLTx1bD4KLTxsaT48bGluayBhbmNob3I9ImludHJvIj5JbnRyb2R1Y3Rpb248L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InhhbGFubnMiPlhhbGFuIG5hbWVzcGFjZTwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0icmVkaXJlY3QiPlJlZGlyZWN0PC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJub2Rlc2V0Ij5ub2Rlc2V0PC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJpbnRlcnNlY3Rpb24iPmludGVyc2VjdGlvbjwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iZGlmZmVyZW5jZSI+ZGlmZmVyZW5jZTwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iZGlzdGluY3QiPmRpc3RpbmN0PC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJoYXNzYW1lbm9kZXMiPmhhc1NhbWVOb2RlczwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0ic3FsIj5TUUwgZXh0ZW5zaW9uczwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iZXZhbHVhdGUiPmV2YWx1YXRlPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJ0b2tlbml6ZSI+dG9rZW5pemU8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9Imdyb3VwaXRlbSI+Z3JvdXAgYW5kIGl0ZW08L2xpbms+IDxyZWY+KHRvIGJlIGRvbmUpPC9yZWY+PC9saT4KLTxsaT48bGluayBhbmNob3I9InR5cGUiPnR5cGU8L2xpbms+IDxyZWY+KHRvIGJlIGRvbmUpPC9yZWY+PC9saT4KLTxsaT48bGluayBhbmNob3I9InRvZGF0ZSI+dG9EYXRlPC9saW5rPiA8cmVmPih0byBiZSBkb25lKTwvcmVmPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJmb3JtYXRkYXRlIj5mb3JtYXREYXRlPC9saW5rPiA8cmVmPih0byBiZSBkb25lKTwvcmVmPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJncmVwIj5ncmVwPC9saW5rPiA8cmVmPih0byBiZSBkb25lKTwvcmVmPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJmb3JlYWNodG9rZW4iPmZvckVhY2hUb2tlbjwvbGluaz4gPHJlZj4odG8gYmUgZG9uZSk8L3JlZj48L2xpPgotPGxpPkV4YW1wbGVzOiA8bGluayBhbmNob3I9ImV4LXJlZGlyZWN0Ij5SZWRpcmVjdDwvbGluaz4sIDxsaW5rIGFuY2hvcj0iZXgtbm9kZXNldCI+bm9kZXNldDwvbGluaz4sIDxsaW5rIGFuY2hvcj0iZXgtc3FsIj5TUUwgbGlicmFyeTwvbGluaz48L2xpPgotPC91bD48YW5jaG9yIG5hbWU9ImludHJvIi8+Ci08czIgdGl0bGU9ICJJbnRyb2R1Y3Rpb24iPgotPHA+RXh0ZW5zaW9uIGVsZW1lbnRzIGFuZCBmdW5jdGlvbnMgcHJvdmlkZSBhIHBvd2VyZnVsIG1lY2hhbmlzbQotZm9yIGV4dGVuZGluZyBhbmQgc2ltcGxpZnlpbmcgd2hhdCB5b3UgY2FuIGRvIHdpdGggYW4gWExTVCBwcm9jZXNzb3IgbGlrZQotWGFsYW4uIFdpdGggaW5wdXQgYW5kIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgWE1MIG9wZW4tc291cmNlIGRldmVsb3BlciBjb21tdW5pdHksIHdlIGFyZSB3b3JraW5nIG9uIHBsYWNpbmcgdGhlIG1vc3QgdXNlZnVsCi1leHRlbnNpb25zIGluIGFuIGV4dGVuc2lvbnMgbGlicmFyeSBkaXN0cmlidXRlZCB3aXRoICZ4c2x0NGo7LiBJZiB5b3UgaGF2ZSBpZGVhcyBhbmQvb3IgY29udHJpYnV0aW9ucyB5b3Ugd291bGQgbGlrZSB0byBtYWtlLCBwbGVhc2UgZW1haWwgdXMgYXQgdGhlIDxodW1hbi1yZXNvdXJjZS1yZWYgaWRyZWY9InhhbGFuZGV2Ii8+LjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJ4YWxhbm5zIi8+Ci08czIgdGl0bGU9IlhhbGFuIG5hbWVzcGFjZSI+Ci08cD5XaGVyZSBpdCBtYWtlcyBzZW5zZSwgd2UgYXJlIHBsYWNpbmcgdGhlIG5ldyBYYWxhbiBleHRlbnNpb25zIGluIHRoZSBvcmcuYXBhY2hlLnhhbGFuLmxpYi5FeHRlbnNpb25zIGNsYXNzIGFuZCB3ZSBoYXZlIGRlZmluZWQgYSBuYW1lc3BhY2UgZm9yIHRoaXMgY2xhc3M6PC9wPgotPHA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGNvZGU+aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuPC9jb2RlPjwvcD4KLTxwPklmIHlvdSBhcmUgY2FsbGluZyAmeHNsdDRqOy1zdXBwbGllZCBleHRlbnNpb25zLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZGVmaW5lIHRoaXMgbmFtZXNwYWNlIGluIHlvdXIgc3R5bGVzaGVldCBlbGVtZW50LCBhbmQgY2FsbCB0aGUgZXh0ZW5zaW9uIHVzaW5nIHRoZSBuYW1lc3BhY2UgcHJlZml4IHRoYXQgeW91IGhhdmUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZXNwYWNlLiBUaGF0IHdheSwgaWYgd2UgbGF0ZXIgcmVvcmdhbml6ZSBob3cgdGhlICZ4c2x0NGo7LXN1cHBsaWVkIGV4dGVuc2lvbnMgYXJlIHN0b3JlZCwgeW91IHdvbid0IGhhdmUgdG8gbW9kaWZ5IHlvdXIgc3R5bGVzaGVldC48L3A+Ci08cD5Gb3IgYW4gZXhhbXBsZSB0aGF0IHVzZXMgdGhpcyBuYW1lc3BhY2UsIHNlZSA8bGluayBhbmNob3I9ImV4LW5vZGVzZXQiPkV4YW1wbGUgd2l0aCB0aGUgbm9kZXNldCBleHRlbnNpb24gZnVuY3Rpb248L2xpbms+LjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJyZWRpcmVjdCIvPgotPHMyIHRpdGxlPSAiUmVkaXJlY3QiPgotPHA+QSBzdGFuZGFyZCBYU0wgdHJhbnNmb3JtYXRpb24gaW52b2x2ZXMgYW4gWFNMIHN0eWxlc2hlZXQsIGFuIFhNTCBzb3VyY2UgdHJlZSwgYW5kIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQgdHJlZS4gVGhlIHRyYW5zZm9ybWF0aW9uIHNlbmRzIHRoZSBlbnRpcmUgcmVzdWx0IHRvIGEgc2luZ2xlIDxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS90cmF4L1Jlc3VsdC5odG1sIj5vcmcuYXBhY2hlLnRyYXguUmVzdWx0PC9qdW1wPiBvYmplY3QuPC9wPiAKLTxwPlRoZSBSZWRpcmVjdCBleHRlbnNpb24gCi0oPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvZXh0ZW5zaW9ucy9SZWRpcmVjdC5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLnhzbHQuZXh0ZW5zaW9ucy5SZWRpcmVjdDwvanVtcD4pIHN1cHBsaWVzIHRocmVlIGV4dGVuc2lvbiBlbGVtZW50cyB0aGF0IHlvdSBjYW4gdXNlIHRvIHJlZGlyZWN0IHBvcnRpb25zIG9mIHlvdXIgdHJhbnNmb3JtYXRpb24gb3V0cHV0IHRvIG11bHRpcGxlIGZpbGVzOiAmbHQ7b3BlbiZndDssICZsdDt3cml0ZSZndDssIGFuZCAmbHQ7Y2xvc2UmZ3Q7LiBJZiB5b3UgdXNlIHRoZSAmbHQ7d3JpdGUmZ3Q7IGVsZW1lbnQgYWxvbmUsIHRoZSBleHRlbnNpb24gb3BlbnMgYSBmaWxlLCB3cml0ZXMgdG8gaXQsIGFuZCBjbG9zZXMgdGhlIGZpbGUgaW1tZWRpYXRlbHkuIElmIHlvdSB3YW50IGV4cGxpY2l0IGNvbnRyb2wgb3ZlciB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBvZiBmaWxlcywgdXNlICZsdDt3cml0ZSZndDsgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgJmx0O29wZW4mZ3Q7IGFuZCAmbHQ7Y2xvc2UmZ3Q7IGVsZW1lbnRzLjwvcD4KLTxwPkVhY2ggb2YgdGhlc2UgZWxlbWVudHMgaW5jbHVkZXMgYSBmaWxlIGF0dHJpYnV0ZSBhbmQvb3IgYSBzZWxlY3QgYXR0cmlidXRlIHRvIGRlc2lnbmF0ZSB0aGUgb3V0cHV0IGZpbGUuIFRoZSBmaWxlIGF0dHJpYnV0ZSB0YWtlcyBhIHN0cmluZywgc28geW91IGNhbiB1c2UgaXQgdG8gZGlyZWN0bHkgc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4gVGhlIHNlbGVjdCBhdHRyaWJ1dGUgdGFrZXMgYW4gWFBhdGggZXhwcmVzc2lvbiwgc28geW91IGNhbiB1c2UgaXQgdG8gZHluYW1pY2FsbHkgZ2VuZXJhdGUgdGhlIG91dHB1dCBmaWxlIG5hbWUuIElmIHlvdSBpbmNsdWRlIGJvdGggYXR0cmlidXRlcywgdGhlIFJlZGlyZWN0IGV4dGVuc2lvbiBmaXJzdCBldmFsdWF0ZXMgdGhlIHNlbGVjdCBhdHRyaWJ1dGUsIGFuZCBmYWxscyBiYWNrIHRvIHRoZSBmaWxlIGF0dHJpYnV0ZSBpZiB0aGUgc2VsZWN0IGF0dHJpYnV0ZSBleHByZXNzaW9uIGRvZXMgbm90IHJldHVybiBhIHZhbGlkIGZpbGUgbmFtZS48L3A+Ci08YW5jaG9yIG5hbWU9ImV4LXJlZGlyZWN0Ii8+IAotPHMzIHRpdGxlPSJFeGFtcGxlIHdpdGggdGhlIFJlZGlyZWN0IGV4dGVuc2lvbiI+Ci08cD5TdXBwb3NlIHlvdSBhcmUgb3V0cHV0dGluZyB0aGUgYnVsayBvZiB5b3VyIHJlc3VsdCB0cmVlIHRvIG9uZSBmaWxlLCBidXQgeW91IHdhbnQgdG8gb3V0cHV0IHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiBhbGwgJmx0O2ZvbyZndDsgZWxlbWVudHMgYW5kIHRoZWlyIGNoaWxkcmVuIHRvIGFub3RoZXIgZmlsZS4gVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgb2YgdGhlIFhNTCBzb3VyY2U6PC9wPgotPHNvdXJjZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsgCi0mbHQ7ZG9jJmd0OwotICAmbHQ7Zm9vIGZpbGU9ImZvby5vdXQiJmd0OwotICAgIFRlc3RpbmcgUmVkaXJlY3QgZXh0ZW5zaW9uOgotICAgICAgJmx0O2JhciZndDtBIGZvbyBzdWJlbGVtZW50IHRleHQgbm9kZSZsdDsvYmFyJmd0OwotICAmbHQ7L2ZvbyZndDsKLSAgJmx0O21haW4mZ3Q7Ci0gICAgRXZlcnl0aGluZyBlbHNlCi0gICZsdDsvbWFpbiZndDsgIAotJmx0Oy9kb2MmZ3Q7PC9zb3VyY2U+Ci08cD5UaGlzIHN0eWxlc2hlZXQgcmVkaXJlY3RzIHBhcnQgb2YgdGhlIG91dHB1dCB0byBhIHNlY29uZGFyeSBmaWxlOjwvcD4KLTxzb3VyY2U+Ci0mbHQ7eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKLSAgICB4bWxuczpyZWRpcmVjdD0ib3JnLmFwYWNoZS54YWxhbi54c2x0LmV4dGVuc2lvbnMuUmVkaXJlY3QiCi0gICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0IiZndDsKLQotICAmbHQ7eHNsOnRlbXBsYXRlIG1hdGNoPSIvIiZndDsKLSAgICAmbHQ7c3RhbmRhcmQtb3V0Jmd0OwotICAgICAgU3RhbmRhcmQgb3V0cHV0OgotICAgICAgJmx0O3hzbDphcHBseS10ZW1wbGF0ZXMvJmd0OwotICAgICZsdDsvc3RhbmRhcmQtb3V0Jmd0OwotICAmbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKLSAgCi0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Im1haW4iJmd0OwotICAgICZsdDttYWluJmd0OwotICAgICAgJmx0O3hzbDphcHBseS10ZW1wbGF0ZXMvJmd0OwotICAgICZsdDsvbWFpbiZndDsKLSAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7Ci0gIAotICAmbHQ7eHNsOnRlbXBsYXRlIG1hdGNoPSIvZG9jL2ZvbyImZ3Q7Ci0gICAgJmx0O3JlZGlyZWN0OndyaXRlIHNlbGVjdD0iQGZpbGUiJmd0OwotICAgICAgJmx0O2Zvby1vdXQmZ3Q7Ci0gICAgICAgICZsdDt4c2w6YXBwbHktdGVtcGxhdGVzLyZndDsKLSAgICAgICZsdDsvZm9vLW91dCZndDsKLSAgICAmbHQ7L3JlZGlyZWN0OndyaXRlJmd0OwotICAmbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKLSAgCi0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9ImJhciImZ3Q7Ci0gICAgJmx0O2Zvb2Jhci1vdXQmZ3Q7Ci0gICAgICAmbHQ7eHNsOmFwcGx5LXRlbXBsYXRlcy8mZ3Q7Ci0gICAgJmx0Oy9mb29iYXItb3V0Jmd0OwotICAmbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKLSAgCi0mbHQ7L3hzbDpzdHlsZXNoZWV0Jmd0Ozwvc291cmNlPgotPHA+VGhlIHN0YW5kYXJkIG91dHB1dCBpczo8L3A+Ci08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7Ci0mbHQ7c3RhbmRhcmQtb3V0Jmd0OwotICBTdGFuZGFyZCBvdXRwdXQ6Ci0gICZsdDttYWluJmd0OwotICAgIEV2ZXJ5dGhpbmcgZWxzZS4KLSAgJmx0Oy9tYWluJmd0OwotJmx0O3N0YW5kYXJkLW91dCZndDs8L3NvdXJjZT4KLTxwPlRoZSBvdXRwdXQgcmVkaXJlY3RlZCB0byBmb28ub3V0IGlzOjwvcD4KLTxzb3VyY2U+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKLSZsdDtmb28tb3V0Jmd0OwotICAgIFRlc3RpbmcgUmVkaXJlY3QgZXh0ZW5zaW9uOgotICAgICZsdDtmb29iYXItb3V0Jmd0O2ZvbyBzdWJlbGVtZW50IHRleHQgbm9kZSZsdDsvZm9vYmFyLW91dCZndDsKLSAgJmx0Oy9mb28tb3V0Jmd0Ozwvc291cmNlPgotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlIFJlZGlyZWN0IGV4dGVuc2lvbiB0byBzZW5kIG91dHB1dCB0byBtdWx0aXBsZSBmaWxlcywgZXhhbWluZSB0aGUgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0iZXh0MSI+U2ltcGxlUmVkaXJlY3Q8L2xpbms+IHNhbXBsZSBhbmQgc2VlIHRoZSA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vbGliL1JlZGlyZWN0Lmh0bWwiPlJlZGlyZWN0PC9qdW1wPiBjbGFzcyBKYXZhZG9jLjwvcD4gIAotPC9zMz48L3MyPjxhbmNob3IgbmFtZT0ibm9kZXNldCIvPgotPHMyIHRpdGxlPSAibm9kZXNldCI+Ci08cD5JbXBsZW1lbnRlZCBpbiA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vbGliL0V4dGVuc2lvbnMuaHRtbCI+b3JnLmFwYWNoZS54YWxhbi5saWIuRXh0ZW5zaW9uczwvanVtcD4sPGJyLz4KLTxjb2RlPm5vZGVzZXQgKHJlc3VsdC10cmVlLWZyYWdtZW50KTwvY29kZT4gIGNhc3RzIGEgcmVzdWx0IHRyZWUgZnJhZ21lbnQgaW50byBhIG5vZGUtc2V0LjwvcD4KLTxub3RlPldoZW4geW91IGJpbmQgYSB2YXJpYWJsZSB0byBhIHRlbXBsYXRlLCByYXRoZXIgdGhhbiB0byB0aGUgdmFsdWUgZ2VuZXJhdGVkIGJ5IGEgc2VsZWN0IGV4cHJlc3Npb24sIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGlzIHJlc3VsdCB0cmVlIGZyYWdtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjc2VjdGlvbi1SZXN1bHQtVHJlZS1GcmFnbWVudHMiPlJlc3VsdCBUcmVlIEZyYWdtZW50czwvanVtcD4uPC9ub3RlPgotPGFuY2hvciBuYW1lPSJleC1ub2Rlc2V0Ii8+Ci08czMgdGl0bGU9IkV4YW1wbGUgd2l0aCB0aGUgbm9kZXNldCBleHRlbnNpb24gZnVuY3Rpb24iPgotPHA+VGhlIGZvbGxvd2luZyBzdHlsZXNoZWV0IHVzZXMgdGhlIG5vZGVzZXQgZXh0ZW5zaW9uIGZ1bmN0aW9uIHRvIGNhc3QgYSByZXN1bHQgdHJlZSBmcmFnbWVudCBpbnRvIGEgbm9kZS1zZXQgdGhhdCBjYW4gdGhlbiBiZSBuYXZpZ2F0ZWQgaW4gc3RhbmRhcmQgWFBhdGggbWFubmVyLiBJdCB1c2VzIHRoZSBodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4gbmFtZXNwYWNlIHRvIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBub2Rlc2V0KCkgbWV0aG9kIGluIHhtbC5hcGFjaGUueGFsYW4ubGliLkV4dGVuc2lvbnMuPC9wPgotPHNvdXJjZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSZsdDt4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgICAgIHhtbG5zOnhhbGFuPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4iCi0gICAgICAgICAgICAgICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhhbGFuIiZndDsKLSZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iJmd0OwotICAmbHQ7b3V0Jmd0OwotCSAgJmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJydGYiJmd0OwotICAgICAgJmx0O2RvY2VsZW0mZ3Q7Ci0gICAgICAgICZsdDtlbGVtMSZndDsKLSAgICAgICAgICAmbHQ7ZWxlbTFhJmd0O0VMRU1FTlQxQSZsdDsvZWxlbTFhJmd0OwotICAgICAgICAgICZsdDtlbGVtMWImZ3Q7LEVMRU1FTlQxQiZsdDsvZWxlbTFiJmd0OwotICAgICAgICAmbHQ7L2VsZW0xJmd0OwotICAgICAgICAmbHQ7ZWxlbTImZ3Q7Ci0gICAgICAgICAgJmx0O2VsZW0yYSZndDtFTEVNRU5UMkEmbHQ7L2VsZW0yYSZndDsKLSAgICAgICAgJmx0Oy9lbGVtMiZndDsKLSAgICAgICZsdDsvZG9jZWxlbSZndDsKLSAgICAmbHQ7L3hzbDp2YXJpYWJsZSZndDsgICAgIAotICAgICAgJmx0O3hzbDpmb3ItZWFjaCBzZWxlY3Q9InhhbGFuOm5vZGVzZXQoJHJ0ZikvZG9jZWxlbS8vKiImZ3Q7Ci0gICAgICAgICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8mZ3Q7Jmx0O3hzbDp0ZXh0Jmd0OywmbHQ7L3hzbDp0ZXh0Jmd0OwotICAgICAgJmx0Oy94c2w6Zm9yLWVhY2g+Ci0gICZsdDsvb3V0PgotJmx0Oy94c2w6dGVtcGxhdGU+IAotJmx0Oy94c2w6c3R5bGVzaGVldCZndDs8L3NvdXJjZT4KLTxwPlRoZSBvdXRwdXQgb2YgcnVubmluZyB0aGlzIHN0eWxlc2hlZXQgKHdpdGggYW55IFhNTCBpbnB1dCBzb3VyY2UpIGlzIGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgdGhlIGVsZW1lbnQgbmFtZXMgaW4gdGhlIG5vZGUtc2V0PGJyLz4KLSZuYnNwOyZuYnNwOzxjb2RlPiZsdDtvdXQmZ3Q7ZWxlbTEsZWxlbTFhLGVsZW0xYixlbGVtMixlbGVtMmEmbHQ7L291dCZndDs8L2NvZGU+PC9wPgotPG5vdGU+Rm9yIGlsbHVzdHJhdGlvbiBwdXJwb3NlcywgdGhlIHByZWNlZGluZyBzdHlsZXNoZWV0IHBheXMgbm8gYXR0ZW50aW9uIHRvIHRoZSBzdHJ1Y3R1cmUgYW5kIGNvbnRlbnQgb2YgdGhlIFhNTCBpbnB1dCBkb2N1bWVudC4gSW5zdGVhZCwgaXQgcHJvY2Vzc2VzIHRoZSB0ZW1wbGF0ZSAoaW4gdGhlIHN0eWxlc2hlZXQpIGJvdW5kIHRvIHRoZSB2YXJpYWJsZSBuYW1lZCBydGYuPC9ub3RlPgotCi08L3MzPgotPC9zMj48YW5jaG9yIG5hbWU9ImludGVyc2VjdGlvbiIvPgotPHMyIHRpdGxlPSJpbnRlcnNlY3Rpb24iPgotPHA+SW1wbGVtZW50ZWQgaW4gPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9FeHRlbnNpb25zLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ubGliLkV4dGVuc2lvbnM8L2p1bXA+LDxici8+Ci08Y29kZT5pbnRlcnNlY3Rpb24gKG5vZGUtc2V0MSwgbm9kZS1zZXQyKTwvY29kZT4gIGZ1bmN0aW9uIHJldHVybnMgYSBub2RlLXNldCB3aXRoIGFsbCBub2RlcyB0aGF0IGFyZSBpbiBuczEgYW5kIGluIG5zMiAuPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImRpZmZlcmVuY2UiLz4KLTxzMiB0aXRsZT0gImRpZmZlcmVuY2UiPgotPHA+SW1wbGVtZW50ZWQgaW4gPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9FeHRlbnNpb25zLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ubGliLkV4dGVuc2lvbnM8L2p1bXA+LDxici8+Ci08Y29kZT5kaWZmZXJlbmNlKG5vZGUtc2V0MSwgbm9kZS1zZXQyKTwvY29kZT4gcmV0dXJucyBhIG5vZGUtc2V0IHdpdGggdGhlIG5vZGVzIGluIG5vZGUtc2V0MSBhbmQgbm90IGluIG5vZGUtc2V0Mi48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0iZGlzdGluY3QiLz4KLTxzMiB0aXRsZT0gImRpc3RpbmN0Ij4KLSA8cD5JbXBsZW1lbnRlZCBpbiA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vbGliL0V4dGVuc2lvbnMuaHRtbCI+b3JnLmFwYWNoZS54YWxhbi5saWIuRXh0ZW5zaW9uczwvanVtcD4sPGJyLz4KLSBkaXN0aW5jdCAobm9kZS1zZXQpIHJldHVybnMgYSBub2RlLXNldCBjb250YWluaW5nIG5vZGVzIHdpdGggZGlzdGluY3Qgc3RyaW5nIHZhbHVlcy4gSWYgbW9yZSB0aGFuIG9uZSBub2RlIGluIHRoZSBub2RlLXNldCAKLSBjb250YWlucyB0aGUgc2FtZSB0ZXh0IG5vZGUgdmFsdWUsIGRpc3RpbmN0IG9ubHkgcmV0dXJucyB0aGUgZmlyc3Qgb2YgdGhlc2Ugbm9kZXMgdGhhdCBpdCBmaW5kcy48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0iaGFzc2FtZW5vZGVzIi8+Ci08czIgdGl0bGU9ICJoYXNTYW1lTm9kZXMiPgotPHA+SW1wbGVtZW50ZWQgaW4gPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9FeHRlbnNpb25zLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ubGliLkV4dGVuc2lvbnM8L2p1bXA+LDxici8+Ci08Y29kZT5oYXNTYW1lTm9kZXMobm9kZS1zZXQxLCBub2RlLXNldDIpPC9jb2RlPiByZXR1cm5zIHRydWUgaWYgYm90aCBub2RlLXNldDEgYW5kIG5vZGUtc2V0MiBjb250YWluIGV4YWN0bHkgdGhlIHNhbWUgc2V0IG9mIG5vZGVzLjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJzcWwiLz4KLTxzMiB0aXRsZT0gIlNRTCBsaWJyYXJ5Ij4KLTxwPjxlbT4qKkV4cGVyaW1lbnRhbCoqPC9lbT4gUHJvdmlkZXMgZXh0ZW5zaW9uIGZ1bmN0aW9ucyBmb3IgY29ubmVjdGluZyB0byBhIEpEQkMgZGF0YSBzb3VyY2UsIGV4ZWN1dGluZyBhIHF1ZXJ5LAotYW5kIHdvcmtpbmcgaW5jcmVtZW50YWxseSB0aHJvdWdoICJzdHJlYW1hYmxlIiByZXN1bHQgc2V0LjwvcD4KLTxwPjxlbT5UaGUgU1FMIGV4dGVuc2lvbiB1c2Ugb2YgYSBzaW5nbGUgcm93LXNldCBub2RlIHRvIGluY3JlbWVudGFsbHkgcmV0dXJuIGEgcXVlcnkgcmVzdWx0IHNldCBpcyBleHBlcmltZW50YWwuIEtlZXAgaW4gbWluZCB0aGF0IHlvdQotY2FuIG9ubHkgYWNjZXNzIHJvdyBlbGVtZW50cyBvbmUgYXQgYSB0aW1lIG1vdmluZyBmb3J3YXJkIHRocm91Z2ggdGhlIHJlc3VsdCBzZXQuIFRoZSB1c2Ugb2YgWFBhdGggZXhwcmVzc2lvbnMgaW4geW91ciBzdHlsZXNoZWV0LCBmb3IKLWV4YW1wbGUsIHRoYXQgYXR0ZW1wdCB0byByZXR1cm4gbm9kZXMgZnJvbSB0aGUgcmVzdWx0IHNldCBpbiBhbnkgb3RoZXIgbWFubmVyIG1heSBwcm9kdWNlIHVucHJlZGljdGFibGUgcmVzdWx0cy48L2VtPjwvcD4KLTxwPjxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9saWIvc3FsL1hDb25uZWN0aW9uLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ubGliLnNxbC5YQ29ubmVjdGlvbjwvanVtcD4gcHJvdmlkZXMgdGhyZWUgZXh0ZW5zaW9uIGZ1bmN0aW9ucyB0aGF0IHlvdSBjYW4gdXNlIGluIHlvdXIgc3R5bGVzaGVldC48L3A+Ci0gICAgPG9sPgotICAgICAgPGxpPm5ldygpIC0tIFVzZSBvbmUgb2YgdGhlIFhDb25uZWN0aW9uIGNvbnN0cnVjdG9ycyB0byBjb25uZWN0IHRvIGEgZGF0YSBzb3VyY2UsIGFuZCByZXR1cm4gYW4gWENvbm5lY3Rpb24KLSAgICAgICBvYmplY3QuPGJyLz48YnIvPjwvbGk+Ci0gICAgICA8bGk+cXVlcnkoKSAtLSBVc2UgdGhlIFhDb25uZWN0aW9uIG9iamVjdCBxdWVyeSgpIG1ldGhvZCB0byByZXR1cm4gYSAic3RyZWFtYWJsZSIgcmVzdWx0IHNldCBpbiB0aGUgZm9ybSBvZiBhIHJvdy1zZXQKLSAgICAgICBub2RlLiBXb3JrIHlvdXIgd2F5IHRocm91Z2ggdGhlIHJvdy1zZXQgb25lIHJvdyBhdCBhIHRpbWUuIFRoZSBzYW1lIHJvdyBlbGVtZW50IGlzIHVzZWQgb3ZlciBhbmQgb3ZlciBhZ2Fpbiwgc28geW91IGNhbgotICAgICAgIGJlZ2luICJ0cmFuc2Zvcm1pbmciIHRoZSByb3ctc2V0IGJlZm9yZSB0aGUgZW50aXJlIHJlc3VsdCBzZXQgaGFzIGJlZW4gcmV0dXJuZWQuPGJyLz48YnIvPjwvbGk+Ci0gICAgICA8bGk+Y2xvc2UoKSAtLSBVc2UgdGhlIFhDb25uZWN0aW9uIG9iamVjdCBjbG9zZSgpIG1ldGhvZCB0byB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24uPC9saT4gICAgICAKLSAgICA8L29sPgotICAgIDxwPlRoZSBxdWVyeSgpIGV4dGVuc2lvbiBmdW5jdGlvbiByZXR1cm5zIGEgRG9jdW1lbnQgbm9kZSB0aGF0IGNvbnRhaW5zIChhcyBuZWVkZWQpIGFuIGFycmF5IG9mIGNvbHVtbi1oZWFkZXIgZWxlbWVudHMsIAotICAgIGEgc2luZ2xlIHJvdyBlbGVtZW50IHRoYXQgaXMgdXNlZCByZXBlYXRlZGx5LCBhbmQgYW4gYXJyYXkgb2YgY29sIGVsZW1lbnRzLiBFYWNoIGNvbHVtbi1oZWFkZXIgZWxlbWVudCAob25lIHBlciBjb2x1bW4gaW4KLSAgICB0aGUgcm93LXNldCkgY29udGFpbnMgYW4gYXR0cmlidXRlIChDb2x1bW5BdHRyaWJ1dGUpIGZvciBlYWNoIG9mIHRoZSBjb2x1bW4gZGVzY3JpcHRvcnMgaW4gdGhlIFJlc3VsdFNldE1ldGFEYXRhIG9iamVjdC4gCi0gICAgRWFjaCBjb2wgZWxlbWVudCBjb250YWlucyBhIHRleHQgbm9kZSB3aXRoIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgZm9yIHRoYXQgY29sdW1uIGluIHRoZSBjdXJyZW50IHJvdy48L3A+Ci0gICAgPGFuY2hvciBuYW1lPSJleC1zcWwiLz4gCi0gICAgPHMzIHRpdGxlPSJFeGFtcGxlIHdpdGggU1FMIGxpYnJhcnkiPgotICAgIDxwPlRoaXMgZXhhbXBsZSBkaXNwbGF5cyB0aGUgcmVzdWx0IHNldCBmcm9tIGEgdGFibGUgaW4gYSBzYW1wbGUgSW5zdGFudERCIGRhdGFiYXNlLiBJdCBpcyBhbHNvCi0gICAgYXZhaWxhYmxlIGFzIGEgc2FtcGxlIGFwcGxpY2F0aW9uOyBzZWUgCi0gICAgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0iZXh0NiI+Ni1zcWxsaWItaW5zdGFudGRiPC9saW5rPi48L3A+Ci08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3hzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCIKLSAgICAgICAgICAgICAgICB4bWxuczpzcWw9Im9yZy5hcGFjaGUueGFsYW4ubGliLnNxbC5YQ29ubmVjdGlvbiIKLSAgICAgICAgICAgICAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0ic3FsIiZndDsKLSAgJmx0O3hzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIvJmd0OwotICAmbHQ7eHNsOnBhcmFtIG5hbWU9InF1ZXJ5IiBzZWxlY3Q9IidTRUxFQ1QgKiBGUk9NIGltcG9ydDEnIi8mZ3Q7Ci0gCi0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iJmd0OwotICAgICZsdDshLS0gMS4gTWFrZSB0aGUgY29ubmVjdGlvbiAtLSZndDsKLSAgICAmbHQ7eHNsOnZhcmlhYmxlIG5hbWU9InByb2R1Y3RzIgotICAgICAgICAgICAgICAgICAgc2VsZWN0PSJzcWw6bmV3KCdvcmcuZW5oeWRyYS5pbnN0YW50ZGIuamRiYy5pZGJEcml2ZXInLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnamRiYzppZGI6LlxpbnN0YW50ZGJcc2FtcGxlLnBycCcpIi8mZ3Q7Ci0gICAgJmx0O0hUTUwmZ3Q7Ci0gICAgICAmbHQ7SEVBRCZndDsKLSAgICAgICZsdDsvSEVBRCZndDsKLSAgICAgICZsdDtCT0RZJmd0OwotICAgICAgICAmbHQ7VEFCTEUgYm9yZGVyPSIxIiZndDsKLSAgICAgICAgJmx0OyEtLTIuIEV4ZWN1dGUgdGhlIHF1ZXJ5IC0tJmd0OwotICAgICAgICAmbHQ7eHNsOnZhcmlhYmxlIG5hbWU9InRhYmxlIiBzZWxlY3Q9J3NxbDpxdWVyeSgkcHJvZHVjdHMsICRxdWVyeSknLyZndDsKLSAgICAgICAgICAmbHQ7VFImZ3Q7Ci0gICAgICAgICAgJmx0OyEtLSBHZXQgY29sdW1uLWxhYmVsIGF0dHJpYnV0ZSBmcm9tIGVhY2ggY29sdW1uLWhlYWRlci0tJmd0OwotICAgICAgICAgICZsdDt4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkdGFibGUvcm93LXNldC9jb2x1bW4taGVhZGVyIiZndDsKLSAgICAgICAgICAgICZsdDtUSCZndDsmbHQ7eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbHVtbi1sYWJlbCIvJmd0OyZsdDsvVEgmZ3Q7Ci0gICAgICAgICAgJmx0Oy94c2w6Zm9yLWVhY2gmZ3Q7Ci0gICAgICAgICAgJmx0Oy9UUiZndDsKLSAgICAgICAgICAmbHQ7eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiR0YWJsZS9yb3ctc2V0L3JvdyIvJmd0OwotICAgICAgICAgICZsdDt4c2w6dGV4dCZndDsmYW1wOyMxMDsmbHQ7L3hzbDp0ZXh0Jmd0OwotICAgICAgICAmbHQ7L1RBQkxFJmd0OwotICAgICAgJmx0Oy9CT0RZJmd0OwotICAgICZsdDsvSFRNTCZndDsgCi0gICAgJmx0OyEtLSAzLiBDbG9zZSB0aGUgY29ubmVjdGlvbiAtLSZndDsKLSAgICAmbHQ7eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3FsOmNsb3NlKCRwcm9kdWN0cykiLyZndDsKLSAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7Ci0KLSAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0icm93IiZndDsKLSAgICAgICAgJmx0O1RSJmd0OwotICAgICAgICAgICZsdDt4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iY29sIi8mZ3Q7Ci0gICAgICAgICZsdDsvVFImZ3Q7Ci0gICZsdDsveHNsOnRlbXBsYXRlJmd0OwotCi0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbCImZ3Q7Ci0gICAgJmx0O1REJmd0OwotICAgICAgJmx0OyEtLSBIZXJlIGlzIHRoZSBjb2x1bW4gZGF0YSAtLT4KLSAgICAgICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz4KLSAgICAmbHQ7L1REPgotICAmbHQ7L3hzbDp0ZW1wbGF0ZT4KLQotJmx0Oy94c2w6c3R5bGVzaGVldCZndDsKLTwvc291cmNlPgotPC9zMz4KLTwvczI+PGFuY2hvciBuYW1lPSJldmFsdWF0ZSIvPgotPHMyIHRpdGxlPSAiZXZhbHVhdGUiPgotPHA+SW1wbGVtZW50ZWQgaW4gPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9FeHRlbnNpb25zLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ubGliLkV4dGVuc2lvbnM8L2p1bXA+LDxici8+Ci08Y29kZT5ldmFsdWF0ZSAoeHBhdGgtZXhwcmVzc2lvbik8L2NvZGU+IGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSB4cGF0aC1leHByZXNzaW9uIGluIHRoZSBjdXJyZW50IAotWFBhdGggZXhwcmVzc2lvbiBjb250ZXh0IChhdXRvbWF0aWNhbGx5IHBhc3NlZCBpbiBieSB0aGUgZXh0ZW5zaW9uIG1lY2hhbmlzbSkuPC9wPgotPHA+VXNlIHRoZSBldmFsdWF0aW9uIGV4dGVuc2lvbiBmdW5jdGlvbiB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyBub3Qga25vd24gdW50aWwgcnVuIHRpbWUuPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9InRva2VuaXplIi8+Ci08czIgdGl0bGU9InRva2VuaXplIj4KLTxwPkltcGxlbWVudGVkIGluIDxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9saWIvRXh0ZW5zaW9ucy5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLmxpYi5FeHRlbnNpb25zPC9qdW1wPiw8YnIvPgotPGNvZGU+dG9rZW5pemUgKHRva2VuaXplLXN0cmluZywgZGVsaW1pdGVycyk8L2NvZGU+PGJyLz4KLW9yPGJyLz4KLTxjb2RlPnRva2VuaXplICh0b2tlbml6ZS1zdHJpbmcpPC9jb2RlPiBmdW5jdGlvbiByZXR1cm5zIGEgbm9kZS1zZXQgY29udGFpbmluZyBvbmUgdGV4dCBub2RlIGZvciBlYWNoIHRva2VuIGluIHRoZSB0b2tlbml6ZS1zdHJpbmcuPC9wPgotPHA+VGhlIGRlbGltaXRlcnMgZGV0ZXJtaW5lIHdoaWNoIGNoYXJhY3RlcnMgYXJlIHVzZWQgdG8gZGl2aWRlIHRoZSB0b2tlbml6ZS1zdHJpbmcgaW50byBpbmRpdmlkdWFsIHRva2Vucy4gSWYgeW91IGRvIG5vdCBpbmNsdWRlCi10aGUgZGVsaW1pdGVycyBhcmd1bWVudCwgdGhlIGZ1bmN0aW9uIHVzZXMgdGFiICgmYW1wOyN4MDkpLCBsaW5lZmVlZCAoJmFtcDsjeDBBKSwgcmV0dXJuICgmYW1wOyN4MEQpLCBhbmQgc3BhY2UgKCZhbXA7I3gyMCkgYXMgZGVsaW1pdGVycy4KLUlmIHRva2VuaXplLXN0cmluZyBpcyBhbiBlbXB0eSBzdHJpbmcgb3IgY29udGFpbnMgb25seSBkZWxpbWl0ZXJzLCB0aGUgcmVzdWx0IGlzIGFuIGVtcHR5IG5vZGUtc2V0LjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJncm91cGl0ZW0iLz4KLTxzMiB0aXRsZT0gImdyb3VwIGFuZCBpdGVtIj4KLTxwPjxlbT5UbyBiZSBkb25lLjwvZW0+IFByb3ZpZGVzIGVmZmljaWVudCBncm91cGluZyBvZiBpdGVtcyB3aXRoIGEgY29tbW9uIHZhbHVlLjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJ0eXBlIi8+Ci08czIgdGl0bGU9ICJ0eXBlIj4KLTxwPjxlbT5UbyBiZSBkb25lLjwvZW0+IFJldHVybnMgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBTY2hlbWEgb3IgRFREIHR5cGUuPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9InRvZGF0ZSIvPgotPHMyIHRpdGxlPSJ0by1kYXRlIj4KLTxwPjxlbT5UbyBiZSBkb25lLjwvZW0+IFRha2VzIGEgc3RyaW5nIGFzIGlucHV0LCBhbmQgcmV0dXJucyBhIGxvbmcgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBkYXRlLjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJmb3JtYXRkYXRlIi8+Ci08czIgdGl0bGU9ImZvcm1hdC1kYXRlIj4KLTxwPjxlbT5UbyBiZSBkb25lLjwvZW0+IFRha2VzIGEgZGF0ZSBzdHJpbmcsIGFuZCBmb3JtYXRzIGl0IGFjY29yZGluZyB0byBhIHNwZWNpZmljYXRpb24uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImdyZXAiLz4KLTxzMiB0aXRsZT0iZ3JlcCI+Ci08cD48ZW0+VG8gYmUgZG9uZS48L2VtPiBQZXJmb3JtcyBhIGdyZXAgZnVuY3Rpb24gYW5kIHJldHVybnMgdGhlIHN1YnN0cmluZy48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0iZm9yZWFjaHRva2VuIi8+Ci08czIgdGl0bGU9ImZvci1lYWNoLXRva2VuIj4KLTxwPjxlbT5UbyBiZSBkb25lLjwvZW0+IFRva2VuaXplcyBhIHN0cmluZywgdHJlYXRzIGVhY2ggdG9rZW4gYXMgYSBET00gVGV4dCBub2RlLCBhbmQgZXhlY3V0ZXMgdGhlCi1zdWItdGVtcGxhdGUuPC9wPgotPC9zMj4KLTwvczE+CmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hhbGFuL2ZhcS54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuL2ZhcS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NDQ4ZTMuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94YWxhbi9mYXEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4gCi08IURPQ1RZUEUgZmFxcyBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9mYXFzLmR0ZCI+Ci0KLTxmYXFzIHRpdGxlPSJGcmVxdWVudGx5IGFza2VkIHF1ZXN0aW9ucyI+Ci0KLSAgPGZhcSB0aXRsZT0iV2hlcmUgZG8gSSBnbyB0byBsZWFybiBhYm91dCBYU0xUIj4gIAotICAgIDxxPldoZXJlIGRvIEkgZ28gdG8gbGVhcm4gYWJvdXQgWFNMVD88L3E+ICAgIAotICAgIDxhPjxwPlRoZSBkZWZpbml0aXZlIHNvdXJjZXMgYXJlIHRoZSBXM0MgWFNMVCBhbmQgWFBhdGggcmVjb21tZW5kYXRpb25zOiA8cmVzb3VyY2UtcmVmIGlkcmVmPSJ4c2x0Ii8+IGFuZCAKLSAgICA8cmVzb3VyY2UtcmVmIGlkcmVmPSJ4cGF0aCIvPi48L3A+Ci0gICAgPHA+Rm9yIGEgYnJpZWYgbGlzdGluZyBvZiB0dXRvcmlhbHMsIGRpc2N1c3Npb24gZm9ydW1zLCBhbmQgb3RoZXIgbWF0ZXJpYWxzLCBzZWUgPGxpbmsgaWRyZWY9Im92ZXJ2aWV3IgotICAgICBhbmNob3I9InVwdG9zcGVlZCI+R2V0dGluZyB1cCB0byBzcGVlZCB3aXRoIFhTTFQ8L2xpbms+LjwvcD48L2E+Ci0gIDwvZmFxPgotCi0gIDxmYXEgdGl0bGU9IldoaWNoIHZlcnNpb24gb2YgWGVyY2VzIHNob3VsZCBJIGJlIHVzaW5nPyI+ICAKLSAgICA8cT5XaGljaCB2ZXJzaW9uIG9mIFhlcmNlcyBzaG91bGQgSSBiZSB1c2luZz88L3E+ICAgIAotICAgIDxhPjxwPiZ4c2x0NGotY3VycmVudDsgaGFzIGJlZW4gdGVzdGVkIHdpdGggJnhtbDRqLXVzZWQ7LiBTZWUgPGxpbmsgaWRyZWY9InJlYWRtZSIgYW5jaG9yPSJzdGF0dXMiPlN0YXR1czwvbGluaz4uPC9wPjwvYT4KLSAgPC9mYXE+Ci0gIAotICA8ZmFxIHRpdGxlPSJDb21wYXRpYmlsaXR5IHdpdGggJnhzbHQ0ajsgdmVyc2lvbiAxIj4KLSAgIDxxPkhvdyBkbyBJIHJ1biBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgdGhlICZ4c2x0NGo7IHZlcnNpb24gMSBBUEkgd2l0aCAmeHNsdDRqMjs8L3E+Ci0gICA8YT48cD5Vc2UgdGhlIFhhbGFuLUphdmEgMSBjb21wYXRpYmlsaXR5IEpBUiB0byByZWNvbXBpbGUgYW5kIHJ1biB5b3VyICZ4c2x0NGo7IDEgYXBwbGljYXRpb25zIHdpdGggJnhzbHQ0ajI7LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIAotICAgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0iY29tcGF0Ij5Vc2luZyB0aGUgJnhzbHQ0ajsgdmVyc2lvbiAxIEFQSTwvbGluaz4uPC9wPjwvYT4KLSAgPC9mYXE+Ci0gICAgCi0gIDxmYXEgdGl0bGU9IlRyQVggYW5kIEpBWFAiPgotICAgIDxxPldoYXQgYXJlIFRyQVggYW5kIEpBWFAsIGFuZCBhcmUgdGhleSByZWxhdGVkPzwvcT4KLSAgICA8YT48cD5UckFYIGlzIHRoZSBUcmFuc2Zvcm1hdGlvbiBBUEkgZm9yIFhNTC4gSW4gTm92ZW1iZXIgMjAwMCwgVHJBWCB3YXMgcmV2aXNlZCBhbmQgaW5jb3Jwb3JhdGVkIGludG8gSkFYUCwgdGhlIEpBVkEgQVBJIGZvciBYTUwKLSAgICBQcm9jZXNzaW5nLiBKQVhQIChpbmNsdWRpbmcgVHJBWCkgcHJvdmlkZXMgdXNlcnMgYSBzdGFuZGFyZCwgdmVuZG9yLW5ldXRyYWwgQVBJIGZvciB3b3JraW5nIHdpdGggKGFuZCB0cmFuc2Zvcm1pbmcpIFhNTCBkb2N1bWVudHMuIAotICAgIFlvdSBjYW4gdXNlIHRoaXMgQVBJIHRvIGJ1aWxkIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBub3QgYm91bmQgdG8gdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBhIGdpdmVuIFhNTCBwYXJzZXIgb3IgWFNMCi0gICAgdHJhbnNmb3JtZXIuPC9wPgotICAgIDxwPiZ4c2x0NGo7IGluY2x1ZGVzIHRoZSBKQVhQIHBhY2thZ2VzLCBpbXBsZW1lbnRzIHRoZSBUckFYIHBvcnRpb24gb2YgdGhhdCBBUEkgKGphdmF4LnhtbC50cmFuc2Zvcm0uLi4uKSwgYW5kIGluY2x1ZGVzIHhlcmNlcy5qYXIgZnJvbQotICAgICZ4bWw0ajssIHdoaWNoIGltcGxlbWVudHMgdGhlIHBhcnNlciBwb3J0aW9uIG9mIHRoZSBBUEkgKGphdmF4LnhtbC5wYXJzZXIuLi4uKS48L3A+Ci08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxyZXNvdXJjZS1yZWYgaWRyZWY9InRyYXgiLz4gYW5kIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImpheHAxMSIvPi48L3A+PC9hPgotICA8L2ZhcT4KLSAgPGZhcSB0aXRsZT0iQ2hhaW5pbmcgdHJhbnNmb3JtYXRpb25zIj4gIAotICAgIDxxPkhvdyBkbyB5b3UgY2hhaW4gdG9nZXRoZXIgYSBzZXJpZXMgb2YgdHJhbnNmb3JtYXRpb25zPyI8L3E+Ci0gICAgCi0gICAgPGE+PHA+JnhzbHQ0ajsgc3VwcG9ydHMgdHdvIHN0cmF0ZWdpZXMgZm9yIGNoYWluaW5nIHRvZ2V0aGVyIGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9ucyBzdWNoIHRoYXQgdGhlIG91dHB1dCBvZiBlYWNoIAotICAgIHRyYW5zZm9ybWF0aW9uIHByb3ZpZGVzIGlucHV0IGZvciB0aGUgbmV4dCB0cmFuc2Zvcm1hdGlvbi48L3A+Ci0gICAgPHVsPgotICAgICAgPGxpPkZvciBlYWNoIHRyYW5zZm9ybWF0aW9uIGluIHRoZSBzZXJpZXMsIHlvdSBjYW4gc2V0IG9uZSBTQVggQ29udGVudEhhbmRsZXIgdG8gcHJvY2VzcyB0aGUgaW5wdXQsIGFuZCBhbm90aGVyIENvbnRlbkhhbmRsZXIgdG8gcHJvY2VzcwotICAgICAgIHRoZSBvdXRwdXQuPGJyLz48YnIvPjwvbGk+Ci0gICAgICA8bGk+WW91IGNhbiBhbHNvIHNldCB1cCBhIHNlcmllcyBvZiBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGFuIFhNTFJlYWRlciBhbmQgb25lIG9yIG1vcmUgWE1MRmlsdGVycy48L2xpPiAKLSAgICA8L3VsPgotICAgIDxwPkZvciB0aGUgZGV0YWlscyBhbmQgbGlua3MgdG8gZXhhbXBsZXMsIHNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJvdXRhc2luIj5Vc2luZyB0cmFuc2Zvcm1hdGlvbiBvdXRwdXQgYXMgaW5wdXQgZm9yIAotICAgIGFub3RoZXIgdHJhbnNmb3JtYXRpb248L2xpbms+LjwvcD48L2E+Ci0gIDwvZmFxPgotICAKLSAgPGZhcSB0aXRsZT0iSXNzdWVzIHJ1bm5pbmcgWGFsYW4gb24gSkRLIDEuMyI+Ci0gIDxxPkknbSBoYXZpbmcgYSBwcm9ibGVtIGJ1aWxkaW5nIG9yIHJ1bm5pbmcgJnhzbHQ0ajsgb24gdGhlIEpESyAxLjMuPC9xPgotICA8YT48cD5UaGUgSkRLIDEuMyBhdXRvbWF0aWNhbGx5IHBsYWNlcyBldmVyeXRoaW5nIGluIHRoZSBsaWIvZXh0IGRpcmVjdG9yeSBpbiBmcm9udCBvZiBldmVyeXRoaW5nIHlvdSBwbGFjZSBvbiB0aGUgY2xhc3NwYXRoLiBJZiB0aGlzIGRpcmVjdG9yeSBjb250YWlucyBhIHZlcnNpb24gb2YgRE9NLCBKQVhQLCBvciBYZXJjZXMgdGhhdCBwcmVkYXRlcyB0aGUgJnhzbHQ0ajsgZGlzdHJpYnV0aW9uIHlvdSBhcmUgdXNpbmcsIHlvdSBtYXkgaGF2ZSBwcm9ibGVtcyE8L3A+IAotPHA+VGhlIElCTSBKREsgMS4zIGluY2x1ZGVzIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB4ZXJjZXMuamFyIGluIHRoZSBsaWIvZXh0IGRpcmVjdG9yeSwgYSB2ZXJzaW9uIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBKQVhQIDEuMSBpbnRlcmZhY2VzIGFuZCB0aGVyZWZvcmUgZG9lcyBub3Qgd29yayB3aXRoIHRoZSBjdXJyZW50IFhhbGFuIHJlbGVhc2UuIEFjY29yZGluZ2x5LCB5b3UgbXVzdCBlaXRoZXIgcHVyZ2UgdGhlIHhlcmNlcy5qYXIgdGhhdCBpcyBpbiB0aGF0IGRpcmVjdG9yeSBvciBvdmVyd3JpdGUgaXQgd2l0aCB0aGUgeGVyY2VzLmphciB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhlIFhhbGFuIGRpc3RyaWJ1dGlvbi48L3A+Ci08cD5UaGUgU1VOIEpESyAxLjMgaW5jbHVkZXMgYSBwcmUtMS4xIHZlcnNpb24gb2YgdGhlIEpBWFAgaW4gY3JpbXNvbi5qYXIuIEVpdGhlciBwdXJnZSB0aGUgY3JpbXNvbi5qYXIgaW4gdGhhdCBkaXJlY3Rvcnkgb3Igb3ZlcndyaXRlIGl0IHdpdGggYSBuZXdlciBjcmltc29uLmphciB0aGF0IGluY2x1ZGVzIGFuZCBpbXBsZW1lbnRzIHRoZSBKQVhQIDEuMSBpbnRlcmZhY2VzLjwvcD48L2E+ICAKLSAgPC9mYXE+Ci0gIDxmYXEgdGl0bGU9ImEgJnF1b3Q7RE9NMDA2IEhpZXJhcmNoeSByZXF1ZXN0IGVycm9yJnF1b3Q7Ij4KLSAgPHE+V2h5IGRvIEkgZ2V0IGEgIkRPTTAwNiBIaWVyYXJjaHkgcmVxdWVzdCBlcnJvciIgd2hlbiBJIHRyeSB0byB0cmFuc2Zvcm0gaW50byBhIERPTSBEb2N1bWVudCBub2RlPzwvcT4KLSAgPGE+Ci0gIDxwPlRoaXMgZXJyb3Igb2NjdXJzIHdoZW4gWGFsYW4gdHJpZXMgdG8gYWRkIGEgTm9kZSB0byBhIERvY3VtZW50IG5vZGUgd2hlcmUgaXQgaXNuJ3QgYWxsb3dlZC4gRm9yIGV4YW1wbGUsIGF0dGVtcHRpbmcgdG8gYWRkIG5vbi13aGl0ZXNwYWNlCi0gIHRleHQgdG8gdGhlIERPTSBEb2N1bWVudCBub2RlIHByb2R1Y2VzIHRoaXMgZXJyb3IuPC9wPgotICAgPHA+VGhlIGVycm9yIGNhbiBhbHNvIG9jY3VyIHdoZW4gYSBEb2N1bWVudCBub2RlIGlzIGNyZWF0ZWQgd2l0aCB0aGUgRE9NSW1wbGVtZW50YXRpb24gY3JlYXRlRG9jdW1lbnQoKSBtZXRob2QsIHdoaWNoIHRha2VzIGEgcXVhbGlmaWVkIG5hbWUKLSAgICBhcyBhbiBhcmd1bWVudCBhbmQgY3JlYXRlcyBhbiBlbGVtZW50IG5vZGUuICBJZiB5b3UgdGhlbiBwYXNzIHRoZSByZXR1cm5lZCBEb2N1bWVudCBub2RlIHRvIFhhbGFuLCB5b3UgZ2V0IGEgIkRPTTAwNiBIaWVyYXJjaHkgcmVxdWVzdAotICAgIGVycm9yIiB3aGVuIFhhbGFuIHRyaWVzIHRvIGFkZCBhIHNlY29uZCBlbGVtZW50IHRvIHRoZSBEb2N1bWVudCBub2RlLiBUaGUgc29sdXRpb24gaXMgdG8gZWl0aGVyIHVzZSB0aGUgRG9jdW1lbnRCdWlsZGVyIG5ld0RvY3VtZW50KCkgbWV0aG9kCi0gICAgdG8gY3JlYXRlIGEgRG9jdW1lbnQgdGhhdCBkb2VzIG5vdCBjb250YWluIGFuIGVsZW1lbnQgbm9kZSwgb3IgdXNlIGEgRG9jdW1lbnRGcmFnbWVudC4gSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIAotICAgIERvY3VtZW50QnVpbGRlciBuZXdEb2N1bWVudCgpIG1ldGhvZCBpcyAiTm9uLXByZWZlcnJlZCIgYWNjb3JkaW5nIHRvIHRoZSBKQVhQIDEuMSBkb2N1bWVudGF0aW9uLjwvcD4KLSAgPC9hPgotICA8L2ZhcT4KLSAgCi0gIDxmYXEgdGl0bGU9IlNwZWVkaW5nIHVwIHRyYW5zZm9ybWF0aW9ucyI+Ci0gIAotICAgIDxxPldoYXQgY2FuIEkgZG8gdG8gc3BlZWQgdXAgdHJhbnNmb3JtYXRpb25zPzwvcT4KLSAgICAKLSAgICA8YT48cD5JbiB0aGUgb25nb2luZyBkZXZlbG9wbWVudCBvZiAmeHNsdDRqOywgZW5oYW5jaW5nIHBlcmZvcm1hbmNlIGlzIHRoZSBwcmltYXJ5IGdvYWwgb2YgdGhlICZ4c2x0NGo7IHRlYW0uCi0gICAgSGVyZSBhcmUgc29tZSBwcmVsaW1pbmFyeSBzdWdnZXN0aW9ucyBmb3IgeW91IHRvIGtlZXAgaW4gbWluZCBhcyB5b3Ugc2V0IHVwIHlvdXIgYXBwbGljYXRpb25zOjwvcD48dWw+Ci0gICAgPGxpPlVzZSBhIFRlbXBsYXRlcyBvYmplY3QgKHdpdGggYSBkaWZmZXJlbnQgVHJhbnNmb3JtZXJzIGZvciBlYWNoIHRyYW5zZm9ybWF0aW9uKSB0byBwZXJmb3JtIG11bHRpcGxlIHRyYW5zZm9ybWF0aW9ucyB3aXRoIHRoZSBzYW1lIAotICAgIHNldCBvZiBzdHlsZXNoZWV0IGluc3RydWN0aW9ucyAoc2VlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9Im11bHRpdGhyZWFkaW5nIj5NdWx0aXRocmVhZGluZzwvbGluaz4pLjxici8+PGJyLz48L2xpPiAgICAgICAgIAotICAgIDxsaT5TZXQgdXAgeW91ciBzdHlsZXNoZWV0cyB0byBmdW5jdGlvbiBlZmZpY2llbnRseS48YnIvPjxici8+PC9saT4KLSAgICAgICA8dWw+Ci0gICAgICAgICA8bGk+RG9uJ3QgdXNlICIvLyIgKGRlc2NlbmRhbnQgYXhlcykgcGF0dGVybnMgbmVhciB0aGUgcm9vdCBvZiBhIGxhcmdlIGRvY3VtZW50Ljxici8+PGJyLz48L2xpPgotICAgICAgICAgPGxpPlVzZSB4c2w6a2V5IGVsZW1lbnRzIGFuZCB0aGUga2V5KCkgZnVuY3Rpb24gYXMgYW4gZWZmaWNpZW50IHdheSB0byByZXRyaWV2ZSBub2RlIHNldHMuPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgICA8bGk+V2hlcmUgcG9zc2libGUsIHVzZSBwYXR0ZXJuIG1hdGNoaW5nIHJhdGhlciB0aGFuIHhzbDppZiBvciB4c2w6d2hlbiBzdGF0ZW1lbnRzLjxici8+PGJyLz48L2xpPgotICAgICAgICAgPGxpPnhzbDpmb3ItZWFjaCBpcyBmYXN0IGJlY2F1c2UgaXQgZG9lcyBub3QgcmVxdWlyZSBwYXR0ZXJuIG1hdGNoaW5nLjxici8+PGJyLz48L2xpPgotICAgICAgICAgPGxpPktlZXAgaW4gbWluZCB0aGF0IHhzbDpzb3J0IHByZXZlbnRzIGluY3JlbWVudGFsIHByb2Nlc3NpbmcuPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgICA8bGk+V2hlbiB5b3UgY3JlYXRlIHZhcmlhYmxlcywgJmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJmb29FbGVtIiBzZWxlY3Q9ImZvbyIvJmd0OyBpcyB1c3VhbGx5IGZhc3RlciB0aGFuCi0gICAgICAgICAmZ3Q7eHNsOnZhcmlhYmxlIG5hbWU9ImZvb0VsZW0iJmd0OyZsdDt4c2w6dmFsdWUtb2Ytc2VsZWN0PSJmb28iLyZndDsmbHQ7L3hzbDp2YXJpYWJsZSZndDsuPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgICA8bGk+QmUgY2FyZWZ1bCB1c2luZyB0aGUgbGFzdCgpIGZ1bmN0aW9uLjxici8+PGJyLz48L2xpPgotICAgICAgICAgPGxpPlRoZSB1c2Ugb2YgaW5kZXggcHJlZGljYXRlcyB3aXRoaW4gbWF0Y2ggcGF0dGVybnMgY2FuIGJlIGV4cGVuc2l2ZS48YnIvPjxici8+PC9saT4KLSAgICAgICAgIDxsaT5EZWNvZGluZyBhbmQgZW5jb2RpbmcgaXMgZXhwZW5zaXZlLjxici8+PGJyLz48L2xpPgotICAgICAgIDwvdWw+Ci0gICAgIDxsaT5Gb3IgdGhlIHVsdGltYXRlIGluIHNlcnZlci1zaWRlIHNjYWxhYmlsaXR5LCBwZXJmb3JtIHRyYW5zZm9ybSBvcGVyYXRpb25zIG9uIHRoZSBjbGllbnQuIEZvciBleGFtcGxlcywgc2VlIAotICAgICA8bGluayBpZHJlZj0ic2FtcGxlcyIgYW5jaG9yPSJhcHBsZXR4bWx0b2h0bWwiPmFwcGxldFhNTHRvSFRNTDwvbGluaz4gYW5kIDxsaW5rIGlkcmVmPSJzYW1wbGVzIgotICAgICBhbmNob3I9ImdldC10b2RvLWxpc3QiPmdldC10b2RvLWxpc3Q8L2xpbms+LjwvbGk+Ci0gICAgPC91bD48L2E+Ci0gIDwvZmFxPgotCi0gIDxmYXEgdGl0bGU9Ik5vQ2xhc3NEZWZGb3VuZCBlcnJvcnMiPgotICAKLSAgICA8cT5JJ20gZ2V0dGluZyBhIE5vQ2xhc3NEZWZGb3VuZCBlcnJvci4gV2hhdCBoYXMgdG8gYmUgb24gdGhlIGNsYXNzcGF0aD88L3E+Ci0gICAgCi0gICAgPGE+PG9sPgotICAgIDxsaT54YWxhbi5qYXIgYW5kIHhlcmNlcy5qYXIgKG9yIHRoZSBYTUwgcGFyc2VyIHlvdSBhcmUgdXNpbmcpIG11c3QgYWx3YXlzIGJlIG9uIHRoZSBjbGFzc3BhdGguPGJyLz48YnIvPjwvbGk+Ci0gICAgPGxpPlRvIHJ1biB0aGUgc2FtcGxlcyBpbiB0aGUgc2FtcGxlcyBzdWJkaXJlY3RvcmllcywgeGFsYW5zYW1wbGVzLmphciBtdXN0IGJlIG9uIHRoZSBjbGFzc3BhdGguIFRvIHJ1biB0aGUgc2VydmxldCAoaW4KLSAgICBzYW1wbGVzL3NlcnZsZXQpLCB4YWxhbnNlcnZsZXQuamFyIG11c3QgYmUgb24gdGhlIGNsYXNzcGF0aCBhbG9uZyB3aXRoIHRoZSBqYXZheC5zZXJ2bGV0IGFuZCBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZXMuIFN1biBkaXN0cmlidXRlcwotICAgIHRoZSBqYXZheC5zZXJ2bGV0IHBhY2thZ2VzIGluIHRoZSBKU1dESyBzZXJ2bGV0LmphciBmaWxlLjxici8+PGJyLz48L2xpPgotICAgIDxsaT5UbyBydW4gZXh0ZW5zaW9ucyAoaW5jbHVkaW5nIHRoZSBzYW1wbGVzIGluIHNhbXBsZXMvZXh0ZW5zaW9ucyksIGJzZi5qYXIsIGFuZCBic2ZlbmdpbmVzLmphciBtdXN0IGJlIG9uIHRoZSAKLSAgICBjbGFzc3BhdGguIFRvIHJ1biBleHRlbnNpb25zIGltcGxlbWVudGVkIGluIEphdmFTY3JpcHQsIGpzLmphciBtdXN0IGFsc28gYmUgb24gdGhlIGNsYXNzcGF0aC4gRm9yIGluZm9ybWF0aW9uIG9uIHdoYXQgCi0gICAgeW91IG5lZWQgdG8gcnVuIGV4dGVuc2lvbnMgaW1wbGVtZW50ZWQgaW4gb3RoZXIgc2NyaXB0aW5nIGxhbmd1YWdlcywgc2VlIDxsaW5rIGlkcmVmPSJleHRlbnNpb25zIgotICAgIGFuY2hvcj0ic3VwcG9ydGVkLWxhbmciPlN1cHBvcnRlZCBsYW5ndWFnZXM8L2xpbms+Ljxici8+PGJyLz48L2xpPgotICAgIDxsaT5UbyBydW4gYXBwbGljYXRpb25zIHRoYXQgdXNlIHRoZSAmeHNsdDRqOyB2ZXJzaW9uIDEgQVBJLCB5b3UgbXVzdCBwdXQgeGFsYW5qMWNvbXBhdC5qYXIgb24gdGhlIGNsYXNzcGF0aCwgcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbiwKLSAgICBhbmQgYmUgc3VyZSB4YWxhbmoxY29tcGF0LmphciBpcyBvbiB0aGUgY2xhc3NwYXRoIGF0IHJ1biB0aW1lIChzZWUgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0iY29tcGF0Ij5Vc2luZyB0aGUgJnhzbHQ0ajsgdmVyc2lvbiAxCi0gICAgQVBJKTwvbGluaz4uPC9saT4KLSAgICA8L29sPgotICAgIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGxpbmsgaWRyZWY9ImdldHN0YXJ0ZWQiIGFuY2hvcj0iY2xhc3NwYXRoIj5TZXR0aW5nIHVwIHRoZSBzeXN0ZW0gY2xhc3NwYXRoPC9saW5rPi48L3A+PC9hPgotICAgPC9mYXE+Ci0gCi0JPGZhcSB0aXRsZT0iU3R5bGVzaGVldCB2YWxpZGF0aW9uIj4KLQkJPHE+SG93IGRvIEkgdmFsaWRhdGUgYW4gWFNMIHN0eWxlc2hlZXQ/PC9xPgotCQk8YT4KLSAgICAgIDxwPkFuIFhTTCBzdHlsZXNoZWV0IGlzIGFuIFhNTCBkb2N1bWVudCwgc28gaXQgY2FuIGhhdmUgYSBET0NUWVBFIGFuZCBiZSBzdWJqZWN0IHRvIHZhbGlkYXRpb24sIHJpZ2h0PyA8L3A+Ci0gICAgICA8cD5UaGUgWFNMVCBSZWNvbW1lbmRhdGlvbiBpbmNsdWRlcyBhIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjZHRkIj5EVEQgRnJhZ21lbnQgCi0gICAgICBmb3IgWFNMIFN0eWxlc2hlZXRzPC9qdW1wPiB3aXRoIHNvbWUgaW5kaWNhdGlvbnMgb2Ygd2hhdCB5b3UgbmVlZCB0byBkbyB0byBjcmVhdGUgYSBjb21wbGV0ZSBEVEQgZm9yIGEgZ2l2ZW4KLSAgICAgIHN0eWxlc2hlZXQuIEtlZXAgaW4gbWluZCB0aGF0IHN0eWxlc2hlZXRzIGNhbiBpbmNsdWRlIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzIGFuZCBwcm9kdWNlIG91dHB1dCB0aGF0IGlzIG5vdCB2YWxpZAotICAgICAgWE1MLjwvcD4KLSAgICAgIDxwPllvdSBjYW4gdXNlIHRoZSB4c2w6c3R5bGVzaGVldCBkb2N0eXBlIGRlZmluZWQgaW4geHNsLWh0bWw0MHMuZHRkIGZvciBzdHlsZXNoZWV0cyB0aGF0IGdlbmVyYXRlIEhUTUwuPC9wPgotCQk8L2E+Ci0JPC9mYXE+Ci0gICAgCi0gICAgPGZhcSB0aXRsZT0iUmV0cmlldmluZyBub2RlcyBpbiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UiPgotICAgICA8cT5YUGF0aCBpc24ndCByZXRyaWV2aW5nIG5vZGVzIHRoYXQgYXJlIGluIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBJIGRlZmluZWQuIEhvdyBkbyBJIGdldCB0aGVtPzwvcT4KLSAgICAgPGE+PHA+SWYgeW91IGFyZSBsb29raW5nIGZvciBub2RlcyBpbiBhIG5hbWVzcGFjZSwgdGhlIFhQYXRoIGV4cHJlc3Npb24gbXVzdCBpbmNsdWRlIGEgbmFtZXNwYWNlIHByZWZpeCB0aGF0IHlvdSBoYXZlIG1hcHBlZCB0byB0aGUKLSAgICAgICBuYW1lc3BhY2Ugd2l0aCBhbiB4bWxucyBkZWNsYXJhdGlvbi4gSWYgeW91IGhhdmUgZGVjbGFyZWQgYSBkZWZhdWx0IG5hbWVzcGFjZSwgaXQgZG9lcyBub3QgaGF2ZSBhIHByZWZpeCAoc2VlIAotICAgICAgIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoLmh0bWwjbm9kZS10ZXN0cyI+WFBhdGggTm9kZSBUZXN0czwvanVtcD4pLiBJbiBvcmRlciB0byBjb25zdHJ1Y3QgWFBhdGggZXhwcmVzc2lvbnMgCi0gICAgICAgdG8gcmV0cmlldmUgbm9kZXMgZnJvbSB0aGlzIG5hbWVzcGFjZSwgeW91IG11c3QgYWRkIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRoYXQgcHJvdmlkZXMgYSBwcmVmaXggeW91IGNhbiBpbmNsdWRlIGluIHRoZSBYUGF0aAotICAgICAgICBleHByZXNzaW9ucy48L3A+Ci0gICAgICAgPHA+U3VwcG9zZSwgZm9yIGV4YW1wbGUsIHlvdSB5b3Ugd2FudCB0byBsb2NhdGUgbm9kZXMgaW4gYSBkZWZhdWx0IG5hbWVzcGFjZSBkZWNsYXJlZCBhcyBmb2xsb3dzOjxici8+Ci0gICAgICAgPGNvZGU+eG1sbnM9Imh0dHA6Ly9teS1uYW1lc3BhY2UiPC9jb2RlPjwvcD4KLSAgICAgICA8cD5BZGQgYSBuYW1wZXNwYWNlIGRlY2xhcmF0aW9uIHdpdGggYSBwcmVmaXg6PGJyLz4KLSAgICAgICA8Y29kZT54bWxuczpmb289Imh0dHA6Ly9teS1uYW1lc3BhY2UiPC9jb2RlPjwvcD4gICAgICAgCi0gICAgICAgPHA+VGhlbiB5b3UgY2FuIHVzZSBmb286IGluIHlvdXIgWFBhdGggZXhwcmVzc2lvbi48L3A+Ci0gICAgICAgPHA+SGludDogRG9uJ3QgdXNlIGRlZmF1bHQgbmFtZXNwYWNlcywgYW5kIHRoZSBwcm9ibGVtIGRvZXNuJ3QgYXJpc2UuPC9wPjwvYT4KLSAgICA8L2ZhcT4gICAKLTwvZmFxcz4KZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vZ2V0c3RhcnRlZC54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuL2dldHN0YXJ0ZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODFhMmFkLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vZ2V0c3RhcnRlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+ICAKLTwhRE9DVFlQRSBzMSBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9kb2N1bWVudC5kdGQiPgotCi08czEgdGl0bGU9IkdldHRpbmcgU3RhcnRlZCI+Ci08dWw+Ci08bGk+PGxpbmsgYW5jaG9yPSJkb3dubG9hZCI+RG93bmxvYWRpbmcgd2hhdCB5b3UgbmVlZDwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iY2xhc3NwYXRoIj5TZXR0aW5nIHVwIHRoZSBzeXN0ZW0gY2xhc3NwYXRoPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJzYW1wbGVzIj5Ucnlpbmcgb3V0IHRoZSBzYW1wbGVzPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJjb21tYW5kbGluZSI+UGVyZm9ybWluZyB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJqYXZhLWFwcHMiPlNldHRpbmcgdXAgeW91ciBvd24gWFNMVCBhcHBsaWNhdGlvbnM8L2xpbms+PC9saT4KLTwvdWw+Ci08YW5jaG9yIG5hbWU9ImRvd25sb2FkIi8+Ci08czIgdGl0bGU9IkRvd25sb2FkaW5nIHdoYXQgeW91IG5lZWQiPgotPHA+VG8gdXNlIFhhbGFuLCB5b3UgbmVlZCB0aGUgZm9sbG93aW5nOjwvcD4KLTx1bD4KLTxsaT5UaGUgSkRLIG9yIEpSRSAxLjEuOCwgMS4yLjIsIG9yIDEuMzwvbGk+Ci08bGk+eGFsYW4uamFyPC9saT4KLTxsaT54ZXJjZXMuamFyIChvciBhbm90aGVyIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9InBsdWciPlhNTCBQYXJzZXI8L2xpbms+KTwvbGk+Ci08L3VsPgotPHA+WW91IGNhbiBnZXQgdGhlIEpESyBvciBKUkUgZnJvbSA8anVtcCBocmVmPSJodHRwOi8vd3d3LmlibS5jb20vamF2YS9qZGsiPmlibS5jb20vamF2YS9qZGsvPC9qdW1wPiBvciA8anVtcCBocmVmPSJodHRwOi8vd3d3LmphdmEuc3VuLmNvbSI+amF2YS5zdW4uY29tPC9qdW1wPi48L3A+IAotPHA+RG93bmxvYWQgPHJlc291cmNlLXJlZiBpZHJlZj0ieHNsdDRqLWRpc3QtemlwIi8+IG9yIDxyZXNvdXJjZS1yZWYgaWRyZWY9InhzbHQ0ai1kaXN0LXRhcmd6Ii8+LiBCb3RoIG9mIHRoZXNlIGZpbGVzIGNvbnRhaW4gPHJlc291cmNlLXJlZiBpZHJlZj0ieHNsdDRqLWN1cnJlbnQiLz4gKHdpdGggeGFsYW4uamFyKSBhbmQgeGVyY2VzLmphciBmcm9tIDxyZXNvdXJjZS1yZWYgaWRyZWY9InhtbDRqLXVzZWQiLz4uIFlvdSBjYW4gdXNlIGEgemlwIG9yIHRhciB1dGlsaXR5IHRvIGV4cGFuZCB0aGVzZSBmaWxlcyBpbnRvIGEgZnVsbCBidWlsZC48L3A+Ci0KLTxwPklmIHlvdSBwbGFuIHRvIHJ1biA8bGluayBpZHJlZj0iZXh0ZW5zaW9ucyI+WFNMVCBleHRlbnNpb25zPC9saW5rPiwgeW91IG5lZWQgYnNmLmphciwgd2hpY2ggaXMgaW5jbHVkZWQgaW4gdGhlICZ4c2x0NGo7IGRpc3RyaWJ1dGlvbi4gSWYgeW91IHBsYW4gdG8gcnVuIFhTTFQgZXh0ZW5zaW9ucyBpbXBsZW1lbnRlZCBpbiBKYXZhc2NyaXB0IG9yIGFub3RoZXIgc2NyaXB0aW5nIGxhbmd1YWdlLCB5b3Ugd2lsbCBuZWVkIG9uZSBvciBtb3JlIGFkZGl0aW9uYWwgZmlsZXMgYXMgaW5kaWNhdGVkIGluIDxsaW5rIGlkcmVmPSJleHRlbnNpb25zIiBhbmNob3I9InN1cHBvcnRlZC1sYW5nIj5leHRlbnNpb25zIGxhbmd1YWdlIHJlcXVpcmVtZW50czwvbGluaz4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImNsYXNzcGF0aCIvPgotPHMyIHRpdGxlPSJTZXR0aW5nIHVwIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIj4KLTxwPkF0IHRoZSB2ZXJ5IG1pbmltdW0sIHlvdSBtdXN0IGluY2x1ZGUgeGFsYW4uamFyIGFuZCB4ZXJjZXMuamFyIChvciBhbm90aGVyIGNvbmZvcm1hbnQgWE1MIHBhcnNlciAtLSBzZWUgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0icGx1ZyI+UGx1Z2dpbmcgaW4gYSBUcmFuc2Zvcm1lciBhbmQgWE1MIHBhcnNlcjwvbGluaz4pIG9uIHRoZSBzeXN0ZW0gY2xhc3NwYXRoLiBUbyBydW4gdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMsIGluY2x1ZGUgeGFsYW5zYW1wbGVzLmphciAoYWxsIHNhbXBsZXMgb3RoZXIgdGhhbiB0aGUgc2VydmxldCkgYW5kIHhhbGFuc2VydmxldC5qYXIuIFRvIHJ1biBleHRlbnNpb25zLCBpbmNsdWRlIGJzZi5qYXIuIEFsbCB0aGVzZSBKQVIgZmlsZXMgYXJlIGRpc3RyaWJ1dGVkIHdpdGggJnhzbHQ0ajsuIEZvciBleHRlbnNpb25zIGltcGxlbWVudGVkIGluIEphdmFTY3JpcHQgb3IgYW5vdGhlciBzY3JpcHRpbmcgbGFuZ3VhZ2UsIHNlZSA8bGluayBpZHJlZj0iZXh0ZW5zaW9ucyIgYW5jaG9yPSJzdXBwb3J0ZWQtbGFuZyI+ZXh0ZW5zaW9ucyBsYW5ndWFnZSByZXF1aXJlbWVudHM8L2xpbms+IHRvIGlkZW50aWZ5IGFueSBhZGRpdGlvbmFsIEpBUiBmaWxlcyB5b3UgbXVzdCBwbGFjZSBvbiB0aGUgY2xhc3NwYXRoIGFuZCB3aGVyZSB5b3UgY2FuIGdldCB0aGVtLjwvcD4KLTxwPklmIHlvdSBhcmUgdXNpbmcgSkRLIG9yIEpSRSAxLjEuOCwgYWxzbyBpbmNsdWRlIGNsYXNzZXMuemlwIG9uIHRoZSBjbGFzc3BhdGguPC9wPgotPG5vdGU+SWYgeW91IGFyZSB1c2luZyB4ZXJjZXMuamFyIGZyb20gYSBYZXJjZXMgcmVsZWFzZSB0aGF0IGlzIG1vcmUgcmVjZW50IHRoYW4gJnhtbDRqLXVzZWQ7LCB5b3UgbWF5IG5lZWQgdG8gcHV0IHhlcmNlcy5qYXIgYmVmb3JlIHhhbGFuLmphciBvbiB0aGUgY2xhc3NwYXRoLiBCb3RoIEpBUiBmaWxlcyBpbmNsdWRlIHRoZSBvcmcudzNjLmRvbSBwYWNrYWdlcy4gVGhlIFhlcmNlcyB0ZWFtIGlzIHRyYWNraW5nIHVwZGF0ZXMgdG8gRE9NIGxldmVsIDIsIGFuZCB0aGUgWGVyY2VzIHBhcnNlciBtYXkgcmVxdWlyZSBhY2Nlc3MgdG8gdXBkYXRlcyBpbiB0aGVzZSBwYWNrYWdlcy48L25vdGU+Ci08L3MyPjxhbmNob3IgbmFtZT0ic2FtcGxlcyIvPgotPHMyIHRpdGxlPSJUcnlpbmcgb3V0IHRoZSBzYW1wbGVzIj4KLTxwPlRoZSAmeHNsdDRqOyBkaXN0cmlidXRpb24gaW5jbHVkZXMgYSBudW1iZXIgb2YgYmFzaWMgc2FtcGxlIGFwcGxpY2F0aW9ucy4gVGhlc2Ugc2FtcGxlcyBhcmUgZWFzeSB0byBydW4sIGFuZCB5b3UgY2FuIHJldmlldyB0aGUgc291cmNlIGZpbGVzIC0tIGFsbCBvZiB3aGljaCBhcmUgYnJpZWYgLS0gdG8gc2VlIGp1c3QgaG93IHRoZXkgd29yay48L3A+Ci08cD5UbyBydW4gdGhlIHNhbXBsZXMsIGRvIHRoZSBmb2xsb3dpbmc6PC9wPgotPG9sPgotPGxpPlNldCB1cCB5b3VyIGNsYXNzcGF0aCAoc2VlIGFib3ZlKSwgaW5jbHVkaW5nIHhhbGFuc2FtcGxlcy5qYXIgYW5kIChmb3IgdGhlIHNlcnZsZXQpIHhhbGFuc2VydmxldC5qYXIuPC9saT4KLTxsaT5CZSBzdXJlIHRoZSBqYXZhIGV4ZWN1dGFibGUgaXMgb24geW91ciBwYXRoLjwvbGk+Ci08bGk+R28gdG8gdGhlIHNhbXBsZXMgc3ViZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNhbXBsZSAodXNlIHRoZSBET1Mgc2hlbGwgaWYgeW91IGFyZSBydW5uaW5nIFdpbmRvd3MpLjwvbGk+Ci08bGk+VXNlIHRoZSBqYXZhIGV4ZWN1dGFibGUgdG8gcnVuIHRoZSBzYW1wbGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLjwvbGk+Ci08bGk+RXhhbWluZSB0aGUgYXBwbGljYXRpb24gc291cmNlIGFuZCByZXN1bHQgZmlsZXMuPC9saT4KLTwvb2w+Ci08cD5Gb3IgZXhhbXBsZSwgZ28gdG8gdGhlIFNpbXBsZVRyYW5zZm9ybSBzdWJkaXJlY3RvcnkgYW5kIGlzc3VlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo8L3A+Ci08cD48Y29kZT5qYXZhIFNpbXBsZVRyYW5zZm9ybTwvY29kZT48L3A+Ci08cD5UaGUgc2FtcGxlIHdyaXRlcyB0aGUgdHJhbnNmb3JtYXRpb24gcmVzdWx0ICB0byBhIGZpbGUgKGJpcmRzLm91dCkuIFRvIHNlZSBob3cgdGhlIGV4YW1wbGUgd29ya3MsIGV4YW1pbmUgdGhlIHNvdXJjZSBmaWxlczogYmlyZHMueG1sLCBiaXJkcy54c2wsIGFuZCBTaW1wbGVUcmFuc2Zvcm0uamF2YS48L3A+Ci08cD5UaGUgZXh0ZW5zaW9ucyBleGFtcGxlcyByZXF1aXJlIGFkZGl0aW9uYWwgSkFSIGZpbGVzIG9uIHRoZSBjbGFzc3BhdGgsIGFuZCB0aGUgcHJvY2VkdXJlIGZvciBydW5uaW5nIHRoZSBzYW1wbGUgYXBwbGV0IGFuZCBzYW1wbGUgc2VydmxldCBpcyBkaWZmZXJlbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGFsbCB0aGUgc2FtcGxlcywgc2VlIDxsaW5rIGlkcmVmPSJzYW1wbGVzIj4meHNsdDRqOyBTYW1wbGVzPC9saW5rPi48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0iY29tbWFuZGxpbmUiLz4KLTxzMiB0aXRsZT0iUGVyZm9ybWluZyB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIj4KLTxwPmphdmEub3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MgcHJvdmlkZXMgYSBiYXNpYyB1dGlsaXR5IGZvciBwZXJmb3JtaW5nIHRyYW5zZm9ybWF0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuIFlvdSB1c2UgdGhpcyB1dGlsaXR5LCBmb3IgZXhhbXBsZSwgdG8gcnVuIHNldmVyYWwgb2YgdGhlIGV4dGVuc2lvbnMgc2FtcGxlcy4gVGhlIGNvbW1hbmQgbGluZSBmb3IgbW9zdCBzdGFuZGFyZCB0cmFuc2Zvcm1hdGlvbnMgaXMgYXMgZm9sbG93czo8L3A+Ci08cD48Y29kZT5qYXZhIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIC1pbiA8cmVmPnhtbFNvdXJjZTwvcmVmPjwvY29kZT48YnIvPgotPGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7LXhzbCA8cmVmPnN0eWxlc2hlZXQ8L3JlZj4gLW91dCA8cmVmPm91dHB1dGZpbGU8L3JlZj48L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj54bWxTb3VyY2U8L3JlZj4gaXMgdGhlIFhNTCBzb3VyY2UgZmlsZSBuYW1lLCA8cmVmPnN0eWxlc2hlZXQ8L3JlZj4gaXMgdGhlIFhTTCBzdHlsZXNoZWV0IGZpbGUgbmFtZSwgYW5kIDxyZWY+b3V0cHV0ZmlsZTwvcmVmPiBpcyB0aGUgb3V0cHV0IGZpbGUgbmFtZS48L3A+Ci08cD5JZiB5b3Ugd2FudCB0aGUgb3V0cHV0IHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuLCBzaW1wbHkgb21pdCB0aGUgLW91dCBmbGFnIGFuZCBhcmd1bWVudC48L3A+Ci08cD5Zb3UgY2FuIHVzZSB0aGlzIHV0aWxpdHkgdG8gdHJ5IG91dCBYU0wgc3R5bGVzaGVldHMgeW91IGhhdmUgd3JpdHRlbiwgdG8gbWFrZSBzdXJlIHRoZXkgZG8gd2hhdCB5b3UgZXhwZWN0IHdpdGggdGhlIFhNTCBzb3VyY2UgZmlsZXMgdGhleSBhcmUgZGVzaWduZWQgdG8gdHJhbnNmb3JtLiBUaGUgdXRpbGl0eSBwcm92aWRlcyB1c2VmdWwgbWVzc2FnZXMgaWYgdGhlIHNvdXJjZSBmaWxlIG9yIHN0eWxlc2hlZXQgaXMgbm90IHdlbGwgZm9ybWVkLiBJZiB5b3UgaW5jbHVkZSBhIERPQ1RZUEUgc3RhdGVtZW50IGluIHlvdXIgWE1MIHNvdXJjZSBmaWxlcyBhbmQgaW5jbHVkZSB0aGUgLXZhbGlkYXRlIGZsYWcgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlIHV0aWxpdHkgd2lsbCBhbHNvIGxldCB5b3Uga25vdyB3aGV0aGVyIHRoZSBYTUwgZG9jdW1lbnQgaXMgdmFsaWQgKGNvbmZvcm1zIHRvIHRoYXQgRE9DVFlQRSkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGxpbmsgaWRyZWY9ImNvbW1hbmRsaW5lIj5Db21tYW5kLUxpbmUgVXRpbGl0eTwvbGluaz4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImphdmEtYXBwcyIvPgotPHMyIHRpdGxlPSJTZXR0aW5nIHVwIHlvdXIgb3duIEphdmEgYXBwbGljYXRpb25zIj4KLTxwPllvdSBjYW4gc3RhcnQgYnkgdXNpbmcgeW91ciBvd24gWE1MIHNvdXJjZSBmaWxlcyBhbmQgWFNMIHN0eWxlc2hlZXRzIHdpdGggdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMsIHdoaWNoIGlsbHVzdHJhdGUgYSBudW1iZXIgb2YgdGhlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIj5iYXNpYyB1c2FnZSBwYXR0ZXJuczwvbGluaz4uPC9wPgotPHA+SGVyZSBpcyB0aGUgYmFzaWMgVFJhWCBwcm9jZWR1cmUgdG8ga2VlcCBpbiBtaW5kIHdoZW4geW91IHNldCB1cCBhIHRyYW5zZm9ybWF0aW9uOjwvcD4KLTxvbD4KLTxsaT5Vc2UgdGhlIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lckZhY3RvcnkuaHRtbCI+VHJhbnNmb3JtZXJGYWN0b3J5PC9qdW1wPiBzdGF0aWMgbmV3SW5zdGFuY2UoKSBtZXRob2QgdG8gaW5zdGFudGlhdGUgYSBUcmFuc2Zvcm1lckZhY3RvcnkuPGJyLz48YnIvPjwvbGk+Ci08bGk+VXNlIHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgbmV3VHJhbnNmb3JtZXIoU291cmNlIHN0eWxlc2hlZXQpIG1ldGhvZCB0byBwcm9jZXNzIHRoZSB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnMgaW4gYW4gWFNMVCBzdHlsZXNoZWV0IFNvdXJjZSAocHJvZHVjaW5nIHVuZGVyIHRoZSBjb3ZlcnMgYSA8anVtcCBocmVmPSJhcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vVGVtcGxhdGVzLmh0bWwiPlRlbXBsYXRlczwvanVtcD4gb2JqZWN0KSBhbmQgZ2VuZXJhdGUgYSA8anVtcCBocmVmPSJhcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vVHJhbnNmb3JtZXIuaHRtbCI+VHJhbnNmb3JtZXI8L2p1bXA+Ljxici8+PGJyLz48L2xpPgotPGxpPlVzZSB0aGUgVHJhbnNmb3JtZXIgdHJhbnNmb3JtKFNvdXJjZSB4bWxTb3VyY2UsIFJlc3VsdCB0cmFuc2Zvcm1SZXN1bHQpIG1ldGhvZCB0byBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zICh0aGUgVGVtcGxhdGVzIG9iamVjdCkgdG8gdGhlIFhNTCBTb3VyY2UgYW5kIHByb2R1Y2UgdGhlIHRyYW5zZm9ybWF0aW9uIFJlc3VsdC48YnIvPjxici8+PC9saT4KLTwvb2w+Ci08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHByb2NlZHVyZSBhbmQgaXRzIHZhcmlhdGlvbnMsIHNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyI+QmFzaWMgVXNhZ2UgUGF0dGVybnM8L2xpbms+LjwvcD4KLTwvczI+Ci08L3MxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vaGlzdG9yeS54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuL2hpc3RvcnkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmRiNTRjLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vaGlzdG9yeS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjQgKzAsMCBAQAotPHMzIHRpdGxlPSJDaGFuZ2VzIGZvciAmeHNsdDRqOyAyLjAuMSI+Ci08cD5UaGlzIHJlbGVhc2UgaW5jbHVkZXMgYSBudW1iZXIgb2YgYnVnIGZpeGVzIHRvIHRoZSAmeHNsdDRqOyBhbmQgVHJBWCBjb3JlIGFuZCBYYWxhbi1KYXZhIDEgY29tcGFiaWxpdHkgQVBJLiBXZSBoYXZlIGFsc288L3A+Ci08dWw+Ci0gIDxsaT5FbnRlcmVkIGFsbCBrbm93biAmeHNsdDRqOyAyIDxsaW5rIGFuY2hvcj0iYnVncyI+YnVnczwvbGluaz4gaW4gdGhlIEFwYWNoZSBCdWd6aWxsYSBkYXRhYmFzZTxici8+PGJyLz48L2xpPgotICA8bGk+QWRkZWQgc3VwcG9ydCBmb3IgdXNpbmcgY3VzdG9tIFVSSVJlc29sdmVyLCBFbnRpdHlSZXNvbHZlciwgYW5kIENvbnRlbnRIYW5kbGVyIGltcGxlbWVudGF0aW9ucyB3aXRoIHRoZSA8bGluawotICAgICAgaWRyZWY9ImNvbW1hbmRsaW5lIj5jb21tYW5kLWxpbmUgdXRpbGl0eTwvbGluaz48YnIvPjxici8+PC9saT4gCi0gIDxsaT5VcGdyYWRlZCBmcm9tIEFudCAxLjIgdG8gQW50IDEuMyBmb3Igb3VyIDxsaW5rIGFuY2hvcj0iYnVpbGQiPmJ1aWxkczwvbGluaz4gKHRoZSBuZXcgYW50LmphciBpcyBpbiB0aGUgYmluIGRpcmVjdG9yeSkuPC9saT4KLTwvdWw+Ci08cD5Db3JlIHNvdXJjZSBjb2RlIHVwZGF0ZXM6PC9wPgotPHVsPgotPGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8wNi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMgQ2hpbGRXYWxrZXJNdWx0aVN0ZXAuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkZpeCBmb3IgYnVnIHJlcG9ydGVkIGJ5ICJDaHJpcyBQLiBNY0NhYmUiICZsdDtjaHJpc19tY2NhYmVAY2hvaWNlaG90ZWxzLmNvbSZndDsKLSAwMi8wNi8yMDAxIDA2OjU1IFBNLgotIERlZmVuc2l2ZSBmaXggZm9yIGlmIHRoZSBsYXN0IHVzZWQgd2Fsa2VyIGlzIG51bGwsIHRoZW4gZG9uJ3QgY2hlY2sgdG8KLSBzZWUgaWYgaXQgaXMgYSBmYXN0IHdhbGtlciEgV2l0aG91dCB0aGlzLCBhIG51bGwgcG9pbnRlciBleGNlcHRpb24gaXMKLSB2ZXJ5IHBvc3NpYmxlLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMDYvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lciBUcmFuc2Zvcm1lckltcGwuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkZpeGVzIGZvciBleGNlcHRpb25zIGJlaW5nIHRocm93biB0aGF0IHdlcmVuJ3QgYmVpbmcgcGFzc2VkIHRocm91Z2gKLSB0aGUgZXJyb3IgbGlzdGVuZXIuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8wNy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMgRm9sbG93aW5nV2Fsa2VyLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5GaXggZm9yIGJ1ZyByZXBvcnRlZCBieSBEYXZlIEhhZmZuZXIgJmx0O2RhdmUuaGFmZm5lckB4bWxzLmNvbSZndDsKLSAwMi8wNi8yMDAxIDA0OjAzIEFNCi0gSW4gcGFyZW50Tm9kZSgpLCBkb24ndCBzY3JlZW4gb3V0IG5leHRBbmNlc3Rvciwgc2luY2UgdGhlIHBhcmVudAotIGlzIG5ldmVyIGFjdHVhbGx5IHJldHVybmVkLiBUaGlzIHNldHMgdGhpbmdzIHVwIGNvcnJlY3RseSBmb3IgZmlyc3RDaGlsZAotIGFuZCBuZXh0U2libGluZy48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzA3LzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcyBQcmVjZWRpbmdXYWxrZXIuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkZpeCBmb3IgYnVnIHJlcG9ydGVkIGJ5IERhdmUgSGFmZm5lciAmbHQ7ZGF2ZS5oYWZmbmVyQHhtbHMuY29tJmd0OwotIDAyLzA2LzIwMDEgMDQ6MDMgQU0KLSBJbiBuZXh0U2libGluZygpLCBkb24ndCByZXR1cm4gbnVsbCBpZiBpc0FuY2VzdG9yT2ZSb290Q29udGV4dCwgaW5zdGVhZAotIGRvIG5leHQuZ2V0Rmlyc3RDaGlsZCgpLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMDcvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94cGF0aCBTb3VyY2VUcmVlTWFuYWdlci5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4IGZvciBidWcgcmVwb3J0ZWQgYnkgYW5kZXJzLmRvbWVpakB1Yy5zZQotIDAyLzA3LzIwMDEgMDk6MzUgQU0KLSByZW1vdmVkIGV4dHJhIGJvZ3VzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIGRlY2wgaW4gcmVzb2x2ZVVSSTxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMDgvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zdHJlZSBTb3VyY2VUcmVlSGFuZGxlci5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4IGJ1ZyByZXBvcnRlZCBieSBKYXNvbiBIYXJyb3AgJmx0O2poYXJyb3BAYmlncG9uZC5uZXQuYXUmZ3Q7Ci0gMDIvMDcvMjAwMSAwODoxMiBQTQotIERvbid0IHByb2Nlc3MgY29tbWVudCBvciB3aGl0ZXNwYWNlIGV2ZW50cyBpZiBpbnNpZGUgYSBzdGFydERURC9lbmREVEQKLSBldmVudC48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzEwLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcyBXYWxrZXJGYWN0b3J5LmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5JbiBpbmRpcmVjdCByZXNwb25zZSB0byBidWcgcG9zdGVkIGJ5ICJUaGVlIEJvb24gSG9vIiAmbHQ7dGhlZWJoQG5ld3N0YWtlcy5jb20mZ3Q7Ci0gMDIvMDcvMjAwMSAwOTozNyBQTQotCi0gIi8vdGFibGVbMV0iIHBhdHRlcm5zIHdvdWxkIGdpdmUgb25lIG5vZGUKLSB3aGVuIHRoZXkgc2hvdWxkIGhhdmUgZ2l2ZW4gMiwgd2hlbiBhcHBsaWVkIHRvIEJvb24gSG9vJ3MKLSBzb3VyY2UuCi0gIi8vdGFibGVbMV0iIGlzIGVxdWl2ZWxlbnQgdG8KLSAiL2Rlc2NlbmRhbnQtb3Itc2VsZjo6bm9kZSgpL3RhYmxlWzFdIiwKLSBhbmQgc28gbXVzdCByZXR1cm4gdGhlIGZpcnN0IHRhYmxlIGNoaWxkCi0gb2YgZWFjaCB0YWJsZS1pbnN0IGVsZW1lbnQuCi0KLSBBbiBvcHRpbWl6YXRpb24gd2FzIG9wdGltaXppbmcgdGhpcyB0bwotICIvZGVzY2VuZGFudC1vci1zZWxmOjp0YWJsZSwgd2hpY2ggaXMKLSBmaW5lIGFzIGxvbmcgYXMgaW5kZXhpbmcgaXNuJ3QgdXNlZC4gU2luY2UKLSB3ZSBjYW4gbm90IHRlbGwgdW50aWwgcnVudGltZSBpZiBpbmRleGluZwotIGlzIGJlaW5nIHVzZWQsIHdlIGhhdmUgdG8gdHVybiBvZiB0aGlzCi0gb3B0aW1pemF0aW9uIGZvciBhbGwgcHJlZGljYXRlZCAiLy9mb29beHhdIgotIHBhdHRlcm5zLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5tbWlkeUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMTIvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9wcm9jZXNzb3IgU3R5bGVzaGVldFBJSGFuZGxlci5qYXZhCi0gVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+UGF0Y2ggZm9yIERtaXRyaSBJSXlpbiB0byB1c2UgdGhlIHNwZWNpZmllZCBVUklSZXNvbHZlci48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+bW1pZHlAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzEyLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzIEVsZW1OdW1iZXIuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPk51bWJlciBFeHByZXNzaW9uIHNob3VsZCBiZSBldmFsdWF0ZWQgdGhlbiByb3VuZGVkIHVwLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMTMvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IFByb2Nlc3MuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkNyZWF0ZSBhIGRvY3VtZW50IGZyYWdtZW50IGZvciB0aGUgb3V0cHV0IG5vZGUsIGZvciAtZmxhdm9yIGQyZC48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzEzLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveHBhdGgvY29tcGlsZXIgQ29tcGlsZXIuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gcXVvIGlzIHVzZWQuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8xMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcyBFbGVtQ2FsbFRlbXBsYXRlLmphdmEKLSBFbGVtQ2hvb3NlLmphdmEgRWxlbUNvcHkuamF2YSBFbGVtRmFsbGJhY2suamF2YQotIEVsZW1JZi5qYXZhIEVsZW1MaXRlcmFsUmVzdWx0LmphdmEKLSBFbGVtVGVtcGxhdGUuamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIgVHJhbnNmb3JtZXJJbXBsLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5SZW1vdmUgZXh0cmEgbWV0aG9kL2NhbGwgdG8gVHJhbnNmb3JtZXJJbXBsLmV4ZWN1dGVDaGlsZFRlbXBsYXRlcygpPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8xMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL3BhdHRlcm5zIE5vZGVUZXN0LmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5SZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGluc3RlYWQgb2YgbnVsbCBmcm9tIGdldExvY2FsTmFtZSgpIHdoZW4gdGhlCi0gbm9kZXRlc3QgZG9lcyBub3QgaGF2ZSBhIG5hbWUuIEVuY291bnRlcmVkIHdpdGggdGhlIFNRTCBleHRlbnNpb24sCi0gaW4gcmVzcG9uc2UgdG8gYnVnIHJlcG9ydGVkIGJ5ICJNaWNoYWVsIEtheSIgJmx0O21oa2F5QGljbHdheS5jby51ayZndDssCi0gMDIvMDgvMjAwMSAwODo1NyBBTS48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzEzLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vbGliL3NxbCBDb2x1bW5EYXRhLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5JbiBnZXREYXRhKCkgcmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mIG51bGwgaWYgdGhlcmUgaXMKLSBubyBkYXRhIHRvIGJlIG9idGFpbmVkLgotIEluIHJlc3BvbnNlIHRvIGJ1ZyByZXBvcnRlZCBieSAiTWljaGFlbCBLYXkiICZsdDttaGtheUBpY2x3YXkuY28udWsmZ3Q7LAotIDAyLzA4LzIwMDEgMDg6NTcgQU0uPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmdhcnlwQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8xOS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2V4dGVuc2lvbnMgTWV0aG9kUmVzb2x2ZXIuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkNvcnJlY3QgQ29udmVyc2lvbkluZm8gYXJyYXkgZm9yIE5vZGUtU2V0IGFuZCBSVEYuIFJlbW92ZSBEb2N1bWVudEZyYWdtZW50IAotZnJvbSBSVEYgYW5kIHJlcGxhY2Ugd2l0aCBOb2RlTGlzdC4gUmVtb3ZlIGR1cGxpY2F0ZSBCb29sZWFuIGZyb20gYm90aC4gRml4IAotQm9vbGVhbiBjb252ZXJzaW9uIHRvIG1ha2UgamF2YS5sYW5nLkJvb2xlYW4gaGlnaGVyIHRoYW4gc3RyaW5nLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMTkvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9saWIvc3FsIENvbHVtbkhlYWRlci5qYXZhCi0gUm93U2V0LmphdmEgWFN0YXRlbWVudC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+VXNlIG51bGwgbm9kZXRlc3QgdG8gbWVhbiB0aGUgc2FtZSBhcyAibm9kZSgpIi4gVGhpcyBmaXhlcyBhIGJ1ZyByZXBvcnRlZAotIGJ5ICJWb3l0ZW5rbywgRGltaXRyeSIgJmx0O0RWb3l0ZW5rb0BTRUNUT1JCQVNFLkNPTSZndDsKLSB3aGVyZSAmbHQ7eHNsOmNvcHktb2Ygc2VsZWN0PSJzcWw6cXVlcnkoLi4uKSIvJmd0OwotIGNyYXNoZXMgd2l0aCBOdWxsUG9pbnRlckV4Y2VwdGlvbiwgaS5lLgotIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB3ZSByZWFsbHkgZG9uJ3Qgd2FudAotIHRvIHNldCB0aGUgTm9kZVRlc3QuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8yMC8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2NvbXBpbGVyIFhQYXRoUGFyc2VyLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5DaGVjayBmb3IgbnVsbCB0b2tlbiBiZWZvcmUgY2hlY2tpbmcgaWYgaXQgaXMgYSBsZXR0ZXI8YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzIwLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIKLSBUcmFuc2Zvcm1lcklkZW50aXR5SW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4IG1hZGUgZm9yIGJ1ZyByZXBvcnRlZCBieSAiR2xlbmNyb3NzLCBDaHJpc3RpYW4iIAotJmx0O0NocmlzdGlhbi5HbGVuY3Jvc3NAZ3MuY29tJmd0OwotIG9uIDAyLzE2LzIwMDEgMTA6MTggQU0uCi0gWGVyY2VzIDEuMi4zIFNBWCBwYXJzZXIgY2FsbHMKLSBoYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcigpIGJlZm9yZSBoYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKS4KLSBUcmFuc2Zvcm1lcklkZW50aXR5SW1wbC5tX3Jlc3VsdENvbnRlbnRIYW5kbGVyIGlzbid0IGluaXRpYWxpc2VkIHVudGlsCi0gVHJhbnNmb3JtZXJJZGVudGl0eUltcGwuc3RhcnREb2N1bWVudCgpIGlzIGNhbGxlZC4KLSBBZGRlZCBsYXp5IGNvbnN0cnVjdGlvbiBvZiByZXN1bHQgaGFuZGxlcgotIGluIHNldERvY3VtZW50TG9jYXRvciwgaW4gYWRkaXRpb24gdG8KLSBzdGFydERvY3VtZW50Ljxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5nYXJ5cEBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMjEvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9saWIgRXh0ZW5zaW9ucy5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Q29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZiBzdHJpbmcgdmFsdWUgb2YgYSBub2RlLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5kbGVzbGllQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8yMS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9zcWwgQ29sdW1uLmphdmEKLSBDb2x1bW5BdHRyaWJ1dGUuamF2YSBDb2x1bW5EYXRhLmphdmEKLSBDb2x1bW5IZWFkZXIuamF2YSBSb3cuamF2YSBSb3dTZXQuamF2YQotIFN0cmVhbWFibGVOb2RlLmphdmEgWENvbm5lY3Rpb24uamF2YQotIFhTdGF0ZW1lbnQuamF2YSBwYWNrYWdlLmh0bWw8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BZGRlZCBleHBlcmltZW50YWwgdXNhZ2UgbWV0YXRhZyB0byBhbGwgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UsCi0gYW5kIGFuIGV4cGxhbmF0b3J5IG5vdGUgdG8gcGFja2FnZS5odG1sLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMjIvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zdHJlZSBFbGVtZW50SW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+QnVnIGZpeCBhdHRyaWJ1dGVkIHRvIE5vcm1hbiBXYWxzaCAmbHQ7bmR3QG53YWxzaC5jb20mZ3Q7LCBvbgotIDAyLzIwLzIwMDEgMDk6NTAgQU0uIGlmIHRoZSBhdHRyaWJ1dGUgJ25hbWUnIGRvZXNuJ3Qgb2NjdXIgaW4gdGhlIEF0dExpc3QsIAotdGhlCi0gcmVzdWx0IG9mIGdldEluZGV4KG5hbWUpIGlzIC0xLCBidXQKLSBnZXRDaGlsZEF0dHJpYnV0ZSgpIHdvdWxkIGluY29ycmVjdGx5Ci0gcmV0dXJuIHRoZSBmaXJzdCBhdHRyaWJ1dGUuIEZpeCByZXR1cm5zCi0gbnVsbCBpZiBpbmRleCAmbHQ7IDAuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8yMi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3NlcmlhbGl6ZSBTZXJpYWxpemVyVG9YTUwuamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIKLSBUcmFuc2Zvcm1lcklkZW50aXR5SW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+SW1wbGVtZW50IERlY2xIYW5kbGVyIGZvciBpZGVudGl0eSB0cmFuc2Zvcm1zPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8yMi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyIFRyYW5zZm9ybWVySW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4IGZvciBidWcgb3JpZ2luYWxseSByZXBvcnRlZCBieSBEYXJ5bCBCZWF0dGllICZsdDtEYXJ5bEJAc2NyZWFtaW5nbWVkaWEuY29tJmd0OwotIG9uIDAyLzE0LzIwMDEgMDQ6MTYgUE0uIEEgaGFuZyB3YXMgb2NjdXJpbmcgaW5zaWRlIHRoZSB1c2UKLSBvZiBhIFJlc3VsdCBUcmVlIEZyYWdtZW50LiBXaGVuIHRoZSByZXN1bHQgdHJlZSBmcmFnZW1lbnQgd2FzCi0gYmVpbmcgY3JlYXRlZCwgdGhlIFJlZGlyZWN0IGV4dGVuc2lvbiB3YXMgYmVpbmcgY2FsbGVkLCB3aGljaAotIGNhbGxlZCBjcmVhdGVSZXN1bHRDb250ZW50SGFuZGxlciB3aGljaCBzZXQgdGhlIENvbnRlbnRIYW5kbGVyCi0gaW4gdGhlIFRyYW5zZm9ybWVyLCBidXQgbm90IGluIHRoZSBSZXN1bHRUcmVlSGFuZGxlci4gVGhlbiwgUmVkaXJlY3QKLSBjYWxsZWQgVHJhbnNmb3JtZXIjZXhlY3V0ZUNoaWxkVGVtcGxhdGVzKAotIEVsZW1UZW1wbGF0ZUVsZW1lbnQgZWxlbSwgTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlLCAKLUNvbnRlbnRIYW5kbGVyIGhhbmRsZXIpCi0gd2hpY2ggc2F2ZXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgY29udGVudCBoYW5kbGVyIGluCi0gdGhlIHRyYW5zZm9ybWVyLCBhbmQgdGhlbiBzZXRzIHRoZSBuZXcgb25lIGJ5IGNhbGxpbmcgc2V0Q29udGVudEhhbmRsZXIsCi0gd2hpY2ggc2V0cyB0aGUgQ29udGVudEhhbmRsZXIgaW4gdGhlIFJlc3VsdFRyZWVIYW5kbGVyIGFzIHdlbGwKLSBhcyB0aGUgVHJhbnNmb3JtZXIuIFdoZW4gaXQgdHJpZWQgdG8gcmVzdG9yZSB0aGUgb2xkIENvbnRlbnRIYW5kbGVyLAotIGl0IHJlc3RvcmVkIHRoZSB2YWx1ZSBpbiB0aGUgUmVzdWx0VHJlZUhhbmRsZXIgdG8gYSBTZXJpYWxpemVyLCBpbnN0ZWFkCi0gb2YgdGhlIGNvcnJlY3QgQ29udGVudEhhbmRsZXIuIFdoZW4gdHJhbnNmb3JtVG9SVEYgdGhlbiBjYWxsZWQKLSBlbmREb2N1bWVudCBvbiBpdCdzIHJlc3VsdFRyZWVGcmFnbWVudCwgdGhlIGV2ZW50IHdhcyBzZW50Ci0gdG8gdGhlIFNlcmlhbGl6ZXIgaW5zdGVhZCBvZiB0aGUgU291cmNlVHJlZUhhbmRsZXIsIGFuZCB0aHVzIHRoZQotIGlzQ29tcGxldGUgZmxhZyB3YXMgbm90IHNldCwgYW5kIHRodXMgdGhlIGhhbmcuICh3aGV3ISkKLSBUaGUgZml4IGlzIGluIGV4ZWN1dGVDaGlsZFRlbXBsYXRlcyBzYXZlIHRoZSB2YWx1ZSBvZiB0aGUKLSByZXN1bHRUcmVlSGFuZGxlcidzIGNvbnRlbnRIYW5kbGVyIGFzIHdlbGwgYXMgVHJhbnNmb3JtZXIncwotIGNvbnRlbnQgaGFuZGxlciwgYW5kIHJlc3RvcmUgdGhlbSBib3RoLiBBIG1vcmUgYXJjaGl0ZWN0dWFsIGZpeAotIGNvdWxkIGJlIG1hZGUsIGJ1dCBub3Qgd2l0aG91dCBoaWdoIHJpc2ssIHNvIEkgdGhpbmsgdGhpcyBpcyB0aGUgYmVzdAotIGFuZCBzYWZlc3Qgd2F5IHRvIGZpeCBpdC48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+ZGxlc2xpZUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMjMvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9yZXMgWFNMVEluZm8ucHJvcGVydGllczxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkNoYW5nZWQgdmVyc2lvbiB0byAyLjAuMTxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5kbGVzbGllQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8yMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3NvciBYU0xQcm9jZXNzb3JWZXJzaW9uLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5DaGFuZ2VkIHZlcnNpb24gdG8gMi4wLjE8YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+Y3VyY3VydUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMjgvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9yZXMgWFNMVEVycm9yUmVzb3VyY2VzLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5VcGRhdGUgdGV4dCBvZiBlcnJvciBtZXNzYWdlcwotIFN1Ym1pdHRlZCBieTogQW5kcmVhcyBaZWhucGZ1bmQ8YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+Y3VyY3VydUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMjgvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IFByb2Nlc3MuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPlVwZGF0ZSBwcmludEFyZ09wdGlvbnMoKSB3aXRoIGJldHRlciB0ZXh0IGFuZCB0byBiZXR0ZXIgcmVmbGVjdCBhY3R1YWwKLSBvcHRpb25zIHRoYXQgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ7IGNhdGNoIG1pc3NpbmcgLUlOIGFyZ3VtZW50PGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmprZXNzZWxtQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8wNS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2NsaWVudCBYU0xUUHJvY2Vzc29yQXBwbGV0LmphdmEKLSBqYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3NvciBTdHlsZXNoZWV0SGFuZGxlci5qYXZhCi0gVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zdHJlZSBEb2NJbXBsLmphdmEKLSBTdHJlZURPTUJ1aWxkZXIuamF2YSBUZXh0SW1wbC5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMgT3V0cHV0UHJvcGVydGllcy5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IFByb2Nlc3MuamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzIEZhc3RTdHJpbmdCdWZmZXIuamF2YQotIGphdmEvc3JjL3RyYXggdHJheC5wcm9wZXJ0aWVzPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+TmV3IGFwcHJvYWNoIHRvIEZhc3RTdHJpbmdCdWZmZXIsIGFuZCBjaGFuZ2VzIG5lZWRlZCB0byBzdXBwb3J0IGl0LgotIFdlIHN0aWxsIG5lZWQgdG8gZG8gc29tZSBzZXJpb3VzIHdvcmsgb24gYm90aCB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlCi0gdHVuaW5nIHBhcmFtZXRlcnMgYW5kIHRoZSBoZXVyaXN0aWNzIGRyaXZpbmcgdGhlICJjaHVuayBncm93dGgiIGFsZ29yaXRobXMuCi0gQ3VycmVudGx5IHNldCBmb3IgZml4ZWQtc2l6ZWQgY2h1bmtzIG9mIDhLY2ggaW4gbWFpbiB0cmVlLCAuNUtjaCBpbiBSVEYuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8wNi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcyBFbGVtRWxlbWVudC5qYXZhCi0gRWxlbUZvckVhY2guamF2YSBFbGVtTGl0ZXJhbFJlc3VsdC5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lcgotIENsb25lclRvUmVzdWx0VHJlZS5qYXZhIFF1ZXVlZFNBWEV2ZW50LmphdmEKLSBRdWV1ZWRTdGFydERvY3VtZW50LmphdmEgUXVldWVkU3RhcnRFbGVtZW50LmphdmEKLSBSZXN1bHRUcmVlSGFuZGxlci5qYXZhIFRyYW5zZm9ybWVySW1wbC5qYXZhCi0gVHJlZVdhbGtlcjJSZXN1bHQuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkZpeCBmb3IgaHR0cDovL25hZ295YS5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD03NDEuCi0KLSAxKSBSZXN1bHRUcmVlSGFuZGxlciBub3cgaW1wbGVtZW50cyB0aGUgVHJhbnNmb3JtU3RhdGUgaW50ZXJmYWNlLgotIDIpIFF1ZXVlZCBzdGF0ZSBzdWNoIGFzIHRoZSBjdXJyZW50IG5vZGUgYW5kIHRoZSBjdXJyZW50IHRlbXBsYXRlIGlzIHN0b3JlZCAKLWFzIHBhcnQgb2YgUXVldWVkU3RhcnRFbGVtZW50LiBTdG9yYWdlIHdpbGwgb25seSBvY2N1ciBpZiB0aGUgQ29udGVudEhhbmRsZXIgCi1pbXBsZW1lbnRzIFRyYW5zZm9ybUNsaWVudC4KLSAzKSBXaGVuIHN0YXRlIGlzIHJlcXVlc3RlZCAoZm9yIGluc3RhbmNlIFRyYW5zZm9ybVN0YXRlI2dldEN1cnJlbnRFbGVtZW50KCkpLCAKLWlmIHRoZSBxdWV1ZWQgZWxlbWVudCBpcyBudWxsIG9yIG5vdCBwZW5kaW5nIChmb3IgaW5zdGFuY2UsIGluIGEgY2hhcmFjdGVycyAKLWV2ZW50KSwgaXQgd2lsbCBnZXQgdGhlIHN0YXRlIGZyb20gdGhlIHRyYW5zZm9ybWVyLCBvdGhlcndpc2UgaXQgd2lsbCBnZXQgdGhlIAotc3RhdGUgZnJvbSB0aGUgcXVldWVkIGVsZW1lbnQuCi0KLSBPdGhlciBmaXhlcyB3ZXJlIGF0dGVtcHRlZCBmb3IgdGhpcyBwcm9ibGVtLCBpbmNsdWRpbmcgdHJ5aW5nIHRvCi0gZ2V0IHJpZCBvZiBxdWV1ZWluZyBhbHRvZ2V0aGVyLCBhbmQgZmx1c2hpbmcgYSBiaXQgZWFybGllciBiZWZvcmUKLSB0aGUgc3RhdGUgd2FzIHB1c2hlZCBvbiB0aGUgdmFyaW91cyBzdGFja3MsIGJ1dCBib3RoIG9mCi0gdGhlc2UgaGFkIHNob3ctc3RvcHBpbmcgaXNzdWVzIChzZWUgZGlzY3Vzc2lvbnMKLSBvbiB4YWxhbi1kZXYpLgotCi0gTm90ZSB0aGF0IGZvciB0aGUgbW9tZW50IHRoZSBDb250ZXh0Tm9kZUxpc3QgaXMgbm9kZQotIGNsb25lZCBhcyBpdCBuZWVkcyB0byBiZSBpbiBvcmRlciBmb3IKLSBUcmFuc2Zvcm1TdGF0ZSNnZXRDb250ZXh0Tm9kZUxpc3QuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmdhcnlwQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8wNi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcyBFbGVtUGFyYW0uamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveHBhdGggQXJnLmphdmEgVmFyaWFibGVTdGFjay5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+VGhlIGZpZWxkIEFyZy5pc1BhcmFtVmFyIHdhcyBhdHRlbXB0aW5nIHRvIHNlcnZlIHR3byBmdW5jdGlvbnM6IHRvIGluZGljYXRlIAotdmFyaWFibGUgRnJhbWUgZW50cmllcyB3aGljaCBhcmUgbm90IGN1cnJlbnRseSBhY3RpdmF0ZWQgYW5kIHRvIGluZGljYXRlIEZyYW1lcyAKLWNvbnRhaW5pbmcgcGFyYW1ldGVycyBwYXNzZWQgd2l0aCB4c2w6d2l0aC1wYXJhbS4gV2hlbiBwcm9jZXNzaW5nIHdhcyBmaW5pc2hlZCAKLWZvciBhIG5vZGUgaW4gYSBub2RlLXNldCwgdGhlIGlzUGFyYW1WYXIgZmxhZyB3YXMgdHVybmVkIG9uIHRvIGluZGljYXRlIHRoZSAKLUZyYW1lIHNsb3Qgd2FzIGF2YWlsYWJsZS4gVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIGluZGljYXRlZCB0aGF0IHRoZSBpdGVtIHdhcyAKLXBhc3NlZCBhcyBhIHBhcmFtZXRlciB3aGljaCBpdCB3YXNuJ3QuIFRoaXMgZml4IGNoYW5nZXMgaXNQYXJhbVZhciBpbnRvIHRvIAotZmllbGRzLCBpc0F2YWlsYWJsZSB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgc2xvdCBpcyBhdmFpbGFibGUgYW5kIAotaXNGcm9tV2l0aFBhcmFtIGluZGljYXRpbmcgdGhlIEZyYW1lIHNsb3QgY2FtZSBmcm9tIGFuIHhzbDp3aXRoLXBhcmFtIG9yIGEgCi10b3AtbGV2ZWwgcGFyYW1ldGVyIHBhc3NlZCBpbiB2aWEgdGhlIHRyYW5mb3JtZXJJbXBsLnNldFBhcmFtZXRlcigpIEFQSS4KLSBJIGhhdmUgdGVzdGVkIHRoaXMgY2hhbmdlIGFnYWluc3QgdGhlIGNvbmZvcm1hbmNlIHN1aXRlIGFuZCBoYWQgbm8gCi1yZWdyZXNzaW9uLiBJJ3ZlIGFsc28gc3VibWl0dGVkIGEgdGVzdCBjYXNlIHdoaWNoIGZhaWxzIG9uIHRoZSBleGlzdGluZyAKLWNvZGViYXNlIGJ1dCB3b3JrcyBva2F5IGFmdGVyIHRoaXMgZml4LgotIEl0IGlzIHBvc3NpYmxlIHRoYXQgSSd2ZSBtaXNzZWQgc29tZXRoaW5nIHdpdGggcmVnYXJkIHRvIHRoZSBBUEkgc2V0UGFyYW1ldGVyIAotY2FsbHMgYnV0IHdlIGNhbiBmaXggdGhvc2UgaWYgcHJvYmxlbXMgYXJlIHJlcG9ydGVkLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5nYXJ5cEBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMDcvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMgRmFzdFN0cmluZ0J1ZmZlci5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Q29ycmVjdCBvcGVyYXRpb24gd2hlbiBsZW5ndGggb2YgY29udGVudCB0byBiZSBhcHBlbmRlZCBpcyB6ZXJvLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5tbWlkeUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMDcvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zZXJpYWxpemUgU2VyaWFsaXplclRvWE1MLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5GaXggY2xvc2luZyBvdXQgZG9jdHlwZSBkZWNsYXJhdGlvbjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5tbWlkeUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMDgvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMgU3lzdGVtSURSZXNvbHZlci5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Q2hhbmdlIFN5c3RlbUlkUmVzb2x2ZXIgdG8gZGVmYXVsdCB0byB1c2VyLmRpciBpZiB0aGUgYmFzZSBVUkkgaXMgbnVsbDxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5nYXJ5cEBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMDkvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lciBUcmFuc2Zvcm1lckltcGwuamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveHBhdGggVmFyaWFibGVTdGFjay5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+UGFyYW1ldGVycyBzZXQgd2l0aCBzZXRQYXJhbWV0ZXIgd2VyZSBhdmFpbGFibGUgdG8gc3R5bGVzaGVldCBhcyB2YXJpYWJsZSAKLXJlZmVyZW5jZXMgKCRteVBhcmFtKSBldmVuIHRob3VnaCB0aGVyZSB3YXMgbm8geHNsOnBhcmFtIGVsZW1lbnQgdG8gcmVjZWl2ZSBpdC48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+bW1pZHlAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzA5LzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIKLSBUcmFuc2Zvcm1lcklkZW50aXR5SW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Q2hlY2sgaWYgdGhlcmUgaXMgYSBEZWNsSGFuZGxlciBiZWZvcmUgY2FsbGluZyBpdC48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzExLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5QYXRjaCBhdHRyaWJ1dGVkIHRvIFBhdHJpY2sgTW9vcmUgJmx0O3BhdHJpY2ttQHJpb3BvcnQuY29tJmd0OyBvbiAwMy8wOS8yMDAxLgotIEFkZHMgYW5vdGhlciBjb25zdHJ1Y3RvciB0byBwYXNzIGluIHRoZSBlcnJvciBtZXNzYWdlLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTEvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMgRWxlbUF0dHJpYnV0ZS5qYXZhCi0gRWxlbUVsZW1lbnQuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkNoZWNraW4gYWRkcmVzc2VzIGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9OTIzLgotIGVsZW1BdHRyaWJ1dGUgbm93IGRlcml2ZXMgZnJvbSBlbGVtRWxlbWVudCBzbyB0aGUgYmFzaWMgbmFtZSByZXNvbHV0aW9uCi0gY29kZSBjYW4gYmUgc2hhcmVkLiBCcmVha3MgYXR0cmlic2V0MjQgdGVzdCwgYnV0IEkgdGhpbmsgdGhlIG5ld2VyCi0gYmVoYXZpb3IgaXMgYmV0dGVyLiBOZXcgdmlydHVhbCBtZXRob2RzIG92ZXJsb2FkZWQgYnkgZWxlbUF0dHJpYnV0ZSBhcmUKLSBjb25zdHJ1Y3ROb2RlLCByZXNvbHZlUHJlZml4LCBhbmQgdmFsaWRhdGVOb2RlTmFtZS4gQWxzbywgaW4gdGhlCi0gZWxlbUF0dHJpYnV0ZSNleGVjdXRlIG1ldGhvZCwgY2hlY2tzIGFyZSBtYWRlIHRvIG1ha2Ugc3VyZSBhbgotIGVsZW1lbnQgaXMgcGVuZGluZy48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzExLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzIFN5c3RlbUlEUmVzb2x2ZXIuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkFkZGVkIGdldEFic29sdXRlVVJJKFN0cmluZyB1cmwpLCBhbmQgbWVyZ2UKLSB3aXRoIE15cmlhbSdzIGNoYW5nZXMuCi0gUGFydCBvZiBmaXggZm9yIHByb2JsZW0gZm91bmQgd2hlbgotIGludmVzdGlnYXRpbmcgaHR0cDovL25hZ295YS5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD05MDYuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3NvcgotIFRyYW5zZm9ybWVyRmFjdG9yeUltcGwuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkNhbGwgZ2V0QWJzb2x1dGVVUkkoU3RyaW5nIHVybCkgZm9yIHRoZSBzb3VyY2UgVVJMLgotIEZpeCBmb3IgcHJvYmxlbSBmb3VuZCB3aGVuCi0gaW52ZXN0aWdhdGluZyBodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTkwNi4KLSBUaGlzIHRyaWVzIHRvIGZvcmNlIHVzIGFsd2F5cyBoYXZpbmcgYW4gYWJzb2x1dGUgVVJMIGluIHRoZSBwcm9jZXNzaW5nCi0gc3RhY2sgYXMgdGhlIGJhc2UgVVJMLCB3aGljaCBzaG91bGQgYmUgT0ssIEkgaG9wZS48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzExLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIgVHJhbnNmb3JtZXJJbXBsLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5DYWxsIGdldEFic29sdXRlVVJJKFN0cmluZyB1cmwpIGZvciB0aGUgc291cmNlIFVSTC4KLSBGaXggZm9yIHByb2JsZW0gZm91bmQgd2hlbgotIGludmVzdGlnYXRpbmcgaHR0cDovL25hZ295YS5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD05MDYuCi0gVGhpcyB0cmllcyB0byBmb3JjZSB1cyBhbHdheXMgaGF2aW5nIGFuIGFic29sdXRlIFVSTCBpbiB0aGUgcHJvY2Vzc2luZwotIHN0YWNrIGFzIHRoZSBiYXNlIFVSTCwgd2hpY2ggc2hvdWxkIGJlIE9LLCBJIGhvcGUuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyIFF1ZXVlZEV2ZW50cy5qYXZhCi0gUXVldWVkU3RhcnRFbGVtZW50LmphdmEgUmVzdWx0VHJlZUhhbmRsZXIuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPlRoZSB1c2VyIGZvciBodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTc0MSByZXBvcnRlZAotIHByb2JsZW1zIG9uIHRlc3RpbmcsIHNvIHRoZXNlIGNoYW5nZXMgYXJlIGEgcmUtZml4LiBIZSB0ZXN0ZWQgYW5kCi0gZXZlcnl0aGluZyBzZWVtcyBPSyBub3cuIFRoZXJlIGFjdHVhbGx5IG1heSBiZSBhIHNsaWdodCBwZXJmb3JtYW5jZQotIGltcHJvdmVtZW50IGludm9sdmVkIGhlcmUuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3NlcmlhbGl6ZSBTZXJpYWxpemVyVG9IVE1MLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BcHBsaWVkIHBhdGNoZXMgZnJvbSBkbWl0cmkuaWx5aW5AbWVtaXEuY29tIChEbWl0cmkgSWx5aW4pCi0gZnJvbSBodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTcwNS48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzExLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveHBhdGggWFBhdGhBUEkuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkFwcGxpZWQgcGF0Y2ggc3VibWl0dGVkIGJ5IG5ib3lkQGF0Zy5jb20gKE5vcnJpcyBCb3lkKQotIGF0IGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NzAyLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTEvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zZXJpYWxpemUgRW5jb2RpbmdzLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BcHBsaWVkIHBhdGNoIHN1Ym1pdHRlZCBieSBoYXZhcmR3QHVuZGVyZHVza2VuLm5vIChI5bahcmQgV2lndGlsKS4KLSBBbHNvIGFkZGVkICJYWFgtWCIgdmFyaWFudHMgZm9yIGFsbCAiWFhYX1giIGphdmEgZW5jb2RpbmcgbmFtZXMuCi0gSSdtIG5vdCB0b3RhbGx5IGNvbmZpZGVudCB0aGF0IHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLCBidXQgSSBjYW4ndAotIHNlZSB0aGF0IGl0IHdpbGwgaHVydCwgZXhjZXB0IHRvIG1ha2UgdGhlIHRhYmxlIGEgYml0IGxhcmdlci4gSQotIHdvdWxkIHByZWZlciB0byBiZSBzYWZlIGFuZCBtYWtlIHN1cmUgd2UgaGFuZGxlIHRoZSBlbmNvZGluZy4KLSBTZWUgbXkgY29tbWVudHMgaW4gaHR0cDovL25hZ295YS5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD03MTguPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcyBFbGVtVGVtcGxhdGVFbGVtZW50LmphdmEKLSBTdHlsZXNoZWV0Um9vdC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+TWlub3IgY2hhbmdlcyB0byBiZXR0ZXIgYm90dGxlbmVjayB0aHJvd2luZyBvZiBSdW50aW1lIGV4Y2VwdGlvbnMKLSBkdXJpbmcgcHJvY2Vzc2luZy48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzExLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yCi0gVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Q2F0Y2ggYWxsIGV4Y2VwdGlvbnMgdGhyb3duIHdoZW4gcHJvY2Vzc2luZyBzdHlsZXNoZWV0LCBhbmQgc2VuZAotIHRoZW0gdG8gdGhlIGVycm9yIGxpc3RlbmVyLiBUaGVyZSdzIHByb2JhYmx5IHNvbWUgZGFuZ2VyIG9mIGhhdmluZwotIHRoZSBzYW1lIGVycm9yIHNlbnQgdG8gdGhlIGVycm9yIGxpc3RlbmVyIG11bHRpcGxlIHRpbWVzLCBidXQgYmV0dGVyIHRvbwotIG1hbnkgcmVwb3J0cywgdGhhbiBub25lLCBJIGd1ZXNzLgotIFRoaXMgYWRkcmVzc2VzIGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9OTA2Ljxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTEvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9saWIvc3FsIFhDb25uZWN0aW9uLmphdmEKLSBYU3RhdGVtZW50LmphdmE8YnIvPjxyZWY+QWRkZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vbGliL3NxbCBDb25uZWN0aW9uUG9vbC5qYXZhCi0gRGVmYXVsdENvbm5lY3Rpb25Qb29sLmphdmEgRXh0ZW5zaW9uRXJyb3IuamF2YQotIFBvb2xlZENvbm5lY3Rpb24uamF2YSBRdWVyeVBhcmFtZXRlci5qYXZhCi0gU1FMRXh0ZW5zaW9uRXJyb3IuamF2YSBYQ29ubmVjdGlvblBvb2xNYW5hZ2VyLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5UaGVzZSBhcmUgSm9obiBHZW50aWxpbiAmbHQ7am9obmdsaW51eEBleWVjYXRjaGluZy5jb20mZ3Q7Ci0gcGF0Y2hlcyBmb3IgY29ubmVjdGlvbiBwb29saW5nIGFuZCBwYXJhbWV0ZXJpemVkCi0gcXVlcmllcy4gVGhlc2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgdW5zdGFibGUKLSByaWdodCBub3csIGFzIHdlIGFyZSBzdGlsbCB3b3JraW5nIG9uIHNvbWUgdGhpbmdzLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTEvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9wcm9jZXNzb3IgUHJvY2Vzc29ySW5jbHVkZS5qYXZhCi0gVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zZXJpYWxpemUgU2VyaWFsaXplclRvWE1MLmphdmEKLSBqYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3N0cmVlIFN0cmVlRE9NSGVscGVyLmphdmEKLSBqYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyIFJlc3VsdFRyZWVIYW5kbGVyLmphdmEKLSBUcmFuc2Zvcm1lcklkZW50aXR5SW1wbC5qYXZhIFRyZWVXYWxrZXIyUmVzdWx0LmphdmEKLSBqYXZhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscyBBdHRMaXN0LmphdmEgVHJlZVdhbGtlci5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94cGF0aCBET00ySGVscGVyLmphdmEgWFBhdGhDb250ZXh0LmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5UaGUgRE9NMkhlbHBlciNpc05vZGVBZnRlcihOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSBtZXRob2QKLSBoYXMgYmVlbiBmaXhlZCBzbyB0aGF0IGl0IG5vIGxvbmdlciBkb2VzIHRoZSB0cnkvY2F0Y2ggdGhpbmcgaWYgb25lCi0gb2YgdGhlIG5vZGVzIGRvZXNuJ3QgaW1wbGVtZW50IERPTU9yZGVyLCBidXQgaW5zdGVhZCBkb2VzIGFuCi0gaW5zdGFuY2VvZiB0ZXN0LiBJbiBTdHJlZURPTUhlbHBlciwgaXQgb3ZlcmxvYWRzIHRoaXMgbWV0aG9kIGFuZAotICpkb2VzKiBkbyB0aGUgdHJ5L2NhdGNoIGJ1c2luZXNzLCBzaW5jZSBhbG1vc3QgYWx3YXlzIGJvdGggbm9kZXMKLSB3aWxsIGltcGxlbWVudCBET01PcmRlciBpbiB0aGlzIGNhc2UsIGFuZCB0aGlzIHdpbGwgYmUgZmFzdGVyIHRoYW4KLSBhbiBpbnN0YW5jZW9mIHRlc3QuIEFsc28sIGluIHZhcmlvdXMgY2xhc3NlcywgSSBkaWQgc29tZSBzdHVmZiB0byB0cnkKLSBhbmQgbWFrZSBzdXJlIHRoYXQgYSBET00ySGVscGVyIHdhc24ndCBiZWluZyBjcmVhdGVkIGFuZCB1c2VkCi0gd2hlbiBhIFN0cmVlRE9NSGVscGVyIGlzIG5lZWRlZC4KLQotIFRoaXMgYWRkcmVzc2VzIGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9ODAwCi0gYW5kIHNob3VsZCBnaXZlIGEgZ29vZCBwZXJmb3JtYW5jZSBmaXggZm9yIGZvcmVpZ24gRE9NIHByb2Nlc3NpbmcuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL3BhdHRlcm5zIE5vZGVUZXN0LmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5YZXJjZXMgYXQgc29tZSBwb2ludCBkZWNpZGVkIHRvIHVzZSAiIiBpbnN0ZWFkCi0gb2YgbnVsbCBmb3IgbnVsbCBuYW1lc3BhY2VzLiBUaGVyZSBoYXMgYmVlbiBhCi0gZGlzY3Vzc2lvbiBiZXR3ZWVuIEdhcnkgUGVza2luIGluCi0gSm9lIEtlc3NsZW1hbiBvbiB4YWxhbi1kZXYgYWJvdXQgdGhpcywKLSBidXQgSSBoYWRuJ3QgYmVlbiBmdWxseSBrZWVwaW5nIHVwIHRoZSB0aGUKLSB0aHJlYWQgdGhhdCB3ZWxsLCBhbmQgbWlzc2VkIGl0J3MgcmVsYXRpb24gdG8KLSB0aGlzIHByb2JsZW0uIEkgaW5jbHVkZSBzb21lIG9mIHRoZSBkaXNjdXNzaW9uCi0gYXQgdGhlIGVuZCBvZiB0aGlzIG5vdGUuIEkgbWFkZSBYYWxhbiBiZSBhYmxlIHRvCi0gY29tcGFyZSBhICIiIG5hbWVzcGFjZSB0byBudWxsIGZvciBub3csIHVudGlsCi0gd2UgZ2V0IHRoaXMgcmVzb2x2ZWQuCi0KLSBUaGUgZ2lzdCBvZiB0aGUgZGlzY3Vzc2lvbiBvbiB4YWxhbi1kZXYgcmVnYXJkaW5nIHRoaXMgaXM6Ci0KLSAmZ3Q7Jmd0OzEuIERlY2xhcmUgdGhlIFhlcmNlcy1KIHN1cHBvcnQgb2Ygc2NoZW1hcyB0byBoYXZlIGEgYnVnIGFuZCBhc2sgdGhhdAotICZndDsmZ3Q7WGVyY2VzIGJlIGNvcnJlY3RlZCB0byBhbHdheXMgdXNlIGEgbnVsbCBuYW1lc3BhY2UgVVJJIHRvIGluZGljYXRlIHRoYXQKLSAmZ3Q7Jmd0O3RoZXJlIGlzIG5vIGRlZmF1bHQgbmFtZXNwYWNlLiBFdmVuIGlmIHRoZSBYZXJjZXMgcGVvcGxlIGNoYW5nZSB0aGlzCi0gJmd0OyZndDtiZWhhdmlvciwgaXMgdGhpcyBjb3JyZWN0PwotICZndDsKLSAmZ3Q7IFllcy4gSWYgeW91ciBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSBpcyBhY2N1cmF0ZSAoeW91IHNob3VsZCBwcm9iYWJseQotICZndDsgc3VibWl0IGEgbW9yZSBkZXRhaWxlZCBjYXNlIHNvIGl0IGNhbiBiZSByZXByb2R1Y2VkIGluIHRoZSBsYWIpLCB0aGlzIGlzIGEKLSAmZ3Q7IHBhcnNlci9ET00tYnVpbGRlciBidWcuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmNvc3RpbkBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTIvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9saWIvc3FsIEV4dGVuc2lvbkVycm9yLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5SZW1vdmVkICggY29tbWVudGVkIG91dCApIGR1bXAoKSBtZXRob2QgYW5kIHRoZSBpbXBvcnRzIGluIEV4dGVuc2lvbkVycm9yLgotCi0gU28gZmFyIHRoZSBtZXRob2QgZG9lc24ndCBzZWVtIHRvIGJlIHVzZWQgKCBubyB3YXJuaW5nIGluIHRoZSBjb21waWxlICkuCi0KLSBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoaXMgbWV0aG9kIGlzIGJyZWFraW5nIHRoZSBidWlsZCB3aXRoIGNyaW1zb24gKCBzaW5jZQotIGl0IHVzZXMgeGVyY2VzLXNwZWNpZmljIGNsYXNzZXMgKS4gSXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IGl0IG9uIHRvcAotIG9mIHRoZSBzZXJpYWxpemF0aW9uIGNsYXNzZXMgdGhhdCBhcmUgcGFydCBvZiB4YWxhbiAtIGlmIHNvbWVvbmUgbmVlZHMgdGhlCi0gbWV0aG9kIEknbGwgdHJ5IHRvIHBvcnQgaXQuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscyBUcmVlV2Fsa2VyLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BZGRlZCBiYWNrIGluIHRoZSBUcmVlV2Fsa2VyKENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyKQotIGNvbnN0cnVjdG9yLCBiZWNhdXNlIEknbSB3b3JyaWVkIEknbGwgYnJlYWsgbW9yZSBkZXBlbmRlbnQgY29kZS48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+bW1pZHlAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzEzLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vcmVzIFhTTFRFcnJvclJlc291cmNlcy5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IFByb2Nlc3MuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkltcGxlbWVudCBuZXcgYXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCBsaW5lIGludGVyZmFjZTogVVJJUmVzb2x2ZXIsIAotRW50aXR5UmVzb2x2ZXIgYW5kIENvbnRlbnRIYW5kbGVyPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcyBGdW5jRm9ybWF0TnVtYi5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4IGVycm9yIG1lc3NhZ2UgdG8gc2F5IHRoYXQgMiBvciAzIGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3NvciBQcm9jZXNzb3JMUkUuamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vcmVzIFhTTFRFcnJvclJlc291cmNlcy5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+QmV0dGVyIGVycm9yIG1lc3NhZ2UgZm9yIG1pc3Npbmcgb3IgaW5jb3JyZWN0IFhTTFQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGluIGEgCi1zdHlsZXNoZWV0PGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmdhcnlwQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2xpYiBSZWRpcmVjdC5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lciBUcmFuc2Zvcm1lckltcGwuamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdCBQcm9jZXNzLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5SZW1lbWJlciB0aGUgUmVzdWx0IHRoYXQgd2FzIHVzZWQgdG8gdHJpZ2dlciB0aGUgdHJhbnNmb3JtLiBBY2Nlc3MgdGhhdCAKLXJlc3VsdCBmcm9tIHRoZSBSZWRpcmVjdCBleHRlbnNpb24gdG8gbWFrZSBmaWxlIHJlZmVyZW5jZXMgaW4gUmVkaXJlY3QgcmVsYXRpdmUgCi10byB0aGUgb3JpZ2luYWwgcmVzdWx0IFVSSS4KLSBJZiB0aGlzIGlzIG5vdCBhdmFpbGFibGUsIHJlZmVyZW5jZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgVVJJLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTQvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94cGF0aCBWYXJpYWJsZVN0YWNrLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BZGRlZCBwcm90ZWN0aW9uIGZvciBudWxsIHBvaW50ZXIgZXhjZXB0aW9uIHRoYXQgSSBkaXNjb3ZlcmVkIHdoZW4KLSBydW5uaW5nIHNvbWUgQ29jb29uIHRlc3RzLiBTaW5jZSBJJ3ZlIG5ldmVyIHNlZW4gdGhpcyBiZWZvcmUsCi0gSSBhc3N1bWUgdGhpcyBpcyByZWxhdGVkIHRvIHRoZSBjaGFuZ2VzIHRoYXQgR2FyeSBtYWRlLCBidXQgYW0KLSB1bnN1cmUgYXMgaXQncyA0OjAwIGluIHRoZSBtb3JuaW5nIGFuZCBJJ20gdG9vIHRpcmVkIHRvIGxvb2sgaW50byBpdCBkZWVwbHkuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmN1cmN1cnVAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzE0LzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdCBQcm9jZXNzLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5SZW1vdmUgY2hlY2sgZm9yIG1pc3NpbmcgLUlOIGFyZzsgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHVzZQotIGNhc2VzIGZvciBjYWxsaW5nIFByb2Nlc3MubWFpbiB3aXRob3V0IGFuIFhNTCBkb2N1bWVudDxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5jb3N0aW5AYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzE0LzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdCBQcm9jZXNzLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BIChsYXN0ID8gKSBwbGFjZSB3aGVyZSBYTUxSZWFkZXJGYWN0b3J5IHdhcyB1c2VkIHdpdGhvdXQKLSB0cnlpbmcgamF4cCBmaXJzdC4gSSB1c2VkIHRoZSBzYW1lIGNvZGUgdGhhdCBpcyB1c2VkIGluIGFsbCBvdGhlcgotIHBsYWNlcyBpbiB4YWxhbi4KLQotIFdpdGggdGhpcyBjaGFuZ2UsIHRoZSBwYXJzZXIgZGVmaW5lZCBpbiBYU0xUSW5mby5wcm9wZXJ0aWVzIHdpbGwgYmUgdXNlZAotIG9ubHkgaWYgamF4cCBpcyBub3QgYXZhaWxhYmxlLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5kbGVzbGllQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xNC8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscyBTdHJpbmdWZWN0b3IuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkFkZGVkIG1pc3NpbmcgQHNlcmlhbCBKYXZhZG9jIHRhZ3MuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xNS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9zcWwgQ29ubmVjdGlvblBvb2wuamF2YQotICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdENvbm5lY3Rpb25Qb29sLmphdmEgRXh0ZW5zaW9uRXJyb3IuamF2YQotICAgICAgICAgICAgICAgICAgICAgICAgU1FMRXh0ZW5zaW9uRXJyb3IuamF2YSBYQ29ubmVjdGlvbi5qYXZhCi0gICAgICAgICAgICAgICAgICAgICAgICBYQ29ubmVjdGlvblBvb2xNYW5hZ2VyLmphdmEgWFN0YXRlbWVudC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+VXBkYXRlIGZyb20gSm9obiBHZW50aWxpbiAmbHQ7am9obmdsaW51eEBleWVjYXRjaGluZy5jb20mZ3Q7IHRvCi0gIGZpeCBjb25uZWN0aW9uIGNsZWFudXAuPGJyLz48YnIvPjwvbGk+PC91bD48cD5Db21wYXRpYmlsaXR5IHNvdXJjZSBjb2RlIHVwZGF0ZXM6PC9wPjx1bD48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+bW1pZHlAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzAyLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQgWFNMVElucHV0U291cmNlLmphdmEKLSBYU0xUUmVzdWx0VGFyZ2V0LmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5JbXBsZW1lbnQgc29tZSBtb3JlIG1ldGhvZHMgZm9yIGNvbXBhdGliaWxpdHk8YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+ZGxlc2xpZUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMDIvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdCBYU0xUSW5wdXRTb3VyY2UuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkZpeGVkIGphdmFkb2MgZm9yIGFwaSB0aGF0IHdhcyBqdXN0IGFkZGVkIGJhY2suPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmRsZXNsaWVAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzAyLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQgWFNMVFJlc3VsdFRhcmdldC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4ZWQgamF2YWRvYyBmb3IgYXBpIHRoYXQgd2FzIGp1c3QgYWRkZWQgYmFjay48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+bW1pZHlAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzAyLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQgWFNMVEVuZ2luZUltcGwuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkZpeCBwcm9ibGVtIHdpdGggY2FsbGluZyB0aGUgcHJvY2Vzc29yIHdpdGggYSBsaWFpc29uPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8wMi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IFhTTFRFbmdpbmVJbXBsLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5GaXggcHJvYmxlbSB3aGVyZSBzb3VyY2UgZmlsZSB3YXMgYmVpbmcgcGFyc2VkIG1vcmUgdGhhbiBvbmNlIGFuZCBpZiB1c2luZyBhbiAKLWlucHV0IHN0cmVhbSwgd2Ugd291bGQgZ2V0IGEgcmVhZCBlcnJvcjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5tbWlkeUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMTIvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdCBYU0xURW5naW5lSW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+U2V0IHN5c3RlbSBpZCBpbiBzdHlsZXNoZWV0IGhhbmRsZXI8YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+bW1pZHlAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzE0LzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQgWFNMVElucHV0U291cmNlLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5DYWxsIGxvY2FsIHNldFN5c3RlbUlkLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5tbWlkeUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMTUvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdCBYU0xURW5naW5lSW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4IHByb2JsZW0gd2l0aCBwcm9jZXNzaW5nIGFuIGlucHV0IHNvdXJjZSBjcmVhdGVkIGZyb20gYSByZWFkZXIgd2l0aCBubyAKLXN5c3RlbUlkCi0gRml4IHByb2JsZW0gd2l0aCByZWFkaW5nIGFuIGlucHV0IHNvdXJjZSBmaWxlIHR3aWNlIGlmIGl0IGhhcyBhIFBJPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8yMi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IFN0eWxlc2hlZXRSb290LmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BZGQgZ2V0T3V0cHV0TWV0aG9kIEFQSS48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+ZGxlc2xpZUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMDcvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sCi0gWE1MUGFyc2VyTGlhaXNvbkRlZmF1bHQuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPlB1dCBpbiBBcGFjaGUgY29weXJpZ2h0Ljxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTMvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sIFRyZWVXYWxrZXIuamF2YQotIGphdmEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQgWFNMVEVuZ2luZUltcGwuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPk1hZGUgY2hhbmdlcyBmb3IgY2hhbmdlIHRvIEFQSSBmb3IgWGFsYW5KMiBUcmVlV2Fsa2VyLCB3aGljaAotIG5vdyByZXF1aXJlcyB0aGF0IHRoZSBET00gaGVscGVyIGJlIGNyZWF0ZWQgYnkgdGhlIGNhbGxlci48L2xpPgotIDwvdWw+Ci08L3MzPgotCi08czMgdGl0bGU9IkNoYW5nZXMgZm9yICZ4c2x0NGo7IHZlcnNpb24gMi4wLjAiPgotPHA+UmVsZWFzZSAyLjAgaW5jbHVkZXMgc2V2ZXJhbCBidWcgZml4ZXMgdG8gdGhlICZ4c2x0NGo7IGFuZCBUckFYIGNvcmUgYW5kIHRvIHRoZSBYYWxhbi1KYXZhIDEgY29tcGF0aWJpbGl0eSBBUEkuIFdlIGFsc28gdXBkYXRlZCBic2YuamFyIHRvIHRoZSA8cmVzb3VyY2UtcmVmIGlkcmVmPSJic2YiLz4gcmVsZWFzZSBjYW5kaWRhdGUgMi4yLCB3aGljaCBmaXhlcyBhIGJ1ZyBydW5uaW5nIEpQeXRob24gZXh0ZW5zaW9ucy48L3A+Ci08cD48ZW0+Q29yZSBidWcgZml4ZXM6PC9lbT48L3A+Ci08dWw+Ci0gIDxsaT5BIHRocmVhZGluZyBwcm9ibGVtIHNob3dlZCB1cCB3aGVuIHVzaW5nIG11bHRpcGxlIHByb2Nlc3NvcnMuIFdlIGZpeGVkIGl0IGJ5IHVzaW5nIGEgc2VwYXJhdGUgWFBhdGhDb250ZXh0IG9iamVjdCB0byBkbyB3aGl0ZXNwYWNlIG5vZGUKLSAgIG1hdGNoZXMgKHhzbDpzdHJpcC1zcGFjZSkuPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5GaXhlZCBhIGJ1ZyBydW5uaW5nIE5vcm0gV2Fsc2gncyBEb2NCb29rIHN0eWxlc2hlZXRzIGJ5IG5vdCBzZXR0aW5nIHRoZSB2YXJpYWJsZSBzdGFjayBwb3NpdGlvbiBpZiB0aGUgRmlsdGVyRXhwcldhbGtlciBpcyBub3Qgb3duZWQgYnkgYQotICB0b3AtbGV2ZWwgTm9kZUl0ZXJhdG9yLjxici8+PGJyLz48L2xpPgotICA8bGk+Rml4ZWQgYSBwcm9ibGVtIHdpdGggbnVsbCBuYW1lc3BhY2UgYmVpbmcgcGFzc2VkIGZyb20geHNsOmVsZW1lbnQuIFRoaXMgYnVnIGFsc28gc3VyZmFjZWQgd2hpbGUgcHJvY2Vzc2luZyBEb2NCb29rCi0gICBzdHlsZXNoZWV0cy48YnIvPjxici8+PC9saT4KLSAgPGxpPkluIHRoZSBpbnRlcmVzdCBvZiBzdGFiaWxpdHksIHdlIG5vdyB0cmVhdCAidW5rbm93biBlcnJvciBpbiBYUGF0aCIgYXMgYSBmYXRhbCBlcnJvci48YnIvPjxici8+PC9saT4KLSAgPGxpPkFkZGVkIHN1cHBvcnQgaW4gc3R5bGVzaGVldCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBmb3IgInRleHQveG1sIiBhbmQgImFwcGxpY2F0aW9uL3htbCt4c2x0IiBtaW1lIHR5cGVzLjxici8+PGJyLz48L2xpPgotICA8bGk+Rml4ZWQgdG9rZW5pemluZyBvZiBzdHlsZXNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIHRvIGFsbG93IHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIHNlcnZlciBpbiBocmVmIGF0dHJpYnV0ZXMuPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5GaXhlZCBhIGJ1ZyBwYXNzaW5nIFRyYW5zZm9ybWVyIGNyZWF0aW9uIGVycm9yIG1lc3NhZ2VzIHRvIEVycm9yTGlzdGVuZXIgd2hlbiBhbiBFcnJvckxpc3RlbmVyIGhhcyBiZWVuIHNldCBvbgotICAgVHJhbnNmb3JtZXJGYWN0b3J5Ljxici8+PGJyLz48L2xpPgotICA8bGk+V2hlbiB1c2luZyBhbiBFeGNlcHRpb24gdG8gaW5zdGFudGlhdGUgYSBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIChleHRlbmRzIEVycm9yKSwgd2Ugbm93IHByb3BhZ2F0ZSB0aGUgRXhjZXB0aW9uIG1lc3NhZ2UgdG8gCi0gIHN1cGVyKCkuPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5BZGRlZCBkZWZlbnNpdmUgY29kZSB0byBFbGVtVGVtcGxhdGVFbGVtZW50IGZvciBoYW5kbGluZyBhIG51bGwgVVJJLjxici8+PGJyLz48L2xpPgotICA8bGk+V2hlbiB1c2luZyBhbiBFeGNlcHRpb24gdG8gaW5zdGFudGlhdGUgYSBUcmFuc2Zvcm1lckV4Y2VwdGlvbiAoZXh0ZW5kcyBFeGNlcHRpb24pLCB3ZSBub3cgcHJvcGFnYXRlIHRoZSBFeGNlcHRpb24gbWVzc2FnZSB0byBzdXBlcigpIAotICByYXRoZXIgdGhhbiBhIGdlbmVyaWMgbWVzc2FnZS48YnIvPjxici8+PC9saT4KLSAgPGxpPkZpeGVkIGEgYnVnICh0aGUgZ2VuZXJhdGlvbiBvZiBhbiB1bndhbnRlZCBlbnRpdHkgcmVmZXJlbmNlKSBwZXJmb3JtaW5nIHRoZSBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiAKLSAgKHNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJzZXJpYWxpemUiPlNlcmlhbGl6aW5nIG91dHB1dDwvbGluaz4pIHdpdGggYW4gWE1MIGRvY3VtZW50IGNvbnRhaW5pbmcgYSBET0NUWVBFCi0gICBkZWNsYXJhdGlvbi48YnIvPjxici8+PC9saT4KLSAgIDxsaT5NZXNzYWdlIG1hbmFnZXIgbW9kaWZpZWQgc28gdGhhdCB0aGUgU291cmNlTG9jYXRvciBtdXN0IGFsd2F5cyBiZSBwYXNzZWQgaW4sCi0gIHdoaWNoIHdpbGwgbWFrZSBhIG1ham9yIGRpZmZlcmVuY2UgaW4gZ2V0dGluZyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi48YnIvPjxici8+PC9saT4gCi0gIDxsaT54c2w6ZWxlbWVudCdzIGhhbmRsaW5nIG9mIG5hbWVzcGFjZSBhdHRyaWJ1dGUgYW5kIHByZWZpeCBpbgotICBuYW1lIGF0dHJpYnV0ZSBjaGFuZ2VkIHNvIHRoYXQgaXQgbm8gbG9uZ2VyIG1hbnVmYWN0dXJlcyBwcmVmaXhlcy4uLgotICBpdCBhbHdheXMgdHJpZXMgaXRzIGJlc3QgdG8gbWF0Y2ggdGhlIHByZWZpeCBlbnRlcmVkLjxici8+PGJyLz48L2xpPiAgCi0gIDxsaT5CdWcgZml4ZWQgd2l0aCBuYW1lc3BhY2UgY29udGV4dHMgaW4gdGhlIHN0eWxlc2hlZXQgcHJvY2Vzc29yLgotICBUaGUgYnVnIGNvdWxkIGNhdXNlICZsdDthIHhtbG5zOmE9IngiJmd0OyZsdDtiJmd0OyB0byBwcm9kdWNlICZsdDthIHhtbG5zOmE9IngiJmd0OyZsdDtiIHhtbG5zOmE9IngiJmd0Oy48YnIvPjxici8+PC9saT4gIAotICA8bGk+TW9kaWZpZWQgcHJvY2Vzc2luZyBvZiB4c2w6bWVzc2FnZSB0byBlbmhhbmNlIGl0IGFzIGEgZGVidWdnaW5nIGFpZC4gTGluZSBudW1iZXJzIGFyZSBub3cgb3V0cHV0IHdpdGggZWFjaAotICBtZXNzYWdlLiBJZiB0aGUgdGVybWluYXRlIGF0dHJpYnV0ZSBpcyB0cnVlICh0aGUgZGVmYXVsdCBpcyBmYWxzZSkgdGhlIG1lc3NhZ2UgaXMgc2VudCB0byB0aGUgY29uc29sZSwgYW5kIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2l0aCB0aGUKLSAgbWVzc2FnZSAiU3R5bGVzaGVldCBkaXJlY3RlZCB0ZXJtaW5hdGlvbiIuPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5JbiBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgY2hlY2sgdGhhdCB0aGUgY2F1c2UgIT0gbnVsbCB3aGVuIGNoZWNraW5nIGZvciBhIGNvbnRhaW5lZCBleGNlcHRpb24uPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5GaXhlZCBhIHByb2JsZW0gdmFsaWRhdGluZyBub24tbmFtZXNwYWNlZCBhdHRyaWJ1dGVzIGFuZCBhIHByb2JsZW0gYWxsb3dpbmcgbm9uLW5hbWVzcGFjZWQgYXR0cmlidXRlcyB0byBiZSBjaGlsZHJlbiBvZiB0aGUKLSAgIHN0eWxlc2hlZXQgZWxlbWVudC48YnIvPjxici8+PC9saT4KLSAgIDxsaT5GaXhlZCBjaGVja2luZyBvZiBudW1iZXIgb2YgYXJndW1lbnRzIGluIGRvY3VtZW50KCkgZnVuY3Rpb24uPGJyLz48YnIvPjwvbGk+Ci0gICA8bGk+Rml4ZWQgcHJvYmxlbSB3aXRoIG11dGF0aW9uIG9mIHRlbXBsYXRlcyBhdCBydW4gdGltZS4gVGVtcGxhdGVzIHJlc29sdXRpb24gbm93IHRha2VzIHBsYWNlIGR1cmluZyB0aGUgY29tcG9zZSgpIG1ldGhvZC48YnIvPjxici8+PC9saT4KLSAgIDxsaT5GaXhlZCBzb21lIG1pbm9yIHRocmVhZGluZyBpc3N1ZXMgaW4gb3JnLmFwYWNoZS54YWxhbi5zdHJlZSAoQ2hpbGQsIFBhcmVudCwgRWxlbWVudEltcGwsIFNvdXJjZVRyZWVIYW5kbGVyKS48YnIvPjxici8+PC9saT4KLSAgIDxsaT5TeW5jaHJvbml6ZWQgVHJBWCBBUEkgZnVuY3Rpb25zIHN1YmplY3QgdG8gbXV0YXRpb24gdG8gcHJldmVudCBtdXRhdGlvbiBkdXJpbmcgYSB0cmFuc2Zvcm1hdGlvbi48YnIvPjxici8+PC9saT4KLSAgIDxsaT5GaXhlZCBidWcgcmVwb3J0ZWQgYnkgSmFubyBFbG92aXJ0YTogc3Vic3RyaW5nKCkgd2FzIHJldHVybmluZyBhbiBlcnJvciBpZiB0aGUgc3RhcnQgaW5kZXggaXMgbGFyZ2VyIHRoYW4gdGhlIHN0cmluZy48YnIvPjxici8+PC9saT4gICAKLSAgIDxsaT5TZXQgU3RyaW5nS2V5LnRvU3RyaW5nKCkgdG8gcmV0dXJuIHRoZSB1bmRlcmx5aW5nIFN0cmluZyAobV9zdHIpLCB0aHVzIGF2b2lkaW5nIGEgcG90ZW50aWFsIHN5bW1ldHJ5IHByb2JsZW0gd2l0aCB0aGUgZXF1YWxzKCkgbWV0aG9kCi0gICByZXBvcnRlZCBieSBJdG8gS2F6dW1pdHN1Ljxici8+PGJyLz48L2xpPgotICAgPGxpPkluIHJlc3BvbnNlIHRvIG5vdGUgZnJvbSBJdG8gS2F6dW1pdHN1LCBjaGFuZ2VkIEphdmEgZW5jb2RpbmcgbmFtZSAiRVVDSklTIiBpbiBGb3JtYXR0ZXJUb1hNTCB0byAiRVVDX0pQIi48YnIvPjxici8+PC9saT4KLSAgIDxsaT5XaGVuIFhhbGFuIGNyZWF0ZXMgYSBGaWxlT3V0cHV0U3RyZWFtLCBpdCBub3cgY2xvc2VzIHRoZSBzdHJlYW0gYmVmb3JlIGV4aXRpbmcuPGJyLz48YnIvPjwvbGk+Ci0gICA8bGk+Rml4ZWQgaGFuZGxpbmcgb2YgYW4gZXhjZXB0aW9uIHRoYXQgY2FuIGJlIHRocm93biB3aGlsZSBidWlsZGluZyBhIERPTS48YnIvPjxici8+PC9saT4KLSAgIDxsaT5GaXhlZCBhIHByb2JsZW0gcmVwb3J0ZWQgYnkgRGltaXRyeSBWb3l0ZW5rbyBzZXJpYWxpemluZyBjb21waWxlZCBzdHlsZXNoZWV0cy48YnIvPjxici8+PC9saT4KLSAgIDxsaT5Gb3Igc3VwcG9ydCBvZiBhcHBsZXRzLCBtb2RpZmllZCBUcmFuc2Zvcm1lckZhY3RvcnkgU3lzdGVtLmdldFByb3BlcnR5KCkgY2FsbHMgdG8gY2F0Y2ggU2VjdXJpdHlFeGNlcHRpb25zLjxici8+PGJyLz48L2xpPgotICAgPGxpPkZpeGVkIGEgYnVnIHJlcG9ydGVkIGJ5IEtyaXNobmEgTW9oYW4gTWVkdXJpIHNldHRpbmcgb3V0cHV0IHByb3BlcnRpZXMuPGJyLz48YnIvPjwvbGk+Ci0gICA8bGk+Rml4ZWQgZXJyb3IgcmVjb3Zlcnkgd2hlbiB4c2w6ZWxlbWVudCBlbmNvdW50ZXJzIGEgYmFkIG5hbWUgb3IgdW5yZXNvbHZhYmxlIHByZWZpeC48YnIvPjxici8+PC9saT4KLSAgIDxsaT5BZGRlZCBBYnN0cmFjdE1ldGhvZEVycm9yIGhhbmRsaW5nIHRvIGV4aXN0aW5nIE5vU3VjaE1ldGhvZEVycm9yIGhhbmRsaW5nIGFzIGEgZmFsbGJhY2sgdG8gdGhlIFhNTFJlYWRlckZhY3RvcnkgZm9yIFhNTCBwYXJzZXJzIHRoYXQgZG8KLSAgICAgICBub3QgaW1wbGVtZW50IHRoZSBKQVhQIHBhcnNlcnMgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBhbiBYTUxSZWFkZXI8YnIvPjxici8+PC9saT4KLSAgIDxsaT5GaXhlZCBidWcgd2l0aCBjbG9uZWQgaXRlcmF0b3JzIHJlcG9ydGVkIGJ5IFRpbSBTZWFuLjxici8+PGJyLz48L2xpPgotICAgPGxpPkZpeGVkIG51bGwgcG9pbnRlciBleGNlcHRpb24gdGhhdCBjb3VsZCBvY2N1ciB3aXRoIGdldFZhbHVlKCJ4eHgiKS48YnIvPjxici8+PC9saT4KLSAgIDxsaT5GaXhlZCBidWcgcmVwb3J0ZWQgYnkgVGltIFNlYW4gaGFuZGxpbmcgdGhlIHhtbDpzcGFjZSBhdHRyaWJ1dGUuPC9saT4KLTwvdWw+Ci08cD48ZW0+QnVnIGZpeGVzIGluIHRoZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJjb21wYXQiPlhhbGFuLUphdmEgMSBjb21wYXRpYmlsaXR5IEFQSTwvbGluaz46PC9lbT48L3A+Ci08dWw+Ci0gIDxsaT5GaXhlZCBQcm9ibGVtTGlzdGVuZXIgKGZvciBwcm9jZXNzaW5nIGVycm9yIG1lc3NhZ2VzKSB0byBkZXJpdmUgZnJvbSAmeHNsdDRqOyAyIEVycm9ySGFuZGxlci48YnIvPjxici8+PC9saT4KLSAgPGxpPkZpeGVkIGV2YWx1YXRpb24gb2Ygc3R5bGVzaGVldCBzdHJpbmcgcGFyYW1ldGVycyB0byBjb25mb3JtIHRvICZ4c2x0NGo7IDEgYmVoYXZpb3IgKGV4cHJlc3Npb25zIGZvciAmeHNsdDRqOyAxIHZzLiBTdHJpbmcgb2JqZWN0cyAKLSAgZm9yICZ4c2x0NGo7IDIpLjxici8+PGJyLz48L2xpPiAgICAKLSAgPGxpPkFkZGVkIFhQYXRoU3VwcG9ydCBhbmQgWFBhdGhTdXBwb3J0RGVmYXVsdCwgYW5kIGZpeGVkIHRoZSBkZXJpdmF0aW9uIG9mIFhPYmplY3Qgc3ViLXR5cGVzIChYU3RyaW5nLCBldGMuKS48YnIvPjxici8+PC9saT4KLSAgPGxpPkZpeGVkIGJ1ZyB3aXRoIFhTTFRQcm9jZXNzb3IgcHJvY2Vzcyh4bWxJbiwgbnVsbCwgb3V0KSBtZXRob2Qgc28gdGhhdCBpdCB1c2VzIHRoZSBTdHlsZXNoZWV0Um9vdCAoaWYgb25lIGV4aXN0cykgdGhhdCBoYXMgYmVlbiBjcmVhdGVkCi0gICB3aXRoIHRoZSBwcm9jZXNzU3R5bGVzaGVldCgpIG1ldGhvZC48L2xpPgotPC91bD4KLTxwPkZvciBhIGxpc3Qgb2YgdGFza3MgaW4gdGhlICZ4c2x0NGoyOyBUby1EbyBsaXN0IHRoYXQgaGF2ZSBiZWVuIGNvbXBsZXRlZCwgc2VlIDxqdW1wIGhyZWY9InRvZG8uaHRtbCNyZWxlYXNlLWRhdGUtY29tcGxldGVkIj5UYXNrcyBjb21wbGV0ZWQ8L2p1bXA+LjwvcD4KLTwvczM+Ci0KLTxzMyB0aXRsZT0iQ2hhbmdlcyBmb3IgJnhzbHQ0ajsgdmVyc2lvbiAyLjAuRDA3Ij4KLTxwPiZ4c2x0NGo7IDIuMC5EMDcgaW5jb3Jwb3JhdGVzIGEgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0iY29tcGF0Ij5YYWxhbi1KYXZhIDEgY29tcGF0aWJpbGl0eSBqYXI8L2xpbms+LCBzb21lIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cywgYW5kIGEgbnVtYmVyIG9mIGJ1ZyBmaXhlcyBmb3IgYnVncyBmb3VuZCBpbiB2ZXJzaW9uIDIuMC5EMDYuPC9wPgotPHVsPgotPGxpPkZpeGVkIGhhbmRsaW5nIG9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJubyIuICBQcmV2aW91c2x5LCBvbmNlIGl0IHdhcyB0dXJuZWQgb24sIGl0IGNvdWxkIG5vdCBiZSB0dXJuZWQgb2ZmLjxici8+PGJyLz48L2xpPgotPGxpPkZpeGVkIGEgYnVnIHdpdGggd2hpdGVzcGFjZSBoYW5kbGluZyB3aGVyZSBYYWxhbiB3YXMgaW5jb3JyZWN0bHkgY2hlY2tpbmcgZm9yIHdoaXRlc3BhY2UgCi0gICAgc3RyaXBwaW5nIGJlZm9yZSBjb2xsYXRpb24gb2YgbXVsdGlwbGUgd2hpdGVzcGFjZSBldmVudHMgaW50byBhIHNpbmdsZSB0ZXh0IG5vZGUuPGJyLz48YnIvPjwvbGk+Ci08bGk+V2hpdGVzcGFjZSBzdHJpcHBpbmcgd2Fzbid0IHdvcmtpbmcgd2l0aCBpbnB1dCBET01zIGJlZm9yZS4gIFRoaXMgaXMgbm93IGZpeGVkLjxici8+PGJyLz48L2xpPgotPGxpPkZpeGVkIG1hbnkgZXhjZXB0aW9uIGhhbmRsaW5nIHByb2JsZW1zIGFuZCBwcm9ibGVtcyB3aXRoIGVycm9yIHJlcG9ydGluZy48YnIvPjxici8+PC9saT4KLTxsaT5GaXhlZCBhIGJ1ZyByZXNldHRpbmcgcGFyYW1ldGVycyBpbiBUcmFuc2Zvcm1lciBjbGVhclBhcmFtZXRlcnMoKS48YnIvPjxici8+PC9saT4KLTxsaT5GaXhlZCBhIGJ1ZyB3aGVyZSBDREFUQSBzZWN0aW9ucyB3ZXJlIG5vdCBtYXRjaGluZyB0aGUgdGV4dCgpIG5vZGUgdGVzdC48YnIvPjxici8+PC9saT4KLTxsaT5NYWRlIGJldHRlciBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtIHdpdGggcmVzdWx0IHRyZWUgZnJhZ21lbnRzLjxici8+PGJyLz48L2xpPgotPGxpPk1hZGUgcmVzdWx0IHRyZWUgZnJhZ21lbnQgcGFyc2luZyBvZiBudW1iZXJzIGNvbnNpc3RlbnQgd2l0aCBzdHJpbmdzLjxici8+PGJyLz48L2xpPgotPGxpPkV4Y2VwdGlvbnMgdGhyb3duIGZyb20gZXh0ZW5zaW9ucyBzaG91bGQgbm93IGJlIHByb3Blcmx5IHJlcG9ydGVkIHZpYSB0aGUgZXJyb3IgbGlzdGVuZXIuPGJyLz48YnIvPjwvbGk+Ci08bGk+Rml4ZWQgaGFyZC1jb2RlZCBzdGFjayBkdW1wIHNldCBvZmYgYnkgbV9yZXBvcnRJblBvc3RFeGNlcHRpb25Gcm9tVGhyZWFkIHZhcmlhYmxlLjxici8+PGJyLz48L2xpPgotPGxpPkZpeGVkIGludGVybWl0dGVudCB0aHJlYWRpbmcgcHJvYmxlbSB3aXRoIHRleHQgbm9kZXMgYmVpbmcgZHJvcHBlZC48YnIvPjxici8+PC9saT4KLTxsaT5GaXhlZCBwcm9ibGVtIHdpdGggdmFyaWFibGUgZXZhbHVhdGlvbiBpbnNpZGUgb2YgdW5pb24gZXhwcmVzc2lvbnMuPC9saT4KLTwvdWw+Ci08L3MzPgotPHMzIHRpdGxlPSJDaGFuZ2VzIGZvciAmeHNsdDRqOyB2ZXJzaW9uIDIuMC5EMDYiPgotPHA+V2UgaGF2ZSBmaXhlZCB0aGUgYnVncyByZXBvcnRlZCBpbiAmeHNsdDRqOyAyLjAuRDA1LiBBbG9uZyB3aXRoIHNldmVyYWwgb3RoZXIgZW5oYW5jZW1lbnRzLCAKLXdlIGhhdmUgYWxzbyBmaXhlZCBhIG51bWJlciBvZiBidWdzIGZvdW5kIGJ5IHRlc3RpbmcgYW5kIG91ciB1c2Vyczo8L3A+Ci08dWw+Ci08bGk+Rml4ZWQgc29tZSB0aHJlYWRpbmcgcHJvYmxlbXMgYW5kIGltcHJvdmVkIHN1cHBvcnQgZm9yIGhhbmRsaW5nIEV4Y2VwdGlvbnMgdGhyb3duIGluIGEgc2Vjb25kYXJ5IHRocmVhZC48YnIvPjxici8+Ci1Ob3RlOiBUbyBzdXBwb3J0IGluY3JlbWVudGFsIG91dHB1dCwgJnhzbHQ0ajsgcGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9uIGluIGEgc2Vjb25kIHRocmVhZCB3aGlsZSBidWlsZGluZyB0aGUgc291cmNlIHRyZWUgaW4gdGhlIG1haW4gdGhyZWFkLjxici8+PGJyLz48L2xpPgotPGxpPkZpeGVkIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHBpcGluZyAodXRpbGl6aW5nIHRyYW5zZm9ybWF0aW9uIG91dHB1dCBhcyBpbnB1dCBmb3IgYW5vdGhlciB0cmFuc2Zvcm1hdGlvbikuPGJyLz48YnIvPjwvbGk+Ci08bGk+Rml4ZWQgcHJvYmxlbXMgaGFuZGxpbmcgYXR0cmlidXRlcyBhbmQgYWRkaW5nIGF0dHJpYnV0ZXMgdG8gcmVzdWx0IHRyZWUuPGJyLz48YnIvPjwvbGk+Ci08bGk+QWRkZWQgZGVmZW5zaXZlIGNoZWNraW5nIGZvciBudWxsIGVudGl0aWVzLCBudWxsIG5hbWVzcGFjZXMsIGFuZCBlbXB0eSBzdHJpbmdzIHBhc3NlZCBpbiBmb3IgVVJJcyBhbmQgbG9jYWwgbmFtZXMuPGJyLz48YnIvPjwvbGk+Ci08bGk+V2Ugbm93IGNvbmZvcm0gdG8gdGhlIFNBWCBjb252ZW50aW9uIG9mIHJlcHJlc2VudGluZyBudWxsIG5hbWVzcGFjZXMgd2l0aCBlbXB0eSBzdHJpbmdzLjxici8+PGJyLz48L2xpPgotPGxpPkZpeGVkIGEgYnVnIGVuY291bnRlcmVkIGV2YWx1YXRpbmcgYSB2YXJpYWJsZSBpbiBhIHByZWRpY2F0ZSBleHByZXNzaW9uIGFwcGxpZWQgdG8gY2hpbGQgbm9kZXMuPGJyLz48YnIvPjwvbGk+Ci08bGk+Q2hhbmdlZCBuYW1lcyBvZiBzZXJpYWxpemVycyBmcm9tIEZvcm1hdHRlclRvPHJlZj5YeHg8L3JlZj4gdG8gU2VyaWFsaXplclRvPHJlZj5YeHg8L3JlZj4uIFNlZSAKLTxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9zZXJpYWxpemUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPlBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemU8L2p1bXA+Ljxici8+PGJyLz48L2xpPgotPGxpPkltcHJvdmVkIGRlYnVnZ2luZyBzdXBwb3J0IGluIGEgbnVtYmVyIG9mIGFyZWFzLjwvbGk+Ci08L3VsPgotPC9zMz4KLTxzMyB0aXRsZT0iQ2hhbmdlcyBmb3IgJnhzbHQ0ajsgdmVyc2lvbiAyLjAuRDA1Ij4KLTxwPkFsbCBvZiB0aGUgYnVncyByZXBvcnRlZCBpbiAmeHNsdDRqOyAyLjAuRDAxIGhhdmUgYmVlbiBmaXhlZC4gVGhlIHJlbWFpbmRlciBvZiB0aGlzIHNlY3Rpb24gZGlzY3Vzc2VzIHR3byBjaGFuZ2VzIHRoYXQgd2UgYmVsaWV2ZSBhcmUgb2YgcGFydGljdWxhciBpbXBvcnRhbmNlOjwvcD4KLTxwPjxlbT5UckFYPC9lbT48L3A+Ci08cD5UaGUgVHJhbnNmb3JtYXRpb24gQVBJIGZvciBYTUwgKFRyQVgpIHRoYXQgJnhzbHQ0ajI7IGltcGxlbWVudHMgaGFzIHVuZGVyZ29uZSBzdWJzdGFudGlhbCByZXZpc2lvbnMgc2luY2UgdGhlIHJlbGVhc2Ugb2YgJnhzbHQ0ajsgMi4wLkQwMS4gVHJBWCBoYXMgam9pbmVkIHRoZSBKYXZhIEFQSSBmb3IgWE1MIFBhcnNpbmcgKEpBWFApIGFzIHBhcnQgb2YgdGhlIFN1biZyZWc7IDxyZXNvdXJjZS1yZWYgaWRyZWY9ImpzcjA2MyIvPi4gQWNjb3JkaW5nbHksIHRoZSBUckFYIHBhY2thZ2UgbmFtZXMgaGF2ZSBjaGFuZ2VkLiBUaGUgY29uY2VwdHVhbCBvcmdhbml6YXRpb24gaGFzIGFsc28gY2hhbmdlZCBzb21ld2hhdDogVGhlIHByaW1hcnkgdHJhbnNmb3JtYXRpb24gaW50ZXJmYWNlcyBhcmUgZGVmaW5lZCBpbiBqYXZheC54bWwudHJhbnNmb3JtLCB3aXRoIGNvbmNyZXRlIGNsYXNzZXMgZm9yIG1hbmFnaW5nIHN0cmVhbSBpbnB1dC9vdXRwdXQsIFNBWCBwYXJzZXJzIGFuZCBDb250ZW50SGFuZGxlciwgYW5kIERPTSBwYXJzZXJzIGFuZCBET00gdHJlZXMgaW4gamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0sIGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LCBhbmQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPHJlc291cmNlLXJlZiBpZHJlZj0idHJheCIvPiwgYW5kIHJldmlldyA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyI+VXNhZ2UgUGF0dGVybnM8L2xpbms+LjwvcD4KLTxhbmNob3IgbmFtZT0ib3V0cHV0cHJvcHMiLz48cD48ZW0+T3V0cHV0IHByb3BlcnRpZXM8L2VtPjwvcD4KLTxwPlRoZSBoYW5kbGluZyBvZiB4c2w6b3V0cHV0IHByb3BlcnRpZXMgaGFzIGNoYW5nZWQ6IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLk91dHB1dEZvcm1hdCBhbmQgYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5PdXRwdXRGb3JtYXRFeHRlbmRlZCB3ZXJlIHJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGggb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuT3V0cHV0UHJvcGVydGllcy4gVGhlIFNlcmlhbGl6ZXJGYWN0b3J5IGdldFNlcmlhbGl6ZXIoKSBtZXRob2Qgbm93IHRha2VzIFByb3BlcnRpZXMgcmF0aGVyIHRoYW4gYSBTdHJpbmcgaW5kaWNhdGluZyB0aGUgb3V0cHV0IG1ldGhvZC4gWW91IGNhbiByZXBsYWNlIDxjb2RlPmdldFNlcmlhbGl6ZXIoInhtbCIpPC9jb2RlPiwgZm9yIGV4YW1wbGUsIHdpdGggPGNvZGU+Z2V0U2VyaWFsaXplcihPdXRwdXRQcm9wZXJ0aWVzLmdldERlZmF1bHRNZXRob2RQcm9wZXJ0aWVzKCJ4bWwiKSk8L2NvZGU+LjwvcD4KLTxwPkhUTUwsIFhNTCwgYW5kIHRleHQgeHNsOm91dHB1dCBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgaW4gcHJvcGVydHkgZmlsZXMgaW4gb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXM6IG91dHB1dF9odG1sLnByb3BlcnRpZXMsIG91dHB1dF94bWwucHJvcGVydGllcywgYW5kIG91dHB1dF90ZXh0LnByb3BlcnRpZXMuPC9wPgotPHA+WW91IGNhbiBzdGFydCB1c2luZyB0aGUgb3V0cHV0IHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGVzZSBmaWxlcyBpbiB5b3VyIHN0eWxlc2hlZXRzLiBGb3IgZXhhbXBsZSwgeW91IGNhbiB0dXJuIFVSTCBlc2NhcGluZyBvZmYgaW4gSFRNTCBvdXRwdXQgd2l0aDxici8+PGNvZGU+e2h0dHBcdTAwM2EvL3htbC5hcGFjaGUub3JnL3hzbHR9dXNlLXVybC1lc2NhcGluZz1ubzwvY29kZT48YnIvPgotYW5kIHlvdSBjYW4gY29udHJvbCBpbmRlbnRpbmcgd2l0aDxici8+Ci08Y29kZT57aHR0cFx1MDAzYS8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50PTxyZWY+bjwvcmVmPjwvY29kZT48L3A+Ci08bm90ZT5UaGUgY29sb24gYWZ0ZXIgdGhlICJodHRwIiBwcm90b2NvbCBtdXN0IGJlIGVzY2FwZWQuPC9ub3RlPgotPHA+Q2hhcmFjdGVyLXRvLWVudGl0eSBtYXBwaW5nIGlzIHNwZWNpZmllZCBpbiBvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZTogSFRNTEVudGl0aWVzLnJlcyBhbmQgWE1MRW50aXRpZXMucmVzLiBZb3UgY2FuIG92ZXJyaWRlIGVudGl0eSByZWYgCi1tYXBwaW5nIGZyb20gYSBzdHlsZXNoZWV0LiBGb3IgZXhhbXBsZTo8L3A+Ci08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3hzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgeG1sbnM6eGFsYW49Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IiB2ZXJzaW9uPSIxLjAiJmd0OwotCi0gICZsdDt4c2w6b3V0cHV0IHhhbGFuOmVudGl0aWVzPSJteWVudGl0aWVzLmVudCIvJmd0OwotCi0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iJmd0OwotICAgICZsdDtvdXQmZ3Q7JmFtcDsjMTI1OyZsdDsvb3V0Jmd0OwotICAmbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKLQotJmx0Oy94c2w6c3R5bGVzaGVldCZndDs8L3NvdXJjZT4KLTxwPj09PSBteWVudGl0aWVzLmVudCA9PT08L3A+Ci08c291cmNlPnF1b3QgMzQKLWFtcCAzOAotbHQgNjAKLWd0IDYyCi1sYWxhIDEyNTwvc291cmNlPgotPHA+VGhlIG91dHB1dCBpczo8L3A+Ci08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7Ci0mbHQ7b3V0Jmd0OyZhbXA7bGFsYTsmbHQ7L291dCZndDs8L3NvdXJjZT4KLTxwPlNlZSBhbHNvIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9Im91dHB1dHByb3BzIj5TZXR0aW5nIG91dHB1dCBwcm9wZXJ0aWVzIGluIHlvdXIgc3R5bGVzaGVldHM8L2xpbms+LjwvcD4KLTwvczM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94YWxhbi9pbmRleC54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4N2Q4ZS4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hhbGFuL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KLTwhRE9DVFlQRSBzMSBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9kb2N1bWVudC5kdGQiPgotPCEtLSAKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci08czEgdGl0bGU9IiZ4c2x0NGotY3VycmVudDsiPgotICA8czIgdGl0bGU9IldoYXQgaXMgaXQ/Ij4KLSAgICA8cD5YYWxhbiBpcyBhbiBYU0xUIHByb2Nlc3NvciBmb3IgdHJhbnNmb3JtaW5nIFhNTCBkb2N1bWVudHMgaW50byBIVE1MLCB0ZXh0LCBvciBvdGhlciBYTUwgZG9jdW1lbnQgdHlwZXMuIEl0IGltcGxlbWVudHMgdGhlCi0gICAgIFczQyBSZWNvbW1lbmRhdGlvbnMgZm9yIFhTTCBUcmFuc2Zvcm1hdGlvbnMgKFhTTFQpIGFuZCB0aGUgWE1MIFBhdGggTGFuZ3VhZ2UgKFhQYXRoKS4gSXQgY2FuIGJlIHVzZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLAotICAgICBpbiBhbiBhcHBsZXQgb3IgYSBzZXJ2bGV0LCBvciBhcyBhIG1vZHVsZSBpbiBvdGhlciBwcm9ncmFtLjwvcD4KLSAgPC9zMj4KLSAgPHMyIHRpdGxlPSJJJ3ZlIGhlYXJkIG9mICZ4c2x0NGo7LCBidXQgd2hhdCBpcyB2ZXJzaW9uIDI/Ij4KLSAgICA8cD4meHNsdDRqOyB2ZXJzaW9uIDIgcmVjYXN0cyBYYWxhbiBhcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPHJlc291cmNlLXJlZiBpZHJlZj0idHJheCIvPiBpbnRlcmZhY2VzLCBwYXJ0IG9mIHRoZSA8cmVzb3VyY2UtcmVmIGlkcmVmPSJqYXhwMTEiLz4uIFRSYVggcHJvdmlkZXMgYQotICAgIG1vZHVsYXIgZnJhbWV3b3JrIGFuZCBhIHN0YW5kYXJkIEFQSSBmb3IgcGVyZm9ybWluZyBYTUwgdHJhbnNmb3JtYXRpb25zLCBhbmQgaXQgdXRpbGl6ZXMgc3lzdGVtIHByb3BlcnRpZXMgdG8gZGV0ZXJtaW5lIHdoaWNoIFRyYW5zZm9ybWVyIGFuZCB3aGljaCBYTUwgcGFyc2VyIHRvIHVzZS48L3A+Ci0gICAgIDxwPiZ4c2x0NGo7IHZlcnNpb24gMiBhbHNvIGJ1aWxkcyBvbiA8cmVzb3VyY2UtcmVmIGlkcmVmPSJzYXgyIi8+LCA8cmVzb3VyY2UtcmVmIGlkcmVmPSJkb20yIi8+LCBhbmQgdGhlIFhNTCBwYXJzZXIgQVBJIGluCi0gICAgIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImpheHAiLz4uPC9wPgotICAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxsaW5rIGlkcmVmPSJ3aGF0c25ldyI+V2hhdCdzIG5ldyBpbiAmeHNsdDRqMjs8L2xpbms+LjwvcD4KLSAgPC9zMj4KLSAgPHMyIHRpdGxlPSJIb3cgYWJvdXQgdGhpcyByZWxlYXNlPyI+Ci0gIDxwPiZ4c2x0NGotY3VycmVudDsgaXMgYSBwcm9kdWN0aW9uIHJlbGVhc2UgSXQgaW5jb3Jwb3JhdGVzIGEgbnVtYmVyIG9mIGVuaGFuY2VtZW50cyBhbmQgYnVnIGZpeGVzLiBGb3IgdGhlIGRldGFpbHMsIHNlZSAKLSAgPGxpbmsgaWRyZWY9InJlYWRtZSI+UmVsZWFzZSBOb3RlczwvbGluaz4uIFBsZWFzZSBzZW5kIHlvdXIgZmVlZGJhY2sgdG8gdGhlIDxodW1hbi1yZXNvdXJjZS1yZWYgaWRyZWY9InhhbGFuZGV2Ii8+LjwvcD4KLSAgPC9zMj4gCi0gIDxzMiB0aXRsZT0iSG93IGRvIEkgZ2V0IGl0PyI+Ci0gICAgPHA+RG93bmxvYWQgYW5kIHVuemlwIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nOjwvcD4KLSAgICA8dWw+Ci0gICAgICA8bGk+PHJlc291cmNlLXJlZiBpZHJlZj0ieHNsdDRqLWRpc3QtemlwIi8+PC9saT4KLSAgICAgIDxsaT48cmVzb3VyY2UtcmVmIGlkcmVmPSJ4c2x0NGotZGlzdC10YXJneiIvPjwvbGk+Ci0gICAgPC91bD4gICAgIAotICA8L3MyPgotICAKLSAgPHMyIHRpdGxlPSJXaGVyZSBkbyBJIGdldCBYZXJjZXM/Ij4KLSAgICA8cD5UaGUgWGFsYW4gZG93bmxvYWQgaW5jbHVkZXMgeGVyY2VzLmphciBmcm9tICZ4bWw0ai11c2VkOy4gVGhpcyBpcyBhbGwgeW91IG5lZWQgdG8gcnVuIFhhbGFuIHdpdGggdGhlIFhlcmNlcyBYTUwgcGFyc2VyLiAKLSAgICBZb3UgY2FuLCBob3dldmVyLCBkb3dubG9hZCB0aGUgY29tcGxldGUgWGVyY2VzIGRpc3RyaWJ1dGlvbiBmcm9tIHRoZSA8cmVzb3VyY2UtcmVmIGlkcmVmPSJ4bWw0ai1kaXN0ZGlyIi8+LjwvcD4KLSAgICA8bm90ZT5JZiB5b3UgcGxhbiB0byB1c2UgYSBkaWZmZXJlbnQgWE1MIHBhcnNlciwgc2VlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9InBsdWciPlBsdWdnaW5nIGluIGEgVHJhbnNmb3JtZXIKLSAgICAgYW5kIFhNTCBwYXJzZXI8L2xpbms+Ljwvbm90ZT4gCi0gIDwvczI+Ci0gIDxzMiB0aXRsZT0iV2hhdCBlbHNlIGRvIEkgbmVlZD8iPgotICAgIDxwPllvdSBuZWVkIHRoZSBKYXZhIERldmVsb3BtZW50IEtpdCBvciBKYXZhIFJ1bnRpbWUgMS4xLjgsIDEuMi4yLCBvciAxLjMsIHdoaWNoIHlvdSBjYW4gb2J0YWluIGZyb20gPGp1bXAKLSAgICBocmVmPSJodHRwOi8vd3d3LmlibS5jb20vamF2YS9qZGsiPmlibS5jb20vamF2YS9qZGsvPC9qdW1wPiBvciA8anVtcCBocmVmPSJodHRwOi8vd3d3LmphdmEuc3VuLmNvbSI+amF2YS5zdW4uY29tPC9qdW1wPi48L3A+IAotICA8L3MyPiAgCi0gICAgPHMyIHRpdGxlPSJGb3IgbW9yZSBpbmZvcm1hdGlvbi4uLiI+Ci0gICAgPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24sIGdvIHRvIDxsaW5rIGlkcmVmPSJvdmVydmlldyI+WGFsYW4gT3ZlcnZpZXc8L2xpbms+IGFuZCA8bGluayBpZHJlZj0iZ2V0c3RhcnRlZCI+R2V0dGluZwotICAgIFN0YXJ0ZWQ8L2xpbms+LiBBbGwgb2YgdGhlIFhhbGFuIGRvY3VtZW50YXRpb24gb24gdGhpcyB3ZWJzaXRlIGlzIGluY2x1ZGVkIGluIHRoZSBYYWxhbiBkb3dubG9hZCwgYXMgYXJlIGEgbnVtYmVyIG9mCi0gICAgPGxpbmsgaWRyZWY9InNhbXBsZXMiPlNhbXBsZXM8L2xpbms+IHRvIGhlbHAgeW91IHN0YXJ0IHVzaW5nICZ4c2x0NGoyOyB0byB0cmFuc2Zvcm0gWE1MIGRvY3VtZW50cy48L3A+Ci0gIDwvczI+ICAKLTwvczE+IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vb3ZlcnZpZXcueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi9vdmVydmlldy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOGU3OTguLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94YWxhbi9vdmVydmlldy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PgotPCFET0NUWVBFIHMxIFNZU1RFTSAiLi4vLi4vc3R5bGUvZHRkL2RvY3VtZW50LmR0ZCI+Ci0KLTwhLS0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci0gCi08czEgdGl0bGU9IiZ4c2x0NGo7IE92ZXJ2aWV3Ij4KLTx1bD4KLTxsaT48bGluayBhbmNob3I9ImludHJvIj5JbnRyb2R1Y3Rpb248L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImZlYXR1cmVzIj4meHNsdDRqOyBGZWF0dXJlczwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0idG93b3JrIj5HZXR0aW5nIHRvIHdvcmsgd2l0aCAmeHNsdDRqOzwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0idXB0b3NwZWVkIj5HZXR0aW5nIHVwIHRvIHNwZWVkIHdpdGggWFNMVDwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iZ2xvc3NhcnkiPkdsb3NzYXJ5PC9saW5rPjwvbGk+Ci08L3VsPjxhbmNob3IgbmFtZT0iaW50cm8iLz4KLSAgPHMyIHRpdGxlPSJJbnRyb2R1Y3Rpb24iPgotICAgIDxwPiZ4c2x0NGo7IChuYW1lZCBhZnRlciBhIHJhcmUgbXVzaWNhbCBpbnN0cnVtZW50KSBmdWxseSBpbXBsZW1lbnRzIHRoZSA8cmVzb3VyY2UtcmVmIGlkcmVmPSJ4c2x0Ii8+IGFuZCB0aGUgCi0gICAgPHJlc291cmNlLXJlZiBpZHJlZj0ieHBhdGgiLz4uIFhTTFQgaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIFhTTCBzdHlsZXNoZWV0IGxhbmd1YWdlIGZvciBYTUwuIEl0IGluY2x1ZGVzIHRoZSBYU0wKLSAgICAgVHJhbnNmb3JtYXRpb24gdm9jYWJ1bGFyeSBhbmQgWFBhdGgsIGEgbGFuZ3VhZ2UgZm9yIGFkZHJlc3NpbmcgcGFydHMgb2YgWE1MIGRvY3VtZW50cy4gRm9yIGxpbmtzIHRvIGJhY2tncm91bmQgbWF0ZXJpYWxzLCAKLSAgICBkaXNjdXNzaW9uIGdyb3VwcywgZnJlcXVlbnRseSBhc2tlZCBxdWVzdGlvbnMsIGFuZCB0dXRvcmlhbHMgb24gWFNMVCwgc2VlIDxsaW5rIGFuY2hvcj0idXB0b3NwZWVkIj5HZXR0aW5nIHVwCi0gICAgdG8gc3BlZWQgd2l0aCBYU0xUPC9saW5rPi48L3A+IAotICAgIDxub3RlPlhTTCBhbHNvIGluY2x1ZGVzIGEgdm9jYWJ1bGFyeSBmb3IgZm9ybWF0dGluZyBkb2N1bWVudHMsIHdoaWNoIGlzIG5vdCBwYXJ0IG9mICZ4c2x0NGo7LiAKLSAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxyZXNvdXJjZS1yZWYgaWRyZWY9InhzbCIvPiBhbmQgdGhlIDxqdW1wCi0gICAgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL2ZvcCI+QXBhY2hlIFhNTCBGT1AgKEZvcm1hdHRpbmcgT2JqZWN0cyBQcm9qZWN0KTwvanVtcD4uPC9ub3RlPgotICAgIDxwPllvdSB1c2UgdGhlIFhTTFQgbGFuZ3VhZ2UgdG8gY29tcG9zZSBYU0wgc3R5bGVzaGVldHMuIEFuIFhTTCBzdHlsZXNoZWV0IGNvbnRhaW5zIGluc3RydWN0aW9ucyBmb3IKLSAgICAgdHJhbnNmb3JtaW5nIFhNTCBkb2N1bWVudHMgZnJvbSBvbmUgZG9jdW1lbnQgdHlwZSBpbnRvIGFub3RoZXIgZG9jdW1lbnQgdHlwZSAoWE1MLCBIVE1MLCBvciBvdGhlcikuIEluIHN0cnVjdHVyYWwKLSAgICAgdGVybXMsIGFuIFhTTCBzdHlsZXNoZWV0IHNwZWNpZmllcyB0aGUgdHJhbnNmb3JtYXRpb24gb2Ygb25lIHRyZWUgb2Ygbm9kZXMgKHRoZSBYTUwgaW5wdXQpIGludG8gYW5vdGhlciB0cmVlIG9mIG5vZGVzIAotICAgICAodGhlIG91dHB1dCBvciB0cmFuc2Zvcm1hdGlvbiByZXN1bHQpLjwvcD4KLSAgICA8bm90ZT5UaGUgWFNMIHN0eWxlc2hlZXQgbWF5IGdlbmVyYXRlIGFuZCByZWZlciB0byBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzICg8anVtcAotICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1N0eWxlL0NTUy8iPkNTUzwvanVtcD4pIGFzIHBhcnQgb2YgaXRzIG91dHB1dC48L25vdGU+IAotICAgIDxwPkluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgdGhlIGZvby54c2wgc3R5bGVzaGVldCBpcyB1c2VkIHRvIHRyYW5zZm9ybSBmb28ueG1sIGludG8gZm9vLm91dDo8L3A+Ci0gICAgPHA+Zm9vLnhtbDo8L3A+Ci0gICAgICAgIDxzb3VyY2U+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+Ci0mbHQ7ZG9jPkhlbGxvJmx0Oy9kb2M+PC9zb3VyY2U+Ci0gICAgICAgIDxwPmZvby54c2w6PC9wPgotICAgICAgICA8c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/PiAKLSZsdDt4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+Ci0mbHQ7b3V0PiZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+Jmx0Oy9vdXQ+Ci0mbHQ7L3hzbDp0ZW1wbGF0ZT4KLSZsdDsveHNsOnN0eWxlc2hlZXQ+PC9zb3VyY2U+Ci08cD5mb28ub3V0OjwvcD4KLTxzb3VyY2U+Jmx0O291dD5IZWxsbyZsdDsvb3V0Pjwvc291cmNlPgotPHA+QnkgZGVmYXVsdCwgJnhzbHQ0ajsgdXNlcyAmeG1sNGo7LCBhbmQgaXQgbWF5IGJlIGNvbmZpZ3VyZWQgd2l0aCBzeXN0ZW0gcHJvcGVydGllcyB0byB3b3JrIHdpdGggb3RoZXIgWE1MIHBhcnNlcnMgKHNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJwbHVnIj5QbHVnZ2luZyBpbiBhIFRyYW5zZm9ybWVyIGFuZCBYTUwgcGFyc2VyPC9saW5rPikuIFRoZSBpbnB1dCBtYXkgYmUgc3VibWl0dGVkIGluIHRoZSBmb3JtIG9mIGEgc3RyZWFtIG9mIFhNTCBtYXJrdXAgKGZyb20gYSBVUkksIGEgY2hhcmFjdGVyIG9yIGJ5dGUgc3RyZWFtLCBvciBhbm90aGVyIHRyYW5zZm9ybWF0aW9uKSwgYSBTQVggSW5wdXRTdHJlYW0sIG9yIGEgRE9NIE5vZGUuPC9wPgotPHA+JnhzbHQ0ajsgcGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9ucyBzcGVjaWZpZWQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0IGFuZCBwYWNrYWdlcyBhIHNlcXVlbmNlIG9mIFNBWCBldmVudHMgdGhhdCBtYXkgYmUgc2VyaWFsaXplZCB0byBhbiBvdXRwdXQgc3RyZWFtIG9yIHdyaXRlciwgdXNlZCB0byBidWlsZCBhIERPTSB0cmVlLCBvciBmb3J3YXJkZWQgYXMgaW5wdXQgdG8gYW5vdGhlciB0cmFuc2Zvcm1hdGlvbi48L3A+Ci0gICAgICA8L3MyPjxhbmNob3IgbmFtZT0iZmVhdHVyZXMiLz4KLSAgIAkgIDxzMiB0aXRsZT0iJnhzbHQ0ajsgRmVhdHVyZXMiPgotCSAgICA8dWw+IAotCQkgICAgPGxpPkltcGxlbWVudHMgdGhlIHJlbGV2YW50IFczQyBzcGVjaWZpY2F0aW9uczogPHJlc291cmNlLXJlZiBpZHJlZj0ieHNsdCIvPiBhbmQgPHJlc291cmNlLXJlZiBpZHJlZj0ieHBhdGgiLz4uPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgIDxsaT5JbXBsZW1lbnRzIDxyZXNvdXJjZS1yZWYgaWRyZWY9InRyYXgiLz4sIG5vdyBwYXJ0IG9mIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImpheHAiLz4sIGFuZCBidWlsZHMgb24KLSAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWRyZWY9InNheDIiLz4gYW5kIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImRvbTIiLz4uPGJyLz48YnIvPjwvbGk+Ci0gICAgCSAgPGxpPk1heSBiZSBjb25maWd1cmVkIHRvIHdvcmsgd2l0aCBhbnkgWE1MIHBhcnNlciwgc3VjaAotICAgICAgICA8anVtcCBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGVyY2VzLWovaW5kZXguaHRtbCI+JnhtbDRqOzwvanVtcD4sIHRoYXQgaW1wbGVtZW50cyA8cmVzb3VyY2UtcmVmCi0gICAgICAgIGlkcmVmPSJqYXhwIi8+IChzZWUgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0icGx1ZyI+UGx1Z2dpbmcgaW4gYW4gWE1MCi0gICAgICAgICBwYXJzZXI8L2xpbms+KS48YnIvPjxici8+PC9saT4KLSAgICAJICA8bGk+Q2FuIHByb2Nlc3MgU3RyZWFtLCBTQVggb3IgRE9NIGlucHV0LCBhbmQgb3V0cHV0IHRvIGEgU3RyZWFtLCBTQVggb3IgRE9NLjxici8+PGJyLz48L2xpPgotICAgICAgICA8bGk+VHJhbnNmb3JtYXRpb25zIG1heSBiZSBjaGFpbmVkICh0aGUgb3V0cHV0IG9mIG9uZSB0cmFuc2Zvcm1hdGlvbiBtYXkgYmUgdGhlIGlucHV0IGZvcgotICAgICAgICAgYW5vdGhlcikuPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgIDxsaT5NYXkgYmUgcnVuIGZyb20gdGhlIDxsaW5rIGlkcmVmPSJjb21tYW5kbGluZSI+Y29tbWFuZCBsaW5lPC9saW5rPiBmb3IgY29udmVuaWVudCBmaWxlLXRvLWZpbGUKLSAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9ucy48YnIvPjxici8+PC9saT4KLSAgICAJICA8bGk+SW5jbHVkZXMgYW4gPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0iYXBwbGV0Ij5hcHBsZXQgd3JhcHBlcjwvbGluaz4uPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgIDxsaT5NYXkgYmUgdXNlZCBpbiBhIDxsaW5rIGlkcmVmPSJzYW1wbGVzIiBhbmNob3I9InNlcnZsZXQiPnNlcnZsZXQ8L2xpbms+IHRvIHRyYW5zZm9ybSBYTUwgZG9jdW1lbnRzIGludG8KLSAgICAgICAgSFRNTCBhbmQgc2VydmUgdGhlIHJlc3VsdHMgdG8gY2xpZW50cy48YnIvPjxici8+PC9saT4KLSAgICAgICAgPGxpPlN1cHBvcnRzIHRoZSBjcmVhdGlvbiBvZiA8bGluayBpZHJlZj0iZXh0ZW5zaW9ucyI+SmF2YSBhbmQgc2NyaXB0aW5nIGxhbmd1YWdlIGV4dGVuc2lvbnM8L2xpbms+LiBhbmQKLSAgICAgICAgIHByb3ZpZGVzIGEgZ3Jvd2luZyBsaWJyYXJ5IG9mIGV4dGVuc2lvbiBlbGVtZW50cyBhbmQgZnVuY3Rpb25zLjwvbGk+Ci0JICAgIDwvdWw+IAotCSAgPC9zMj48YW5jaG9yIG5hbWU9InRvd29yayIvPgotICAgIDxzMiB0aXRsZT0iR2V0dGluZyB0byB3b3JrIHdpdGggJnhzbHQ0ajsiPgotICAgICA8cD5Gb3IgaW5zdHJ1Y3Rpb25zIGFuZCBzb21lIHN1Z2dlc3Rpb25zIGFib3V0IGhvdyB0byBnZXQgc3RhcnRlZCB1c2luZyAmeHNsdDRqOywgc2VlIAotICAgICA8bGluayBpZHJlZj0iZ2V0c3RhcnRlZCI+R2V0dGluZyBTdGFydGVkPC9saW5rPi48L3A+Ci0gICAgPC9zMj48YW5jaG9yIG5hbWU9InVwdG9zcGVlZCIvPgotICAgIAotICAgIDxzMiB0aXRsZT0iR2V0dGluZyB1cCB0byBzcGVlZCB3aXRoIFhTTFQiPgotICAgIDxwPklmIHlvdSBhcmUgc3RpbGwgd29ya2luZyB0aHJvdWdoIHRoZSBkZXRhaWxzIG9mIHRoZSBYU0xUIHNwZWMgKHRoZSBXM0MgMS4wIFJlY29tbWVuZGF0aW9uKSwgeW91IG1heSB3YW50IAotICAgIHRvIGNvbnN1bHQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZzo8L3A+Ci0gICAgPHVsPgotICAgICAgPGxpPk1pY2hhZWwgS2F5J3MgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53cm94LmNvbS9Db25zdW1lci9TdG9yZS9EZXRhaWxzLmFzcD9JU0JOPTE4NjEwMDMxMjkiPlhTTFQgUHJvZ3JhbW1lcidzCi0gICAgICAgUmVmZXJlbmNlPC9qdW1wPiwgV3JveCBQcmVzcywgMjAwMDxici8+PGJyLz48L2xpPgotICAgICAgIDxsaT5OZWlsIEJyYWRsZXkncyBYU0wgQ29tcGFuaW9uLCBBZGRpc29uLVdlc2xleSwgMjAwMDxici8+PGJyLz48L2xpPiAgICAgICAgICAgICAgICAgCi0gICAgICAgIDxsaT5FbGxpb3R0ZSBSdXN0eSBIYXJvbGQncyA8anVtcCBocmVmPSJodHRwOi8vbWV0YWxhYi51bmMuZWR1L3htbC9ib29rcy9iaWJsZS91cGRhdGVzLzE0Lmh0bWwiPkNoYXB0ZXIgMTQgb2YgCi0gICAgICAgIHRoZSBYTUwgQmlibGU6IFhTTCBUcmFuc2Zvcm1hdGlvbnM8L2p1bXA+PGJyLz48YnIvPjwvbGk+Ci0gICAgICAgIDxsaT5DcmFuZSBTb2Z0d3JpZ2h0J3MgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy5DcmFuZVNvZnR3cmlnaHRzLmNvbS90cmFpbmluZy8iPkZyZWUgcHJldmlldyBvZiBQcmFjdGljYWwKLSAgICAgICAgIFRyYW5zZm9ybWF0aW9uIFVzaW5nIFhTTFQgYW5kIFhQYXRoPC9qdW1wPjxici8+PGJyLz48L2xpPgotICAgICAgICA8bGk+VGhlIE11bGJlcnJ5IDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cubXVsYmVycnl0ZWNoLmNvbS94c2wveHNsLWxpc3QvIj5YU0wtTGlzdCAtLSBPcGVuIEZvcnVtIG9uIFhTTDwvanVtcD4gCi0gICAgICAgIChvZiBpbnRlcmVzdCB0byBYU0wgdXNlcnMgYXQgYWxsIGxldmVscyk8YnIvPjxici8+PC9saT4KLSAgICAgICAgPGxpPkRhdmUgUGF3c29uJ3MgPHJlc291cmNlLXJlZiBpZHJlZj0iZHBhd3NvbnhzbGZhcSIvPjxici8+PGJyLz48L2xpPgotICAgICAgICA8bGk+T2JqZWN0cyBieSBEZXNpZ24ncyA8anVtcCBocmVmPSJodHRwOi8vd3d3Lm9iamVjdHNieWRlc2lnbi5jb20vcHJvamVjdHMveG1pX3RvX2h0bWwuaHRtbCI+VHJhbnNmb3JtaW5nIFhNSSB0bwotICAgICAgICAgSFRNTDwvanVtcD4gKG9yaWVudGVkIHRvd2FyZHMgWE1JLCAiYW4gWE1MLWJhc2VkLCBzdHJlYW0gcmVwcmVzZW50YXRpb24gb2YgYSBVTUwgbW9kZWwsIiBidXQgYWxzbyBjb3ZlcnMgImdlbmVyaWMiCi0gICAgICAgICBYTUwgdHJhbnNmb3JtYXRpb25zKTxici8+PGJyLz48L2xpPgotICAgICAgICAgPGxpPk9iamVjdHMgYnkgRGVzaWduOydzIDxqdW1wIGhyZWY9Imh0dHA6Ly9vYmplY3RzYnlkZXNpZ24uY29tL3Byb2plY3RzL3hzbHQveHNsdF9ieV9leGFtcGxlLmh0bWwiPlhTTFQgYnkKLSAgICAgICAgIEV4YW1wbGU8L2p1bXA+PGJyLz48YnIvPjwvbGk+ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICA8bGk+TWlsb3NsYXYgTmljJ3MgPGp1bXAgaHJlZj0iaHR0cDovL3p2b24udnNjaHQuY3ovSFRNTG9ubHkvWFNMVHV0b3JpYWwvQm9va3MvQm9vazEvaW5kZXguaHRtbCI+WFNMIFR1dG9yaWFsPC9qdW1wPgotICAgICAgICAgPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgICA8bGk+T0FTSVMgKHRoZSBPcmdhbml6YXRpb24gZm9yIHRoZSBBZHZhbmNlbWVudCBvZiBTdHJ1Y3R1cmVkIEluZm9ybWF0aW9uIFN0YW5kYXJkcyk6IAotICAgICAgICAgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb3Zlci94c2wuaHRtbCI+RXh0ZW5zaWJsZSBTdHlsZXNoZWV0IExhbmd1YWdlIChYU0wpPC9qdW1wPiBieSBSb2JpbgotICAgICAgICAgQ292ZXI8YnIvPjxici8+PC9saT4KLSAgICAgICAgIDxsaT5Eb25hbGQgQmFsbCdzIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cud2Vic2xpbmdlclouY29tL2JhbGxkL3hzbC9kZXNpZ25lcl9tYW51YWwueG1sIj5BIEd1aWRlIHRvIFhNTCBhbmQgWFNMIGZvcgotICAgICAgICAgRGVzaWduZXJzPC9qdW1wPjxici8+PGJyLz48L2xpPgotICAgICAgICA8bGk+WFNMVCAtIFhTTCBUcmFuc2Zvcm1hdGlvbnMgaW4gCi0gICAgICAgIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cuYnJpY3MuZGsvfmFtb2VsbGVyL1hNTC8iPlRoZSBYTUwgUmV2b2x1dGlvbjogVGVjaG5vbG9naWVzIGZvciB0aGUgZnV0dXJlIFdlYjwvanVtcD4gYnkKLSAgICAgICAgQW5kZXJzIE0mb3NsYXNoO2xsZXIgYW5kIE1pY2hhZWwgSS4gU2Nod2FydHpiYWNoPC9saT4KLSAgICA8L3VsPgotICAgIDxwPldoZW4geW91IGNvbWUgYWNyb3NzIG90aGVyIHVzZWZ1bCBpbnRyb2R1Y3Rvcnkgb3IgYmFja2dyb3VuZCBtYXRlcmlhbHMsIHBsZWFzZSBlbWFpbCA8aHVtYW4tcmVzb3VyY2UtcmVmCi0gICAgIGlkcmVmPSJ4YWxhbmRldiIvPiwgc28gd2UgY2FuIGFkZCB0aGVtIHRvIHRoaXMgbGlzdC48L3A+Ci0gICAgIAotICAgIDwvczI+PGFuY2hvciBuYW1lPSJnbG9zc2FyeSIvPgotICAgIDxzMiB0aXRsZT0iR2xvc3NhcnkiPgotICAgICAgPGdsb3NzPgotICAgICAgICA8bGFiZWw+WFNMVCBOYW1lc3BhY2U8L2xhYmVsPgotICAgICAgICA8aXRlbT5UaGUgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy8iPlhNTCBuYW1lc3BhY2U8L2p1bXA+IGZvciBYU0xULiBBbiBYTUwgbmFtZXNwYWNlIGlzIGEgCi0gICAgICAgIGNvbGxlY3Rpb24gb2YgZWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzLCBpZGVudGlmaWVkIGJ5IGEgVW5pcXVlIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSksIHdoaWNoIG9mdGVuIHRha2VzIHRoZSBmb3JtIG9mCi0gICAgICAgIGEgVVJMLCBidXQgaXMgcmVhbGx5IGp1c3QgYSB1bmlxdWUgc3RyaW5nLCBub3QgYSBwb2ludGVyIHRvIGEgd2ViIHBhZ2UuIFRoZSBYU0xUIG5hbWVzcGFjZSBVUkkgaXMKLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtLiBJbiBlYWNoIFhTTFQgc3R5bGVzaGVldCwgeW91IG11c3QgZGVjbGFyZSB0aGlzIG5hbWVzcGFjZSBpbiB0aGUgc3R5bGVzaGVldCBlbGVtZW50Ci0gICAgICAgIHRhZyBhbmQgYmluZCBpdCB0byBhIGxvY2FsIHByZWZpeC4gTGlrZSB0aGUgWFNMVCBzcGVjaWZpY2F0aW9uLCB3ZSBhbHdheXMgdXNlIHhzbCBhcyB0aGUgWFNMVCBuYW1lc3BhY2UgcHJlZml4IGluIG91cgotICAgICAgICBkZXNjcmlwdGlvbnMgYW5kIGV4YW1wbGVzLCBhbHRob3VnaCB5b3UgYXJlIGZyZWUgdG8gYmluZCBhbnkgcHJlZml4IHRvIHRoaXMgbmFtZXNwYWNlLjxici8+PGJyLz48L2l0ZW0+Ci0gICAgICAgIAotICAgICAgICA8bGFiZWw+WFNMIEluc3RydWN0aW9uPC9sYWJlbD4KLSAgICAgICAgPGl0ZW0+QW55IHRhZyBhc3NvY2lhdGVkIHdpdGggdGhlIFhTTFQgbmFtZXNwYWNlLjxici8+PGJyLz48L2l0ZW0+Ci0gICAgICAgIAotICAgICAgICA8bGFiZWw+VGVtcGxhdGU8L2xhYmVsPgotICAgICAgICA8aXRlbT5BbiBlbGVtZW50LCB1c3VhbGx5IHdpdGggY2hpbGQgZWxlbWVudHMsIHRoYXQgc3BlY2lmaWVzIGEgInJ1bGUiIG9yIHNldCBvZiAKLSAgICAgICAgaW5zdHJ1Y3Rpb25zIHRvIHBlcmZvcm0gd2hlbiBhIHBhcnRpY3VsYXIga2luZCBvZiBub2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBzb3VyY2UgdHJlZS48YnIvPjxici8+PC9pdGVtPgotICAgICAgICAgICAgICAgIAotICAgICAgICA8bGFiZWw+WFNMIFRlbXBsYXRlIEluc3RydWN0aW9uPC9sYWJlbD4KLSAgICAgICAgPGl0ZW0+QW55IHRhZyB0aGF0IG9jY3VycyBpbnNpZGUgYW4geHNsOnRlbXBsYXRlIGVsZW1lbnQgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgWFNMVCBuYW1lc3BhY2UuPGJyLz48YnIvPjwvaXRlbT4KLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgPGxhYmVsPlNvdXJjZSBUcmVlPC9sYWJlbD4KLSAgICAgICAgPGl0ZW0+VGhlIFhNTCB0cmVlIGlucHV0IHRvIHRoZSBYU0wgcHJvY2Vzcy48YnIvPjxici8+PC9pdGVtPgotICAgICAgICAKLSAgICAgICAgPGxhYmVsPlJlc3VsdCBUcmVlPC9sYWJlbD4KLSAgICAgICAgPGl0ZW0+VGhlIHRyZWUgdGhhdCBpcyBvdXRwdXQgYnkgdGhlIFhTTCBwcm9jZXNzLjxici8+PGJyLz48L2l0ZW0+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIDxsYWJlbD5NYXRjaCBQYXR0ZXJuPC9sYWJlbD4KLSAgICAgICAgPGl0ZW0+VGhlIHBhcnQgb2YgYSB0ZW1wbGF0ZSB0aGF0IGRlZmluZXMgdGhlIGtpbmQocykgb2Ygbm9kZXMgdG8gd2hpY2ggdGhlIHRlbXBsYXRlIGFwcGxpZXMuPGJyLz48YnIvPjwvaXRlbT4KLQotICAgICAgPC9nbG9zcz4KLSAgICAgIDxwPkZvciBtb3JlIGRlZmluaXRpb25zIG9mIFhTTFQgdGVybWlub2xvZ3ksIHNlZSBEYXZlIFBhd3NvbidzIAotICAgICAgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy5kcGF3c29uLmNvLnVrL3hzbC92b2NhYi5odG1sIj5YU0xUIFRlcm1pbm9sb2d5Ci0gICAgICBDbGFyaWZpY2F0aW9uPC9qdW1wPiBhbmQgdGhlIEdsb3NzYXJ5IGluIE1pY2hhZWwgS2F5J3MgCi0gICAgICA8anVtcCBocmVmPSJodHRwOi8vd3d3Lndyb3guY29tL0NvbnN1bWVyL1N0b3JlL0RldGFpbHMuYXNwP0lTQk49MTg2MTAwMzEyOSI+WFNMVCBQcm9ncmFtbWVyJ3MgUmVmZXJlbmNlPC9qdW1wPi48L3A+Ci0gICAgPC9zMj4KLTwvczE+IApkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94YWxhbi9yZWFkbWUueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi9yZWFkbWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2UxNDNiLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vcmVhZG1lLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+IAotPCFET0NUWVBFIHMxIFNZU1RFTSAiLi4vLi4vc3R5bGUvZHRkL2RvY3VtZW50LmR0ZCJbCi08IUVOVElUWSBkb25lLWogU1lTVEVNICJET05FIj4KLTwhRU5USVRZIHN0YXR1cy1qIFNZU1RFTSAiU1RBVFVTIj4KLTwhRU5USVRZIGhpc3RvcnktaiBTWVNURU0gImhpc3RvcnkueG1sIj5dPgotCi08IS0tCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotIC0tPgotPHMxIHRpdGxlPSJSZWxlYXNlIE5vdGVzIj4KLTxwPiZ4c2x0NGotY3VycmVudDs8L3A+Ci0gPHVsPgotICA8bGk+PGxpbmsgYW5jaG9yPSJzdGF0dXMwIj5TdGF0dXM8L2xpbms+PC9saT4KLSAgPGxpPjxsaW5rIGFuY2hvcj0iYnVpbGQiPkJ1aWxkIE5vdGVzPC9saW5rPjwvbGk+Ci0gIDxsaT48bGluayBhbmNob3I9ImNvbnRhY3QiPkdldHRpbmcgaW4gdG91Y2g8L2xpbms+PC9saT4KLSAgPGxpPjxsaW5rIGFuY2hvcj0iaGlzdG9yeSI+SGlzdG9yeSBvZiBzb2Z0d2FyZSBjaGFuZ2VzPC9saW5rPjwvbGk+Ci0gPC91bD48YW5jaG9yIG5hbWU9InN0YXR1czAiLz4KLSAgPHMyIHRpdGxlPSJTdGF0dXMiPgotICAgPHVsPgotICAgIDxsaT48bGluayBhbmNob3I9ImRvbmUiPkNoYW5nZXMgc2luY2UgdmVyc2lvbiAyLjAuMTwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9Im90aGVyIj5PdGhlciBwb2ludHMgb2YgaW50ZXJlc3Q8L2xpbms+PC9saT4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJidWdzIj5CdWdzPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0ic3RhdHVzIj5WZXJzaW9uIG9mIFhlcmNlcyB0byB1c2U8L2xpbms+PC9saT4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJ0by1kbyI+VG8tZG8gdGFza3MgZm9yIGZ1dHVyZSAmeHNsdDRqOyByZWxlYXNlczwvbGluaz48L2xpPgotICAgPC91bD4KLSAgICAgPGFuY2hvciBuYW1lPSJkb25lIi8+Ci0gICAgIDxzMyB0aXRsZT0iQ2hhbmdlcyBzaW5jZSAmeHNsdDRqOyAyLjAuMSI+Ci0gICAgIDxwPlRoaXMgcmVsZWFzZSBpbmNsdWRlcyBhIG51bWJlciBvZiBidWcgZml4ZXMgdG8gdGhlICZ4c2x0NGo7IGFuZCBUckFYIGNvcmUgYW5kIFhhbGFuLUphdmEgMSBjb21wYWJpbGl0eSBBUEkuIFdlIGhhdmUgYWxzbzwvcD4KLSAgICAgPHVsPgotICAgICA8bGk+PC9saT4KLSAgICAgPGxpPjxici8+PGJyLz48L2xpPiAKLSAgICAgPGxpPjwvbGk+Ci0gICAgIDwvdWw+Ci0gICAgICZkb25lLWo7Ci0gICAgIDwvczM+Ci0gICAgIDxhbmNob3IgbmFtZT0ib3RoZXIiLz4KLSAgICAgPHMzIHRpdGxlPSJPdGhlciBwb2ludHMgb2YgaW50ZXJlc3QiPgotICAgICA8dWw+Ci0gICAgIDxsaT5IYW5kbGluZyB4c2w6bmFtZXNwYWNlLWFsaWFzIGRlY2xhcmF0aW9uczogSW4gcmVsZWFzZSAyLjAuRDAxLCB3ZSByZXBvcnRlZCB0aGUgbmVlZCB0byBkbyBzb21lIHJlc2VhcmNoIGNvbmNlcm5pbmcgZXhhY3RseSBob3cgWGFsYW4KLSAgICAgc2hvdWxkIGhhbmRsZSB4c2w6bmFtZXNwYWNlLWFsaWFzIGRlY2xhcmF0aW9ucy4gQXMgYSByZXN1bHQgb2YgZGlzY3Vzc2lvbnMgYW1vbmcgbWVtYmVycyBvZiB0aGUgVzNDIFdvcmtpbmcgR3JvdXAgb24gWFNMLCB3ZSBoYXZlIHJlYWNoZWQgYQotICAgICBtb3JlIHByZWNpc2UgY29uc2Vuc3VzIG9uIGhvdyBuYW1lc3BhY2VzIHNob3VsZCBiZSByZXByZXNlbnRlZCB3aGVuIGFuIHhzbDpuYW1lc3BhY2UtYWxpYXMgZGVjbGFyYXRpb24gaXMgaW4gZWZmZWN0Ljxici8+PGJyLz4KLSAgICAgSWYgYSBsaXRlcmFsIHJlc3VsdCBlbGVtZW50IGhhcyBhIG5hbWVzcGFjZSBwcmVmaXgsIHRoZSBwcmVmaXggd2lsbCBiZSBwcmVzZXJ2ZWQgYW5kIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBlbGVtZW50IHdpbGwgYmUgYXMKLSAgICAgc3BlY2lmaWVkIGluIHRoZSB4c2w6bmFtZXNwYWNlLWFsaWFzIGVsZW1lbnQsIGJ1dCB0aGUgcmVzdWx0LXByZWZpeCBpcyBub3QgcmVxdWlyZWQgdG8gYXBwZWFyIGluIHRoZSByZXN1bHQuIFRoaXMgYWxzbyBhcHBsaWVzIHRvIHRoZQotICAgICB0d28gb3RoZXIgY2FzZXMgb2YgIkxpdGVyYWwgbmFtZXNwYWNlIFVSSSIgbWVudGlvbmVkIGluIHRoZSBYU0xUIFJlY29tbWVuZGF0aW9uIG9uIAotICAgICA8anVtcCBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0I2xpdGVyYWwtcmVzdWx0LWVsZW1lbnQiPkxpdGVyYWwgUmVzdWx0IEVsZW1lbnRzPC9qdW1wPi4gTW9yZSBzaW1wbHksIGlmIHRoZSBzdHlsZXNoZWV0IGNhbGxzIGZvcgotICAgICAmbHQ7YXhzbDpmb28mZ3Q7IHRvIGJlIG91dHB1dCBhcyBhIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnQsIHRoZW4gaXQgd2lsbCBiZSBvdXRwdXQgYXMgJmx0O2F4c2w6Zm9vJmd0OyBpbiB0aGUgcmVzdWx0LCBidXQgdGhlIG5hbWVzcGFjZQotICAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyAiYXhzbCIgcHJlZml4IHdpbGwgYmUgYXMgZGVzaWduYXRlZCBpbiB0aGUgeHNsOm5hbWVzcGFjZS1hbGlhcyBkZWNsYXJhdGlvbi48YnIvPjxici8+PC9saT4KLSAgICAgPGxpPkZvciBIVE1MIG91dHB1dCwgJnhzbHQ0ajI7IG91dHB1dHMgY2hhcmFjdGVyIGVudGl0eSByZWZlcmVuY2VzICgmYW1wO2NvcHk7IGV0Yy4pIGZvciB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGRlc2lnbmF0ZWQgaW4gIAotICAgICA8anVtcCBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvI2R0ZHMiPkFwcGVuZGl4IEEuIERURHMgb2YgdGhlIFhIVE1MIDEuMDogVGhlIEV4dGVuc2libGUgSHlwZXJUZXh0IE1hcmt1cAotICAgICBMYW5ndWFnZTwvanVtcD4uICZ4c2x0NGo7IDEueCwgb24gdGhlIG90aGVyIGhhbmQsIG91dHB1dHMgbGl0ZXJhbCBjaGFyYWN0ZXJzIGZvciBzb21lIG9mIHRoZXNlIHNwZWNpYWwgY2hhcmFjdGVycy48YnIvPjxici8+PC9saT4KLSAgICAgPGxpPkluIGNvbmZvcm1hbmNlIHdpdGggdGhlIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjc2VjdGlvbi1IVE1MLU91dHB1dC1NZXRob2QiPlhTTFQgUmVjb21tZW5kYXRpb24gb24gdGhlIEhUTUwgCi0gICAgIE91dHB1dCBNZXRob2Q8L2p1bXA+IGFuZCA8anVtcCBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2FwcGVuZGl4L25vdGVzLmh0bWwjaC1CLjIuMSI+U2VjdGlvbiBCLjIuMSBvZiB0aGUgSFRNTCA0LjAKLSAgICAgUmVjb21tZW5kYXRpb248L2p1bXA+LCAmeHNsdDRqMjsgdXNlcyAlaGggZW5jb2RpbmcgZm9yIGVhY2ggYnl0ZSBvZiB0aGUgVVRGLTggcmVwcmVzZW50YXRpb24gb2Ygbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gSFRNTCBVUkkKLSAgICAgYXR0cmlidXRlcy48YnIvPjxici8+PC9saT4KLSAgICAgPGxpPldoZW4geW91ciBzdHlsZXNoZWV0IGFza3MgZm9yIGFuIGV4cGxpY2l0IGNhcnJpYWdlLXJldHVybiBjaGFyYWN0ZXIgKCZhbXA7IzEzOykgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgb3V0cHV0LCBpdCBpcyBvdXRwdXQgZHVyaW5nCi0gICAgIHRoZSBzZXJpYWxpemF0aW9uIHByb2Nlc3MgaW4gZXNjYXBlZCBmb3JtIHVubGVzcyBlc2NhcGluZyBoYXMgYmVlbiBkaXNhYmxlZC4gIFdoZW4geW91ciBzdHlsZXNoZWV0IGFza3MgZm9yIGFuIGV4cGxpY2l0IGxpbmUtZmVlZCBjaGFyYWN0ZXIKLSAgICAgKCZhbXA7IzEwOykgdG8gYmUgb3V0cHV0LCB0aGUgc3lzdGVtLWRlZmF1bHQgbGluZS1icmVhayBjaGFyYWN0ZXIocykgaXMvYXJlIG91dHB1dCBkdXJpbmcgdGhlIHNlcmlhbGl6YXRpb24gcHJvY2Vzcy4gIEFsc28ga2VlcCBpbiBtaW5kIHRoYXQKLSAgICAgdGhlIFhNTCBwYXJzZXIgbm9ybWFsaXplcyBsaW5lLWJyZWFrcyB0byBsaW5lLWZlZWRzIHdoZW4gaXQgc2VuZHMgY2hhcmFjdGVyIGV2ZW50cyB0byB0aGUgcHJvY2Vzc29yLjxici8+PGJyLz48L2xpPgotICAgICA8bGk+SWYgeW91ciBYTUwgaW5wdXQgaXMgYSBET00sIHVzZSB0aGUgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBzZXRDb2FsZXNjaW5nKCkgbWV0aG9kIHRvIHNldCBjb2FsZXNjaW5nIHRvIHRydWUgKGl0IGlzCi0gICAgIGZhbHNlIGJ5IGRlZmF1bHQpLCBpZiB5b3Ugd2FudCB0byBhcHBlbmQgQ0RBVEEgc2VjdGlvbnMgdG8gYWRqYWNlbnQgdGV4dCBzZWN0aW9ucyB0byBmb3JtIGEgc2luZ2xlIHRleHQgbm9kZSAoYXMgdGhlIFhQYXRoIHN0YW5kYXJkIGNhbGxzCi0gICAgICBmb3IpLCBhbmQgaWYgdGhlIFhNTCBwYXJzZXIgc3VwcG9ydHMgdGhpcyBmZWF0dXJlICgmeG1sNGotdXNlZDsgZG9lcyBub3QpLjwvbGk+Ci0gICAgIDwvdWw+Ci0gICAgIDwvczM+PGFuY2hvciBuYW1lPSJidWdzIi8+Ci0gICAgIDxzMyB0aXRsZT0iQnVncyI+Ci0gICAgIDxwPkFsbCBrbm93biAmeHNsdDRqOyBidWdzIGFyZSBsaXN0ZWQgaW4gPHJlc291cmNlLXJlZiBpZHJlZj0iYnVnemlsbGEiLz4uIEZvciBhIGxpc3Qgb2Ygb3BlbiBidWdzIHdpdGggbGlua3MgdG8gZWFjaCBidWcKLSAgICAgIHJlcG9ydCwgc2VlIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImJ1Z2xpc3QiLz4uIElmIHlvdSBmaW5kIGEgbmV3IGJ1ZywgcGxlYXNlIGVudGVyIGEgWGFsYW5KMiBidWcgcmVwb3J0IGluIHRoaXMKLSAgICAgIGRhdGFiYXNlLjwvcD4KLSAgICAgPG5vdGU+QmVmb3JlIHlvdSBjYW4gZW50ZXIgeW91ciBmaXJzdCBidWcgcmVwb3J0LCB5b3UgbXVzdCBzdWJtaXQgeW91ciBlbWFpbCBhZGRyZXNzIHRvIEJ1Z3ppbGxhIGFuZCByZWNlaXZlIGEgcGFzc3dvcmQuPC9ub3RlPiAKLSAgICAgPHA+V2Ugc3Ryb25nbHkgZW5jb3VyYWdlIHlvdSB3cml0ZSBwYXRjaGVzIGZvciBwcm9ibGVtcyB5b3UgZmluZCBhbmQgc3VibWl0IHRoZW0gdG8KLSAgICAgIHhhbGFuLWRldkB4bWwuYXBhY2hlLm9yZy4gV2UgcmV2aWV3IHRoZSBwYXRjaGVzIHdlIHJlY2VpdmUgdG8gbWFrZSBzdXJlIHRoZXkgZG8gbm90IGJyZWFrIHNvbWV0aGluZyBlbHNlLCBhbmQgKGFzc3VtaW5nIHRoZXkgCi0gICAgIGRvIG5vdCkgaW5jbHVkZSB0aGVtIGluIG91ciBuZXh0IHJlbGVhc2UuIEluIHRoZSBpbnRlcmVzdCBvZiBmaXhpbmcgYnVncywgYWRkaW5nIGVuaGFuY2VtZW50cywgYW5kIGFkZHJlc3Npbmcgb3V0c3RhbmRpbmcgZGVzaWduCi0gICAgIGlzc3Vlcywgd2Ugc2luY2VyZWx5IHdhbnQgKGFuZCBuZWVkISkgeW91ciBhY3RpdmUgcGFydGljaXBhdGlvbiBpbiB0aGUgb25nb2luZyBkZXZlbG9wbWVudCBvZiBYYWxhbi48L3A+Ci0gICAgIDxwPlhlcmNlcyBidWcgaW4gJnhtbDRqLXVzZWQ7OjwvcD4KLSAgICAgPHVsPgotICAgICAgIDxsaT4meG1sNGo7IDEuMi4zIGRvZXMgbm90IHByb2Nlc3MgbmFtZXNwYWNlcyBpbiBTQVggZXZlbnRzIHdoZW4gcGFyc2luZyBVVEYtMTYgZG9jdW1lbnRzLCB3aGljaCBjYXVzZXMgJnhzbHQ0ajsgdG8gZmFpbCB3aXRoIFVURi0xNgotICAgICAgICBkb2N1bWVudHMuIFhlcmNlcyB3aWxsIHBvc3QgYSBmaXggc2hvcnRseS48YnIvPjxici8+PC9saT4KLSAgICAgPC91bD4KLSAgICAgPC9zMz4gICAgIAotICAgICA8YW5jaG9yIG5hbWU9InN0YXR1cyIvPgotICAgICAmc3RhdHVzLWo7Ci0gICAgIDxhbmNob3IgbmFtZT0idG8tZG8iLz4KLSAgICAgPHMzIHRpdGxlPSJUby1kbyB0YXNrcyI+Ci0gICAgICAgPHA+Rm9yIGEgbGlzdCBvZiBnb2FscywgdGFza3MsIGFuZCB0YXJnZXQgZGF0ZXMgZm9yIGNvbXBsZXRpb24sIHNlZSA8anVtcCBocmVmPSJ0b2RvLmh0bWwiPlhhbGFuLUphdmEgVmVyc2lvbiAyOiBUaGluZ3MgVG8gRG88L2p1bXA+LiAKLSAgICAgICBBcyB0YXNrcyBhcmUgY29tcGxldGVkLCB0aGV5IGFyZSBtb3ZlZCBmcm9tIHRoZSB0by1kbyBsaXN0IHRvIAotICAgICAgIDxqdW1wIGhyZWY9InRvZG8uaHRtbCNyZWxlYXNlLWRhdGUtY29tcGxldGVkIj5Db21wbGV0ZWQ8L2p1bXA+LjwvcD4KLSAgICAgICA8cD5UaGUgc291cmNlIGRvY3VtZW50IGZvciB0aGUgdG8tZG8gbGlzdCBpcyBhbiBhY3RpdmUgZG9jdW1lbnQgaW4gdGhlIEFwYWNoZSBDVlMgcmVwb3NpdG9yeTogCi0gICAgICAgPGp1bXAgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3dlYnNyYy9jdnN3ZWIuY2dpL3htbC14YWxhbi9qYXZhL3RvZG8ueG1sIj54bWwteGFsYW4vamF2YS90b2RvLnhtbDwvanVtcD4uPC9wPgotICAgICAgPC9zMz4gCi0gIDwvczI+Ci0gIDxhbmNob3IgbmFtZT0iYnVpbGQiLz4KLSAgCi0gIDxzMiB0aXRsZT0iQnVpbGQgTm90ZXMiPgotPHVsPgotPGxpPjxsaW5rIGFuY2hvcj0iYW50Ij5Vc2luZyBBbnQ8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImphciI+UmVidWlsZGluZyB4YWxhbi5qYXI8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InNhbXBsZXMiPlJlYnVpbGRpbmcgc2FtcGxlIGFwcGxpY2F0aW9uczwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iZG9jIj5SZWJ1aWxkaW5nIHRoZSAmeHNsdDRqOyBkb2N1bWVudGF0aW9uPC9saW5rPjwvbGk+Ci08L3VsPgotPGFuY2hvciBuYW1lPSJhbnQiLz4KLSAgIDxzMyB0aXRsZT0iVXNpbmcgQW50Ij4KLSAgICAgPHA+QXBhY2hlIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImFudCIvPiBpcyBhIGZsZXhpYmxlLCBwb3dlcmZ1bCwgYW5kIGVhc3ktdG8tdXNlIEphdmEgYnVpbGQgdG9vbCB0aGF0IHdlIGluY2x1ZGUgd2l0aCB0aGUKLSAgICAgJnhzbHQ0ajsgZGlzdHJpYnV0aW9uLiBUaGUgQW50IEpBUiBmaWxlIGlzIGluIHRoZSBiaW4gZGlyZWN0b3J5LCBhbmQgdGhlIGNyb3NzLXBsYXRmb3JtIFhNTCBidWlsZCBmaWxlIChidWlsZC54bWwpIGlzIGluIAotICAgICB0aGUgcm9vdCBkaXJlY3RvcnkgYWxvbmcgd2l0aCBhIFdpbmRvd3MzMiBiYXRjaCBmaWxlIChidWlsZC5iYXQpIGFuZCBhIFVOSVggc2hlbGwgZmlsZSAoYnVpbGQuc2gpLiBUaGUgYnVpbGQgZmlsZSBkZWZpbmVzIAotICAgICB0aGUgInRhcmdldHMiIHRoYXQgeW91IGNhbiB1c2UgQW50IHRvIGJ1aWxkLiBUaGUgYmF0Y2ggYW5kIHNoZWxsIGZpbGVzIHNldCB1cCB0aGUgY2xhc3NwYXRoIGFuZCBsYXVuY2ggQW50IHdpdGggdGhlIHRhcmdldCAKLSAgICAgKGFuZCBhbnkgb3RoZXIgYXJndW1lbnRzKSB5b3UgcHJvdmlkZS48L3A+Ci0gICAgIDxwPjxlbT5JbnN0cnVjdGlvbnMgZm9yIHVzaW5nIEFudDwvZW0+PC9wPgotICAgICA8b2w+Ci0gICAgICAgPGxpPlNldCB0aGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBKREsgcm9vdCBkaXJlY3RvcnkuPGJyLz48YnIvPgotICAgICAgIElmIHlvdSBhcmUgdXNpbmcgSkRLIDEuMS44LCB5b3UgbXVzdCBhbHNvIHB1dCBjbGFzc2VzLnppcCBpbiB0aGUgSkRLIGJpbiBkaXJlY3Rvcnkgb24gdGhlIGNsYXNzcGF0aC4gWW91IGNhbiB1c2UgQW50IAotICAgICAgIHdpdGggSkRLIDEuMS44IHRvIGNvbXBpbGUgYW5kIGphciB0aGUgJnhzbHQ0ajsgc291cmNlIGZpbGVzLCBidXQgeW91IG11c3QgaGF2ZSBKREsgMS4yLjIgb3IgaGlnaGVyIHRvIGJ1aWxkIHRoZQotICAgICAgIGRvY3VtZW50YXRpb24uPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgPGxpPkRlcGVuZGluZyBvbiB5b3VyIGVudmlyb25tZW50LCBydW4gdGhlIGJhdGNoIGZpbGUgKGJ1aWxkLmJhdCkgb3Igc2hlbGwgZmlsZSAoYnVpbGQuc2gpIGZyb20gdGhlICZ4c2x0NGo7IHJvb3QKLSAgICAgICBkaXJlY3RvcnksIG9wdGlvbmFsbHkgd2l0aCBhcmd1bWVudHMgKHNlZSB0aGUgdGFibGUgb2YgdGFyZ2V0cyBiZWxvdykuPGJyLz48YnIvPgotICAgICAgIFRoZSBiYXRjaC9zaGVsbCBmaWxlIGFkZHMgc2V2ZXJhbCBKQVIgZmlsZXMgdG8gdGhlIGNsYXNzcGF0aCBhbmQgbGF1bmNoZXMgQW50IHdpdGggYW55IGFyZ3VtZW50cyB5b3UgcHJvdmlkZS4gSWYgeW91Ci0gICAgICAgcHJvdmlkZSBubyB0YXJnZXQsIEFudCBjb21waWxlcyB0aGUgc291cmNlIGZpbGVzIGFuZCByZWJ1aWxkcyB4YWxhbi5qYXIgKHRoZSAiamFyIiB0YXJnZXQpLjwvbGk+Ci0gICAgIDwvb2w+Ci0gICAgIDxwPllvdSBjYW4gYWxzbyBzZXQgdXAgeW91ciBjbGFzc3BhdGggbWFudWFsbHkgKHNlZSBidWlsZC5iYXQgb3IgYnVpbGQuc2ggZm9yIHRoZSBkZXRhaWxzKSwgYW5kIHRoZW4gcnVuIEFudCBhcwotICAgICBmb2xsb3dzOjxici8+PGJyLz4KLSAgICAgPGNvZGU+amF2YSBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluIDxyZWY+dGFyZ2V0PC9yZWY+PC9jb2RlPjxici8+PGJyLz4KLSAgICAgd2hlcmUgPHJlZj50YXJnZXQ8L3JlZj4gaXMgbm90aGluZyAoZm9yIHRoZSBkZWZhdWx0IHRhcmdldCkgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcuPC9wPgotICAgICA8dGFibGU+Ci0gICAgICAgPHRyPjx0ZD48ZW0+VGFyZ2V0PC9lbT48L3RkPjx0ZD48ZW0+V2hhdCBBbnQgZG9lczwvZW0+PC90ZD48L3RyPgotICAgICAgIDx0cj48dGQ+Y29tcGlsZTwvdGQ+PHRkPmNvbXBpbGVzIFhhbGFuLUphdmEgaW4gYnVpbGQvY2xhc3Nlcy48L3RkPjwvdHI+Ci0gICAgICAgPHRyPjx0ZD5qYXIgKHRoZSBkZWZhdWx0KTwvdGQ+PHRkPmNyZWF0ZXMgeGFsYW4uamFyIGluIHRoZSBidWlsZCBkaXJlY3Rvcnk8L3RkPjwvdHI+Ci0gICAgICAgPHRyPjx0ZD5zYW1wbGVzPC90ZD48dGQ+Y29tcGlsZXMgYW5kIGphcnMgdGhlIHNhbXBsZSBhcHBzIGluIGJ1aWxkL3hhbGFuc2FtcGxlcy5qYXI8L3RkPjwvdHI+Ci0gICAgICAgPHRyPjx0ZD5zZXJ2bGV0PC90ZD48dGQ+Y29tcGlsZXMgYW5kIGphcnMgdGhlIHNhbXBsZSBzZXJ2bGV0IGluIGJ1aWxkL3hhbGFuc2VydmxldC5qYXI8L3RkPjwvdHI+ICAgICAgIAotICAgICAgIDx0cj48dGQ+ZG9jczwvdGQ+PHRkPmNyZWF0ZXMgdGhlIEhUTUwgVXNlcidzIEd1aWRlIGluIGJ1aWxkL2RvY3M8L3RkPjwvdHI+Ci0gICAgICAgPHRyPjx0ZD5qYXZhZG9jczwvdGQ+PHRkPmdlbmVyYXRlcyB0aGUgQVBJIGRvY3VtZW50YXRpb24gaW4gLi9idWlsZC9kb2NzL2FwaWRvY3M8L3RkPjwvdHI+Ci0gICAgICAgPHRyPjx0ZD5kaXN0PC90ZD48dGQ+Z2VuZXJhdGVzIGEgY29tcGxldGUgZGlzdHJpYnV0aW9uIHRyZWUgd2l0aCB6aXAgYW5kIHRhci5neiBkaXN0cmlidXRpb24gZmlsZXMgaW4gYnVpbGQ8L3RkPjwvdHI+Ci0gICAgICAgPHRyPjx0ZD5jbGVhbjwvdGQ+PHRkPnB1cmdlcyB0aGUgYnVpbGQgYW5kIGRpc3RyaWJ1dGlvbjwvdGQ+PC90cj4gCi0gIDwvdGFibGU+Ci0gIDxwPklmIHlvdSBidWlsZCBhIHRhcmdldCB0aGF0IGRlcGVuZHMgb24gb3RoZXIgdGFyZ2V0cywgQW50IGNyZWF0ZXMgdGhvc2Ugb3RoZXIgdGFyZ2V0cyBpbiB0aGUgY29ycmVjdCBvcmRlci48L3A+Ci0gICA8L3MzPjxhbmNob3IgbmFtZT0iamFyIi8+IAotICAgPHMzIHRpdGxlPSJSZWJ1aWxkaW5nICZ4c2x0NGo7Ij4KLSAgICAgPHA+VGhlICZ4c2x0NGo7IGJ1aWxkIGlzIGluIHhhbGFuLmphci4gVGhlICZ4c2x0NGo7IHNvdXJjZSBjb2RlIHRyZWUgaXMgaW4gdGhlIHNyYyBkaXJlY3RvcnkuPC9wPgotICAgICA8cD5JZiB5b3UgYXJlIHVzaW5nIEFudCwgdGhlIHRhcmdldCBpcyBqYXIgKHRoZSBkZWZhdWx0KS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8bGluayBhbmNob3I9ImFudCI+VXNpbmcKLSAgICAgQW50PC9saW5rPi48L3A+Ci0gICAgIDxwPklmIHlvdSB3YW50IHRvIGRvIHRoZSBidWlsZCB3aXRob3V0IEFudCwga2VlcCB0aGUgZm9sbG93aW5nIGluIG1pbmQ6PC9wPgotICAgICA8dWw+Ci0gICAgIDxsaT5TZXQgdGhlIGNsYXNzcGF0aCB0byBpbmNsdWRlIHRoZSBzcmMgZGlyZWN0b3J5LCB4ZXJjZXMuamFyLCBic2YuamFyLCBhbmQgYnNmZW5naW5lcy5qYXIuPC9saT4KLSAgICAgPGxpPlVzZSBhIEphdmEgY29tcGlsZXIgKHN1Y2ggYXMgdGhlIElCTSBKdXN0LUluLVRpbWUgY29tcGlsZXIgb3IgdGhlIFN1biBqYXZhYykgdG8gY29tcGlsZSBhbGwgdGhlIC5qYXZhIGZpbGVzIGluIHRoZSBzcmMKLSAgICAgdHJlZS4gPC9saT4KLSAgICAgPGxpPlVzZSB0aGUgU3VuIGphciB1dGlsaXR5IHRvIHN0b3JlIHRoZSByZXN1bHRpbmcgLmNsYXNzIGZpbGVzIGluIHhhbGFuLmphcjwvbGk+Ci0gICAgIDwvdWw+Ci0gICA8L3MzPjxhbmNob3IgbmFtZT0ic2FtcGxlcyIvPgotICAgPHMzIHRpdGxlPSJSZWJ1aWxkaW5nIGEgc2FtcGxlIGFwcGxpY2F0aW9uIj4KLSAgIDxwPklmIHlvdSBtb2RpZnkgYSBzYW1wbGUgYW5kIHdhbnQgdG8gcmVjb21waWxlIGl0LCB5b3UgY2FuIHJ1biB0aGUgSmF2YSBjb21waWxlciBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlCi0gICBleGFtcGxlLiBCZSBzdXJlIHhhbGFuLmphciBhbmQgeGVyY2VzLmphciBhcmUgb24gdGhlIGNsYXNzcGF0aC4gVG8gcmVjb21waWxlIChhbmQgcnVuISkgdGhlIGNsYXNzIGZpbGVzIGluIHRoZQotICAgU2VydmxldCBzdWJkaXJlY3RvcnksIHRoZSBqYXZheC5zZXJ2bGV0IGFuZCBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZXMgbXVzdCBhbHNvIGJlIG9uIHRoZSBjbGFzc3BhdGguIFN1bgotICAgZGlzdHJpYnV0ZXMgdGhlc2UgcGFja2FnZXMgaW4gdGhlIEpTV0RLIDEuMC4xIHNlcnZsZXQuamFyIGZpbGUuPC9wPiAKLSAgIDxwPkFmdGVyIHJlY29tcGlsaW5nIGEgc2FtcGxlLCB5b3UgY2FuIHVzZSB0aGUgU3VuIGphciB1dGlsaXR5IHRvIHBsYWNlIHlvdXIgbmV3IC5jbGFzcyBmaWxlcyBpbgotICAgIHhhbGFuc2FtcGxlcy5qYXIuPC9wPgotICAgIDxwPllvdSBjYW4gdXNlIEFudCB3aXRoIHRoZSBzYW1wbGVzIHRhcmdldCB0byByZWNvbXBpbGUgdGhlIHNhbXBsZXMgYW5kIHBsYWNlIHRoZSB1bnBhY2thZ2VkIGNsYXNzIGZpbGVzIGluIHhhbGFuc2FtcGxlcy5qYXIuCi0gICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGxpbmsgYW5jaG9yPSJhbnQiPlVzaW5nIEFudDwvbGluaz4uPC9wPgotICAgIDxub3RlPlRvIHJlYnVpbGQgKGFuZCB0byBydW4pIHRoZSBzYW1wbGUgc2VydmxldCwgdGhlIGphdmF4LnNlcnZsZXQgYW5kIGphdmF4LnNlcnZsZXQuaHR0cCBwYWNrYWdlcyBtdXN0IGJlIG9uIHlvdXIKLSAgICBjbGFzc3BhdGguPC9ub3RlPgotICAgPC9zMz48YW5jaG9yIG5hbWU9ImRvYyIvPgotICAgPHMzIHRpdGxlPSJSZWJ1aWxkaW5nIHRoZSAmeHNsdDRqOyBkb2N1bWVudGF0aW9uIj4KLSAgICAgPHA+JnhzbHQ0ajsgaW5jbHVkZXMgYSBudW1iZXIgb2YgWE1MIHNvdXJjZSBmaWxlcywgWFNMIHN0eWxlc2hlZXRzLCBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkKLSAgICAgIGZpbGVzLCBlbnRpdHkgcmVsYXRpb25zaGlwIChFTlQpIGZpbGVzLCBncmFwaGljcywgYW5kIGEgSmF2YVNjcmlwdCBmaWxlIHRoYXQgcHJvdmlkZSB0aGUgaW5wdXQgZm9yIHRoZSBYYWxhbgotICAgICAgSFRNTCBVc2VyJ3MgR3VpZGUsIGFuZCB0aGUgb3ZlcnZpZXcgYW5kIHBhY2thZ2UtbGV2ZWwgZG9jdW1lbnRzIHVzZWQgZHVyaW5nIHRoZSBnZW5lcmF0aW9uIG9mIEphdmFkb2MuPC9wPgotICAgICAgPHA+VG8gcmVidWlsZCB0aGUgZG9jdW1lbnRhdGlvbiwgeW91IG11c3QgdXNlIHRoZSBTdHlsZUJvb2sgdG9vbCBhbmQgdGhlIEpESyAxLjIuMiBqYXZhIGFuZCBqYXZhZG9jCi0gICAgICB0b29scy4gU3R5bGVCb29rICh3aGljaCB1c2VzIFhhbGFuIGFuZCBYZXJjZXMpIGlzIGluIHN0eWxlYm9vay0xLjAtYjIuamFyLiBTb21lIG9mIHRoZSBkb2N1bWVudCBkZWZpbml0aW9uIGZpbGVzLAotICAgICAgc3R5bGVzaGVldHMsIGFuZCByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiB4bWwtc2l0ZS1zdHlsZS50YXIuZ3osIGFuZCBhcmUgdW56aXBwZWQgd2hlbiB5b3UgcnVuIEFudCBhcyBkZXNjcmliZWQKLSAgICAgICBiZWxvdy48L3A+Ci0gICAgICA8cD5Zb3UgY2FuIHVzZSBBbnQgd2l0aCB0aGUgZG9jcyB0YXJnZXQgdG8gcmVnZW5lcmF0ZSB0aGUgVXNlcidzIEd1aWRlIGFuZCB3aXRoIHRoZSBqYXZhZG9jcyB0YXJnZXQgdG8gcmVnZW5lcmF0ZSB0aGUKLSAgICAgIEphdmFkb2MgQVBJIGRvY3VtZW50YXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGxpbmsgYW5jaG9yPSJhbnQiPlVzaW5nIEFudDwvbGluaz4uPC9wPgotICAgICAgPHA+SWYgeW91IHdhbnQgdG8gcmVidWlsZCB0aGUgZG9jdW1lbnRhdGlvbiB3aXRob3V0IHVzaW5nIEFudCwga2VlcCB0aGUgZm9sbG93aW5nIGluIG1pbmQ6PC9wPgotICAgICAgIDx1bD4KLSAgICAgICA8bGk+VW56aXAgeG1sLXNpdGUtc3R5bGUudGFyLmd6IGludG8gdGhlIHhkb2NzIGRpcmVjdG9yeSAodGhlIG9wZXJhdGlvbiBwbGFjZXMgZmlsZXMgaW4gYSBudW1iZXIgb2Ygc3ViZGlyZWN0b3JpZXMpLgotICAgICAgIDxici8+PGJyLz48L2xpPgotICAgICAgIDxsaT5CZSBzdXJlIHN0eWxlYm9vay0xLjAtYjIuamFyLCB4YWxhbmpkb2MuamFyLCB4YWxhbi5qYXIsIGJzZi5qYXIsIGJzZmVuZ2luZXMuamFyLCBhbmQgeGVyY2VzLmphciBhcmUgb24gdGhlIGNsYXNzCi0gICAgICAgcGF0aC48YnIvPjxici8+PC9saT4KLSAgICAgICA8bGk+VG8gYnVpbGQgZG9jIGluIGEgYnVpbGQvZG9jcyBzdWJkaXJlY3RvcnksIHJ1biBTdHlsZUJvb2sgZnJvbSB0aGUgeGRvY3MgZGlyZWN0b3J5IGFzIGZvbGxvd3M6PGJyLz48YnIvPgotICAgICAgIDxjb2RlPmphdmEgb3JnLmFwYWNoZS5zdHlsZWJvb2suU3R5bGVCb29rICJ0YXJnZXREaXJlY3Rvcnk9Li4vYnVpbGQvZG9jcy8iIHNvdXJjZXMveGFsYW5Mb2NhbC54bWwgc3R5bGU8L2NvZGU+Ci0gICAgICAgPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgPGxpPlRvIGJ1aWxkIHRoZSBIVE1MIHNvdXJjZSBmaWxlcyB0aGF0IGphdmFkb2MgbmVlZHMgZm9yIHRoZSBUckFYIHRvcC1sZXZlbCBhbmQgcGFja2FnZS1sZXZlbCBkb2N1bWVudGF0aW9uLCBhZGQKLSAgICAgICBhIGJ1aWxkL2RvY3MvYXBkaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybSBkaXJlY3RvcnkgYW5kIHJ1biB0aGUgWGFsYW4gY29tbWFuZC1saW5lIHV0aWxpdHkgZnJvbSB0aGUgeGRvY3MgZGlyZWN0b3J5IAotICAgICAgIGFzIGZvbGxvd3MgKGFsbCBvbmUgbGluZSk6PGJyLz48YnIvPgotPGNvZGU+Ci1qYXZhIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIAotICAtaW4gc291cmNlcy90cmF4L3RyYXgueG1sCi0gIC1wYXJhbSBwYWNrYWdlLXJvb3QgJy4uLy4uLy4uL3NyYy8nCi0gIC14c2wgc3R5bGUvc3R5bGVzaGVldHMvc3BlYy54c2wgCi0gIC1vdXQgYnVpbGQvZG9jcy9hcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vdHJheC5odG1sPC9jb2RlPjxici8+PGJyLz48L2xpPgotICAgICAgICA8bGk+QmVmb3JlIHlvdSBydW4gamF2YWRvYywgbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSBleGlzdHMgdW5kZXIgdGhlIFhhbGFuIHJvb3QKLSAgICAgICAgIGRpcmVjdG9yeTogYnVpbGQvZG9jcy9hcGlkb2NzLjxici8+PGJyLz48L2xpPgotICAgICAgIDxsaT5UbyBidWlsZCB0aGUgQVBJIGRvY3VtZW50YXRpb24sIHJ1biB0aGUgSkRLIDEuMi4yIGphdmFkb2MgdG9vbCBmcm9tIHRoZSB4ZG9jcyBkaXJlY3RvcnkgKGFsbCBvbmUgbGluZSk6PGJyLz48YnIvPgotPGNvZGU+Ci1qYXZhZG9jIC1kb2NsZXQgeGFsYW5qZG9jLlN0YW5kYXJkIAotIC1kb2NsZXRwYXRoIC4uL2Jpbi94YWxhbmpkb2MuamFyIAotIC1wcml2YXRlCi0gLW92ZXJ2aWV3IC4uL3NyYy9qYXZhZG9jT3ZlcnZpZXcuaHRtbCAtc291cmNlcGF0aCAuLi9zcmMgCi0gLWdyb3VwIFRyQVggImphdmF4LnhtbC50cmFuc2Zvcm0qIiAKLSAtZ3JvdXAgWGFsYW5fQ29yZSAib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3I6Ci0gICAgICAgIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzOgotIG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIiCi0gLWdyb3VwIFhQYXRoICJvcmcuYXBhY2hlLnhwYXRoKiIKLSAtZ3JvdXAgVXRpbGl0aWVzICJvcmcuYXBhY2hlLnhtbC51dGlscyoiCi0gLWdyb3VwIFhhbGFuX090aGVyICJvcmcuYXBhY2hlLnhhbGFuLmNsaWVudDoKLSAgICAgICAgb3JnLmFwYWNoZS54YWxhbi5kdG06Ci0gb3JnLmFwYWNoZS54YWxhbi5leHRlbnNpb25zOm9yZy5hcGFjaGUueGFsYW4ucmVzOgotIG9yZy5hcGFjaGUueGFsYW4uc3RyZWU6b3JnLmFwYWNoZS54YWxhbi50cmFjZToKLSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQiIAotIC1ncm91cCBYYWxhbl9FeHRlbnNpb25zICJvcmcuYXBhY2hlLnhhbGFuLmxpYioiIAotIC1ncm91cCBTZXJpYWxpemVycyAib3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUiIAotIG9yZy5hcGFjaGUueGFsYW4uY2xpZW50IG9yZy5hcGFjaGUueGFsYW4uZHRtIAotIG9yZy5hcGFjaGUueGFsYW4uZXh0ZW5zaW9ucyBvcmcuYXBhY2hlLnhhbGFuLmxpYiAKLSBvcmcuYXBhY2hlLnhhbGFuLmxpYi5zcWwgb3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IgCi0gb3JnLmFwYWNoZS54YWxhbi5yZXMgb3JnLmFwYWNoZS54YWxhbi5zdHJlZSAKLSBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcyBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlIAotIG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIgb3JnLmFwYWNoZS54YWxhbi54c2x0IAotIG9yZy5hcGFjaGUueHBhdGggb3JnLmFwYWNoZS54cGF0aC5heGVzIAotIG9yZy5hcGFjaGUueHBhdGguY29tcGlsZXIgb3JnLmFwYWNoZS54cGF0aC5mdW5jdGlvbnMgCi0gb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzIG9yZy5hcGFjaGUueHBhdGgub3BlcmF0aW9ucyAKLSBvcmcuYXBhY2hlLnhwYXRoLnBhdHRlcm5zIG9yZy5hcGFjaGUueHBhdGgucmVzCi0gb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUgamF2YXgueG1sLnRyYW5zZm9ybSAgCi0gamF2YXgueG1sLnRyYW5zZm9ybS5kb20gamF2YXgueG1sLnRyYW5zZm9ybS5zYXggCi0gamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0gamF2YXgueG1sLnBhcnNlcnMKLSAtZCAuLi9idWlsZC9kb2NzL2FwaWRvY3MgLXdpbmRvd3RpdGxlICJYYWxhbi1KYXZhIDIiIAotIC1kb2N0aXRsZSAiWGFsYW4tSmF2YSAyIiAtYm90dG9tICJDb3B5cmlnaHQgJiMxNjk7IAotICAyMDAwIEFwYWNoZSBYTUwgUHJvamVjdC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iCi08L2NvZGU+PC9saT4KLTwvdWw+Ci0gIDwvczM+ICAgIAotIDwvczI+PGFuY2hvciBuYW1lPSJjb250YWN0Ii8+Ci0gPHMyIHRpdGxlPSJHZXR0aW5nIGluIFRvdWNoIj4KLSAgPHA+WW91ciBmZWVkYmFjayBpcyBtb3JlIHRoYW4gd2VsY29tZS4gT2ZmZXJzIG9mIGhlbHAgYXJlIGV2ZW4gbW9yZSBzbyEgUGVyaGFwcyB5b3Ugd291bGQgbGlrZSB0byB0YWtlIG9uIGFuIGFjdGl2ZSByb2xlIGluIHRoZSBvbmdvaW5nIGRldmVsb3BtZW50LCB0ZXN0aW5nLCBhbmQgZG9jdW1lbnRhdGlvbiBvZiAmeHNsdDRqOz88L3A+IAotPHA+UGxlYXNlIGVtYWlsIHlvdXIgY29tbWVudHMsIHF1ZXN0aW9ucywgc3VnZ2VzdGlvbnMsIGFuZCBvZmZlcnMgdG8gam9pbiB0aGUgWGFsYW4gdGVhbSB0byA8aHVtYW4tcmVzb3VyY2UtcmVmIGlkcmVmPSJ4YWxhbmRldiIvPi48L3A+Ci0gPC9zMj48YW5jaG9yIG5hbWU9Imhpc3RvcnkiLz4KLSA8czIgdGl0bGU9IkN1bXVsYXRpdmUgaGlzdG9yeSBvZiBzb2Z0d2FyZSBjaGFuZ2VzIj4KLSAgIDxwPlRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgbGlzdCB0aGUgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2Ugc2luY2UgJnhzbHQ0ajsgdmVyc2lvbiAyLjAuRDAxLjwvcD4KLSAgICZoaXN0b3J5LWo7Ci0gPC9zMj4KLTwvczE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94YWxhbi9yZXNvdXJjZXMueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi9yZXNvdXJjZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2ZhNWYyLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vcmVzb3VyY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVUy1BU0NJSSI/PgotPCFET0NUWVBFIHJlc291cmNlcyBbCi0gIDwhRU5USVRZICUgZXh0ZXJuYWxFbnRpdHkgU1lTVEVNICIuLi9lbnRpdGllcy5lbnQiPgotICAlZXh0ZXJuYWxFbnRpdHk7Ci0gIDwhRUxFTUVOVCByZXNvdXJjZXMgKHJlc291cmNlfGh1bWFuLXJlc291cmNlKSs+Ci0gIDwhRUxFTUVOVCByZXNvdXJjZSBFTVBUWT4KLSAgPCFBVFRMSVNUIHJlc291cmNlIAkJCi0gICAgICAgIGlkIENEQVRBICNJTVBMSUVECi0JCQkJdGl0bGUgQ0RBVEEgI0lNUExJRUQKLQkJCQlsb2NhdGlvbiBDREFUQSAjSU1QTElFRD4KLSAgPCFFTEVNRU5UIGh1bWFuLXJlc291cmNlIEVNUFRZPgotICA8IUFUVExJU1QgaHVtYW4tcmVzb3VyY2UgCQotICAgICAgICBpZCBDREFUQSAjSU1QTElFRAotCQkJCW5hbWUgQ0RBVEEgI0lNUExJRUQKLQkJCQltYWlsdG8gQ0RBVEEgI0lNUExJRUQ+Ci0gICBdPiAgCi08cmVzb3VyY2VzPiAJCi0gIDxyZXNvdXJjZSBpZD0ieHNsdDRqLWN1cnJlbnQiIAotICAgICAgICAgICAgdGl0bGU9IiZ4c2x0NGotY3VycmVudDsiIAotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbiIvPgotICA8cmVzb3VyY2UgaWQ9InhzbHQ0ai1kaXN0LXppcCIgCi0gICAgICAgICAgICB0aXRsZT0iJnhzbHQ0ai1kaXN0Oy56aXAiIAotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy9kaXN0L3hhbGFuLWovJnhzbHQ0ai1kaXN0Oy56aXAiLz4KLSAgPHJlc291cmNlIGlkPSJ4c2x0NGotZGlzdC10YXJneiIgCi0gICAgICAgICAgICB0aXRsZT0iJnhzbHQ0ai1kaXN0Oy50YXIuZ3oiIAotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy9kaXN0L3hhbGFuLWovJnhzbHQ0ai1kaXN0Oy50YXIuZ3oiLz4KLSAgPHJlc291cmNlIGlkPSJ4c2x0NGotZGlzdGRpciIgCi0gICAgICAgICAgICB0aXRsZT0ieGFsYW4taiBkaXN0cmlidXRpb24gZGlyZWN0b3J5IiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvZGlzdC94YWxhbi1qLyIvPgotICA8cmVzb3VyY2UgaWQ9InhtbDRqLXVzZWQiIAotICAgICAgICAgICAgdGl0bGU9IiZ4bWw0ai11c2VkOyIgCi0gICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hlcmNlcy1qL2luZGV4Lmh0bWwiLz4KLSAgPHJlc291cmNlIGlkPSJ4bWw0ai1kaXN0ZGlyIiAKLSAgICAgICAgICAgIHRpdGxlPSJ4ZXJjZXMtaiBkaXN0cmlidXRpb24gZGlyZWN0b3J5IiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvZGlzdC94ZXJjZXMtai8iLz4KLSAgPHJlc291cmNlIGlkPSJhbnQiIHRpdGxlPSJBbnQiIAotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYW50L2luZGV4Lmh0bWwiLz4KLSAgPHJlc291cmNlIGlkPSJBcGFjaGVMaWNlbnNlIiAKLSAgICAgICAgICAgIHRpdGxlPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xIiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvZGlzdC9MSUNFTlNFLnR4dCIvPgotICA8cmVzb3VyY2UgaWQ9ImJ1Z3ppbGxhIgotICAgICAgICAgICAgdGl0bGU9IkJ1Z3ppbGxhICh0aGUgQXBhY2hlIGJ1ZyBkYXRhYmFzZSkiCi0gICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL25hZ295YS5iZXRhdmVyc2lvbi5vcmcvYnVnemlsbGEvIi8+Ci0gIDxyZXNvdXJjZSBpZD0iYnVnbGlzdCIKLSAgICAgICAgICAgIHRpdGxlPSJYYWxhbkoyIG9wZW4gYnVncyIgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL25hZ295YS5hcGFjaGUub3JnL2J1Z3ppbGxhL2J1Z2xpc3QuY2dpP2J1Z19zdGF0dXM9TkVXJmFtcDtidWdfc3RhdHVzPUFTU0lHTkVEJmFtcDtidWdfc3RhdHVzPVJFT1BFTkVEJmFtcDtlbWFpbDE9JmFtcDtlbWFpbHR5cGUxPXN1YnN0cmluZyZhbXA7ZW1haWxhc3NpZ25lZF90bzE9MSZhbXA7ZW1haWwyPSZhbXA7ZW1haWx0eXBlMj1zdWJzdHJpbmcmYW1wO2VtYWlscmVwb3J0ZXIyPTEmYW1wO2J1Z2lkdHlwZT1pbmNsdWRlJmFtcDtidWdfaWQ9JmFtcDtjaGFuZ2VkaW49JmFtcDt2b3Rlcz0mYW1wO2NoZmllbGRmcm9tPSZhbXA7Y2hmaWVsZHRvPU5vdyZhbXA7Y2hmaWVsZHZhbHVlPSZhbXA7cHJvZHVjdD1YYWxhbkoyJmFtcDtzaG9ydF9kZXNjPSZhbXA7c2hvcnRfZGVzY190eXBlPXN1YnN0cmluZyZhbXA7bG9uZ19kZXNjPSZhbXA7bG9uZ19kZXNjX3R5cGU9c3Vic3RyaW5nJmFtcDtidWdfZmlsZV9sb2M9JmFtcDtidWdfZmlsZV9sb2NfdHlwZT1zdWJzdHJpbmcmYW1wO2tleXdvcmRzPSZhbXA7a2V5d29yZHNfdHlwZT1hbnl3b3JkcyZhbXA7ZmllbGQwLTAtMD1ub29wJmFtcDt0eXBlMC0wLTA9bm9vcCZhbXA7dmFsdWUwLTAtMD0mYW1wO2NtZHR5cGU9ZG9pdCZhbXA7b3JkZXI9JTI3SW1wb3J0YW5jZSUyNyIvPiAgICAgICAgICAgICAgICAgICAKLSAgPHJlc291cmNlIGlkPSJic2YiCi0gICAgICAgICAgICB0aXRsZT0iQmVhbiBTY3JpcHRpbmcgRnJhbWV3b3JrIChCU0YpIgotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9wcm9qZWN0cy9ic2YiLz4gICAgIAotCQotICA8cmVzb3VyY2UgaWQ9IlJlYWRtZSIgCi0gICAgICAgICAgICB0aXRsZT0iWGFsYW4gUmVwb3NpdG9yeSBSZWxlYXNlIE5vdGVzIiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvd2Vic3JjL2N2c3dlYi5jZ2kveG1sLXhhbGFuL1JFQURNRSIvPgotICAgICAgICAgICAgCi0gIDxyZXNvdXJjZSBpZD0ieHNsIiB0aXRsZT0iRXh0ZW5zaWJsZSBTdHlsZXNoZWV0IExhbmd1YWdlIChYU0wpIFZlcnNpb24gMS4wIFczQyBDYW5kaWRhdGUgUmVjb21tZW5kYXRpb24iCi0gICBsb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsIi8+Ci0KLSAgPHJlc291cmNlIGlkPSJkcGF3c29ueHNsZmFxIiB0aXRsZT0iWFNMIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIiBsb2NhdGlvbj0iaHR0cDovL3d3dy5kcGF3c29uLmNvLnVrL3hzbC94c2xmYXEuaHRtbCIvPgotICAKLSAgPHJlc291cmNlIGlkPSJ4c2x0IiAKLSAgICAgICAgICAgIHRpdGxlPSJXM0MgUmVjb21tZW5kYXRpb24gWFNMIFRyYW5zZm9ybWF0aW9ucyAoWFNMVCkgVmVyc2lvbiAxLjAiCi0gICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCIvPgotICAKLSAgPHJlc291cmNlIGlkPSJ4cGF0aCIgCi0gICAgICAgICAgICB0aXRsZT0iWE1MIFBhdGggTGFuZ3VhZ2UgKFhQYXRoKSBWZXJzaW9uIDEuMCIgCi0gICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgiLz4gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICA8cmVzb3VyY2UgaWQ9ImRvbSIgCi0gICAgICAgICAgICB0aXRsZT0iRE9NIiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy9ET00iLz4KLSAgPHJlc291cmNlIGlkPSJkb20yIiAKLSAgICAgICAgICAgIHRpdGxlPSJET00gbGV2ZWwgMiIgCi0gICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTIvIi8+Ci0KLSAgPHJlc291cmNlIGlkPSJzYXgiIAotICAgICAgICAgICAgdGl0bGU9IlNBWCIgCi0gICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9zYXguaHRtbCIvPgotICA8cmVzb3VyY2UgaWQ9InNheDIiIAotICAgICAgICAgICAgdGl0bGU9IlNBWCAyIiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vd3d3Lm1lZ2dpbnNvbi5jb20vU0FYL0phdmEvaW5kZXguaHRtbCIvPgotICA8cmVzb3VyY2UgaWQ9ImpheHAiIAotICAgICAgICAgICAgdGl0bGU9IkphdmEgQVBJIGZvciBYTUwgUGFyc2luZyAxLjAiIAotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2RvY3MvYXBpL2luZGV4Lmh0bWwiLz4KLSAgPHJlc291cmNlIGlkPSJqYXhwMTEiIAotICAgICAgICAgICAgdGl0bGU9IkphdmEgQVBJIGZvciBYTUwgUHJvY2Vzc2luZyAxLjEgUHVibGljIFJldmlldyAyIiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL2Fib3V0SmF2YS9jb21tdW5pdHlwcm9jZXNzL3Jldmlldy9qc3IwNjMvamF4cC1wZDIucGRmIi8+Ci0gIDxyZXNvdXJjZSBpZD0ianNyMDYzIgotICAgICAgICAgICAgdGl0bGU9IkphdmEgU3BlY2lmaWNhdGlvbiBSZXF1ZXN0IDYzIgotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20vYWJvdXRKYXZhL2NvbW11bml0eXByb2Nlc3MvcmV2aWV3L2pzcjA2MyIvPgotICA8cmVzb3VyY2UgaWQ9InRyYXgiIAotICAgICAgICAgICAgdGl0bGU9IlRSYVggKFRyYW5zZm9ybWF0aW9uIEFQSSBmb3IgWE1MKSIgCi0gICAgICAgICAgICBsb2NhdGlvbj0iYXBpZG9jcy9qYXZheC94bWwvdHJhbnNmb3JtL3RyYXguaHRtbCIvPgotICAgICAgICAgICAgCi0gIDxyZXNvdXJjZSBpZD0iY29tcGF0YXBpIgotICAgICAgICAgICAgdGl0bGU9IlhhbGFuLUphdmEgMSBjb21wYXRpYmlsaXR5IEphdmFkb2MiCi0gICAgICAgICAgICBsb2NhdGlvbj0iY29tcGF0X2FwaWRvY3MvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgCi0gIDxodW1hbi1yZXNvdXJjZSBpZD0ieGFsYW5kZXYiIAotICAgICAgICAgICAgICAgICAgbmFtZT0iWGFsYW4gRGV2ZWxvcG1lbnQgTWFpbGluZyBMaXN0IiAKLSAgICAgICAgICAgICAgICAgIG1haWx0bz0ieGFsYW4tZGV2QHhtbC5hcGFjaGUub3JnIi8+Ci08L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hhbGFuL3NhbXBsZXMueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi9zYW1wbGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE4YTEyYi4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hhbGFuL3NhbXBsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KLTwhRE9DVFlQRSBzMSBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9kb2N1bWVudC5kdGQiPgotPCEtLQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLTxzMSB0aXRsZT0iJnhzbHQ0ajI7IFNhbXBsZXMiPgotPHVsPgotPGxpPjxsaW5rIGFuY2hvcj0ic2ltcGxldHJhbnNmb3JtIj5TaW1wbGVUcmFuc2Zvcm08L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InVzZXN0eWxlc2hlZXRwaSI+VXNlU3R5bGVzaGVldFBJPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJ1c2VzdHlsZXNoZWV0cGFyYW0iPlVzZVN0eWxlc2hlZXRQYXJhbTwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0ic2F4MnNheCI+U0FYMlNBWDwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iZG9tMmRvbSI+RE9NMkRPTTwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0icGlwZSI+UGlwZTwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0idXNleG1sZmlsdGVycyI+VXNlWE1MRmlsdGVyczwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iYXBwbHl4cGF0aCI+QXBwbHlYUGF0aDwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iYXBwbGV0eG1sdG9odG1sIj5BcHBsZXRYTUx0b0hUTUw8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImdldC10b2RvLWxpc3QiPmdldC10b2RvLWxpc3Q8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InNlcnZsZXQiPnNlcnZsZXQ8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImV4dGVuc2lvbnMiPkV4dGVuc2lvbnM8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InRyYWNlIj5UcmFjZTwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0idHJheCI+dHJheDwvbGluaz48L2xpPgotPC91bD4gIAotCSAgPHMyIHRpdGxlPSJTYW1wbGVzIHRvIGhlbHAgeW91IGdldCBzdGFydGVkIj4KLSAgICA8cD5FYWNoIG9mIHRoZSBzdWJkaXJlY3RvcmllcyBpbiB0aGUgJnhzbHQ0ajsgamF2YS9zYW1wbGVzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgc291cmNlIGZpbGVzIGZvciBvbmUgb3IgbW9yZQotICAgICBzYW1wbGUgYXBwbGljYXRpb25zLiBUaGUgY2xhc3MgZmlsZXMgZm9yIHRoZSBzYW1wbGVzIGFyZSBpbiB4YWxhbnNhbXBsZXMuamFyIChldmVyeXRoaW5nIGV4Y2VwdCB0aGUgc2VydmxldCkgYW5kIHhhbGFuc2VydmxldC5qYXIsIHNvIHRvIHJ1biB0aGUgc2FtcGxlcywgeW91IHNob3VsZCBwbGFjZSB0aGVzZSBKQVIgZmlsZXMgb24gdGhlIHN5c3RlbSBjbGFzc3BhdGguPC9wPgotICAgICA8cD5XaXRoIG1vc3Qgb2YgdGhlIHNhbXBsZXMsIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlOjwvcD4KLSAgICAgPG9sPgotICAgICA8bGk+QmUgc3VyZSB4YWxhbi5qYXIsIHhhbGFuc2FtcGxlcy5qYXIsIGFuZCB4ZXJjZXMuamFyIGFyZSBvbiB0aGUgc3lzdGVtIGNsYXNzCi0gICAgICBwYXRoLiBGb3IgdGhlIGV4dGVuc2lvbiBleGFtcGxlcywgYnNmLmphciBhbmQgKGZvciB0aGUgSmF2YVNjcmlwdCBleHRlbnNpb25zKSBqcy5qYXIgbXVzdCBhbHNvIGJlIG9uIHRoZSBjbGFzcwotICAgICAgcGF0aC48L2xpPgotICAgICA8bGk+QmUgc3VyZSB0aGUgamF2YSBleGVjdXRhYmxlIGlzIG9uIHlvdXIgcGF0aC48L2xpPgotICAgICA8bGk+R28gdG8gdGhlIHNhbXBsZXMgc3ViZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNhbXBsZSAodXNlIHRoZSBET1Mgc2hlbGwgaWYgeW91IGFyZSBydW5uaW5nIFdpbmRvd3MpLjwvbGk+Ci0gICAgIDxsaT5SdW4gdGhlIHNhbXBsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGFzIGluZGljYXRlZCBiZWxvdykuPC9saT4KLSAgICA8bGk+RXhhbWluZSB0aGUgYXBwbGljYXRpb24gc291cmNlIGZpbGVzLiBZb3UgbWF5IGFsc28gd2FudCB0byBtb2RpZnkgdGhlIHNvdXJjZSBmaWxlcy4gUmVtZW1iZXIgdGhhdCBpZiB5b3UKLSAgICAgbW9kaWZ5IGEgamF2YSBmaWxlLCB5b3UgbXVzdCByZWNvbXBpbGUgdGhlIGNsYXNzIGFuZCBwbGFjZSBpdCBvbiB0aGUgY2xhc3NwYXRoIGJlZm9yZSB5b3UgY2FuIHJ1biB0aGUKLSAgICAgbW9kaWZpZWQgYXBwbGljYXRpb24uPC9saT4KLSAgICAgPC9vbD4gICAgICAKLSAgICA8cD5UaGUgYmFzaWMgY29tbWFuZCBsaW5lIGZvciBydW5uaW5nIG1vc3Qgb2YgdGhlIHNhbXBsZXMgaXMgPC9wPiAKLSAgICA8cD48Y29kZT5qYXZhIDxyZWY+Y2xhc3NuYW1lIGFyZ3M8L3JlZj48L2NvZGU+PC9wPgotICAgIDxwPndoZXJlIDxyZWY+Y2xhc3NuYW1lPC9yZWY+IGlzIHRoZSBzYW1wbGUgY2xhc3MgYW5kIDxyZWY+YXJnczwvcmVmPiBhcmUgdGhlIGFyZ3VtZW50cywgaWYgYW55LiBBcyBkZXNjcmliZWQgaW4KLSAgICAgdGhlIGZvbGxvd2luZyBzZWN0aW9ucywgc29tZSBzYW1wbGVzIHRha2Ugbm8gYXJndW1lbnRzLiBUaGUgVXNlU3R5bGVzaGVldFBhcmFtIHNhbXBsZSB0YWtlcyBhbgotICAgICBhZGRpdGlvbmFsIGFyZ3VtZW50LiBTZXZlcmFsIHNhbXBsZXMgaW4gZXh0ZW5zaW9ucyB1c2UgdGhlICZ4c2x0NGo7IAotICAgICA8bGluayBpZHJlZj0iY29tbWFuZGxpbmUiPmNvbW1hbmQtbGluZSB1dGlsaXR5PC9saW5rPiwgc28gdGhleSB0YWtlIGFyZ3VtZW50cyBmb3IgdGhlIFhNTCBzb3VyY2UKLSAgICAgZmlsZSBhbmQgdGhlIFhTTCBzdHlsZXNoZWV0LjwvcD4KLSAgCTwvczI+PGFuY2hvciBuYW1lPSJzaW1wbGV0cmFuc2Zvcm0iLz4KLSAgICA8czIgdGl0bGU9IlNpbXBsZVRyYW5zZm9ybSI+Ci0gICAgPHA+V2hhdCBpdCBkb2VzOiBUaGUgU2ltcGxlVHJhbnNmb3JtIGNsYXNzIHVzZXMgdGhlIGJpcmRzLnhzbCBzdHlsZXNoZWV0IHRvIHRyYW5zZm9ybSBiaXJkcy54bWwsIGFuZCBwcmludHMgdGhlCi0gICAgIG91dHB1dCB0byBiaXJkcy5vdXQuPC9wPgotICAgIDxwPllvdSBjYW4gcnVuIGl0IGZyb20gdGhlIFNpbXBsZVRyYW5zZm9ybSBzdWJkaXJlY3Rvcnkgd2l0aDwvcD4KLSAgICA8cD48Y29kZT5qYXZhIFNpbXBsZVRyYW5zZm9ybTwvY29kZT48L3A+Ci0gICAgPC9zMj48YW5jaG9yIG5hbWU9InVzZXN0eWxlc2hlZXRwaSIvPgotICAgIDxzMiB0aXRsZT0iVXNlU3R5bGVzaGVldFBJIj4KLSAgICA8cD5XaGF0IGl0IGRvZXM6IFRoZSBVc2VTdHlsZXNoZWV0UEkgY2xhc3MgdXNlcyB0aGUgc3R5bGVzaGVldCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGluIHRoZSBYTUwgc291cmNlIGRvY3VtZW50IHRvIGRldGVybWluZQotICAgICB3aGljaCBzdHlsZXNoZWV0IHRvIHVzZSB0byBwZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbi48L3A+Ci0gICAgIDxwPllvdSBjYW4gcnVuIGl0IGZyb20gdGhlIFVzZVN0eWxlc2hlZXRQSSBzdWJkaXJlY3Rvcnkgd2l0aDwvcD4KLSAgICAgPHA+PGNvZGU+amF2YSBVc2VTdHlsZXNoZWV0UEk8L2NvZGU+PC9wPgotICAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9ImVtYmVkIj5Xb3JraW5nIHdpdGggZW1iZWRkZWQgc3R5bGVzaGVldHM8L2xpbms+LjwvcD4KLSAgICA8L3MyPjxhbmNob3IgbmFtZT0idXNlc3R5bGVzaGVldHBhcmFtIi8+Ci0gICAgPHMyIHRpdGxlPSJVc2VTdHlsZXNoZWV0UGFyYW0iPgotICAgICAgPHA+V2hhdCBpdCBkb2VzOiBUaGUgVXNlU3R5bGVTaGVldFBhcmFtIGNsYXNzIHVzZXMgZm9vLnhzbCBhbmQgYSBzdHlsZXNoZWV0IHBhcmFtZXRlciB0byB0cmFuc2Zvcm0gZm9vLnhtbCwKLSAgICAgICBhbmQgcHJpbnRzIHRoZSBvdXRwdXQgdG8gU3lzdGVtLm91dC4gVGhlIHN0eWxlc2hlZXQgcGFyYW1ldGVyIGFwcGVhcnMgYXMgYSB0ZXh0IG5vZGUgaW4gdGhlIG91dHB1dC48L3A+Ci0gICAgPHA+UnVuIHRoaXMgc2FtcGxlIGZyb20gdGhlIFVzZVN0eWxlc2hlZXRQYXJhbSBzdWJkaXJlY3Rvcnkgd2l0aDwvcD4gCi0gICAgPHA+PGNvZGU+amF2YSBVc2VTdHlsZXNoZWV0UGFyYW0gPHJlZj5wYXJhbTwvcmVmPjwvY29kZT48L3A+Ci0gICAgPHA+d2hlcmUgPHJlZj5wYXJhbTwvcmVmPiBpcyB0aGUgc3R5bGVzaGVldCBwYXJhbWV0ZXIgdmFsdWUgKGEgc3RyaW5nIG9mIHlvdXIgY2hvaWNlKS48L3A+ICAKLSAgICA8L3MyPjxhbmNob3IgbmFtZT0ic2F4MnNheCIvPgotICA8czIgdGl0bGU9IlNBWDJTQVgiPgotICA8cD5XaGF0IGl0IGRvZXM6IEV4cGxpY2l0bHkgc2V0IHRoZSBTQVggWE1MUmVhZGVyIGFuZCBTQVggQ29udGVudEhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgdGhlIHN0eWxlc2hlZXQgKGJpcmRzLnhzbCksIHByb2Nlc3NpbmcgdGhlIFhNTCBpbnB1dCAoYmlyZHMueG1sKSwgYW5kIHByb2R1Y2luZyB0aGUgb3V0cHV0IChiaXJkcy5vdXQpLjwvcD4KLSAgPHA+UnVuIHRoaXMgc2FtcGxlIGZyb20gdGhlIFNBWDJTQVggc3ViZGlyZWN0b3J5IHdpdGg8L3A+Ci0gICA8cD48Y29kZT5qYXZhIFNBWDJTQVg8L2NvZGU+PC9wPgotICAgIDwvczI+PGFuY2hvciBuYW1lPSJkb20yZG9tIi8+Ci0gICAgPHMyIHRpdGxlPSJET00yRE9NIj4KLSAgICA8cD5XaGF0IGl0IGRvZXM6IHRoZSBET00yRE9NIGNsYXNzIHVzZXMgdGhlIGJpcmRzLnhzbCBzdHlsZXNoZWV0IHRvIHRyYW5zZm9ybSBhIERPTSBEb2N1bWVudCBnZW5lcmF0ZWQgZnJvbSBiaXJkcy54bWwsCi0gICAgIHByb2R1Y2VzIGFuIG91dHB1dCBET00sIGFuZCB0cmF2ZXJzZXMgdGhlIERPTSwgcHJpbnRpbmcgdGhlIHRyYXZlcnNhbCB0byBTeXN0ZW0ub3V0LiBJbiBjb250cmFzdCB0byBTaW1wbGVUcmFuc2Zvcm0sCi0gICAgICBET00yRE9NIGlsbHVzdHJhdGVzIHRoZSBwcm9jZWR1cmUgZm9yIHByb2Nlc3NpbmcgYW4gaW5wdXQgRE9NIGFuZCBjcmVhdGluZyBhbiBvdXRwdXQgRE9NIHRoYXQgaXMgYXZhaWxhYmxlIGZvcgotICAgICAgZnVydGhlciBwcm9jZXNzaW5nLjwvcD4KLSAgIDxwPllvdSBjYW4gcnVuIGl0IGZyb20gdGhlIERPTTJET00gc3ViZGlyZWN0b3J5IHdpdGg8L3A+Ci0gICAgPHA+PGNvZGU+amF2YSBET00yRE9NPC9jb2RlPjwvcD4KLSAgICA8L3MyPjxhbmNob3IgbmFtZT0icGlwZSIvPgotICAgIDxzMiB0aXRsZT0iUGlwZSI+Ci0gICAgPHA+V2hhdCBpdCBkb2VzOiBQaXBlcyB0aGUgb3V0cHV0IGZyb20gb25lIHRyYW5zZm9ybWF0aW9uIHRvIGEgc2Vjb25kIHRyYW5zZm9ybWF0aW9uLCB0aGVuIGZyb20gdGhlIHNlY29uZAotICAgIHRyYW5zZm9ybWF0aW9uIHRvIHRoZSB0aGlyZCB0cmFuc2Zvcm1hdGlvbi4gVHJhbnNmb3JtZXIxIGlzIHRoZSBDb250ZW50SGFuZGxlciBmb3IgdGhlIFhNTFJlYWRlciAod2hpY2ggcGFyc2VzIHRoZQotICAgIGlucHV0IGRvY3VtZW50KS4gVHJhbnNmb3JtZXIyIHByb3ZpZGVzIHRoZSBDb250ZW50SGFuZGxlciBmb3IgVHJhbnNmb3JtZXIxLCBhbmQgVHJhbnNmb3JtZXIzIGZvciBUcmFuc2Zvcm1lcjIuPC9wPgotICAgIDxub3RlPlBpcGUgYW5kIFVzZVhNTEZpbHRlcnMgaWxsdXN0cmF0ZSB0d28gc3RyYXRlZ2llcyBmb3IgdXNpbmcgdGhlIG91dHB1dCBvZiBvbmUgdHJhbnNmb3JtYXRpb24gYXMgdGhlIGlucHV0IGZvcgotICAgIGFub3RoZXIgdHJhbnNmb3JtYXRpb24uIFRoZSBQaXBlIHNhbXBsZSBpbmNvcnBvcmF0ZXMgYSAicHVzaCIgbW9kZWwgLS0gVHJhbnNmb3JtZXIxICJwdXNoZXMiIGl0cyBvdXRwdXQgdG8KLSAgICBUcmFuc2Zvcm1lcjIsIGFuZCBzbyBvbiAtLSB3aGVyZWFzIGluIHRoZSBVc2VYTUxGaWx0ZXJzIHNhbXBsZSwgVHJhbnNmb3JtZXIzICJwdWxscyIgaXRzIGlucHV0IGZyb20gVHJhbnNmb3JtZXIyLAotICAgIGFuZCBzbyBvbi48L25vdGU+Ci0gICAgPHA+UnVuIHRoaXMgc2FtcGxlIGZyb20gdGhlIFBpcGUgc3ViZGlyZWN0b3J5IHdpdGg8L3A+IAotICAgIDxwPjxjb2RlPmphdmEgUGlwZTwvY29kZT48L3A+Ci0gICAgPC9zMj48YW5jaG9yIG5hbWU9InVzZXhtbGZpbHRlcnMiLz4KLSAgICA8czIgdGl0bGU9IlVzZVhNTEZpbHRlcnMiPgotICAgIDxwPldoYXQgaXQgZG9lczogQ2hhaW5zIHRvZ2V0aGVyIHRoZSBzYW1lIHRyYW5zZm9ybWF0aW9ucyBhcyB0aGUgcHJlY2VkaW5nIFBpcGUgc2FtcGxlLiBVc2luZyBlYWNoIFRyYW5zZm9ybWVyCi0gICAgIG9iamVjdCBhcyBhbiBleHRlbnNpb24gb2YgdGhlIFNBWCBYTUxGaWx0ZXIgaW50ZXJmYWNlLCBzZXRzIHRoZSBYTUxSZWFkZXIgYXMgdGhlIHBhcmVudCBvZiBUcmFuc2Zvcm1lcjEsCi0gICAgIFRyYW5zZm9ybWVyMSBhcyB0aGUgcGFyZW50IG9mIFRyYW5zZm9ybWVyMiwgYW5kIFRyYW5zZm9ybWVyMiBhcyB0aGUgcGFyZW50IG9mIG9mIFRyYW5zZm9ybWVyMy48L3A+Ci0gICAgICA8cD5SdW4gdGhpcyBzYW1wbGUgZnJvbSB0aGUgVXNlWE1MRmlsdGVycyBzdWJkaXJlY3Rvcnkgd2l0aDwvcD4KLSAgIDxwPjxjb2RlPmphdmEgVXNlWE1MRmlsdGVyczwvY29kZT48L3A+Ci0gICAgPC9zMj48YW5jaG9yIG5hbWU9ImFwcGx5eHBhdGgiLz4KLSAgICA8czIgdGl0bGU9IkFwcGx5WFBhdGgiPgotICAgIDxwPldoYXQgaXQgZG9lczogQXBwbHlYUGF0aCB1c2VzIHRoZSA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveHBhdGgvWFBhdGhBUEkuaHRtbCI+WFBhdGhBUEk8L2p1bXA+IGNvbnZlbmllbmNlIG1ldGhvZHMgdG8KLSAgICBleGVjdXRlIGFuIFhQYXRoIGV4cHJlc3Npb24gYWdhaW5zdCBhbiBYTUwgZG9jdW1lbnQgYW5kIHJldHVybiB0aGUgbm9kZXMgKGlmIGFueSkgaXQgZmluZHMuPC9wPgotICAgICA8bm90ZT5Zb3UgY2FuIHVzZSB0aGlzIHNhbXBsZSBhcyBhbiBhaWQgd2hlbiB5b3Ugd2FudCB0byBmaW5kIG91dCB3aGF0IGEgZ2l2ZW4gWFBhdGggZXhwcmVzc2lvbiByZXR1cm5zIGZyb20gYQotICAgICBnaXZlbiBYTUwgZmlsZS4gS2VlcCBpbiBtaW5kIHRoYXQgdGhlIGNvbnRleHQgbm9kZSAoYmFzZSBwb2ludCBvZiBldmFsdWF0aW9uKSBmb3IgdGhlIFhQYXRoIGV4cHJlc3Npb24gaXMgdGhlIGRvY3VtZW50Ci0gICAgIHJvb3QuPC9ub3RlPgotICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBBcHBseVhQYXRoIHN1YmRpcmVjdG9yeSB3aXRoPC9wPiAKLSAgICA8cD48Y29kZT5qYXZhIEFwcGx5WFBhdGggPHJlZj5YTUxGaWxlIFhQYXRoRXhwcmVzc2lvbjwvcmVmPjwvY29kZT48L3A+Ci0gICAgPHA+d2hlcmUgPHJlZj5YTUxGaWxlPC9yZWY+IGlzIGFuIFhNTCBzb3VyY2UgZmlsZSBhbmQgPHJlZj5YUGF0aEV4cHJlc3Npb248L3JlZj4gaXMgYW4gWFBhdGggZXhwcmVzc2lvbiB0bwotICAgICBhcHBseSB0byB0aGF0IGZpbGUuIFRoZSBBcHBseVhQYXRoIHN1YmRpcmVjdG9yeSBjb250YWlucyBhbiBYTUwgZmlsZSBuYW1lZCBmb28ueG1sIC0tPGJyLz4KLSAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGNvZGU+Jmx0O2RvYyZndDsmbHQ7bmFtZSBmaXJzdD0iRGF2aWQiIGxhc3Q9Ik1hcnN0b24iLyZndDsuLi4mbHQ7L2RvYz48L2NvZGU+PGJyLz4gLS0gc28geW91IGNhbiB0cnkgY29tbWFuZAotICAgICBsaW5lcyBsaWtlPC9wPgotICAgIDxwPjxjb2RlPmphdmEgQXBwbHlYUGF0aCBmb28ueG1sIC88L2NvZGU+PC9wPgotICAgIDxwPmFuZDwvcD4KLSAgICA8cD48Y29kZT5qYXZhIEFwcGx5WFBhdGggZm9vLnhtbCAvZG9jL25hbWUvQGZpcnN0PC9jb2RlPjwvcD4KLSAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9InhwYXRoIj5Xb3JraW5nIHdpdGggWFBhdGggZXhwcmVzc2lvbnM8L2xpbms+LjwvcD4KLSAgICA8L3MyPjxhbmNob3IgbmFtZT0iYXBwbGV0eG1sdG9odG1sIi8+Ci0gICAgPHMyIHRpdGxlPSJBcHBsZXRYTUx0b0hUTUwiPgotICAgIDxwPlRoZSBhcHBsZXQgdXNlcyBhIHN0eWxlc2hlZXQgdG8gdHJhbnNmb3JtIGFuIFhNTCBkb2N1bWVudCBpbnRvIEhUTUwuIEl0IGRpc3BsYXlzIHRoZSBYTUwgZG9jdW1lbnQsIHRoZQotICAgICBzdHlsZXNoZWV0LCBhbmQgdGhlIEhUTUwgb3V0cHV0LjwvcD4KLSAgICA8cD5Ib3cgdG8gcnVuIGl0OiBPcGVuIGFwcGxldFhNTHRvSFRNTC5obXRsIGluIHRoZSBJbnRlcm5ldCBFeHBsb3JlciA1IGJyb3dzZXIuPC9wPgotICAgIDxub3RlPlRoaXMgYW5kIHRoZSBmb2xsb3dpbmcgc2FtcGxlIGFwcGxldCBkbyBub3Qgd29yayBpbiB0aGUgTmV0c2NhcGUgQ29tbXVuaWNhdG9yIDQuNy4gV2UgaGF2ZSBzb21lIHdvcmsgdG8gZG8gdG8gZ2V0Ci0gICAgb3VyIGJhc2ljIHN0cmF0ZWd5IG9mIHVzaW5nIHN5c3RlbSBwcm9wZXJ0aWVzIHRvIGlkZW50aWZ5IHRoZSBUcmFuc2Zvcm1lciBhbmQgWE1MIFBhcnNlciB0byB3b3JrIGluIHRoZSBOZXRzY2FwZSBhcHBsZXQKLSAgICBzYW5kYm94Ljxici8+PGJyLz4KLSAgICBCb3RoIGFwcGxldHMgbG9vayBmb3IgeGFsYW4uamFyIGFuZCB4ZXJjZXMuamFyIGluIHRoZSBiaW4gc3ViZGlyZWN0b3J5LiBJZiB5b3UgaGF2ZSBwbGFjZWQgdGhlc2UgSkFSIGZpbGVzCi0gICAgZWxzZXdoZXJlLCBhZGp1c3QgdGhlIGFwcGxldCBhcmNoaXZlIHNldHRpbmcgaW4gY2xpZW50Lmh0bWwgYW5kIGdldC10b2RvLWxpc3QuaHRtbCBhY2NvcmRpbmdseS48L25vdGU+Ci0gICAgPC9zMj48YW5jaG9yIG5hbWU9ImdldC10b2RvLWxpc3QiLz4KLSAgICA8czIgdGl0bGU9ImdldC10b2RvLWxpc3QiPgotICAgIDxwPlRoaXMgYXBwbGV0IHVzZXMgdG9kby54c2wgdG8gdHJhbnNmb3JtIHRvZG8ueG1sIGFuZCBkaXNwbGF5IHRoZSByZXN1bHQuIFRoZSBYTUwgc291cmNlICh0b2RvLnhtbCkgaXMgYSBzbmFwc2hvdCBvZiBhbgotICAgICBvbmdvaW5nIGxpc3Qgb2YgdGFza3MgYW5kIHRhc2sgY29tcGxldGlvbnMgZm9yIHRoZSAmeHNsdDRqMjsgcHJvamVjdCB0aGF0IGlzIG1haW50YWluZWQgaW4gdGhlIHhtbC14YWxhbi9qYXZhCi0gICAgIHN1YmRpcmVjdG9yeSBvZiB0aGUgQXBhY2hlIENWUyByZXBvc2l0b3J5LjwvcD4KLSAgICAgPHA+SG93IHRvIHJ1biBpdDogT3BlbiBnZXQtdG9kby1saXN0Lmh0bWwgaW4gdGhlIEludGVybmV0IEV4cGxvcmVyIDUgYnJvd3Nlci48L3A+Ci0gICAgPC9zMj48YW5jaG9yIG5hbWU9InNlcnZsZXQiLz4KLSAgICA8czIgdGl0bGU9InNlcnZsZXQiPgotICAgPHA+Rm9yIGEgZ2VuZXJhbCBpbnRyb2R1Y3Rpb24sIHNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJzZXJ2bGV0Ij5Vc2luZyAmeHNsdDRqOyBpbiBhIHNlcnZsZXQ8L2xpbms+LjwvcD4KLSAgICA8cD5UaGUgc2VydmxldCBzdWJkaXJlY3RvcnkgY29udGFpbnMgZm91ciBzYW1wbGUgc2VydmxldHMgdGhhdCB1c2UgJnhzbHQ0ajsgdG8gcGVyZm9ybSB0cmFuc2Zvcm1hdGlvbnMuIFRoZXNlIHNlcnZsZXRzIAotICAgIGFyZSBpbiBhIHBhY2thZ2UgbmFtZWQgc2VydmxldCBhbmQgYXJlIGNvbXBpbGVkIGluIHhhbGFuc2VydmxldC5qYXIuIFRvIHJ1biB0aGVzZSBzYW1wbGVzLCB5b3UgbXVzdCBwbGFjZSAKLSAgICB4YWxhbnNlcnZsZXQuamFyLCBhbmQgYW55IFhNTCBhbmQgWFNMIGZpbGVzIHlvdSB3YW50IHRvIHVzZSBvbiBhIHdlYiBzZXJ2ZXIgd2l0aCBhIHNlcnZsZXQgZW5naW5lLCBwbGFjZSAKLSAgICB4YWxhbnNlcnZsZXQuamFyLCB4YWxhbi5qYXIsIGFuZCB4ZXJjZXMuamFyIG9uIHRoZSBzZXJ2bGV0IGVuZ2luZSBjbGFzcyBwYXRoLCBhbmQgY29uZmlndXJlIHRoZSBzZXJ2bGV0IGVuZ2luZSB0bwotICAgIGxvY2F0ZSB0aGUgWE1MIGFuZCBYU0wgZmlsZXMsIGFuZCB0aGUgcHJvcGVydGllcyBmaWxlIHVzZWQgYnkgQXBwbHlYU0wuPC9wPgotICAgIDxwPjxsaW5rIGFuY2hvcj0ic2ltcGxleHNsdHNlcnZsZXQiPnNlcnZsZXQuU2ltcGxlWFNMVFNlcnZsZXQ8L2xpbms+IGFwcGxpZXMgYSBwYXJ0aWN1bGFyIHN0eWxlc2hlZXQgdG8gYSBwYXJ0aWN1bGFyIAotICAgIFhNTCBkb2N1bWVudC48L3A+IAotICAgIDxwPjxsaW5rIGFuY2hvcj0idXNlc3R5bGVzaGVldHBhcmFtc2VydmxldCI+c2VydmxldC5Vc2VTdHlsZXNoZWV0UGFyYW1TZXJ2bGV0PC9saW5rPiBzZXRzIGEgc3R5bGVzaGVldCBwYXJhbWV0ZXIgCi0gICAgKHRoZSBwYXJhbWV0ZXIgbmFtZSBpcyBoYXJkd2lyZWQgaW50byB0aGUgc2VydmxldCksIGFuZCByZXF1aXJlcyB0aGUgdXNlciB0byBzdXBwbHkgcGFyYW1ldGVycyBmb3IgdGhlIAotICAgIFhNTCBkb2N1bWVudCBhbmQgWFNMIHN0eWxlc2hlZXQuPC9wPgotICAgIDxwPjxsaW5rIGFuY2hvcj0ieHNsdHNlcnZsZXR3aXRocGFyYW1zIj5zZXJ2bGV0LlhTTFRTZXJ2bGV0V2l0aFBhcmFtczwvbGluaz4gYWNjZXB0cyBwYXJhbWV0ZXJzIGZvciB0aGUgWE1MIGRvY3VtZW50LCAKLSAgICB0aGUgWFNMIHN0eWxlc2hlZXQsIGFuZCBhbnkgbnVtYmVyIG9mIHN0eWxlc2hlZXQgcGFyYW1ldGVycy48L3A+Ci0gICAgPHA+PGxpbmsgYW5jaG9yPSJhcHBseXhzbHQiPnNlcnZsZXQuQXBwbHlYU0xUPC9saW5rPiAoYW5kIGFzc29jaWF0ZWQgY2xhc3NlcykgaXMgY2xvc2VyIHRvIGEgcHJvZHVjdGlvbiBsZXZlbCBzZXJ2bGV0LiBJdCBhY2NlcHRzIHBhcmFtZXRlcnMsIHByb3ZpZGVzIGEgCi0gICAgbGlzdGVuZXIgZm9yIGNhcHR1cmluZyBhbmQgcmVwb3J0aW5nIGRlYnVnZ2VyIG1lc3NhZ2VzLCBhbmQgc3VwcG9ydHMgIHVzZSBvZiBhIHByb3BlcnR5IGZpbGUgdG8gZGV0ZXJtaW5lIHdoaWNoIAotICAgIHN0eWxlc2hlZXQgdG8gYXBwbHkgYmFzZWQgb24gdGhlIGlkZW50aXR5IG9mIHRoZSBjbGllbnQgYnJvd3Nlci9kZXZpY2UuPC9wPgotICAgIDxhbmNob3IgbmFtZT0ic2ltcGxleHNsdHNlcnZsZXQiLz4KLSAgICA8czMgdGl0bGU9InNlcnZsZXQuU2ltcGxlWFNMVFNlcnZsZXQiPgotICAgIDxwPldoYXQgaXQgZG9lczogc2VydmxldC5TaW1wbGVYU0xUU2VydmxldCBhcHBsaWVzIHRoZSB0b2RvLnhzbCBzdHlsZXNoZWV0IHRvIHRvZG8ueG1sIGFuZCByZXR1cm5zIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQgdG8gdGhlCi0gICAgSFRUUCBjbGllbnQuPC9wPgotICAgIDxwPlRvIHJ1biB0aGlzIHNlcnZsZXQ6IHBsYWNlIHRvZG8ueHNsIGFuZCB0b2RvLnhtbCAoZnJvbSB0aGUgZGlzdHJpYnV0aW9uIHJvb3QgZGlyZWN0b3J5KSBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdXIgc2VydmxldCBlbmdpbmUKLSAgICBsb29rcyBmb3IgSFRUUCBkb2N1bWVudHMsIHBsYWNlIHhhbGFuc2VydmxldC5qYXIgb24gdGhlIHNlcnZsZXQgZW5naW5lIGNsYXNzcGF0aCwgYW5kIHNldCB1cCBhbiBIVE1MIHBhZ2UgdG8gY2FsbCB0aGUgc2VydmxldCBhcwotICAgIGZvbGxvd3M6PC9wPgotPGdsb3NzPjxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXRob21lL3NlcnZsZXQuU2ltcGxlWFNMVFNlcnZsZXQ8L2xhYmVsPjwvZ2xvc3M+Ci0gICAgIDwvczM+PGFuY2hvciBuYW1lPSJ1c2VzdHlsZXNoZWV0cGFyYW1zZXJ2bGV0Ii8+Ci0gICAgIDxzMyB0aXRsZT0ic2VydmxldC5Vc2VTdHlsZXNoZWV0UGFyYW1TZXJ2bGV0Ij4KLSAgICAgPG5vdGU+UGF1bCBDYW1wYmVsbCAmbHQ7c2VhcHdjQGhhbGN5b24uY29tJmd0OyB3cm90ZSB0aGlzIHNlcnZsZXQgYW5kIHRoZSBmb2xsb3dpbmcgZXhwbGFuYXRvcnkgdGV4dC4KLSAgICAgVGhhbmsgeW91LCBQYXVsITwvbm90ZT4KLSAgICAgPHA+V2hhdCBpdCBkb2VzOiBUaGUgY2xpZW50IChwZXJoYXBzIGFuIEhUTUwgZm9ybSApIHNwZWNpZmllcyBhbiBYTUwgZG9jdW1lbnQsIGEgc3R5bGVzaGVldCwgYW5kIGEgdmFsdWUgdG8gYmUgcGFzc2VkCi0gICAgICB0byB0aGUgc3R5bGVzaGVldCBmb3IgYSBzdHlsZXNoZWV0IHBhcmFtZXRlciBuYW1lZCAicGFyYW0xIi4gVGhlIHNlcnZsZXQgcGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9uIGFuZCByZXR1cm5zCi0gICAgICB0aGUgb3V0cHV0IHRvIHRoZSBjbGllbnQuIFRoZSBjbGllbnQgbXVzdCBzcGVjaWZ5IHdoaWNoIHN0eWxlc2hlZXQgKGNvbnRhaW5pbmcgYSAicGFyYW0xIiBzdHlsZXNoZWV0IHBhcmFtZXRlciIpIAotICAgICAgYW5kIFhNTCBmaWxlIGFyZSB0byBiZSB1c2VkLjwvcD4KLSAgICAgPHA+SG93IHRvIHJ1biBpdDogQ29uZmlndXJlIHlvdXIgYXBwbGljYXRpb24gc2VydmVyIChUb21jYXQsIFdlYnNwaGVyZSBvciBKU2VydiwgZm9yIGV4YW1wbGUpCi0gICAgIHNvIGl0IGNhbiBmaW5kIHNlcnZsZXQuVXNlU3R5bGVzaGVldFBhcmFtU2VydmxldCAoaW4geGFsYW5zZXJ2bGV0LmphcikgYXMgd2VsbCBhcyB0aGUgWE1MIGRvY3VtZW50IAotICAgICBhbmQgWFNMIHN0eWxlc2hlZXQuIEZvciBleGFtcGxlLCB5b3UgY2FuIGNvcHkgZm9vcGFyYW0ueG1sIGFuZCBmb29wYXJhbS54c2wgZnJvbSBzYW1wbGVzL3NlcnZsZXQgdG8gdGhlIGFwcGxpY2F0aW9uIAotICAgICBzZXJ2ZXIgcm9vdCBkaXJlY3RvcnkgZm9yIGRvY3VtZW50cy48L3A+Ci0gICAgIDxwPlRoZW4geW91IGNhbiBzZXQgdXAgYW4gSFRNTCBjbGllbnQgdG8gY2FsbCB0aGUgc2VydmxldCB3aXRoIGFyZ3VtZW50cyBhbG9uZyB0aGUgbGluZXMgb2Y8L3A+Ci0gICAgPGdsb3NzPjxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXRob21lL3NlcnZsZXQuVXNlU3R5bGVzaGVldFBhcmFtU2VydmxldD8KLSAgICBYTUw9Zm9vcGFyYW0ueG1sJmFtcDtYU0w9Zm9vcGFyYW0ueHNsJmFtcDtQVkFMPUdvb2RCeWU8L2xhYmVsPjwvZ2xvc3M+Ci0gICAgIDxwPkluIHRoZSBkb0dldCgpIG1ldGhvZCwgdGhlIHNlcnZsZXQgb2J0YWlucyB0aGUgUFZBTCB2YWx1ZSAiR29vZEJ5ZSIpIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdCBhbmQgcGFzc2VzIGl0IHRvIHRoZSAKLSAgICAgc3R5bGVzaGVldCBhcyB0aGUgcGFyYW1WYWx1ZSBhcmd1bWVudCBpbiBhIFRyYW5zZm9ybWVyIHNldFBhcmFtZXRlcigpIGNhbGw6PC9wPgotICAgICAgPHA+PGNvZGU+U3RyaW5nIHBhcmFtVmFsdWUgPSBodHRwU2VydmxldFJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJQVkFMIik7PC9jb2RlPjxici8+Ci0gICAgICA8Y29kZT4uLi48L2NvZGU+PGJyLz4KLSAgICAgPGNvZGU+dHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKCJwYXJhbTEiLCBwYXJhbVZhbHVlKTs8L2NvZGU+PC9wPgotIDxwPlRoZSByZXN1bHQgaXMgcmV0dXJuZWQgdG8gdGhlIGNsaWVudDo8L3A+Ci08cD48Y29kZT4mbHQ7aHRtbCZndDsmbHQ7Ym9keSZndDsmbHQ7cCZndDtHb29kQnllJmx0Oy9wJmd0OyZsdDsvYm9keSZndDsmbHQ7L2h0bWwmZ3Q7PC9jb2RlPjwvcD4KLSAgICAgPC9zMz48YW5jaG9yIG5hbWU9InhzbHRzZXJ2bGV0d2l0aHBhcmFtcyIvPgotICAgICA8czMgdGl0bGU9InNlcnZsZXQuWFNMVFNlcnZsZXRXaXRoUGFyYW1zIj4KLSAgICAgPHA+V2hhdCBpdCBkb2VzOiBzZXJ2bGV0LlhTTFRTZXJ2bGV0V2l0aFBhcmFtcyB0YWtlcyBwYXJhbWV0ZXJzIGluIHRoZSByZXF1ZXN0IC0tIGEgVVJMIHBhcmFtZXRlciBmb3IKLSAgICAgdGhlIFhNTCBpbnB1dCBkb2N1bWVudCBVUkwgYW5kIGFuIHhzbFVSTCBwYXJhbWV0ZXIgZm9yIHRoZSBzdHlsZXNoZWV0IFVSTC48L3A+Ci0gICAgIDxwPlRvIHVzZSBYU0xUU2VydmxldFdpdGhQYXJhbXMgdG8gcGVyZm9ybSB0aGUgc2FtZSB0cmFuc2Zvcm1hdGlvbiBhcyBTaW1wbGVzdFNlcnZsZXQ6IAotICAgICBwbGFjZSB0b2RvLnhzbCBhbmQgdG9kby54bWwgaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3VyIHNlcnZsZXQgZW5naW5lIGxvb2tzIGZvciBIVFRQIGRvY3VtZW50cywgcGxhY2UKLSAgICAgeGFsYW5zZXJ2bGV0LmphciBvbiB0aGUgc2VydmxldCBlbmdpbmUgY2xhc3NwYXRoLCBhbmQgc2V0IHVwIGFuIEhUTUwgcGFnZSB0byBjYWxsIHRoZSBzZXJ2bGV0IGFzIGZvbGxvd3M6PC9wPgotPGdsb3NzPjxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXRob21lL3NlcnZsZXQuWFNMVFNlcnZsZXRXaXRoUGFyYW1zP1VSTD1maWxlOnRvZG8ueG1sJmFtcDsKLXhzbFVSTD1maWxlOnRvZG8ueHNsPC9sYWJlbD48L2dsb3NzPgotICAgICA8cD5JZiB0aGUgWE1MIGRvY3VtZW50IGNvbnRhaW5zIGFuIGFzc29jaWF0ZWQgc3R5bGVzaGVldCAoYSBzdHlsZXNoZWV0IFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24pIHRoYXQgeW91IHdhbnQgdG8gdXNlLCBzaW1wbHkgb21pdCB0aGUKLSAgICAgeHNsVVJMIHBhcmFtZXRlci48L3A+Ci0gICAgIDxwPklmIHRoZSBzdHlsZXNoZWV0IHRha2VzIHN0eWxlc2hlZXQgcGFyYW1ldGVycywgeW91IGNhbiBpbmNsdWRlIHRoZW0gaW4gdGhlIFVSTC4gRm9yIGV4YW1wbGUgdG8gc2V0IHNldCB0aGUgcGFyYW0xCi0gICAgIHN0eWxlc2hlZXQgcGFyYW1ldGVyIHRvIGZvbywgaW5jbHVkZSBwYXJhbTE9Zm9vIGluIHRoZSBVUkwuPC9wPgotICAgICA8L3MzPjxhbmNob3IgbmFtZT0iYXBwbHl4c2x0Ii8+Ci0gICAgIDxzMyB0aXRsZT0ic2VydmxldC5BcHBseVhTTFQiPgotICAgIDxwPldoYXQgaXQgZG9lczogVGhlIGNsaWVudCAod2hpY2ggeW91IG11c3Qgc2V0IHVwKSBzcGVjaWZpZXMgYW4gWE1MIGRvY3VtZW50IGFuZCBhIHN0eWxlc2hlZXQuIFRoZSBzZXJ2bGV0Ci0gICAgIHBlcmZvcm1zIHRoZSB0cmFuc2Zvcm1hdGlvbiBhbmQgcmV0dXJucyB0aGUgb3V0cHV0IHRvIHRoZSBjbGllbnQuIFlvdSBjYW4gdXNlIG1lZGlhLnByb3BlcnRpZXMgdG8gc3BlY2lmeSAKLSAgICB3aGljaCBzdHlsZXNoZWV0IGlzIHRvIGJlIHVzZWQgZGVwZW5kaW5nIG9uIHRoZSBjbGllbnQgYnJvd3Nlci9kZXZpY2UuPC9wPgotICAgIDxub3RlPlRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoaXMgc2VydmxldCBpbmNsdWRlIEFwcGx5WFNMVC5qYXZhLCBBcHBseVhTTFRQcm9wZXJ0aWVzLmphdmEsIERlZmF1bHRBcHBseVhTTFRQcm9wZXJ0aWVzLmphdmEsCi0gICAgQXBwbHlYU0xUTGlzdGVuZXIuamF2YSwgYW5kIEFwcGx5WFNMVEV4Y2VwdGlvbi5qYXZhLjwvbm90ZT4KLSAgICA8cD5UbyBydW4gdGhlIHNlcnZsZXQ6IHB1dCB4YWxhbnNlcnZsZXQuamFyIG9uIHRoZSBzZXJ2bGV0IGVuZ2luZSBjbGFzc3BhdGgsIGNvbmZpZ3VyZSB5b3VyIHNlcnZsZXQgZW5naW5lIHNvIGl0IGNhbiBmaW5kIHRoZSAKLSAgICAgc3R5bGVzaGVldHMgYW5kIHByb3BlcnRpZXMgZmlsZSBpbiB0aGUgc2VydmxldCBzdWJkaXJlY3RvcnkgKGFuZCBpbiB4YWxhbnNlcnZsZXQuamFyKSwgYW5kIHNldCB1cCBhbiBIVE1MIHBhZ2UgdG8gY2FsbAotICAgICBzZXJ2bGV0LkFwcGx5WFNMVCB3aXRoIGFyZ3VtZW50cyBhcyBpbGx1c3RyYXRlZCBiZWxvdy48L3A+Ci0gICAgIDxwPkV4YW1wbGVzOjwvcD4KLTxnbG9zcz4KLTxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXRob21lL3NlcnZsZXQuQXBwbHlYU0xUP1VSTD0vZGF0YS54bWwmYW1wO3hzbFVSTD0KLS9zdHlsZS54c2w8L2xhYmVsPgotPGl0ZW0+Li4uYXBwbGllcyB0aGUgc3R5bGUueHNsIHN0eWxlc2hlZXQgdG8gdGhlIGRhdGEueG1sIGRhdGEuIEJvdGggZmlsZXMgYXJlPGJyLz4KLXNlcnZlZCBmcm9tIHRoZSBXZWIgc2VydmVyJ3MgSFRUUCBkb2N1bWVudCByb290Ljxici8+PGJyLz48L2l0ZW0+Ci08bGFiZWw+aHR0cDovL2xvY2FsaG9zdC9zZXJ2bGV0aG9tZS9zZXJ2bGV0LkFwcGx5WFNMVD9VUkw9L2RhdGEueG1sJmFtcDt4c2xVUkw9Ci0vc3R5bGUueHNsJmFtcDtkZWJ1Zz10cnVlPC9sYWJlbD4KLTxpdGVtPi4uLmVuc3VyZXMgdGhhdCBYTUwgYW5kIFhTTCBwcm9jZXNzb3IgbWVzc2FnZXMgYXJlIHJldHVybmVkIGluIHRoZSBldmVudCBvZiBwcm9ibGVtcwotYXBwbHlpbmcgc3R5bGUueHNsIHRvIGRhdGEueG1sPGJyLz48YnIvPjwvaXRlbT4KLTxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXRob21lL3NlcnZsZXQuQXBwbHlYU0xUL2RhdGEueG1sP3hzbFVSTD0vc3R5bGUueHNsPC9sYWJlbD4KLTxpdGVtPi4uLmFwcGxpZXMgdGhlIHN0eWxlLnhzbCBzdHlsZXNoZWV0IHRvIHRoZSBkYXRhLnhtbCBkYXRhLCBqdXN0IGxpa2UgdGhlIGZpcnN0IGV4YW1wbGUuCi1UaGlzIGlzIGFuIGFsdGVybmF0aXZlIHdheSBvZiBzcGVjaWZ5aW5nIHRoZSBYTUwgWFNMVElucHV0U291cmNlIGJ5IHV0aWxpemluZyB0aGUgSFRUUCByZXF1ZXN0J3MgcGF0aAotaW5mb3JtYXRpb24uPGJyLz48YnIvPjwvaXRlbT4KLTxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXRob21lL3NlcnZsZXQuQXBwbHlYU0xUL2RhdGEueG1sPC9sYWJlbD4KLTxpdGVtPi4uLmV4YW1pbmVzIGRhdGEueG1sIGZvciBhbiBhc3NvY2lhdGVkIFhTTCBzdHlsZXNoZWV0IChhIHN0eWxlc2hlZXQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbikuIElmIG11bHRpcGxlIFhTTHMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSwgdGhlIHN0eWxlc2hlZXQgd2hvc2UgbWVkaWEgYXR0cmlidXRlIG1hcHMgdG8geW91ciBicm93c2VyIHR5cGUgd2lsbCBiZSBjaG9zZW4uICBJZiBubyBtYXBwaW5nIGlzIHN1Y2Nlc3NmdWwsIHRoZSBwcmltYXJ5IGFzc29jaWF0ZWQgc3R5bGVzaGVldCBpcyB1c2VkLjxici8+PGJyLz48L2l0ZW0+Ci08bGFiZWw+aHR0cDovL2xvY2FsaG9zdC9zZXJ2bGV0L2RhdGEueG1sPC9sYWJlbD4KLTxpdGVtPi4uLnByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZSBwcmV2aW91cyBleGFtcGxlLCBidXQgdGhpcyBleGFtcGxlIGFzc3VtZXMKLXRoYXQgL3NlcnZsZXQvZGF0YS54bWwgaGFzIGJlZW4gbWFwcGVkIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoaXMgc2VydmxldC4gIFRoZSBzZXJ2bGV0IGVuZ2luZSBtYXkgYmUgY29uZmlndXJlZAotdG8gbWFwIGFsbCBvciBzb21lICoueG1sIGZpbGVzIHRvIHRoaXMgc2VydmxldCB0aHJvdWdoIHRoZSB1c2Ugb2Ygc2VydmxldCBhbGlhc2VzIG9yIGZpbHRlcnMuPGJyLz48YnIvPjwvaXRlbT4KLTxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXQvZGF0YS54bWw/Y2F0YWxvZz1odHRwOi8vd3d3LnhtbC5vcmcvZHRkcy9vYWcueG1sPC9sYWJlbD4KLTxpdGVtPi4uLnN1cHBsZW1lbnRzIGFueSBzZXJ2bGV0LWNvbmZpZ3VyZWQgWENhdGFsb2cKLXdpdGggYSBjYXRhbG9nIG9mIHN1cHBseSBjaGFpbiBEVERzIHJlc2lkaW5nIGF0IHRoZSBYTUwuT1JHIERURCByZXBvc2l0b3J5LjwvaXRlbT4KLTwvZ2xvc3M+ICAgICAKLSAgIDwvczM+Ci0gICAgIDwvczI+PGFuY2hvciBuYW1lPSJleHRlbnNpb25zIi8+Ci0gICAgPHMyIHRpdGxlPSJFeHRlbnNpb25zIj4KLSAgICA8cD5Gb3IgYW4gaW50cm9kdWN0aW9uIHRvIHRoZSBjcmVhdGlvbiBhbmQgdXNlIG9mIGV4dGVuc2lvbiBlbGVtZW50cyBhbmQgZXh0ZW5zaW9uIGZ1bmN0aW9ucywgYW5kCi0gICAgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleHRlbnNpb25zIGxpYnJhcnkgZGlzdHJpYnV0ZWQgd2l0aCAmeHNsdDRqOywgc2VlCi0gICAgPGxpbmsgaWRyZWY9ImV4dGVuc2lvbnMiPkV4dGVuc2lvbnM8L2xpbms+LjwvcD4KLSAgICA8dWw+Ci0gICAgICA8bGk+PGxpbmsgYW5jaG9yPSJleHQxIj4xLXJlZGlyPC9saW5rPjwvbGk+Ci0gICAgICA8bGk+PGxpbmsgYW5jaG9yPSJleHQyIj4yLWJhc2ljSnNjcmlwdDwvbGluaz48L2xpPgotICAgICAgPGxpPjxsaW5rIGFuY2hvcj0iZXh0MyI+My1qYXZhLW5hbWVzcGFjZTwvbGluaz48L2xpPgotICAgICAgPGxpPjxsaW5rIGFuY2hvcj0iZXh0NCI+NC1udW1saXN0SmF2YTwvbGluaz48L2xpPgotICAgICAgPGxpPjxsaW5rIGFuY2hvcj0iZXh0NSI+NS1udW1saXN0SlNjcmlwdDwvbGluaz48L2xpPgotICAgICAgPGxpPjxsaW5rIGFuY2hvcj0iZXh0NiI+Ni1zcWxsaWItaW5zdGFudGRiPC9saW5rPjwvbGk+Ci0gICAgPC91bD4KLSAgICA8cD5UaGUgZXh0ZW5zaW9ucyBzdWJkaXJlY3RvcnkgY29udGFpbnMgc2l4IHNhbXBsZXMgd2l0aCAmeHNsdDRqOyBleHRlbnNpb25zLiBUd28gb2YgdGhlIHNhbXBsZXMgdXNlCi0gICAgIGV4dGVuc2lvbnMgaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCwgYW5kIGZvdXIgb2YgdGhlIHNhbXBsZXMgdXNlIGV4dGVuc2lvbnMgaW1wbGVtZW50ZWQgaW4gSmF2YS48L3A+Ci0gICAgIDxwPlRvIHJ1biB0aGVzZSBleGFtcGxlcywgeW91IG11c3QgcGxhY2UgYnNmLmphciAoZGlzdHJpYnV0ZWQgd2l0aCAmeHNsdDRqOyksIGFuZCBqcy5qYXIKLSAgICAgICh2ZXJzaW9uIDEuNSwgYXZhaWxhYmxlIGZyb20gCi0gICAgICA8anVtcCBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL3JoaW5vIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL3JoaW5vPC9qdW1wPikgb24gdGhlIGNsYXNzcGF0aC4gCi0gICAgIFlvdSBkbyBub3QgbmVlZCBqcy5qYXIgb24gdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHNhbXBsZXMgdGhhdCB1c2UgSmF2YSBleHRlbnNpb25zLiA8L3A+Ci0gICAgIDxwPlVzZSBqYXZhLm9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzLCB0aGUgJnhzbHQ0ajsgY29tbWFuZC1saW5lIHV0aWxpdHksIHRvIHJ1biBtb3N0IG9mIHRoZXNlIHNhbXBsZXMgZnJvbQotICAgICAgdGhlIDxsaW5rIGlkcmVmPSJjb21tYW5kbGluZSI+Y29tbWFuZCBsaW5lPC9saW5rPi4gVGhlIGNvbW1hbmQgbGluZSBtdXN0IGluY2x1ZGUgYW4gLWluIGZsYWcgd2l0aCB0aGUgCi0gICAgICBYTUwgc291cmNlIGFuZCBhbiAteHNsIGZsYWcgd2l0aCB0aGUgWFNMIHN0eWxlc2hlZXQuIElmIHlvdSB3YW50IHRoZSBvdXRwdXQgdG8gYmUgd3JpdHRlbiB0byBhIGZpbGUsIHJhdGhlcgotICAgICAgdGhhbiB0byB0aGUgc2NyZWVuLCBhZGQgYW4gLW91dCBmbGFnIHdpdGggdGhlIG91dHB1dCBmaWxlIG5hbWUuPC9wPgotICAgICAgPHA+UnVuIHRoZXNlIHNhbXBsZXMgZnJvbSB0aGUgZXh0ZW5zaW9ucyBkaXJlY3RvcnkgYXMgZm9sbG93cyAoZWFjaCBvZiB0aGUgZm9sbG93aW5nIGlzIGEgc2luZ2xlIGNvbW1hbmQKLSAgICAgICBsaW5lKTo8L3A+IAotCi0gICAgICA8YW5jaG9yIG5hbWU9ImV4dDEiLz4KLSAgICAgIDxzMyB0aXRsZT0iMS1yZWRpciI+Ci0gICAgICA8cD5XaGF0IGl0IGRvZXM6IFVzZXMgdGhlIFJlZGlyZWN0IGV4dGVuc2lvbiBlbGVtZW50cyBzaGlwcGVkIHdpdGggJnhzbHQ0ajsgdG8gZGlyZWN0IG91dHB1dCB0byB0d28gb3V0cHV0Ci0gICAgICAgIGZpbGVzLjwvcD4KLSAgICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBleHRlbnNpb25zIHN1YmRpcmVjdG9yeSB3aXRoPC9wPiAKLSAgICAgICA8cD48Y29kZT5qYXZhIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIC1pbiAxLXJlZGlyLnhtbDwvY29kZT48YnIvPgotICAgICAgICZuYnNwOyZuYnNwOzxjb2RlPi14c2wgMS1yZWRpci54c2w8L2NvZGU+PC9wPgotICAgICAgPHA+VGhlIHN0YW5kYXJkIChub24tcmVkaXJlY3RlZCkgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gdGhlIHNjcmVlbi4gVGhlIHJlZGlyZWN0ZWQgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gMS1yZWRpci1vdXQsIG9yCi0gICAgICB3aGF0ZXZlciBmaWxlbmFtZSB5b3UgYXNzaWduIHRvIHRoZSBkb2MvZm9vIEBmaWxlIGF0dHJpYnV0ZSBpbiAxLXJlZGlyLnhtbC4gVGhlIHN0eWxlc2hlZXQgZ2V0cyB0aGUgZmlsZSBuYW1lIGZvcgotICAgICAgcmVkaXJlY3RlZCBvdXRwdXQgZnJvbSB0aGUgWE1MIGlucHV0IGZpbGUuPC9wPgotICAgICAgPC9zMz48YW5jaG9yIG5hbWU9ImV4dDIiLz4KLSAgICAgIDxzMyB0aXRsZT0iMi1iYXNpY0pzY3JpcHQiPgotICAgICAgPHA+V2hhdCBpdCBkb2VzOiBVc2VzIGFuIGV4dGVuc2lvbiBlbGVtZW50IGFuZCBleHRlbnNpb24gZnVuY3Rpb24gaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCB0byBjb21wdXRlIGEKLSAgICAgIGRlYWRsaW5lIGZvciByZXNwb25kaW5nIHRvIGEgY3VzdG9tZXIgaW5xdWlyeS48L3A+Ci0gICAgICA8bm90ZT5qcy5qYXIgbXVzdCBiZSBvbiB0aGUgY2xhc3NwYXRoLjwvbm90ZT4KLSAgICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBleHRlbnNpb25zIHN1YmRpcmVjdG9yeSB3aXRoPC9wPgotICAgICAgPHA+PGNvZGU+amF2YSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuUHJvY2VzcyAtaW4gMi1iYXNpY0pzY3JpcHQueG1sPC9jb2RlPgotICAgICAgICAgPGJyLz4mbmJzcDsmbmJzcDs8Y29kZT4teHNsIDItamJhc2ljSnNjcmlwdC54c2w8L2NvZGU+PC9wPiAgICAgCi0gICAgICA8L3MzPjxhbmNob3IgbmFtZT0iZXh0MyIvPgotICAgICAgPHMzIHRpdGxlPSIzLWphdmEtbmFtZXNwYWNlIj4KLSAgICAgIDxwPldoYXQgaXQgZG9lczogVXNlcyBleHRlbnNpb24gZnVuY3Rpb25zIHRvIGZvcm1hdCBkYXRlcy4gVGhpcyBzYW1wbGUgaWxsdXN0cmF0ZXMgdXNlIG9mIHRoZSBwcmVkZWZpbmVkIGphdmEKLSAgICAgICAgZXh0ZW5zaW9uIG5hbWVzcGFjZSB0byBwcm92aWRlIHJlYWR5IGFjY2VzcyB0byBleHRlbnNpb25zIGltcGxlbWVudGVkIGluIEphdmEuPC9wPgotICAgICAgPHA+UnVuIHRoaXMgc2FtcGxlIGZyb20gdGhlIGV4dGVuc2lvbnMgc3ViZGlyZWN0b3J5IHdpdGg8L3A+IAotICAgICAgPHA+PGNvZGU+amF2YSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuUHJvY2VzcyAtaW4gMy1qYXZhLW5hbWVzcGFjZS54bWw8L2NvZGU+Ci0gICAgICAgICA8YnIvPiZuYnNwOyZuYnNwOzxjb2RlPi14c2wgMy1qYXZhLW5hbWVzcGFjZS54c2w8L2NvZGU+PC9wPiAgICAKLSAgICAgIDwvczM+PGFuY2hvciBuYW1lPSJleHQ0Ii8+Ci0gICAgICA8czMgdGl0bGU9IjQtbnVtbGlzdEphdmEiPgotICAgICAgPHA+V2hhdCBpdCBkb2VzOiBVc2VzIGEgSmF2YSBleHRlbnNpb24gdG8gdHJhbnNmb3JtIGEgc2V0IG9mIG5hbWUgZWxlbWVudHMgaW50byBhIG51bWJlcmVkIGFuZCBhbHBoYWJldGl6ZWQKLSAgICAgICBsaXN0LjwvcD4KLSAgICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBleHRlbnNpb25zIHN1YmRpcmVjdG9yeSB3aXRoPC9wPiAKLSAgICAgIDxwPjxjb2RlPmphdmEgb3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MgLWluIG51bWxpc3QueG1sPC9jb2RlPiAKLSAgICAgICAgPGJyLz4mbmJzcDsmbmJzcDs8Y29kZT4teHNsIDQtbnVtbGlzdEphdmEueHNsPC9jb2RlPjwvcD4gICAgCi0gICAgICA8L3MzPjxhbmNob3IgbmFtZT0iZXh0NSIvPgotICAgICAgPHMzIHRpdGxlPSI1LW51bWxpc3RKc2NyaXB0Ij4KLSAgICAgIDxwPldoYXQgaXQgZG9lczogVXNlcyBhIEphdmFTY3JpcHQgIGV4dGVuc2lvbiB0byB0cmFuc2Zvcm0gYSBzZXQgb2YgbmFtZSBlbGVtZW50cyBpbnRvIGEgbnVtYmVyZWQgYW5kCi0gICAgICBhbHBoYWJldGl6ZWQgbGlzdC4gVGhpcyBzYW1wbGUgcGVyZm9ybXMgdGhlIHNhbWUgb3BlcmF0aW9ucyBhcyB0aGUgcHJlY2VkaW5nIEphdmEgZXh0ZW5zaW9uLjwvcD4KLSAgICAgIDxub3RlPmpzLmphciBtdXN0IGJlIG9uIHRoZSBjbGFzc3BhdGguPC9ub3RlPgotICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBleHRlbnNpb25zIHN1YmRpcmVjdG9yeSB3aXRoPC9wPgotICAgICAgPHA+PGNvZGU+IGphdmEgb3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MgLWluIG51bWxpc3QueG1sPC9jb2RlPgotICAgICAgICA8YnIvPiZuYnNwOyZuYnNwOzxjb2RlPi14c2wgNS1udW1saXN0SnNjcmlwdC54c2w8L2NvZGU+PC9wPgotICAgICAgPC9zMz48YW5jaG9yIG5hbWU9ImV4dDYiLz4KLSAgICAgIDxzMyB0aXRsZT0iNi1zcWxsaWItaW5zdGFudGRiIj4KLSAgICAgIDxwPldoYXQgaXQgZG9lczogVXNlcyA8bGluayBpZHJlZj0iZXh0ZW5zaW9uc2xpYiIgYW5jaG9yPSJzcWwiPlNRTCBsaWJyYXJ5IFhDb25uZWN0aW9uCi0gICAgICBleHRlbnNpb248L2xpbms+IHRvIGNvbm5lY3QgdG8gYW4gSW5zdGFudERCIHNhbXBsZSBkYXRhYmFzZSwgcGVyZm9ybSBhIHF1ZXJ5LCBhbmQgZGlzcGxheSB0aGUKLSAgICAgIHF1ZXJ5IHJlc3VsdCBpbiBhbiBIVE1MIHRhYmxlLjwvcD4KLSAgICAgIDxub3RlPllvdSBtdXN0IGluY2x1ZGUgaWRiLmphciBvbiB0aGUgY2xhc3NwYXRoLiBXZSBoYXZlIHBsYWNlZCBhIGNvcHkgb2YgaWRiLmphciBmcm9tCi0gICAgICBJbnN0YW50REIgdmVyc2lvbiAzLjI1IGluIHNhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBJbnN0YW50REIsIHNlZQotICAgICAgPGp1bXAgaHJlZj0iaHR0cDovL2luc3RhbnRkYi5lbmh5ZHJhLm9yZy9zb2Z0d2FyZS9kb2N1bWVudGF0aW9uL2luZGV4Lmh0bWwiPkluc3RhbnREQjwvanVtcD4KLSAgICAgIGFuZCB0aGUgPGp1bXAgaHJlZj0iaHR0cDovL2luc3RhbnRkYi5lbmh5ZHJhLm9yZy9zb2Z0d2FyZS9saWNlbnNlL2luZGV4Lmh0bWwiPkVueWRyYSBQdWJsaWMKLSAgICAgIExpY2Vuc2U8L2p1bXA+Ljwvbm90ZT4KLSAgICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBleHRlbnNpb25zIHN1YmRpcmVjdG9yeSB3aXRoIChhZGp1c3QgdGhlIFdpbmRvd3MgY2xhc3NwYXRoIHNldHRpbmcgCi0gICAgICBiZWxvdyBmb3IgeW91ciBvcGVyYXRpbmcgZW52aXJvbm1lbnQpOjwvcD4KLSAgICAgIDxwPjxjb2RlPmphdmEgLWNwIGluc3RhbnRkYi9pZGIuamFyOyVjbGFzc3BhdGglPC9jb2RlPiAKLSAgICAgIDxici8+Jm5ic3A7Jm5ic3A7b3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3M8Y29kZT48L2NvZGU+Ci0gICAgICA8YnIvPiZuYnNwOyZuYnNwOzxjb2RlPi14c2wgNi1zcWxsaWItaW5zdGFudGRiLnhzbCAtb3V0IGltcG9ydDEuaHRtbDwvY29kZT48L3A+Ci0gICAgICA8L3MzPgotICAgIDwvczI+PGFuY2hvciBuYW1lPSJ0cmFjZSIvPgotICAgIDxzMiB0aXRsZT0iVHJhY2UiPgotICAgICAgPHA+V2hhdCBpdCBkb2VzOiBUcmFjZSB1c2VzIHRoZSBUcmFjZUxpc3RlbmVyIGFuZCBUcmFjZU1hbmFnZXIgY2xhc3NlcyB0byBsb2cgdHJhbnNmb3JtYXRpb24gZXZlbnRzLjwvcD4KLSAgICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBUcmFjZSBzdWJkaXJlY3Rvcnkgd2l0aDwvcD4KLSAgICAgIDxwPjxjb2RlPmphdmEgVHJhY2U8L2NvZGU+PC9wPgotICAgICAgPHA+YW5kIGV4YW1pbmUgdGhlIHJlc3VsdCBpbiBldmVudHMubG9nLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9ImRlYnVnZ2luZyI+RGVidWdnZXIKLSAgICAgIEludGVyZmFjZTwvbGluaz48L3A+Ci0gICAgIDwvczI+PGFuY2hvciBuYW1lPSJ0cmF4Ii8+Ci0gICAgIDxzMiB0aXRsZT0idHJheCI+Ci0gICAgIDxub3RlPiZ0cmF4c2FtcGxlbm90ZTs8L25vdGU+Ci0gICAgIDxwPldoYXQgaXQgZG9lczogcnVuIGEgbnVtYmVyIG9mIHNhbXBsZXMgaWxsdXN0cmF0aW5nIHVzZXMgb2YgdGhlIDxyZXNvdXJjZS1yZWYgaWRyZWY9InRyYXgiLz4gaW50ZXJmYWNlcy48L3A+Ci0gICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSB0cmF4IHN1YmRpcmVjdG9yeSB3aXRoPC9wPgotICAgICA8cD48Y29kZT5qYXZhIEV4YW1wbGVzPC9jb2RlPjwvcD4KLSAgICAgPHA+YW5kIGV4YW1pbmUgdGhlIHNvdXJjZSBpbiBFeGFtcGxlcy5qYXZhIGFuZCBFeGFtcGxlQ29udGVudEhhbmRsZXIuamF2YS48L3A+Ci0gICAgIDwvczI+Ci08L3MxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vdXNhZ2VwYXR0ZXJucy54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuL3VzYWdlcGF0dGVybnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmM5MzEyLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vdXNhZ2VwYXR0ZXJucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PiAKLTwhRE9DVFlQRSBzMSBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9kb2N1bWVudC5kdGQiPgotPCEtLQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLTxzMSB0aXRsZT0iQmFzaWMgdXNhZ2UgcGF0dGVybnMiPgotPHVsPgotPGxpPjxsaW5rIGFuY2hvcj0iYmFzaWMiPkJhc2ljIHN0ZXBzPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJwbHVnIj5QbHVnZ2luZyBpbiB0aGUgVHJhbnNmb3JtZXIgYW5kIFhNTCBwYXJzZXI8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9Im91dHB1dHByb3BzIj5TZXR0aW5nIG91dHB1dCBwcm9wZXJ0aWVzIGluIHlvdXIgc3R5bGVzaGVldHM8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImVtYmVkIj5Xb3JraW5nIHdpdGggZW1iZWRkZWQgc3R5bGVzaGVldHM8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InBhcmFtcyI+U2V0dGluZyBzdHlsZXNoZWV0IHBhcmFtZXRlcnM8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InNlcmlhbGl6ZSI+U2VyaWFsaXppbmcgb3V0cHV0PC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJzYXgiPkV4cGxpY2l0bHkgd29ya2luZyB3aXRoIFNBWDwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0ib3V0YXNpbiI+VXNpbmcgdHJhbnNmb3JtYXRpb24gb3V0cHV0IGFzIGlucHV0IGZvciBhbm90aGVyIHRyYW5zZm9ybWF0aW9uPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJkb20iPlByb2Nlc3NpbmcgYW5kIHByb2R1Y2luZyBET00gdHJlZXM8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InhwYXRoIj5Xb3JraW5nIHdpdGggWFBhdGggZXhwcmVzc2lvbnM8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImFwcGxldCI+VXNpbmcgdGhlICZ4c2x0NGo7IGFwcGxldCB3cmFwcGVyPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJzZXJ2bGV0Ij5Vc2luZyAmeHNsdDRqOyBpbiBhIHNlcnZsZXQ8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImV4dGVuc2lvbnMiPkNyZWF0aW5nIGFuZCB1c2luZyBleHRlbnNpb25zPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJtdWx0aXRocmVhZGluZyI+TXVsdGl0aHJlYWRpbmc8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImRlYnVnZ2luZyI+RGVidWdnZXIgaW50ZXJmYWNlPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJjb21wYXQiPlVzaW5nIHRoZSAmeHNsdDRqOyB2ZXJzaW9uIDEgQVBJPC9saW5rPjwvbGk+Ci08L3VsPgotPGFuY2hvciBuYW1lPSJiYXNpYyIvPgotICA8czIgdGl0bGU9IkJhc2ljIHN0ZXBzIj4KLSAgICA8b2w+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0idHJhbnNmb3JtZXJmYWN0b3J5Ij5JbnN0YW50aWF0ZSBhIFRyYW5zZm9ybWVyRmFjdG9yeTwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9InRyYW5zZm9ybWVyIj5Qcm9jZXNzIHRoZSBzdHlsZXNoZWV0IGFuZCBnZW5lcmF0ZSBhIFRyYW5zZm9ybWVyPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0idHJhbnNmb3JtYXRpb24iPlBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uPC9saW5rPjwvbGk+Ci0gIDwvb2w+Ci0gICAgPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIHRoZSB0aHJlZSBiYXNpYyBzdGVwcyBpbnZvbHZlZCBpbiBwZXJmb3JtaW5nIGEgdHJhbnNmb3JtYXRpb24uPC9wPgotICAgIDxzb3VyY2U+Ly8gMS4gSW5zdGFudGlhdGUgYSBUcmFuc2Zvcm1lckZhY3RvcnkuCi1qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IAotICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybWVyVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLS8vIDIuIFVzZSB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IHRvIHByb2Nlc3MgdGhlIHN0eWxlc2hlZXQgU291cmNlIGFuZAotLy8gICAgZ2VuZXJhdGUgYSBUcmFuc2Zvcm1lci4KLWphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0RmFjdG9yeS5uZXdUcmFuc2Zvcm1lcgotICAgICAgICAgICAgICAgIChuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlKCJmb28ueHNsIik7Ci0KLS8vIDMuIFVzZSB0aGUgVHJhbnNmb3JtZXIgdG8gdHJhbnNmb3JtIGFuIFhNTCBTb3VyY2UgYW5kIHNlbmQgdGhlCi0vLyAgICBvdXRwdXQgdG8gYSBSZXN1bHQgb2JqZWN0LgotdHJhbnNmb3JtZXIudHJhbnNmb3JtCi0gICAgKG5ldyBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2UoImZvby54bWwiKSwgCi0gICAgIG5ldyBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQoIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSgiZm9vLm91dCIpKSk7PC9zb3VyY2U+Ci0gIDxub3RlPkZvciBhIHdvcmtpbmcgZXhhbXBsZSBvZiB0aGlzIG1vZGVsIGF0IGl0cyBzaW1wbGVzdCwgc2VlIFNpbXBsZVRyYW5zZm9ybS5qYXZhIGluIHRoZSBqYXZhL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtIHN1YmRpcmVjdG9yeS48L25vdGU+Ci0gIDwvczI+PGFuY2hvciBuYW1lPSJ0cmFuc2Zvcm1lcmZhY3RvcnkiLz4KLSAgPHMyIHRpdGxlPSIxLiBJbnN0YW50aWF0ZSBhIFRyYW5zZm9ybWVyRmFjdG9yeSI+Ci0gIDxwPjxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lckZhY3RvcnkjaHRtbCI+VHJhbnNmb3JtZXJGYWN0b3J5PC9qdW1wPiBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aXRoIGEgc3RhdGljIG5ld0luc3RhbmNlKCkgbWV0aG9kIHRoYXQgaW5zdGFudGlhdGVzIHRoZSBjb25jcmV0ZSBzdWJjbGFzcyBkZXNpZ25hdGVkIGJ5IHRoZSBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSBzeXN0ZW0gcHJvcGVydHkuPC9wPgotICA8cD5UaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGlzIHN5c3RlbSBwcm9wZXJ0eSBpcyA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yL1RyYW5zZm9ybWVyRmFjdG9yeUltcGwuaHRtbCI+b3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbDwvanVtcD4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9InRyYW5zZm9ybWVyIi8+Ci0gIDxzMiB0aXRsZT0iMi4gVXNlIHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgdG8gcHJvY2VzcyB0aGUgc3R5bGVzaGVldCBTb3VyY2UgYW5kIHByb2R1Y2UgYSBUcmFuc2Zvcm1lciI+Ci08cD5UaGUgVHJhbnNmb3JtZXJGYWN0b3J5IDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lckZhY3RvcnkuaHRtbCNuZXdUcmFuc2Zvcm1lcihqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSkiPm5ld1RyYW5zZm9ybWVyKFNvdXJjZSB4c2xTb3VyY2UpPC9qdW1wPiBtZXRob2QgcHJvY2Vzc2VzIHRoZSBzdHlsZXNoZWV0IFNvdXJjZSBpbnRvIGEgVGVtcGxhdGVzIG9iamVjdCBhbmQgcmV0dXJucyBhIFRyYW5zZm9ybWVyIHRoYXQgeW91IGNhbiB1c2UgdG8gcGVyZm9ybSBhIHRyYW5zZm9ybWF0aW9uIChhcHBseSB0aGUgVGVtcGxhdGVzIG9iamVjdCB0byBhbiBYTUwgU291cmNlKS48L3A+Ci08cD5Zb3UgbWF5IHByb3ZpZGUgdGhlIHN0eWxlc2hlZXQgU291cmNlIGluIHRoZSBmb3JtIG9mIGEgc3RyZWFtIG9mIFhNTCBtYXJrdXAgKDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9zdHJlYW0vU3RyZWFtU291cmNlLmh0bWwiPlN0cmVhbVNvdXJjZTwvanVtcD4pLCBhIERPTSBOb2RlICg8anVtcCBocmVmPSJhcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vZG9tL0RPTVNvdXJjZS5odG1sIj5ET01Tb3VyY2U8L2p1bXA+KSwgb3IgYSBTQVggSW5wdXRTb3VyY2UgKDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9zYXgvU0FYU291cmNlLmh0bWwiPlNBWFNvdXJjZTwvanVtcD4pLiBUbyBzcGVjaWZ5IGEgU3RyZWFtU291cmNlLCB5b3UgbWF5IHVzZSBhIHN5c3RlbSBJRCBvciBmaWxlIG5hbWUgKHVzaW5nIFVSSSBzeW50YXgpLCBhIGphdmEuaW8uSW5wdXRTdHJlYW0sIG9yIGEgamF2YS5pby5SZWFkZXIuIFRoZSB1c2Ugb2YgRE9NU291cmNlIGFuZCBTQVhTb3VyY2UgYXJlIGlsbHVzdHJhdGVkIGluIHN1YnNlcXVlbnQgc2VjdGlvbnMuPC9wPgotPG5vdGU+SWYgeW91IHBsYW4gdG8gdXNlIHRoZSBzdHlsZXNoZWV0IFNvdXJjZSB0byB0cmFuc2Zvcm0gbXVsdGlwbGUgWE1MIFNvdXJjZXMsIHlvdSBzaG91bGQgdXNlIHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgPGp1bXAgaHJlZj0iYXBpZG9jcy9qYXZheC94bWwvaW1wb3J0L1RyYW5zZm9ybWVyRmFjdG9yeS5odG1sI25ld1RlbXBsYXRlcyhqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSkiPm5ld1RlbXBsYXRlcyhTb3VyY2UgeHNsU291cmNlKTwvanVtcD4gbWV0aG9kIHRvIGV4cGxpY2l0bHkgZ2VuZXJhdGUgYSBUZW1wbGF0ZXMgb2JqZWN0LiBGb3IgZWFjaCB0cmFuc2Zvcm1hdGlvbiwgdXNlIHRoZSBUZW1wbGF0ZXMgb2JqZWN0IHRvIGdlbmVyYXRlIGEgbmV3IFRyYW5zZm9ybWVyLiBGb3IgdGhlIGRldGFpbHMsIHNlZSA8bGluayBhbmNob3I9Im11bHRpdGhyZWFkaW5nIj5NdWx0aXRocmVhZGluZzwvbGluaz4uPC9ub3RlPgotPC9zMj48YW5jaG9yIG5hbWU9InRyYW5zZm9ybWF0aW9uIi8+Ci08czIgdGl0bGU9IjMuIFVzZSB0aGUgVHJhbnNmb3JtZXIgdG8gcGVyZm9ybSBhIHRyYW5zZm9ybWF0aW9uIj4KLTxwPlVzZSB0aGUgVHJhbnNmb3JtZXIgPGp1bXAgaHJlZj0iYXBpZG9jcy9qYXZheC94bWwvaW1wb3J0L1RyYW5zZm9ybWVyLmh0bWwjdHJhbnNmb3JtKGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlLCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdCI+dHJhbnNmb3JtKFNvdXJjZSB4bWxTb3VyY2UsIFJlc3VsdCB0cmFuc2Zvcm1SZXN1bHQpPC9qdW1wPiBtZXRob2QgdG8gdHJhbnNmb3JtICB0aGUgWE1MIFNvdXJjZSBhbmQgcGxhY2UgdGhlIHRyYW5zZm9ybWF0aW9uIG91dHB1dCBpbiBhIFJlc3VsdCBvYmplY3QuPC9wPgotPHA+SnVzdCBhcyB3aXRoIHRoZSBzdHlsZXNoZWV0LCB5b3UgY2FuIHN1cHBseSB0aGUgWE1MIFNvdXJjZSBpbiB0aGUgZm9ybSBvZiBhIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9zdHJlYW0vU3RyZWFtU291cmNlLmh0bWwiPlN0cmVhbVNvdXJjZTwvanVtcD4sIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9kb20vRE9NU291cmNlLmh0bWwiPkRPTVNvdXJjZTwvanVtcD4sIG9yIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9zYXgvU0FYU291cmNlLmh0bWwiPlNBWFNvdXJjZTwvanVtcD4uIExpa2V3aXNlLCB0aGUgUmVzdWx0IG1heSBiZSBhIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9zdHJlYW0vU3RyZWFtUmVzdWx0Lmh0bWwiPlN0cmVhbVJlc3VsdDwvanVtcD4sIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9kb20vRE9NUmVzdWx0Lmh0bWwiPkRPTVJlc3VsdDwvanVtcD4sIG9yIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9zYXgvU0FYUmVzdWx0Lmh0bWwiPlNBWFJlc3VsdDwvanVtcD4uPC9wPgotPHA+Rm9yIGVhY2ggbm9kZSBpbiB0aGUgWE1MIHNvdXJjZSwgdGhlIFRyYW5zZm9ybWVyIHVzZXMgdGhlIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucyBpbiB0aGUgVGVtcGxhdGVzIG9iamVjdCB0byBkZXRlcm1pbmUgd2hpY2ggdGVtcGxhdGUgdG8gYXBwbHk6IG9uZSBvZiB0aGUgdGVtcGxhdGVzIGluIHRoZSBUZW1wbGF0ZXMgb2JqZWN0LCBhIGRlZmF1bHQgdGVtcGxhdGUgcnVsZSBhcyBzcGVjaWZpZWQgaW4gdGhlIFhTTFQgc3BlYywgb3Igbm9uZS48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0icGx1ZyIvPgotPHMyIHRpdGxlPSJQbHVnZ2luZyBpbiBhIFRyYW5zZm9ybWVyIGFuZCBYTUwgcGFyc2VyIj4KLTxwPlRoZSBKYXZhIEFQSSBmb3IgWE1MIFByb2Nlc3NpbmcgaW50ZXJmYWNlcyBlbmFibGUgeW91IHRvIGlzb2xhdGUgeW91ciBhcHBsaWNhdGlvbiBmcm9tIHRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIGEgZ2l2ZW4gVHJhbnNmb3JtZXIsIFNBWCBwYXJzZXIsIG9yIERPTSBwYXJzZXIuIEZvciBlYWNoIG9mIHRoZXNlIG9iamVjdHMsIHRoZXJlIGlzIGFuIGFic3RyYWN0IEZhY3RvcnkgY2xhc3Mgd2l0aCBhIHN0YXRpYyBuZXdJbnN0YW5jZSgpIG1ldGhvZCB0aGF0IGluc3RhbnRpYXRlcyBhIGNvbmNyZXRlIEZhY3Rvcnkgd2hpY2ggd3JhcHMgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uIFRoZXNlIG5ld0luc3RhbmNlKCkgbWV0aG9kcyB1c2Ugc3lzdGVtIHByb3BlcnR5IHNldHRpbmdzIHRvIGRldGVybWluZSB3aGljaCBpbXBsZW1lbnRhdGlvbiB0byBpbnN0YW50aWF0ZS48L3A+Ci08cD4meHNsdDRqOyBpcyBkaXN0cmlidXRlZCB3aXRoIHN5c3RlbSBwcm9wZXJ0eSBzZXR0aW5ncyBmb3IgdGhlIFhhbGFuIFhTTFQgVHJhbnNmb3JtZXIgYW5kIHRoZSBYZXJjZXMgRE9NIGFuZCBTQVggcGFyc2Vycy4gVGhlc2Ugc2V0dGluZ3MgYXJlIGluIHhhbGFuLmphciBpbiBNRVRBLUlORi9zZXJ2aWNlcyAoc2VlIHNyYy9NRVRBLUlORi9zZXJ2aWNlcykuPC9wPgotPGdsb3NzPgotICA8bGFiZWw+U3lzdGVtIHByb3BlcnR5PC9sYWJlbD4KLSAgICA8aXRlbT5TZXR0aW5nPC9pdGVtPgotICA8bGFiZWw+PGNvZGU+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk8L2NvZGU+PC9sYWJlbD4KLSAgIDxpdGVtPjxjb2RlPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGw8L2NvZGU+PC9pdGVtPiAgICAKLSAgPGxhYmVsPjxjb2RlPmphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk8L2NvZGU+PC9sYWJlbD4KLSAgIDxpdGVtPjxjb2RlPm9yZy5hcGFjaGUueGVyY2VzLmpheHAuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeUltcGw8L2NvZGU+PC9pdGVtPiAgICAKLSAgPGxhYmVsPjxjb2RlPmphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk8L2NvZGU+PC9sYWJlbD4KLSAgIDxpdGVtPjxjb2RlPm9yZy5hcGFjaGUueGVyY2VzLmpheHAuU0FYUGFyc2VyRmFjdG9yeUltcGw8L2NvZGU+PC9pdGVtPgotIDwvZ2xvc3M+Ci08cD5Zb3UgY2FuIGNoYW5nZSBhbnkgb2YgdGhlc2Ugc2V0dGluZ3MgYXMgZm9sbG93cyAoaW4gb3JkZXIgb2YgcHJlY2VkZW5jZSk6PC9wPgotPG9sPgotICA8bGk+U2V0IHRoZSBzeXN0ZW0gcHJvcGVydHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHdoZW4geW91IGxhdW5jaCBKYXZhIG9yIGZyb20gd2l0aGluIHlvdXIgYXBwbGljYXRpb24uPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5TZXQgdGhlIHN5c3RlbSBwcm9wZXJ0eSBpbiBqYXhwLnByb3BlcnRpZXMgaW4gdGhlIEpBVkFfSE9NRS9saWIgZGlyZWN0b3J5LCB3aGVyZSBKQVZBX0hPTUUgaXMgdGhlIHJvb3Qgb2YgdGhlIEpESy48YnIvPjxici8+PC9saT4KLSAgPGxpPlJldmlzZSB0aGUgZW50cnkgaW4gc3JjL01FVEEtSU5GL3NlcnZpY2VzIGFuZCByZWJ1aWxkIHhhbGFuLmphci48YnIvPjxici8+PC9saT4KLTwvb2w+Ci08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gZGV0ZXJtaW5lIHN5c3RlbSBwcm9wZXJ0eSB2YWx1ZXMgYW5kIGhvdyB5b3UgY2FuIHBsdWcgb3RoZXIgaW1wbGVtZW50YXRpb25zIGludG8geW91ciBhcHBsaWNhdGlvbnMsIHNlZSAiU2VjdGlvbiAzOiBQbHVnYWJpbGl0eSBMYXllciIgaW4gdGhlIDxyZWY+SmF2YSBBUEkgZm9yIFhNTCBQcm9jZXNzaW5nPC9yZWY+IGF0IAotPGp1bXAgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9hYm91dEphdmEvY29tbXVuaXR5cHJvY2Vzcy9yZXZpZXcvanNyMDYzL2luZGV4Lmh0bWwiPkpTUi0wMDAwNjMgMS4xPC9qdW1wPi48L3A+IAotPC9zMj48YW5jaG9yIG5hbWU9Im91dHB1dHByb3BzIi8+Ci08czIgdGl0bGU9IlNldHRpbmcgb3V0cHV0IHByb3BlcnRpZXMgaW4geW91ciBzdHlsZXNoZWV0cyI+Ci08cD5PdXRwdXQgcHJvcGVydGllcyBmb3IgWE1MLCBIVE1MLCBhbmQgVGV4dCB0cmFuc2Zvcm1hdGlvbiBvdXRwdXQgYXJlIGRlZmluZWQgaW4gcHJvcGVydHkgZmlsZXMgaW4gdGhlIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzIHBhY2thZ2UuPC9wPgotPHA+WW91IGNhbiBjaGFuZ2UgdGhlc2Ugc2V0dGluZ3MgYXMgZm9sbG93czo8L3A+Ci08b2w+Ci0gIDxsaT5EZWNsYXJlIHRoZSB4YWxhbiBuYW1lc3BhY2UgaW4geW91ciBzdHlsZXNoZWV0IGVsZW1lbnQgKHhtbG5zOnhhbGFuPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIpLjxici8+PGJyLz48L2xpPgotICA8bGk+VXNlIHRoZSBuYW1lc3BhY2UgcHJlZml4IHlvdSBhc3NpZ24gKHdlIHVzZSAieGFsYW4iIGhlcmUgaW4gdGhlIHRleHQpIHRvIHJlZGVmaW5lIHByb3BlcnRpZXMgb2YgaW50ZXJlc3QgaW4gdGhlIHN0eWxlc2hlZXQgeHNsOm91dHB1dAotICAgICAgZWxlbWVudCAoZm9yIGV4YW1wbGUsIHhhbGFuOmluZGVudC1hbW91bnQ9IjUiKS48L2xpPgotPC9vbD4KLSAgPHA+SWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSBwcm9wZXJ0eSBzZXR0aW5ncyBnbG9iYWxseSwgZWRpdCB0aGUgdmFsdWVzIGluIHRoZSBwcm9wZXJ0eSBmaWxlcyBpbiBzcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMsIAotICBhbmQgdXNlIEFudCB0byA8bGluayBpZHJlZj0icmVhZG1lIiBhbmNob3I9ImphciI+cmVidWlsZCB4YWxhbi5qYXI8L2xpbms+LjwvcD4KLTxwPlRoZSBwcm9wZXJ0aWVzIGZpbGVzIGRlZmluZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6PC9wPgotPHA+PHJlZj5vdXRwdXRfeG1sLnByb3BlcnRpZXM8L3JlZj46PC9wPgotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRoPlByb3BlcnR5PC90aD4KLSAgICA8dGg+RGVmYXVsdCB2YWx1ZTwvdGg+Ci0gIDwvdHI+ICAKLSAgPHRyPgotICAgIDx0ZD54YWxhbjppbmRlbnQtYW1vdW50PC90ZD4KLSAgICA8dGQ+MDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+eGFsYW46Y29udGVudC1oYW5kbGVyPC90ZD4KLSAgICA8dGQ+b3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplclRvWE1MPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08cD48cmVmPm91dHB1dF9odG1sLnByb3BlcnRpZXM8L3JlZj46PC9wPgotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRoPlByb3BlcnR5PC90aD4KLSAgICA8dGg+RGVmYXVsdCB2YWx1ZTwvdGg+Ci0gIDwvdHI+ICAKLSAgPHRyPgotICAgIDx0ZD54YWxhbjppbmRlbnQtYW1vdW50PC90ZD4KLSAgICA8dGQ+MDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+eGFsYW46Y29udGVudC1oYW5kbGVyPC90ZD4KLSAgICA8dGQ+b3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplclRvSFRNTDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+ZW50aXRpZXM8L3RkPgotICAgIDx0ZD5IVE1MRW50aXRpZXMucmVzPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD54YWxhbjp1c2UtdXJsLWVzY2FwaW5nPC90ZD4KLSAgICA8dGQ+eWVzPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08bm90ZT5Zb3UgY2FuIGFsc28gY3JlYXRlIHlvdXIgb3duIEhUTUwgZW50aXR5IGZpbGUgKG1hcHBpbmcgY2hhcmFjdGVycyB0byBlbnRpdGllcykgCi1vciBlZGl0IHNyYy9vcmcvYXBhY2hlL3hhbGFuL3NlcmlhbGl6ZS9IVE1MRW50aXRpZXMucmVzIGFuZCByZWJ1aWxkIHhhbGFuLmphci48L25vdGU+Ci08cD48cmVmPm91dHB1dF90ZXh0LnByb3BlcnRpZXM8L3JlZj46PC9wPgotPHRhYmxlPiAgCi0gIDx0cj4KLSAgICA8dGg+UHJvcGVydHk8L3RoPgotICAgIDx0aD5EZWZhdWx0IHZhbHVlPC90aD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD54YWxhbjpjb250ZW50LWhhbmRsZXI8L3RkPgotICAgIDx0ZD5vcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZS5TZXJpYWxpemVyVG9UZXh0PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08cD5TZWUgYWxzbyA8bGluayBpZHJlZj0icmVhZG1lIiBhbmNob3I9Im91dHB1dHByb3BzIj5SZWxlYXNlIE5vdGVzOiBPdXRwdXQgUHJvcGVydGllczwvbGluaz4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImVtYmVkIi8+Ci08czIgdGl0bGU9Ildvcmtpbmcgd2l0aCBlbWJlZGRlZCBzdHlsZXNoZWV0cyI+Ci08cD5BbiBYTUwgU291cmNlIG1heSBpbmNsdWRlIGFuIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0LyI+eG1sLXN0eWxlc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjwvanVtcD4gd2hpY2ggaWRlbnRpZmllcyB0aGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHRvIHByb2Nlc3MgdGhlIGRvY3VtZW50LiBBcyBpbmRpY2F0ZWQgYnkgdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gPHJlZj5ocmVmPC9yZWY+IGF0dHJpYnV0ZSwgdGhlIHN0eWxlc2hlZXQgaXRzZWxmIG1heSBiZSBlbWJlZGRlZCBpbiB0aGUgWE1MIGRvY3VtZW50IG9yIGxvY2F0ZWQgZWxzZXdoZXJlLjwvcD4KLTxwPlN1cHBvc2UgeW91IGhhdmUgYW4gWE1MIGRvY3VtZW50IChmb28ueG1sKSB3aXRoIHRoZSBmb2xsb3dpbmcgeG1sLXN0eWxlc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjo8L3A+Ci08cD48Y29kZT4mbHQ7P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveG1sIiBocmVmPSJmb28ueHNsIj8mZ3Q7PC9jb2RlPjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgZnJhZ21lbnQsIHVzZXMgdGhpcyBpbnN0cnVjdGlvbiB0byBsb2NhdGUgdGhlIHN0eWxlc2hlZXQgKGZvby54c2wgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGZvby54bWwpIGFuZCBjcmVhdGUgYSBUZW1wbGF0ZXMgb2JqZWN0LiBOb3RlIHRoZSB1c2Ugb2YgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSBnZXRBc3NvY2lhdGVkU3R5bGVzaGVldCgpIGluIHN0ZXAgMmEuPC9wPgotPG5vdGU+QW4gWE1MIGRvY3VtZW50IG1heSBpbmNsdWRlIG1vcmUgdGhhbiBvbmUgeG1sLXN0eWxlc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgaGVuY2UgdGhlIHN1cHBvcnQgZm9yIHdvcmtpbmcgd2l0aCBtdWx0aXBsZSBzdHlsZXNoZWV0cy4gSWYgbW9yZSB0aGFuIG9uZSBzdHlsZXNoZWV0IGlzIHJldHVybmVkLCB0aGUgb3RoZXIgc3R5bGVzaGVldHMgYXJlIGltcG9ydGVkIGludG8gdGhlIGZpcnN0IHN0eWxlc2hlZXQuPC9ub3RlPgotPHNvdXJjZT4vLyAxLiBJbnN0YW50aWF0ZSB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5LgotamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSAKLSAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLS8vIDJhLiBHZXQgdGhlIHN0eWxlc2hlZXQgZnJvbSB0aGUgWE1MIHNvdXJjZS4KLVN0cmluZyBtZWRpYSA9IG51bGwgLCB0aXRsZSA9IG51bGwsIGNoYXJzZXQgPSBudWxsOwotamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2Ugc3R5bGVzaGVldCA9IHRGYWN0b3J5LmdldEFzc29jaWF0ZWRTdHlsZXNoZWV0Ci0gICAgICAgICAgICAgICAgICAgKG5ldyBTdHJlYW1Tb3VyY2UoImZvby54bWwiKSxtZWRpYSwgdGl0bGUsIGNoYXJzZXQpOwotCi0vLyAyYi4gUHJvY2VzcyB0aGUgc3R5bGVzaGVldCBhbmQgZ2VuZXJhdGUgYSBUcmFuc2Zvcm1lci4KLVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIoc3R5bGVzaGVldCk7Ci0KLS8vIDMuIFVzZSB0aGUgVHJhbnNmb3JtZXIgdG8gcGVyZm9ybSB0aGUgdHJhbnNmb3JtYXRpb24gYW5kIHNlbmQgdGhlCi0vLyAgICB0aGUgb3V0cHV0IHRvIGEgUmVzdWx0IG9iamVjdC4KLXRyYW5zZm9ybWVyLnRyYW5zZm9ybQotICAgICAgICAgICAgIChuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlKCJmb28ueG1sIiksCi0gICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQgKG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oImZvby5vdXQiKSkpOzwvc291cmNlPgotPHA+Rm9yIGEgc2FtcGxlIHRoYXQgdXNlcyB0aGlzIHRlY2huaXF1ZSwgc2VlIDxsaW5rIGlkcmVmPSJzYW1wbGVzIiBhbmNob3I9InVzZXN0eWxlc2hlZXRwaSI+VXNlU3R5bGVzaGVldFBJPC9saW5rPi48L3A+Ci08cD5Zb3UgY2FuIGFsc28gaW5zdHJ1Y3QgdGhlIDxsaW5rIGlkcmVmPSJjb21tYW5kbGluZSI+Y29tbWFuZC1saW5lIHV0aWxpdHk8L2xpbms+IHRvIHVzZSBzdHlsZXNoZWV0IHByb2Nlc3NpbmcKLWluc3RydWN0aW9uczo8L3A+Ci08b2w+Ci0gIDxsaT5JbmNsdWRlIHRoZSA8Y29kZT4taW48L2NvZGU+IGZsYWcgd2l0aCBhbiBYTUwgc291cmNlIHRoYXQgY29udGFpbnMgYSBzdHlsZXNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5EbyBub3QgaW5jbHVkZSB0aGUgPGNvZGU+LXhzbDwvY29kZT4gZmxhZy48L2xpPgotPC9vbD4KLTwvczI+PGFuY2hvciBuYW1lPSJzZXJpYWxpemUiLz4KLTxzMiB0aXRsZT0iU2VyaWFsaXppbmcgb3V0cHV0Ij4KLTxwPkluIHNvbWUgY2FzZXMsIHlvdSBtYXkgd2FudCB0byAidHJhbnNmb3JtIiBhIERPTSB0cmVlIGludG8gYSBzdHJlYW0sIHdoaWNoIHRoZSBYTUwgY29tbXVuaXR5IGNhbGxzIHNlcmlhbGl6YXRpb24uIDxyZXNvdXJjZS1yZWYgaWRyZWY9InRyYXgiLz4gYW5kIHRoZSAmeHNsdDRqOyBUcmFuc2Zvcm1lciBpbXBsZW1lbnRhdGlvbiBwcm92aWRlIGRpcmVjdCBzdXBwb3J0IGZvciB0aGlzIG9wZXJhdGlvbi4gU2ltcGx5IHVzZSB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IG5ld1RyYW5zZm9ybWVyKCkgbWV0aG9kIChubyBhcmd1bWVudHMpIHRvIGNyZWF0ZSBhIFRyYW5zZm9ybWVyIHRoYXQgeW91IGNhbiB1c2UgdG8gImNvcHkiIGEgRE9NU291cmNlIHRvIGEgU3RyZWFtUmVzdWx0LiBGb3IgZXhhbXBsZXMsIHNlZSBFeGFtcGxlcy5leGFtcGxlRE9NMkRPTSgpLCBFeGFtcGxlcy5leGFtcGxlU2VyaWFsaXplTm9kZSgpLCBhbmQgRXhhbXBsZXMuZXhhbXBsZUFzU2VyaWFsaXplcigpIGluIHRoZSA8bGluayBpZHJlZj0ic2FtcGxlcyIgYW5jaG9yPSJ0cmF4Ij50cmF4IHNhbXBsZTwvbGluaz4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9InBhcmFtcyIvPgotPHMyIHRpdGxlPSJTZXR0aW5nIHN0eWxlc2hlZXQgcGFyYW1ldGVycyI+Ci08cD5BbiBYU0xUIHN0eWxlc2hlZXQgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyB0aGF0IGFyZSBzZXQgYXQgcnVuIHRpbWUgZWFjaCB0aW1lIGEgdHJhbnNmb3JtYXRpb24gaXMgcGVyZm9ybWVkLiBUbyBzZXQgYSBzdHlsZXNoZWV0IHBhcmFtZXRlciwgdXNlIHRoZSBUcmFuc2Zvcm1lciAKLTxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lci5odG1sI3NldFBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nLGphdmEubGFuZy5PYmplY3QpIj5zZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSk8L2p1bXA+IG1ldGhvZC4gRm9yIGEgd29ya2luZyBleGFtcGxlLCBzZWUgVXNlU3R5bGVzaGVldFBhcmFtLmphdmEgaW4gdGhlIHNhbXBsZXMvVXNlU3R5bGVzaGVldFBhcmFtIHN1YmRpcmVjdG9yeS48L3A+Ci08cD5Zb3UgY2FuIGFsc28gc2V0IGEgcGFyYW1ldGVyIHdpdGggdGhlIGNvbW1hbmQtbGluZSB1dGlsaXR5IGJ5IGluY2x1ZGluZyB0aGUgPGNvZGU+LXBhcmFtPC9jb2RlPiBmbGFnLiBGb3IgZXhhbXBsZTo8L3A+Ci08cD48Y29kZT5qYXZhIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIC1pbiBmb28ueG1sIC14c2wgZm9vLnhzbCAtcGFyYW0gcGFyYW0xIGZvb2JhcjwvY29kZT48L3A+Ci08cD53aGVyZSA8Y29kZT5wYXJhbTwvY29kZT4gaXMgdGhlIHBhcmFtZXRlciBuYW1lIGFuZCA8Y29kZT5mb29iYXI8L2NvZGU+IGlzIHRoZSBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBwYXJhbWV0ZXIgbmFtZXNwYWNlIGlzIG51bGwuPC9wPgotPG5vdGU+JnhzbHQ0ajI7IHByb2Nlc3NlcyBzdHJpbmcgcGFyYW1ldGVycy4gWW91IGFyZSBubyBsb25nZXIgcmVxdWlyZWQgKGFzIHlvdSB3ZXJlIHdpdGggJnhzbHQ0ajsgdmVyc2lvbiAxKSB0byBlbmNsb3NlIHN0cmluZ3MgaW4gc2luZ2xlIAotcXVvdGVzICgnKSBhcyBzdHJpbmcgZXhwcmVzc2lvbnMuPC9ub3RlPgotPC9zMj48YW5jaG9yIG5hbWU9InNheCIvPgotPHMyIHRpdGxlPSJFeHBsaWNpdGx5IHdvcmtpbmcgd2l0aCBTQVgiPgotICA8cD4meHNsdDRqOyB1c2VzIHRoZSBTQVggZXZlbnQgbW9kZWwgdG8gcHJvY2VzcyBzdHlsZXNoZWV0cywgdG8gcGFyc2UgWE1MIGlucHV0IGRvY3VtZW50cywgYW5kIHRvIHByb2R1Y2Ugb3V0cHV0LiBGb3IgZWFjaCBvZiB0aGVzZSBvcGVyYXRpb25zLCBhbiBYTUxSZWFkZXIgcmVhZHMgaW5wdXQsIGZpcmluZyBwYXJzZSBldmVudHMsIGFuZCBhIENvbnRlbnRIYW5kbGVyIGxpc3RlbnMgdG8gdGhlIFhNTFJlYWRlciBhbmQgZXhlY3V0ZXMgcGFyc2UgZXZlbnQgbWV0aG9kcy48L3A+Ci08cD5XaGVuIHlvdSB1c2UgdGhlIGJhc2ljIHByb2NlZHVyZSBkZXNjcmliZWQgYWJvdmUgZm9yIHBlcmZvcm1pbmcgdHJhbnNmb3JtYXRpb25zLCAmeHNsdDRqOyB0YWtlcyBjYXJlIG9mIG1hbnkgb2YgdGhlIFNBWCBkZXRhaWxzIHVuZGVyIHRoZSBjb3ZlcnMuIFlvdSBhcmUgZnJlZSB0byBtYWtlIHRoZXNlIGRldGFpbHMgZXhwbGljaXQsIHdoaWNoIHNpbXBseSBtZWFucyB0aGF0IHlvdSBjYW4gaW50ZXJ2ZW5lIGluIHRoZSBwcm9jZWR1cmUgdG8gYWNjb21tb2RhdGUgdGhlIHByZWNpc2UgZW52aXJvbm1lbnQgaW4gd2hpY2ggeW91ciBhcHBsaWNhdGlvbiBvcGVyYXRlcy48L3A+Ci08cD5TdXBwb3NlLCBmb3IgZXhhbXBsZSwgeW91IGFyZSB1c2luZyBhIGN1c3RvbSBYTUxSZWFkZXIsIHBlcmhhcHMgZG9pbmcgbW9yZSB0aGFuIGp1c3QgcGFyc2luZyBzdGF0aWMgWE1MIGRvY3VtZW50cykgdG8gZ2VuZXJhdGUgJnhzbHQ0ajsgU0FYIHBhcnNlIGV2ZW50cy4gWW91IG1pZ2h0IGV2ZW4gaGF2ZSBhIGN1c3RvbSByZWFkZXIgZm9yIHByb2R1Y2luZy9wcm9jZXNzaW5nIHN0eWxlc2hlZXRzLiBZb3UgY2FuIGNhc3QgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSB0byBhIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSwgd2hpY2ggcHJvdmlkZXMgYWNjZXNzIHRvIGEgVHJhbnNmb3JtZXJIYW5kbGVyLCB3aGljaCB5b3UgY2FuIHNldCBhcyB0aGUgQ29udGVudEhhbmRsZXIgZm9yIHRoaXMgcmVhZGVyLjwvcD4KLSAgPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIGV4cGxpY2l0bHkgc2V0cyB1cCB0aGUgWE1MUmVhZGVyIGFuZCBDb250ZW50SGFuZGxlcnMsIGFuZCByZXBsaWNhdGVzIHRoZSA8bGluayBhbmNob3I9ImJhc2ljIj5iYXNpYyBzdGVwczwvbGluaz4gZGVzY3JpYmVkIGFib3ZlLjwvcD4KLSAgPHNvdXJjZT4vLyBJbnN0YW50aWF0ZSBhIFRyYW5zZm9ybWVyRmFjdG9yeS4KLWphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gCi0gICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0vLyBWZXJpZnkgdGhhdCB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IGltcGxlbWVudGF0aW9uIHlvdSBhcmUgdXNpbmcKLS8vIHN1cHBvcnRzIFNBWCBpbnB1dCBhbmQgb3V0cHV0ICgmeHNsdDRqOyBkb2VzISkuCi1pZiAodEZhY3RvcnkuZ2V0RmVhdHVyZShqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2UuRkVBVFVSRSkgJmFtcDsmYW1wOyAKLSAgICB0RmFjdG9yeS5nZXRGZWF0dXJlKGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFJlc3VsdC5GRUFUVVJFKSkKLSAgeyAKLSAgICAvLyBDYXN0IHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgdG8gU0FYVHJhbnNmb3JtZXJGYWN0b3J5LgotICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFRyYW5zZm9ybWVyRmFjdG9yeSBzYXhURmFjdG9yeSA9IAotICAgICAgICAgICAgICAgICAgICgoamF2YXgueG1sLnRyYW5zZm9ybS5TQVhUcmFuc2Zvcm1lckZhY3RvcnkpIHRGYWN0b3J5KTsKLSAgICAvLyBDcmVhdGUgYSBUZW1wbGF0ZXMgQ29udGVudEhhbmRsZXIgdG8gaGFuZGxlIHBhcnNpbmcgb2YgdGhlIAotICAgIC8vIHN0eWxlc2hlZXQuCi0gICAgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVGVtcGxhdGVzSGFuZGxlciB0ZW1wbGF0ZXNIYW5kbGVyID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F4VEZhY3RvcnkubmV3VGVtcGxhdGVzSGFuZGxlcigpOwotCi0gICAgLy8gQ3JlYXRlIGFuIFhNTFJlYWRlciBhbmQgc2V0IGl0cyBDb250ZW50SGFuZGxlci4KLSAgICBvcmcueG1sLnNheC5YTUxSZWFkZXIgcmVhZGVyID0gCi0gICAgICAgICAgICAgICAgICAgb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigpOwotICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcih0ZW1wbGF0ZXNIYW5kbGVyKTsKLSAgICAKLSAgICAvLyBQYXJzZSB0aGUgc3R5bGVzaGVldC4gICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJlYWRlci5wYXJzZSgiZm9vLnhzbCIpOwotCi0gICAgLy8gR2V0IHRoZSBUZW1wbGF0ZXMgb2JqZWN0IChnZW5lcmF0ZWQgZHVyaW5nIHRoZSBwYXJzaW5nIG9mIHRoZSBzdHlsZXNoZWV0KQotICAgIC8vIGZyb20gdGhlIFRlbXBsYXRlc0hhbmRsZXIuCi0gICAgamF2YXgueG1sLnRyYW5zZm9ybS5UZW1wbGF0ZXMgdGVtcGxhdGVzID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXNIYW5kbGVyLmdldFRlbXBsYXRlcygpOwotICAgIC8vIENyZWF0ZSBhIFRyYW5zZm9ybWVyIENvbnRlbnRIYW5kbGVyIHRvIGhhbmRsZSBwYXJzaW5nIG9mIAotICAgIC8vIHRoZSBYTUwgU291cmNlLiAgCi0gICAgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyIHRyYW5zZm9ybWVySGFuZGxlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc2F4VEZhY3RvcnkubmV3VHJhbnNmb3JtZXJIYW5kbGVyKHRlbXBsYXRlcyk7Ci0gICAgLy8gUmVzZXQgdGhlIFhNTFJlYWRlcidzIENvbnRlbnRIYW5kbGVyIHRvIHRoZSBUcmFuc2Zvcm1lckhhbmRsZXIuCi0gICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRyYW5zZm9ybWVySGFuZGxlcik7Ci0KLSAgICAvLyBTZXQgdGhlIENvbnRlbnRIYW5kbGVyIHRvIGFsc28gZnVuY3Rpb24gYXMgYSBMZXhpY2FsSGFuZGxlciwgd2hpY2gKLSAgICAvLyBjYW4gcHJvY2VzcyAibGV4aWNhbCIgZXZlbnRzIChzdWNoIGFzIGNvbW1lbnRzIGFuZCBDREFUQSkuIAotICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lckhhbmRsZXIpOwotCi0gICAgLy8gU2V0IHVwIGEgU2VyaWFsaXplciB0byBzZXJpYWxpemUgdGhlIFJlc3VsdCB0byBhIGZpbGUuCi0gICAgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplciBzZXJpYWxpemVyID0gCi0gICAgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplckZhY3RvcnkuZ2V0U2VyaWFsaXplcgotICAgIChvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5PdXRwdXRQcm9wZXJ0aWVzLmdldERlZmF1bHRNZXRob2RQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ4bWwiKSk7Ci0gICAgc2VyaWFsaXplci5zZXRPdXRwdXRTdHJlYW0obmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSgiZm9vLm91dCIpKTsKLSAgICAvLyBUaGUgU2VyaWFsaXplciBmdW5jdGlvbnMgYXMgYSBTQVggQ29udGVudEhhbmRsZXIuCi0gICAgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQgcmVzdWx0ID0KLSAgICAgIG5ldyBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQoc2VyaWFsaXplci5hc0NvbnRlbnRIYW5kbGVyKCkpOwotICAgIHRyYW5zZm9ybWVySGFuZGxlci5zZXRSZXN1bHQocmVzdWx0KTsKLSAgICAgIAotICAgIC8vIFBhcnNlIHRoZSBYTUwgaW5wdXQgZG9jdW1lbnQuCi0gICAgcmVhZGVyLnBhcnNlKCJmb28ueG1sIik7PC9zb3VyY2U+Ci08L3MyPjxhbmNob3IgbmFtZT0ib3V0YXNpbiIvPgotPHMyIHRpdGxlPSJVc2luZyB0cmFuc2Zvcm1hdGlvbiBvdXRwdXQgYXMgaW5wdXQgZm9yIGFub3RoZXIgdHJhbnNmb3JtYXRpb24iPgotCi08cD5Zb3UgY2FuIGNoYWluIHRvZ2V0aGVyIGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9ucyBzdWNoIHRoYXQgdGhlIG91dHB1dCBvZiBlYWNoIHRyYW5zZm9ybWF0aW9uIHByb3ZpZGVzIGlucHV0IGZvciB0aGUgbmV4dCB0cmFuc2Zvcm1hdGlvbi4gJnhzbHQ0ajsgc3VwcG9ydHMgdHdvIGJhc2ljIHN0cmF0ZWdpZXMgZm9yIGNoYWluaW5nIGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9uczo8L3A+Ci08dWw+Ci0gIDxsaT5Vc2UgdGhlIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSB0byBwcm9jZXNzIHRoZSBzdHlsZXNoZWV0IGFuZCBjcmVhdGUgYSBUcmFuc2Zvcm1lckhhbmRsZXIgZm9yIGVhY2ggdHJhbnNmb3JtYXRpb24uIFRoZW4geW91IGNhbiBzZXQKLXRoZSBmaXJzdCBUcmFuc2Zvcm1lckhhbmRsZXIgYXMgdGhlIENvbnRlbnRIYW5kbGVyIGZvciB0aGUgWE1MUmVhZGVyIHRoYXQgcGFyc2VzIHRoZSBpbnB1dCwgbWFrZSB0aGUgc2Vjb25kIFRyYW5zZm9ybWVySGFuZGxlciB0aGUgQ29udGVudEhhbmRsZXIgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIGZpcnN0IFRyYW5zZm9ybWVySGFuZGxlciwgYW5kIHNvIG9uLiBGb3IgbW9yZSBkZXRhaWwgYW5kIGFuIGV4YW1wbGUsIHNlZSB0aGUgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0icGlwZSI+UGlwZTwvbGluaz4gc2FtcGxlLjxici8+PGJyLz48L2xpPgotICA8bGk+VXNlIHRoZSBTQVhUcmFuc2Zvcm1lckZhY3RvcnkgdG8gcHJvY2VzcyB0aGUgc3R5bGVzaGVldCBhbmQgY3JlYXRlIGEgU0FYIFhNTEZpbHRlciBmb3IgZWFjaCB0cmFuc2Zvcm1hdGlvbi4gU2V0IGFuIFhNTFJlYWRlciBhcyB0aGUgcGFyZW50IG9mIHRoZSBmaXJzdCBYTUxGaWx0ZXIsIHRoZSBmaXJzdCBYTUxGaWx0ZXIgYXMgdGhlIHBhcmVudCBvZiB0aGUgc2Vjb25kIFhNTEZpbHRlciwgYW5kIHNvIG9uLiBZb3UgbGF1bmNoIHRoZSBzZXJpZXMgb2YgdHJhbnNmb3JtYXRpb25zIGJ5IGluc3RydWN0aW5nIHRoZSBsYXN0IFhNTEZpbHRlciB0byBwYXJzZSB0aGUgWE1MIFNvdXJjZSBmb3IgdGhlIGZpcnN0IHRyYW5zZm9ybWF0aW9uLiBGb3IgbW9yZSBkZXRhaWwgYW5kIGFuIGV4YW1wbGUsIHNlZSB0aGUgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0idXNleG1sZmlsdGVycyI+VXNlWE1MRmlsdGVyczwvbGluaz4gc2FtcGxlLjwvbGk+Ci08L3VsPgotPC9zMj48YW5jaG9yIG5hbWU9ImRvbSIvPgotPHMyIHRpdGxlPSJQcm9jZXNzaW5nIGFuZCBwcm9kdWNpbmcgRE9NIHRyZWVzIj4KLSAgPHA+SW4gc29tZSBjYXNlcywgdGhlIGlucHV0IGFuZC9vciBkZXNpcmVkIG91dHB1dCBmb3IgYSB0cmFuc2Zvcm1hdGlvbiBtYXkgYmUgYSBET00gdHJlZSBvYmplY3QuIFRoZSBqYXZheC54bWwudHJhbnNmb3JtLkRPTSBwYWNrYWdlIHByb3ZpZGVzIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9kb20vRE9NU291cmNlLmh0bWwiPkRPTVNvdXJjZTwvanVtcD4gYW5kIGEgPGp1bXAgaHJlZj0iYXBpZG9jcy9qYXZheC94bWwvdHJhbnNmb3JtL2RvbS9ET01SZXN1bHQuaHRtbCI+RE9NUmVzdWx0PC9qdW1wPiwgZWl0aGVyIG9yIGJvdGggb2Ygd2hpY2ggeW91IGNhbiB1c2Ugd2hlbiB5b3UgcGVyZm9ybSBhIHRyYW5zZm9ybWF0aW9uLjwvcD4KLTxwPkluIHNvbWUgY2FzZXMsIHlvdXIgYXBwbGljYXRpb24gcHJvdmlkZXMgaW5wdXQgaW4gdGhlIGZvcm0gb2YgYSBET00gdHJlZSwgd2hpY2ggYWNjZWxlcmF0ZXMgdGhlIHRyYW5zZm9ybWF0aW9uIHByb2Nlc3MsIHNpbmNlIHRoZSBpbnB1dCBoYXMgaW4gZWZmZWN0IGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuIFRvIHByb2R1Y2UgRE9NIGlucHV0IGZyb20gYSBzdHJlYW0sIHlvdSBjYW4gdXNlIGEgPGp1bXAgaHJlZj0iYXBpZG9jcy9qYXZheC94bWwvcGFyc2Vycy9Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lmh0bWwiPkRvY3VtZW50QnVpbGRlckZhY3Rvcnk8L2p1bXA+IHRvIHByb2R1Y2UgYSA8anVtcCBocmVmPSJhcGlkb2NzL2phdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlci5odG1sIj5Eb2N1bWVudEJ1aWxkZXI8L2p1bXA+IHdpdGggd2hpY2ggeW91IGNhbiBwYXJzZSB0aGUgWE1MIGlucHV0IGludG8gYSBET00gRG9jdW1lbnQsIGFzIGlsbHVzdHJhdGVkIGJlbG93LjwvcD4KLTxzb3VyY2U+Ly8gSW5zdGFudGlhdGUgYSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5LgotamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkZmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLS8vIFVzZSB0aGUgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSB0byBwcm92aWRlIGFjY2VzcyB0byBhIERvY3VtZW50QnVpbGRlci4KLWphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkQnVpbGRlciA9IGRmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotLy8gVXNlIHRoZSBEb2N1bWVudEJ1aWxkZXIgdG8gcGFyc2UgdGhlIFhNTCBpbnB1dC4KLW9yZy53M2MuZG9tLkRvY3VtZW50IGluRG9jID0gZEJ1aWxkZXIuUGFyc2UoImZvby54bWwiKTs8L3NvdXJjZT4KLTxwPlRvIHByb2R1Y2UgRE9NIG91dHB1dCwgc2ltcGx5IHVzZSBhIFRyYW5zZm9ybWVyIHRvIHRyYW5zZm9ybSB0byBhIERPTVJlc3VsdCBvYmplY3QuPC9wPgotPHNvdXJjZT4vLyBHZW5lcmF0ZSBhIFRyYW5zZm9ybWVyLgotamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyCi0gICAgICAgICAgICAgICAgICAobmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uU3RyZWFtLlN0cmVhbVNvdXJjZSgiZm9vLnhzbCIpKTsKLS8vIENyZWF0ZSBhbiBlbXB5IERPTVJlc3VsdCBvYmplY3QgZm9yIHRoZSBvdXRwdXQuCi1qYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01SZXN1bHQgZG9tUmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdCgpOwotLy8gUGVyZm9ybSB0aGUgdHJhbnNmb3JtYXRpb24uCi10cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZShpbkRvYykKLSAgICAgICAgICAgICAgICAgICAgICBkb21SZXN1bHQ7Ci0vLyBOb3cgeW91IGNhbiBnZXQgdGhlIG91dHB1dCBOb2RlIGZyb20gdGhlIERPTVJlc3VsdC4KLW9yZy53M2MuZG9tLk5vZGUgbm9kZSA9IGRvbVJlc3VsdC5nZXROb2RlKCk7PC9zb3VyY2U+Ci08bm90ZT5DcmVhdGUgYSBuZXcgRE9NUmVzdWx0IG9iamVjdCBvciB1c2UgRE9NUmVzdWx0LnNldE5vZGUoKSB0byBhc3NpZ24gYSBuZXcgY29udGFpbmVyIGVhY2ggdGltZSB5b3Ugd2FudCB0byBwZXJmb3JtIGEgdHJhbnNmb3JtYXRpb24gCi1hbmQgcGxhY2UgdGhlIG91dHB1dCBpbiBhIERPTVJlc3VsdCBvYmplY3QuPC9ub3RlPgotPHA+VGhlIDxsaW5rIGlkcmVmPSJzYW1wbGVzIiBhbmNob3I9ImRvbTJkb20iPkRPTTJET008L2xpbms+IGlsbHVzdHJhdGVzIGJvdGggcHJvY2VkdXJlcywgYW5kIHNlcmlhbGl6ZXMgdGhlIERPTVJlc3VsdCB0byBTeXN0ZW0ub3V0LjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJ4cGF0aCIvPgotPHMyIHRpdGxlPSJXb3JraW5nIHdpdGggWFBhdGggZXhwcmVzc2lvbnMiPgotPHA+WFNMVCBzdHlsZXNoZWV0cyB1c2UgWFBhdGggZXhwcmVzc2lvbnMgdG8gc2VsZWN0IG5vZGVzLCBzcGVjaWZ5IGNvbmRpdGlvbnMsIGFuZCBnZW5lcmF0ZSB0ZXh0IGZvciB0aGUgcmVzdWx0IHRyZWUuIFhQYXRoIHByb3ZpZGVzIGFuIEFQSSB0aGF0IHlvdSBjYW4gY2FsbCBkaXJlY3RseS4gRm9yIGV4YW1wbGUsIHlvdSBtYXkgd2FudCB0byBzZWxlY3Qgbm9kZXMgcHJvZ3JhbW1hdGljYWxseSBhbmQgZG8geW91ciBvd24gcHJvY2Vzc2luZyB3aXRob3V0IGEgc3R5bGVzaGVldC48L3A+Ci08cD5YUGF0aCBpcyBhbiBpbmRlcGVuZGVudCBlbnRpdHksIHdpdGggY2xpZW50cyBvdGhlciB0aGFuIFhTTFQgcHJvY2Vzc29ycyAoc3VjaCBhcyBYUG9pbnRlcikuIEFjY29yZGluZ2x5LCAmeHNsdDRqMjsgaGFzIHBhY2thZ2VkIFhQYXRoIGFzIGEgc2VwYXJhdGUgbW9kdWxlIChvcmcuYXBhY2hlLnhwYXRoIGFuZCBpdHMgc3VicGFja2FnZXMpLCBhbHRob3VnaCBjb25jdXJyZW50bHkgdGhpcyBtb2R1bGUgZG9lcyB1c2Ugc29tZSB1dGlsaXR5IGNsYXNzZXMgcGFja2FnZWQgaW4gb3JnLmFwYWNoZS54YWxhbi51dGlscy4gVGhlIG9yZy5hcGFjaGUueHBhdGguWFBhdGhBUEkgY2xhc3MgY29udGFpbnMgY29udmVuaWVuY2UgbWV0aG9kcyB0aGF0IHlvdSBjYW4gdXNlIHRvIHJldHVybiBzaW5nbGUgRE9NIE5vZGVzLCBOb2RlSXRlcmF0b3JzLCBhbmQgWE9iamVjdHMuIEFwYXJ0IGZyb20gdGhlaXIgb3duIGZ1bmN0aW9uYWxpdHksIHRoZXNlIG1ldGhvZHMgYWxzbyBwcm92aWRlIGEgcGF0aCBpbnRvIHRoZSBsb3dlci1sZXZlbCBYUGF0aCBBUEkgdGhhdCB5b3UgbWF5IGZpbmQgdXNlZnVsLjwvcD4KLTxwPkZvciBhbiBleGFtcGxlIHRoYXQgdXNlcyB0aGUgWFBhdGhBUEkgY29udmVuaWVuY2UgbWV0aG9kcyB0byBleGVjdXRlIFhQYXRoIGV4cHJlc3Npb25zIGFnYWluc3QgWE1MIHNvdXJjZSBmaWxlcywgc2VlIDxsaW5rIGlkcmVmPSJzYW1wbGVzIiBhbmNob3I9ImFwcGx5eHBhdGgiPkFwcGx5WFBhdGg8L2xpbms+LjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJhcHBsZXQiLz4KLTxzMiB0aXRsZT0iVXNpbmcgdGhlICZ4c2x0NGo7IGFwcGxldCB3cmFwcGVyIj4KLTxvbD4gCi08bGk+SW5jbHVkZSA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vY2xpZW50L1hTTFRQcm9jZXNzb3JBcHBsZXQuaHRtbCI+WFNMVFByb2Nlc3NvckFwcGxldDwvanVtcD4gaW4gYW4gSFRNTCBjbGllbnQuPGJyLz48YnIvPjwvbGk+Ci08bGk+U3BlY2lmeSB0aGUgWE1MIHNvdXJjZSBkb2N1bWVudCBhbmQgWFNMIHN0eWxlc2hlZXQuPGJyLz48YnIvPgotWW91IGNhbiB1c2UgdGhlIERvY3VtZW50VVJMIGFuZCBTdHlsZVVSTCBQQVJBTSB0YWdzIG9yIHRoZSA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vY2xpZW50L1hTTFRQcm9jZXNzb3JBcHBsZXQuaHRtbCNzZXREb2N1bWVudFVSTChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0ZG9jdW1lbnRVUkwoKTwvanVtcD4gYW5kIDxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9jbGllbnQvWFNMVFByb2Nlc3NvckFwcGxldC5odG1sI3NldFN0eWxlVVJMKGphdmEubGFuZy5TdHJpbmcpIj5zZXRTdHlsZVVSTCgpPC9qdW1wPiBtZXRob2RzLiBJZiB0aGUgWE1MIGRvY3VtZW50IGNvbnRhaW5zIGEgc3R5bGVzaGVldCBQcm9jZXNzaW5nIEluc3RydWN0aW9uIChQSSksIHlvdSBkbyBub3QgbmVlZCB0byBzcGVjaWZ5IGFuIFhTTCBzdHlsZXNoZWV0Ljxici8+PGJyLz48L2xpPgotPGxpPkNhbGwgdGhlIDxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9jbGllbnQvWFNMVFByb2Nlc3NvckFwcGxldC5odG1sI3RyYW5zZm9ybVRvSHRtbChqYXZhLmxhbmcuU3RyaW5nLGphdmEubGFuZy5TdHJpbmcpIj50cmFuc2Zvcm1Ub0h0bWwoKTwvanVtcD4gb3IgPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL2NsaWVudC9YU0xUUHJvY2Vzc29yQXBwbGV0Lmh0bWwjZ2V0SHRtbFRleHQoKSI+Z2V0SHRtbFRleHQoKTwvanVtcD4gbWV0aG9kLCB3aGljaCBwZXJmb3JtcyB0aGUgdHJhbnNmb3JtYXRpb24gYW5kIHJldHVybnMgdGhlIG5ldyBkb2N1bWVudCBhcyBhIFN0cmluZy48L2xpPjwvb2w+Ci08bm90ZT5UaGUgdHJhbnNmb3JtVG9IVE1MKCkgbWV0aG9kIHRha2VzIGFyZ3VtZW50cyBmb3IgdGhlIFhNTCBzb3VyY2UgZG9jdW1lbnQgYW5kIFhTTCBzdHlsZXNoZWV0LiBUaGUgZ2V0SHRtbFRleHQoKSBtZXRob2QgdGFrZXMgbm8gYXJndW1lbnRzOiBpdCB1c2VzIHByb3BlcnR5IG9yIHBhcmFtZXRlciBzZXR0aW5ncywgYXMgaW4gdGhlIGV4YW1wbGUgYmVsb3cuPC9ub3RlPgotPHA+Rm9yIGFuIGV4YW1wbGUsIHNlZSB0aGUgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0iYXBwbGV0eG1sdG9odG1sIj5BcHBsZXRYTUx0b0hUTUw8L2xpbms+IHNhbXBsZSBhcHBsZXQuIFRoZSAmbHQ7YXBwbGV0Jmd0OyB0YWcgaXMgaW4gc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvY2xpZW50Lmh0bWw6PC9wPgotPHNvdXJjZT4mbHQ7YXBwbGV0ICAKLSAgICBuYW1lPSJ4c2xDb250cm9sIgotICAgIGNvZGU9Im9yZy5hcGFjaGUueGFsYW4uY2xpZW50LlhTTFRQcm9jZXNzb3JBcHBsZXQuY2xhc3MiCi0gICAgYXJjaGl2ZT0iLi4vLi4vYmluL3hhbGFuLmphciwuLi8uLi9iaW4veGVyY2VzLmphciIKLSAgICBoZWlnaHQ9IjAiCi0gICAgd2lkdGgiMCI+Ci0gICAgJmx0O3BhcmFtIG5hbWU9ImRvY3VtZW50VVJMIiB2YWx1ZT0ieGFsYW5BcHBsZXRzLnhtbCIvJmd0OwotICAgICZsdDtwYXJhbSBuYW1lPSJzdHlsZVVSTCIgdmFsdWU9InMxVG9IVE1MLnhzbCIvJmd0OwotJmx0Oy9hcHBsZXQmZ3Q7PC9zb3VyY2U+Ci08cD5XaGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgVHJhbnNmb3JtIGJ1dHRvbiwgdGhlIEhUTUwgY2xpZW50IGNhbGxzIHRoZSBnZXRIdG1sVGV4dCgpIG1ldGhvZCwgYW5kIHB1dHMgdGhlIHJldHVybmVkIEhUTUwgdGV4dCBpbiBhIGZyYW1lIGZvciB0aGUgdXNlciB0byB2aWV3LjwvcD4KLQotPC9zMj48YW5jaG9yIG5hbWU9InNlcnZsZXQiLz4KLTxzMiB0aXRsZT0iVXNpbmcgJnhzbHQ0ajsgaW4gYSBzZXJ2bGV0Ij4KLTxwPllvdSBjYW4gc2V0IHVwIGEgc2VydmxldCB0byB1c2UgJnhzbHQ0ajsgdG8gcmVzcG9uZCB0byByZXF1ZXN0cyBmb3IgWE1MIGRvY3VtZW50cyBieSB0cmFuc2Zvcm1pbmcgdGhvc2UgZG9jdW1lbnRzIGludG8gSFRNTCBhbmQgc2VydmluZyB0aGVtIHRvIHdlYiBicm93c2Vycy4gVG8gcmVzcG9uZCB0byBIVFRQIEdFVCByZXF1ZXN0cywgYWxsIHlvdSBuZWVkIHRvIGRvIGlzIG92ZXJ3cml0ZSB0aGUgSHR0cFNlcnZsZXQgZG9HZXQoKSBtZXRob2Qgd2l0aCBhIHByb2NlZHVyZSB0aGF0IGluc3RhbnRpYXRlcyBhIFRyYW5zZm9ybWVyIGFuZCB1c2VzIGl0IHRvIHBlcmZvcm0gYSB0cmFuc2Zvcm1hdGlvbi4gQXMgdGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzLCB5b3UgY2FuIGdlbmVyYXRlIGEgUmVzdWx0U3RyZWFtIHRoYXQgYSBQcmludFdyaXRlciB3cml0ZXMgdG8gdGhlIEh0dHBSZXNwb25zZSBPdXRwdXRTdHJlYW0sIHJldHVybmluZyB0aGUgdHJhbnNmb3JtYXRpb24gb3V0cHV0IHRvIHRoZSB3ZWIgYnJvd3Nlci48L3A+Ci08c291cmNlPgotcHVibGljIGNsYXNzIFNhbXBsZVhTTFRTZXJ2bGV0IGV4dGVuZHMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0IHsKLSAgCi0gIC8vIFJlc3BvbmQgdG8gSFRUUCBHRVQgcmVxdWVzdHMgZnJvbSBicm93c2Vycy4KLSAgcHVibGljIHZvaWQgZG9HZXQgKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgIHRocm93cyBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgewotICAgIC8vIE91dHB1dCBnb2VzIGluIHRoZSByZXNwb25zZSBzdHJlYW0uCi0gICAgamF2YS5pby5QcmludFdyaXRlciBvdXQgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YS5pby5QcmludFdyaXRlcihyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgLy8gU2V0IGNvbnRlbnQgdHlwZSBmb3IgSFRNTC4KLSAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7ICAgIAotICAgIHRyeQotICAgIHsJCi0gICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IAotICAgICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAvLyBHZXQgdGhlIFhNTCBpbnB1dCBkb2N1bWVudCBhbmQgdGhlIHN0eWxlc2hlZXQsIGJvdGggaW4gdGhlIHNlcnZsZXQKLSAgICAgIC8vIGVuZ2luZSBkb2N1bWVudCBkaXJlY3RvcnkuCi0gICAgICBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSB4bWxTb3VyY2UgPSAKLSAgICAgICAgICAgICAgICBuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgamF2YS5uZXQuVVJMKCJmaWxlOmZvby54bWwiKS5vcGVuU3RyZWFtKCkpOwotICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UgeHNsU291cmNlID0gCi0gICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IGphdmEubmV0LlVSTCgiZmlsZTpmb28ueHNsIikub3BlblN0cmVhbSgpKTsKLSAgICAgIC8vIEdlbmVyYXRlIHRoZSB0cmFuc2Zvcm1lci4KLSAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIoeHNsU291cmNlKTsKLSAgICAgIC8vIFBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uLCBzZW5kaW5nIHRoZSBvdXRwdXQgdG8gdGhlIHJlc3BvbnNlLgotICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHhtbFNvdXJjZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0KG91dCkpOwotICAgIH0KLSAgICAvLyBJZiBhbiBFeGNlcHRpb24gb2NjdXJzLCByZXR1cm4gdGhlIGVycm9yIHRvIHRoZSBjbGllbnQuCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG91dC53cml0ZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZShvdXQpOyAgICAKLSAgICB9Ci0gICAgLy8gQ2xvc2UgdGhlIFByaW50V3JpdGVyLgotICAgIG91dC5jbG9zZSgpOwotICB9ICAKLX08L3NvdXJjZT4KLTxwPkZvciBhIHdvcmtpbmcgc2FtcGxlLCBzZWUgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0ic2ltcGxleHNsdHNlcnZsZXQiPlNpbXBsZVhTTFRTZXJ2bGV0PC9saW5rPi48L3A+Ci08cD5JbiB0aGUgcHJlY2VkaW5nIGV4YW1wbGUsIHRoZSBVUkxzIGZvciB0aGUgWE1MIGRvY3VtZW50IGFuZCBYU0wgc3R5bGVzaGVldCBhcmUgaGFyZGNvZGVkIGluIHRoZSBzZXJ2bGV0LiBZb3UgY2FuIGFsc28gY3JlYXRlIGEgc2VydmxldCB0aGF0IHBhcnNlcyB0aGUgcmVxdWVzdCBVUkwgZm9yIGlucHV0IHBhcmFtZXRlcnMgc3BlY2lmeWluZyB0aGUgWE1MIGRvY3VtZW50LCBYU0wgc3R5bGVzaGVldCwgYW5kIGFueSByZWxldmFudCBzdHlsZXNoZWV0IHBhcmFtZXRlcnMuIEZvciBzYW1wbGVzLCBzZWUgPGxpbmsgaWRyZWY9InNhbXBsZXMiCi1hbmNob3I9InVzZXN0eWxlc2hlZXRwYXJhbXNlcnZsZXQiPlVzZVN0eWxlc2hlZXRQYXJhbVNlcnZsZXQ8L2xpbms+IGFuZCA8bGluayBpZHJlZj0ic2FtcGxlcyIgYW5jaG9yPSJ4c2x0c2VydmxldHdpdGhwYXJhbXMiPlhTTFRTZXJ2bGV0V2l0aFBhcmFtczwvbGluaz4uIEZvciBhIG1vcmUgcm9idXN0IGFuZCBjb21wbGV4IHNhbXBsZSB0aGF0IGFsc28gZW1wbG95cyBhIHByb3BlcnRpZXMgZmlsZSB0byBkZXRlcm1pbmUgd2hpY2ggc3R5bGVzaGVldCB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBjbGllbnQgYnJvd3Nlci9kZXZpY2UsIHNlZSA8bGluayBpZHJlZj0ic2FtcGxlcyIgYW5jaG9yPSJhcHBseXhzbHQiPkFwcGx5WFNMVDwvbGluaz4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImV4dGVuc2lvbnMiLz4KLTxzMiB0aXRsZT0iQ3JlYXRpbmcgYW5kIHVzaW5nIGV4dGVuc2lvbnMiPgotPHA+Rm9yIHRob3NlIGNhc2VzIHdoZXJlIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gY2FsbCBwcm9jZWR1cmFsIGNvZGUgZnJvbSB3aXRoaW4gYSBzdHlsZXNoZWV0LCB0aGUgJnhzbHQ0ajsgRXh0ZW5zaW9ucyBmYWNpbGl0eSBzdXBwb3J0cyB0aGUgY3JlYXRpb24gb2YgZXh0ZW5zaW9uIGVsZW1lbnRzIGFuZCBleHRlbnNpb24gZnVuY3Rpb25zLiBTZWUgPGxpbmsgaWRyZWY9ImV4dGVuc2lvbnMiPkV4dGVuc2lvbnM8L2xpbms+IGFuZCA8bGluayBpZHJlZj0ic2FtcGxlcyIgYW5jaG9yPSJleHRlbnNpb25zIj5FeHRlbnNpb25zIHNhbXBsZXM8L2xpbms+LjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJtdWx0aXRocmVhZGluZyIvPgotPHMyIHRpdGxlPSJNdWx0aXRocmVhZGluZyI+Ci08cD5BIGdpdmVuIFRlbXBsYXRlcyBvYmplY3QgbWF5IGJlIHVzZWQgcmVwZWF0ZWRseSBhbmQgZXZlbiBpbiBtdWx0aXBsZSB0aHJlYWRzIHJ1bm5pbmcgY29uY3VycmVudGx5IGZvciB0aGUgdHJhbnNmb3JtYXRpb24gb2YgWE1MIGlucHV0LCBidXQgeW91IHNob3VsZCB1c2UgdGhlIFRlbXBsYXRlcyBvYmplY3QgdG8gaW5zdGFudGlhdGUgYSBzZXBhcmF0ZSBUcmFuc2Zvcm1lciBmb3IgZWFjaCB0cmFuc2Zvcm1hdGlvbiB5b3UgcGVyZm9ybS4gVGhlIFRlbXBsYXRlcyBvYmplY3QgaXMgYW4gaW1tdXRhYmxlIHJ1bnRpbWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgY29udGVudCBvZiBhIHN0eWxlc2hlZXQgKHdoaWNoIG1heSBpbmNsdWRlIGFuZCBpbXBvcnQgbXVsdGlwbGUgc3R5bGVzaGVldCBzb3VyY2VzKS4gQSBUcmFuc2Zvcm1lciwgb24gdGhlIG90aGVyIGhhbmQsIGlzIGEgbGlnaHR3ZWlnaHQgb2JqZWN0IHRoYXQgdHJhY2tzIHN0YXRlIGluZm9ybWF0aW9uIGR1cmluZyB0aGUgdHJhbnNmb3JtYXRpb24sIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIHRvIHBlcmZvcm0gYSBzaW5nbGUgdHJhbnNmb3JtYXRpb24uPC9wPgotCi08cD5JZiB5b3Ugd2FudCB0byBwZXJmb3JtIG11bHRpcGxlIHRyYW5zZm9ybWF0aW9ucyAoc2VxdWVudGlhbGx5IG9yIGNvbmN1cnJlbnRseSkgd2l0aCB0aGUgc2FtZSBzdHlsZXNoZWV0IGluc3RydWN0aW9ucywgZG8gdGhlIGZvbGxvd2luZzo8L3A+Ci08b2w+Ci0gIDxsaT5Vc2UgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSA8anVtcCBocmVmPSJhcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vVHJhbnNmb3JtZXJGYWN0b3J5Lmh0bWwjbmV3VGVtcGxhdGVzKGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlKSI+bmV3VGVtcGxhdGVzKFNvdXJjZSB4c2xTb3VyY2UpPC9qdW1wPiBtZXRob2QgdG8gY3JlYXRlIGEgVGVtcGxhdGVzIG9iamVjdC48YnIvPjxici8+PC9saT4KLTxsaT5Gb3IgZWFjaCB0cmFuc2Zvcm1hdGlvbiwgdXNlIHRoZSBUZW1wbGF0ZXMgb2JqZWN0IDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UZW1wbGF0ZXMuaHRtbCNuZXdUcmFuc2Zvcm1lcigpIj5uZXdUcmFuc2Zvcm1lcigpPC9qdW1wPiBtZXRob2QgdG8gY3JlYXRlIGEgVHJhbnNmb3JtZXIsIGFuZCB1c2UgdGhhdCBUcmFuc2Zvcm1lcidzIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lci5odG1sI3RyYW5zZm9ybShqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSwgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQpIj50cmFuc2Zvcm0oU291cmNlIHhtbFNvdXJjZSwgUmVzdWx0IHRyYW5zZm9ybVJlc3VsdCk8L2p1bXA+IG1ldGhvZCB0byBwZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbi48L2xpPgotPC9vbD4KLTxwPkZvciBhbiBleGFtcGxlLCBzZWUgRXhhbXBsZXMuZXhhbXBsZVVzZVRlbXBsYXRlc09iaigpIGluIHRoZSA8bGluayBpZHJlZj0ic2FtcGxlcyIgYW5jaG9yPSJ0cmF4Ij50cmF4IHNhbXBsZTwvbGluaz4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImRlYnVnZ2luZyIvPgotPHMyIHRpdGxlPSJEZWJ1Z2dlciBJbnRlcmZhY2UiPgotCQk8cD4meHNsdDRqOyBjb250YWlucyBhIGRlYnVnZ2VyIGludGVyZmFjZSBpbiB0aGUgb3JnLmFwYWNoZS54YWxhbi54c2x0LnRyYWNlIHBhY2thZ2U6PC9wPiAKLQkJPHVsPgotCQkgIDxsaT48anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdHJhY2UvVHJhY2VMaXN0ZW5lci5odG1sIj5UcmFjZUxpc3RlbmVyPC9qdW1wPiBpcyBhbiBpbnRlcmZhY2UgdGhhdCBkZWJ1Z2dlcnMgCi0JCSAgY2FuIGltcGxlbWVudC4gT3IsIGxpa2UgdGhlIDxsaW5rIGlkcmVmPSJjb21tYW5kbGluZSI+Y29tbWFuZC1saW5lIHV0aWxpdHk8L2xpbms+LCB5b3UgY2FuIHVzZSB0aGUgPGp1bXAKLSAgICAgIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90cmFjZS9QcmludFRyYWNlTGlzdGVuZXIuaHRtbCI+UHJpbnRUcmFjZUxpc3RlbmVyPC9qdW1wPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGF0IGludGVyZmFjZS4KLSAgICAgIDxici8+PGJyLz48L2xpPgotICAgICAgPGxpPllvdSBjYW4gcmVnaXN0ZXIgYSBUcmFjZUxpc3RlbmVyIHdpdGggdGhlIAotICAgICAgPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RyYWNlL1RyYWNlTWFuYWdlci5odG1sIj5UcmFjZU1hbmFnZXI8L2p1bXA+IGFzc29jaWF0ZWQKLSAgICAgIHdpdGggdGhlIFRyYW5zZm9ybWVyIHRoYXQgd2lsbCBwZXJmb3JtIGEgZ2l2ZW4gdHJhbnNmb3JtYXRpb24uPGJyLz48YnIvPjwvbGk+Ci0JCSAgPGxpPjxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90cmFjZS9UcmFjZXJFdmVudC5odG1sIj5UcmFjZXJFdmVudDwvanVtcD4gaXMgYW4gZXZlbnQgdGhhdCBpcyAKLQkJICBwYXNzZWQgdG8gdGhlIFRyYWNlTGlzdGVuZXIudHJhY2UgZnVuY3Rpb24uIEl0IGlzIGNhbGxlZCBiZWZvcmUgYSBub2RlIGlzICdleGVjdXRlZCcgaW4gdGhlIHN0eWxlc2hlZXQuPGJyLz48YnIvPjwvbGk+Ci0JCSAgPGxpPjxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90cmFjZS9HZW5lcmF0ZUV2ZW50Lmh0bWwiPkdlbmVyYXRlRXZlbnQ8L2p1bXA+IGlzIGFuIGV2ZW50IHRoYXQgaXMgCi0JCSAgcGFzc2VkIHRvIHRoZSBUcmFjZUxpc3RlbmVyLmdlbmVyYXRlZCgpIGZ1bmN0aW9uLiBJdCBpcyBjYWxsZWQgYWZ0ZXIgYW4gZXZlbnQgb2NjdXJzIHRvIGNyZWF0ZSBzb21ldGhpbmcgaW4gdGhlIHJlc3VsdAotICAgICAgdHJlZS48YnIvPjxici8+PC9saT4KLSAgICAgIDxsaT48anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdHJhY2UvU2RlbGVjdGlvbkV2ZW50Lmh0bWwiPlNlbGVjdGlvbkV2ZW50PC9qdW1wPiBpcyBhbiBldmVudCB0cmlnZ2VyZWQgYnkgdGhlCi0gICAgICAgc2VsZWN0aW9uIG9mIGEgc3R5bGVzaGVldCBub2RlLjwvbGk+Ci0JCTwvdWw+Ci0gICAgPHA+VGhlIDxsaW5rIGlkcmVmPSJjb21tYW5kbGluZSI+Y29tbWFuZC1saW5lIHV0aWxpdHk8L2xpbms+IHVzZXMgdGhlIGRlYnVnZ2VyIGludGVyZmFjZSB3aGVuIHlvdSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZQotICAgICBmb2xsb3dpbmcgc3dpdGNoZXM6IDxjb2RlPi1UVDwvY29kZT4sIDxjb2RlPi1URzwvY29kZT4sIDxjb2RlPi1UUzwvY29kZT4sIDxjb2RlPi1UVEM8L2NvZGU+LjwvcD4KLSAgICA8cD5FeGFtcGxlOjwvcD4KLTxzb3VyY2U+aW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIuVHJhbnNmb3JtZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuVHJhY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuUHJpbnRUcmFjZUxpc3RlbmVyOwotLi4uCi0vLyBTZXQgdXAgYSBQcmludFRyYWNlTGlzdGVuZXIgb2JqZWN0IHRvIHByaW50IHRvIGEgZmlsZS4KLWphdmEuaW8uRmlsZVdyaXRlciBmdyA9IG5ldyBqYXZhLmlvLkZpbGVXcml0ZXIoImV2ZW50cy5sb2ciKTsKLWphdmEuaW8uUHJpbnRXcml0ZXIgcHcgPSBuZXcgamF2YS5pby5QcmludFdyaXRlcihmdyk7Ci1QcmludFRyYWNlTGlzdGVuZXIgcHRsID0gbmV3IFByaW50VHJhY2VMaXN0ZW5lcihwdyk7Ci0KLS8vIFByaW50IGluZm9ybWF0aW9uIGFzIGVhY2ggbm9kZSBpcyAnZXhlY3V0ZWQnIGluIHRoZSBzdHlsZXNoZWV0LgotcHRsLm1fdHJhY2VFbGVtZW50cyA9IHRydWU7Ci0vLyBQcmludCBpbmZvcm1hdGlvbiBhZnRlciBlYWNoIHJlc3VsdC10cmVlIGdlbmVyYXRpb24gZXZlbnQuCi1wdGwubV90cmFjZUdlbmVyYXRpb24gPSB0cnVlOwotLy8gUHJpbnQgaW5mb3JtYXRpb24gYWZ0ZXIgZWFjaCBzZWxlY3Rpb24gZXZlbnQuCi1wdGwubV90cmFjZVNlbGVjdGlvbiA9IHRydWU7Ci0vLyBQcmludCBpbmZvcm1hdGlvbiB3aGVuZXZlciBhIHRlbXBsYXRlIGlzIGludm9rZWQuCi1wdGwubV90cmFjZVRlbXBsYXRlcyA9IHRydWU7Ci0KLS8vIFNldCB1cCB0aGUgdHJhbnNmb3JtYXRpb24gICAgCi1qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IAotICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnRybmFzZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLWphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSAKLSAgdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIobmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZm9vLnhzbCIpKTsKLQotLy8gQ2FzdCB0aGUgVHJhbnNmb3JtZXIgb2JqZWN0IHRvIFRyYW5zZm9ybWVySW1wbC4KLWlmICh0cmFuc2Zvcm1lciBpbnN0YW5jZW9mIFRyYW5zZm9ybWVySW1wbCkgewotICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXJJbXBsID0gKFRyYW5zZm9ybWVySW1wbCl0cmFuc2Zvcm1lcjsKLSAgCi0gIC8vIFJlZ2lzdGVyIHRoZSBUcmFjZUxpc3RlbmVyIHdpdGggdGhlIFRyYWNlTWFuYWdlciBhc3NvY2lhdGVkIAotICAvLyB3aXRoIHRoZSBUcmFuc2Zvcm1lckltcGwuCi0gIFRyYWNlTWFuYWdlciB0ck1nciA9IHRyYW5zZm9ybWVySW1wbC5nZXRUcmFjZU1hbmFnZXIoKTsKLSAgdHJNZ3IuYWRkVHJhY2VMaXN0ZW5lcihwdGwpOwotICAKLSAgLy8gUGVyZm9ybSB0aGUgdHJhbnNmb3JtYXRpb24gLS1wcmludGluZyBpbmZvcm1hdGlvbiB0bwotICAvLyB0aGUgZXZlbnRzIGxvZyBkdXJpbmcgdGhlIHByb2Nlc3MuCi0gIHRyYW5zZm9ybWVyLnRyYW5zZm9ybQotICAgICAgKCBuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlKCJmb28ueG1sIiksIAotICAgICAgICBuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IGphdmEuaW8uRmlsZVdyaXRlcigiZm9vLm91dCIpKSApOwotfQotLy8gQ2xvc2UgdGhlIFByaW50V3JpdGVyIGFuZCBGaWxlV3JpdGVyLgotcHcuY2xvc2UoKTsKLWZ3LmNsb3NlKCk7PC9zb3VyY2U+Ci08cD5Gb3IgYSBzYW1wbGUgYXBwbGljYXRpb24gdGhhdCB1c2VzIHRoaXMgdGVjaG5pcXVlLCBzZWUgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0idHJhY2UiPlRyYWNlPC9saW5rPi48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0iY29tcGF0Ii8+Ci08czIgdGl0bGU9IlVzaW5nIHRoZSAmeHNsdDRqOyB2ZXJzaW9uIDEgQVBJIj4KLTxwPlRoZSBiaW4gZGlyZWN0b3J5IGluY2x1ZGVzIGEgY29tcGF0aWJpbGl0eSBqYXIsIHhhbGFuajFjb21wYXQuamFyLCB0aGF0IGxldHMgeW91IHJlYnVpbGQgeW91ciBYYWxhbi1KYXZhIDEueCBhcHBsaWNhdGlvbnMgdG8gcnVuIHdpdGggWGFsYW4tSmF2YSAyLiBBcyBhIHBvaW50IG9mIHJlZmVyZW5jZSwgdGhpcyBKQVIgaW5jbHVkZXMgdGhlIEFQSSByZXF1aXJlZCB0byByZWNvbXBpbGUgdGhlIFhhbGFuLUphdmEgMS54IGNvcmUgc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIHRoZSBzYW1wbGUgZXh0ZW5zaW9ucykgYW5kIHJ1biB0aGVtIHdpdGggWGFsYW4tSmF2YSAyLiBUbyB1c2UgdGhpcyBjb21wYXRpYmlsaXR5IGxheWVyIHdpdGggYW4gZXhpc3RpbmcgWGFsYW4tSmF2YSAxLnggYXBwbGljYXRpb24sIGRvIHRoZSBmb2xsb3dpbmc6PC9wPgotPG9sPgotPGxpPlBsYWNlIHhhbGFuajFjb21wYXQuamFyIG9uIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIGluIGZyb250IG9mIHRoZSBYYWxhbi1KYXZhIDIgeGFsYW4uamFyIChib3RoIGFyZSBpbiB0aGUgYmluIGRpcmVjdG9yeSkuPGJyLz48YnIvPjwvbGk+Ci08bGk+UmVjb21waWxlIHlvdXIgYXBwbGljYXRpb24uIEl0IGl0IGRvZXMgbm90IGNvbXBpbGUsIHlvdSBtYXkgYmUgdXNpbmcgWGFsYW4tSmF2YSAxLnggQVBJIHRoYXQgdGhlIGNvbXBhdGliaWxpdHkgbGF5ZXIgZG9lcyBub3Qgc3VwcG9ydC4gPGJyLz48YnIvPjwvbGk+Ci08bGk+UnVuIHRoZSByZWNvbXBpbGVkIGFwcGxpY2F0aW9uIHdpdGggeGFsYW5qMWNvbXBhdC5qYXIgb24gdGhlIHN5c3RlbSBjbGFzc3BhdGggaW4gZnJvbnQgb2YgdGhlIFhhbGFuLUphdmEgMiB4YWxhbi5qYXIuPC9saT4KLTwvb2w+Ci08cD5XZSB1cmdlIG91ciBYYWxhbi1KYXZhIDEueCB1c2VycyB0byBzdGFydCB1c2luZyBYYWxhbi1KYXZhIDIuIFRoYXQgaXMgd2hlcmUgd2UgYXJlIGNvbmNlbnRyYXRpbmcgb3VyIGVmZm9ydHMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgZml4IGFueSBvdXRzdGFuZGluZyBidWdzLiBUbyBzZWUgd2hhdCBwb3J0aW9uIG9mIHRoZSBYYWxhbi1KYXZhIDEueCBBUEkgd2UgaGF2ZSBpbmNsdWRlZCBpbiB4YWxhbmoxY29tcGF0Lmphciwgc2VlIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImNvbXBhdGFwaSIvPi4gRm9yIGV4YW1wbGUsIHRoZSBjb21wYXRpYmlsaXR5IGxheWVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHVzZSBvZiBYYWxhbi1KYXZhIDEueCBleHRlbnNpb25zLiBJZiB5b3UgZmVlbCB0aGF0IHdlIHNob3VsZCBleHRlbmQgb3VyIGNvbXBhdGliaWxpdHkgSkFSIHRvIHN1cHBvcnQgYWRkaXRpb25hbCBYYWxhbi1KYXZhIDEueCBBUEkgY2FsbHMsIHBsZWFzZSBsZXQgdXMga25vdyBleGFjdGx5IHdoYXQgeW91IHdvdWxkIGxpa2UgdG8gc2VlLjwvcD4KLTwvczI+Ci08L3MxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vd2hhdHNuZXcueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi93aGF0c25ldy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGViNDYuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94YWxhbi93aGF0c25ldy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Ci08IURPQ1RZUEUgczEgU1lTVEVNICIuLi8uLi9zdHlsZS9kdGQvZG9jdW1lbnQuZHRkIj4KLTwhLS0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci08czEgdGl0bGU9IldoYXQncyBuZXcgaW4gJnhzbHQ0ajI7Ij4KLQotICA8czIgdGl0bGU9Ik5ldyBEZXNpZ24iPgotICA8cD4meHNsdDRqMjsgcmVwcmVzZW50cyBhIGZ1bmRhbWVudGFsIHJlZGVzaWduIG9mIFhhbGFuLiBUaGUgcHJpbWFyeSBvYmplY3RpdmUgb2YgdGhpcyByZWRlc2lnbiBpcyBhbiBlYXNpZXItdG8tdXNlLCBtb3JlIHVuZGVyc3RhbmRhYmxlLCBhbmQgbW9yZSBtb2R1bGFyIEFQSSB0aGF0IGVuY291cmFnZXMgd2lkZXIgcGFydGljaXBhdGlvbiBpbiBpdHMgb25nb2luZyBkZXZlbG9wbWVudCBieSB0aGUgb3Blbi1zb3VyY2UgWE1MIGRldmVsb3BlciBjb21tdW5pdHksIGFuZCB0aGF0IGxlbmRzIGl0c2VsZiB0byAic3RyZWFtaW5nLCIgdGhlIHByb2R1Y3Rpb24gb2YgdHJhbnNmb3JtYXRpb24gb3V0cHV0IHdoaWxlIHRoZSBpbnB1dCBpcyBzdGlsbCBiZWluZyBwYXJzZWQuPC9wPgotPHA+JnhzbHQ0ajI7IGJ1aWxkcyBvbiA8cmVzb3VyY2UtcmVmIGlkcmVmPSJzYXgyIi8+LCA8cmVzb3VyY2UtcmVmIGlkcmVmPSJkb20yIi8+LCBhbmQgdGhlIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImpheHAiLz4uIEZvciBleGFtcGxlLCAmeHNsdDRqMjsgaW5jb3Jwb3JhdGVzIHRoZSBTQVggcGFyc2luZyBldmVudCBtb2RlbCBpbiBpdHMgc3VwcG9ydCBmb3IgdGhlIGluY3JlbWVudGFsIHByb2R1Y3Rpb24gb2YgdHJhbnNmb3JtYXRpb24gb3V0cHV0LiAmeHNsdDRqMjsgYWxzbyBpbXBsZW1lbnRzIHRoZSAgc3RhbmRhcmQgVHJBWCBBUEkgKHNlZSBiZWxvdykgdGhhdCBlbmFibGVzIHlvdSB0byBjb2RlIHlvdXIgWE1MIGFwcGxpY2F0aW9ucyB3aXRob3V0IHJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWwgZGV0YWlscyBvZiBhIHBhcnRpY3VsYXIgVHJhbnNmb3JtZXIgb3IgWE1MIHBhcnNlci48L3A+Ci08cD5HaXZlbiB0aGUgc2NvcGUgb2YgdGhlIHJlZGVzaWduLCB0aGUgY2hhbmdlcyB3aXRoIHJlc3BlY3QgdG8gPGp1bXAgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuL2luZGV4Lmh0bWwiPiZ4c2x0NGo7IDEueDwvanVtcD4gYXJlIGdsb2JhbCBpbiBuYXR1cmUuIEZvciBhbiBpbnRyb2R1Y3Rpb24gdG8gdGhlICZ4c2x0NGoyOyB1c2FnZSBwYXR0ZXJucywgc2VlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIj5CYXNpYyBVc2FnZSBQYXR0ZXJuczwvbGluaz4uPC9wPgotPHA+JnhzbHQ0ajI7IGltcGxlbWVudHMgdGhlIDxyZXNvdXJjZS1yZWYgaWRyZWY9InRyYXgiLz4gaW50ZXJmYWNlcy4gVGhlIHByb2R1Y3Qgb2YgZXh0ZW5zaXZlIG9wZW4tc291cmNlIGNvbGxhYm9yYXRpb24gYnkgbWVtYmVycyBvZiB0aGUgWE1MIGRldmVsb3BlciBjb21tdW5pdHksIFRyQVggcHJvdmlkZXMgYSBjb25jZXB0dWFsIGZyYW1ld29yayBhbmQgYSBzdGFuZGFyZCBBUEkgZm9yIHBlcmZvcm1pbmcgWE1MIHRyYW5zZm9ybWF0aW9ucy4gRHVyaW5nIGl0cyBldm9sdXRpb24sIHRoZSBUckFYIEFQSSBoYXMgdW5kZXJnb25lIHNldmVyYWwgcmV2aXNpb25zLiBXZSBiZWxpZXZlIHRoaXMgQVBJIGhhcyBub3cgcmVhY2hlZCBvciBpcyB2ZXJ5IGNsb3NlIHRvIGZpbmFsIGZvcm0uIEluIE5vdmVtYmVyIDIwMDAsIFRyQVggd2FzIGluY29ycG9yYXRlZCBpbnRvIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImpzcjA2MyIvPiwgdGhlIEphdmEgQVBJIGZvciBYTUwgUHJvY2Vzc2luZyAxLjEgLCB3aGljaCBoYXMgYmVlbiBwdWJsaXNoZWQgZm9yIHB1YmxpYyByZXZpZXcgKHNlZSA8cmVzb3VyY2UtcmVmIGlkcmVmPSJqYXhwMTEiLz4pLiBXZSBzdHJvbmdseSBlbmNvdXJhZ2UgeW91IHRvIHV0aWxpemUgdGhlIFRyQVggZnJhbWV3b3JrIHdoZW4geW91IHVzZSAmeHNsdDRqMjsgdG8gcGVyZm9ybSBYTUwgdHJhbnNmb3JtYXRpb25zLjwvcD4KLTxwPlRoZSBiYXNpYyBvcmdhbml6YXRpb24gb2YgVHJBWCBpcyBxdWl0ZSBzaW1wbGU6IHVzZSBhIFRyYW5zZm9ybWVyRmFjdG9yeSB0byBwcm9jZXNzIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucyBhbmQgZ2VuZXJhdGUgYSBUcmFuc2Zvcm1lciwgd2l0aCB3aGljaCB5b3UgY2FuIGFwcGx5IHRoZSBwcm9jZXNzZWQgdHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zIHRvIHlvdXIgWE1MIFNvdXJjZSwgcHJvZHVjaW5nIGEgdHJhbnNmb3JtYXRpb24gUmVzdWx0LiBGb3IgbW9yZSBkZXRhaWwsIHNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJiYXNpYyI+QmFzaWMgc3RlcHM8L2xpbms+LjwvcD4KLTxwPkFzIHBhcnQgb2YgdGhlIEphdmEgQVBJIGZvciBYTUwgUHJvY2Vzc2luZywgVHJhWCBwcm92aWRlcyBhIHN0YWJsZSBmcmFtZXdvcmsgZm9yIHBsdWdnaW5nIFRyYW5zZm9ybWVycyAobGlrZSAmeHNsdDRqOykgYW5kIFhNTCBwYXJzZXJzIChsaWtlICZ4bWw0ajspIGludG8geW91ciBhcHBsaWNhdGlvbnMgd2l0aG91dCB0eWluZyB5b3Vyc2VsZiB0byB0aGUgaW50ZXJuYWwgZGV0YWlscyBvZiB0aG9zZSBpbXBsZW1lbnRhdGlvbnMuIFNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJwbHVnIj5QbHVnZ2luZyBpbiBhIFRyYW5zZm9ybWVyIGFuZCBYTUwgcGFyc2VyPC9saW5rPi48L3A+Ci08L3MyPgotPC9zMT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hhbGFuZGVzaWduLnhtbCBiL3hkb2NzL3NvdXJjZXMveGFsYW5kZXNpZ24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDJkYTI4Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW5kZXNpZ24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgYm9vayBTWVNURU0gInNiazovc3R5bGUvZHRkL2Jvb2suZHRkIj4KLQotPCEtLQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLQotPGJvb2sgdGl0bGU9IlhhbGFuIDIuMC4wIERlc2lnbiIgY29weXJpZ2h0PSIyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiI+Ci0gCi0gIDxkb2N1bWVudCBpZD0iZGVzaWduMl8wXzAiCi0gICAgICAgICAgICBsYWJlbD0iWGFsYW4tSiAyLjAuMCBEZXNpZ24iCi0gICAgICAgICAgICBzb3VyY2U9ImRlc2lnbi9kZXNpZ24yXzBfMC54bWwiLz4gICAgCi08L2Jvb2s+Ci0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3N0eWxlL2R0ZC9zcGVjLmR0ZCBiL3hkb2NzL3N0eWxlL2R0ZC9zcGVjLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyMDI4OS4uMDAwMDAwMAotLS0gYS94ZG9jcy9zdHlsZS9kdGQvc3BlYy5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gIE1PRFVMRTogICAgc3BlYyBEVEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIFZFUlNJT046ICAgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIERBVEU6ICAgICAgT2N0b2JlciAxOCwgMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgIElTTyBTVEFOREFSRCBTUEVDSUFMIENIQVJBQ1RFUiBTRVRTICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tCi08IUVOVElUWSAlIGlzb2xhdDEgICAgICBQVUJMSUMKLSJJU08gODg3OS0xOTg2Ly9FTlRJVElFUyBBZGRlZCBMYXRpbiAxLy9FTiIKLSJlbnRpdGllcy9JU09sYXQxLnBlbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi08IUVOVElUWSAlIGlzb251bSAgICAgICBQVUJMSUMKLSJJU08gODg3OS0xOTg2Ly9FTlRJVElFUyBOdW1lcmljIGFuZCBTcGVjaWFsIEdyYXBoaWMvL0VOIgotImVudGl0aWVzL0lTT251bS5wZW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotPCFFTlRJVFkgJSBpc29wdWIgICAgICAgUFVCTElDCi0iSVNPIDg4NzktMTk4Ni8vRU5USVRJRVMgUHVibGlzaGluZy8vRU4iCi0iZW50aXRpZXMvSVNPcHViLnBlbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi08IUVOVElUWSAlIGlzb3RlY2ggICAgICBQVUJMSUMKLSJJU08gODg3OS0xOTg2Ly9FTlRJVElFUyBHZW5lcmFsIFRlY2huaWNhbC8vRU4iCi0iZW50aXRpZXMvSVNPdGVjaC5wZW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotJWlzb2xhdDE7ICVpc29udW07ICVpc29wdWI7ICVpc290ZWNoOwotLS0+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBlbnRpdGllcyBmb3IgY29udGVudCBtb2RlbHMgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBsaXN0IGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVOVElUWSAlIGxpc3RzICAgICAgICJpdGVtaXplZGxpc3QgfCBvcmRlcmVkbGlzdCB8IHZhcmlhYmxlbGlzdCIgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgbGluZXNwZWNpZmljIGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgd2hlcmUgbGluZSBlbmRpbmdzIGFuZCB3aGl0ZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmUgc2lnbmlmaWNhbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVOVElUWSAlIGxpbmVzcGVjaWZpYwotICAgICAgICAgICAgICAgICAgICAgICAibGl0ZXJhbGxheW91dCB8IHByb2dyYW1saXN0aW5nIiAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIHBocmFzZS1sZXZlbCBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFsbG93ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGV4dCAtLT4KLTwhRU5USVRZICUgcGhyYXNlbGV2ZWwgImNpdGF0aW9uIHwgZW1waGFzaXMgfCBpbmxpbmVncmFwaGljIHwgbGluayB8IHBsaW5rIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdCB8IHN1cGVyc2NyaXB0IHwgdWxpbmsgfCB0ZXJtcmVmIiAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGgtbGV2ZWwgZWxlbWVudHMgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyAoaW5jbHVkaW5nIHBhcmFncmFwaHMpIGFsbG93ZWQgYXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsZXZlbCBvZiBwYXJhZ3JhcGhzICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRU5USVRZICUgcGFyYWxldmVsICAgIiVsaW5lc3BlY2lmaWM7IHwgJWxpc3RzOyB8IG5vdGUgfCBwYXJhIHwgaXNzdWUgfAotICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgfCBmaWd1cmUgfCBncmFwaGljIiAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBlbnRpdGllcyBmb3IgYXR0cmlidXRlcyAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBjb21tb24gYXR0cmlidXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVOVElUWSAlIGNvbW1vbi5hdHRzCi0gICAgICAgICAgICAgImlkICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgICAgICAgICBsaW5rLXVybCAgIENEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQiID4KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgZ3JhcGhpYy1yZWxhdGVkIGF0dHJpYnV0ZXMgICAgICAgICAgICAgICAgIC0tPgotPCFFTlRJVFkgJSBncmFwaGljLmF0dHMKLSAgICAgICAgICAgICJmaWxlcmVmICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICBhbHQgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICBzcmNjcmVkaXQgIENEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICB3aWR0aCAgICAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICBkZXB0aCAgICAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICBzY2FsZSAgICAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICBzY2FsZWZpdCAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQiID4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgbW9kdWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08IS0tCi08IUVOVElUWSAlIHRhYmxlLmVudCBTWVNURU0gInRhYmxlLmVudCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0ldGFibGUuZW50OwotLS0+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHNwZWMgICAgICAgICAodGl0bGUsIGZyb250bWF0dGVyLCBpbnRyb2R1Y3Rpb24sIHJlcXVpcmVtZW50cywgbW9kZWwsIHNlY3QxKywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRpeCosIGJpYmxpb2dyYXBoeT8pICAgICAgICAgICAgICAgICAgID4KLQotPCFBVFRMSVNUICBzcGVjCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLTwhRUxFTUVOVCAgZnJvbnRtYXR0ZXIgICAocHViZGF0ZSwgY29weXJpZ2h0LCBhdXRob3IqLCBhYnN0cmFjdD8pICAgID4KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgdGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICB0aXRsZSAgICAgICAgKCNQQ0RBVEEgfCAlcGhyYXNlbGV2ZWw7KSogICAgICAgICAgICAgICAgICAgPgotPCFBVFRMSVNUICB0aXRsZQotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGlzc3VlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgaXNzdWUgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqICAgICAgICAgICAgICAgICAgID4KLTwhQVRUTElTVCAgaXNzdWUKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBwdWJsaWNhdGlvbiBkYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICBwdWJsaWNhdGlvbiBkYXRlIGFuZCwgcG9zc2libHksIHRpbWUgICAgICAgLS0+Ci08IUVMRU1FTlQgIHB1YmRhdGUgICAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IUFUVExJU1QgIHB1YmRhdGUKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBjb3B5cmlnaHQgc3RhdGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIGNvcHlyaWdodCAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGNvcHlyaWdodAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGF1dGhvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgYXV0aG9yICAgICAgIChmaXJzdG5hbWUsIHN1cm5hbWUsIGpvYnRpdGxlPywgb3JnbmFtZT8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcz8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGF1dGhvcgotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgYWJzdHJhY3QgICAgIChwYXJhKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgYWJzdHJhY3QKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotPCFFTEVNRU5UICBpbnRyb2R1Y3Rpb24gICAgICAgICh0aXRsZSwgKCgoJXBhcmFsZXZlbDspKywgc2VjdDIqKSB8IHNlY3QyKykpID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgaW50cm9kdWN0aW9uCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLTwhRUxFTUVOVCAgcmVxdWlyZW1lbnRzICAgICAgICAodGl0bGUsICgoKCVwYXJhbGV2ZWw7KSssIHNlY3QyKikgfCBzZWN0MispKSA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHJlcXVpcmVtZW50cwotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyA+ICAgIAotCi08IUVMRU1FTlQgIG1vZGVsICAgICAgICAodGl0bGUsICgoKCVwYXJhbGV2ZWw7KSssIHBhdHRlcm5zKSB8IHNlY3QyKykpID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgbW9kZWwKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotPCFFTEVNRU5UICBwYXR0ZXJucyAgICAgICAgKHBhdHRlcm4rKSA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHBhdHRlcm5zCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7IAotCQkJbW9kdWxlICBDREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICAgICAgICA+IAotICAgICAgICAgICAgICAgICAgICAgICAgCi08IUVMRU1FTlQgIHBhdHRlcm4gICAgICAgIChwYXR0ZXJuLW5hbWUsIHBvdGVudGlhbC1hbHRlcm5hdGUtbmFtZT8sIGludGVudCwgcmVzcG9uc2liaWxpdGllcywgdGhyZWFkLXNhZmV0eSwgbm90ZXM/KSA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHBhdHRlcm4KLSAgICAgICAgICAgICVjb21tb24uYXR0czsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCFFTEVNRU5UICBwYXR0ZXJuLW5hbWUgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgcGF0dGVybi1uYW1lCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ID4KLSAgICAgICAgICAgIAotPCFFTEVNRU5UICBwb3RlbnRpYWwtYWx0ZXJuYXRlLW5hbWUgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgcG90ZW50aWFsLWFsdGVybmF0ZS1uYW1lCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ID4gIAotCi08IUVMRU1FTlQgIGludGVudCAgICAgICAgKCNQQ0RBVEEgfCAlcGhyYXNlbGV2ZWw7KSogPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBpbnRlbnQKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgPiAgCi0KLTwhRUxFTUVOVCAgcmVzcG9uc2liaWxpdGllcyAgICAgICAgKCNQQ0RBVEEgfCAlcGhyYXNlbGV2ZWw7KSogPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICByZXNwb25zaWJpbGl0aWVzCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ID4gIAotCi08IUVMRU1FTlQgIHRocmVhZC1zYWZldHkgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgdGhyZWFkLXNhZmV0eQotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyA+Ci0KLTwhRUxFTUVOVCAgbm90ZXMgICAgICAgICAoI1BDREFUQSB8ICVwaHJhc2VsZXZlbDspKiAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIG5vdGVzCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgc2VjdDEKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBzZWN0MSAgICAgICAgKHRpdGxlLCAoKCglcGFyYWxldmVsOykrLCBzZWN0MiopIHwgc2VjdDIrKSkgPgkJCQkJCSAgIAotPCEtLSAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBzZWN0MiAgICAgICAgKHRpdGxlLCAoKCglcGFyYWxldmVsOykrLCBzZWN0MyopIHwgc2VjdDMrKSkgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBzZWN0MgotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgc2VjdDMgICAgICAgICh0aXRsZSwgKCgoJXBhcmFsZXZlbDspKywgc2VjdDQqKSB8IHNlY3Q0KykpID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgc2VjdDMKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHNlY3Q0ICAgICAgICAodGl0bGUsICglcGFyYWxldmVsOykrKSAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHNlY3Q0Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBhcHBlbmRpeCAgICAgKHRpdGxlLCAoKCglcGFyYWxldmVsOykrLCBzZWN0MSopIHwgc2VjdDErKSkgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBhcHBlbmRpeAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGJpYmxpb2dyYXBoeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgYmlibGlvZ3JhcGh5ICh0aXRsZSwgYmlibGlvaXRlbSspICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgYmlibGlvZ3JhcGh5Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgYmlibGlvZ3JhcGh5IGl0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBiaWJsaW9pdGVtICAgKGRlc2lnbmF0b3IsIGJpYmxpb2VudHJ5KSAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBiaWJsaW9pdGVtCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgYmlibGlvZ3JhcGh5IGl0ZW0gZGVzaWduYXRvciAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgZGVzaWduYXRvciBjb250YWlucyB3aGF0ZXZlciBkZXNpZ25hdG9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yIHVzZXMgdG8gaWRlbnRpZnkgcHVibGljYXRpb25zIGxpc3RlZCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpYmxpb2dyYXBoeSAoZS5nLiwgW2xhYiA4N10pLiAgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXNoZWV0IGdlbmVyYXRlcyB0aGUgc3F1YXJlICJbXSIgYnJhY2tldHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmUgJiBhZnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgZGVzaWduYXRvciAgICgjUENEQVRBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgZGVzaWduYXRvcgotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGJpYmxpb2dyYXBoeSBlbnRyeSAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgYmlibGlvZW50cnkgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgYmlibGlvZW50cnkKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICBhdXRob3ItcmVsYXRlZCBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBmaXJzdG5hbWUgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBmaXJzdG5hbWUKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBzdXJuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHN1cm5hbWUgICAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHN1cm5hbWUKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBqb2IgdGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIGpvYnRpdGxlICAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGpvYnRpdGxlCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBvcmduYW1lICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBvcmduYW1lCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBhZGRyZXNzICAgICAgKHN0cmVldD8sIHBvYj8sIGNpdHk/LCBzdGF0ZT8sIHBvc3Rjb2RlPywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeT8sIHBob25lPywgZmF4PywgZW1haWw/KSAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGFkZHJlc3MKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgc3RyZWV0IGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBzdHJlZXQgICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBzdHJlZXQKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBwb3N0IG9mZmljZSBib3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHBvYiAgICAgICAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHBvYgotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIHBvc3Rjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgcG9zdGNvZGUgICAgICgjUENEQVRBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgcG9zdGNvZGUKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBjaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIGNpdHkgICAgICAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGNpdHkKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHN0YXRlICAgICAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHN0YXRlCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgY291bnRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBjb3VudHJ5ICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBjb3VudHJ5Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgcGhvbmUgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBwaG9uZSAgICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBwaG9uZQotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGZheCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgZmF4ICAgICAgICAgICgjUENEQVRBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgZmF4Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgZW1haWwgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBlbWFpbCAgICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBlbWFpbAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaC1sZXZlbCBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHBhcmEgICAgICAgICAoI1BDREFUQSB8ICVwaHJhc2VsZXZlbDspKiAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHBhcmEKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBub3RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIG5vdGUgICAgICAgICAoJXBhcmFsZXZlbDspKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIG5vdGUKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBpdGVtaXplZCBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIGl0ZW1pemVkbGlzdCAobGlzdGl0ZW0rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGl0ZW1pemVkbGlzdAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIG9yZGVyZWQgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgb3JkZXJlZGxpc3QgIChsaXN0aXRlbSspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgb3JkZXJlZGxpc3QKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHZhcmlhYmxlbGlzdCAodmFybGlzdGVudHJ5KykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHZhcmlhYmxlbGlzdAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGxpc3QgaXRlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgbGlzdGl0ZW0gICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOyB8ICVwYXJhbGV2ZWw7KSogICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgbGlzdGl0ZW0KLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBsaXN0IGVudHJ5ICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHZhcmxpc3RlbnRyeSAodGVybSssIGxpc3RpdGVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHZhcmxpc3RlbnRyeQotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIHRlcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgdGVybSAgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgdGVybQotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi08IS0tICAgICAgICAgICAgICAgICAgICB0ZXJtcmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHRlcm1yZWYgICAgICAgICAoI1BDREFUQSB8ICVwaHJhc2VsZXZlbDspKiAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHRlcm1yZWYKLSAgICAgICAgICAgICVjb21tb24uYXR0czsJICAgPgotCi08IS0tICAgICAgICAgICAgICAgICAgICBsaXRlcmFsIGxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIGxpdGVyYWxsYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICB4bWw6c3BhY2UgIHdoaXRlc3BhY2UgaGFuZGxpbmcKLSAgICAgICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgbGl0ZXJhbGxheW91dAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIHByb2dyYW0gbGlzdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgcHJvZ3JhbWxpc3RpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICB4bWw6c3BhY2UgIHdoaXRlc3BhY2UgaGFuZGxpbmcKLSAgICAgICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgcHJvZ3JhbWxpc3RpbmcKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBmaWd1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIGZpZ3VyZSAgICAgICAodGl0bGUsIGdyYXBoaWMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGZpZ3VyZQotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgZ3JhcGhpYyAgICAgIEVNUFRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBhbGlnbiAgICAgIGFsaWdubWVudCBvZiBncmFwaGljIGltYWdlLiAgdmFsdWVzIGFyZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICBsZWZ0IGFsaWduZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgICAgICAgICByaWdodCBhbGlnbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciAgICAgICAgY2VudGVyZWQKLSAgICAgICAgICAgICBmaWxlcmVmICAgIHBhdGggdG8gZXh0ZXJuYWwgZmlsZQotICAgICAgICAgICAgIGFsdCAgICAgICAgYWx0ZXJuYXRlIHRleHQKLSAgICAgICAgICAgICBzcmNjcmVkaXQgIHNvdXJjZSBvZiBncmFwaGljCi0gICAgICAgICAgICAgd2lkdGggICAgICB3aWR0aCBvZiBhcmVhIGluIHdoaWNoIHRvIGZpdCBncmFwaGljCi0gICAgICAgICAgICAgZGVwdGggICAgICBkZXB0aCBvZiBhcmVhIGluIHdoaWNoIHRvIGZpdCBncmFwaGljCi0gICAgICAgICAgICAgc2NhbGUgICAgICBwZXJjZW50YWdlIHNjYWxpbmcgZmFjdG9yCi0gICAgICAgICAgICAgc2NhbGVmaXQgICBzY2FsZSB0byBmaXQgd2lkdGggYW5kL29yIGRlcHRoCi0gICAgICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGdyYXBoaWMKLSAgICAgICAgICAgICBhbGlnbiAgICAgIChsZWZ0IHxyaWdodCB8Y2VudGVyKSAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICVncmFwaGljLmF0dHM7Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGlubGluZSBncmFwaGljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgaW5saW5lZ3JhcGhpYwotICAgICAgICAgICAgICAgICAgICAgICAgRU1QVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGZpbGVyZWYgICAgcGF0aCB0byBleHRlcm5hbCBmaWxlCi0gICAgICAgICAgICAgYWx0ICAgICAgICBhbHRlcm5hdGUgdGV4dAotICAgICAgICAgICAgIHNyY2NyZWRpdCAgc291cmNlIG9mIGdyYXBoaWMKLSAgICAgICAgICAgICB3aWR0aCAgICAgIHdpZHRoIG9mIGFyZWEgaW4gd2hpY2ggdG8gZml0IGdyYXBoaWMKLSAgICAgICAgICAgICBkZXB0aCAgICAgIGRlcHRoIG9mIGFyZWEgaW4gd2hpY2ggdG8gZml0IGdyYXBoaWMKLSAgICAgICAgICAgICBzY2FsZSAgICAgIHBlcmNlbnRhZ2Ugc2NhbGluZyBmYWN0b3IKLSAgICAgICAgICAgICBzY2FsZWZpdCAgIHNjYWxlIHRvIGZpdCB3aWR0aCBhbmQvb3IgZGVwdGgKLSAgICAgICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgaW5saW5lZ3JhcGhpYwotICAgICAgICAgICAgJWdyYXBoaWMuYXR0czsKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgdGV4dC1sZXZlbCBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGJpYmxpb2dyYXBoaWMgY2l0YXRpb24gICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgIGEgPGNpdGF0aW9uPiBhcHBlYXJzIGluIHRoZSBib2R5IG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWNsZSwgYW5kIGl0IHJlZmVycyB0aHJvdWdoIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgImxpbmtlbmQiIGF0dHJpYnV0ZSB0byB0aGUgaWQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICByZWxldmFudCBiaWJsaW9ncmFwaHkgaXRlbS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIDxjaXRhdGlvbj4gcmVjZWl2ZXMgdGhlIHNhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRpbmcgYXMgdGhlIDxkZXNpZ25hdG9yPiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIDxiaWJsaW9pdGVtPiBiZWluZyByZWZlcmVuY2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUsIHdoZW4gZm9yIHRoZSBiaWJpdGVtCi0gICAgICAgICAgICAgICAgICAgICAgICA8YmlibGlvaXRlbSBpZD0iYmliMSI+PGRlc2lnbmF0b3I+bGFiCi0gICAgICAgICAgICAgICAgICAgICAgICA4NzwvZGVzaWduYXRvcj4uLi48L2JpYmxpb2l0ZW0+IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgYXMgIltsYWIgODddIiwgdGhlIGJpYmxpb2dyYXBoaWMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNpdGF0aW9uIDxjaXRhdGlvbiBsaW5rZW5kPSJiaWIxIj5sYWIKLSAgICAgICAgICAgICAgICAgICAgICAgIDg3PC9jaXRhdGlvbj4gYWxzbyBmb3JtYXRzIGFzICJbbGFiIDg3XSIuICAtLT4KLTwhRUxFTUVOVCAgY2l0YXRpb24gICAgICgjUENEQVRBIHwgZW1waGFzaXMgfCBpbmxpbmVncmFwaGljIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHQgfCBzdXBlcnNjcmlwdCkqICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBsaW5rZW5kICAgIGlkIG9mIHJlZmVyZW5jZWQgYmlibGlvZ3JhcGh5IGVudHJ5Ci0gICAgICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGNpdGF0aW9uCi0gICAgICAgICAgICAgbGlua2VuZCAgICBJRFJFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGVtcGhhc2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgZW1waGFzaXMgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgZW1waGFzaXMKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHN1YnNjcmlwdCAgICAoI1BDREFUQSB8IGVtcGhhc2lzIHwgc3Vic2NyaXB0IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcnNjcmlwdCkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgc3Vic2NyaXB0Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgc3VwZXJzY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBzdXBlcnNjcmlwdCAgKCNQQ0RBVEEgfCBlbXBoYXNpcyB8IHN1YnNjcmlwdCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJzY3JpcHQpKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHN1cGVyc2NyaXB0Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBsaW5rICAgICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGxpbmtlbmQgICAgaWQgb2YgcmVmZXJlbmNlZCBlbGVtZW50Ci0gICAgICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGxpbmsKLSAgICAgICAgICAgICBsaW5rZW5kICAgIElEUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLTwhLS0gIHBhY2thZ2UgbGluayAoZm9yIHtAbGluayBvcmcueG1sLnRyYXguUHJvY2Vzc29yfSB0eXBlIGxpbmtzLCBmb3IgamF2YWRvY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHBsaW5rICAgICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IUFUVExJU1QgIHBsaW5rCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLTwhLS0gICAgICAgICAgICAgICAgICAgIHVsaW5rIChleHRlcm5hbCBsaW5rKSAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgdWxpbmsgICAgICAgICgjUENEQVRBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICB1cmwgICAgICAgIHVuaWZvcm0gcmVzb3VyY2UgbG9jYXRvcjsgdGhlIHRhcmdldCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVsaW5rCi0gICAgICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHVsaW5rCi0gICAgICAgICAgICAgdXJsICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KZGlmZiAtLWdpdCBhL3hkb2NzL3N0eWxlL2R0ZC94c2wtaHRtbDQwcy5kdGQgYi94ZG9jcy9zdHlsZS9kdGQveHNsLWh0bWw0MHMuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODg0OGJkLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3N0eWxlL2R0ZC94c2wtaHRtbDQwcy5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwxNTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0gCi0gICAgIFhTTFQgKFdELTE5OTkwODEzKSBEVEQgYW5kIEhUTUwgNC4wIFN0cmljdCAoUkVDLUhUTUw0MC0xOTk4MDQyNCkgRFRECi0gICAgIFRoaXMgRFREIGRlZmluZXMgYSBYU0xUIHN0eWxlc2hlZXQgd2l0aCBhIHJlc3VsdC1ucyBvZiBodG1sCi0KLSAgICAgQ3JlZGl0czoKLSAgICAgICBPcmlnaW5hbCBYU0xUIERURCBmcm9tIFczQyBYU0xUIFdELTE5OTkwODEzCi0gICAgICAgT3JpZ2luYWwgWE1MICBEVEQgZm9yIEhUTUwgNC4wIFN0cmljdCBieQotICAgICAgICAgVEFNVVJBLCBLZW50IDxrZW50QHRybC5pYm0uY28uanA+LCBmb3IgSUJNJ3MgWE1MNEogcGFja2FnZQotICAgICAgIE1pbm9yIGZpeGVzIHRvIFhTTFQgJiBIVE1MIERURHMgYnkgCi0gICAgICAgICBTY290dCBCb2FnIDxzY290dF9ib2FnQGxvdHVzLmNvbT4KLSAgICAgICAgIEhlbnJpcXVlIE0uIEhvbHNjaHVoIDxoZW5yaXFtaEBkY2EuZmVlLnVuaWNhbXAuYnI+Ci0gICAgICAgSFRNTC9YU0xUIGNvbXBvc2l0ZSBEVEQgYnkKLSAgICAgICAgIEhlbnJpcXVlIE0uIEhvbHNjaHVoIDxoZW5yaXFtaEBkY2EuZmVlLnVuaWNhbXAuYnI+Ci0KLSAgICAgQ2F2ZWF0czogSXQgaXMgcG9zc2libGUgdG8gZ2VuZXJhdGUgaW52YWxpZCBYU0xUIGFuZCBIVE1MIGRvY3VtZW50cyAKLSAgICAgICB1c2luZyB0aGlzIERURCwgYXMgdGhlIHJlc3VsdC1ucyBlbGVtZW50cyAoSFRNTCkgbXVzdCBhbGxvdyBhbGwgCi0gICAgICAgcG9zc2libGUgeHNsIGVsZW1lbnRzIGFzIGNvbnRlbnQsIGFuZCBhbGwgcmVzdWx0LW5zIGVsZW1lbnRzIGhhZCAKLSAgICAgICB0byBiZSByZWxheGVkIG9uIHRoZWlyIGVsZW1lbnQgY29udGVudCBydWxlcy4KLQotICAgICBUT0RPOgotICAgICAgIC0gQSBYU0xUL1hIVE1MMS4wIFN0cmljdCBEVEQgdG8gdXNlIGluc3RlYWQgb2YgdGhpcyBvbmUuIExvd2VyY2FzZQotICAgICAgICAgZWxlbWVudCBuYW1lcyBhbGxvdyBmb3IgYmV0dGVyIGNvbXByZXNzaW9uIHJhdGlvcywgYXQgbGVhc3QgaW4KLSAgICAgICAgIEVuZ2xpc2ggZG9jdW1lbnRzLgotICAgICAgIC0gVXBkYXRlIHRvIEhUTUwgNC4wMQotCi0gICAgICRJZCQKLS0tPgotCi08IS0tIFByZWRlZmluZWQgWE1MIChSRUMtWE1MLTE5OTgwMjEwKSBlbnRpdGllcyAtLT4KLTwhRU5USVRZIGx0ICAgICAiJiMzODsjNjA7Ij4KLTwhRU5USVRZIGd0ICAgICAiJiM2MjsiPgotPCFFTlRJVFkgYW1wICAgICImIzM4OyMzODsiPgotPCFFTlRJVFkgYXBvcyAgICImIzM5OyI+Ci08IUVOVElUWSBxdW90ICAgIiYjMzQ7Ij4KLQotPCEtLSAKLSAgUmVzdWx0IGVsZW1lbnRzIGFsbG93ZWQgKGluc2lkZSB4c2wgZWxlbWVudHMpLiBUaGVzZSBhcmUgYWN0dWFsbHkKLSAgYWxsIG9mIHRoZSBIVE1MNDAgU3RyaWN0IGVsZW1lbnRzLiAKLS0tPgotCi08IUVOVElUWSAlIHJlc3VsdC1lbGVtZW50cyAiCi0gIHwgVFQKLSAgfCBJCi0gIHwgQgotICB8IEJJRwotICB8IFNNQUxMCi0gIHwgRU0KLSAgfCBTVFJPTkcKLSAgfCBERk4KLSAgfCBDT0RFCi0gIHwgU0FNUAotICB8IEtCRAotICB8IFZBUgotICB8IENJVEUKLSAgfCBBQkJSCi0gIHwgQUNST05ZTQotICB8IFNVUAotICB8IFNVQgotICB8IFNQQU4KLSAgfCBCRE8KLSAgfCBCUgotICB8IEJPRFkKLSAgfCBBRERSRVNTCi0gIHwgRElWCi0gIHwgQQotICB8IE1BUAotICB8IEFSRUEKLSAgfCBMSU5LCi0gIHwgSU1HCi0gIHwgT0JKRUNUCi0gIHwgUEFSQU0KLSAgfCBIUgotICB8IFAKLSAgfCBIMQotICB8IEgyCi0gIHwgSDMKLSAgfCBINAotICB8IEg1Ci0gIHwgSDYKLSAgfCBQUkUKLSAgfCBRCi0gIHwgQkxPQ0tRVU9URQotICB8IElOUwotICB8IERFTAotICB8IERMCi0gIHwgRFQKLSAgfCBERAotICB8IE9MCi0gIHwgVUwKLSAgfCBMSQotICB8IEZPUk0KLSAgfCBMQUJFTAotICB8IElOUFVUCi0gIHwgU0VMRUNUCi0gIHwgT1BUR1JPVVAKLSAgfCBPUFRJT04KLSAgfCBURVhUQVJFQQotICB8IEZJRUxEU0VUCi0gIHwgTEVHRU5ECi0gIHwgQlVUVE9OCi0gIHwgVEFCTEUKLSAgfCBDQVBUSU9OCi0gIHwgVEhFQUQKLSAgfCBURk9PVAotICB8IFRCT0RZCi0gIHwgQ09MR1JPVVAKLSAgfCBDT0wKLSAgfCBUUgotICB8IFRICi0gIHwgVEQKLSAgfCBIRUFECi0gIHwgVElUTEUKLSAgfCBCQVNFCi0gIHwgTUVUQQotICB8IFNUWUxFCi0gIHwgU0NSSVBUCi0gIHwgTk9TQ1JJUFQKLSAgfCBIVE1MCi0iPgotCi08IS0tIGJlZ2luIFhTTFQgRFRELCBwYXRjaGVkIC0tPgotCi08IUVOVElUWSAlIGNoYXItaW5zdHJ1Y3Rpb25zICIKLSB8IHhzbDphcHBseS10ZW1wbGF0ZXMKLSB8IHhzbDpjYWxsLXRlbXBsYXRlCi0gfCB4c2w6YXBwbHktaW1wb3J0cwotIHwgeHNsOmZvci1lYWNoCi0gfCB4c2w6dmFsdWUtb2YKLSB8IHhzbDpjb3B5LW9mCi0gfCB4c2w6bnVtYmVyCi0gfCB4c2w6Y2hvb3NlCi0gfCB4c2w6aWYKLSB8IHhzbDp0ZXh0Ci0gfCB4c2w6Y29weQotIHwgeHNsOnZhcmlhYmxlCi0gfCB4c2w6bWVzc2FnZQotIj4KLQotPCFFTlRJVFkgJSBpbnN0cnVjdGlvbnMgIgotICVjaGFyLWluc3RydWN0aW9uczsKLSB8IHhzbDpwcm9jZXNzaW5nLWluc3RydWN0aW9uCi0gfCB4c2w6Y29tbWVudAotIHwgeHNsOmVsZW1lbnQKLSB8IHhzbDphdHRyaWJ1dGUKLSI+Ci0KLTwhRU5USVRZICUgY2hhci10ZW1wbGF0ZSAiCi0oI1BDREFUQQotICVjaGFyLWluc3RydWN0aW9uczspKgotIj4KLQotPCFFTlRJVFkgJSB0ZW1wbGF0ZSAiCi0oI1BDREFUQQotICVpbnN0cnVjdGlvbnM7Ci0gJXJlc3VsdC1lbGVtZW50czspKgotIj4KLQotPCEtLSBVc2VkIGZvciB0aGUgdHlwZSBvZiBhbiBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBpcyBhIFVSSSByZWZlcmVuY2UuLS0+Ci08IUVOVElUWSAlIFVSSSAiQ0RBVEEiPgotCi08IS0tIFVzZWQgZm9yIHRoZSB0eXBlIG9mIGFuIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIGEgcGF0dGVybi4tLT4KLTwhRU5USVRZICUgcGF0dGVybiAiQ0RBVEEiPgotCi08IS0tIFVzZWQgZm9yIHRoZSB0eXBlIG9mIGFuIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIGFuCi0gICAgYXR0cmlidXRlIHZhbHVlIHRlbXBsYXRlLi0tPgotPCFFTlRJVFkgJSBhdnQgIkNEQVRBIj4KLQotPCEtLSBVc2VkIGZvciB0aGUgdHlwZSBvZiBhbiBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBpcyBhIFFOYW1lOyB0aGUgcHJlZml4Ci0gICAgZ2V0cyBleHBhbmRlZCBieSB0aGUgWFNMVCBwcm9jZXNzb3IuIC0tPgotPCFFTlRJVFkgJSBxbmFtZSAiTk1UT0tFTiI+Ci0KLTwhLS0gTGlrZSBxbmFtZSBidXQgYSB3aGl0ZXNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFFOYW1lcy4gLS0+Ci08IUVOVElUWSAlIHFuYW1lcyAiTk1UT0tFTlMiPgotCi08IS0tIFVzZWQgZm9yIHRoZSB0eXBlIG9mIGFuIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIGFuIGV4cHJlc3Npb24uLS0+Ci08IUVOVElUWSAlIGV4cHIgIkNEQVRBIj4KLQotPCEtLSBVc2VkIGZvciB0aGUgdHlwZSBvZiBhbiBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBjb25zaXN0cwotICAgIG9mIGEgc2luZ2xlIGNoYXJhY3Rlci4tLT4KLTwhRU5USVRZICUgY2hhciAiQ0RBVEEiPgotCi08IS0tIFVzZWQgZm9yIHRoZSB0eXBlIG9mIGFuIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIGEgcHJpb3JpdHkuIC0tPgotPCFFTlRJVFkgJSBwcmlvcml0eSAiTk1UT0tFTiI+Ci0KLTwhRU5USVRZICUgc3BhY2UtYXR0ICJ4bWw6c3BhY2UgKGRlZmF1bHR8cHJlc2VydmUpICNJTVBMSUVEIj4KLQotPCEtLSBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSB0aGUgc2V0IG9mIGVsZW1lbnRzIGFsbG93ZWQKLWF0IHRoZSB0b3AtbGV2ZWwuIC0tPgotCi08IUVOVElUWSAlIG5vbi14c2wtdG9wLWxldmVsICIiPgotCi08IUVOVElUWSAlIHRvcC1sZXZlbCAiCi0oeHNsOmltcG9ydCosCi0gKHhzbDppbmNsdWRlCi0gfCB4c2w6c3RyaXAtc3BhY2UKLSB8IHhzbDpwcmVzZXJ2ZS1zcGFjZQotIHwgeHNsOm91dHB1dAotIHwgeHNsOmtleQotIHwgeHNsOmxvY2FsZQotIHwgeHNsOmF0dHJpYnV0ZS1zZXQKLSB8IHhzbDp2YXJpYWJsZQotIHwgeHNsOnBhcmFtCi0gfCB4c2w6dGVtcGxhdGUKLSAlbm9uLXhzbC10b3AtbGV2ZWw7KSopCi0iPgotCi08IS0tIGFkZGVkIHhtbG5zIGF0dHJpYnV0ZSBzdWl0YWJsZSBmb3IgdGhpcyBEVEQgLS0+Ci08IUVOVElUWSAlIHRvcC1sZXZlbC1hdHRzICcKLSBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcyBDREFUQSAjSU1QTElFRAotIGlkIElEICNJTVBMSUVECi0geG1sbnM6eHNsIENEQVRBICNGSVhFRCAiaHR0cDovL3d3dy53My5vcmcvWFNMLzE5OTkvVHJhbnNmb3JtIgotIHhtbG5zIENEQVRBICNGSVhFRCAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCIKLSAlc3BhY2UtYXR0OwotJz4KLQotPCEtLSBUaGlzIGVudGl0eSBpcyBkZWZpbmVkIGZvciB1c2UgaW4gdGhlIEFUVExJU1QgZGVjbGFyYXRpb24KLWZvciByZXN1bHQgZWxlbWVudHMuIC0tPgotCi08IUVOVElUWSAlIHJlc3VsdC1lbGVtZW50LWF0dHMgJwotIHhzbDpleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcyBDREFUQSAjSU1QTElFRAotIHhzbDp1c2UtYXR0cmlidXRlLXNldHMgJXFuYW1lczsgI0lNUExJRUQKLSc+Ci0KLTwhRUxFTUVOVCB4c2w6c3R5bGVzaGVldCAldG9wLWxldmVsOz4KLTwhQVRUTElTVCB4c2w6c3R5bGVzaGVldCAldG9wLWxldmVsLWF0dHM7PgotCi08IUVMRU1FTlQgeHNsOnRyYW5zZm9ybSAldG9wLWxldmVsOz4KLTwhQVRUTElTVCB4c2w6dHJhbnNmb3JtICV0b3AtbGV2ZWwtYXR0czs+Ci0KLTwhRUxFTUVOVCB4c2w6aW1wb3J0IEVNUFRZPgotPCFBVFRMSVNUIHhzbDppbXBvcnQgaHJlZiAlVVJJOyAjUkVRVUlSRUQ+Ci0KLTwhRUxFTUVOVCB4c2w6aW5jbHVkZSBFTVBUWT4KLTwhQVRUTElTVCB4c2w6aW5jbHVkZSBocmVmICVVUkk7ICNSRVFVSVJFRD4KLQotPCFFTEVNRU5UIHhzbDpzdHJpcC1zcGFjZSBFTVBUWT4KLTwhQVRUTElTVCB4c2w6c3RyaXAtc3BhY2UgZWxlbWVudHMgQ0RBVEEgI1JFUVVJUkVEPgotCi08IUVMRU1FTlQgeHNsOnByZXNlcnZlLXNwYWNlIEVNUFRZPgotPCFBVFRMSVNUIHhzbDpwcmVzZXJ2ZS1zcGFjZSBlbGVtZW50cyBDREFUQSAjUkVRVUlSRUQ+Ci0KLTwhRUxFTUVOVCB4c2w6b3V0cHV0IEVNUFRZPgotPCFBVFRMSVNUIHhzbDpvdXRwdXQKLSBtZXRob2QgJXFuYW1lOyAjSU1QTElFRAotIHZlcnNpb24gTk1UT0tFTiAjSU1QTElFRAotIGVuY29kaW5nIE5NVE9LRU4gI0lNUExJRUQKLSB4bWwtZGVjbGFyYXRpb24gKHllc3xubykgI0lNUExJRUQKLSBzdGFuZGFsb25lICh5ZXN8bm8pICNJTVBMSUVECi0gZG9jdHlwZS1wdWJsaWMgQ0RBVEEgI0lNUExJRUQKLSBkb2N0eXBlLXN5c3RlbSBDREFUQSAjSU1QTElFRAotIGNkYXRhLXNlY3Rpb24tZWxlbWVudHMgJXFuYW1lczsgI0lNUExJRUQKLSBpbmRlbnQgKHllc3xubykgI0lNUExJRUQKLSBtZWRpYS10eXBlIENEQVRBICNJTVBMSUVECi0+Ci0KLTwhRUxFTUVOVCB4c2w6a2V5IEVNUFRZPgotPCFBVFRMSVNUIHhzbDprZXkKLSBuYW1lICVxbmFtZTsgI1JFUVVJUkVECi0gbWF0Y2ggJXBhdHRlcm47ICNSRVFVSVJFRAotIHVzZSAlZXhwcjsgI1JFUVVJUkVECi0+Ci0KLTwhRUxFTUVOVCB4c2w6bG9jYWxlIEVNUFRZPgotPCFBVFRMSVNUIHhzbDpsb2NhbGUKLSBuYW1lICVxbmFtZTsgI0lNUExJRUQKLSBkZWNpbWFsLXNlcGFyYXRvciAlY2hhcjsgIi4iCi0gZ3JvdXBpbmctc2VwYXJhdG9yICVjaGFyOyAiLCIKLSBpbmZpbml0eSBDREFUQSAiJiN4MjIxRTsiCi0gbWludXMtc2lnbiAlY2hhcjsgIi0iCi0gTmFOIENEQVRBICImI3hGRkZEOyIKLSBwZXJjZW50ICVjaGFyOyAiJSIKLSBwZXItbWlsbGUgJWNoYXI7ICImI3gyMDMwOyIKLSB6ZXJvLWRpZ2l0ICVjaGFyOyAiMCIKLSBkaWdpdCAlY2hhcjsgIiMiCi0gcGF0dGVybi1zZXBhcmF0b3IgJWNoYXI7ICI7IgotPgotCi08IUVMRU1FTlQgeHNsOnRlbXBsYXRlCi0oI1BDREFUQQotICVpbnN0cnVjdGlvbnM7Ci0gJXJlc3VsdC1lbGVtZW50czsKLSB8IHhzbDpwYXJhbSkqCi0+Ci0KLTwhQVRUTElTVCB4c2w6dGVtcGxhdGUKLSBtYXRjaCAlcGF0dGVybjsgI0lNUExJRUQKLSBuYW1lICVxbmFtZTsgI0lNUExJRUQKLSBwcmlvcml0eSAlcHJpb3JpdHk7ICNJTVBMSUVECi0gbW9kZSAlcW5hbWU7ICNJTVBMSUVECi0gJXNwYWNlLWF0dDsKLT4KLQotPCFFTEVNRU5UIHhzbDp2YWx1ZS1vZiBFTVBUWT4KLTwhQVRUTElTVCB4c2w6dmFsdWUtb2YKLSBzZWxlY3QgJWV4cHI7ICNSRVFVSVJFRAotIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nICh5ZXN8bm8pICJubyIKLT4KLQotPCFFTEVNRU5UIHhzbDpjb3B5LW9mIEVNUFRZPgotPCFBVFRMSVNUIHhzbDpjb3B5LW9mIHNlbGVjdCAlZXhwcjsgI1JFUVVJUkVEPgotCi08IUVMRU1FTlQgeHNsOm51bWJlciBFTVBUWT4KLTwhQVRUTElTVCB4c2w6bnVtYmVyCi0gIGxldmVsIChzaW5nbGV8bXVsdGlwbGV8YW55KSAic2luZ2xlIgotICBjb3VudCAlcGF0dGVybjsgI0lNUExJRUQKLSAgZnJvbSAlcGF0dGVybjsgI0lNUExJRUQKLSAgdmFsdWUgJWV4cHI7ICNJTVBMSUVECi0gIGZvcm1hdCAlYXZ0OyAnMScKLSAgbGFuZyAlYXZ0OyAjSU1QTElFRAotICBsZXR0ZXItdmFsdWUgJWF2dDsgI0lNUExJRUQKLSAgZ3JvdXBpbmctc2VwYXJhdG9yJWF2dDsgI0lNUExJRUQKLSAgZ3JvdXBpbmctc2l6ZSAlYXZ0OyAjSU1QTElFRAotPgotCi08IUVMRU1FTlQgeHNsOmFwcGx5LXRlbXBsYXRlcyAoeHNsOnNvcnR8eHNsOndpdGgtcGFyYW0pKj4KLTwhQVRUTElTVCB4c2w6YXBwbHktdGVtcGxhdGVzCi0gc2VsZWN0ICVleHByOyAibm9kZSgpIgotIG1vZGUgJXFuYW1lOyAjSU1QTElFRAotPgotCi08IUVMRU1FTlQgeHNsOmFwcGx5LWltcG9ydHMgRU1QVFk+Ci0KLTwhLS0geHNsOnNvcnQgY2Fubm90IG9jY3VyIGFmdGVyIGFueSBvdGhlciBlbGVtZW50cyBvcgotYW55IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciAtLT4KLQotPCFFTEVNRU5UIHhzbDpmb3ItZWFjaAotKCNQQ0RBVEEKLSAlaW5zdHJ1Y3Rpb25zOwotICVyZXN1bHQtZWxlbWVudHM7Ci0gfCB4c2w6c29ydCkqCi0+Ci0KLTwhQVRUTElTVCB4c2w6Zm9yLWVhY2gKLSBzZWxlY3QgJWV4cHI7ICNSRVFVSVJFRAotICVzcGFjZS1hdHQ7Ci0+Ci0KLTwhRUxFTUVOVCB4c2w6c29ydCBFTVBUWT4KLTwhQVRUTElTVCB4c2w6c29ydAotIHNlbGVjdCAlZXhwcjsgIi4iCi0gbGFuZyAlYXZ0OyAjSU1QTElFRAotIGRhdGEtdHlwZSAlYXZ0OyAidGV4dCIKLSBvcmRlciAlYXZ0OyAiYXNjZW5kaW5nIgotIGNhc2Utb3JkZXIgJWF2dDsgI0lNUExJRUQKLT4KLQotPCFFTEVNRU5UIHhzbDppZiAldGVtcGxhdGU7PgotPCFBVFRMSVNUIHhzbDppZgotIHRlc3QgJWV4cHI7ICNSRVFVSVJFRAotICVzcGFjZS1hdHQ7Ci0+Ci0KLTwhRUxFTUVOVCB4c2w6Y2hvb3NlICh4c2w6d2hlbissIHhzbDpvdGhlcndpc2U/KT4KLTwhQVRUTElTVCB4c2w6Y2hvb3NlICVzcGFjZS1hdHQ7PgotCi08IUVMRU1FTlQgeHNsOndoZW4gJXRlbXBsYXRlOz4KLTwhQVRUTElTVCB4c2w6d2hlbgotIHRlc3QgJWV4cHI7ICNSRVFVSVJFRAotICVzcGFjZS1hdHQ7Ci0+Ci0KLTwhRUxFTUVOVCB4c2w6b3RoZXJ3aXNlICV0ZW1wbGF0ZTs+Ci08IUFUVExJU1QgeHNsOm90aGVyd2lzZSAlc3BhY2UtYXR0Oz4KLQotPCFFTEVNRU5UIHhzbDphdHRyaWJ1dGUtc2V0ICh4c2w6YXR0cmlidXRlKSo+Ci08IUFUVExJU1QgeHNsOmF0dHJpYnV0ZS1zZXQKLSBuYW1lICVxbmFtZTsgI1JFUVVJUkVECi0gdXNlLWF0dHJpYnV0ZS1zZXRzICVxbmFtZXM7ICNJTVBMSUVECi0+Ci0KLTwhRUxFTUVOVCB4c2w6Y2FsbC10ZW1wbGF0ZSAoeHNsOndpdGgtcGFyYW0pKj4KLTwhQVRUTElTVCB4c2w6Y2FsbC10ZW1wbGF0ZQotIG5hbWUgJXFuYW1lOyAjUkVRVUlSRUQKLT4KLQotPCFFTEVNRU5UIHhzbDp3aXRoLXBhcmFtICV0ZW1wbGF0ZTs+Ci08IUFUVExJU1QgeHNsOndpdGgtcGFyYW0KLSBuYW1lICVxbmFtZTsgI1JFUVVJUkVECi0gc2VsZWN0ICVleHByOyAjSU1QTElFRAotPgotCi08IUVMRU1FTlQgeHNsOnZhcmlhYmxlICV0ZW1wbGF0ZTs+Ci08IUFUVExJU1QgeHNsOnZhcmlhYmxlIAotIG5hbWUgJXFuYW1lOyAjUkVRVUlSRUQKLSBzZWxlY3QgJWV4cHI7ICNJTVBMSUVECi0+Ci0KLTwhRUxFTUVOVCB4c2w6cGFyYW0gJXRlbXBsYXRlOz4KLTwhQVRUTElTVCB4c2w6cGFyYW0gCi0gbmFtZSAlcW5hbWU7ICNSRVFVSVJFRAotIHNlbGVjdCAlZXhwcjsgI0lNUExJRUQKLT4KLQotPCFFTEVNRU5UIHhzbDp0ZXh0ICgjUENEQVRBKT4KLTwhQVRUTElTVCB4c2w6dGV4dAotIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nICh5ZXN8bm8pICJubyIKLT4KLQotPCFFTEVNRU5UIHhzbDpwcm9jZXNzaW5nLWluc3RydWN0aW9uICVjaGFyLXRlbXBsYXRlOz4KLTwhQVRUTElTVCB4c2w6cHJvY2Vzc2luZy1pbnN0cnVjdGlvbiAKLSBuYW1lICVhdnQ7ICNSRVFVSVJFRAotICVzcGFjZS1hdHQ7Ci0+Ci0KLTwhRUxFTUVOVCB4c2w6ZWxlbWVudCAldGVtcGxhdGU7PgotPCFBVFRMSVNUIHhzbDplbGVtZW50IAotIG5hbWUgJWF2dDsgI1JFUVVJUkVECi0gbmFtZXNwYWNlICVhdnQ7ICNJTVBMSUVECi0gdXNlLWF0dHJpYnV0ZS1zZXRzICVxbmFtZXM7ICNJTVBMSUVECi0gJXNwYWNlLWF0dDsKLT4KLQotPCFFTEVNRU5UIHhzbDphdHRyaWJ1dGUgJWNoYXItdGVtcGxhdGU7PgotPCFBVFRMSVNUIHhzbDphdHRyaWJ1dGUgCi0gbmFtZSAlYXZ0OyAjUkVRVUlSRUQKLSBuYW1lc3BhY2UgJWF2dDsgI0lNUExJRUQKLSAlc3BhY2UtYXR0OwotPgotCi08IUVMRU1FTlQgeHNsOmNvbW1lbnQgJWNoYXItdGVtcGxhdGU7PgotPCFBVFRMSVNUIHhzbDpjb21tZW50ICVzcGFjZS1hdHQ7PgotCi08IUVMRU1FTlQgeHNsOmNvcHkgJXRlbXBsYXRlOz4KLTwhQVRUTElTVCB4c2w6Y29weQotICVzcGFjZS1hdHQ7Ci0gdXNlLWF0dHJpYnV0ZS1zZXRzICVxbmFtZXM7ICNJTVBMSUVECi0+Ci0KLTwhRUxFTUVOVCB4c2w6bWVzc2FnZSAldGVtcGxhdGU7PgotPCFBVFRMSVNUIHhzbDptZXNzYWdlICVzcGFjZS1hdHQ7PgotCi08IUVMRU1FTlQgeHNsOmZhbGxiYWNrICV0ZW1wbGF0ZTs+Ci08IUFUVExJU1QgeHNsOmZhbGxiYWNrICVzcGFjZS1hdHQ7PgotCi0KLQotPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci08IS0tICAgSFRNTCA0LjAgU3RyaWN0IERURCAgIChyZXZpc2VkIHRvIGFsbG93IGZvciB4c2wgY29udGVudCkgICAgICAgICAgICAgICAtLT4KLTwhLS0gICBPcmlnaW5hbCBEVEQgZnJvbSBYTUw0SiBwYWNrYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgIE9yaWdpbmFsIFNHTUwgdG8gWE1MIGNvbnZlcnNpb24gYnkgVEFNVVJBLCBLZW50IGZvciBJQk0ncyBYTUw0SiAgICAgICAgLS0+Ci0KLTwhLS0gCi0gICAgIENvbnRhaW5lciBmb3IgYWxsIHhzbCBlbGVtZW50cyBhbGxvd2VkIGluc2lkZSByZXN1bHQtZWxlbWVudHMgZWxlbWVudHMsCi0gICAgIGkuZS46IGFsbCB4c2wgZWxlbWVudHMgd2hpY2ggYXJlIHZhbGlkIHdoZXJlIGEgcmVzdWx0LWVsZW1lbnQgaXMgdmFsaWQsCi0gICAgIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSB2YWxpZCBpbnNpZGUgQUxMIG5vbi1lbXB0eSBIVE1MIGVsZW1lbnRzLgotCi0gICAgIFlvdSdsbCBub3RpY2UgdGhpcyBkb2VzIGFsbG93IHRoZSB1c2VyIHRvIGNyZWF0ZSBpbnZhbGlkIFhTTCBkb2N1bWVudHMuCi0KLSAgeHNsOnNvcnQsIHhzbDpwYXJhbSwgeHNsOnBhcmFtLXZhcmlhYmxlIHdlcmUgbm90IGlubHVkZWQgYmVjYXVzZQotICBJTUhPIGl0IGlzIGJhZCBwcmFjdGljZSAoYW5kIGFuIGVycm9yPykgbm90IHRvIGluY2x1ZGUgdGhlbSBiZWZvcmUgCi0gIG90aGVyIHNpYmxpbmdzLCBlc3BlY2lhbGx5IHJlc3VsdC1ucyBvbmVzLgotLS0+Ci0KLTwhLS0gV2hpbGUgdGhlIGNvbnRlbnQgc2hvdWxkIGJlIHNpbXBseSAlaW5zdHJ1Y3Rpb25zOyB3ZSBjYW5ub3QgZG8gdGhhdAotICAgICBkdWUgdG8gdGhlIGZpcnN0ICd8JyBpbiAlaW5zdHJ1Y3Rpb25zIC0tPgotPCFFTlRJVFkgJSB4c2wtdmFsaWQtaW4tcmVzdWx0bnMgIgotICB4c2w6cHJvY2Vzc2luZy1pbnN0cnVjdGlvbgotICB8IHhzbDpjb21tZW50Ci0gIHwgeHNsOmVsZW1lbnQKLSAgfCB4c2w6YXR0cmlidXRlCi0gICVjaGFyLWluc3RydWN0aW9uczsKLSI+Ci0KLTwhLS0gQWxzbywgJXJlc3VsdC1lbGVtZW50LWF0dHM7IHdhcyBhZGRlZCB0byB0aGUgQVRUTElTVCBvZiBhbGwgaHRtbAotICAgICBlbG1lbnRzIC0tPgotCi08IS0tIFJldmlzaW9uOiAyMyAxLjMgZG9jcy9kYXRhL0hUTUw0MHN0cmljdC54bWwuZHRkLCB4bWw0amRvY3MsIHhtbDRqLWp0Y3N2LCB4bWw0al8xXzFfOSAgLS0+Ci0KLTwhLS0KLSAgICBUaGlzIGlzIEhUTUwgNC4wIFN0cmljdCBEVEQsIHdoaWNoIGV4Y2x1ZGVzIHRoZSBwcmVzZW50YXRpb24gCi0gICAgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgdGhhdCBXM0MgZXhwZWN0cyB0byBwaGFzZSBvdXQgYXMgCi0gICAgc3VwcG9ydCBmb3Igc3R5bGUgc2hlZXRzIG1hdHVyZXMuIEF1dGhvcnMgc2hvdWxkIHVzZSB0aGUgU3RyaWN0Ci0gICAgRFREIHdoZW4gcG9zc2libGUsIGJ1dCBtYXkgdXNlIHRoZSBUcmFuc2l0aW9uYWwgRFREIHdoZW4gc3VwcG9ydAotICAgIGZvciBwcmVzZW50YXRpb24gYXR0cmlidXRlIGFuZCBlbGVtZW50cyBpcyByZXF1aXJlZC4KLSAgICAKLSAgICBIVE1MIDQuMCBpbmNsdWRlcyBtZWNoYW5pc21zIGZvciBzdHlsZSBzaGVldHMsIHNjcmlwdGluZywKLSAgICBlbWJlZGRpbmcgb2JqZWN0cywgaW1wcm92ZWQgc3VwcG9ydCBmb3IgcmlnaHQgdG8gbGVmdCBhbmQgbWl4ZWQKLSAgICBkaXJlY3Rpb24gdGV4dCwgYW5kIGVuaGFuY2VtZW50cyB0byBmb3JtcyBmb3IgaW1wcm92ZWQKLSAgICBhY2Nlc3NpYmlsaXR5IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMuCi0KLSAgICAgICAgICBEcmFmdDogRGF0ZTogMTk5OC8wNy8wNiAxNzo1MDozMgotCi0gICAgICAgICAgQXV0aG9yczoKLSAgICAgICAgICAgICAgRGF2ZSBSYWdnZXR0IDxkc3JAdzMub3JnPgotICAgICAgICAgICAgICBBcm5hdWQgTGUgSG9ycyA8bGVob3JzQHczLm9yZz4KLSAgICAgICAgICAgICAgSWFuIEphY29icyA8aWpAdzMub3JnPgotCi0gICAgRnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBIVE1MIDQuMCBpcyBhdmFpbGFibGUgYXQ6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MAotLS0+Ci0KLTwhLS0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgTW9kaWZpZWQgZm9yIFhNTCAxLjAgYnk6Ci0JIlRBTVVSQSwgS2VudCIgPGtlbnRAdHJsLmlibS5jby5qcD4KLQotICAgIG8gSFRNTHNwZWNpYWwsIEhUTUxzeW1ib2wsIEhUTUxsYXQxIGFyZW4ndCBpbmNsdWRlZCBpbiB0aGlzIERURC4KLSAgICBvIFRoZSBgbGFuZycgYXR0cmlidXRlIHdhcyByZW5hbWVkIHRvIGB4bWw6bGFuZycuCi0KLQotICAgIFR5cGljYWwgdXNhZ2U6Ci0KLSAgICA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIuLi4iPz4KLSAgICA8IURPQ1RZUEUgSFRNTCBTWVNURU0gIi4uLi9IVE1MNDBzdHJpY3QueG1sLmR0ZCI+Ci0gICAgPEhUTUw+Ci0gICAgICA8SEVBRD4KLSAgICAgICAgLi4uCi0gICAgICAgIDxUSVRMRT4uLi48L1RJVExFPgotICAgICAgICAuLi4KLSAgICAgIDwvSEVBRD4KLSAgICAgIDxCT0RZPgotICAgICAgICAuLi4KLSAgICAgIDwvQk9EWT4KLSAgICA8L0hUTUw+Ci0KLSAgICBOb3RlOiBYTUwgaXMgY2FzZS1zZW5zaXRpdmUuICBTbyBlbGVtZW50IG5hbWVzIG11c3QgYmUgd3JpdHRlbgotICAgIGluIHVwcGVyY2FzZSBhbmQgYXR0cmlidXRlIG5hbWVzIG11c3QgYmUgd3JpdHRlbiBpbiBsb3dlcmNhc2UuCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0+Ci0KLTwhLS0KLSAgICBUeXBpY2FsIHVzYWdlOgotCi0gICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9zdHJpY3QuZHRkIj4KLSAgICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAuLi4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgLi4uCi0gICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLQotICAgIFRoZSBVUkkgdXNlZCBhcyBhIHN5c3RlbSBpZGVudGlmaWVyIHdpdGggdGhlIHB1YmxpYyBpZGVudGlmaWVyIGFsbG93cwotICAgIHRoZSB1c2VyIGFnZW50IHRvIGRvd25sb2FkIHRoZSBEVEQgYW5kIGVudGl0eSBzZXRzIGFzIG5lZWRlZC4KLQotICAgIFRoZSBGUEkgZm9yIHRoZSBUcmFuc2l0aW9uYWwgSFRNTCA0LjAgRFREIGlzOgotCi0gICAgICAgICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIgotCi0gICAgYW5kIGl0cyBVUkkgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGQKLQotICAgIElmIHlvdSBhcmUgd3JpdGluZyBhIGRvY3VtZW50IHRoYXQgaW5jbHVkZXMgZnJhbWVzLCB1c2UgCi0gICAgdGhlIGZvbGxvd2luZyBGUEk6Ci0KLSAgICAgICAgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiIKLQotICAgIHdpdGggdGhlIFVSSToKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2ZyYW1lc2V0LmR0ZAotCi0gICAgVGhlIGZvbGxvd2luZyBVUklzIGFyZSBzdXBwb3J0ZWQgaW4gcmVsYXRpb24gdG8gSFRNTCA0LjAKLQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL3N0cmljdC5kdGQiIChTdHJpY3QgRFREKQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2xvb3NlLmR0ZCIgKExvb3NlIERURCkKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9mcmFtZXNldC5kdGQiIChGcmFtZXNldCBEVEQpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvSFRNTGxhdDEuZW50IiAoTGF0aW4tMSBlbnRpdGllcykKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9IVE1Mc3ltYm9sLmVudCIgKFN5bWJvbCBlbnRpdGllcykKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9IVE1Mc3BlY2lhbC5lbnQiIChTcGVjaWFsIGVudGl0aWVzKQotCi0gICAgVGhlc2UgVVJJcyBwb2ludCB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZWFjaCBmaWxlLiBUbyByZWZlcmVuY2UKLSAgICB0aGlzIHNwZWNpZmljIHJldmlzaW9uIHVzZSB0aGUgZm9sbG93aW5nIFVSSXM6Ci0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC05NzEyMTgvc3RyaWN0LmR0ZCIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC05NzEyMTgvbG9vc2UuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwLTk3MTIxOC9mcmFtZXNldC5kdGQiCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAtOTcxMjE4L0hUTUxsYXQxLmVudCIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC05NzEyMTgvSFRNTHN5bWJvbC5lbnQiCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAtOTcxMjE4L0hUTUxzcGVjaWFsLmVudCIKLQotLS0+Ci0KLTwhLS09PT0gZm9yIFhNTCA9PT0tLT4KLTwhRU5USVRZICUgTnVtYmVyICJDREFUQSI+Ci08IUVOVElUWSAlIE5hbWUgIk5NVE9LRU4iPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT0gSW1wb3J0ZWQgTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGUgIkNEQVRBIgotPiA8IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZXMgIkNEQVRBIgotPiA8IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldCAiQ0RBVEEiCi0+IDwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0cyAiQ0RBVEEiCi0+IDwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGFuZ3VhZ2VDb2RlICJOTVRPS0VOIgotPiA8IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMxNzY2XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJhY3RlciAiQ0RBVEEiCi0+IDwhLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBMaW5rVHlwZXMgIkNEQVRBIgotPiA8IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBNZWRpYURlc2MgIkNEQVRBIgotPiA8IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycwotICAgIC0tPgotCi08IS0tIERlZmluZWQgZWxzZXdoZXJlIGluIHRoaXMgRFRECi08IUVOVElUWSAlIFVSSSAiQ0RBVEEiCi0+IDwhIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLAotICAgICAgIHNlZSBbVVJJXQotICAgIC0tPgotCi08IUVOVElUWSAlIERhdGV0aW1lICJDREFUQSI+PCEtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci0KLQotPCFFTlRJVFkgJSBTY3JpcHQgIkNEQVRBIj48IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotCi08IUVOVElUWSAlIFN0eWxlU2hlZXQgIkNEQVRBIj48IS0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLQotCi08IUVOVElUWSAlIFRleHQgIkNEQVRBIj4KLQotCi08IS0tIFBhcmFtZXRlciBFbnRpdGllcyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIj48IS0tIHJlcGVhdGFibGUgaGVhZCBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgaGVhZGluZyAiSDF8SDJ8SDN8SDR8SDV8SDYiPgotPCFFTlRJVFkgJSBsaXN0ICJVTCB8IE9MIj4KLTwhRU5USVRZICUgcHJlZm9ybWF0dGVkICJQUkUiPgotCi0KLTwhLS09PT09PT09PT09PT09PT09IENoYXJhY3RlciBtbmVtb25pYyBlbnRpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS1FTlRJVFkgJSBIVE1MbGF0MSBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIExhdGluMS8vRU4vL0hUTUwiCi0gICAiSFRNTGxhdDEuZW50Ii0tPgotPCEtLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwLTk3MTIxOC9IVE1MbGF0MS5lbnQiLS0+Ci08IS0tJUhUTUxsYXQxOy0tPgotCi08IS0tRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMvL0VOLy9IVE1MIgotICAgIkhUTUxzeW1ib2wuZW50Ii0tPgotPCEtLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwLTk3MTIxOC9IVE1Mc3ltYm9sLmVudCItLT4KLTwhLS0lSFRNTHN5bWJvbDstLT4KLQotPCEtLUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTUwiCi0gICAiSFRNTHNwZWNpYWwuZW50Ii0tPgotPCEtLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwLTk3MTIxOC9IVE1Mc3BlY2lhbC5lbnQiLS0+Ci08IS0tJUhUTUxzcGVjaWFsOy0tPgotCi08IS0tIFdlIGRlZmluZSB0aGVzZSBlbHNld2hlcmUgaW4gdGhpcyBtaXhlZCBEVEQKLTwhRU5USVRZIHF1b3QgIiYjMzQ7Ij4KLTwhRU5USVRZIGFtcCAgIiYjMzg7Ij4KLTwhRU5USVRZIGx0ICAgIiYjNjA7Ij4KLTwhRU5USVRZIGd0ICAgIiYjNjI7Ij4KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICAlcmVzdWx0LWVsZW1lbnQtYXR0czsiCi0+Ci0KLTwhRU5USVRZICUgaTE4bgotICJ4bWw6bGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjSU1QTElFRCIKLSAgPgotCi08IUVOVElUWSAlIGV2ZW50cwotICJvbmNsaWNrICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmRibGNsaWNrICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlZG93biAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlb3ZlciAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlb3V0ICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleWRvd24gICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleXVwICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIFJlc2VydmVkIEZlYXR1cmUgU3dpdGNoIC0tPgotPCFFTlRJVFkgJSBIVE1MLlJlc2VydmVkICJJR05PUkUiPgotCi08IS0tIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0+Ci08IVsgJUhUTUwuUmVzZXJ2ZWQ7IFsKLTwhRU5USVRZICUgcmVzZXJ2ZWQKLSAiZGF0YXNyYyAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0YWZsZCAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgZGF0YWZvcm1hdGFzIChwbGFpbnRleHR8aHRtbCkgcGxhaW50ZXh0IgotICA+Ci1dXT4KLQotPCFFTlRJVFkgJSByZXNlcnZlZCAiIj4KLQotPCFFTlRJVFkgJSBhdHRycyAiJWNvcmVhdHRyczsgJWkxOG47ICVldmVudHM7Ij4KLQotCi08IS0tPT09PT09PT09PT09PT09PT09PSBUZXh0IE1hcmt1cCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGZvbnRzdHlsZQotICJUVCB8IEkgfCBCIHwgQklHIHwgU01BTEwiPgotCi08IUVOVElUWSAlIHBocmFzZSAiRU0gfCBTVFJPTkcgfCBERk4gfCBDT0RFIHwKLSAgICAgICAgICAgICAgICAgICBTQU1QIHwgS0JEIHwgVkFSIHwgQ0lURSB8IEFCQlIgfCBBQ1JPTllNIiA+Ci0KLTwhRU5USVRZICUgc3BlY2lhbAotICAgIkEgfCBJTUcgfCBPQkpFQ1QgfCBCUiB8IFNDUklQVCB8IE1BUCB8IFEgfCBTVUIgfCBTVVAgfCBTUEFOIHwgQkRPIj4KLTwhRU5USVRZICUgc3BlY2lhbC1BCi0gICAiSU1HIHwgT0JKRUNUIHwgQlIgfCBTQ1JJUFQgfCBNQVAgfCBRIHwgU1VCIHwgU1VQIHwgU1BBTiB8IEJETyI+Ci0KLTwhRU5USVRZICUgZm9ybWN0cmwgIklOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEgfCBMQUJFTCB8IEJVVFRPTiI+Ci0KLTwhLS0gJWlubGluZTsgY292ZXJzIGlubGluZSBvciAidGV4dC1sZXZlbCIgZWxlbWVudHMgLS0+Ci08IUVOVElUWSAlIGlubGluZSAiI1BDREFUQSB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlc3BlY2lhbDsgfCAlZm9ybWN0cmw7Ij4KLTwhRU5USVRZICUgaW5saW5lLUEgIiNQQ0RBVEEgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJXNwZWNpYWwtQTsgfCAlZm9ybWN0cmw7Ij4KLTwhRU5USVRZICUgaW5saW5lLUxBQkVMICIjUENEQVRBIHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVzcGVjaWFsOyB8IElOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEgfCBCVVRUT04iPgotCi08IS0tCi08IUVMRU1FTlQgKCVmb250c3R5bGU7fCVwaHJhc2U7KSAgICAgKCVpbmxpbmU7KSo+Ci08IUFUVExJU1QgKCVmb250c3R5bGU7fCVwaHJhc2U7KQotICAlYXR0cnM7Ci0gID4tLT4KLTwhRUxFTUVOVCBUVCAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIFRUICVhdHRyczs+Ci08IUVMRU1FTlQgSSAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEkgJWF0dHJzOz4KLTwhRUxFTUVOVCBCICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgQiAlYXR0cnM7PgotPCFFTEVNRU5UIEJJRyAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEJJRyAlYXR0cnM7PgotPCFFTEVNRU5UIFNNQUxMICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgU01BTEwgJWF0dHJzOz4KLTwhRUxFTUVOVCBFTSAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEVNICVhdHRyczs+Ci08IUVMRU1FTlQgU1RST05HICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgU1RST05HICVhdHRyczs+Ci08IUVMRU1FTlQgREZOICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgREZOICVhdHRyczs+Ci08IUVMRU1FTlQgQ09ERSAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIENPREUgJWF0dHJzOz4KLTwhRUxFTUVOVCBTQU1QICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgU0FNUCAlYXR0cnM7PgotPCFFTEVNRU5UIEtCRCAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEtCRCAlYXR0cnM7PgotPCFFTEVNRU5UIFZBUiAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIFZBUiAlYXR0cnM7PgotPCFFTEVNRU5UIENJVEUgKCVpbmxpbmU7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj4KLTwhQVRUTElTVCBDSVRFICVhdHRyczs+Ci08IUVMRU1FTlQgQUJCUiAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEFCQlIgJWF0dHJzOz4KLTwhRUxFTUVOVCBBQ1JPTllNICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgQUNST05ZTSAlYXR0cnM7PgotCi0KLTwhRUxFTUVOVCBTVVAgKCVpbmxpbmU7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj48IS0tIHN1YnNjcmlwdCwgc3VwZXJzY3JpcHQgLS0+Ci08IUFUVExJU1QgU1VQCi0gICVhdHRyczsKLSAgPgotPCFFTEVNRU5UIFNVQiAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gc3Vic2NyaXB0LCBzdXBlcnNjcmlwdCAtLT4KLTwhQVRUTElTVCBTVUIKLSAgJWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBTUEFOICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBTUEFOCi0gICVhdHRyczsKLSAgJXJlc2VydmVkOwkJCQotICA+Ci0KLTwhRUxFTUVOVCBCRE8gKCVpbmxpbmU7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj48IS0tIEkxOE4gQmlEaSBvdmVyLXJpZGUgLS0+Ci08IUFUVExJU1QgQkRPCi0gICVjb3JlYXR0cnM7Ci0gIGxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNSRVFVSVJFRAotICA+Ci0KLQotPCFFTEVNRU5UIEJSICAgICBFTVBUWT48IS0tIGZvcmNlZCBsaW5lIGJyZWFrIC0tPgotPCFBVFRMSVNUIEJSCi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBIVE1MIGNvbnRlbnQgbW9kZWxzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICAgIEhUTUwgaGFzIHR3byBiYXNpYyBjb250ZW50IG1vZGVsczoKLQotICAgICAgICAlaW5saW5lOyAgICAgY2hhcmFjdGVyIGxldmVsIGVsZW1lbnRzIGFuZCB0ZXh0IHN0cmluZ3MKLSAgICAgICAgJWJsb2NrOyAgICAgIGJsb2NrLWxpa2UgZWxlbWVudHMgZS5nLiBwYXJhZ3JhcGhzIGFuZCBsaXN0cwotLS0+Ci0KLTwhRU5USVRZICUgYmxvY2sKLSAgICAgIlAgfCAlaGVhZGluZzsgfCAlbGlzdDsgfCAlcHJlZm9ybWF0dGVkOyB8IERMIHwgRElWIHwgTk9TQ1JJUFQgfAotICAgICAgQkxPQ0tRVU9URSB8IEZPUk0gfCBIUiB8IFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTIj4KLTwhRU5USVRZICUgYmxvY2stRk9STQotICAgICAiUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBOT1NDUklQVCB8Ci0gICAgICBCTE9DS1FVT1RFIHwgSFIgfCBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUyI+Ci08IUVOVElUWSAlIGJsb2NrLUZPUk0tRklFTERTRVQKLSAgICAgIlAgfCAlaGVhZGluZzsgfCAlbGlzdDsgfCAlcHJlZm9ybWF0dGVkOyB8IERMIHwgRElWIHwgTk9TQ1JJUFQgfAotICAgICAgQkxPQ0tRVU9URSB8IEhSIHwgVEFCTEUgfCBBRERSRVNTIj4KLQotPCEtLTwhRU5USVRZICUgZmxvdyAiJWJsb2NrOyB8ICVpbmxpbmU7Ij4tLT4KLTwhRU5USVRZICUgZmxvdyAiJWlubGluZTsgfCAlYmxvY2s7Ij4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLUVMRU1FTlQgQk9EWSAgICAgKCVibG9jazt8U0NSSVBUKSsgKyhJTlN8REVMKSAgZG9jdW1lbnQgYm9keSAtLT4KLTwhRUxFTUVOVCBCT0RZICgoSU5TfERFTCkqLCAoJXhzbC12YWxpZC1pbi1yZXN1bHRuczt8JWJsb2NrO3xTQ1JJUFQpLCAoSU5TfERFTCkqKSsgPjwhLS0gZG9jdW1lbnQgYm9keSAtLT4KLTwhQVRUTElTVCBCT0RZCi0gICVhdHRyczsKLSAgb25sb2FkICAgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQKLSAgb251bmxvYWQgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgQUREUkVTUyAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gaW5mb3JtYXRpb24gb24gYXV0aG9yIC0tPgotPCFBVFRMSVNUIEFERFJFU1MKLSAgJWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBESVYgKCVmbG93OyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBESVYKLSAgJWF0dHJzOwotICAlcmVzZXJ2ZWQ7Ci0gID4KLQotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBBbmNob3IgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIFNoYXBlICIocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KSI+Ci08IUVOVElUWSAlIENvb3JkcyAiQ0RBVEEiPjwhLS0gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCFFTEVNRU5UIEEgKCVpbmxpbmUtQTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gYW5jaG9yIC0tPgotPCFBVFRMSVNUIEEKLSAgJWF0dHJzOwotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICAicmVjdCIKLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENsaWVudC1zaWRlIGltYWdlIG1hcHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50IGFsdGhvdWdoIHRoaXMgaXNuJ3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBNQVAgICgoJXhzbC12YWxpZC1pbi1yZXN1bHRuczt8JWJsb2NrOykrIHwgKCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7fEFSRUErKSk+PCEtLSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0+Ci08IUFUVExJU1QgTUFQCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVECi0gID4KLQotPCFFTEVNRU5UIEFSRUEgICAgIEVNUFRZPjwhLS0gY2xpZW50LXNpZGUgaW1hZ2UgbWFwIGFyZWEgLS0+Ci08IUFUVExJU1QgQVJFQQotICAlYXR0cnM7Ci0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgICJyZWN0IgotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBub2hyZWYgICAgICAobm9ocmVmKSAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBMSU5LIEVsZW1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFJlbGF0aW9uc2hpcCB2YWx1ZXMgY2FuIGJlIHVzZWQgaW4gcHJpbmNpcGxlOgotCi0gICBhKSBmb3IgZG9jdW1lbnQgc3BlY2lmaWMgdG9vbGJhcnMvbWVudXMgd2hlbiB1c2VkCi0gICAgICB3aXRoIHRoZSBMSU5LIGVsZW1lbnQgaW4gZG9jdW1lbnQgaGVhZCBlLmcuCi0gICAgICAgIHN0YXJ0LCBjb250ZW50cywgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgIGIpIHRvIGxpbmsgdG8gYSBzZXBhcmF0ZSBzdHlsZSBzaGVldCAocmVsPXN0eWxlc2hlZXQpCi0gICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPXNjcmlwdCkKLSAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mCi0gICAgICBodG1sIG5vZGVzIGFyZSByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIGUuZy4gYSBwb3N0c2NyaXB0IG9yIHBkZiB2ZXJzaW9uIChyZWw9YWx0ZXJuYXRlIG1lZGlhPXByaW50KQotLS0+Ci0KLTwhRUxFTUVOVCBMSU5LICAgICBFTVBUWT48IS0tIGEgbWVkaWEtaW5kZXBlbmRlbnQgbGluayAtLT4KLTwhQVRUTElTVCBMSU5LCi0gICVhdHRyczsKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGluIHN0cmljdCBEVEQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIj48IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhRU5USVRZICUgTXVsdGlMZW5ndGggIkNEQVRBIj48IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLQotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aHMgIkNEQVRBIj48IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIE11bHRpTGVuZ3RoIC0tPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiPjwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLQotCi08IS0tIFRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGV4dC1vbmx5IFVBcyBhcyB3ZWxsIGFzIAotICAgdG8gbWFrZSBpbWFnZSBjb250ZW50IHVuZGVyc3RhbmRhYmxlIGFuZCBuYXZpZ2FibGUgCi0gICB0byB1c2VycyBvZiBub24tdmlzdWFsIFVBcywgeW91IG5lZWQgdG8gcHJvdmlkZQotICAgYSBkZXNjcmlwdGlvbiB3aXRoIEFMVCwgYW5kIGF2b2lkIHNlcnZlci1zaWRlIGltYWdlIG1hcHMgLS0+Ci08IUVMRU1FTlQgSU1HICAgICBFTVBUWT48IS0tIEVtYmVkZGVkIGltYWdlIC0tPgotPCFBVFRMSVNUIElNRwotICAlYXR0cnM7Ci0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaXNtYXAgICAgICAgKGlzbWFwKSAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIFVTRU1BUCBwb2ludHMgdG8gYSBNQVAgZWxlbWVudCB3aGljaCBtYXkgYmUgaW4gdGhpcyBkb2N1bWVudAotICBvciBhbiBleHRlcm5hbCBkb2N1bWVudCwgYWx0aG91Z2ggdGhlIGxhdHRlciBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09IE9CSkVDVCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBPQkpFQ1QgaXMgdXNlZCB0byBlbWJlZCBvYmplY3RzIGFzIHBhcnQgb2YgSFRNTCBwYWdlcyAKLSAgUEFSQU0gZWxlbWVudHMgc2hvdWxkIHByZWNlZGUgb3RoZXIgY29udGVudC4gU0dNTCBtaXhlZCBjb250ZW50Ci0gIG1vZGVsIHRlY2huaWNhbGl0eSBwcmVjbHVkZXMgc3BlY2lmeWluZyB0aGlzIGZvcm1hbGx5IC4uLgotLS0+Ci0KLTwhRUxFTUVOVCBPQkpFQ1QgKCVmbG93OyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7IHwgUEFSQU0pKgotPjwhLS0gZ2VuZXJpYyBlbWJlZGRlZCBvYmplY3QgLS0+Ci08IUFUVExJU1QgT0JKRUNUCi0gICVhdHRyczsKLSAgZGVjbGFyZSAgICAgKGRlY2xhcmUpICAgICAgI0lNUExJRUQKLSAgY2xhc3NpZCAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0YSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgY29kZXR5cGUgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgYXJjaGl2ZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgJXJlc2VydmVkOwotICA+Ci0KLTwhRUxFTUVOVCBQQVJBTSAgICAgRU1QVFk+PCEtLSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZSAtLT4KLTwhQVRUTElTVCBQQVJBTQotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWV0eXBlICAgKERBVEF8UkVGfE9CSkVDVCkgIkRBVEEiCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gID4KLQotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIb3Jpem9udGFsIFJ1bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgSFIgICAgIEVNUFRZPjwhLS0gaG9yaXpvbnRhbCBydWxlIC0tPgotPCFBVFRMSVNUIEhSCi0gICVjb3JlYXR0cnM7Ci0gICVldmVudHM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUGFyYWdyYXBocyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFAgKCVpbmxpbmU7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj48IS0tIHBhcmFncmFwaCAtLT4KLTwhQVRUTElTVCBQCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIZWFkaW5ncyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZXJlIGFyZSBzaXggbGV2ZWxzIG9mIGhlYWRpbmdzIGZyb20gSDEgKHRoZSBtb3N0IGltcG9ydGFudCkKLSAgdG8gSDYgKHRoZSBsZWFzdCBpbXBvcnRhbnQpLgotLS0+Ci0KLTwhLS0KLTwhRUxFTUVOVCAoJWhlYWRpbmc7KSAgICAgICglaW5saW5lOykqPgotPCFBVFRMSVNUICglaGVhZGluZzspCi0gICVhdHRyczsKLSAgPi0tPgotPCFFTEVNRU5UIEgxICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgSDEgJWF0dHJzOz4KLTwhRUxFTUVOVCBIMiAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEgyICVhdHRyczs+Ci08IUVMRU1FTlQgSDMgKCVpbmxpbmU7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj4KLTwhQVRUTElTVCBIMyAlYXR0cnM7PgotPCFFTEVNRU5UIEg0ICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgSDQgJWF0dHJzOz4KLTwhRUxFTUVOVCBINSAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEg1ICVhdHRyczs+Ci08IUVMRU1FTlQgSDYgKCVpbmxpbmU7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj4KLTwhQVRUTElTVCBINiAlYXR0cnM7PgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZXhjbHVkZXMgbWFya3VwIGZvciBpbWFnZXMgYW5kIGNoYW5nZXMgaW4gZm9udCBzaXplIC0tPgotPCEtLQotPCFFTlRJVFkgJSBwcmUuZXhjbHVzaW9uICJJTUd8T0JKRUNUfEJJR3xTTUFMTHxTVUJ8U1VQIj4KLQotPCFFTEVNRU5UIFBSRSAgKCVpbmxpbmU7KSogLSglcHJlLmV4Y2x1c2lvbjspPjwhIHByZWZvcm1hdHRlZCB0ZXh0IC0tPgotCi08IUVMRU1FTlQgUFJFICgjUENEQVRBIHwleHNsLXZhbGlkLWluLXJlc3VsdG5zO3wgVFR8SXxCfCVwaHJhc2U7fEF8QlJ8U0NSSVBUfE1BUHxRfFNQQU58QkRPfCVmb3JtY3RybDspKj4KLQkJCTwhLS0gcHJlZm9ybWF0dGVkIHRleHQgLS0+Ci08IUFUVExJU1QgUFJFCi0gICVhdHRyczs+Ci08IS0tIFNob3VsZCB0aGUgYXR0cmlidXRlIGJlbG93IGJlIGluY3VkZWQgaW4gUFJFPwotICB4bWw6c3BhY2UgKGRlZmF1bHR8cHJlc2VydmUpICNGSVhFRCAicHJlc2VydmUiCi0tLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PSBJbmxpbmUgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFEgICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBzaG9ydCBpbmxpbmUgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIFEKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEJsb2NrLWxpa2UgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBCTE9DS1FVT1RFICAoJWJsb2NrO3wleHNsLXZhbGlkLWluLXJlc3VsdG5zO3xTQ1JJUFQpKz48IS0tIGxvbmcgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIEJMT0NLUVVPVEUKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEluc2VydGVkL0RlbGV0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLQotPCEtLSBJTlMvREVMIGFyZSBoYW5kbGVkIGJ5IGluY2x1c2lvbiBvbiBCT0RZIC0tPgotPCFFTEVNRU5UIElOUyAoJWZsb3c7fCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBpbnNlcnRlZCB0ZXh0LCBkZWxldGVkIHRleHQgLS0+Ci08IUFUVExJU1QgSU5TCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQKLSAgPgotPCFFTEVNRU5UIERFTCAoJWZsb3c7fCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBpbnNlcnRlZCB0ZXh0LCBkZWxldGVkIHRleHQgLS0+Ci08IUFUVExJU1QgREVMCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGRlZmluaXRpb24gbGlzdHMgLSBEVCBmb3IgdGVybSwgREQgZm9yIGl0cyBkZWZpbml0aW9uIC0tPgotCi08IUVMRU1FTlQgREwgICgleHNsLXZhbGlkLWluLXJlc3VsdG5zO3wgRFR8REQpKz48IS0tIGRlZmluaXRpb24gbGlzdCAtLT4KLTwhQVRUTElTVCBETAotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIERUICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBkZWZpbml0aW9uIHRlcm0gLS0+Ci08IUVMRU1FTlQgREQgKCVmbG93OyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBkZWZpbml0aW9uIGRlc2NyaXB0aW9uIC0tPgotPCFBVFRMSVNUIERUCi0gICVhdHRyczsKLSAgPgotPCFBVFRMSVNUIERECi0gICVhdHRyczsKLSAgPgotCi0KLTwhRUxFTUVOVCBPTCAoJXhzbC12YWxpZC1pbi1yZXN1bHRuczsgfCBMSSkrPjwhLS0gb3JkZXJlZCBsaXN0IC0tPgotPCFBVFRMSVNUIE9MCi0gICVhdHRyczsKLSAgPgotCi08IS0tIFVub3JkZXJlZCBMaXN0cyAoVUwpIGJ1bGxldCBzdHlsZXMgLS0+Ci08IUVMRU1FTlQgVUwgKCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7IHwgTEkpKz48IS0tIHVub3JkZXJlZCBsaXN0IC0tPgotPCFBVFRMSVNUIFVMCi0gICVhdHRyczsKLSAgPgotCi0KLQotPCFFTEVNRU5UIExJICglZmxvdzsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gbGlzdCBpdGVtIC0tPgotPCFBVFRMSVNUIExJCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBGb3JtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCFFTEVNRU5UIEZPUk0gKCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7fCVibG9jay1GT1JNO3xTQ1JJUFQpKz4KLQotPCEtLSBpbnRlcmFjdGl2ZSBmb3JtIC0tPgotPCFBVFRMSVNUIEZPUk0KLSAgJWF0dHJzOwotICBhY3Rpb24gICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQKLSAgbWV0aG9kICAgICAgKEdFVHxQT1NUKSAgICAgIkdFVCIKLSAgZW5jdHlwZSAgICAgJUNvbnRlbnRUeXBlOyAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgb25zdWJtaXQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25yZXNldCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAgI0lNUExJRUQKLSAgPgotCi08IS0tIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkIC0tPgotPCFFTEVNRU5UIExBQkVMICAoJWlubGluZS1MQUJFTDsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gZm9ybSBmaWVsZCBsYWJlbCB0ZXh0IC0tPgotPCFBVFRMSVNUIExBQkVMCi0gICVhdHRyczsKLSAgZm9yICAgICAgICAgSURSRUYgICAgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVOVElUWSAlIElucHV0VHlwZQotICAiKFRFWFQgfCBQQVNTV09SRCB8IENIRUNLQk9YIHwKLSAgICBSQURJTyB8IFNVQk1JVCB8IFJFU0VUIHwKLSAgICBGSUxFIHwgSElEREVOIHwgSU1BR0UgfCBCVVRUT04pIgotICAgPgotCi08IS0tIGF0dHJpYnV0ZSBuYW1lIHJlcXVpcmVkIGZvciBhbGwgYnV0IHN1Ym1pdCAmIHJlc2V0IC0tPgotPCFFTEVNRU5UIElOUFVUICAgICBFTVBUWT48IS0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBJTlBVVAotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVJbnB1dFR5cGU7ICAgICJURVhUIgotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjaGVja2VkICAgICAoY2hlY2tlZCkgICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBtYXhsZW5ndGggICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRAotICAlcmVzZXJ2ZWQ7Ci0gID4KLQotPCFFTEVNRU5UIFNFTEVDVCAoKCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7fE9QVEdST1VQKXwoJXhzbC12YWxpZC1pbi1yZXN1bHRuczt8T1BUSU9OKSkrID48IS0tIG9wdGlvbiBzZWxlY3RvciAtLT4KLTwhQVRUTElTVCBTRUxFQ1QKLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBtdWx0aXBsZSAgICAobXVsdGlwbGUpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICAlcmVzZXJ2ZWQ7Ci0gID4KLQotPCFFTEVNRU5UIE9QVEdST1VQICgleHNsLXZhbGlkLWluLXJlc3VsdG5zO3xPUFRJT04pKz4gIDwhLS0gb3B0aW9uIGdyb3VwIC0tPgotPCFBVFRMSVNUIE9QVEdST1VQCi0gICVhdHRyczsKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gID4KLQotPCFFTEVNRU5UIE9QVElPTiAgKCNQQ0RBVEEgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gc2VsZWN0YWJsZSBjaG9pY2UgLS0+Ci08IUFUVExJU1QgT1BUSU9OCi0gICVhdHRyczsKLSAgc2VsZWN0ZWQgICAgKHNlbGVjdGVkKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgVEVYVEFSRUEgKCNQQ0RBVEEgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gbXVsdGktbGluZSB0ZXh0IGZpZWxkIC0tPgotPCFBVFRMSVNUIFRFWFRBUkVBCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgcm93cyAgICAgICAgJU51bWJlcjsgICAgICAgI1JFUVVJUkVECi0gIGNvbHMgICAgICAgICVOdW1iZXI7ICAgICAgICNSRVFVSVJFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICAlcmVzZXJ2ZWQ7Ci0gID4KLQotPCEtLQotICAjUENEQVRBIGlzIHRvIHNvbHZlIHRoZSBtaXhlZCBjb250ZW50IHByb2JsZW0sCi0gIHBlciBzcGVjaWZpY2F0aW9uIG9ubHkgd2hpdGVzcGFjZSBpcyBhbGxvd2VkIHRoZXJlIQotCi0gIFdlIGRvIGFsbG93IFhTTCBpbnNpZGUgYXMgd2VsbAotIC0tPgotPCEtLUVMRU1FTlQgRklFTERTRVQgICAgICgjUENEQVRBLExFR0VORCwoJWZsb3c7KSopICAgIGZvcm0gY29udHJvbCBncm91cCAtLT4KLTwhRUxFTUVOVCBGSUVMRFNFVCAgKCVmbG93O3wleHNsLXZhbGlkLWluLXJlc3VsdG5zO3xMRUdFTkQpKj48IS0tIGZvcm0gY29udHJvbCBncm91cCAtLT4KLTwhQVRUTElTVCBGSUVMRFNFVAotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIExFR0VORCAoJWlubGluZTt8JXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj48IS0tIGZpZWxkc2V0IGxlZ2VuZCAtLT4KLTwhRU5USVRZICUgTEFsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBMRUdFTkQKLSAgJWF0dHJzOwotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBCVVRUT04KLSAgICAgKCNQQ0RBVEEgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOyB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlc3BlY2lhbC1BOyB8ICVibG9jazspKgotPjwhLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgQlVUVE9OCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpICJzdWJtaXQiCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gICVyZXNlcnZlZDsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT0gVGFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIElFVEYgSFRNTCB0YWJsZSBzdGFuZGFyZCwgc2VlIFtSRkMxOTQyXSAtLT4KLQotPCEtLQotIFRoZSBCT1JERVIgYXR0cmlidXRlIHNldHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgZnJhbWUgYXJvdW5kIHRoZQotIHRhYmxlLiBUaGUgZGVmYXVsdCB1bml0cyBhcmUgc2NyZWVuIHBpeGVscy4KLQotIFRoZSBGUkFNRSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIHBhcnRzIG9mIHRoZSBmcmFtZSBhcm91bmQKLSB0aGUgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkLiBUaGUgdmFsdWVzIGFyZSBub3QgdGhlIHNhbWUgYXMKLSBDQUxTIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCB3aXRoIHRoZSBWQUxJR04gYXR0cmlidXRlLgotCi0gVGhlIHZhbHVlICJib3JkZXIiIGlzIGluY2x1ZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoCi0gPFRBQkxFIEJPUkRFUj4gd2hpY2ggeWllbGRzIGZyYW1lPWJvcmRlciBhbmQgYm9yZGVyPWltcGxpZWQKLSBGb3IgPFRBQkxFIEJPUkRFUj0xPiB5b3UgZ2V0IGJvcmRlcj0xIGFuZCBmcmFtZT1pbXBsaWVkLiBJbiB0aGlzCi0gY2FzZSwgaXQgaXMgYXBwcm9wcmlhdGUgdG8gdHJlYXQgdGhpcyBhcyBmcmFtZT1ib3JkZXIgZm9yIGJhY2t3YXJkcwotIGNvbXBhdGliaWxpdHkgd2l0aCBkZXBsb3llZCBicm93c2Vycy4KLS0tPgotPCFFTlRJVFkgJSBURnJhbWUgIih2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKSI+Ci0KLTwhLS0KLSBUaGUgUlVMRVMgYXR0cmlidXRlIGRlZmluZXMgd2hpY2ggcnVsZXMgdG8gZHJhdyBiZXR3ZWVuIGNlbGxzOgotCi0gSWYgUlVMRVMgaXMgYWJzZW50IHRoZW4gYXNzdW1lOgotICAgICAibm9uZSIgaWYgQk9SREVSIGlzIGFic2VudCBvciBCT1JERVI9MCBvdGhlcndpc2UgImFsbCIKLS0tPgotCi08IUVOVElUWSAlIFRSdWxlcyAiKG5vbmUgfCBncm91cHMgfCByb3dzIHwgY29scyB8IGFsbCkiPgotICAKLTwhLS0gaG9yaXpvbnRhbCBwbGFjZW1lbnQgb2YgdGFibGUgcmVsYXRpdmUgdG8gZG9jdW1lbnQgLS0+Ci08IUVOVElUWSAlIFRBbGlnbiAiKGxlZnR8Y2VudGVyfHJpZ2h0KSI+Ci0KLTwhLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbGhhbGlnbgotICAiYWxpZ24gICAgICAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeXxjaGFyKSAjSU1QTElFRAotICAgY2hhciAgICAgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICAgY2hhcm9mZiAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIHZlcnRpY2FsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzIC0tPgotPCFFTlRJVFkgJSBjZWxsdmFsaWduCi0gICJ2YWxpZ24gICAgICh0b3B8bWlkZGxlfGJvdHRvbXxiYXNlbGluZSkgI0lNUExJRUQiCi0gID4KLQotPCFFTEVNRU5UIFRBQkxFIAotICAoKCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSosIENBUFRJT04/LCAoJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKiwKLSAgICgoQ09MIHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKnwoQ09MR1JPVVAgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqKSwKLSAgICgoVEhFQUQ/LCgleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqLFRGT09UPywoJXhzbC12YWxpZC1pbi1yZXN1bHRuczt8VEJPRFkpKykKLSAgICB8ICgleHNsLXZhbGlkLWluLXJlc3VsdG5zO3xUUikrKSApPgotCi08IUVMRU1FTlQgQ0FQVElPTiAgICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSB0YWJsZSBjYXB0aW9uIC0tPgotPCFFTEVNRU5UIFRIRUFEICAgICAoVFJ8JXhzbC12YWxpZC1pbi1yZXN1bHRuczspKz48IS0tIHRhYmxlIGhlYWRlciAtLT4KLTwhRUxFTUVOVCBURk9PVCAgICAgKFRSfCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSs+PCEtLSB0YWJsZSBmb290ZXIgLS0+Ci08IUVMRU1FTlQgVEJPRFkgICAgIChUUnwleHNsLXZhbGlkLWluLXJlc3VsdG5zOykrPjwhLS0gdGFibGUgYm9keSAtLT4KLTwhRUxFTUVOVCBDT0xHUk9VUCAgKCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7IHwgQ09MKSo+PCEtLSB0YWJsZSBjb2x1bW4gZ3JvdXAgLS0+Ci08IUVMRU1FTlQgQ09MICAgICAgIEVNUFRZPjwhLS0gdGFibGUgY29sdW1uIC0tPgotPCFFTEVNRU5UIFRSICAgICAgICAoVEh8VER8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSs+PCEtLSB0YWJsZSByb3cgLS0+Ci08IUVMRU1FTlQgVEggICAgICAgICglZmxvdzsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gdGFibGUgaGVhZGVyIGNlbGwsIHRhYmxlIGRhdGEgY2VsbC0tPgotPCFFTEVNRU5UIFREICAgICAgICAoJWZsb3c7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj48IS0tIHRhYmxlIGhlYWRlciBjZWxsLCB0YWJsZSBkYXRhIGNlbGwtLT4KLQotPCFBVFRMSVNUIFRBQkxFCi0gICVhdHRyczsKLSAgc3VtbWFyeSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgZnJhbWUgICAgICAgJVRGcmFtZTsgICAgICAgI0lNUExJRUQKLSAgcnVsZXMgICAgICAgJVRSdWxlczsgICAgICAgI0lNUExJRUQKLSAgY2VsbHNwYWNpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgY2VsbHBhZGRpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgJXJlc2VydmVkOwotICBkYXRhcGFnZXNpemUgQ0RBVEEgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRU5USVRZICUgQ0FsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBDQVBUSU9OCi0gICVhdHRyczsKLSAgPgotCi08IS0tCi1DT0xHUk9VUCBncm91cHMgYSBzZXQgb2YgQ09MIGVsZW1lbnRzLiBJdCBhbGxvd3MgeW91IHRvIGdyb3VwCi1zZXZlcmFsIHNlbWFudGljYWxseSByZWxhdGVkIGNvbHVtbnMgdG9nZXRoZXIuCi0tLT4KLTwhQVRUTElTVCBDT0xHUk9VUAotICAlYXR0cnM7Ci0gIHNwYW4gICAgICAgICVOdW1iZXI7ICAgICAgICIxIgotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRAotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCEtLQotIENPTCBlbGVtZW50cyBkZWZpbmUgdGhlIGFsaWdubWVudCBwcm9wZXJ0aWVzIGZvciBjZWxscyBpbgotIG9uZSBvciBtb3JlIGNvbHVtbnMuCi0KLSBUaGUgV0lEVEggYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbnMsIGUuZy4KLQotICAgICB3aWR0aD02NCAgICAgICAgd2lkdGggaW4gc2NyZWVuIHBpeGVscwotICAgICB3aWR0aD0wLjUqICAgICAgcmVsYXRpdmUgd2lkdGggb2YgMC41Ci0KLSBUaGUgU1BBTiBhdHRyaWJ1dGUgY2F1c2VzIHRoZSBhdHRyaWJ1dGVzIG9mIG9uZQotIENPTCBlbGVtZW50IHRvIGFwcGx5IHRvIG1vcmUgdGhhbiBvbmUgY29sdW1uLgotLS0+Ci08IUFUVExJU1QgQ09MCi0gICVhdHRyczsKLSAgc3BhbiAgICAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVECi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IS0tCi0gICAgVXNlIFRIRUFEIHRvIGR1cGxpY2F0ZSBoZWFkZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGhlYWRlcnMgd2hlbgotICAgIFRCT0RZIHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgVEZPT1QgdG8gZHVwbGljYXRlIGZvb3RlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgZm9vdGVycyB3aGVuCi0gICAgVEJPRFkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBtdWx0aXBsZSBUQk9EWSBzZWN0aW9ucyB3aGVuIHJ1bGVzIGFyZSBuZWVkZWQKLSAgICBiZXR3ZWVuIGdyb3VwcyBvZiB0YWJsZSByb3dzLgotLS0+Ci08IUFUVExJU1QgVEhFQUQKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLTwhQVRUTElTVCBUQk9EWQotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotPCFBVFRMSVNUIFRGT09UCi0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCBUUgotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi0KLTwhLS0gU2NvcGUgaXMgc2ltcGxlciB0aGFuIGF4ZXMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzIC0tPgotPCFFTlRJVFkgJSBTY29wZSAiKFJPV3xDT0x8Uk9XR1JPVVB8Q09MR1JPVVApIj4KLQotPCEtLSBUSCBpcyBmb3IgaGVhZGVycywgVEQgZm9yIGRhdGEsIGJ1dCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggdXNlIFREIC0tPgotPCFBVFRMSVNUIFRICi0gICVhdHRyczsKLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgaGVhZGVycyAgICAgSURSRUZTICAgICAgICAgI0lNUExJRUQKLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQKLSAgcm93c3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIGNvbHNwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLTwhQVRUTElTVCBURAotICAlYXR0cnM7Ci0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVECi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVECi0gIHJvd3NwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICBjb2xzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gJWhlYWQubWlzYzsgZGVmaW5lZCBlYXJsaWVyIG9uIGFzICJTQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVCIsCi0gICAgIGV4dGVuZGVkIG5vdyB0byBhbGxvdyB4c2wgLS0+Ci08IUVOVElUWSAlIGhlYWQubWlzYy1IRUFEICIlaGVhZC5taXNjO3wleHNsLXZhbGlkLWluLXJlc3VsdG5zOyI+Ci0KLTwhRU5USVRZICUgaGVhZC5jb250ZW50ICJUSVRMRSAmYW1wOyBCQVNFPyI+Ci0KLTwhLS1FTEVNRU5UIEhFQUQgICAgICglaGVhZC5jb250ZW50OykgKyglaGVhZC5taXNjOykgICBkb2N1bWVudCBoZWFkIC0tPgotPCFFTEVNRU5UIEhFQUQKLSAgICgoJWhlYWQubWlzYy1IRUFEOykqLCAoKEJBU0U/LCglaGVhZC5taXNjLUhFQUQ7KSosVElUTEU/KSB8IChUSVRMRT8sKCVoZWFkLm1pc2MtSEVBRDspKixCQVNFPyl8KCVoZWFkLm1pc2MtSEVBRDspKikrLCAoJWhlYWQubWlzYy1IRUFEOykqKT4KLTwhQVRUTElTVCBIRUFECi0gICVpMThuOwotICBwcm9maWxlICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICAlcmVzdWx0LWVsZW1lbnQtYXR0czsKLSAgPgotCi08IS0tIFRoZSBUSVRMRSBlbGVtZW50IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGZsb3cgb2YgdGV4dC4KLSAgICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLSAgICAtLT4KLTwhLS1FTEVNRU5UIFRJVExFICAgICAoI1BDREFUQSkgLSglaGVhZC5taXNjOykgIGRvY3VtZW50IHRpdGxlIC0tPgotPCFFTEVNRU5UIFRJVExFICAoI1BDREFUQSB8ICAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gZG9jdW1lbnQgdGl0bGUgLS0+Ci08IUFUVExJU1QgVElUTEUgJWkxOG47ICVyZXN1bHQtZWxlbWVudC1hdHRzOz4KLQotCi08IUVMRU1FTlQgQkFTRSAgICAgRU1QVFk+PCEtLSBkb2N1bWVudCBiYXNlIFVSSSAtLT4KLTwhQVRUTElTVCBCQVNFCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRAotICA+Ci0KLTwhRUxFTUVOVCBNRVRBICAgICBFTVBUWT48IS0tIGdlbmVyaWMgbWV0YWluZm9ybWF0aW9uIC0tPgotPCFBVFRMSVNUIE1FVEEKLSAgJWkxOG47Ci0gIGh0dHAtZXF1aXYgICVOYW1lOyAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgICVOYW1lOyAgICAgICAgICNJTVBMSUVECi0gIGNvbnRlbnQgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRAotICBzY2hlbWUgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICAlcmVzdWx0LWVsZW1lbnQtYXR0czsKLSAgPgotCi08IS0tRUxFTUVOVCBTVFlMRSAgICAgJVN0eWxlU2hlZXQ7ICBzdHlsZSBpbmZvIC0tPgotPCFFTEVNRU5UIFNUWUxFICgjUENEQVRBIHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj48IS0tIHN0eWxlIGluZm8gLS0+Ci08IUFUVExJU1QgU1RZTEUKLSAgJWkxOG47Ci0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRAotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICAlcmVzdWx0LWVsZW1lbnQtYXR0czsKLSAgPgotCi08IS0tRUxFTUVOVCBTQ1JJUFQgICAgICVTY3JpcHQ7IHNjcmlwdCBzdGF0ZW1lbnRzIC0tPgotPCFFTEVNRU5UIFNDUklQVCAoI1BDREFUQSB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBzY3JpcHQgc3RhdGVtZW50cyAtLT4KLTwhQVRUTElTVCBTQ1JJUFQKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVECi0gIGxhbmd1YWdlICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRlZmVyICAgICAgIChkZWZlcikgICAgICAgICNJTVBMSUVECi0gIGV2ZW50ICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGZvciAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gICVyZXN1bHQtZWxlbWVudC1hdHRzOwotICA+Ci0KLTwhRUxFTUVOVCBOT1NDUklQVCAoJXhzbC12YWxpZC1pbi1yZXN1bHRuczt8JWJsb2NrOykrCi0+PCEtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBzY3JpcHQtYmFzZWQgcmVuZGVyaW5nIC0tPgotPCFBVFRMSVNUIE5PU0NSSVBUCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBTdHJ1Y3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFkiPgotCi08IS0tPCFFTEVNRU5UIEhUTUwgICAgICglaHRtbC5jb250ZW50Oyk+IC0tPjwhLS0gZG9jdW1lbnQgcm9vdCBlbGVtZW50IC0tPgotPCFFTEVNRU5UIEhUTUwgKCgoJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKixIRUFEPywoJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKixCT0RZPywKLSAgICAgICAgICAgICAgICAoJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKikgfCAoJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKik+Ci08IS0tIGRvY3VtZW50IHJvb3QgZWxlbWVudCAtLT4KLTwhQVRUTElTVCBIVE1MCi0gICVpMThuOwotICAlcmVzdWx0LWVsZW1lbnQtYXR0czsKLSAgPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc3R5bGUvbG9hZGVyZGVzaWduLnhtbCBiL3hkb2NzL3N0eWxlL2xvYWRlcmRlc2lnbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NTA1NWIuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc3R5bGUvbG9hZGVyZGVzaWduLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxsb2FkZXI+Ci0gIDxwcm9jZXNzb3IgbmFtZT0ieHNsdCI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzdHlsZXNoZWV0IiB2YWx1ZT0ic2JrOi9zdHlsZS9zdHlsZXNoZWV0cy9kZXNpZ24ycHJvamVjdC54c2wiLz4KLSAgPC9wcm9jZXNzb3I+Ci08L2xvYWRlcj4KZGlmZiAtLWdpdCBhL3hkb2NzL3N0eWxlL3N0eWxlc2hlZXRzL2Rlc2lnbjJwcm9qZWN0LnhzbCBiL3hkb2NzL3N0eWxlL3N0eWxlc2hlZXRzL2Rlc2lnbjJwcm9qZWN0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyMzk0MC4uMDAwMDAwMAotLS0gYS94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy9kZXNpZ24ycHJvamVjdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPCEtLSBtYXRjaCB0aGUgcm9vdCBib29rIGVsZW1lbnQgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImJvb2siPgotICAgIDxwcm9qZWN0PgotICAgICAgPHBhcmFtZXRlciBuYW1lPSJjb3B5cmlnaHQiIHZhbHVlPSJ7QGNvcHlyaWdodH0iLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3Byb2plY3Q+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jdW1lbnQiPgotCi0gICAgPHByb2Nlc3Mgc291cmNlPSJ7QHNvdXJjZX0iIHByb2R1Y2VyPSJwYXJzZXIiPgotICAgICAgPHByb2Nlc3NvciBuYW1lPSJ4c2x0Ij4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJzdHlsZXNoZWV0IiB2YWx1ZT0ic2JrOi9zdHlsZS9zdHlsZXNoZWV0cy9hbnkycHJvamVjdC54c2wiLz4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgIDwvcHJvY2Vzcz4KLQotICAgIDxjcmVhdGUgc291cmNlPSJ7QHNvdXJjZX0iIHRhcmdldD0ie0BpZH0uaHRtbCIgcHJvZHVjZXI9InBhcnNlciIgcHJpbnRlcj0iaHRtbCI+Ci0gICAgICA8cHJvY2Vzc29yIG5hbWU9InhzbHQiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImlkIiB2YWx1ZT0ie0BpZH0iLz4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJzdHlsZXNoZWV0IiB2YWx1ZT0ic2JrOi9zdHlsZS9zdHlsZXNoZWV0cy9kZXNpZ25kb2MyaHRtbC54c2wiLz4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgIDwvY3JlYXRlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3N0eWxlL3N0eWxlc2hlZXRzL2Rlc2lnbmRvYzJodG1sLnhzbCBiL3hkb2NzL3N0eWxlL3N0eWxlc2hlZXRzL2Rlc2lnbmRvYzJodG1sLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2M2U0MS4uMDAwMDAwMAotLS0gYS94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy9kZXNpZ25kb2MyaHRtbC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLQotICA8eHNsOnBhcmFtIG5hbWU9InN0eWxlYm9vay5wcm9qZWN0Ii8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iY29weXJpZ2h0Ii8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iaWQiLz4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InMxIj4KLSAgICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPjwvdGl0bGU+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keSB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMDAwMGZmIiB2bGluaz0iIzAwMDBhYSIgYWxpbms9IiNmZjAwMDAiCi0gICAgICAgICAgICB0b3BtYXJnaW49IjQiIGxlZnRtYXJnaW49IjQiIG1hcmdpbndpZHRoPSI0IiBtYXJnaW5oZWlnaHQ9IjQiCi0gICAgICAgICAgICBiZ2NvbG9yPSIjZmZmZmZmIj4KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idG9waW1hZ2UiIHNlbGVjdD0ic3RyaW5nKC4vcC9pbWcvQHNyYykiLz4KLSAgICAgICAgIDxoMT48YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmciPjxpbWcgc3JjPSJpbWFnZXMveyR0b3BpbWFnZX0iLz48L2E+JiMxNjA7JiMxNjA7Ci0gICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRpdGxlIi8+PC9oMT48aHIvPgotICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgICAgIDxoci8+Ci0gICAgICAgICAgICA8Zm9udCBzaXplPSItMSIgY29sb3I9IiMwMDg2YjIiPjxpPgotICAgICAgICAgICAgICBDb3B5cmlnaHQgJiMxNjk7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0gICAgICAgICAgICA8L2k+PC9mb250PgotICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iczIiPgotICAgICAgCi0gICAgICA8aDI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPjwvaDI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InMzIj4KLSAgICAgIDxoMz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRpdGxlIi8+PC9oMz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iczQiPgotICAgICAgPGg0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGl0bGUiLz48L2g0PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgotPCEtLSBibG9ja3MgLS0+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icCI+Ci0gICAgPHA+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvcD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibm90ZSI+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB3aWR0aD0iMjAiIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICA8aW1nIHNyYz0icmVzb3VyY2VzL25vdGUuZ2lmIiB3aWR0aD0iMjAiIGhlaWdodD0iMjQiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiIGFsdD0iTm90ZSIvPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgIDxmb250IHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiIGNvbG9yPSIjMDAwMDAwIj4KLSAgICAgICAgICAgIDxpPgotICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICAgICAgICA8L2k+Ci0gICAgICAgICAgPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4gIAotICAgIDwvdGFibGU+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InVsIj4KLSAgICA8dWw+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im9sIj4KLSAgICA8b2w+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvb2w+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxpIj4KLSAgICA8bGk+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvbGk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgICA8IS0tRGVmaW5pdGlvbiBsaXN0czogZ2xvc3MsIHRlcm0sIGxhYmVsLCBpdGVtIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJnbG9zcyI+Ci0gICAgPGRsPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2RsPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgIDwhLS0gPHRlcm0+IGNvbnRhaW5zIGEgc2luZ2xlLXdvcmQsIG11bHRpLXdvcmQgb3Igc3ltYm9saWMgCi0gICAgICAgZGVzaWduYXRpb24gd2hpY2ggaXMgcmVnYXJkZWQgYXMgYSB0ZWNobmljYWwgdGVybS4gLS0+IAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXJtIj4KLSAgICA8ZGZuPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2Rmbj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxhYmVsIiBwcmlvcml0eT0iMSI+Ci0gICAgPGR0Pjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2R0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaXRlbSIgcHJpb3JpdHk9IjIiPgotICAgIDxkZD4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L2RkPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzb3VyY2UiPgotICAgIDxwPjxmb250IHNpemU9Ii0xIj48cHJlPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L3ByZT48L2ZvbnQ+PC9wPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0YWJsZSI+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMiI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC90YWJsZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idHIiPgotICAgIDx0cj48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC90cj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGgiPgotICAgIDx0ZCBiZ2NvbG9yPSIjMDM5YWNjIiBjb2xzcGFuPSJ7QGNvbHNwYW59IiByb3dzcGFuPSJ7QHJvd3NwYW59IiB2YWxpZ249ImNlbnRlciIgYWxpZ249ImNlbnRlciI+Ci0gICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ci0gICAgICAgIDxiPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2I+JiMxNjA7Ci0gICAgICA8L2ZvbnQ+Ci0gICAgPC90ZD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGQiPgotICAgIDx0ZCBiZ2NvbG9yPSIjYTBkZGYwIiBjb2xzcGFuPSJ7QGNvbHNwYW59IiByb3dzcGFuPSJ7QHJvd3NwYW59IiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+JiMxNjA7Ci0gICAgICA8L2ZvbnQ+Ci0gICAgPC90ZD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idG4iPgotICAgIDx0ZCBiZ2NvbG9yPSIjZmZmZmZmIiBjb2xzcGFuPSJ7QGNvbHNwYW59IiByb3dzcGFuPSJ7QHJvd3NwYW59Ij4KLSAgICAgICYjMTYwOwotICAgIDwvdGQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci08IS0tIG1hcmt1cCAtLT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJlbSI+Ci0gICAgPGI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvYj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icmVmIj4KLSAgICA8aT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9pPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvZGUiPgotICAgIDxjb2RlPjxmb250IGZhY2U9ImNvdXJpZXIsIG1vbm9zcGFjZWQiPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2ZvbnQ+PC9jb2RlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImJyIj4KLSAgICA8YnIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi08IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci08IS0tIGxpbmtzIC0tPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxpbmsiPgotICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAYW5jaG9yKT0wIj4KLSAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAaWRyZWYpPTAiPgotICAgICAgICA8IS0teHNsOmFwcGx5LXRlbXBsYXRlcy8tLT4KLSAgICAgIDwveHNsOmlmPgotICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKEBpZHJlZik+MCI+Ci0gICAgICAgIDxhIGhyZWY9IntAaWRyZWZ9Lmh0bWwiPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+Ci0gICAgICA8L3hzbDppZj4KLSAgICA8L3hzbDppZj4KLQotICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAYW5jaG9yKT4wIj4KLSAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAaWRyZWYpPTAiPgotICAgICAgICA8YSBocmVmPSIje0BhbmNob3J9Ij48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9hPgotICAgICAgPC94c2w6aWY+Ci0gICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoQGlkcmVmKT4wIj4KLSAgICAgICAgPGEgaHJlZj0ie0BpZHJlZn0uaHRtbCN7QGFuY2hvcn0iPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+Ci0gICAgICA8L3hzbDppZj4KLSAgICA8L3hzbDppZj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYW5jaG9yIj4KLSAgICA8YSBuYW1lPSJ7QG5hbWV9Ij48eHNsOmNvbW1lbnQ+YW5jaG9yPC94c2w6Y29tbWVudD48L2E+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Imp1bXAiPgotICAgIDxhIGhyZWY9IntAaHJlZn0iPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9zMS9zMi8vaW1nIj4KLSAgICA8aW1nIHNyYz0iaW1hZ2VzL3tAc3JjfSIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJyZXNvdXJjZS1yZWYiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmVzb3VyY2VGaWxlIiAKLSAgICAgICAgICBzZWxlY3Q9ImRvY3VtZW50KCRzdHlsZWJvb2sucHJvamVjdCkvYm9vay9yZXNvdXJjZXMvQHNvdXJjZSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ieHJlZiIgc2VsZWN0PSJAaWRyZWYiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhyZWYiCi0gICAgICAgICAgc2VsZWN0PSJkb2N1bWVudCgkcmVzb3VyY2VGaWxlKS9yZXNvdXJjZXMvcmVzb3VyY2VbQGlkPSR4cmVmXS9AbG9jYXRpb24iLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImxhYmVsIgotICAgICAgICAgIHNlbGVjdD0iZG9jdW1lbnQoJHJlc291cmNlRmlsZSkvcmVzb3VyY2VzL3Jlc291cmNlW0BpZD0keHJlZl0vQHRpdGxlIi8+Ci0gICAgPEEgaHJlZj0ieyRocmVmfSIgdGFyZ2V0PSJfdG9wIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxhYmVsIi8+PC9BPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJodW1hbi1yZXNvdXJjZS1yZWYiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmVzb3VyY2VGaWxlIiAKLSAgICAgICAgICBzZWxlY3Q9ImRvY3VtZW50KCRzdHlsZWJvb2sucHJvamVjdCkvYm9vay9yZXNvdXJjZXMvQHNvdXJjZSIvPiAgCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWYiICBzZWxlY3Q9IkBpZHJlZiIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWFpbHRvIgotICAgICAgICAgIHNlbGVjdD0iZG9jdW1lbnQoJHJlc291cmNlRmlsZSkvcmVzb3VyY2VzL2h1bWFuLXJlc291cmNlW0BpZD0kcmVmXS9AbWFpbHRvIi8+Ci0gICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWUiCi0gICAgICAgICAgc2VsZWN0PSJkb2N1bWVudCgkcmVzb3VyY2VGaWxlKS9yZXNvdXJjZXMvaHVtYW4tcmVzb3VyY2VbQGlkPSRyZWZdL0BuYW1lIi8+ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICA8QSBocmVmPSJtYWlsdG86eyRtYWlsdG99Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz48L0E+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3Mvc3R5bGUvc3R5bGVzaGVldHMvZG9uZS54c2wgYi94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy9kb25lLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4OGVkOC4uMDAwMDAwMAotLS0gYS94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy9kb25lLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci0KLTwhRE9DVFlQRSB4c2w6c3R5bGVzaGVldD4KLQotPCEtLSBYU0wgU3R5bGUgc2hlZXQsIERURCBvbWl0dGVkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gIDx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIi8+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJDb21taXRzIj4KLSAgPHhzbDpjb21tZW50PlRoaXMgWE1MIGZyYWdtZW50IGNvbnRhaW5zIGEgbGlzdCBvZiBzb3VyY2UgY29kZSB1cGRhdGVzIHRvIHBsYWNlIGluIGFuICZsdDtzMyZndDsgc2VjdGlvbiBvZiByZWFkbWUueG1sPC94c2w6Y29tbWVudD4KLSAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KENvbW1pdFtAY2F0ZWdvcnk9J2NvcmUnXSk+MCI+Ci0gICAgICA8cD5Db3JlIHNvdXJjZSBjb2RlIHVwZGF0ZXM6PC9wPgotICAgICAgPHVsPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkNvbW1pdFtAY2F0ZWdvcnk9J2NvcmUnXSI+Ci0gICAgICAgIDxsaT48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ildob3xEYXRlQ29tbWl0dGVkfE1vZGlmaWVkfEFkZGVkfFJlbW92ZWR8TG9nIi8+PC9saT4KLSAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgPC91bD4KLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KENvbW1pdFtAY2F0ZWdvcnk9J2NvcmUnXSk9MCI+Ci0gICAgICA8bm90ZT5UaGlzIHJlbGVhc2UgaW5jbHVkZXMgbm8gdXBkYXRlcyBvZiB0aGUgY29yZSBzb3VyY2UgY29kZS48L25vdGU+Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDppZiB0ZXN0PSJjb3VudChDb21taXRbQGNhdGVnb3J5PSdjb21wYXQnXSk+MCI+Ci0gICAgICA8cD5Db21wYXRpYmlsaXR5IHNvdXJjZSBjb2RlIHVwZGF0ZXM6PC9wPgotICAgICAgPHVsPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkNvbW1pdFtAY2F0ZWdvcnk9J2NvbXBhdCddIj4KLSAgICAgICAgPGxpPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iV2hvfERhdGVDb21taXR0ZWR8TW9kaWZpZWR8QWRkZWR8UmVtb3ZlZHxMb2ciLz48L2xpPgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICA8L3VsPgotICAgIDwveHNsOmlmPgotICAgIDx4c2w6aWYgdGVzdD0iY291bnQoQ29tbWl0W0BjYXRlZ29yeT0nY29tcGF0J10pPTAiPgotICAgICAgPG5vdGU+VGhpcyByZWxlYXNlIGluY2x1ZGVzIG5vIHVwZGF0ZXMgb2YgdGhlIGNvbXBhdGliaWxpdHkgc291cmNlIGNvZGUuPC9ub3RlPgotICAgIDwveHNsOmlmPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IldobyI+Ci0gICAgPHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkRhdGVDb21taXR0ZWQiPgotICAgIDxyZWY+IG9uIDwvcmVmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PGJyLz4KLSAgPC94c2w6dGVtcGxhdGU+ICAgIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJNb2RpZmllZCI+ICAgIAotICAgIDxyZWY+TW9kaWZpZWQ6IDwvcmVmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PGJyLz4KLSAgPC94c2w6dGVtcGxhdGU+ICAgIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJBZGRlZCI+ICAgIAotICAgIDxyZWY+QWRkZWQ6IDwvcmVmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PGJyLz4KLSAgPC94c2w6dGVtcGxhdGU+ICAgIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJSZW1vdmVkIj4gICAgCi0gICAgPHJlZj5SZW1vdmVkOiA8L3JlZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjxici8+Ci0gIDwveHNsOnRlbXBsYXRlPiAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJMb2ciPiAgICAKLSAgICA8cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48YnIvPjxici8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3Mvc3R5bGUvc3R5bGVzaGVldHMvc3BlYy54c2wgYi94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy9zcGVjLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkNzNiZC4uMDAwMDAwMAotLS0gYS94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy9zcGVjLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotCi08IURPQ1RZUEUgeHNsOnN0eWxlc2hlZXQgWwotPCFFTlRJVFkgY29weSAgICImIzE2OTsiPgotPCFFTlRJVFkgbmJzcCAgICImIzE2MDsiPgotXT4KLQotPCEtLSBYU0wgU3R5bGUgc2hlZXQsIERURCBvbWl0dGVkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICAgICAgICAgICAgICB4bWxuczpyZWRpcmVjdD0ib3JnLmFwYWNoZS54YWxhbi5saWIuUmVkaXJlY3QiCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KLSAgPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiIvPgotICAKLSAgPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdlLXJvb3QiIHNlbGVjdD0iJy4uLy4uLy4uL3NyYy8nIi8+ICA8IS0tIHJvb3Qgb2YgZGVzdGluYXRpb24gZm9yIHBhY2thZ2UuaHRtbCBmaWxlcyAtLT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzcGVjIj4KLSAgICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+Ci0gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImhlYWRlci90aXRsZSIvPgotICAgICAgICA8L3RpdGxlPgotICAgICAgPC9oZWFkPgotICAgICAgPGJvZHk+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic3BlYy90aXRsZVsxXSI+Ci0gICAgPGgxPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2gxPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJmcm9udG1hdHRlci9wdWJkYXRlIj4KLSAgICA8cD48Yj5FZGl0IERhdGU6IDwvYj48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9wPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJmcm9udG1hdHRlci9jb3B5cmlnaHQiPgotICAgIDwhLS0gcD4mY29weTs8eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9wIC0tPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJmcm9udG1hdHRlci9hdXRob3IiPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InNwZWMvdGl0bGUiPgotICAgIDxoMj4KLSAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlkIj4KLSAgICAgICAgICA8YSBuYW1lPSJAaWQiPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgICAgIDwvYT4KLSAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC9oMj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG5hbWU9ImFwcGx5LWlkLXRlbXBsYXRlcyI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGlkIj4KLSAgICAgICAgPGEgbmFtZT0ie0BpZH0iPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgICAgPC9hPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InNlY3QyL3RpdGxlIHwgc3BlYy8qL3RpdGxlIj4KLSAgICA8aDM+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktaWQtdGVtcGxhdGVzIi8+Ci0gICAgPC9oMz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzZWN0My90aXRsZSI+Ci0gICAgPGg0PgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LWlkLXRlbXBsYXRlcyIvPgotICAgIDwvaDQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InNlY3Q0L3RpdGxlIj4KLSAgICA8aDU+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktaWQtdGVtcGxhdGVzIi8+Ci0gICAgPC9oNT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYXJhIj4KLSAgICA8cD48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9wPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ2YXJpYWJsZWxpc3QiPgotICAgIDx1bD4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0idmFybGlzdGVudHJ5Ij4KLSAgICAgIDxsaT4KLSAgICAgICAgPHA+PGI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0ZXJtIi8+PC9iPjxici8+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibGlzdGl0ZW0iLz48L3A+Ci0gICAgICA8L2xpPgotICAgIDwveHNsOmZvci1lYWNoPgotICAgIDwvdWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im9yZGVyZWRsaXN0Ij4KLSAgICA8b2w+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Imxpc3RpdGVtIj4KLSAgICAgIDxsaT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9saT4KLSAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICA8L29sPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYXR0ZXJucyI+Ci0gICAgPEgzPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbW9kdWxlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PlBhdHRlcm5zPC9IMz4KLSAgICA8dWw+Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icGF0dGVybiI+Ci0gICAgICAgIDxwPgotICAgICAgICAgIDxiPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhdHRlcm4tbmFtZSI+Ci0gICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1pZC10ZW1wbGF0ZXMiLz4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgIDwvYj4KLSAgICAgICAgICA8YnIvPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IipbbmFtZSgpICE9ICdwYXR0ZXJuLW5hbWUnXSIvPjwvcD4KLSAgICAgIDwveHNsOmZvci1lYWNoPgotICAgIDwvdWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGF0dGVybi9pbnRlbnQiPgotICAgIDxici8+PGk+SW50ZW50OiA8L2k+PHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhdHRlcm4vcmVzcG9uc2liaWxpdGllcyI+Ci0gICAgPGJyLz48aT5SZXNwb25zaWJpbGl0aWVzOiA8L2k+PHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYXR0ZXJuL3BvdGVudGlhbC1hbHRlcm5hdGUtbmFtZSI+Ci0gICAgPGJyLz48aT5Qb3RlbnRpYWwgYWx0ZXJuYXRlIG5hbWU6IDwvaT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGF0dGVybi90aHJlYWQtc2FmZXR5Ij4KLSAgICA8YnIvPjxpPlRocmVhZCBzYWZldHk6IDwvaT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhdHRlcm4vbm90ZXMiPgotICAgIDxici8+PGk+Tm90ZXM6IDwvaT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb2dyYW1saXN0aW5nIj4KLSAgICA8Y29kZT4KLSAgICA8cHJlPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwvcHJlPgotICAgIDwvY29kZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJsaW5rIj4KLSAgICA8QSBocmVmPSIje0BsaW5rZW5kfSI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC9BPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idWxpbmsiPgotICAgIDxBIGhyZWY9IntAdXJsfSI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC9BPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXJtcmVmIj4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbGluay11cmwiPgotICAgICAgICA8QSBocmVmPSIje0BsaW5rLXVybH0iPgotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+Ci0gICAgICAgIDwvQT4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPFU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L1U+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBsaW5rIj4KLSAgICA8eHNsOnRleHQ+e0BsaW5rIDwveHNsOnRleHQ+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgotICAgIDx4c2w6dGV4dD59PC94c2w6dGV4dD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzZWN0MVtAaWQ9J3BhY2thZ2UnXSI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWxlbmFtZSIgc2VsZWN0PSJjb25jYXQoJHBhY2thZ2Utcm9vdCx0cmFuc2xhdGUodGl0bGUsJy4nLCAnLycpLCcvcGFja2FnZS5odG1sJykiLz4KLSAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRmaWxlbmFtZX0iPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN1Yi1wYWNrYWdlIi8+Ci0gICAgPC9yZWRpcmVjdDp3cml0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzZWN0MltAaWQ9J3NwZWNpYWxpemVkLXBhY2thZ2VzJ10iPgotICAgIDx4c2w6bWVzc2FnZT5Gb3VuZCBzcGVjaWFsaXplZC1wYWNrYWdlczwveHNsOm1lc3NhZ2U+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InNlY3QzIj4KLQkgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlsZW5hbWUiIHNlbGVjdD0iY29uY2F0KCRwYWNrYWdlLXJvb3QsdHJhbnNsYXRlKHRpdGxlLCcuJywgJy8nKSwnL3BhY2thZ2UuaHRtbCcpIi8+Ci0gICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRmaWxlbmFtZX0iPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3ViLXBhY2thZ2UiLz4KLSAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdWItcGFja2FnZSI+Ci0gICAgPGh0bWw+Ci0gICAgICAgPGhlYWQ+Ci0gICAgICAgICA8dGl0bGU+Ci0gICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0aXRsZSIvPgotICAgICAgICAgPC90aXRsZT4KLSAgICAgICA8L2hlYWQ+Ci0gICAgICAgPGJvZHk+Ci0gICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Iipbbm90IChuYW1lKCk9J3RpdGxlJyldIi8+Ci0gICAgICAgPC9ib2R5PgotICAgICA8L2h0bWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLTwveHNsOnN0eWxlc2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL3hkb2NzL3N0eWxlL3N0eWxlc2hlZXRzL3htbDJmby54c2wgYi94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy94bWwyZm8ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDU5MzBkLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3N0eWxlL3N0eWxlc2hlZXRzL3htbDJmby54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0ODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0gICAgWFNMVCBzdHlsZXNoZWV0IHRvIGNvbnZlcnQgdGhlIFhhbGFuIGRvY3VtZW50YXRpb24gY29sbGVjdGVkIGluIG9uZSB4bWwgZmlsZSBpbnRvIGEgZm8gZmlsZQotICAgICAgICBmb3IgdXNlIGluIEZPUCAKLQotVEJEOiAtIFRoZSBmYXEgZG9lc24ndCBzaG93IGluIHRoZSBjb250ZW50Ci0gICAgIC0gY2hlY2sgd2h5IG1hcmdpbi1ib3R0b20gb24gdGhlIHBhZ2Ugd2l0aCBwcm9wZXJ0aWVzIGlzIHRvbyBsYXJnZQotICAgICAtIGNoZWNrIHdoeSBrZWVwLW5leHQgbm90IG9ubHkgZG9lc24ndCB3b3JrLCBidXQgbGVhZHMgdG8gcmVwZWF0aW5nIGFscmVhZHkgcHJpbnRlZCBsaW5lcwotICAgICAtIG1ha2UgbGluZXMgY29udGFpbmluZyBvbmx5IGNvZGUgbG9vayBuaWNlciAoc21hbGxlciBsaW5lIGhlaWdodCkKLSAgICAgLSByZXBsYWNlIGJ1bGxldHMgaW4gb3JkZXJlZCBsaXN0cyB3aXRoIG51bWJlcnMKLSAgICAgLSBjb3JyZWN0IHRoZSBoYWNrIHJlcGxhY2luZyBuYnNwIHdpdGggJy0nCi0gICAgIC0gaGFuZGxlIHRoZSBsaW5rcyBjb3JyZWN0bHkgd2hpY2ggaGF2ZSBiZWVuIGV4dGVybmFsIGluIHRoZSBodG1sIGRvYyBhbmQgYXJlIG5vdyBpbnRlcm5hbAotCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0Ci0gICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0gICAgIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotICAgICAKLSAgICAgPCEtLSB0byB1c2Ugd2l0aCBkb2N1bWVudCgpIHRvIGdldCByZXNvdXJjZXMueG1sIC0tPgotICAgIDx4c2w6cGFyYW0gbmFtZT0icmVzb3VyY2VGaWxlIiBzZWxlY3Q9IicuLi8uLi9zb3VyY2VzL3hhbGFuL3Jlc291cmNlcy54bWwnIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJwcm9qZWN0IiBzZWxlY3Q9IlhhbGFuIi8+Ci0gICAgICAgICAgICAgIAotPHhzbDp0ZW1wbGF0ZSBtYXRjaCA9Ii8iPgotCTxmbzpyb290IHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotCi0JICA8IS0tIGRlZmluZXMgcGFnZSBsYXlvdXQgLS0+Ci0JICA8Zm86bGF5b3V0LW1hc3Rlci1zZXQ+Ci0JCTxmbzpzaW1wbGUtcGFnZS1tYXN0ZXIgbWFzdGVyLW5hbWU9InNpbXBsZSIKLQkJCQkJCQkgICBwYWdlLWhlaWdodD0iMjkuN2NtIiAKLQkJCQkJCQkgICBwYWdlLXdpZHRoPSIyMWNtIgotCQkJCQkJCSAgIG1hcmdpbi10b3A9IjEuNWNtIiAKLQkJCQkJCQkgICBtYXJnaW4tYm90dG9tPSIyY20iIAotCQkJCQkJCSAgIG1hcmdpbi1sZWZ0PSIyLjVjbSIgCi0JCQkJCQkJICAgbWFyZ2luLXJpZ2h0PSIyLjVjbSI+Ci0JCSAgPGZvOnJlZ2lvbi1ib2R5IG1hcmdpbi10b3A9IjNjbSIvPgotCQkgIDxmbzpyZWdpb24tYmVmb3JlIGV4dGVudD0iMS41Y20iLz4KLQkJICA8Zm86cmVnaW9uLWFmdGVyIGV4dGVudD0iMS41Y20iLz4KLQkJPC9mbzpzaW1wbGUtcGFnZS1tYXN0ZXI+Ci0JICA8L2ZvOmxheW91dC1tYXN0ZXItc2V0PgotCi0JICA8Zm86cGFnZS1zZXF1ZW5jZSBtYXN0ZXItbmFtZT0ic2ltcGxlIj4KLQkJPGZvOnN0YXRpYy1jb250ZW50IGZsb3ctbmFtZT0ieHNsLXJlZ2lvbi1iZWZvcmUiPgotCQkJPGZvOmJsb2NrIHRleHQtYWxpZ249ImVuZCIgCi0JCQkgICAgCSAgZm9udC1zaXplPSIxMHB0IiAKLQkJCQkJICBmb250LWZhbWlseT0ic2VyaWYiIAotCQkJCQkgIGxpbmUtaGVpZ2h0PSIxNHB0IiA+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9qZWN0Ii8+IGRvY3VtZW50YXRpb24gLSBwLiA8Zm86cGFnZS1udW1iZXIvPgotCQkJPC9mbzpibG9jaz4KLQkJPC9mbzpzdGF0aWMtY29udGVudD4gCi0KLQkJPGZvOmZsb3cgZmxvdy1uYW1lPSJ4c2wtcmVnaW9uLWJvZHkiPgotCi0gICAgICAgICAgPGZvOmJsb2NrIGZvbnQtc2l6ZT0iMThwdCIgCi0gICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiAKLSAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ9IjI0cHQiCi0gICAgICAgICAgICAgICAgICAgIHNwYWNlLWFmdGVyLm9wdGltdW09IjE1cHQiCi0gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I9ImJsdWUiCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yPSJ3aGl0ZSIKLSAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbj0iY2VudGVyIj4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvamVjdCIvPiAtIGFuIFhTTCBUcmFuc2Zvcm1lcgotICAgICAgICAgIDwvZm86YmxvY2s+Ci0KLQotICAgICAgICA8IS0tIGdlbmVyYXRlcyB0YWJsZSBvZiBjb250ZW50cyBhbmQgcHV0cyBpdCBpbnRvIGEgdGFibGUgLS0+Ci0KLSAgICAgICAgIDxmbzpibG9jayBmb250LXNpemU9IjE0cHQiIAotICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIAotICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ9IjE4cHQiCi0gICAgICAgICAgICAgICAgICBzcGFjZS1hZnRlci5vcHRpbXVtPSIxMHB0IgotICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ9ImJvbGQiCi0gICAgICAgICAgICAgICAgICBzdGFydC1pbmRlbnQ9IjE1cHQiPgotICAgICAgICAgICAgQ29udGVudAotICAgICAgICAgPC9mbzpibG9jaz4KLQotICAgICAgICAgPGZvOnRhYmxlPgotICAgICAgICAgICAgPGZvOnRhYmxlLWNvbHVtbiBjb2x1bW4td2lkdGg9IjFjbSIvPgotICAgICAgICAgICAgPGZvOnRhYmxlLWNvbHVtbiBjb2x1bW4td2lkdGg9IjEwY20iLz4KLSAgICAgICAgICAgIDxmbzp0YWJsZS1jb2x1bW4gY29sdW1uLXdpZHRoPSI1Y20iLz4KLSAgICAgICAgICAgIDxmbzp0YWJsZS1ib2R5IGZvbnQtc2l6ZT0iMTJwdCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodD0iMTZwdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIj4KLSAgICAgICAgICAgICAgPGZvOnRhYmxlLXJvdz4KLSAgICAgICAgICAgICAgICAgIDxmbzp0YWJsZS1jZWxsPgotICAgICAgICAgICAgICAgICAgICAgPGZvOmJsb2NrIHRleHQtYWxpZ249ImVuZCIgPgotICAgICAgICAgICAgICAgICAgICAgPC9mbzpibG9jaz4KLSAgICAgICAgICAgICAgICAgIDwvZm86dGFibGUtY2VsbD4KLSAgICAgICAgICAgICAgICAgIDxmbzp0YWJsZS1jZWxsPgotICAgICAgICAgICAgICAgICAgICAgPGZvOmJsb2NrIHRleHQtYWxpZ249ImVuZCIgPgotICAgICAgICAgICAgICAgICAgICAgPC9mbzpibG9jaz4KLSAgICAgICAgICAgICAgICAgIDwvZm86dGFibGUtY2VsbD4KLSAgICAgICAgICAgICAgICAgIDxmbzp0YWJsZS1jZWxsPgotICAgICAgICAgICAgICAgICAgICAgPGZvOmJsb2NrIHRleHQtYWxpZ249ImVuZCIgPgotICAgICAgICAgICAgICAgICAgICAgcGFnZQotICAgICAgICAgICAgICAgICAgICAgPC9mbzpibG9jaz4KLSAgICAgICAgICAgICAgICAgIDwvZm86dGFibGUtY2VsbD4KLSAgICAgICAgICAgICAgPC9mbzp0YWJsZS1yb3c+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJkb2N1bWVudGF0aW9uL2NoYXB0ZXIiPiAKLSAgICAgICAgICAgICAgICA8Zm86dGFibGUtcm93PgotICAgICAgICAgICAgICAgICAgPGZvOnRhYmxlLWNlbGw+Ci0gICAgICAgICAgICAgICAgICAgICA8Zm86YmxvY2sgdGV4dC1hbGlnbj0iZW5kIiA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm51bWJlciB2YWx1ZT0icG9zaXRpb24oKSIgZm9ybWF0PSJJIi8+LiAgCi0gICAgICAgICAgICAgICAgICAgICA8L2ZvOmJsb2NrPgotICAgICAgICAgICAgICAgICAgPC9mbzp0YWJsZS1jZWxsPgotICAgICAgICAgICAgICAgICAgPGZvOnRhYmxlLWNlbGw+Ci0gICAgICAgICAgICAgICAgICAgICA8Zm86YmxvY2sgIHRleHQtYWxpZ249InN0YXJ0IiA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Zm86YmFzaWMtbGluayBjb2xvcj0iYmx1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpbnRlcm5hbC1kZXN0aW5hdGlvbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzMS9AdGl0bGV8ZmFxcy9AdGl0bGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZm86YmFzaWMtbGluaz4KLSAgICAgICAgICAgICAgICAgICAgIDwvZm86YmxvY2s+Ci0gICAgICAgICAgICAgICAgICA8L2ZvOnRhYmxlLWNlbGw+Ci0gICAgICAgICAgICAgICAgICA8Zm86dGFibGUtY2VsbD4KLSAgICAgICAgICAgICAgICAgICAgIDxmbzpibG9jayB0ZXh0LWFsaWduPSJlbmQiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIDxmbzpwYWdlLW51bWJlci1jaXRhdGlvbiByZWYtaWQ9IntAaWR9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICA8L2ZvOmJsb2NrPgotICAgICAgICAgICAgICAgICAgPC9mbzp0YWJsZS1jZWxsPgotICAgICAgICAgICAgICAgPC9mbzp0YWJsZS1yb3c+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDwvZm86dGFibGUtYm9keT4KLSAgICAgICAgIDwvZm86dGFibGU+Ci0JCSA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+IAotCSAgIDwvZm86Zmxvdz4KLQkgICA8L2ZvOnBhZ2Utc2VxdWVuY2U+Ci0JPC9mbzpyb290PgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS1jaGFwdGVyLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGFwdGVyIj4KLSAgPGZvOmJsb2NrIGlkPSJ7QGlkfSIgYnJlYWstYmVmb3JlPSJwYWdlIi8+Ci0JPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAgIAotPC94c2w6dGVtcGxhdGU+ICAKLQotPCEtLSBzMSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2ggPSJzMSI+Ci0gICA8Zm86YmxvY2sgZm9udC1zaXplPSIxOHB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiAKLSAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIyNHB0IgotICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm9wdGltdW09IjE1cHQiCi0gICAgICAgICAgICBzcGFjZS1hZnRlci5vcHRpbXVtPSIxNXB0IgotICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcj0iYmx1ZSIKLSAgICAgICAgICAgIGNvbG9yPSJ3aGl0ZSIKLSAgICAgICAgICAgIGtlZXAtd2l0aC1uZXh0LndpdGhpbi1wYWdlPSJhbHdheXMiCi0gICAgICAgICAgICB0ZXh0LWFsaWduPSJjZW50ZXIiPgotICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZCI+Ci0gICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoQHRpdGxlLCcgKSwtLignLCdfX19fJykiLz4KLSAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRpdGxlIi8+Ci0gICA8L2ZvOmJsb2NrPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4gCi08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBzMiAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2ggPSJzMiI+Ci0gICA8Zm86YmxvY2sgZm9udC1zaXplPSIxNnB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiAKLSAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIyMHB0IgotICAgICAgICAgICAga2VlcC13aXRoLW5leHQud2l0aGluLXBhZ2U9ImFsd2F5cyIgICAgICAgICAgICAKLSAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5vcHRpbXVtPSIxNXB0IgotICAgICAgICAgICAgc3BhY2UtYWZ0ZXIub3B0aW11bT0iMTJwdCIKLSAgICAgICAgICAgIHRleHQtYWxpZ249InN0YXJ0IgotICAgICAgICAgICAgcGFkZGluZy10b3A9IjNwdCIKLSAgICAgICAgICAgID4KLSAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPgotICAgPC9mbzpibG9jaz4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+IAotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gczMgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoID0iczMiPgotICAgPGZvOmJsb2NrIGZvbnQtc2l6ZT0iMTRwdCIgCi0gICAgICAgICAgICBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgCi0gICAgICAgICAgICBsaW5lLWhlaWdodD0iMThwdCIKLSAgICAgICAgICAgIGtlZXAtd2l0aC1uZXh0LndpdGhpbi1wYWdlPSJhbHdheXMiCi0gICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iMTBwdCIKLSAgICAgICAgICAgIHNwYWNlLWFmdGVyLm9wdGltdW09IjlwdCIKLSAgICAgICAgICAgIHRleHQtYWxpZ249InN0YXJ0IgotICAgICAgICAgICAgcGFkZGluZy10b3A9IjNwdCI+Ci0gICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGl0bGUiLz4KLSAgIDwvZm86YmxvY2s+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIHAgIFtub3QoY29kZSldIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaCA9InAiPiAKLSAgIDxmbzpibG9jayBmb250LXNpemU9IjExcHQiIAotICAgICAgICAgICAgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIAotICAgICAgICAgICAgbGluZS1oZWlnaHQ9IjEzcHQiCi0gICAgICAgICAgICBzcGFjZS1hZnRlci5vcHRpbXVtPSIzcHQiCi0gICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iM3B0IgotICAgICAgICAgICAgdGV4dC1hbGlnbj0ic3RhcnQiPgotICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+IAotICAgPC9mbzpibG9jaz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoID0ibm90ZSI+IAotICAgPGZvOmJsb2NrIGZvbnQtc2l6ZT0iMTFwdCIgCi0gICAgICAgICAgICBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgCi0gICAgICAgICAgICBmb250LXdlaWdodD0iaXRhbGljIgotICAgICAgICAgICAgbGluZS1oZWlnaHQ9IjEzcHQiCi0gICAgICAgICAgICBzcGFjZS1hZnRlci5vcHRpbXVtPSIzcHQiCi0gICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iM3B0IgotICAgICAgICAgICAgdGV4dC1hbGlnbj0ic3RhcnQiPgotICAgICAgICBOb3RlOiAgICAgCi0gICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4gCi0gICA8L2ZvOmJsb2NrPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImFuY2hvciI+Ci0gIDxmbzpibG9jaz4gPCEtLWlkPSJjb25jYXQobG9jYWwtbmFtZShhbmNlc3Rvcjo6bm9kZSgpPSJjaGFwdGVyIi9AaWQuLCdfJyx7Li9AbmFtZX0iLy0tPgotICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlkIj4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoYW5jZXN0b3I6OmNoYXB0ZXIvQGlkLCdfJywuL0BuYW1lKSIvPgotICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgPC9mbzpibG9jaz4gICAgCi08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGFibGUiPgotICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbHdpZHRoIiBzZWxlY3Q9IjE0LjUgZGl2IGNvdW50KHRyWzFdL3RkKSIvPgotICA8Zm86dGFibGU+Ci0gIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJ0clsxXS90ZCI+Ci0gICAgPGZvOnRhYmxlLWNvbHVtbiBjb2x1bW4td2lkdGg9InskY29sd2lkdGh9Y20iLz4KLSAgPC94c2w6Zm9yLWVhY2g+Ci0gIDxmbzp0YWJsZS1ib2R5IGZvbnQtc2l6ZT0iMTBwdCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiPgotICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwvZm86dGFibGUtYm9keT4KLSAgPC9mbzp0YWJsZT4gIAotPC94c2w6dGVtcGxhdGU+ICAKLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRyIj4KLSAgPGZvOnRhYmxlLXJvdz4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwvZm86dGFibGUtcm93PgotPC94c2w6dGVtcGxhdGU+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZCI+Ci0gIDxmbzp0YWJsZS1jZWxsPgotICAgIDxmbzpibG9jaz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L2ZvOmJsb2NrPgotICAgPC9mbzp0YWJsZS1jZWxsPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gcCArIGNvZGUgCi08eHNsOnRlbXBsYXRlIG1hdGNoID0icFtjb2RlXSI+Ci0gICA8Zm86YmxvY2sgZm9udC1zaXplPSIxMXB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiAKLSAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIxMXB0IgotICAgICAgICAgICAgc3BhY2UtYWZ0ZXIub3B0aW11bT0iMHB0IgotICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm9wdGltdW09IjBwdCIKLSAgICAgICAgICAgIHRleHQtYWxpZ249InN0YXJ0Ij4KLSAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgIDwvZm86YmxvY2s+Ci08L3hzbDp0ZW1wbGF0ZT4KLS0tPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJpbWciPgotICA8Zm86YmxvY2s+Ci0gICAgPGZvOmV4dGVybmFsLWdyYXBoaWMgc3JjPSJmaWxlOmJ1aWxkL2RvY3MvaW1hZ2VzL3tAc3JjfSIvPgotICA8L2ZvOmJsb2NrPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gZmFxcyAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2ggPSJmYXFzIj4KLSAgIDxmbzpibG9jayBmb250LXNpemU9IjE4cHQiIAotICAgICAgICAgICAgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIAotICAgICAgICAgICAgbGluZS1oZWlnaHQ9IjI0cHQiCi0gICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iMTVwdCIKLSAgICAgICAgICAgIHNwYWNlLWFmdGVyLm9wdGltdW09IjE1cHQiCi0gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yPSJibHVlIgotICAgICAgICAgICAgY29sb3I9IndoaXRlIgotICAgICAgICAgICAgdGV4dC1hbGlnbj0iY2VudGVyIgotICAgICAgICAgICAgPgotICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZCI+Ci0gICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoLiwnICksLS4oJywnX19fXycpIi8+Ci0gICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPgotICAgPC9mbzpibG9jaz4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+IAotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gZmFxIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaCA9ImZhcSI+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIHEgaW4gZmFxIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icSI+Ci0gICA8Zm86YmxvY2sgZm9udC1zaXplPSIxNHB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiAKLSAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIxOHB0IgotICAgICAgICAgICAga2VlcC13aXRoLW5leHQud2l0aGluLXBhZ2U9ImFsd2F5cyIKLSAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5vcHRpbXVtPSIxMHB0IgotICAgICAgICAgICAgc3BhY2UtYWZ0ZXIub3B0aW11bT0iOXB0IgotICAgICAgICAgICAgdGV4dC1hbGlnbj0ic3RhcnQiCi0gICAgICAgICAgICBwYWRkaW5nLXRvcD0iM3B0Ij4gICAgIAotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgICA8L2ZvOmJsb2NrPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gYSBpbiBmYXEgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoID0iYSI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+IAotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSBqdW1wIChsaW5rcykgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoID0ianVtcCI+Ci0gIDxmbzpiYXNpYy1saW5rIGNvbG9yPSJibHVlIj4KLSAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWwtZGVzdGluYXRpb24iPgotICAgICAgIDx4c2w6aWYgdGVzdD0ic3RhcnRzLXdpdGgoQGhyZWYsJ2FwaWRvY3MnKSI+Ci0gICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KCdodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai8nLEBocmVmKSIvPgotICAgICAgIDwveHNsOmlmPgotICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KHN0YXJ0cy13aXRoKEBocmVmLCdhcGlkb2NzJykpIj4KLSAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaHJlZiIvPgotICAgICAgIDwveHNsOmlmPiAgICAKLSAgICAgPC94c2w6YXR0cmlidXRlPiAgCi0gICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi90ZXh0KCkiLz4KLSAgICAgPCEtLXhzbDphcHBseS10ZW1wbGF0ZXMvLS0+IAotICAgPC9mbzpiYXNpYy1saW5rPgotPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibGluayI+Ci0gICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKEBhbmNob3IpPTAiPgotICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKEBpZHJlZik9MCI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgIDwveHNsOmlmPgotICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKEBpZHJlZik+MCI+Ci0gICAgICAgIDxmbzpiYXNpYy1saW5rIGNvbG9yPSJibHVlIiBpbnRlcm5hbC1kZXN0aW5hdGlvbj0ie0BpZHJlZn0iPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi90ZXh0KCkiLz48L2ZvOmJhc2ljLWxpbms+Ci0gICAgICA8L3hzbDppZj4KLSAgICA8L3hzbDppZj4KLQotICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAYW5jaG9yKT4wIj4KLSAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAaWRyZWYpPTAiPgotICAgICAgICA8Zm86YmFzaWMtbGluayBjb2xvcj0iYmx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC1kZXN0aW5hdGlvbj0ie2NvbmNhdChhbmNlc3Rvcjo6Y2hhcHRlci9AaWQsJ18nLEBhbmNob3IpfSI+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuL3RleHQoKSIvPjwvZm86YmFzaWMtbGluaz4KLSAgICAgIDwveHNsOmlmPgotICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKEBpZHJlZik+MCI+Ci0gICAgICAgIDxmbzpiYXNpYy1saW5rIGNvbG9yPSJibHVlIiBpbnRlcm5hbC1kZXN0aW5hdGlvbj0ie0BpZHJlZn1fe0BhbmNob3J9Ij4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4vdGV4dCgpIi8+PC9mbzpiYXNpYy1saW5rPgotICAgICAgPC94c2w6aWY+Ci0gICAgPC94c2w6aWY+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InJlc291cmNlLXJlZiI+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0ieHJlZiIgc2VsZWN0PSJAaWRyZWYiLz4KLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJocmVmIgotICAgICAgICAgIHNlbGVjdD0iZG9jdW1lbnQoJHJlc291cmNlRmlsZSkvcmVzb3VyY2VzL3Jlc291cmNlW0BpZD0keHJlZl0vQGxvY2F0aW9uIi8+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0ibGFiZWwiCi0gICAgICAgICAgc2VsZWN0PSJkb2N1bWVudCgkcmVzb3VyY2VGaWxlKS9yZXNvdXJjZXMvcmVzb3VyY2VbQGlkPSR4cmVmXS9AdGl0bGUiLz4KLSAgPGZvOmJhc2ljLWxpbmsgY29sb3I9ImJsdWUiPgotICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbC1kZXN0aW5hdGlvbiI+Ci0gICAgICAgPHhzbDppZiB0ZXN0PSJzdGFydHMtd2l0aCgkaHJlZiwnYXBpZG9jcycpIj4KLSAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoJ2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi1qLycsJGhyZWYpIi8+Ci0gICAgICAgPC94c2w6aWY+Ci0gICAgICAgPHhzbDppZiB0ZXN0PSJub3Qoc3RhcnRzLXdpdGgoJGhyZWYsJ2FwaWRvY3MnKSkiPgotICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRocmVmIi8+Ci0gICAgICAgPC94c2w6aWY+ICAgIAotICAgICA8L3hzbDphdHRyaWJ1dGU+ICAKLSAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsYWJlbCIvPgotICAgICA8IS0teHNsOmFwcGx5LXRlbXBsYXRlcy8tLT4gCi0gICA8L2ZvOmJhc2ljLWxpbms+ICAgICAgICAKLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaHVtYW4tcmVzb3VyY2UtcmVmIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJlc291cmNlRmlsZSIgCi0gICAgICAgICAgc2VsZWN0PSIuL3hhbGFuL3Jlc291cmNlcy54bWwiLz4gIAotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmVmIiAgc2VsZWN0PSJAaWRyZWYiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1haWx0byIKLSAgICAgICAgICBzZWxlY3Q9ImRvY3VtZW50KCRyZXNvdXJjZUZpbGUpL3Jlc291cmNlcy9odW1hbi1yZXNvdXJjZVtAaWQ9JHJlZl0vQG1haWx0byIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZSIKLSAgICAgICAgICBzZWxlY3Q9ImRvY3VtZW50KCRyZXNvdXJjZUZpbGUpL3Jlc291cmNlcy9odW1hbi1yZXNvdXJjZVtAaWQ9JHJlZl0vQG5hbWUiLz4KLSAgPGZvOmJhc2ljLWxpbmsgY29sb3I9ImJsdWUiIGV4dGVybmFsLWRlc3RpbmF0aW9uPSJtYWlsdG86eyRtYWlsdG99Ij4KLSAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+Ci0gICAgIDwhLS14c2w6YXBwbHktdGVtcGxhdGVzLy0tPiAKLSAgIDwvZm86YmFzaWMtbGluaz4gICAgICAgICAgCi0gIDwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoID0ic291cmNlIj4gCi0gICA8Zm86YmxvY2sgZm9udC1zaXplPSIxMHB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJDb3VyaWVyIiAKLSAgICAgICAgICAgIHRleHQtYWxpZ249InN0YXJ0IgotICAgICAgICAgICAgd2hpdGUtc3BhY2UtY29sbGFwc2U9ImZhbHNlIj4KLSAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgIDwvZm86YmxvY2s+Ci0KLTwveHNsOnRlbXBsYXRlPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoID0iYnIiPgotICA8Zm86YmxvY2s+PC9mbzpibG9jaz4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIGNvZGUgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoID0iKi9jb2RlIj4KLSAgIDxmbzppbmxpbmUgZm9udC1zaXplPSIxMHB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJDb3VyaWVyIj4KLSAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgIDwvZm86aW5saW5lPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gdWwgKHVub3JkZXJlZCBsaXN0KSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2ggPSJ1bCI+Ci0gIDxmbzpsaXN0LWJsb2NrIHN0YXJ0LWluZGVudD0iMWNtIiAKLSAgICAgICAgICAgICAgICAgcHJvdmlzaW9uYWwtZGlzdGFuY2UtYmV0d2Vlbi1zdGFydHM9IjEycHQiIAotICAgICAgICAgICAgICAgICBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgCi0gICAgICAgICAgICAgICAgIGZvbnQtc2l6ZT0iMTFwdCIgCi0gICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIxMXB0Ij4KLSAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgIDwvZm86bGlzdC1ibG9jaz4KLTwveHNsOnRlbXBsYXRlPiAgICAgICAgIAotICAgICAgICAgIAotPCEtLSBvbCAob3JkZXJlZCBsaXN0KSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2ggPSJvbCI+Ci0gIDxmbzpsaXN0LWJsb2NrIHN0YXJ0LWluZGVudD0iMWNtIiAKLSAgICAgICAgICAgICAgICAgcHJvdmlzaW9uYWwtZGlzdGFuY2UtYmV0d2Vlbi1zdGFydHM9IjEycHQiIAotICAgICAgICAgICAgICAgICBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgCi0gICAgICAgICAgICAgICAgIGZvbnQtc2l6ZT0iMTFwdCIgCi0gICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIxMXB0Ij4KLSAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgIDwvZm86bGlzdC1ibG9jaz4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gbGkgKGxpc3QgaXRlbSkgaW4gdW5vcmRlcmVkIGxpc3QgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoID0idWwvbGkiPgotICAgIDxmbzpsaXN0LWl0ZW0+Ci0gICAgICA8Zm86bGlzdC1pdGVtLWxhYmVsPgotICAgICAgICA8Zm86YmxvY2s+PGZvOmlubGluZSBmb250LWZhbWlseT0iU3ltYm9sIj4mIzE4Mzs8L2ZvOmlubGluZT48L2ZvOmJsb2NrPgotICAgICAgPC9mbzpsaXN0LWl0ZW0tbGFiZWw+Ci0gICAgICA8Zm86bGlzdC1pdGVtLWJvZHk+Ci0gICAgICAgIDxmbzpibG9jayBzcGFjZS1hZnRlci5vcHRpbXVtPSI0cHQiCi0gICAgICAgICAgICAgIHRleHQtYWxpZ249InN0YXJ0IgotICAgICAgICAgICAgICBwYWRkaW5nLXRvcD0iM3B0Ij4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+IAotICAgICAgIDwvZm86YmxvY2s+Ci0gICAgICA8L2ZvOmxpc3QtaXRlbS1ib2R5PgotICAgIDwvZm86bGlzdC1pdGVtPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gbGkgKGxpc3QgaXRlbSkgaW4gb3JkZXJlZCBsaXN0IC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaCA9Im9sL2xpIj4KLSAgICA8Zm86bGlzdC1pdGVtPgotICAgICAgPGZvOmxpc3QtaXRlbS1sYWJlbD4KLSAgICAgICAgPGZvOmJsb2NrPgotICAgICAgICAgIDx4c2w6bnVtYmVyIGxldmVsPSJtdWx0aXBsZSIgY291bnQ9ImxpIiBmb3JtYXQ9IjEiLz4pCi0gICAgICAgIDwvZm86YmxvY2s+Ci0gICAgICA8L2ZvOmxpc3QtaXRlbS1sYWJlbD4KLSAgICAgIDxmbzpsaXN0LWl0ZW0tYm9keT4KLSAgICAgICAgPGZvOmJsb2NrIHNwYWNlLWFmdGVyLm9wdGltdW09IjRwdCIKLSAgICAgICAgICAgICAgdGV4dC1hbGlnbj0ic3RhcnQiCi0gICAgICAgICAgICAgIHBhZGRpbmctdG9wPSIzcHQiPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4gCi0gICAgICAgPC9mbzpibG9jaz4KLSAgICAgIDwvZm86bGlzdC1pdGVtLWJvZHk+Ci0gICAgPC9mbzpsaXN0LWl0ZW0+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSB0ZW1wb3Jhcnkga2x1ZGdlIGZvciBkZWZpbml0aW9uIGxpc3QgZ2xvc3Mgd2l0aCBsYWJlbC1pdGVtIHBhaXJzICkgLS0+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Imdsb3NzIj4KLSAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotPC94c2w6dGVtcGxhdGU+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJsYWJlbCI+Ci0gICA8Zm86YmxvY2sgZm9udC1zaXplPSIxMXB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiAKLSAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIxM3B0IgotICAgICAgICAgICAgc3BhY2UtYWZ0ZXIub3B0aW11bT0iM3B0IgotICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm9wdGltdW09IjZwdCIKLSAgICAgICAgICAgIHRleHQtYWxpZ249InN0YXJ0Ij4KLSAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgIDwvZm86YmxvY2s+Ci08L3hzbDp0ZW1wbGF0ZT4gCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJpdGVtIj4KLSAgIDxmbzpibG9jayBmb250LXNpemU9IjExcHQiIAotICAgICAgICAgICAgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIAotICAgICAgICAgICAgbGluZS1oZWlnaHQ9IjEzcHQiCi0gICAgICAgICAgICBzcGFjZS1hZnRlci5vcHRpbXVtPSI2cHQiCi0gICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iMHB0IgotICAgICAgICAgICAgbWFyZ2luLWxlZnQ9IjI0cHQiCi0gICAgICAgICAgICB0ZXh0LWFsaWduPSJzdGFydCI+Ci0gICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgPGZvOmJsb2NrPjwvZm86YmxvY2s+IAotICAgPC9mbzpibG9jaz4KLTwveHNsOnRlbXBsYXRlPiAKLQotPCEtLSBlbmQgYm9keSAtLT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3hkb2NzL3htbC1zaXRlLXN0eWxlLnRhci5neiBiL3hkb2NzL3htbC1zaXRlLXN0eWxlLnRhci5negpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjNGRlMy4uMDAwMDAwMAotLS0gYS94ZG9jcy94bWwtc2l0ZS1zdHlsZS50YXIuZ3oKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCg==